Module: sip-router
Branch: janakj/flatstore
Commit: 6fe11123ef7ae7f95a62bc0ef20969ba03483d3d
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6fe1112…
Author: Jan Janak <jan(a)iptel.org>
Committer: Jan Janak <jan(a)iptel.org>
Date: Sun Jun 1 10:00:59 2008 +0000
- support for flatstore uris with relative pathnames (they are
converted to absolute with respect to the main ser config file)
- todo list added
---
modules/db_flatstore/flat_con.c | 5 ++-
modules/db_flatstore/flat_uri.c | 80 ++++++++++++++++++++++++++++++++++
modules/db_flatstore/flat_uri.h | 62 ++++++++++++++++++++++++++
modules/db_flatstore/flatstore_mod.c | 8 ++-
modules/db_flatstore/todo.txt | 2 +
5 files changed, 153 insertions(+), 4 deletions(-)
diff --git a/modules/db_flatstore/flat_con.c b/modules/db_flatstore/flat_con.c
index 3697cfd..0b20131 100644
--- a/modules/db_flatstore/flat_con.c
+++ b/modules/db_flatstore/flat_con.c
@@ -32,6 +32,7 @@
#include "flat_con.h"
#include "flatstore_mod.h"
+#include "flat_uri.h"
#include "../../mem/mem.h"
#include "../../dprint.h"
@@ -229,6 +230,7 @@ static char* get_filename(str* dir, str* name)
int flat_open_table(int* idx, db_con_t* con, str* name)
{
+ struct flat_uri* furi;
struct flat_con* fcon;
struct flat_file* new;
int i;
@@ -238,6 +240,7 @@ int flat_open_table(int* idx, db_con_t* con, str* name)
filename = NULL;
table = NULL;
fcon = DB_GET_PAYLOAD(con);
+ furi = DB_GET_PAYLOAD(con->uri);
for(i = 0; i < fcon->n; i++) {
if (name->len == fcon->file[i].table.len &&
@@ -249,7 +252,7 @@ int flat_open_table(int* idx, db_con_t* con, str* name)
* fcon->file, so that we can fail gracefully if one of the
* operations fail.
*/
- if ((filename = get_filename(&con->uri->body, name)) == NULL)
+ if ((filename = get_filename(&furi->path, name)) == NULL)
goto no_mem;
if ((table = pkg_malloc(name->len)) == NULL) goto no_mem;
diff --git a/modules/db_flatstore/flat_uri.c b/modules/db_flatstore/flat_uri.c
new file mode 100644
index 0000000..05005f3
--- /dev/null
+++ b/modules/db_flatstore/flat_uri.c
@@ -0,0 +1,80 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptelorg GmbH
+ * Written by Jan Janak <jan(a)iptel.org>
+ *
+ * This file is part of SER, a free SIP server.
+ *
+ * SER is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * SER is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/** \addtogroup flatstore
+ * @{
+ */
+
+/** \file
+ * The implementation of parser parsing flatstore:.. URIs.
+ */
+
+#include "flat_uri.h"
+
+#include "../../mem/mem.h"
+#include "../../ut.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+
+static void flat_uri_free(db_uri_t* uri, struct flat_uri* payload)
+{
+ if (payload == NULL) return;
+ if (payload->path.s) free(payload->path.s);
+ db_drv_free(&payload->drv);
+ pkg_free(payload);
+}
+
+
+int flat_uri(db_uri_t* uri)
+{
+ struct flat_uri* furi;
+
+ if ((furi = (struct flat_uri*)pkg_malloc(sizeof(*furi))) == NULL) {
+ ERR("flatstore: No memory left\n");
+ return -1;
+ }
+ memset(furi, '\0', sizeof(*furi));
+ if (db_drv_init(&furi->drv, flat_uri_free) < 0) goto error;
+
+ if ((furi->path.s = get_abs_pathname(NULL, &uri->body)) == NULL) {
+ ERR("flatstore: Error while obtaining absolute pathname for '%.*s'\n",
+ STR_FMT(&uri->body));
+ goto error;
+ }
+ furi->path.len = strlen(furi->path.s);
+
+ DB_SET_PAYLOAD(uri, furi);
+ return 0;
+
+ error:
+ if (furi) {
+ if (furi->path.s) free(furi->path.s);
+ db_drv_free(&furi->drv);
+ pkg_free(furi);
+ }
+ return -1;
+}
+
+/** @} */
diff --git a/modules/db_flatstore/flat_uri.h b/modules/db_flatstore/flat_uri.h
new file mode 100644
index 0000000..2cb251a
--- /dev/null
+++ b/modules/db_flatstore/flat_uri.h
@@ -0,0 +1,62 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2008 iptelorg GmbH
+ * Written by Jan Janak <jan(a)iptel.org>
+ *
+ * This file is part of SER, a free SIP server.
+ *
+ * SER is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * SER is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _FLAT_URI_H
+#define _FLAT_URI_H
+
+/** \addtogroup flatstore
+ * @{
+ */
+
+/** \file
+ * The functions parsing and interpreting flatstore: URIs.
+ */
+
+#include "../../db/db_uri.h"
+#include "../../db/db_drv.h"
+
+/** Flatstore driver specific payload to attach to db_uri structures.
+ * This is the flatstore specific structure that will be attached to generic
+ * db_uri structures in the database API in SER. The structure is used to
+ * convert relative pathnames in flatstore URIs to absolute.
+ */
+struct flat_uri {
+ db_drv_t drv;
+ /** Absolute pathname to the database directory, zero terminated */
+ str path;
+};
+
+
+/** Create a new flat_uri structure and convert the path in parameter.
+ * This function builds a new flat_uri structure from the body of
+ * the generic URI given to it in parameter.
+ * @param uri A generic db_uri structure.
+ * @retval 0 on success
+ * @retval A negative number on error.
+ */
+int flat_uri(db_uri_t* uri);
+
+
+/** @} */
+
+#endif /* _FLAT_URI_H */
diff --git a/modules/db_flatstore/flatstore_mod.c b/modules/db_flatstore/flatstore_mod.c
index 8a27740..a64dc73 100644
--- a/modules/db_flatstore/flatstore_mod.c
+++ b/modules/db_flatstore/flatstore_mod.c
@@ -34,6 +34,7 @@
#include "flat_con.h"
#include "flat_cmd.h"
#include "flat_rpc.h"
+#include "flat_uri.h"
#include "../../sr_module.h"
#include "../../mem/shm_mem.h"
@@ -105,9 +106,10 @@ time_t flat_local_timestamp;
/* Flatstore database module interface */
static cmd_export_t cmds[] = {
- {"db_con", (cmd_function)flat_con, 0, 0, 0},
- {"db_cmd", (cmd_function)flat_cmd, 0, 0, 0},
- {"db_put", (cmd_function)flat_put, 0, 0, 0},
+ {"db_uri", (cmd_function)flat_uri, 0, 0, 0},
+ {"db_con", (cmd_function)flat_con, 0, 0, 0},
+ {"db_cmd", (cmd_function)flat_cmd, 0, 0, 0},
+ {"db_put", (cmd_function)flat_put, 0, 0, 0},
{0, 0, 0, 0, 0}
};
diff --git a/modules/db_flatstore/todo.txt b/modules/db_flatstore/todo.txt
new file mode 100644
index 0000000..aff00cc
--- /dev/null
+++ b/modules/db_flatstore/todo.txt
@@ -0,0 +1,2 @@
+* Create the directory if it does not exist and check permissions
+