September 19, 2013 Re: SQLite3 segmentation at prepare statement | ||||
---|---|---|---|---|
| ||||
This doesn't seem to be a D problem. I re-implemented it in C and got the same error. On 09/18/2013 02:00 PM, Charles Hixson wrote: > I'm trying to use SQLite3 in D, but am getting a segmentation fault when I attempt to replace the exec statement with a prepare statement. What am I doing wrong? > > If the prepare statement is commented out, and the exec statement is uncommented, the program runs successfully. (There's no data yet in the database file.) > > The test program is: > > pragma (lib, "sqlite3"); > > > import etc.c.sqlite3; > import std.exception; > import std.stdio; > import std.string; > > /** int function(void*, int, char**, char**) callback */ > extern(C) > int callback (void* notUsed, int argc, char** argv, char** azColName) > { > for (int i = 0; i < argc; i++) > { printf ("%s = %s\n", azColName[i], argv[i] ? argv[i] : "null"); } > printf ("\n"); > return 0; > } > > void main() > { sqlite3* db; > int rc; > char* zErrMsg = null; > sqlite3_stmt** stmt; > > rc = sqlite3_open (toStringz("data/sqlitetest.db"), &db); > if (SQLITE_OK != rc) > { printf ("DB create error: %s\n", sqlite3_errmsg(db) ); } > > string sql = > "create table if not exists wrds (name text primary key, id int)\0"; > rc = sqlite3_exec(db, sql.ptr, &callback, cast(void*)0, &zErrMsg); > if (SQLITE_OK != rc) > { printf ("DB create table error: %s\n", sqlite3_errmsg(db) ); > printf ("sql = <<%s>>\n", sql); > } > > sql = "select * from wrds\0"; > rc = sqlite3_prepare(db, toStringz(sql), cast(int)sql.length, stmt, null); > // if (SQLITE_OK != rc) > // { printf ("DB prepare statement error: %s\n", sqlite3_errmsg(db) ); > // printf ("sql = <<%s>>\n", sql); > // } > // rc = sqlite3_step(*stmt); > // if (SQLITE_OK != rc) > // { printf ("DB statement step error: %s\n", sqlite3_errmsg(db) ); > // printf ("sql = <<%s>>\n", sql); > // } > // > // rc = sqlite3_exec(db, sql.ptr, &callback, cast(void*)0, &zErrMsg); > // if (SQLITE_OK != rc) > // { printf ("DB select error: %s\n", sqlite3_errmsg(db) ); > // printf ("sql = <<%s>>\n", sql); > // } > // > rc = sqlite3_close (db); > enforce (rc == SQLITE_OK); > } > -- Charles Hixson |
Copyright © 1999-2021 by the D Language Foundation