[asterisk-commits] tilghman: branch group/ast_storage r65750 - /team/group/ast_storage/res/

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Wed May 23 20:31:16 MST 2007


Author: tilghman
Date: Wed May 23 22:31:15 2007
New Revision: 65750

URL: http://svn.digium.com/view/asterisk?view=rev&rev=65750
Log:
Add code to query column names (to be used later for matching config items to their appropriate columns)

Modified:
    team/group/ast_storage/res/res_storage_odbc.c

Modified: team/group/ast_storage/res/res_storage_odbc.c
URL: http://svn.digium.com/view/asterisk/team/group/ast_storage/res/res_storage_odbc.c?view=diff&rev=65750&r1=65749&r2=65750
==============================================================================
--- team/group/ast_storage/res/res_storage_odbc.c (original)
+++ team/group/ast_storage/res/res_storage_odbc.c Wed May 23 22:31:15 2007
@@ -41,12 +41,24 @@
 #include <fcntl.h>
 #include <errno.h>
 
+struct columns {
+	char *name;
+	SQLSMALLINT type;
+	SQLINTEGER size;
+	SQLSMALLINT decimals;
+	SQLSMALLINT radix;
+	SQLSMALLINT nullable;
+	SQLINTEGER octetlen;
+	AST_LIST_ENTRY(columns) list;
+};
+
 struct ast_storage_odbc {
 	const struct ast_storage_be *be;
 	char odbc_class[128];
 	char tablename[128];
 	char pathname[128];
 	struct odbc_obj *conn;
+	AST_RWLIST_HEAD(odbc_columns, columns) columns;
 };
 
 struct odbc_storage_dir {
@@ -95,15 +107,32 @@
 	return;
 }
 
+static int se_free_odbc(struct ast_storage *st)
+{
+	struct ast_storage_odbc *ost = (struct ast_storage_odbc *)st;
+	ast_odbc_release_obj(ost->conn);
+	free(ost);
+	return 0;
+}
+
 static struct ast_storage *se_new_odbc(const char *uri)
 {
-	char tmp[256];
+	char tmp[256], columnname[80];
+	int res;
 	struct ast_storage_odbc *ost = ast_calloc(1, sizeof(struct ast_storage_odbc));
+	struct columns *entry;
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(class);
 		AST_APP_ARG(tablename);
 		AST_APP_ARG(pathname);
 	);
+	SQLHSTMT stmt = NULL;
+	SQLLEN sqlptr;
+
+	if (!ost)
+		return NULL;
+
+	AST_RWLIST_HEAD_INIT(&ost->columns);
 
 	/* odbc:// */
 	ast_copy_string(tmp, uri + 7, sizeof(tmp));
@@ -120,15 +149,45 @@
 		return NULL;
 	}
 
+	res = SQLAllocHandle(SQL_HANDLE_STMT, ost->conn, &stmt);
+	if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
+		ast_log(LOG_ERROR, "Allocation of database handle failed.\n");
+		ast_odbc_release_obj(ost->conn);
+		free(ost);
+	}
+
+	/* Get the table columns */
+	res = SQLColumns(stmt, NULL, 0, NULL, 0, (unsigned char *)ost->tablename, SQL_NTS, (unsigned char *)"%", SQL_NTS);
+	if (res != SQL_SUCCESS && res != SQL_SUCCESS_WITH_INFO) {
+		ast_log(LOG_ERROR, "Unable to query database columns on table '%s@%s'.  Storage method fails.\n", ost->tablename, ost->odbc_class);
+		ast_odbc_release_obj(ost->conn);
+		free(ost);
+		return NULL;
+	}
+
+	while ((res = SQLFetch(stmt)) != SQL_NO_DATA && res != SQL_ERROR) {
+		SQLGetData(stmt, 4, SQL_C_CHAR, columnname, sizeof(columnname), &sqlptr);
+		entry = ast_calloc(sizeof(char), sizeof(*entry) + strlen(columnname) + 1);
+		if (!entry) {
+			ast_log(LOG_ERROR, "Unable to allocate column entry\n");
+			se_free_odbc((struct ast_storage *)ost);
+			return NULL;
+		}
+
+		entry->name = (char *)entry + sizeof(*entry);
+		strcpy(entry->name, columnname);
+
+		SQLGetData(stmt,  5, SQL_C_SHORT, &entry->type, sizeof(entry->type), NULL);
+		SQLGetData(stmt,  7, SQL_C_LONG, &entry->size, sizeof(entry->size), NULL);
+		SQLGetData(stmt,  9, SQL_C_SHORT, &entry->decimals, sizeof(entry->decimals), NULL);
+		SQLGetData(stmt, 10, SQL_C_SHORT, &entry->radix, sizeof(entry->radix), NULL);
+		SQLGetData(stmt, 11, SQL_C_SHORT, &entry->nullable, sizeof(entry->nullable), NULL);
+		SQLGetData(stmt, 16, SQL_C_LONG, &entry->octetlen, sizeof(entry->octetlen), NULL);
+
+		AST_LIST_INSERT_TAIL(&ost->columns, entry, list);
+	}
+
 	return ((struct ast_storage *)ost);
-}
-
-static int se_free_odbc(struct ast_storage *st)
-{
-	struct ast_storage_odbc *ost = (struct ast_storage_odbc *)st;
-	ast_odbc_release_obj(ost->conn);
-	free(ost);
-	return 0;
 }
 
 static void get_path_file(struct ast_storage_odbc *ost, const char *objectname, char *pathname, size_t pathnamesize, char *filename, size_t filenamesize)



More information about the asterisk-commits mailing list