sqlite.c revision 1.9.10.1 1 1.9.10.1 christos /* $NetBSD: sqlite.c,v 1.9.10.1 2019/06/10 22:05:28 christos Exp $ */
2 1.1 mbalmer
3 1.1 mbalmer /*
4 1.9 mbalmer * Copyright (c) 2011, 2013, 2016, 2017 Marc Balmer <marc (at) msys.ch>
5 1.1 mbalmer * All rights reserved.
6 1.1 mbalmer *
7 1.1 mbalmer * Redistribution and use in source and binary forms, with or without
8 1.1 mbalmer * modification, are permitted provided that the following conditions
9 1.1 mbalmer * are met:
10 1.1 mbalmer * 1. Redistributions of source code must retain the above copyright
11 1.1 mbalmer * notice, this list of conditions and the following disclaimer.
12 1.1 mbalmer * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 mbalmer * notice, this list of conditions and the following disclaimer in the
14 1.1 mbalmer * documentation and/or other materials provided with the distribution.
15 1.1 mbalmer *
16 1.1 mbalmer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1 mbalmer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 mbalmer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1 mbalmer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 mbalmer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 1.1 mbalmer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 1.1 mbalmer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 1.1 mbalmer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 1.1 mbalmer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 1.1 mbalmer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 1.1 mbalmer */
27 1.1 mbalmer
28 1.1 mbalmer /* SQLite interface for Lua */
29 1.1 mbalmer
30 1.1 mbalmer #include <stdarg.h>
31 1.1 mbalmer #include <stdio.h>
32 1.1 mbalmer #include <string.h>
33 1.1 mbalmer #include <stdlib.h>
34 1.1 mbalmer #include <sqlite3.h>
35 1.1 mbalmer
36 1.1 mbalmer #include <lua.h>
37 1.1 mbalmer #include <lauxlib.h>
38 1.1 mbalmer #include <lualib.h>
39 1.1 mbalmer
40 1.1 mbalmer #define SQLITE_DB_METATABLE "SQLite database connection methods"
41 1.1 mbalmer #define SQLITE_STMT_METATABLE "SQLite statement methods"
42 1.1 mbalmer
43 1.1 mbalmer int luaopen_sqlite(lua_State*);
44 1.1 mbalmer
45 1.4 joerg static __printflike(2, 3) void
46 1.1 mbalmer sqlite_error(lua_State *L, const char *fmt, ...)
47 1.1 mbalmer {
48 1.1 mbalmer va_list ap;
49 1.1 mbalmer int len;
50 1.1 mbalmer char *msg;
51 1.1 mbalmer
52 1.1 mbalmer va_start(ap, fmt);
53 1.1 mbalmer len = vasprintf(&msg, fmt, ap);
54 1.1 mbalmer va_end(ap);
55 1.1 mbalmer
56 1.1 mbalmer if (len != -1) {
57 1.1 mbalmer lua_pushstring(L, msg);
58 1.1 mbalmer free(msg);
59 1.1 mbalmer } else
60 1.1 mbalmer lua_pushstring(L, "vasprintf failed");
61 1.1 mbalmer lua_error(L);
62 1.1 mbalmer }
63 1.1 mbalmer
64 1.1 mbalmer static int
65 1.1 mbalmer sqlite_initialize(lua_State *L)
66 1.1 mbalmer {
67 1.1 mbalmer lua_pushinteger(L, sqlite3_initialize());
68 1.1 mbalmer return 1;
69 1.1 mbalmer }
70 1.1 mbalmer
71 1.1 mbalmer static int
72 1.1 mbalmer sqlite_shutdown(lua_State *L)
73 1.1 mbalmer {
74 1.1 mbalmer lua_pushinteger(L, sqlite3_shutdown());
75 1.1 mbalmer return 1;
76 1.1 mbalmer }
77 1.1 mbalmer
78 1.1 mbalmer static int
79 1.1 mbalmer sqlite_open(lua_State *L)
80 1.1 mbalmer {
81 1.1 mbalmer sqlite3 **db;
82 1.1 mbalmer
83 1.1 mbalmer db = lua_newuserdata(L, sizeof(sqlite3 *));
84 1.6 mbalmer luaL_getmetatable(L, SQLITE_DB_METATABLE);
85 1.6 mbalmer lua_setmetatable(L, -2);
86 1.1 mbalmer
87 1.6 mbalmer if (lua_gettop(L) > 2)
88 1.6 mbalmer lua_pushinteger(L, sqlite3_open_v2(luaL_checkstring(L, -3), db,
89 1.6 mbalmer (int)luaL_checkinteger(L, -2), NULL));
90 1.6 mbalmer else
91 1.6 mbalmer lua_pushinteger(L, sqlite3_open(luaL_checkstring(L, -2), db));
92 1.1 mbalmer return 2;
93 1.1 mbalmer
94 1.1 mbalmer }
95 1.1 mbalmer
96 1.1 mbalmer static int
97 1.1 mbalmer sqlite_libversion(lua_State *L)
98 1.1 mbalmer {
99 1.1 mbalmer lua_pushstring(L, sqlite3_libversion());
100 1.1 mbalmer return 1;
101 1.1 mbalmer }
102 1.1 mbalmer
103 1.1 mbalmer static int
104 1.1 mbalmer sqlite_libversion_number(lua_State *L)
105 1.1 mbalmer {
106 1.1 mbalmer lua_pushinteger(L, sqlite3_libversion_number());
107 1.1 mbalmer return 1;
108 1.1 mbalmer }
109 1.1 mbalmer
110 1.1 mbalmer static int
111 1.1 mbalmer sqlite_sourceid(lua_State *L)
112 1.1 mbalmer {
113 1.1 mbalmer lua_pushstring(L, sqlite3_sourceid());
114 1.1 mbalmer return 1;
115 1.1 mbalmer }
116 1.1 mbalmer
117 1.1 mbalmer static int
118 1.1 mbalmer db_close(lua_State *L)
119 1.1 mbalmer {
120 1.1 mbalmer sqlite3 **db;
121 1.1 mbalmer
122 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
123 1.9 mbalmer if (*db) {
124 1.9 mbalmer lua_pushinteger(L, sqlite3_close(*db));
125 1.9 mbalmer *db = NULL;
126 1.9 mbalmer } else
127 1.9 mbalmer lua_pushnil(L);
128 1.1 mbalmer return 1;
129 1.1 mbalmer
130 1.1 mbalmer }
131 1.1 mbalmer
132 1.1 mbalmer static int
133 1.1 mbalmer db_prepare(lua_State *L)
134 1.1 mbalmer {
135 1.1 mbalmer sqlite3 **db;
136 1.1 mbalmer sqlite3_stmt **stmt;
137 1.1 mbalmer const char *sql;
138 1.1 mbalmer
139 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
140 1.1 mbalmer stmt = lua_newuserdata(L, sizeof(sqlite3_stmt *));
141 1.1 mbalmer sql = luaL_checkstring(L, 2);
142 1.1 mbalmer lua_pushinteger(L, sqlite3_prepare_v2(*db, sql,
143 1.1 mbalmer (int)strlen(sql) + 1, stmt, NULL));
144 1.1 mbalmer luaL_getmetatable(L, SQLITE_STMT_METATABLE);
145 1.1 mbalmer lua_setmetatable(L, -3);
146 1.1 mbalmer return 2;
147 1.1 mbalmer
148 1.1 mbalmer }
149 1.1 mbalmer
150 1.1 mbalmer static int
151 1.1 mbalmer db_exec(lua_State *L)
152 1.1 mbalmer {
153 1.1 mbalmer sqlite3 **db;
154 1.1 mbalmer
155 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
156 1.1 mbalmer lua_pushinteger(L, sqlite3_exec(*db, lua_tostring(L, 2), NULL,
157 1.1 mbalmer NULL, NULL));
158 1.1 mbalmer return 1;
159 1.1 mbalmer }
160 1.1 mbalmer
161 1.1 mbalmer static int
162 1.1 mbalmer db_errcode(lua_State *L)
163 1.1 mbalmer {
164 1.1 mbalmer sqlite3 **db;
165 1.1 mbalmer
166 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
167 1.1 mbalmer lua_pushinteger(L, sqlite3_errcode(*db));
168 1.1 mbalmer return 1;
169 1.1 mbalmer }
170 1.1 mbalmer
171 1.1 mbalmer static int
172 1.1 mbalmer db_errmsg(lua_State *L)
173 1.1 mbalmer {
174 1.1 mbalmer sqlite3 **db;
175 1.1 mbalmer
176 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
177 1.1 mbalmer lua_pushstring(L, sqlite3_errmsg(*db));
178 1.1 mbalmer return 1;
179 1.1 mbalmer }
180 1.1 mbalmer
181 1.1 mbalmer static int
182 1.1 mbalmer db_get_autocommit(lua_State *L)
183 1.1 mbalmer {
184 1.1 mbalmer sqlite3 **db;
185 1.1 mbalmer
186 1.1 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
187 1.1 mbalmer lua_pushboolean(L, sqlite3_get_autocommit(*db));
188 1.1 mbalmer return 1;
189 1.1 mbalmer }
190 1.1 mbalmer
191 1.1 mbalmer static int
192 1.3 mbalmer db_changes(lua_State *L)
193 1.3 mbalmer {
194 1.3 mbalmer sqlite3 **db;
195 1.3 mbalmer
196 1.3 mbalmer db = luaL_checkudata(L, 1, SQLITE_DB_METATABLE);
197 1.3 mbalmer lua_pushinteger(L, sqlite3_changes(*db));
198 1.3 mbalmer return 1;
199 1.3 mbalmer }
200 1.3 mbalmer
201 1.3 mbalmer static int
202 1.1 mbalmer stmt_bind(lua_State *L)
203 1.1 mbalmer {
204 1.1 mbalmer sqlite3_stmt **stmt;
205 1.1 mbalmer int pidx;
206 1.1 mbalmer
207 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
208 1.1 mbalmer pidx = (int)luaL_checkinteger(L, 2);
209 1.1 mbalmer
210 1.1 mbalmer switch (lua_type(L, 3)) {
211 1.1 mbalmer case LUA_TNUMBER:
212 1.1 mbalmer lua_pushinteger(L, sqlite3_bind_double(*stmt, pidx,
213 1.1 mbalmer lua_tonumber(L, 3)));
214 1.1 mbalmer break;
215 1.1 mbalmer case LUA_TSTRING:
216 1.1 mbalmer lua_pushinteger(L, sqlite3_bind_text(*stmt, pidx,
217 1.5 mbalmer lua_tostring(L, 3), -1, SQLITE_TRANSIENT));
218 1.1 mbalmer break;
219 1.1 mbalmer case LUA_TNIL:
220 1.1 mbalmer lua_pushinteger(L, sqlite3_bind_null(*stmt, pidx));
221 1.1 mbalmer break;
222 1.1 mbalmer default:
223 1.1 mbalmer sqlite_error(L, "unsupported data type %s",
224 1.1 mbalmer luaL_typename(L, 3));
225 1.1 mbalmer }
226 1.1 mbalmer return 1;
227 1.1 mbalmer }
228 1.1 mbalmer
229 1.1 mbalmer static int
230 1.1 mbalmer stmt_bind_parameter_count(lua_State *L)
231 1.1 mbalmer {
232 1.1 mbalmer sqlite3_stmt **stmt;
233 1.1 mbalmer
234 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
235 1.1 mbalmer lua_pushinteger(L, sqlite3_bind_parameter_count(*stmt));
236 1.1 mbalmer return 1;
237 1.1 mbalmer }
238 1.1 mbalmer
239 1.1 mbalmer static int
240 1.1 mbalmer stmt_bind_parameter_index(lua_State *L)
241 1.1 mbalmer {
242 1.1 mbalmer sqlite3_stmt **stmt;
243 1.1 mbalmer
244 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
245 1.1 mbalmer lua_pushinteger(L, sqlite3_bind_parameter_index(*stmt,
246 1.1 mbalmer lua_tostring(L, 2)));
247 1.1 mbalmer return 1;
248 1.1 mbalmer }
249 1.1 mbalmer
250 1.1 mbalmer static int
251 1.1 mbalmer stmt_bind_parameter_name(lua_State *L)
252 1.1 mbalmer {
253 1.1 mbalmer sqlite3_stmt **stmt;
254 1.1 mbalmer int pidx;
255 1.1 mbalmer
256 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
257 1.1 mbalmer pidx = (int)luaL_checkinteger(L, 2);
258 1.1 mbalmer lua_pushstring(L, sqlite3_bind_parameter_name(*stmt, pidx));
259 1.1 mbalmer return 1;
260 1.1 mbalmer }
261 1.1 mbalmer
262 1.1 mbalmer static int
263 1.1 mbalmer stmt_step(lua_State *L)
264 1.1 mbalmer {
265 1.1 mbalmer sqlite3_stmt **stmt;
266 1.1 mbalmer
267 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
268 1.1 mbalmer lua_pushinteger(L, sqlite3_step(*stmt));
269 1.1 mbalmer return 1;
270 1.1 mbalmer }
271 1.1 mbalmer
272 1.1 mbalmer static int
273 1.1 mbalmer stmt_column_name(lua_State *L)
274 1.1 mbalmer {
275 1.1 mbalmer sqlite3_stmt **stmt;
276 1.1 mbalmer int cidx;
277 1.1 mbalmer
278 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
279 1.1 mbalmer cidx = (int)luaL_checkinteger(L, 2) - 1;
280 1.1 mbalmer
281 1.1 mbalmer lua_pushstring(L, sqlite3_column_name(*stmt, cidx));
282 1.1 mbalmer return 1;
283 1.1 mbalmer }
284 1.1 mbalmer
285 1.1 mbalmer static int
286 1.1 mbalmer stmt_column_count(lua_State *L)
287 1.1 mbalmer {
288 1.1 mbalmer sqlite3_stmt **stmt;
289 1.1 mbalmer
290 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
291 1.1 mbalmer lua_pushinteger(L, sqlite3_column_count(*stmt));
292 1.1 mbalmer return 1;
293 1.1 mbalmer }
294 1.1 mbalmer
295 1.1 mbalmer static int
296 1.1 mbalmer stmt_column(lua_State *L)
297 1.1 mbalmer {
298 1.1 mbalmer sqlite3_stmt **stmt;
299 1.1 mbalmer int cidx;
300 1.1 mbalmer
301 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
302 1.1 mbalmer cidx = (int)luaL_checkinteger(L, 2) - 1;
303 1.1 mbalmer
304 1.1 mbalmer switch (sqlite3_column_type(*stmt, cidx)) {
305 1.1 mbalmer case SQLITE_INTEGER:
306 1.1 mbalmer lua_pushinteger(L, sqlite3_column_int(*stmt, cidx));
307 1.1 mbalmer break;
308 1.1 mbalmer case SQLITE_FLOAT:
309 1.1 mbalmer lua_pushnumber(L, sqlite3_column_double(*stmt, cidx));
310 1.1 mbalmer break;
311 1.1 mbalmer case SQLITE_TEXT:
312 1.1 mbalmer lua_pushstring(L, (const char *)sqlite3_column_text(*stmt,
313 1.1 mbalmer cidx));
314 1.1 mbalmer break;
315 1.1 mbalmer case SQLITE_BLOB:
316 1.1 mbalmer case SQLITE_NULL:
317 1.1 mbalmer lua_pushnil(L);
318 1.1 mbalmer break;
319 1.1 mbalmer }
320 1.1 mbalmer return 1;
321 1.1 mbalmer }
322 1.1 mbalmer
323 1.1 mbalmer static int
324 1.1 mbalmer stmt_reset(lua_State *L)
325 1.1 mbalmer {
326 1.1 mbalmer sqlite3_stmt **stmt;
327 1.1 mbalmer
328 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
329 1.1 mbalmer sqlite3_reset(*stmt);
330 1.1 mbalmer return 0;
331 1.1 mbalmer }
332 1.1 mbalmer
333 1.1 mbalmer static int
334 1.1 mbalmer stmt_clear_bindings(lua_State *L)
335 1.1 mbalmer {
336 1.1 mbalmer sqlite3_stmt **stmt;
337 1.1 mbalmer
338 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
339 1.9.10.1 christos if (*stmt) {
340 1.9.10.1 christos sqlite3_clear_bindings(*stmt);
341 1.9.10.1 christos *stmt = NULL;
342 1.9.10.1 christos }
343 1.1 mbalmer return 0;
344 1.1 mbalmer }
345 1.1 mbalmer
346 1.1 mbalmer static int
347 1.1 mbalmer stmt_finalize(lua_State *L)
348 1.1 mbalmer {
349 1.1 mbalmer sqlite3_stmt **stmt;
350 1.1 mbalmer
351 1.1 mbalmer stmt = luaL_checkudata(L, 1, SQLITE_STMT_METATABLE);
352 1.9 mbalmer if (*stmt) {
353 1.9 mbalmer sqlite3_finalize(*stmt);
354 1.9 mbalmer *stmt = NULL;
355 1.9 mbalmer }
356 1.1 mbalmer return 0;
357 1.1 mbalmer }
358 1.1 mbalmer
359 1.1 mbalmer struct constant {
360 1.1 mbalmer const char *name;
361 1.1 mbalmer int value;
362 1.1 mbalmer };
363 1.1 mbalmer
364 1.1 mbalmer static const struct constant sqlite_constant[] = {
365 1.1 mbalmer /* SQLite return codes */
366 1.1 mbalmer { "OK", SQLITE_OK },
367 1.1 mbalmer { "ERROR", SQLITE_ERROR },
368 1.1 mbalmer { "INTERNAL", SQLITE_INTERNAL },
369 1.1 mbalmer { "PERM", SQLITE_PERM },
370 1.1 mbalmer { "ABORT", SQLITE_ABORT },
371 1.1 mbalmer { "BUSY", SQLITE_BUSY },
372 1.1 mbalmer { "LOCKED", SQLITE_LOCKED },
373 1.1 mbalmer { "NOMEM", SQLITE_NOMEM },
374 1.1 mbalmer { "READONLY", SQLITE_READONLY },
375 1.1 mbalmer { "INTERRUPT", SQLITE_INTERRUPT },
376 1.1 mbalmer { "IOERR", SQLITE_IOERR },
377 1.1 mbalmer { "CORRUPT", SQLITE_CORRUPT },
378 1.6 mbalmer { "NOTFOUND", SQLITE_NOTFOUND },
379 1.1 mbalmer { "FULL", SQLITE_FULL },
380 1.1 mbalmer { "CANTOPEN", SQLITE_CANTOPEN },
381 1.6 mbalmer { "PROTOCOL", SQLITE_PROTOCOL },
382 1.1 mbalmer { "EMPTY", SQLITE_EMPTY },
383 1.1 mbalmer { "SCHEMA", SQLITE_SCHEMA },
384 1.1 mbalmer { "TOOBIG", SQLITE_TOOBIG },
385 1.1 mbalmer { "CONSTRAINT", SQLITE_CONSTRAINT },
386 1.1 mbalmer { "MISMATCH", SQLITE_MISMATCH },
387 1.1 mbalmer { "MISUSE", SQLITE_MISUSE },
388 1.1 mbalmer { "NOLFS", SQLITE_NOLFS },
389 1.1 mbalmer { "AUTH", SQLITE_AUTH },
390 1.1 mbalmer { "FORMAT", SQLITE_FORMAT },
391 1.1 mbalmer { "RANGE", SQLITE_RANGE },
392 1.1 mbalmer { "NOTADB", SQLITE_NOTADB },
393 1.1 mbalmer { "ROW", SQLITE_ROW },
394 1.1 mbalmer { "DONE", SQLITE_DONE },
395 1.1 mbalmer
396 1.1 mbalmer /* File modes */
397 1.1 mbalmer { "OPEN_READONLY", SQLITE_OPEN_READONLY },
398 1.1 mbalmer { "OPEN_READWRITE", SQLITE_OPEN_READWRITE },
399 1.6 mbalmer { "OPEN_CREATE", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE },
400 1.1 mbalmer
401 1.1 mbalmer { NULL, 0 }
402 1.1 mbalmer };
403 1.1 mbalmer
404 1.1 mbalmer static void
405 1.8 mbalmer sqlite_set_info(lua_State *L)
406 1.1 mbalmer {
407 1.1 mbalmer lua_pushliteral(L, "_COPYRIGHT");
408 1.6 mbalmer lua_pushliteral(L, "Copyright (C) 2011, 2012, 2013 by "
409 1.5 mbalmer "Marc Balmer <marc (at) msys.ch>");
410 1.1 mbalmer lua_settable(L, -3);
411 1.1 mbalmer lua_pushliteral(L, "_DESCRIPTION");
412 1.1 mbalmer lua_pushliteral(L, "SQLite interface for Lua");
413 1.1 mbalmer lua_settable(L, -3);
414 1.1 mbalmer lua_pushliteral(L, "_VERSION");
415 1.6 mbalmer lua_pushliteral(L, "sqlite 1.0.3");
416 1.1 mbalmer lua_settable(L, -3);
417 1.1 mbalmer }
418 1.1 mbalmer
419 1.1 mbalmer int
420 1.1 mbalmer luaopen_sqlite(lua_State* L)
421 1.1 mbalmer {
422 1.1 mbalmer static const struct luaL_Reg sqlite_methods[] = {
423 1.5 mbalmer { "initialize", sqlite_initialize },
424 1.5 mbalmer { "shutdown", sqlite_shutdown },
425 1.5 mbalmer { "open", sqlite_open },
426 1.5 mbalmer { "libversion", sqlite_libversion },
427 1.5 mbalmer { "libversion_number", sqlite_libversion_number },
428 1.5 mbalmer { "sourceid", sqlite_sourceid },
429 1.5 mbalmer { NULL, NULL }
430 1.1 mbalmer };
431 1.1 mbalmer static const struct luaL_Reg db_methods[] = {
432 1.5 mbalmer { "close", db_close },
433 1.5 mbalmer { "prepare", db_prepare },
434 1.5 mbalmer { "exec", db_exec },
435 1.5 mbalmer { "errcode", db_errcode },
436 1.5 mbalmer { "errmsg", db_errmsg },
437 1.5 mbalmer { "get_autocommit", db_get_autocommit },
438 1.5 mbalmer { "changes", db_changes },
439 1.5 mbalmer { NULL, NULL }
440 1.1 mbalmer };
441 1.1 mbalmer static const struct luaL_Reg stmt_methods[] = {
442 1.5 mbalmer { "bind", stmt_bind },
443 1.1 mbalmer { "bind_parameter_count", stmt_bind_parameter_count },
444 1.1 mbalmer { "bind_parameter_index", stmt_bind_parameter_index },
445 1.1 mbalmer { "bind_parameter_name", stmt_bind_parameter_name },
446 1.5 mbalmer { "step", stmt_step },
447 1.5 mbalmer { "column", stmt_column },
448 1.5 mbalmer { "reset", stmt_reset },
449 1.5 mbalmer { "clear_bindings", stmt_clear_bindings },
450 1.5 mbalmer { "finalize", stmt_finalize },
451 1.5 mbalmer { "column_name", stmt_column_name },
452 1.5 mbalmer { "column_count", stmt_column_count },
453 1.1 mbalmer { NULL, NULL }
454 1.1 mbalmer };
455 1.1 mbalmer int n;
456 1.1 mbalmer
457 1.1 mbalmer sqlite3_initialize();
458 1.1 mbalmer
459 1.7 lneto luaL_newlib(L, sqlite_methods);
460 1.7 lneto luaL_setfuncs(L, db_methods, 0);
461 1.7 lneto luaL_setfuncs(L, stmt_methods, 0);
462 1.8 mbalmer sqlite_set_info(L);
463 1.1 mbalmer
464 1.1 mbalmer /* The database connection metatable */
465 1.1 mbalmer if (luaL_newmetatable(L, SQLITE_DB_METATABLE)) {
466 1.7 lneto luaL_setfuncs(L, db_methods, 0);
467 1.1 mbalmer
468 1.1 mbalmer lua_pushliteral(L, "__gc");
469 1.1 mbalmer lua_pushcfunction(L, db_close);
470 1.1 mbalmer lua_settable(L, -3);
471 1.1 mbalmer
472 1.1 mbalmer lua_pushliteral(L, "__index");
473 1.1 mbalmer lua_pushvalue(L, -2);
474 1.1 mbalmer lua_settable(L, -3);
475 1.1 mbalmer
476 1.1 mbalmer lua_pushliteral(L, "__metatable");
477 1.1 mbalmer lua_pushliteral(L, "must not access this metatable");
478 1.1 mbalmer lua_settable(L, -3);
479 1.1 mbalmer }
480 1.1 mbalmer lua_pop(L, 1);
481 1.1 mbalmer
482 1.1 mbalmer /* The statement metatable */
483 1.1 mbalmer if (luaL_newmetatable(L, SQLITE_STMT_METATABLE)) {
484 1.7 lneto luaL_setfuncs(L, stmt_methods, 0);
485 1.1 mbalmer
486 1.1 mbalmer lua_pushliteral(L, "__gc");
487 1.1 mbalmer lua_pushcfunction(L, stmt_finalize);
488 1.1 mbalmer lua_settable(L, -3);
489 1.1 mbalmer
490 1.1 mbalmer lua_pushliteral(L, "__index");
491 1.1 mbalmer lua_pushvalue(L, -2);
492 1.1 mbalmer lua_settable(L, -3);
493 1.1 mbalmer
494 1.1 mbalmer lua_pushliteral(L, "__metatable");
495 1.1 mbalmer lua_pushliteral(L, "must not access this metatable");
496 1.1 mbalmer lua_settable(L, -3);
497 1.1 mbalmer }
498 1.1 mbalmer lua_pop(L, 1);
499 1.1 mbalmer
500 1.1 mbalmer for (n = 0; sqlite_constant[n].name != NULL; n++) {
501 1.1 mbalmer lua_pushinteger(L, sqlite_constant[n].value);
502 1.1 mbalmer lua_setfield(L, -2, sqlite_constant[n].name);
503 1.1 mbalmer };
504 1.1 mbalmer return 1;
505 1.1 mbalmer }
506