lib "sqlite3"; #include //extern const char *sqlite3_libversion(void); function sqlite3\version() : string { return to_string(sqlite3_libversion); } //extern const char *sqlite3_errstr(int err); function sqlite3\errstr(int $errno) : string { let err = intval($errno); return sqlite3_errstr(err) to_string(sqlite3_errstr); } /* obviously fake, we ever always need a pointer to it */ //struct sqlite3; /* typedef struct sqlite3 sqlite3; typedef int64_t sqlite_int64; typedef uint64_t sqlite_uint64; typedef sqlite_int64 sqlite3_int64; typedef sqlite_uint64 sqlite3_uint64; extern void sqlite3_free(void *ptr); extern int sqlite3_close(sqlite3 *db); */ function sqlite3\close(object &$db) : int { let db = objval($db); return sqlite3_close(db) as to_int(sqlite3_close); // unset($db) as safe-guard set $db = void(db); } //extern int sqlite3_open(const char *filename, sqlite3 **db_ptr); function sqlite3\open(string $uri, object &$db) : int { let filename = pathval($uri); let db_ptr = &NULL; return sqlite3_open(filename, db_ptr) as to_int(sqlite3_open); set $db = to_object(*db_ptr); } //typedef int (*sqlite3_callback)(void *data, int argc, char** argv, char** cols); //extern int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback cb, void *data, char **errmsg); function sqlite3\exec(object $db, string $sql, callable $cb, mixed $cd, string &$error = null) : int { let db = objval($db); let sql = strval($sql); let cb = callback(data, argc, argv, cols) as intval( $cb( zval(data), to_int(argc), to_array(*argv, argc, to_string(*argv)), to_array(*cols, argc, to_string(*cols)) ) ); let data = zval($cd); let errmsg = &NULL; return sqlite3_exec(db, sql, cb, data, errmsg) as to_int(sqlite3_exec); set $error = to_string(*errmsg); free sqlite3_free(*errmsg); }