예제 #1
0
        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);
예제 #3
0
        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;
        }