[Monetdb-developers] Mapilib example

Fabian Groffen Fabian.Groffen at cwi.nl
Fri Jun 12 11:50:59 CEST 2009


Hi all,

Triggered by a request from a user I changed the mapilib example
somewhat.  In particular, I tried to make the example more "school
style", e.g. don't use a define for something which could have been a
function.  More important, I added code to walk multi-resultset handles
in case there is an error, such that it eventually gets printed.  I also
closed the handle in the die function as proper cleanup example.  I
removed some mapi_error checks that I thought were redundant, but I'm
not sure.  Hence, please review the attached diff and comment before I
commit this.

The example compiles without warnings for me now, and also works for as
far as I can see.
-------------- next part --------------
Index: Mapi.mx
===================================================================
RCS file: /cvsroot/monetdb/clients/src/mapilib/Mapi.mx,v
retrieving revision 1.62
diff -u -r1.62 Mapi.mx
--- Mapi.mx	12 Jun 2009 07:54:40 -0000	1.62
+++ Mapi.mx	12 Jun 2009 09:49:53 -0000
@@ -49,55 +49,69 @@
 @verbatim
 #include <mapilib/Mapi.h>
 #include <stdio.h>
+#include <stdlib.h>
 
-#define die(dbh,hdl) (hdl?mapi_explain_query(hdl,stderr):		\
-                          dbh?mapi_explain(dbh,stderr):			\
-                              fprintf(stderr,"command failed\n"),	\
-                      exit(-1))
+void die(Mapi dbh, MapiHdl hdl)
+{
+	if (hdl != NULL) {
+		mapi_explain_query(hdl, stderr);
+		do {
+			if (mapi_result_error(hdl) != NULL)
+				mapi_explain_result(hdl, stderr);
+		} while (mapi_next_result(hdl) == 1);
+		mapi_close_handle(hdl);
+		mapi_destroy(dbh);
+	} else if (dbh != NULL) {
+		mapi_explain(dbh, stderr);
+		mapi_destroy(dbh);
+	} else {
+		fprintf(stderr, "command failed\n");
+	}
+	exit(-1);
+}
 
-int main(int argc, char **argv)
+MapiHdl query(Mapi dbh, char *q)
+{
+	MapiHdl ret = NULL;
+	if ((ret = mapi_query(dbh, q)) == NULL || mapi_error(dbh) != MOK)
+		die(dbh, ret);
+	return(ret);
+}
+
+void update(Mapi dbh, char *q)
+{
+	MapiHdl ret = query(dbh, q);
+	if (mapi_close_handle(ret) != MOK)
+		die(dbh, ret);
+}
+
+int main(int argc, char *argv[])
 {
     Mapi dbh;
     MapiHdl hdl = NULL;
+	char *name;
+	char *age;
 
-    dbh = mapi_connect("localhost", 50000, "monetdb", "monetdb", "sql", NULL);
+    dbh = mapi_connect("localhost", 50000, "monetdb", "monetdb", "sql", "demo");
     if (mapi_error(dbh))
         die(dbh, hdl);
 
-    if ((hdl = mapi_query(dbh, "create table emp(name varchar(20), age int)")) == NULL
-        || mapi_error(dbh) != MOK)
-        die(dbh, hdl);
-    if (mapi_close_handle(hdl) != MOK)
-        die(dbh, hdl);
-    if ((hdl = mapi_query(dbh, "insert into emp values('John', 23)")) == NULL
-        || mapi_error(dbh) != MOK)
-        die(dbh, hdl);
-    mapi_close_handle(hdl);
-    if (mapi_error(dbh) != MOK)
-        die(dbh, hdl);
-    if ((hdl = mapi_query(dbh, "insert into emp values('Mary', 22)")) == NULL
-        || mapi_error(dbh) != MOK)
-        die(dbh, hdl);
-    mapi_close_handle(hdl);
-    if (mapi_error(dbh) != MOK)
-        die(dbh, hdl);
-    if ((hdl = mapi_query(dbh, "select * from emp")) == NULL
-        || mapi_error(dbh) != MOK)
-        die(dbh, hdl);
+	update(dbh, "CREATE TABLE emp (name VARCHAR(20), age INT)");
+	update(dbh, "INSERT INTO emp VALUES ('John', 23)");
+	update(dbh, "INSERT INTO emp VALUES ('Mary', 22)");
+
+	hdl = query(dbh, "SELECT * FROM emp");
 
     while (mapi_fetch_row(hdl)) {
-        char *nme = mapi_fetch_field(hdl, 0);
-        char *age = mapi_fetch_field(hdl, 1);
-        printf("%s is %s\n", nme, age);
+        name = mapi_fetch_field(hdl, 0);
+        age = mapi_fetch_field(hdl, 1);
+        printf("%s is %s\n", name, age);
     }
-    if (mapi_error(dbh) != MOK)
-        die(dbh, hdl);
+
     mapi_close_handle(hdl);
-    if (mapi_error(dbh) != MOK)
-        die(dbh, hdl);
     mapi_destroy(dbh);
 
-    return 0;
+    return(0);
 }
 @end verbatim
 @end example


More information about the developers-list mailing list