/* sqlite3.vala * * Copyright (C) 2007 Jürg Billeter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Author: * Jürg Billeter */ [CCode (lower_case_cprefix = "sqlite3_", cheader_filename = "dbsql.h")] namespace Sqlite { /* Database Connection Handle */ [Compact] [CCode (free_function = "sqlite3_close", cname = "sqlite3", cprefix = "sqlite3_")] public class Database { public int busy_timeout (int ms); public int changes (); [CCode (cname = "sqlite3_exec")] public int _exec (string sql, Callback? callback = null, [CCode (type = "char**")] out unowned string errmsg = null); [CCode (cname = "_sqlite3_exec")] public int exec (string sql, Callback? callback = null, out string errmsg = null) { unowned string sqlite_errmsg; var ec = this._exec (sql, callback, out sqlite_errmsg); if (&errmsg != null) { errmsg = sqlite_errmsg; } Sqlite.Memory.free ((void*) sqlite_errmsg); return ec; } public int extended_result_codes (int onoff); public int get_autocommit (); public void interrupt (); public int64 last_insert_rowid (); public int limit (Sqlite.Limit id, int new_val); public int total_changes (); public int complete (string sql); [CCode (cname = "sqlite3_get_table")] public int _get_table (string sql, [CCode (array_length = false)] out unowned string[] resultp, out int nrow, out int ncolumn, [CCode (type = "char**")] out unowned string? errmsg = null); private static void free_table ([CCode (array_length = false)] string[] result); [CCode (cname = "_sqlite3_get_table")] public int get_table (string sql, out string[] resultp, out int nrow, out int ncolumn, out string? errmsg = null) { unowned string sqlite_errmsg; unowned string[] sqlite_resultp; var ec = this._get_table (sql, out sqlite_resultp, out nrow, out ncolumn, out sqlite_errmsg); resultp = new string[(nrow + 1) * ncolumn]; for (var entry = 0 ; entry < resultp.length ; entry++ ) { resultp[entry] = sqlite_resultp[entry]; } Sqlite.Database.free_table (sqlite_resultp); if (&errmsg != null) { errmsg = sqlite_errmsg; } Sqlite.Memory.free ((void*) sqlite_errmsg); return ec; } public static int open (string filename, out Database db); public static int open_v2 (string filename, out Database db, int flags = OPEN_READWRITE | OPEN_CREATE, string? zVfs = null); public int errcode (); public unowned string errmsg (); public unowned Sqlite.Statement next_stmt (Sqlite.Statement? current); public int prepare (string sql, int n_bytes, out Statement stmt, out unowned string tail = null); public int prepare_v2 (string sql, int n_bytes, out Statement stmt, out unowned string tail = null); public int set_authorizer (AuthorizeCallback? auth); [CCode (cname = "sqlite3_db_status")] public int status (Sqlite.DatabaseStatus op, out int pCurrent, out int pHighwater, int resetFlag = 0); public int table_column_metadata (string db_name, string table_name, string column_name, out string? data_type, out string? collation_sequence, out int? not_null, out int? primary_key, out int? auto_increment); public void trace (TraceCallback? xtrace); public void profile (ProfileCallback? xprofile); public void progress_handler (int n_opcodes, Sqlite.ProgressCallback? progress_handler); public void commit_hook (CommitCallback? commit_hook); public void rollback_hook (RollbackCallback? rollback_hook); public void update_hook (UpdateCallback? update_hook); public int create_function (string zFunctionName, int nArg, int eTextRep, void * user_data, UserFuncCallback? xFunc, UserFuncCallback? xStep, UserFuncFinishCallback? xFinal); public int create_function_v2 (string zFunctionName, int nArg, int eTextRep, void * user_data, UserFuncCallback? xFunc, UserFuncCallback? xStep, UserFuncFinishCallback? xFinal, GLib.DestroyNotify? destroy = null); public int create_collation (string zName, int eTextRep, [CCode (delegate_target_pos = 2.9, type = "int (*)(void *, int, const void *, int, const void *)")] CompareCallback xCompare); public int wal_autocheckpoint (int N); public int wal_checkpoint (string zDb); public void* wal_hook (WALHookCallback cb, string db_name, int page_count); } [CCode (instance_pos = 0)] public delegate int AuthorizeCallback (Sqlite.Action action, string? p1, string? p2, string db_name, string? responsible); [CCode (instance_pos = 0)] public delegate void TraceCallback (string message); [CCode (instance_pos = 0)] public delegate void ProfileCallback (string sql, uint64 time); public delegate int ProgressCallback (); public delegate int CommitCallback (); public delegate void RollbackCallback (); [CCode (has_target = false)] public delegate void UserFuncCallback (Sqlite.Context context, [CCode (array_length_pos = 1.1)] Sqlite.Value[] values); [CCode (has_target = false)] public delegate void UserFuncFinishCallback (Sqlite.Context context); [CCode (instance_pos = 0)] public delegate void UpdateCallback (Sqlite.Action action, string dbname, string table, int64 rowid); [CCode (instance_pos = 0)] public delegate int CompareCallback (int alen, void* a, int blen, void* b); [CCode (instance_pos = 0)] public delegate int WALHookCallback (Sqlite.Database db, string dbname, int pages); public unowned string? compileoption_get (int n); public int compileoption_used (string option_name); public static int complete (string sql); [CCode (sentinel = "")] public static int config (Sqlite.Config op, ...); public unowned string libversion (); public int libversion_number (); [PrintfFormat] public void log (int error_code, string format, ...); public unowned string sourceid (); public static int status (Sqlite.Status op, out int pCurrent, out int pHighwater, int resetFlag = 0); public static int threadsafe (); [CCode (cname = "SQLITE_VERSION")] public const string VERSION; [CCode (cname = "SQLITE_VERSION_NUMBER")] public const int VERSION_NUMBER; [CCode (cname = "SQLITE_SOURCE_ID")] public const string SOURCE_ID; /* Dynamically Typed Value Object */ [Compact] [CCode (cname = "sqlite3_value")] public class Value { [CCode (cname = "sqlite3_value_blob")] public void* to_blob (); [CCode (cname = "sqlite3_value_bytes")] public int to_bytes (); [CCode (cname = "sqlite3_value_double")] public double to_double (); [CCode (cname = "sqlite3_value_int")] public int to_int (); [CCode (cname = "sqlite3_value_int64")] public int64 to_int64 (); [CCode (cname = "sqlite3_value_text")] public unowned string to_text (); [CCode (cname = "sqlite3_value_type")] public int to_type (); [CCode (cname = "sqlite3_value_numeric_type")] public int to_numeric_type (); } [CCode (cname = "sqlite3_callback", instance_pos = 0)] public delegate int Callback (int n_columns, [CCode (array_length = false)] string[] values, [CCode (array_length = false)] string[] column_names); [CCode (cname = "SQLITE_OK")] public const int OK; [CCode (cname = "SQLITE_ERROR")] public const int ERROR; [CCode (cname = "SQLITE_INTERNAL")] public const int INTERNAL; [CCode (cname = "SQLITE_PERM")] public const int PERM; [CCode (cname = "SQLITE_ABORT")] public const int ABORT; [CCode (cname = "SQLITE_BUSY")] public const int BUSY; [CCode (cname = "SQLITE_LOCKED")] public const int LOCKED; [CCode (cname = "SQLITE_NOMEM")] public const int NOMEM; [CCode (cname = "SQLITE_READONLY")] public const int READONLY; [CCode (cname = "SQLITE_INTERRUPT")] public const int INTERRUPT; [CCode (cname = "SQLITE_IOERR")] public const int IOERR; [CCode (cname = "SQLITE_CORRUPT")] public const int CORRUPT; [CCode (cname = "SQLITE_NOTFOUND")] public const int NOTFOUND; [CCode (cname = "SQLITE_FULL")] public const int FULL; [CCode (cname = "SQLITE_CANTOPEN")] public const int CANTOPEN; [CCode (cname = "SQLITE_PROTOCOL")] public const int PROTOCOL; [CCode (cname = "SQLITE_EMPTY")] public const int EMPTY; [CCode (cname = "SQLITE_SCHEMA")] public const int SCHEMA; [CCode (cname = "SQLITE_TOOBIG")] public const int TOOBIG; [CCode (cname = "SQLITE_CONSTRAINT")] public const int CONSTRAINT; [CCode (cname = "SQLITE_MISMATCH")] public const int MISMATCH; [CCode (cname = "SQLITE_MISUSE")] public const int MISUSE; [CCode (cname = "SQLITE_NOLFS")] public const int NOLFS; [CCode (cname = "SQLITE_AUTH")] public const int AUTH; [CCode (cname = "SQLITE_FORMAT")] public const int FORMAT; [CCode (cname = "SQLITE_RANGE")] public const int RANGE; [CCode (cname = "SQLITE_NOTADB")] public const int NOTADB; [CCode (cname = "SQLITE_ROW")] public const int ROW; [CCode (cname = "SQLITE_DONE")] public const int DONE; [CCode (cname = "SQLITE_OPEN_READONLY")] public const int OPEN_READONLY; [CCode (cname = "SQLITE_OPEN_READWRITE")] public const int OPEN_READWRITE; [CCode (cname = "SQLITE_OPEN_CREATE")] public const int OPEN_CREATE; [CCode (cname = "SQLITE_INTEGER")] public const int INTEGER; [CCode (cname = "SQLITE_FLOAT")] public const int FLOAT; [CCode (cname = "SQLITE_BLOB")] public const int BLOB; [CCode (cname = "SQLITE_NULL")] public const int NULL; [CCode (cname = "SQLITE3_TEXT")] public const int TEXT; [CCode (cname = "SQLITE_MUTEX_FAST")] public const int MUTEX_FAST; [CCode (cname = "SQLITE_MUTEX_RECURSIVE")] public const int MUTEX_RECURSIVE; [CCode (cname = "SQLITE_UTF8")] public const int UTF8; [CCode (cname = "SQLITE_UTF16LE")] public const int UTF16LE; [CCode (cname = "SQLITE_UTF16BE")] public const int UTF16BE; [CCode (cname = "SQLITE_UTF16")] public const int UTF16; [CCode (cname = "SQLITE_ANY")] public const int ANY; [CCode (cname = "SQLITE_UTF16_ALIGNED")] public const int UTF16_ALIGNED; [CCode (cname = "int", cprefix = "SQLITE_")] public enum Action { CREATE_INDEX, CREATE_TABLE, CREATE_TEMP_INDEX, CREATE_TEMP_TABLE, CREATE_TEMP_TRIGGER, CREATE_TEMP_VIEW, CREATE_TRIGGER, CREATE_VIEW, DELETE, DROP_INDEX, DROP_TABLE, DROP_TEMP_INDEX, DROP_TEMP_TABLE, DROP_TEMP_TRIGGER, DROP_TEMP_VIEW, DROP_TRIGGER, DROP_VIEW, INSERT, PRAGMA, READ, SELECT, TRANSACTION, UPDATE, ATTACH, DETACH, ALTER_TABLE, REINDEX, ANALYZE, CREATE_VTABLE, DROP_VTABLE, FUNCTION, SAVEPOINT, COPY } [CCode (cname = "int", cprefix = "SQLITE_CONFIG_")] public enum Config { SINGLETHREAD, MULTITHREAD, SERIALIZED, MALLOC, GETMALLOC, SCRATCH, PAGECACHE, HEAP, MEMSTATUS, MUTEX, GETMUTEX, LOOKASIDE, PCACHE, GETPCACHE, LOG, } [CCode (cname = "int", cprefix = "SQLITE_DBSTATUS_")] public enum DatabaseStatus { LOOKASIDE_USED } [CCode (cname = "int", cprefix = "SQLITE_LIMIT_")] public enum Limit { LENGTH, SQL_LENGTH, COLUMN, EXPR_DEPTH, COMPOUND_SELECT, VDBE_OP, FUNCTION_ARG, ATTACHED, LIKE_PATTERN_LENGTH, VARIABLE_NUMBER, TRIGGER_DEPTH } [CCode (cname = "int", cprefix = "SQLITE_STMTSTATUS_")] public enum StatementStatus { FULLSCAN_STEP, SORT } [CCode (cname = "int", cprefix = "SQLITE_STATUS_")] public enum Status { MEMORY_USED, PAGECACHE_USED, PAGECACHE_OVERFLOW, SCRATCH_USED, SCRATCH_OVERFLOW, MALLOC_SIZE, PARSER_STACK, PAGECACHE_SIZE, SCRATCH_SIZE } /* SQL Statement Object */ [Compact] [CCode (free_function = "sqlite3_finalize", cname = "sqlite3_stmt", cprefix = "sqlite3_")] public class Statement { public int bind_parameter_count (); public int bind_parameter_index (string name); public unowned string bind_parameter_name (int index); public int clear_bindings (); public int column_count (); public int data_count (); public unowned Database db_handle (); public int reset (); [CCode (cname = "sqlite3_stmt_status")] public int status (Sqlite.StatementStatus op, int resetFlg = 0); public int step (); public int bind_blob (int index, void* value, int n, GLib.DestroyNotify? destroy_notify = null); public int bind_double (int index, double value); public int bind_int (int index, int value); public int bind_int64 (int index, int64 value); public int bind_null (int index); [CCode (cname = "sqlite3_bind_text")] public int _bind_text (int index, string value, int n = -1, GLib.DestroyNotify? destroy_notify = null); public int bind_text (int index, owned string value, int n = -1, GLib.DestroyNotify destroy_notify = GLib.g_free); public int bind_value (int index, Value value); public int bind_zeroblob (int index, int n); public void* column_blob (int col); public int column_bytes (int col); public double column_double (int col); public int column_int (int col); public int64 column_int64 (int col); public unowned string column_text (int col); public int column_type (int col); public unowned Value column_value (int col); public unowned string column_name (int index); public unowned string column_database_name (int col); public unowned string column_table_name (int col); public unowned string column_origin_name (int col); public unowned string sql (); } namespace Memory { [CCode (cname = "sqlite3_malloc")] public static void* malloc (int n_bytes); [CCode (cname = "sqlite3_realloc")] public static void* realloc (void* mem, int n_bytes); [CCode (cname = "sqlite3_free")] public static void free (void* mem); [CCode (cname = "sqlite3_release_memory")] public static int release (int bytes); [CCode (cname = "sqlite3_memory_used")] public static int64 used (); [CCode (cname = "sqlite3_memory_highwater")] public static int64 highwater (int reset = 0); [Deprecated (since = "3.7.2", replacement = "Sqlite.Memory.soft_heap_limit64")] [CCode (cname = "sqlite3_soft_heap_limit")] public static void soft_heap_limit (int limit); [CCode (cname = "sqlite3_soft_heap_limit64")] public static int64 soft_heap_limit64 (int64 limit = -1); } [Compact] [CCode (cname = "sqlite3_mutex")] public class Mutex { [CCode (cname = "sqlite3_mutex_alloc")] public Mutex (int mutex_type = MUTEX_RECURSIVE); public void enter (); public int held (); public int notheld (); public int @try (); public void leave (); } [Compact, CCode (cname = "sqlite3_context", cprefix = "sqlite3_")] public class Context { public void result_blob (owned uint8[] data, GLib.DestroyNotify? destroy_notify = GLib.g_free); public void result_double (double value); public void result_error (string value, int error_code); public void result_error_toobig (); public void result_error_nomem (); public void result_error_code (int error_code); public void result_int (int value); public void result_int64 (int64 value); public void result_null (); public void result_text (owned string value, int length = -1, GLib.DestroyNotify? destroy_notify = GLib.g_free); public void result_value (Sqlite.Value value); public void result_zeroblob (int n); [CCode (simple_generics = true)] public unowned T user_data (); [CCode (simple_generics = true)] public void set_auxdata (int N, owned T data); [CCode (simple_generics = true)] public unowned T get_auxdata (int N); [CCode (cname = "sqlite3_context_db_handle")] public unowned Database db_handle (); [CCode (cname = "sqlite3_aggregate_context")] public void * aggregate (int n_bytes); } [Compact, CCode (cname = "sqlite3_backup", free_function = "sqlite3_backup_finish", cprefix = "sqlite3_backup_")] public class Backup { [CCode (cname = "sqlite3_backup_init")] public Backup (Database dest, string dest_name, Database source, string source_name); public int step (int nPage); public int remaining (); public int pagecount (); } }