[asterisk-addons-commits] tilghman: trunk r650 - /trunk/res/res_config_mysql.c

SVN commits to the Asterisk addons project asterisk-addons-commits at lists.digium.com
Thu Jul 31 15:42:46 CDT 2008


Author: tilghman
Date: Thu Jul 31 15:42:46 2008
New Revision: 650

URL: http://svn.digium.com/view/asterisk-addons?view=rev&rev=650
Log:
Permit altering column sizes while running, if so configured (so that columns aren't
trimmed).

Modified:
    trunk/res/res_config_mysql.c

Modified: trunk/res/res_config_mysql.c
URL: http://svn.digium.com/view/asterisk-addons/trunk/res/res_config_mysql.c?view=diff&rev=650&r1=649&r2=650
==============================================================================
--- trunk/res/res_config_mysql.c (original)
+++ trunk/res/res_config_mysql.c Thu Jul 31 15:42:46 2008
@@ -100,6 +100,7 @@
 static char *handle_cli_realtime_mysql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 static char *handle_cli_realtime_mysql_cache(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 static int load_mysql_config(struct ast_config *config, const char *category, struct mysql_conn *conn);
+static int require_mysql(const char *database, const char *tablename, va_list ap);
 
 static enum { RQ_WARN, RQ_CREATECLOSE, RQ_CREATECHAR } requirements = RQ_WARN;
 
@@ -107,6 +108,16 @@
 	AST_CLI_DEFINE(handle_cli_realtime_mysql_status, "Shows connection information for the MySQL RealTime driver"),
 	AST_CLI_DEFINE(handle_cli_realtime_mysql_cache, "Shows cached tables within the MySQL realtime driver"),
 };
+
+static int internal_require(const char *database, const char *table, ...)
+{
+	va_list ap;
+	int res;
+	va_start(ap, table);
+	res = require_mysql(database, table, ap);
+	va_end(ap);
+	return res;
+}
 
 static void destroy_table(struct tables *table)
 {
@@ -209,6 +220,19 @@
 	ast_mutex_lock(&table->lock);
 	AST_LIST_UNLOCK(&mysql_tables);
 	return table;
+}
+
+static struct columns *find_column(struct tables *table, const char *colname)
+{
+	struct columns *column;
+
+	AST_LIST_TRAVERSE(&table->columns, column, list) {
+		if (strcmp(column->name, colname) == 0) {
+			break;
+		}
+	}
+
+	return column;
 }
 
 static struct ast_variable *realtime_mysql(const char *database, const char *table, va_list ap)
@@ -489,13 +513,7 @@
 	}
 
 	/* Check that the column exists in the table */
-	AST_LIST_TRAVERSE(&table->columns, column, list) {
-		if (strcmp(column->name, newparam) == 0) {
-			break;
-		}
-	}
-
-	if (!column) {
+	if (!(column = find_column(table, newparam))) {
 		ast_log(LOG_ERROR, "PostgreSQL RealTime: Updating on column '%s', but that column does not exist within the table '%s'!\n", newparam, tablename);
 		ast_mutex_unlock(&table->lock);
 		ast_free(sql);
@@ -522,17 +540,16 @@
 	mysql_real_escape_string(&dbwrite.handle, buf->str, newval, valsz);
 	ast_str_set(&sql, 0, "UPDATE %s SET %s = '%s'", tablename, newparam, buf->str);
 
+	/* If the column length isn't long enough, give a chance to lengthen it. */
+	if (strncmp(column->type, "char", 4) == 0 || strncmp(column->type, "varchar", 7) == 0) {
+		internal_require(database, tablename, newparam, RQ_CHAR, buf->used);
+	}
+
 	while ((newparam = va_arg(ap, const char *))) {
 		newval = va_arg(ap, const char *);
 
 		/* If the column is not within the table, then skip it */
-		AST_LIST_TRAVERSE(&table->columns, column, list) {
-			if (strcmp(column->name, newparam) == 0) {
-				break;
-			}
-		}
-
-		if (!column) {
+		if (!(column = find_column(table, newparam))) {
 			ast_log(LOG_WARNING, "Attempted to update column '%s' in table '%s', but column does not exist!\n", newparam, tablename);
 			continue;
 		}
@@ -542,6 +559,11 @@
 		}
 		mysql_real_escape_string(&dbwrite.handle, buf->str, newval, valsz);
 		ast_str_append(&sql, 0, ", %s = '%s'", newparam, buf->str);
+
+		/* If the column length isn't long enough, give a chance to lengthen it. */
+		if (strncmp(column->type, "char", 4) == 0 || strncmp(column->type, "varchar", 7) == 0) {
+			internal_require(database, tablename, newparam, RQ_CHAR, buf->used);
+		}
 	}
 	va_end(ap);
 	ast_mutex_unlock(&table->lock);




More information about the asterisk-addons-commits mailing list