***/
static struct ast_config *realtime_sqlite3_load(const char *database, const char *table, const char *configfile, struct ast_config *config, struct ast_flags flags, const char *suggested_include_file, const char *who_asked);
-static struct ast_variable *realtime_sqlite3(const char *database, const char *table, va_list ap);
-static struct ast_config *realtime_sqlite3_multi(const char *database, const char *table, va_list ap);
-static int realtime_sqlite3_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
-static int realtime_sqlite3_update2(const char *database, const char *table, va_list ap);
-static int realtime_sqlite3_store(const char *database, const char *table, va_list ap);
-static int realtime_sqlite3_destroy(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap);
+static struct ast_variable *realtime_sqlite3(const char *database, const char *table, const struct ast_variable *fields);
+static struct ast_config *realtime_sqlite3_multi(const char *database, const char *table, const struct ast_variable *fields);
+static int realtime_sqlite3_update(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields);
+static int realtime_sqlite3_update2(const char *database, const char *table, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields);
+static int realtime_sqlite3_store(const char *database, const char *table, const struct ast_variable *fields);
+static int realtime_sqlite3_destroy(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields);
static int realtime_sqlite3_require(const char *database, const char *table, va_list ap);
static int realtime_sqlite3_unload(const char *database, const char *table);
ao2_unlock(db);
return -1;
}
+ sqlite3_busy_timeout(db->handle, 1000);
if (db->debug) {
sqlite3_trace(db->handle, trace_cb, db);
}
/*! \brief Helper function for single and multi-row realtime load functions */
-static int realtime_sqlite3_helper(const char *database, const char *table, va_list ap, int is_multi, void *arg)
+static int realtime_sqlite3_helper(const char *database, const char *table, const struct ast_variable *fields, int is_multi, void *arg)
{
struct ast_str *sql;
- const char *param, *value;
+ const struct ast_variable *field;
int first = 1;
if (ast_strlen_zero(table)) {
return -1;
}
- while ((param = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = fields; field; field = field->next) {
if (first) {
ast_str_set(&sql, 0, "SELECT * FROM %s WHERE %s %s", sqlite3_escape_table(table),
- sqlite3_escape_column_op(param), sqlite3_escape_value(value));
+ sqlite3_escape_column_op(field->name), sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&sql, 0, " AND %s %s", sqlite3_escape_column_op(param),
- sqlite3_escape_value(value));
+ ast_str_append(&sql, 0, " AND %s %s", sqlite3_escape_column_op(field->name),
+ sqlite3_escape_value(field->value));
}
}
/*! \brief Realtime callback for a single row query
* \return ast_variable list for single result on success, NULL on empty/failure
*/
-static struct ast_variable *realtime_sqlite3(const char *database, const char *table, va_list ap)
+static struct ast_variable *realtime_sqlite3(const char *database, const char *table, const struct ast_variable *fields)
{
struct ast_variable *result_row = NULL;
- realtime_sqlite3_helper(database, table, ap, 0, &result_row);
+ realtime_sqlite3_helper(database, table, fields, 0, &result_row);
return result_row;
}
/*! \brief Realtime callback for a multi-row query
* \return ast_config containing possibly many results on success, NULL on empty/failure
*/
-static struct ast_config *realtime_sqlite3_multi(const char *database, const char *table, va_list ap)
+static struct ast_config *realtime_sqlite3_multi(const char *database, const char *table, const struct ast_variable *fields)
{
struct ast_config *cfg;
return NULL;
}
- if (realtime_sqlite3_helper(database, table, ap, 1, cfg)) {
+ if (realtime_sqlite3_helper(database, table, fields, 1, cfg)) {
ast_config_destroy(cfg);
return NULL;
}
/*! \brief Realtime callback for updating a row based on a single criteria
* \return Number of rows affected or -1 on error
*/
-static int realtime_sqlite3_update(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap)
+static int realtime_sqlite3_update(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
{
struct ast_str *sql;
- const char *key, *value;
+ const struct ast_variable *field;
int first = 1, res;
if (ast_strlen_zero(table)) {
return -1;
}
- while ((key = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = fields; field; field = field->next) {
if (first) {
ast_str_set(&sql, 0, "UPDATE %s SET %s = %s",
- sqlite3_escape_table(table), sqlite3_escape_column(key), sqlite3_escape_value(value));
+ sqlite3_escape_table(table), sqlite3_escape_column(field->name), sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&sql, 0, ", %s = %s", sqlite3_escape_column(key), sqlite3_escape_value(value));
+ ast_str_append(&sql, 0, ", %s = %s", sqlite3_escape_column(field->name), sqlite3_escape_value(field->value));
}
}
/*! \brief Realtime callback for updating a row based on multiple criteria
* \return Number of rows affected or -1 on error
*/
-static int realtime_sqlite3_update2(const char *database, const char *table, va_list ap)
+static int realtime_sqlite3_update2(const char *database, const char *table, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)
{
struct ast_str *sql;
struct ast_str *where_clause;
- const char *key, *value;
+ const struct ast_variable *field;
int first = 1, res;
if (ast_strlen_zero(table)) {
return -1;
}
- while ((key = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = lookup_fields; field; field = field->next) {
if (first) {
- ast_str_set(&where_clause, 0, " WHERE %s %s", sqlite3_escape_column_op(key), sqlite3_escape_value(value));
+ ast_str_set(&where_clause, 0, " WHERE %s %s", sqlite3_escape_column_op(field->name), sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&where_clause, 0, " AND %s %s", sqlite3_escape_column_op(key), sqlite3_escape_value(value));
+ ast_str_append(&where_clause, 0, " AND %s %s", sqlite3_escape_column_op(field->name), sqlite3_escape_value(field->value));
}
}
first = 1;
- while ((key = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = update_fields; field; field = field->next) {
if (first) {
- ast_str_set(&sql, 0, "UPDATE %s SET %s = %s", sqlite3_escape_table(table), sqlite3_escape_column(key), sqlite3_escape_value(value));
+ ast_str_set(&sql, 0, "UPDATE %s SET %s = %s", sqlite3_escape_table(table), sqlite3_escape_column(field->name), sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&sql, 0, ", %s = %s", sqlite3_escape_column(key), sqlite3_escape_value(value));
+ ast_str_append(&sql, 0, ", %s = %s", sqlite3_escape_column(field->name), sqlite3_escape_value(field->value));
}
}
/*! \brief Realtime callback for inserting a row
* \return Number of rows affected or -1 on error
*/
-static int realtime_sqlite3_store(const char *database, const char *table, va_list ap)
+static int realtime_sqlite3_store(const char *database, const char *table, const struct ast_variable *fields)
{
struct ast_str *sql, *values;
- const char *column, *value;
+ const struct ast_variable *field;
int first = 1, res;
if (ast_strlen_zero(table)) {
return -1;
}
- while ((column = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = fields; field; field = field->next) {
if (first) {
- ast_str_set(&sql, 0, "INSERT INTO %s (%s", sqlite3_escape_table(table), sqlite3_escape_column(column));
- ast_str_set(&values, 0, ") VALUES (%s", sqlite3_escape_value(value));
+ ast_str_set(&sql, 0, "INSERT INTO %s (%s", sqlite3_escape_table(table), sqlite3_escape_column(field->name));
+ ast_str_set(&values, 0, ") VALUES (%s", sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&sql, 0, ", %s", sqlite3_escape_column(column));
- ast_str_append(&values, 0, ", %s", sqlite3_escape_value(value));
+ ast_str_append(&sql, 0, ", %s", sqlite3_escape_column(field->name));
+ ast_str_append(&values, 0, ", %s", sqlite3_escape_value(field->value));
}
}
/*! \brief Realtime callback for deleting a row
* \return Number of rows affected or -1 on error
*/
-static int realtime_sqlite3_destroy(const char *database, const char *table, const char *keyfield, const char *entity, va_list ap)
+static int realtime_sqlite3_destroy(const char *database, const char *table, const char *keyfield, const char *entity, const struct ast_variable *fields)
{
struct ast_str *sql;
- const char *param, *value;
+ const struct ast_variable *field;
int first = 1, res;
if (ast_strlen_zero(table)) {
return -1;
}
- while ((param = va_arg(ap, const char *)) && (value = va_arg(ap, const char *))) {
+ for (field = fields; field; field = field->next) {
if (first) {
ast_str_set(&sql, 0, "DELETE FROM %s WHERE %s %s", sqlite3_escape_table(table),
- sqlite3_escape_column_op(param), sqlite3_escape_value(value));
+ sqlite3_escape_column_op(field->name), sqlite3_escape_value(field->value));
first = 0;
} else {
- ast_str_append(&sql, 0, " AND %s %s", sqlite3_escape_column_op(param), sqlite3_escape_value(value));
+ ast_str_append(&sql, 0, " AND %s %s", sqlite3_escape_column_op(field->name), sqlite3_escape_value(field->value));
}
}