dbd/sqlite3/statement.c

Mon, 20 Dec 2010 09:01:12 +0000

author
nrich@ii.net
date
Mon, 20 Dec 2010 09:01:12 +0000
changeset 41
e490414a391d
parent 33
6c64c45e7d8f
permissions
-rw-r--r--

Fix DBD.SQLite3 transaction handling

1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
1 #include "dbd_sqlite3.h"
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
2
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
3 extern int try_begin_transaction(connection_t *conn);
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
4 extern int try_end_transaction(connection_t *conn);
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
5
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
6 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
7 * Converts SQLite types to Lua types
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
8 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
9 static lua_push_type_t sqlite_to_lua_push(unsigned int sqlite_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
10 lua_push_type_t lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
11
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
12 switch(sqlite_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
13 case SQLITE_NULL:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
14 lua_type = LUA_PUSH_NIL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
15 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
16
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
17 case SQLITE_INTEGER:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
18 lua_type = LUA_PUSH_INTEGER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
19 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
20
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
21 case SQLITE_FLOAT:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
22 lua_type = LUA_PUSH_NUMBER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
23 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
24
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
25 default:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
26 lua_type = LUA_PUSH_STRING;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
27 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
28
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
29 return lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
30 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
31
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
32 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
33 * runs sqlite3_step on a statement handle
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
34 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
35 static int step(statement_t *statement) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
36 int res = sqlite3_step(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
37
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
38 if (res == SQLITE_DONE) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
39 statement->more_data = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
40 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
41 } else if (res == SQLITE_ROW) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
42 statement->more_data = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
43 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
44 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
45
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
46 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
47 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
48
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
49 /*
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
50 * num_affected_rows = statement:affected()
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
51 */
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
52 static int statement_affected(lua_State *L) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
53 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
54
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
55 if (!statement->stmt) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
56 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
57 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
58
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
59 lua_pushinteger(L, statement->affected);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
60
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
61 return 1;
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
62 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
63
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
64 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
65 * success = statement:close()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
66 */
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
67 static int statement_close(lua_State *L) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
68 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
69 int ok = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
70
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
71 if (statement->stmt) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
72 if (sqlite3_finalize(statement->stmt) == SQLITE_OK) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
73 ok = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
74 }
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
75
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
76 statement->stmt = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
77 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
78
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
79 lua_pushboolean(L, ok);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
80 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
81 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
82
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
83 /*
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
84 * column_names = statement:columns()
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
85 */
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
86 static int statement_columns(lua_State *L) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
87 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
88
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
89 int i;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
90 int num_columns;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
91 int d = 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
92
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
93 if (!statement->stmt) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
94 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
95 return 0;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
96 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
97
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
98 num_columns = sqlite3_column_count(statement->stmt);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
99 lua_newtable(L);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
100 for (i = 0; i < num_columns; i++) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
101 const char *name = sqlite3_column_name(statement->stmt, i);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
102
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
103 LUA_PUSH_ARRAY_STRING(d, name);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
104 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
105
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
106 return 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
107 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
108
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
109 /*
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
110 * success,err = statement:execute(...)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
111 */
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
112 static int statement_execute(lua_State *L) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
113 int n = lua_gettop(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
114 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
115 int p;
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
116 int errflag = 0;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
117 const char *errstr = NULL;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
118 int expected_params;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
119 int num_bind_params = n - 1;
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
120
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
121 if (!statement->stmt) {
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
122 lua_pushboolean(L, 0);
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
123 lua_pushstring(L, DBI_ERR_EXECUTE_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
124 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
125 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
126
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
127 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
128 * reset the handle before binding params
33
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
129 * this will be a NOP if the handle has not
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
130 * been executed
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
131 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
132 if (sqlite3_reset(statement->stmt) != SQLITE_OK) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
133 lua_pushboolean(L, 0);
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
134 lua_pushfstring(L, DBI_ERR_EXECUTE_FAILED, sqlite3_errmsg(statement->conn->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
135 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
136 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
137
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
138 sqlite3_clear_bindings(statement->stmt);
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
139
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
140 expected_params = sqlite3_bind_parameter_count(statement->stmt);
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
141 if (expected_params != num_bind_params) {
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
142 /*
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
143 * sqlite3_reset does not handle this condition,
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
144 * and the client library will fill unset params
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
145 * with NULLs
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
146 */
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
147 lua_pushboolean(L, 0);
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
148 lua_pushfstring(L, DBI_ERR_PARAM_MISCOUNT, expected_params, num_bind_params);
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
149 return 2;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
150 }
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
151
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
152 for (p = 2; p <= n; p++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
153 int i = p - 1;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
154 int type = lua_type(L, p);
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
155 char err[64];
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
156
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
157 switch(type) {
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
158 case LUA_TNIL:
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
159 errflag = sqlite3_bind_null(statement->stmt, i) != SQLITE_OK;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
160 break;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
161 case LUA_TNUMBER:
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
162 errflag = sqlite3_bind_double(statement->stmt, i, lua_tonumber(L, p)) != SQLITE_OK;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
163 break;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
164 case LUA_TSTRING:
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
165 errflag = sqlite3_bind_text(statement->stmt, i, lua_tostring(L, p), -1, SQLITE_STATIC) != SQLITE_OK;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
166 break;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
167 case LUA_TBOOLEAN:
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
168 errflag = sqlite3_bind_int(statement->stmt, i, lua_toboolean(L, p)) != SQLITE_OK;
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
169 break;
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
170 default:
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
171 /*
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
172 * Unknown/unsupported value type
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 5
diff changeset
173 */
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
174 errflag = 1;
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
175 snprintf(err, sizeof(err)-1, DBI_ERR_BINDING_TYPE_ERR, lua_typename(L, type));
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
176 errstr = err;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
177 }
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
178
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
179 if (errflag)
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
180 break;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
181 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
182
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
183 if (errflag) {
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
184 lua_pushboolean(L, 0);
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
185 if (errstr)
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
186 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, errstr);
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
187 else
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
188 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, sqlite3_errmsg(statement->conn->sqlite));
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
189
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
190 return 2;
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
191 }
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
192
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
193 try_begin_transaction(statement->conn);
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
194
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
195 if (!step(statement)) {
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
196 lua_pushboolean(L, 0);
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
197 lua_pushfstring(L, DBI_ERR_EXECUTE_FAILED, sqlite3_errmsg(statement->conn->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
198 return 2;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
199 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
200
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
201 statement->affected = sqlite3_changes(statement->conn->sqlite);
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
202
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
203 lua_pushboolean(L, 1);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
204 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
205 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
206
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
207 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
208 * must be called after an execute
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
209 */
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
210 static int statement_fetch_impl(lua_State *L, statement_t *statement, int named_columns) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
211 int num_columns;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
212
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
213 if (!statement->stmt) {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
214 luaL_error(L, DBI_ERR_FETCH_INVALID);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
215 return 0;
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
216 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
217
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
218 if (!statement->more_data) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
219 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
220 * Result set is empty, or not result set returned
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
221 */
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
222
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
223 lua_pushnil(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
224 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
225 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
226
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
227 num_columns = sqlite3_column_count(statement->stmt);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
228
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
229 if (num_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
230 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
231 int d = 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
232
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
233 lua_newtable(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
234
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
235 for (i = 0; i < num_columns; i++) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
236 lua_push_type_t lua_push = sqlite_to_lua_push(sqlite3_column_type(statement->stmt, i));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
237 const char *name = sqlite3_column_name(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
238
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
239 if (lua_push == LUA_PUSH_NIL) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
240 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
241 LUA_PUSH_ATTRIB_NIL(name);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
242 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
243 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
244 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
245 } else if (lua_push == LUA_PUSH_INTEGER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
246 int val = sqlite3_column_int(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
247
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
248 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
249 LUA_PUSH_ATTRIB_INT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
250 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
251 LUA_PUSH_ARRAY_INT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
252 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
253 } else if (lua_push == LUA_PUSH_NUMBER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
254 double val = sqlite3_column_double(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
255
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
256 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
257 LUA_PUSH_ATTRIB_FLOAT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
258 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
259 LUA_PUSH_ARRAY_FLOAT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
260 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
261 } else if (lua_push == LUA_PUSH_STRING) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
262 const char *val = (const char *)sqlite3_column_text(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
263
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
264 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
265 LUA_PUSH_ATTRIB_STRING(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
266 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
267 LUA_PUSH_ARRAY_STRING(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
268 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
269 } else if (lua_push == LUA_PUSH_BOOLEAN) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
270 int val = sqlite3_column_int(statement->stmt, i);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
271
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
272 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
273 LUA_PUSH_ATTRIB_BOOL(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
274 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
275 LUA_PUSH_ARRAY_BOOL(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
276 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
277 } else {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
278 luaL_error(L, DBI_ERR_UNKNOWN_PUSH);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
279 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
280 }
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
281 } else {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
282 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
283 * no columns returned by statement?
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
284 */
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
285 lua_pushnil(L);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
286 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
287
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
288 if (step(statement) == 0) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
289 if (sqlite3_reset(statement->stmt) != SQLITE_OK) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
290 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
291 * reset needs to be called to retrieve the 'real' error message
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
292 */
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
293 luaL_error(L, DBI_ERR_FETCH_FAILED, sqlite3_errmsg(statement->conn->sqlite));
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
294 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
295 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
296
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
297 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
298 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
299
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
300 static int next_iterator(lua_State *L) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
301 statement_t *statement = (statement_t *)luaL_checkudata(L, lua_upvalueindex(1), DBD_SQLITE_STATEMENT);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
302 int named_columns = lua_toboolean(L, lua_upvalueindex(2));
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
303
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
304 return statement_fetch_impl(L, statement, named_columns);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
305 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
306
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
307 /*
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
308 * table = statement:fetch(named_indexes)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
309 */
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
310 static int statement_fetch(lua_State *L) {
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
311 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
312 int named_columns = lua_toboolean(L, 2);
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
313
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
314 return statement_fetch_impl(L, statement, named_columns);
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
315 }
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
316
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
317 /*
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
318 * iterfunc = statement:rows(named_indexes)
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
319 */
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
320 static int statement_rows(lua_State *L) {
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
321 if (lua_gettop(L) == 1) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
322 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
323 lua_pushboolean(L, 0);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
324 } else {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
325 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
326 lua_pushboolean(L, lua_toboolean(L, 2));
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
327 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
328
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
329 lua_pushcclosure(L, next_iterator, 2);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
330 return 1;
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
331 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
332
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
333 /*
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
334 * num_rows = statement:rowcount()
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
335 */
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
336 static int statement_rowcount(lua_State *L) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
337 luaL_error(L, DBI_ERR_NOT_IMPLEMENTED, DBD_SQLITE_STATEMENT, "rowcount");
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
338
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
339 return 0;
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
340 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
341
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
342 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
343 * __gc
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
344 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
345 static int statement_gc(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
346 /* always free the handle */
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
347 statement_close(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
348
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
349 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
350 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
351
32
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
352 /*
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
353 * __tostring
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
354 */
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
355 static int statement_tostring(lua_State *L) {
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
356 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_SQLITE_STATEMENT);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
357
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
358 lua_pushfstring(L, "%s: %p", DBD_SQLITE_STATEMENT, statement);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
359
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
360 return 1;
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
361 }
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
362
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
363 int dbd_sqlite3_statement_create(lua_State *L, connection_t *conn, const char *sql_query) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
364 statement_t *statement = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
365
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
366 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t));
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
367 statement->conn = conn;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
368 statement->stmt = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
369 statement->more_data = 0;
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
370 statement->affected = 0;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
371
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
372 if (sqlite3_prepare_v2(statement->conn->sqlite, sql_query, strlen(sql_query), &statement->stmt, NULL) != SQLITE_OK) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
373 lua_pushnil(L);
41
e490414a391d Fix DBD.SQLite3 transaction handling
nrich@ii.net
parents: 33
diff changeset
374 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, sqlite3_errmsg(statement->conn->sqlite));
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
375 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
376 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
377
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
378 luaL_getmetatable(L, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
379 lua_setmetatable(L, -2);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
380 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
381 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
382
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
383 int dbd_sqlite3_statement(lua_State *L) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
384 static const luaL_Reg statement_methods[] = {
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
385 {"affected", statement_affected},
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
386 {"close", statement_close},
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
387 {"columns", statement_columns},
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
388 {"execute", statement_execute},
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
389 {"fetch", statement_fetch},
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
390 {"rows", statement_rows},
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 12
diff changeset
391 {"rowcount", statement_rowcount},
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
392 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
393 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
394
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
395 static const luaL_Reg statement_class_methods[] = {
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
396 {NULL, NULL}
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
397 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
398
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
399 luaL_newmetatable(L, DBD_SQLITE_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
400 luaL_register(L, 0, statement_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
401 lua_pushvalue(L,-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
402 lua_setfield(L, -2, "__index");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
403
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
404 lua_pushcfunction(L, statement_gc);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
405 lua_setfield(L, -2, "__gc");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
406
32
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
407 lua_pushcfunction(L, statement_tostring);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
408 lua_setfield(L, -2, "__tostring");
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
409
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
410 luaL_register(L, DBD_SQLITE_STATEMENT, statement_class_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
411
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
412 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
413 }

mercurial