From 17b1e1aeca9ac569b763f4738687baadb51a301e Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 15 Oct 2010 22:16:22 +0000 Subject: lua: open and close db --- src/lua-apk.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lua-apk.c b/src/lua-apk.c index 6447d64..a82ea9d 100644 --- a/src/lua-apk.c +++ b/src/lua-apk.c @@ -8,6 +8,7 @@ #include "apk_version.h" #define LIBNAME "apk" +#define APKDB_META "apk_database" struct flagmap { const char *name; @@ -113,16 +114,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}, @@ -130,12 +161,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; } -- cgit v1.2.3-70-g09d2