浏览代码

Database capability vector. It allows database modules to export just a
subset of database interface and modules can query the capability of a
particular database module.

Jan Janak 21 年之前
父节点
当前提交
8954f229ad
共有 3 个文件被更改,包括 88 次插入12 次删除
  1. 43 12
      db/db.c
  2. 1 0
      db/db.h
  3. 44 0
      db/db_cap.h

+ 43 - 12
db/db.c

@@ -31,12 +31,13 @@
   */
 
 
-#include "db.h"
 #include "../dprint.h"
 #include "../sr_module.h"
 #include "../mem/mem.h"
 #include "../str.h"
 #include "../ut.h"
+#include "db_cap.h"
+#include "db.h"
 
 
 
@@ -76,33 +77,63 @@ int bind_dbmod(char* mod, db_func_t* mydbf)
 		tmp = mod;
 	}
 
+	dbf.cap = 0;
+
+	     /* All modules must export db_use_table */
 	dbf.use_table = (db_use_table_f)find_mod_export(tmp, "db_use_table", 2, 0);
-	if (dbf.use_table == 0) goto err;
+	if (dbf.use_table == 0) {
+		LOG(L_ERR, "bind_dbmod: Module %s does not export db_use_table function\n", tmp);
+		goto err;
+	}
 
+	     /* All modules must export db_init */
 	dbf.init = (db_init_f)find_mod_export(tmp, "db_init", 1, 0);
-	if (dbf.init == 0) goto err;
+	if (dbf.init == 0) {
+		LOG(L_ERR, "bind_dbmod: Module %s does not export db_init function\n", tmp);
+		goto err;
+	}
 
+	     /* All modules must export db_close */
 	dbf.close = (db_close_f)find_mod_export(tmp, "db_close", 2, 0);
-	if (dbf.close == 0) goto err;
+	if (dbf.close == 0) {
+		LOG(L_ERR, "bind_dbmod: Module %s does not export db_close function\n", tmp);
+		goto err;
+	}
 
 	dbf.query = (db_query_f)find_mod_export(tmp, "db_query", 2, 0);
-	if (dbf.query == 0) goto err;
+	if (dbf.query) {
+		dbf.cap |= DB_CAP_QUERY;
+	}
 
 	dbf.raw_query = (db_raw_query_f)find_mod_export(tmp, "db_raw_query", 2, 0);
-	if (dbf.raw_query == 0) goto err;
+	if (dbf.raw_query) {
+		dbf.cap |= DB_CAP_RAW_QUERY;
+	}
 
-	dbf.free_result = (db_free_result_f)find_mod_export(tmp, "db_free_result", 2,
-														0);
-	if (dbf.free_result == 0) goto err;
+	     /* Free result must be exported if DB_CAP_QUERY 
+	      * or DB_CAP_RAW_QUERY is set
+	      */
+	dbf.free_result = (db_free_result_f)find_mod_export(tmp, "db_free_result", 2, 0);
+	if ((dbf.cap & (DB_CAP_QUERY | DB_CAP_RAW_QUERY))
+	    && (dbf.free_result == 0)) {
+		LOG(L_ERR, "bind_dbmod: Module %s supports quries but does not export free_result function\n", tmp);
+		goto err;
+	}
 
 	dbf.insert = (db_insert_f)find_mod_export(tmp, "db_insert", 2, 0);
-	if (dbf.insert == 0) goto err;
+	if (dbf.insert) {
+		dbf.cap |= DB_CAP_INSERT;
+	}
 
 	dbf.delete = (db_delete_f)find_mod_export(tmp, "db_delete", 2, 0);
-	if (dbf.delete == 0) goto err;
+	if (dbf.delete) {
+		dbf.cap |= DB_CAP_DELETE;
+	}
 
 	dbf.update = (db_update_f)find_mod_export(tmp, "db_update", 2, 0);
-	if (dbf.update == 0) goto err;
+	if (dbf.update) {
+		dbf.cap |= DB_CAP_UPDATE;
+	}
 
 	*mydbf=dbf; /* copy */
 	return 0;

+ 1 - 0
db/db.h

@@ -134,6 +134,7 @@ typedef int (*db_update_f) (db_con_t* _h, db_key_t* _k, db_op_t* _o, db_val_t* _
 
 
 typedef struct db_func {
+	unsigned int     cap;          /* Capability vector of the database transport */
 	db_use_table_f   use_table;    /* Specify table name */
 	db_init_f        init;         /* Initialize database connection */
 	db_close_f       close;        /* Close database connection */

+ 44 - 0
db/db_cap.h

@@ -0,0 +1,44 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2001-2004 FhG Fokus
+ *
+ * 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
+ *
+ * For a license to use the ser software under conditions
+ * other than those described here, or to purchase support for this
+ * software, please contact iptel.org by e-mail at the following addresses:
+ *    [email protected]
+ *
+ * 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 DB_CAP_H
+#define DB_CAP_H
+
+
+/*
+ * Database capabilities
+ */
+typedef enum db_cap {
+	DB_CAP_QUERY =     1 << 0,  /* Database driver can query database */
+	DB_CAP_RAW_QUERY = 1 << 1,  /* Database driver can perform raw queries */
+	DB_CAP_INSERT =    1 << 2,  /* Database driver can insert data into database */
+	DB_CAP_DELETE =    1 << 3,  /* Database driver can delete data from database */
+	DB_CAP_UPDATE =    1 << 4   /* Database driver can update data in the database */
+} db_cap_t;
+	
+
+#endif /* DB_CAP_H */