[SR-Dev] git:janakj/flatstore: - support for flatstore uris with relative pathnames (they are

Jan Janak jan at iptel.org
Sun Feb 15 18:56:46 CET 2009


Module: sip-router
Branch: janakj/flatstore
Commit: 6fe11123ef7ae7f95a62bc0ef20969ba03483d3d
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=6fe11123ef7ae7f95a62bc0ef20969ba03483d3d

Author: Jan Janak <jan at iptel.org>
Committer: Jan Janak <jan at 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 at 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 at 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
+




More information about the sr-dev mailing list