diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c index c9fa7c74425bb9444810e8ef9155a7e366db08c3..e6b0e53c06bceb559dc388f22549f34dd7d80c58 100644 --- a/addons/res_config_mysql.c +++ b/addons/res_config_mysql.c @@ -126,7 +126,6 @@ static char *handle_cli_realtime_mysql_status(struct ast_cli_entry *e, int cmd, 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 int internal_require(const char *database, const char *table, ...) attribute_sentinel; static struct ast_cli_entry cli_realtime_mysql_status[] = { AST_CLI_DEFINE(handle_cli_realtime_mysql_status, "Shows connection information for the MySQL RealTime driver"), @@ -165,16 +164,6 @@ static struct mysql_conn *find_database(const char *database, int for_write) #define release_database(a) ast_mutex_unlock(&(a)->lock) -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) { struct columns *column; @@ -600,11 +589,6 @@ static int update_mysql(const char *database, const char *tablename, const char ESCAPE_STRING(buf, field->value); ast_str_set(&sql, 0, "UPDATE %s SET `%s` = '%s'", tablename, field->name, ast_str_buffer(buf)); - /* 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, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL); - } - while ((field = field->next)) { /* If the column is not within the table, then skip it */ if (!(column = find_column(table, field->name))) { @@ -614,11 +598,6 @@ static int update_mysql(const char *database, const char *tablename, const char ESCAPE_STRING(buf, field->value); ast_str_append(&sql, 0, ", `%s` = '%s'", field->name, ast_str_buffer(buf)); - - /* 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, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL); - } } ESCAPE_STRING(buf, lookup); @@ -703,11 +682,6 @@ static int update2_mysql(const char *database, const char *tablename, const stru ESCAPE_STRING(buf, field->value); ast_str_append(&where, 0, "%s `%s` = '%s'", first ? "" : " AND", field->name, ast_str_buffer(buf)); first = 0; - - /* 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, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL); - } } first = 1; @@ -721,11 +695,6 @@ static int update2_mysql(const char *database, const char *tablename, const stru ESCAPE_STRING(buf, field->value); ast_str_append(&sql, 0, "%s `%s` = '%s'", first ? "" : ",", field->name, ast_str_buffer(buf)); first = 0; - - /* 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, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL); - } } release_table(table); @@ -759,7 +728,6 @@ static int update2_mysql(const char *database, const char *tablename, const stru static int store_mysql(const char *database, const char *table, const struct ast_variable *rt_fields) { struct mysql_conn *dbh; - my_ulonglong insertid; struct ast_str *sql = ast_str_thread_get(&sql_buf, 16); struct ast_str *sql2 = ast_str_thread_get(&sql2_buf, 16); struct ast_str *buf = ast_str_thread_get(&scratch_buf, 16); @@ -792,15 +760,11 @@ static int store_mysql(const char *database, const char *table, const struct ast ast_str_set(&sql, 0, "INSERT INTO %s (`%s`", table, field->name); ast_str_set(&sql2, 0, ") VALUES ('%s'", ast_str_buffer(buf)); - internal_require(database, table, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL); - while ((field = field->next)) { ESCAPE_STRING(buf, field->value); - if (internal_require(database, table, field->name, RQ_CHAR, ast_str_strlen(buf), SENTINEL) == 0) { - ast_str_append(&sql, 0, ", `%s`", field->name); - ast_str_append(&sql2, 0, ", '%s'", ast_str_buffer(buf)); - } + ast_str_append(&sql, 0, ", `%s`", field->name); + ast_str_append(&sql2, 0, ", '%s'", ast_str_buffer(buf)); } ast_str_append(&sql, 0, "%s)", ast_str_buffer(sql2)); ast_debug(1,"MySQL RealTime: Insert SQL: %s\n", ast_str_buffer(sql)); @@ -812,18 +776,11 @@ static int store_mysql(const char *database, const char *table, const struct ast return -1; } - /*!\note The return value is non-portable and may change in future versions. */ - insertid = mysql_insert_id(&dbh->handle); release_database(dbh); - ast_debug(1, "MySQL RealTime: row inserted on table: %s, id: %llu\n", table, insertid); + ast_debug(1, "MySQL RealTime: row inserted on table: %s\n", table); - /* From http://dev.mysql.com/doc/mysql/en/mysql-affected-rows.html - * An integer greater than zero indicates the number of rows affected - * Zero indicates that no records were updated - * -1 indicates that the query returned an error (although, if the query failed, it should have been caught above.) - */ - return (int)insertid; + return 1; } static int destroy_mysql(const char *database, const char *table, const char *keyfield, const char *lookup, const struct ast_variable *rt_fields) @@ -989,105 +946,14 @@ static int unload_mysql(const char *database, const char *tablename) return cur ? 0 : -1; } -static int modify_mysql(const char *database, const char *tablename, struct columns *column, require_type type, int len) -{ - /*!\note Cannot use ANY of the same scratch space as is used in other functions, as this one is interspersed. */ - struct ast_str *sql = ast_str_thread_get(&modify_buf, 100), *escbuf = ast_str_thread_get(&modify2_buf, 100); - struct ast_str *typestr = ast_str_thread_get(&modify3_buf, 30); - int waschar = strncasecmp(column->type, "char", 4) == 0 ? 1 : 0; - int wasvarchar = strncasecmp(column->type, "varchar", 7) == 0 ? 1 : 0; - int res = 0; - struct mysql_conn *dbh; - - if (!(dbh = find_database(database, 1))) { - return -1; - } - - do { - if (type == RQ_CHAR || waschar || wasvarchar) { - if (wasvarchar) { - ast_str_set(&typestr, 0, "VARCHAR(%d)", len); - } else { - ast_str_set(&typestr, 0, "CHAR(%d)", len); - } - } else if (type == RQ_UINTEGER1) { - ast_str_set(&typestr, 0, "tinyint(3) unsigned"); - } else if (type == RQ_INTEGER1) { - ast_str_set(&typestr, 0, "tinyint(4)"); - } else if (type == RQ_UINTEGER2) { - ast_str_set(&typestr, 0, "smallint(5) unsigned"); - } else if (type == RQ_INTEGER2) { - ast_str_set(&typestr, 0, "smallint(6)"); - } else if (type == RQ_UINTEGER3) { - ast_str_set(&typestr, 0, "mediumint(8) unsigned"); - } else if (type == RQ_INTEGER3) { - ast_str_set(&typestr, 0, "mediumint(8)"); - } else if (type == RQ_UINTEGER4) { - ast_str_set(&typestr, 0, "int(10) unsigned"); - } else if (type == RQ_INTEGER4) { - ast_str_set(&typestr, 0, "int(11)"); - } else if (type == RQ_UINTEGER8) { - ast_str_set(&typestr, 0, "bigint(19) unsigned"); - } else if (type == RQ_INTEGER8) { - ast_str_set(&typestr, 0, "bigint(20)"); - } else if (type == RQ_DATETIME) { - ast_str_set(&typestr, 0, "datetime"); - } else if (type == RQ_DATE) { - ast_str_set(&typestr, 0, "date"); - } else if (type == RQ_FLOAT) { - ast_str_set(&typestr, 0, "FLOAT(%d,2)", len); - } else { - ast_log(LOG_ERROR, "Unknown type (should NEVER happen)\n"); - res = -1; - break; - } - ast_str_set(&sql, 0, "ALTER TABLE %s MODIFY `%s` %s", tablename, column->name, ast_str_buffer(typestr)); - if (!column->null) { - ast_str_append(&sql, 0, " NOT NULL"); - } - if (!ast_strlen_zero(column->dflt)) { - ESCAPE_STRING(escbuf, column->dflt); - ast_str_append(&sql, 0, " DEFAULT '%s'", ast_str_buffer(escbuf)); - } - - if (!mysql_reconnect(dbh)) { - ast_log(LOG_ERROR, "Unable to add column: %s\n", ast_str_buffer(sql)); - res = -1; - break; - } - - /* Execution. */ - if (mysql_real_query(&dbh->handle, ast_str_buffer(sql), ast_str_strlen(sql))) { - ast_log(LOG_WARNING, "MySQL RealTime: Failed to modify database: %s\n", mysql_error(&dbh->handle)); - ast_debug(1, "MySQL RealTime: Query: %s\n", ast_str_buffer(sql)); - res = -1; - } - } while (0); - - release_database(dbh); - return res; -} - -#define PICK_WHICH_ALTER_ACTION(stringtype) \ - if (table->database->requirements == RQ_WARN) { \ - ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ - "the required data length: %d (detected stringtype)\n", \ - tablename, database, column->name, size); \ - res = -1; \ - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { \ - table_altered = 1; \ - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { \ - table_altered = 1; \ - } else { \ - res = -1; \ - } - static int require_mysql(const char *database, const char *tablename, va_list ap) { struct columns *column; struct tables *table = find_table(database, tablename); char *elm; - int type, size, res = 0, table_altered = 0; + int type; + int size; + int res = 0; if (!table) { ast_log(LOG_WARNING, "Table %s not found in database. This table should exist if you're using realtime.\n", tablename); @@ -1097,55 +963,54 @@ static int require_mysql(const char *database, const char *tablename, va_list ap while ((elm = va_arg(ap, char *))) { type = va_arg(ap, require_type); size = va_arg(ap, int); + AST_LIST_TRAVERSE(&table->columns, column, list) { if (strcmp(column->name, elm) == 0) { /* Char can hold anything, as long as it is large enough */ if (strncmp(column->type, "char", 4) == 0 || strncmp(column->type, "varchar", 7) == 0) { if ((size > column->len) && column->len != -1) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: Column '%s' should be at least %d long, but is only %d long.\n", database, tablename, column->name, size, column->len); - res = -1; - } else if (modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else { - res = -1; - } + ast_log(LOG_WARNING, "Realtime table %s@%s: Column '%s' should be at least %d long, but is only %d long.\n", database, tablename, column->name, size, column->len); + res = -1; } } else if (strcasestr(column->type, "unsigned")) { if (!ast_rq_is_int(type)) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' cannot be type '%s' (need %s)\n", - database, tablename, column->name, column->type, - type == RQ_CHAR ? "char" : type == RQ_FLOAT ? "float" : - type == RQ_DATETIME ? "datetime" : type == RQ_DATE ? "date" : "a rather stiff drink"); - res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { - res = -1; - } + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' cannot be type '%s' (need %s)\n", + database, tablename, column->name, column->type, + type == RQ_CHAR ? "char" : type == RQ_FLOAT ? "float" : + type == RQ_DATETIME ? "datetime" : type == RQ_DATE ? "date" : "a rather stiff drink"); + res = -1; } else if (strncasecmp(column->type, "tinyint", 1) == 0) { if (type != RQ_UINTEGER1) { - PICK_WHICH_ALTER_ACTION(unsigned tinyint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "smallint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_UINTEGER2) { - PICK_WHICH_ALTER_ACTION(unsigned smallint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "mediumint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_UINTEGER2 && type != RQ_INTEGER2 && type != RQ_UINTEGER3) { - PICK_WHICH_ALTER_ACTION(unsigned mediumint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "int", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_UINTEGER2 && type != RQ_INTEGER2 && type != RQ_UINTEGER3 && type != RQ_INTEGER3 && type != RQ_UINTEGER4) { - PICK_WHICH_ALTER_ACTION(unsigned int) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "bigint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && @@ -1153,45 +1018,52 @@ static int require_mysql(const char *database, const char *tablename, va_list ap type != RQ_UINTEGER3 && type != RQ_INTEGER3 && type != RQ_UINTEGER4 && type != RQ_INTEGER4 && type != RQ_UINTEGER8) { - PICK_WHICH_ALTER_ACTION(unsigned bigint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } } else if (strcasestr(column->type, "int")) { if (!ast_rq_is_int(type)) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' cannot be type '%s' (need %s)\n", - database, tablename, column->name, column->type, - type == RQ_CHAR ? "char" : type == RQ_FLOAT ? "float" : - type == RQ_DATETIME ? "datetime" : type == RQ_DATE ? "date" : - "to get a life, rather than writing silly error messages"); - res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { - res = -1; - } + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' cannot be type '%s' (need %s)\n", + database, tablename, column->name, column->type, + type == RQ_CHAR ? "char" : type == RQ_FLOAT ? "float" : + type == RQ_DATETIME ? "datetime" : type == RQ_DATE ? "date" : + "to get a life, rather than writing silly error messages"); + res = -1; } else if (strncasecmp(column->type, "tinyint", 1) == 0) { if (type != RQ_INTEGER1) { - PICK_WHICH_ALTER_ACTION(tinyint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "smallint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_INTEGER2) { - PICK_WHICH_ALTER_ACTION(smallint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "mediumint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_UINTEGER2 && type != RQ_INTEGER2 && type != RQ_INTEGER3) { - PICK_WHICH_ALTER_ACTION(mediumint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "int", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && type != RQ_UINTEGER2 && type != RQ_INTEGER2 && type != RQ_UINTEGER3 && type != RQ_INTEGER3 && type != RQ_INTEGER4) { - PICK_WHICH_ALTER_ACTION(int) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } else if (strncasecmp(column->type, "bigint", 1) == 0) { if (type != RQ_UINTEGER1 && type != RQ_INTEGER1 && @@ -1199,137 +1071,41 @@ static int require_mysql(const char *database, const char *tablename, va_list ap type != RQ_UINTEGER3 && type != RQ_INTEGER3 && type != RQ_UINTEGER4 && type != RQ_INTEGER4 && type != RQ_INTEGER8) { - PICK_WHICH_ALTER_ACTION(bigint) + ast_log(LOG_WARNING, "Realtime table %s@%s: column '%s' may not be large enough for " \ + "the required data length: %d (detected stringtype)\n", \ + tablename, database, column->name, size); \ + res = -1; \ } } } else if (strncmp(column->type, "float", 5) == 0) { if (!ast_rq_is_int(type) && type != RQ_FLOAT) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); - res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { - res = -1; - } + ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); + res = -1; } } else if (strncmp(column->type, "datetime", 8) == 0 || strncmp(column->type, "timestamp", 9) == 0) { if (type != RQ_DATETIME) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); - res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { - res = -1; - } + ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); + res = -1; } } else if (strncmp(column->type, "date", 4) == 0) { if (type != RQ_DATE) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); - res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { - res = -1; - } - } - } else { /* Other, possibly unsupported types? */ - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Possibly unsupported column type '%s' on column '%s'\n", column->type, column->name); + ast_log(LOG_WARNING, "Realtime table %s@%s: Column %s cannot be a %s\n", tablename, database, column->name, column->type); res = -1; - } else if (table->database->requirements == RQ_CREATECLOSE && modify_mysql(database, tablename, column, type, size) == 0) { - table_altered = 1; - } else if (table->database->requirements == RQ_CREATECHAR && modify_mysql(database, tablename, column, RQ_CHAR, size) == 0) { - table_altered = 1; - } else { } + } else { /* Other, possibly unsupported types? */ + ast_log(LOG_WARNING, "Possibly unsupported column type '%s' on column '%s'\n", column->type, column->name); + res = -1; } break; } } if (!column) { - if (table->database->requirements == RQ_WARN) { - ast_log(LOG_WARNING, "Table %s requires a column '%s' of size '%d', but no such column exists.\n", tablename, elm, size); - } else { - struct ast_str *sql = ast_str_thread_get(&modify_buf, 100), *fieldtype = ast_str_thread_get(&modify3_buf, 16); - - if (table->database->requirements == RQ_CREATECHAR || type == RQ_CHAR) { - ast_str_set(&fieldtype, 0, "CHAR(%d)", size); - } else if (type == RQ_UINTEGER1 || type == RQ_UINTEGER2 || type == RQ_UINTEGER3 || type == RQ_UINTEGER4 || type == RQ_UINTEGER8) { - if (type == RQ_UINTEGER1) { - ast_str_set(&fieldtype, 0, "TINYINT(3) UNSIGNED"); - } else if (type == RQ_UINTEGER2) { - ast_str_set(&fieldtype, 0, "SMALLINT(5) UNSIGNED"); - } else if (type == RQ_UINTEGER3) { - ast_str_set(&fieldtype, 0, "MEDIUMINT(8) UNSIGNED"); - } else if (type == RQ_UINTEGER4) { - ast_str_set(&fieldtype, 0, "INT(10) UNSIGNED"); - } else if (type == RQ_UINTEGER8) { - ast_str_set(&fieldtype, 0, "BIGINT(20) UNSIGNED"); - } else { - ast_log(LOG_WARNING, "Somebody should check this code for a rather large bug... it's about to squash Tokyo.\n"); - continue; - } - } else if (ast_rq_is_int(type)) { - if (type == RQ_INTEGER1) { - ast_str_set(&fieldtype, 0, "TINYINT(3)"); - } else if (type == RQ_INTEGER2) { - ast_str_set(&fieldtype, 0, "SMALLINT(5)"); - } else if (type == RQ_INTEGER3) { - ast_str_set(&fieldtype, 0, "MEDIUMINT(8)"); - } else if (type == RQ_INTEGER4) { - ast_str_set(&fieldtype, 0, "INT(10)"); - } else if (type == RQ_INTEGER8) { - ast_str_set(&fieldtype, 0, "BIGINT(20)"); - } else { - ast_log(LOG_WARNING, "Somebody should check this code for a rather large bug... it's about to eat Cincinnati.\n"); - continue; - } - } else if (type == RQ_FLOAT) { - ast_str_set(&fieldtype, 0, "FLOAT"); - } else if (type == RQ_DATE) { - ast_str_set(&fieldtype, 0, "DATE"); - } else if (type == RQ_DATETIME) { - ast_str_set(&fieldtype, 0, "DATETIME"); - } else { - continue; - } - ast_str_set(&sql, 0, "ALTER TABLE %s ADD COLUMN %s %s", tablename, elm, ast_str_buffer(fieldtype)); - - ast_mutex_lock(&table->database->lock); - if (!mysql_reconnect(table->database)) { - ast_mutex_unlock(&table->database->lock); - ast_log(LOG_ERROR, "Unable to add column: %s\n", ast_str_buffer(sql)); - continue; - } - - /* Execution. */ - if (mysql_real_query(&table->database->handle, ast_str_buffer(sql), ast_str_strlen(sql))) { - ast_log(LOG_WARNING, "MySQL RealTime: Failed to query database. Check debug for more info.\n"); - ast_debug(1, "MySQL RealTime: Query: %s\n", ast_str_buffer(sql)); - ast_debug(1, "MySQL RealTime: Query Failed because: %s\n", mysql_error(&table->database->handle)); - } else { - table_altered = 1; - } - } + ast_log(LOG_WARNING, "Table %s requires a column '%s' of size '%d', but no such column exists.\n", tablename, elm, size); } } release_table(table); - /* If we altered the table, we must refresh the cache */ - if (table_altered) { - unload_mysql(database, tablename); - release_table(find_table(database, tablename)); - } return res; }