# # patch "mlsqlite/ocaml-sqlite3.c" # from [6a916beee78d7ca2f9d9293703503409051b3e9c] # to [e1aab6106508e6600672fd65bdf1150d2dfafb6f] # ======================================================================== --- mlsqlite/ocaml-sqlite3.c 6a916beee78d7ca2f9d9293703503409051b3e9c +++ mlsqlite/ocaml-sqlite3.c e1aab6106508e6600672fd65bdf1150d2dfafb6f @@ -27,13 +27,14 @@ * 2 -> progress */ #define NUM_CALLBACKS 3 -#define Sqlite3_val(v) (((struct ml_sqlite3_data *) Data_custom_val(v))->db) +#define Sqlite3_data_val(v) (* ((struct ml_sqlite3_data **) Data_custom_val(v))) +#define Sqlite3_val(v) (Sqlite3_data_val(v)->db) static void ml_sqlite3_finalize (value v) { struct user_function *list, *next;; - struct ml_sqlite3_data *data = Data_custom_val(v); + struct ml_sqlite3_data *data = Sqlite3_data_val(v); remove_global_root (&data->callbacks); list = data->user_functions; while (list != NULL) @@ -43,6 +44,7 @@ stat_free (list); list = next; } + stat_free (data); } static value @@ -52,15 +54,18 @@ "mlsqlite3/001", ml_sqlite3_finalize }; - struct ml_sqlite3_data *data; - value v; - v = alloc_custom (&ops, sizeof (struct ml_sqlite3_data), 1, 100); - data = Data_custom_val (v); + CAMLparam0(); + CAMLlocal1(v); + struct ml_sqlite3_data **store, *data; + data = stat_alloc (sizeof *data); + v = alloc_custom (&ops, sizeof data, 1, 100); + store = Data_custom_val (v); + *store = data; data->db = db; data->callbacks = alloc (NUM_CALLBACKS, 0); data->user_functions = NULL; register_global_root (&data->callbacks); - return v; + CAMLreturn(v); } @@ -206,7 +211,7 @@ value o_col_names, value cb, value init, int opt_string) { - CAMLparam2 (cb, o_col_names); + CAMLparam5 (db, sql, o_col_names, cb, init); CAMLlocal1 (accum); struct cb_data cb_data = { &cb, &accum, &o_col_names, opt_string, COLUMN_NAMES_NEED_STORE }; @@ -252,17 +257,19 @@ CAMLprim value ml_sqlite3_exec (value db, value sql) { + CAMLparam2(db, sql); char *sql_copy, *errmsg; int status; sql_copy = stat_alloc (string_length (sql) + 1); strcpy (sql_copy, String_val (sql)); - status = sqlite3_exec (Sqlite3_val (db), String_val (sql), + status = sqlite3_exec (Sqlite3_val (db), sql_copy, NULL, NULL, &errmsg); stat_free (sql_copy); if (status != SQLITE_OK) ml_sqlite3_raise_exn (status, errmsg, FALSE); - return Val_unit; + + CAMLreturn(Val_unit); } CAMLprim value @@ -297,7 +304,7 @@ CAMLprim value ml_sqlite3_busy_handler (value db, value cb) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 0, cb); sqlite3_busy_handler (Sqlite3_val(db), ml_sqlite3_busy_handler_cb, db_data); @@ -307,7 +314,7 @@ CAMLprim value ml_sqlite3_busy_handler_unset (value db) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 0, Val_unit); sqlite3_busy_handler (Sqlite3_val(db), NULL, NULL); return Val_unit; @@ -331,7 +338,7 @@ CAMLprim value ml_sqlite3_trace (value db, value cb) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 1, cb); sqlite3_trace (Sqlite3_val (db), ml_sqlite3_trace_handler, db_data); return Val_unit; @@ -340,7 +347,7 @@ CAMLprim value ml_sqlite3_trace_unset (value db) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 1, Val_unit); sqlite3_trace (Sqlite3_val (db), NULL, NULL); return Val_unit; @@ -358,7 +365,7 @@ CAMLprim value ml_sqlite3_progress_handler (value db, value delay, value cb) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 2, cb); sqlite3_progress_handler (Sqlite3_val (db), Int_val (delay), ml_sqlite3_progress_handler_cb, db_data); @@ -368,7 +375,7 @@ CAMLprim value ml_sqlite3_progress_handler_unset (value db) { - struct ml_sqlite3_data *db_data = Data_custom_val (db); + struct ml_sqlite3_data *db_data = Sqlite3_data_val(db); Store_field (db_data->callbacks, 2, Val_unit); sqlite3_progress_handler (Sqlite3_val(db), 0, NULL, NULL); return Val_unit; @@ -600,7 +607,7 @@ { CAMLparam4(db, name, nargs, fun); int status; - struct user_function *param = register_user_function (Data_custom_val (db), + struct user_function *param = register_user_function (Sqlite3_data_val(db), name, fun); status = sqlite3_create_function (Sqlite3_val (db), String_val (name), Int_val (nargs), SQLITE_UTF8, param, @@ -627,6 +634,6 @@ errmsg = (char *) sqlite3_errmsg (Sqlite3_val (db)); ml_sqlite3_raise_exn (status, errmsg, TRUE); } - unregister_user_function (Data_custom_val (db), name); + unregister_user_function (Sqlite3_data_val(db), name); return Val_unit; }