summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2010-10-15 22:16:22 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2011-04-20 17:46:33 +0200
commit5dcc480acdd07a48291194d7b95672d125d75c1d (patch)
tree12480166571fe4a058ca67d615f602d4d3a3ea23
parent66dee4809cbbc67ecf8da2f358c172cfb4cecfad (diff)
downloadapk-tools-5dcc480acdd07a48291194d7b95672d125d75c1d.tar.bz2
apk-tools-5dcc480acdd07a48291194d7b95672d125d75c1d.tar.xz
lua: open and close db
-rw-r--r--src/lua-apk.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/lua-apk.c b/src/lua-apk.c
index 4bb5796..24962ce 100644
--- a/src/lua-apk.c
+++ b/src/lua-apk.c
@@ -8,6 +8,7 @@
#include "apk_database.h"
#define LIBNAME "apk"
+#define APKDB_META "apk_database"
int apk_verbosity;
unsigned int apk_flags;
@@ -110,16 +111,46 @@ static int get_dbopts(lua_State *L, int i, struct apk_db_options *o)
return 0;
}
+static struct apk_database *checkdb(lua_State *L, int index)
+{
+ struct apk_database *db;
+ luaL_checktype(L, index, LUA_TUSERDATA);
+ db = (struct apk_database *) luaL_checkudata(L, index, APKDB_META);
+ if (db == NULL)
+ luaL_typerror(L, index, APKDB_META);
+ return db;
+}
+
static int Papk_db_open(lua_State *L)
{
struct apk_db_options opts;
+ struct apk_database *db;
+ int r;
+
memset(&opts, 0, sizeof(opts));
+ list_init(&opts.repository_list);
if (lua_istable(L, 1))
get_dbopts(L, 1, &opts);
+
+ db = lua_newuserdata(L, sizeof(struct apk_database));
+ luaL_getmetatable(L, APKDB_META);
+ lua_setmetatable(L, -2);
+
+ r = apk_db_open(db, &opts);
+ if (r != 0)
+ luaL_error(L, "apk_db_open() failed");
+ return 1;
+}
+
+static int Papk_db_close(lua_State *L)
+{
+ struct apk_database *db = checkdb(L, 1);
+ apk_db_close(db);
return 0;
}
-static const luaL_reg R[] = {
+
+static const luaL_reg reg_apk_methods[] = {
{"version_validate", Pversion_validate},
{"version_compare", Pversion_compare},
{"version_is_less", Pversion_is_less},
@@ -127,12 +158,29 @@ static const luaL_reg R[] = {
{NULL, NULL}
};
+static const luaL_reg reg_apk_db_meta_methods[] = {
+ {"__gc", Papk_db_close},
+ {NULL, NULL}
+};
+
LUALIB_API int luaopen_apk(lua_State *L)
{
- luaL_register(L, LIBNAME, R);
+ luaL_register(L, LIBNAME, reg_apk_methods);
lua_pushliteral(L, "version");
lua_pushliteral(L, APK_VERSION);
lua_settable(L, -3);
+
+ luaL_newmetatable(L, APKDB_META);
+ luaL_register(L, NULL, reg_apk_db_meta_methods);
+ lua_pushliteral(L, "__index");
+ lua_pushvalue(L, -3);
+ lua_rawset(L, -3);
+
+ lua_pushliteral(L, "__metatable");
+ lua_pushvalue(L, -3);
+ lua_rawset(L, -3);
+ lua_pop(L, 1);
+
return 1;
}