commit a2f992a470f95afc95f34d8dc6748ffbfed9bc9f
parent 40f603fbe241e0f546ebe92051e64a3a18901b12
Author: Tomas Hlavaty <tom@logand.com>
Date:   Tue,  5 Mar 2013 21:39:18 +0100
add trivial repl to dbquery-*.c, now possible to reuse db connection
Diffstat:
4 files changed, 32 insertions(+), 52 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,17 +1,21 @@
 CFLAGS = -Os -W -Wall
 
 all:
+	echo "choose a backend driver: dbquery-pg|mysql|sqlite"
 
-dbquery-pg: dbquery-pg.c
-	$(CC) $(CFLAGS) -o $@ $< -lpq
+.c.o:
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+dbquery-pg: dbquery-pg.c common.o
+	$(CC) $(CFLAGS) -o $@ $< common.o -lpq
 	strip $@
 
-dbquery-mysql: dbquery-mysql.c
-	$(CC) $(CFLAGS) -o $@ $< `mysql_config --cflags --libs`
+dbquery-mysql: dbquery-mysql.c common.o
+	$(CC) $(CFLAGS) -o $@ $< common.o `mysql_config --cflags --libs`
 	strip $@
 
-dbquery-sqlite: dbquery-sqlite.c
-	$(CC) $(CFLAGS) -o $@ $< -lsqlite3
+dbquery-sqlite: dbquery-sqlite.c common.o
+	$(CC) $(CFLAGS) -o $@ $< common.o -lsqlite3
 	strip $@
 
 clean:
diff --git a/dbquery-mysql.c b/dbquery-mysql.c
@@ -4,21 +4,12 @@
 #include <stdarg.h>
 #include <mysql/mysql.h>
 
-static MYSQL *conn;
+void die(const char *format, ...);
+void repl();
 
-static void die(const char *format, ...) {
-  va_list argv;
-  va_start(argv, format);
-  if(format)
-    vfprintf(stderr, format, argv);
-  else
-    fprintf(stderr, "error %u: %s", mysql_errno(conn), mysql_error(conn));
-  va_end(argv);
-  fprintf(stderr, "\n");
-  exit(-1);
-}
+static MYSQL *conn;
 
-static void query(char *q) {
+void query(char *q) {
   if(mysql_query(conn, q)) die(0);
   MYSQL_RES *z = mysql_store_result(conn);
   int i, j;
@@ -55,14 +46,15 @@ static void query(char *q) {
     printf(")");
   }
   printf(")\n");
+  fflush(stdout);
   mysql_free_result(z);
 }
 
 int main(int argc, char **argv) {
-  if(argc < 6) die("usage: %s host user password db query", argv[0]);
+  if(argc < 5) die("usage: %s host user password db [query]", argv[0]);
   if(!(conn = mysql_init(NULL))) die(0);
   if(!mysql_real_connect(conn, argv[1], argv[2], argv[3], argv[4], 0, NULL, 0))
     die(0);
-  query(argv[5]);
+  if(argc < 6) repl(); else query(argv[5]);
   return 0;
 }
diff --git a/dbquery-pg.c b/dbquery-pg.c
@@ -1,21 +1,12 @@
-#include <stdlib.h>
-#include <string.h>
 #include <stdio.h>
-#include <stdarg.h>
-#include <postgresql/libpq-fe.h>
+#include <libpq-fe.h>
 
-static PGconn *conn;
+void die(const char *format, ...);
+void repl();
 
-static void die(const char *format, ...) {
-  va_list argv;
-  va_start(argv, format);
-  vfprintf(stderr, format, argv);
-  va_end(argv);
-  fprintf(stderr, "\n");
-  exit(-1);
-}
+static PGconn *conn;
 
-static void query(char *q) {
+void query(char *q) {
   PGresult *z = PQexec(conn, q);
   if(!z) die("error: query failed");
   int i, j, n = PQntuples(z), m = PQnfields(z);
@@ -47,12 +38,13 @@ static void query(char *q) {
     printf(")");
   }
   printf(")\n");
+  fflush(stdout);
 }
 
 int main(int argc, char **argv) {
-  if(argc < 3) die("usage: %s conninfo query", argv[0]);
+  if(argc < 2) die("usage: %s conninfo [query]", argv[0]);
   if(!(conn = PQconnectdb(argv[1])) || (PQstatus(conn) != CONNECTION_OK))
     die("error: connection failed");
-  query(argv[2]);
+  if(argc < 3) repl(); else query(argv[2]);
   return 0;
 }
diff --git a/dbquery-sqlite.c b/dbquery-sqlite.c
@@ -1,21 +1,12 @@
-#include <stdlib.h>
-#include <string.h>
 #include <stdio.h>
-#include <stdarg.h>
 #include <sqlite3.h>
 
-static sqlite3 *conn;
+void die(const char *format, ...);
+void repl();
 
-static void die(const char *format, ...) {
-  va_list argv;
-  va_start(argv, format);
-  vfprintf(stderr, format, argv);
-  va_end(argv);
-  fprintf(stderr, "\n");
-  exit(-1);
-}
+static sqlite3 *conn;
 
-static void query(char *q) {
+void query(char *q) {
   sqlite3_stmt *z;
   if(sqlite3_prepare_v2(conn, q, -1, &z, 0)) die("error: sqlite3_prepare_v2 failed");
   int i, j, m = sqlite3_column_count(z);
@@ -47,12 +38,13 @@ static void query(char *q) {
     printf(")");
   }
   printf(")\n");
+  fflush(stdout);
   sqlite3_finalize(z);
 }
 
 int main(int argc, char **argv) {
-  if(argc < 3) die("usage: %s db query", argv[0]);
+  if(argc < 2) die("usage: %s db [query]", argv[0]);
   if(sqlite3_open(argv[1], &conn)) die("error: sqlite3_open failed");
-  query(argv[2]);
+  if(argc < 3) repl(); else query(argv[2]);
   return 0;
 }