CAMLprim value mapi_get_name_stub(value ml_handle, value ml_index) { int index = Int_val(ml_index); MapiHdl handle = (MapiHdl) ml_handle; assert(index < mapi_get_field_count(handle)); char *fname = mapi_get_name(handle, index); if (fname) { return Val_some(caml_copy_string(fname)); } else { return Val_none; } }
CAMLprim value mapi_fetch_field_list_stub(value handle) { CAMLparam1(handle); CAMLlocal2(cli, cons); char **fields = mapi_fetch_field_array((MapiHdl) handle); int nr_fields = mapi_get_field_count((MapiHdl) handle); if (fields != NULL) { cli = Val_emptylist; int i = 0; for (i = (nr_fields - 1); i >= 0; --i) { cons = caml_alloc(2, 0); Store_field(cons, 0, caml_copy_string(fields[i])); Store_field(cons, 1, cli); cli = cons; } CAMLreturn(Val_some(cli)); } else { CAMLreturn(Val_none); } }
CAMLprim value mapi_get_field_count_stub(value handle) { return Val_int(mapi_get_field_count((MapiHdl) handle)); }
int main(int argc, char **argv) { Mapi dbh; MapiHdl hdl = NULL; mapi_int64 rows, i; char *parm[] = { "peter", 0 }; char *parm2[] = { "25", 0 }; int j; if (argc != 4) { printf("usage:%s <host> <port> <language>\n", argv[0]); exit(-1); } dbh = mapi_connect(argv[1], atoi(argv[2]), "monetdb", "monetdb", argv[3], NULL); if (dbh == NULL || mapi_error(dbh)) die(dbh, hdl); /* mapi_trace(dbh, 1); */ if (strcmp(argv[3], "sql") == 0) { /* switch of autocommit */ if (mapi_setAutocommit(dbh, 0) != MOK || mapi_error(dbh)) die(dbh,NULL); if ((hdl = mapi_query(dbh, "create table emp(name varchar(20), age int)")) == NULL || mapi_error(dbh)) 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)) die(dbh, hdl); if (mapi_close_handle(hdl) != MOK) die(dbh, hdl); if ((hdl = mapi_query(dbh, "insert into emp values('Mary', 22)")) == NULL || mapi_error(dbh)) die(dbh, hdl); if (mapi_close_handle(hdl) != MOK) die(dbh, hdl); if ((hdl = mapi_query(dbh, "select * from emp")) == NULL || mapi_error(dbh)) die(dbh, hdl); } else if (strcmp(argv[3], "mal") == 0) { if ((hdl = mapi_query(dbh, "emp := bat.new(:oid,:str);")) == NULL || mapi_error(dbh)) die(dbh, hdl); if ((hdl = mapi_query(dbh, "age := bat.new(:oid,:int);")) == NULL || mapi_error(dbh)) die(dbh, hdl); if (mapi_close_handle(hdl) != MOK) die(dbh, hdl); if ((hdl = mapi_query_array(dbh, "bat.append(emp,\"?\");", parm)) == NULL || mapi_error(dbh)) die(dbh, hdl); if ((hdl = mapi_query_array(dbh, "bat.append(age,?);", parm2)) == NULL || mapi_error(dbh)) die(dbh, hdl); if (mapi_close_handle(hdl) != MOK) die(dbh, hdl); if ((hdl = mapi_query(dbh, "io.print(emp,age);")) == NULL || mapi_error(dbh)) die(dbh, hdl); } else { fprintf(stderr, "%s: unknown language, only mal and sql supported\n", argv[0]); exit(1); } /* Retrieve all tuples in the client cache first */ rows = mapi_fetch_all_rows(hdl); if (mapi_error(dbh)) die(dbh, hdl); printf("rows received " LLFMT " with %d fields\n", rows, mapi_get_field_count(hdl)); /* Interpret the cache as a two-dimensional array */ for (i = 0; i < rows; i++) { if (mapi_seek_row(hdl, i, MAPI_SEEK_SET) || mapi_fetch_row(hdl) == 0) break; for (j = 0; j < mapi_get_field_count(hdl); j++) { printf("%s=%s ", mapi_get_name(hdl, j), mapi_fetch_field(hdl, j)); } printf("\n"); } if (mapi_error(dbh)) die(dbh, hdl); if (mapi_close_handle(hdl) != MOK) die(dbh, hdl); mapi_destroy(dbh); return 0; }