summaryrefslogtreecommitdiffstats
path: root/toolkit/components/sqlite/sqlite_internal.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/sqlite/sqlite_internal.js')
-rw-r--r--toolkit/components/sqlite/sqlite_internal.js323
1 files changed, 323 insertions, 0 deletions
diff --git a/toolkit/components/sqlite/sqlite_internal.js b/toolkit/components/sqlite/sqlite_internal.js
new file mode 100644
index 000000000..18b07ff50
--- /dev/null
+++ b/toolkit/components/sqlite/sqlite_internal.js
@@ -0,0 +1,323 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * This file defines an Sqlite object containing js-ctypes bindings for
+ * sqlite3. It should be included from a worker thread using require.
+ *
+ * It serves the following purposes:
+ * - opens libxul;
+ * - defines sqlite3 API functions;
+ * - defines the necessary sqlite3 types.
+ */
+
+"use strict";
+
+importScripts("resource://gre/modules/workers/require.js");
+
+var SharedAll = require(
+ "resource://gre/modules/osfile/osfile_shared_allthreads.jsm");
+
+// Open the sqlite3 library.
+var path;
+if (SharedAll.Constants.Sys.Name === "Android") {
+ path = ctypes.libraryName("sqlite3");
+} else if (SharedAll.Constants.Win) {
+ path = ctypes.libraryName("nss3");
+} else {
+ path = SharedAll.Constants.Path.libxul;
+}
+
+var lib;
+try {
+ lib = ctypes.open(path);
+} catch (ex) {
+ throw new Error("Could not open system library: " + ex.message);
+}
+
+var declareLazyFFI = SharedAll.declareLazyFFI;
+
+var Type = Object.create(SharedAll.Type);
+
+/**
+ * Opaque Structure |sqlite3_ptr|.
+ * |sqlite3_ptr| is equivalent to a void*.
+ */
+Type.sqlite3_ptr = Type.voidptr_t.withName("sqlite3_ptr");
+
+/**
+ * |sqlite3_stmt_ptr| an instance of an object representing a single SQL
+ * statement.
+ * |sqlite3_stmt_ptr| is equivalent to a void*.
+ */
+Type.sqlite3_stmt_ptr = Type.voidptr_t.withName("sqlite3_stmt_ptr");
+
+/**
+ * |sqlite3_destructor_ptr| a constant defining a special destructor behaviour.
+ * |sqlite3_destructor_ptr| is equivalent to a void*.
+ */
+Type.sqlite3_destructor_ptr = Type.voidptr_t.withName(
+ "sqlite3_destructor_ptr");
+
+/**
+ * A C double.
+ */
+Type.double = new SharedAll.Type("double", ctypes.double);
+
+/**
+ * |sqlite3_int64| typedef for 64-bit integer.
+ */
+Type.sqlite3_int64 = Type.int64_t.withName("sqlite3_int64");
+
+/**
+ * Sqlite3 constants.
+ */
+var Constants = {};
+
+/**
+ * |SQLITE_STATIC| a special value for the destructor that is passed as an
+ * argument to routines like bind_blob, bind_text and bind_text16. It means that
+ * the content pointer is constant and will never change and does need to be
+ * destroyed.
+ */
+Constants.SQLITE_STATIC = Type.sqlite3_destructor_ptr.implementation(0);
+
+/**
+ * |SQLITE_TRANSIENT| a special value for the destructor that is passed as an
+ * argument to routines like bind_blob, bind_text and bind_text16. It means that
+ * the content will likely change in the near future and that SQLite should make
+ * its own private copy of the content before returning.
+ */
+Constants.SQLITE_TRANSIENT = Type.sqlite3_destructor_ptr.implementation(-1);
+
+/**
+ * |SQLITE_OK|
+ * Successful result.
+ */
+Constants.SQLITE_OK = 0;
+
+/**
+ * |SQLITE_ROW|
+ * sqlite3_step() has another row ready.
+ */
+Constants.SQLITE_ROW = 100;
+
+/**
+ * |SQLITE_DONE|
+ * sqlite3_step() has finished executing.
+ */
+Constants.SQLITE_DONE = 101;
+
+var Sqlite3 = {
+ Constants: Constants,
+ Type: Type
+};
+
+declareLazyFFI(Sqlite3, "open", lib, "sqlite3_open", null,
+ /* return*/ Type.int,
+ /* path*/ Type.char.in_ptr,
+ /* db handle*/ Type.sqlite3_ptr.out_ptr);
+
+declareLazyFFI(Sqlite3, "open_v2", lib, "sqlite3_open_v2", null,
+ /* return*/ Type.int,
+ /* path*/ Type.char.in_ptr,
+ /* db handle*/ Type.sqlite3_ptr.out_ptr,
+ /* flags*/ Type.int,
+ /* VFS*/ Type.char.in_ptr);
+
+declareLazyFFI(Sqlite3, "close", lib, "sqlite3_close", null,
+ /* return*/ Type.int,
+ /* db handle*/ Type.sqlite3_ptr);
+
+declareLazyFFI(Sqlite3, "prepare_v2", lib, "sqlite3_prepare_v2", null,
+ /* return*/ Type.int,
+ /* db handle*/ Type.sqlite3_ptr,
+ /* zSql*/ Type.char.in_ptr,
+ /* nByte*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr.out_ptr,
+ /* unused*/ Type.cstring.out_ptr);
+
+declareLazyFFI(Sqlite3, "step", lib, "sqlite3_step", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr);
+
+declareLazyFFI(Sqlite3, "finalize", lib, "sqlite3_finalize", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr);
+
+declareLazyFFI(Sqlite3, "reset", lib, "sqlite3_reset", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr);
+
+declareLazyFFI(Sqlite3, "column_int", lib, "sqlite3_column_int", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_blob", lib, "sqlite3_column_blob", null,
+ /* return*/ Type.voidptr_t,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_bytes", lib, "sqlite3_column_bytes", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_bytes16", lib, "sqlite3_column_bytes16",
+ null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_double", lib, "sqlite3_column_double", null,
+ /* return*/ Type.double,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_int64", lib, "sqlite3_column_int64", null,
+ /* return*/ Type.sqlite3_int64,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_text", lib, "sqlite3_column_text", null,
+ /* return*/ Type.cstring,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "column_text16", lib, "sqlite3_column_text16", null,
+ /* return*/ Type.wstring,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* col*/ Type.int);
+
+declareLazyFFI(Sqlite3, "bind_int", lib, "sqlite3_bind_int", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.int);
+
+declareLazyFFI(Sqlite3, "bind_int64", lib, "sqlite3_bind_int64", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.sqlite3_int64);
+
+declareLazyFFI(Sqlite3, "bind_double", lib, "sqlite3_bind_double", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.double);
+
+declareLazyFFI(Sqlite3, "bind_null", lib, "sqlite3_bind_null", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int);
+
+declareLazyFFI(Sqlite3, "bind_zeroblob", lib, "sqlite3_bind_zeroblob", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* nBytes*/ Type.int);
+
+declareLazyFFI(Sqlite3, "bind_text", lib, "sqlite3_bind_text", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.cstring,
+ /* nBytes*/ Type.int,
+ /* destructor*/ Type.sqlite3_destructor_ptr);
+
+declareLazyFFI(Sqlite3, "bind_text16", lib, "sqlite3_bind_text16", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.wstring,
+ /* nBytes*/ Type.int,
+ /* destructor*/ Type.sqlite3_destructor_ptr);
+
+declareLazyFFI(Sqlite3, "bind_blob", lib, "sqlite3_bind_blob", null,
+ /* return*/ Type.int,
+ /* statement*/ Type.sqlite3_stmt_ptr,
+ /* index*/ Type.int,
+ /* value*/ Type.voidptr_t,
+ /* nBytes*/ Type.int,
+ /* destructor*/ Type.sqlite3_destructor_ptr);
+
+module.exports = {
+ get Constants() {
+ return Sqlite3.Constants;
+ },
+ get Type() {
+ return Sqlite3.Type;
+ },
+ get open() {
+ return Sqlite3.open;
+ },
+ get open_v2() {
+ return Sqlite3.open_v2;
+ },
+ get close() {
+ return Sqlite3.close;
+ },
+ get prepare_v2() {
+ return Sqlite3.prepare_v2;
+ },
+ get step() {
+ return Sqlite3.step;
+ },
+ get finalize() {
+ return Sqlite3.finalize;
+ },
+ get reset() {
+ return Sqlite3.reset;
+ },
+ get column_int() {
+ return Sqlite3.column_int;
+ },
+ get column_blob() {
+ return Sqlite3.column_blob;
+ },
+ get column_bytes() {
+ return Sqlite3.column_bytes;
+ },
+ get column_bytes16() {
+ return Sqlite3.column_bytes16;
+ },
+ get column_double() {
+ return Sqlite3.column_double;
+ },
+ get column_int64() {
+ return Sqlite3.column_int64;
+ },
+ get column_text() {
+ return Sqlite3.column_text;
+ },
+ get column_text16() {
+ return Sqlite3.column_text16;
+ },
+ get bind_int() {
+ return Sqlite3.bind_int;
+ },
+ get bind_int64() {
+ return Sqlite3.bind_int64;
+ },
+ get bind_double() {
+ return Sqlite3.bind_double;
+ },
+ get bind_null() {
+ return Sqlite3.bind_null;
+ },
+ get bind_zeroblob() {
+ return Sqlite3.bind_zeroblob;
+ },
+ get bind_text() {
+ return Sqlite3.bind_text;
+ },
+ get bind_text16() {
+ return Sqlite3.bind_text16;
+ },
+ get bind_blob() {
+ return Sqlite3.bind_blob;
+ }
+};