123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298(**************************************************************************)(* Copyright (c) 2003 Christian Szegedy <csdontspam871@metamatix.org> *)(* *)(* Copyright (c) 2007 Jane Street Holding, LLC *)(* Author: Markus Mottl <markus.mottl@gmail.com> *)(* *)(* Permission is hereby granted, free of charge, to any person *)(* obtaining a copy of this software and associated documentation files *)(* (the "Software"), to deal in the Software without restriction, *)(* including without limitation the rights to use, copy, modify, merge, *)(* publish, distribute, sublicense, and/or sell copies of the Software, *)(* and to permit persons to whom the Software is furnished to do so, *)(* subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be *)(* included in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *)(* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *)(* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *)(* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS *)(* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN *)(* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN *)(* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE *)(* SOFTWARE. *)(**************************************************************************)openPrintfexceptionInternalErrorofstringexceptionErrorofstringexceptionRangeErrorofint*inttypedbtypestmtmoduleRc=structtypeunknownexternalint_of_unknown:unknown->int="%identity"typet=|OK|ERROR|INTERNAL|PERM|ABORT|BUSY|LOCKED|NOMEM|READONLY|INTERRUPT|IOERR|CORRUPT|NOTFOUND|FULL|CANTOPEN|PROTOCOL|EMPTY|SCHEMA|TOOBIG|CONSTRAINT|MISMATCH|MISUSE|NOFLS|AUTH|FORMAT|RANGE|NOTADB|ROW|DONE|UNKNOWNofunknownletto_string=function|OK->"OK"|ERROR->"ERROR"|INTERNAL->"INTERNAL"|PERM->"PERM"|ABORT->"ABORT"|BUSY->"BUSY"|LOCKED->"LOCKED"|NOMEM->"NOMEM"|READONLY->"READONLY"|INTERRUPT->"INTERRUPT"|IOERR->"IOERR"|CORRUPT->"CORRUPT"|NOTFOUND->"NOTFOUND"|FULL->"FULL"|CANTOPEN->"CANTOPEN"|PROTOCOL->"PROTOCOL"|EMPTY->"EMPTY"|SCHEMA->"SCHEMA"|TOOBIG->"TOOBIG"|CONSTRAINT->"CONSTRAINT"|MISMATCH->"MISMATCH"|MISUSE->"MISUSE"|NOFLS->"NOLFS"|AUTH->"AUTH"|FORMAT->"FORMAT"|RANGE->"RANGE"|NOTADB->"NOTADB"|ROW->"ROW"|DONE->"DONE"|UNKNOWNn->sprintf"UNKNOWN %d"(int_of_unknownn)endmoduleData=structtypet=|NONE|NULL|INTofint64|FLOAToffloat|TEXTofstring|BLOBofstringletto_string=function|NONE|NULL->""|INTi->Int64.to_stringi|FLOATf->string_of_floatf|TEXTt|BLOBt->tletto_string_debug=function|NONE->"NONE"|NULL->"NULL"|INTi->sprintf"INT <%Ld>"i|FLOATf->sprintf"FLOAT <%f>"f|TEXTt->sprintf"TEXT <%S>"t|BLOBb->sprintf"BLOB <%d>"(String.lengthb)endtypeheader=stringtypeheaders=headerarraytyperow=stringoptionarraytyperow_not_null=stringarraymoduleMode=structtypet=Read_write_create|Read_write|Read_onlyletlift=function|None->Read_write_create|Some`READONLY->Read_only|Some`NO_CREATE->Read_writeendmoduleMut=structtypet=NOTHING|NO|FULLletlift=functionNone->NOTHING|Some`NO->NO|Some`FULL->FULLendmoduleCache=structtypet=NOTHING|SHARED|PRIVATEletlift=functionNone->NOTHING|Some`SHARED->SHARED|Some`PRIVATE->PRIVATEendexternaldb_open:mode:Mode.t->mutex:Mut.t->cache:Cache.t->?vfs:string->string->db="caml_sqlite3_open"letdb_open?mode?mutex?cache?vfsname=letmode=Mode.liftmodeinletmutex=Mut.liftmutexinletcache=Cache.liftcacheindb_open~mode~mutex~cache?vfsnameexternaldb_close:db->bool="caml_sqlite3_close"externalerrcode:db->Rc.t="caml_sqlite3_errcode"externalerrmsg:db->string="caml_sqlite3_errmsg"externallast_insert_rowid:db->int64="caml_sqlite3_last_insert_rowid"externalexec:db->?cb:(stringoptionarray->headers->unit)->string->Rc.t="caml_sqlite3_exec"externalexec_no_headers:db->cb:(stringoptionarray->unit)->string->Rc.t="caml_sqlite3_exec_no_headers"externalexec_not_null:db->cb:(stringarray->headers->unit)->string->Rc.t="caml_sqlite3_exec_not_null"externalexec_not_null_no_headers:db->cb:(stringarray->unit)->string->Rc.t="caml_sqlite3_exec_not_null_no_headers"externalchanges:db->int="caml_sqlite3_changes"externalprepare:db->string->stmt="caml_sqlite3_prepare"externalprepare_tail:stmt->stmtoption="caml_sqlite3_prepare_tail"externalrecompile:stmt->unit="caml_sqlite3_recompile"externalstep:stmt->Rc.t="caml_sqlite3_step"externalreset:stmt->Rc.t="caml_sqlite3_stmt_reset"externalsleep:int->int="caml_sqlite3_sleep"externalfinalize:stmt->Rc.t="caml_sqlite3_stmt_finalize"externaldata_count:stmt->int="caml_sqlite3_data_count"externalcolumn_count:stmt->int="caml_sqlite3_column_count"externalcolumn_blob:stmt->int->stringoption="caml_sqlite3_column_blob"externalcolumn:stmt->int->Data.t="caml_sqlite3_column"externalcolumn_name:stmt->int->string="caml_sqlite3_column_name"externalcolumn_decltype:stmt->int->stringoption="caml_sqlite3_column_decltype"externalbind:stmt->int->Data.t->Rc.t="caml_sqlite3_bind"externalbind_parameter_count:stmt->int="caml_sqlite3_bind_parameter_count"externalbind_parameter_name:stmt->int->stringoption="caml_sqlite3_bind_parameter_name"externalbind_parameter_index:stmt->string->int="caml_sqlite3_bind_parameter_index"externalclear_bindings:stmt->Rc.t="caml_sqlite3_clear_bindings"externalbusy_timeout:db->int->unit="caml_sqlite3_busy_timeout"externalenable_load_extension:db->bool->bool="caml_sqlite3_enable_load_extension"letrow_blobsstmt=Array.init(data_countstmt)(column_blobstmt)letrow_datastmt=Array.init(data_countstmt)(columnstmt)letrow_namesstmt=Array.init(data_countstmt)(column_namestmt)letrow_decltypesstmt=Array.init(data_countstmt)(column_decltypestmt)(* Function registration *)externalcreate_function:db->string->int->(Data.tarray->Data.t)->unit="caml_sqlite3_create_function"letcreate_funNdbnamef=create_functiondbname(-1)fletcreate_fun0dbnamef=create_functiondbname0(fun_->f())letcreate_fun1dbnamef=create_functiondbname1(funargs->fargs.(0))letcreate_fun2dbnamef=create_functiondbname2(funargs->fargs.(0)args.(1))letcreate_fun3dbnamef=create_functiondbname3(funargs->fargs.(0)args.(1)args.(2))externaldelete_function:db->string->unit="caml_sqlite3_delete_function"moduleAggregate=structexternalcreate_function:db->string->int->'a->('a->Data.tarray->'a)->('a->Data.t)->unit="caml_sqlite3_create_aggregate_function_bc""caml_sqlite3_create_aggregate_function_nc"letcreate_funNdbname~init~step~final=create_functiondbname(-1)initstepfinalletcreate_fun0dbname~init~step~final=create_functiondbname0init(funacc_->stepacc)finalletcreate_fun1dbname~init~step~final=create_functiondbname1init(funaccargs->stepaccargs.(0))finalletcreate_fun2dbname~init~step~final=create_functiondbname2init(funaccargs->stepaccargs.(0)args.(1))finalletcreate_fun3dbname~init~step~final=create_functiondbname3init(funaccargs->stepaccargs.(0)args.(1)args.(2))finalendmoduleBackup=structtypetexternalinit:dst:db->dst_name:string->src:db->src_name:string->t="caml_sqlite3_backup_init"externalstep:t->int->Rc.t="caml_sqlite3_backup_step"externalfinish:t->Rc.t="caml_sqlite3_backup_finish"externalremaining:t->int="caml_sqlite3_backup_remaining"externalpagecount:t->int="caml_sqlite3_backup_pagecount"end(* Initialisation *)externalinit:unit->unit="caml_sqlite3_init"let()=Callback.register_exception"Sqlite3.InternalError"(InternalError"");Callback.register_exception"Sqlite3.Error"(Error"");Callback.register_exception"Sqlite3.RangeError"(RangeError(0,0));init()