Home | History | Annotate | Line # | Download | only in sqlite
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