From c3e994737dc138282a034f6540b81982c0d07657 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 15 Oct 2010 21:06:36 +0000 Subject: lua: initial db_open so far we just parse the db options --- src/lua-apk.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'src') diff --git a/src/lua-apk.c b/src/lua-apk.c index efd7c3e..4bb5796 100644 --- a/src/lua-apk.c +++ b/src/lua-apk.c @@ -5,12 +5,34 @@ #include "apk_defines.h" #include "apk_version.h" #include "apk_blob.h" +#include "apk_database.h" #define LIBNAME "apk" int apk_verbosity; unsigned int apk_flags; +struct flagmap { + const char *name; + int flag; +}; + +struct flagmap opendb_flagmap[] = { + {"read", APK_OPENF_READ}, + {"write", APK_OPENF_WRITE}, + {"create", APK_OPENF_CREATE}, + {"no_installed", APK_OPENF_NO_INSTALLED}, + {"no_scripts", APK_OPENF_NO_SCRIPTS}, + {"no_world", APK_OPENF_NO_WORLD}, + {"no_sys_repos", APK_OPENF_NO_SYS_REPOS}, + {"no_installed_repo", APK_OPENF_NO_INSTALLED_REPO}, + {"no_repos", APK_OPENF_NO_REPOS}, + {"no_state", APK_OPENF_NO_STATE}, + {"no_scripts", APK_OPENF_NO_SCRIPTS}, + {"no_world", APK_OPENF_NO_WORLD}, + {NULL, 0} +}; + /* version_validate(verstr) */ /* returns boolean */ static int Pversion_validate(lua_State *L) @@ -45,11 +67,63 @@ static int Pversion_is_less(lua_State *L) return 1; } +//static getfield(lua_State *L, const char *key) +//{ +static const char *get_opt_string_field(lua_State *L, int index, + const char *key, const char *def) +{ + const char *value; + lua_getfield(L, index, key); + value = luaL_optstring(L, -1, def); + lua_pop(L, 1); + return value; +} + +static int get_opt_int_field(lua_State *L, int index, const char *key, int def) +{ + int value; + lua_getfield(L, index, key); + value = luaL_optinteger(L, -1, def); + lua_pop(L, 1); + return value; +} + +static int get_boolean_field(lua_State *L, int index, const char *key) +{ + int value; + lua_getfield(L, index, key); + value = lua_toboolean(L, -1); + lua_pop(L, 1); + return value; +} + +static int get_dbopts(lua_State *L, int i, struct apk_db_options *o) +{ + struct flagmap *f; + o->root = (char *)get_opt_string_field(L, i, "root", NULL); + o->repositories_file = (char *)get_opt_string_field(L, i, "repositories_file", NULL); + o->keys_dir = (char *)get_opt_string_field(L, i, "keys_dir", NULL); + o->lock_wait = get_opt_int_field(L, i, "lock_wait", 0); + for (f = opendb_flagmap; f->name != NULL; f++) + if (get_boolean_field(L, i, f->name)) + o->open_flags |= f->flag; + return 0; +} + +static int Papk_db_open(lua_State *L) +{ + struct apk_db_options opts; + memset(&opts, 0, sizeof(opts)); + if (lua_istable(L, 1)) + get_dbopts(L, 1, &opts); + return 0; +} static const luaL_reg R[] = { {"version_validate", Pversion_validate}, {"version_compare", Pversion_compare}, {"version_is_less", Pversion_is_less}, + {"db_open", Papk_db_open}, {NULL, NULL} }; -- cgit v1.2.3