From 2bc4b792bc22fe387d00637ecdd1c78a8950d692 Mon Sep 17 00:00:00 2001 From: Evan Nemerson Date: Sat, 10 Apr 2010 11:41:08 -0700 Subject: [PATCH] sqlite3: add wrapper methods for sqlite3_exec and sqlite3_get_table Fixes bug 579364. --- vapi/sqlite3.vapi | 51 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/vapi/sqlite3.vapi b/vapi/sqlite3.vapi index 1e725e09d..43d71e090 100644 --- a/vapi/sqlite3.vapi +++ b/vapi/sqlite3.vapi @@ -28,22 +28,52 @@ namespace Sqlite { public class Database { public int busy_timeout (int ms); public int changes (); - public int exec (string sql, Callback? sqlite3_callback = null, out string errmsg = null); + [CCode (cname = "sqlite3_exec")] + private int _exec (string sql, Callback? sqlite3_callback = null, out unowned string errmsg = null); + [CCode (cname = "_vala_sqlite3_exec")] + public int exec (string sql, Callback? sqlite3_callback = null, out string errmsg = null) { + unowned string sqlite_errmsg; + var ec = this._exec (sql, sqlite3_callback, out sqlite_errmsg); + if (sqlite_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 total_changes (); - public int complete (string sql); - public int get_table (string sql, [CCode (array_length = false)] out unowned string[] resultp, out int nrow, out int ncolumn, out string errmsg); - public static void free_table ([CCode (array_length = false)] string[] result); + [CCode (cname = "sqlite3_get_table")] + private int _get_table (string sql, [CCode (array_length = false)] out unowned string[] resultp, out int nrow, out int ncolumn, out unowned string? errmsg = null); + private static void free_table ([CCode (array_length = false)] string[] result); + [CCode (cname = "_vala_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 (sqlite_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 int prepare (string sql, int n_bytes, out Statement stmt, out string tail = null); - public int prepare_v2 (string sql, int n_bytes, out Statement stmt, out string tail = null); + 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 void trace (TraceCallback? xtrace); public void profile (ProfileCallback? xprofile); public void progress_handler (int n_opcodes, Sqlite.ProgressCallback? progress_handler); @@ -234,6 +264,15 @@ namespace Sqlite { 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); + } + [Compact] [CCode (cname = "sqlite3_mutex")] public class Mutex { -- 2.47.3