int ISQLite3Provider.sqlite3_exec(IntPtr db, string sql, delegate_exec func, object user_data, out string errMsg) { // TODO null string? GCHandle pinned = GCHandle.Alloc(util.to_utf8(sql), GCHandleType.Pinned); IntPtr ptr = pinned.AddrOfPinnedObject(); int rc; byte[] buf8 = new byte[8]; GCHandle buf8_pinned = GCHandle.Alloc(buf8, GCHandleType.Pinned); IntPtr buf8_ptr = buf8_pinned.AddrOfPinnedObject(); if (func != null) { exec_hook_info hi = new exec_hook_info(func, user_data); callback_exec cb = new callback_exec(exec_hook_bridge); GCHandle h_cb = GCHandle.Alloc(cb); rc = SQLite3RuntimeProvider.sqlite3_exec(db.ToInt64(), ptr.ToInt64(), Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), hi.ptr.ToInt64(), buf8_ptr.ToInt64()); hi.free(); h_cb.Free(); } else { rc = SQLite3RuntimeProvider.sqlite3_exec(db.ToInt64(), ptr.ToInt64(), IntPtr.Zero.ToInt64(), IntPtr.Zero.ToInt64(), buf8_ptr.ToInt64()); } IntPtr errmsg_ptr = new IntPtr(Marshal.ReadInt64(buf8_ptr)); buf8_pinned.Free(); if (errmsg_ptr == IntPtr.Zero) { errMsg = null; } else { errMsg = util.from_utf8(errmsg_ptr); SQLite3RuntimeProvider.sqlite3_free(errmsg_ptr.ToInt64()); } pinned.Free(); return(rc); }
public static extern int sqlite3_exec (IntPtr db, byte [] strSql, callback_exec cb, IntPtr pvParam, out IntPtr errMsg);
int ISQLite3Provider.sqlite3_exec(IntPtr db, string sql, delegate_exec func, object user_data, out string errMsg) { // TODO null string? GCHandle pinned = GCHandle.Alloc(util.to_utf8(sql), GCHandleType.Pinned); IntPtr ptr = pinned.AddrOfPinnedObject(); int rc; byte[] buf8 = new byte[8]; GCHandle buf8_pinned = GCHandle.Alloc(buf8, GCHandleType.Pinned); IntPtr buf8_ptr = buf8_pinned.AddrOfPinnedObject(); if (func != null) { exec_hook_info hi = new exec_hook_info(func, user_data); callback_exec cb = new callback_exec(exec_hook_bridge); GCHandle h_cb = GCHandle.Alloc(cb); rc = SQLite3RuntimeProvider.sqlite3_exec(db.ToInt64(), ptr.ToInt64(), Marshal.GetFunctionPointerForDelegate(cb).ToInt64(), hi.ptr.ToInt64(), buf8_ptr.ToInt64()); hi.free(); h_cb.Free(); } else { rc = SQLite3RuntimeProvider.sqlite3_exec(db.ToInt64(), ptr.ToInt64(), IntPtr.Zero.ToInt64(), IntPtr.Zero.ToInt64(), buf8_ptr.ToInt64()); } IntPtr errmsg_ptr = new IntPtr(Marshal.ReadInt64(buf8_ptr)); buf8_pinned.Free(); if (errmsg_ptr == IntPtr.Zero) { errMsg = null; } else { errMsg = util.from_utf8(errmsg_ptr); SQLite3RuntimeProvider.sqlite3_free(errmsg_ptr.ToInt64()); } pinned.Free(); return rc; }