summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-09-14 14:35:21 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2011-09-15 17:13:07 +0000
commitd7374642c2696ed7779eb62db54c797c5c2063b6 (patch)
tree45f1f09ca35e1ae978232be4b31874658dfc7ddc /src
parentcca6a7e33265fd933c57d3e2b04f1a522c25c3e0 (diff)
downloadapk-tools-d7374642c2696ed7779eb62db54c797c5c2063b6.tar.gz
apk-tools-d7374642c2696ed7779eb62db54c797c5c2063b6.tar.bz2
apk-tools-d7374642c2696ed7779eb62db54c797c5c2063b6.tar.xz
apk-tools-d7374642c2696ed7779eb62db54c797c5c2063b6.zip
lua: initial db_open
so far we just parse the db options
Diffstat (limited to 'src')
-rw-r--r--src/lua-apk.c76
1 files changed, 75 insertions, 1 deletions
diff --git a/src/lua-apk.c b/src/lua-apk.c
index 59c90cb..6447d64 100644
--- a/src/lua-apk.c
+++ b/src/lua-apk.c
@@ -2,12 +2,34 @@
#include <lualib.h>
#include <lauxlib.h>
+#include "apk_blob.h"
+#include "apk_database.h"
#include "apk_defines.h"
#include "apk_version.h"
-#include "apk_blob.h"
#define LIBNAME "apk"
+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}
+};
+
static apk_blob_t check_blob(lua_State *L, int index)
{
apk_blob_t blob;
@@ -48,11 +70,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}
};