123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412openUtilmoduleB=Binding_wrappersmoduleT=Ffi_generated.TypesmoduleRow=RowmoduleField=Fieldtypemode=[`Blocking|`Nonblocking]type'mt={raw:B.mysql;host:charCtypes.ptroption;port:int;mutableuser:charCtypes.ptroption;mutablepass:charCtypes.ptroption;mutabledb:charCtypes.ptroption;socket:charCtypes.ptroption;flags:int32;mutablecharset:charCtypes.ptroption}constraint'm=[<mode]type'mmariadb='mttypeflag=|Compress|Found_rows|Ignore_sigpipe|Ignore_space|Interactive|Local_files|Multi_results|Multi_statements|No_schema|Odbc|Ssl|Remember_optionstypeprotocol=|Default|Tcp|Socket|Pipe|Memorytypeclient_option=|Connect_timeoutofint|Compress|Named_pipeofstring|Init_commandofstring|Read_default_fileofstring|Read_default_groupofstring|Set_charset_dirofstring|Set_charset_nameofstring|Local_infileofbool|Protocolofprotocol|Shared_memory_base_nameofstring|Read_timeoutofint|Write_timeoutofint|Secure_authofbool|Report_data_truncationofbool|Reconnectofbool|Ssl_verify_server_certofbool|Plugin_dirofstring|Default_authofstring|Bindofstring|Ssl_keyofstring|Ssl_certofstring|Ssl_caofstring|Ssl_capathofstring|Ssl_cipherofstring|Ssl_crlofstring|Ssl_crlpathofstring|Connect_attr_reset|Connect_attr_addofstring*string|Connect_attr_deleteofstring|Server_public_keyofstring|Enable_cleartext_pluginofbooltypeserver_option=|Multi_statementsofbooltypeerror=int*stringleterrormariadb=(B.mysql_errnomariadb.raw,B.mysql_errormariadb.raw)letint_of_server_option=function|Multi_statementstrue->T.Server_options.multi_statements_on|Multi_statementsfalse->T.Server_options.multi_statements_offletvoidp_of_strings=letopenCtypesinletb=char_ptr_buffer_of_stringsincoerce(ptrchar)(ptrvoid)bletvoidp_of_uinti=letopenCtypesinletb=allocateuint(Unsigned.UInt.of_inti)incoerce(ptruint)(ptrvoid)bletvoidp_of_boolb=letopenCtypesinletb=allocatechar(ifbthen'\001'else'\000')incoerce(ptrchar)(ptrvoid)bletint_of_protocol=function|Default->T.Protocol.default|Tcp->T.Protocol.tcp|Socket->T.Protocol.socket|Pipe->T.Protocol.pipe|Memory->T.Protocol.memoryletset_client_optionmariadbopt=letopt=matchoptwith|Connect_timeoutt->`Opt(T.Options.connect_timeout,voidp_of_uintt)|Compress->`Opt(T.Options.compress,Ctypes.null)|Named_pipepipe->`Opt(T.Options.named_pipe,voidp_of_stringpipe)|Init_commandcmd->`Opt(T.Options.init_command,voidp_of_stringcmd)|Read_default_filefile->`Opt(T.Options.read_default_file,voidp_of_stringfile)|Read_default_groupgroup->`Opt(T.Options.read_default_group,voidp_of_stringgroup)|Set_charset_dirdir->`Opt(T.Options.set_charset_dir,voidp_of_stringdir)|Set_charset_namename->`Opt(T.Options.set_charset_name,voidp_of_stringname)|Local_infileb->`Opt(T.Options.local_infile,voidp_of_uint(ifbthen1else0))|Protocolproto->`Opt(T.Options.protocol,voidp_of_uint(int_of_protocolproto))|Shared_memory_base_namename->`Opt(T.Options.shared_memory_base_name,voidp_of_stringname)|Read_timeoutt->`Opt(T.Options.read_timeout,voidp_of_uintt)|Write_timeoutt->`Opt(T.Options.write_timeout,voidp_of_uintt)|Secure_authb->`Opt(T.Options.secure_auth,voidp_of_boolb)|Report_data_truncationb->`Opt(T.Options.report_data_truncation,voidp_of_boolb)|Reconnectb->`Opt(T.Options.reconnect,voidp_of_boolb)|Ssl_verify_server_certb->`Opt(T.Options.ssl_verify_server_cert,voidp_of_boolb)|Plugin_dirdir->`Opt(T.Options.plugin_dir,voidp_of_stringdir)|Default_authauth->`Opt(T.Options.default_auth,voidp_of_stringauth)|Bindaddr->`Opt(T.Options.bind,voidp_of_stringaddr)|Ssl_keykey->`Opt(T.Options.ssl_key,voidp_of_stringkey)|Ssl_certcert->`Opt(T.Options.ssl_cert,voidp_of_stringcert)|Ssl_caca->`Opt(T.Options.ssl_ca,voidp_of_stringca)|Ssl_capathpath->`Opt(T.Options.ssl_capath,voidp_of_stringpath)|Ssl_ciphercipher->`Opt(T.Options.ssl_cipher,voidp_of_stringcipher)|Ssl_crlcrl->`Opt(T.Options.ssl_crl,voidp_of_stringcrl)|Ssl_crlpathpath->`Opt(T.Options.ssl_crlpath,voidp_of_stringpath)|Connect_attr_reset->`Opt(T.Options.connect_attr_reset,Ctypes.null)|Connect_attr_add(k,v)->`Opt4(T.Options.connect_attr_add,voidp_of_stringk,voidp_of_stringv)|Connect_attr_deleteattr->`Opt(T.Options.connect_attr_delete,voidp_of_stringattr)|Server_public_keykey->`Opt(T.Options.server_public_key,voidp_of_stringkey)|Enable_cleartext_pluginb->`Opt(T.Options.enable_cleartext_plugin,voidp_of_boolb)inmatchoptwith|`Opt(opt,arg)->B.mysql_optionsmariadb.rawoptarg|`Opt4(opt,arg1,arg2)->B.mysql_options4mariadb.rawoptarg1arg2letint_of_flag=function|Found_rows->T.Flags.found_rows|Compress->T.Flags.compress|Ignore_sigpipe->T.Flags.ignore_sigpipe|Ignore_space->T.Flags.ignore_space|Interactive->T.Flags.interactive|Local_files->T.Flags.local_files|Multi_results->T.Flags.multi_results|Multi_statements->T.Flags.multi_statements|No_schema->T.Flags.no_schema|Odbc->T.Flags.odbc|Ssl->T.Flags.ssl|Remember_options->T.Flags.remember_optionsletint_of_flags=List.fold_left(funaccflag->Int32.logoracc(int_of_flagflag))0lletget_server_infomariadb=B.mysql_get_server_infomariadb.rawletget_server_versionmariadb=Unsigned.ULong.to_int(B.mysql_get_server_versionmariadb.raw)letget_host_infomariadb=B.mysql_get_host_infomariadb.rawletget_proto_infomariadb=Unsigned.UInt.to_int(B.mysql_get_proto_infomariadb.raw)moduleRes=structopenCtypestypemeta={result:Bind.t;raw:B.res;buffers:unitptrarray}type'mu={mariadb:'mmariadb;stmt:B.stmt;meta:metaoption}type'mt='muconstraint'm=[<mode]letmetaresultrawbuffers={result;raw;buffers}letcreate~mariadb~stmt?meta()={mariadb;stmt;meta}letnum_rowsres=B.mysql_stmt_num_rowsres.stmtletaffected_rowsres=B.mysql_stmt_affected_rowsres.stmtletinsert_idres=B.mysql_stmt_insert_idres.stmtletfetch_fieldrawi=coerce(ptrvoid)(ptrT.Field.t)(B.mysql_fetch_field_directrawi)letbuild_row(typet)(moduleR:Row.Swithtypet=t)res=Option.map(fun{result;raw;_}->R.buildresult.Bind.n(funi->letfp=fetch_fieldrawiinField.createresultfpi))res.metaendletstmt_initmariadb=matchB.mysql_stmt_initmariadb.rawwith|Somestmt->B.mysql_stmt_attr_set_boolstmtT.Stmt_attr.update_max_lengthtrue;Somestmt|None->Noneletlibrary_end()=B.mysql_library_end()moduleStmt=structopenCtypestypemeta={res:B.res;result:Bind.t}type'mu={raw:B.stmt;mariadb:'mmariadb;num_params:int;params:Bind.t;mutablemeta:metaoption}type'mt='muconstraint'm=[<mode]typecursor_type=No_cursor|Read_onlytypeattr=Update_max_lengthofbool|Cursor_typeofcursor_type|Prefetch_rowsofintleterrorstmt=(B.mysql_stmt_errnostmt.raw,B.mysql_stmt_errorstmt.raw)letfetch_fieldresi=coerce(ptrvoid)(ptrT.Field.t)(B.mysql_fetch_field_directresi)lettest_unsignedflags=Unsigned.UInt.logandflagsT.Field.Flags.unsigned<>Unsigned.UInt.zeroletalloc_resultresn=letr=Bind.allocninfori=0ton-1doletbp=r.Bind.bind+@iinletfp=fetch_fieldresiinletflags=getf(!@fp)T.Field.flagsinletis_unsigned=iftest_unsignedflagsthen'\001'else'\000'insetf(!@bp)T.Bind.buffer_type(getf(!@fp)T.Field.typ);setf(!@bp)T.Bind.length(r.Bind.length+@i);setf(!@bp)T.Bind.is_null(r.Bind.is_null+@i);setf(!@bp)T.Bind.is_unsignedis_unsigned;setf(!@bp)T.Bind.error(r.Bind.error+@i)done;rletinitmariadbraw=letnp=B.mysql_stmt_param_countrawin{raw;mariadb;num_params=np;params=Bind.allocnp;meta=None}letbind_paramsstmtparams=matchArray.lengthparamswith|0->`Okstmt|_->letb=stmt.paramsinArray.iteri(funatarg->matchargwith|`Null->Bind.nullb~at|`Inti->Bind.intbi~at|`Floatx->Bind.floatbx~at|`Strings->Bind.stringbs~at|`Bytess->Bind.blobbs~at|`Timet->Bind.timebt~at)params;ifB.mysql_stmt_bind_paramstmt.rawb.Bind.bindthen`Okstmtelse`Error(errorstmt)(* From http://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html *)letbuffer_sizetyp=matchBind.buffer_type_of_inttypwith|`Null->0|`Tiny|`Year->1|`Short->2|`Int24|`Long|`Float->4|`Long_long|`Double->8|`Decimal|`New_decimal|`String|`Var_string|`Tiny_blob|`Blob|`Medium_blob|`Long_blob|`Bit->-1|`Time|`Date|`Datetime|`Timestamp->Ctypes.sizeofT.Time.tletmalloccount=letp=allocate_nchar~countincoerce(ptrchar)(ptrvoid)pletalloc_bufferbfpi=letbp=b.Bind.bind+@iinlettyp=getf(!@bp)T.Bind.buffer_typeinmatchbuffer_sizetypwith|-1->letn=getf(!@fp)T.Field.max_lengthinsetf(!@bp)T.Bind.buffer_lengthn;b.Bind.buffers.(i)<-malloc(Unsigned.ULong.to_intn);setf(!@bp)T.Bind.bufferb.Bind.buffers.(i)|n->setf(!@bp)T.Bind.buffer_length(Unsigned.ULong.of_intn);b.Bind.buffers.(i)<-mallocn;setf(!@bp)T.Bind.bufferb.Bind.buffers.(i)letupdate_metastmt=assert(stmt.meta=None);stmt.meta<-(matchB.mysql_stmt_result_metadatastmt.rawwith|Someres->letnf=B.mysql_num_fieldsresinSome{res;result=alloc_resultresnf}|None->None);stmt.metaletbind_resultstmt=matchupdate_metastmtwith|Somemeta->letb=meta.resultinletn=b.Bind.ninfori=0ton-1doletfp=fetch_fieldmeta.resiinalloc_bufferbfpidone;ifB.mysql_stmt_bind_resultstmt.rawmeta.result.Bind.bindthenletmeta=Res.metameta.resultmeta.resb.Bind.buffersinletres=Res.create~mariadb:stmt.mariadb~stmt:stmt.raw~meta()in`Okreselse`Error(errorstmt)|None->`Ok(Res.create~mariadb:stmt.mariadb~stmt:stmt.raw())end