ast_channel_lock(chan);
if ((odbc_store = ast_channel_datastore_find(chan, &odbc_info, buf))) {
ast_channel_datastore_remove(chan, odbc_store);
- odbc_datastore_free(odbc_store->data);
- ast_free(odbc_store);
+ ast_datastore_free(odbc_store);
}
ast_channel_unlock(chan);
}
return -1;
}
odbc_store->data = resultset;
+ ast_channel_lock(chan);
ast_channel_datastore_add(chan, odbc_store);
+ ast_channel_unlock(chan);
}
}
SQLCloseCursor(stmt);
struct ast_datastore *store;
struct odbc_datastore *resultset;
struct odbc_datastore_row *row;
+
+ ast_channel_lock(chan);
store = ast_channel_datastore_find(chan, &odbc_info, data);
if (!store) {
+ ast_channel_unlock(chan);
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "FAILURE");
return -1;
}
/* Cleanup datastore */
ast_channel_datastore_remove(chan, store);
ast_datastore_free(store);
+ ast_channel_unlock(chan);
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "FAILURE");
return -1;
}
pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", resultset->names);
+ ast_channel_unlock(chan);
ast_copy_string(buf, row->data, len);
ast_free(row);
pbx_builtin_setvar_helper(chan, "ODBC_FETCH_STATUS", "SUCCESS");
static int exec_odbcfinish(struct ast_channel *chan, const char *data)
{
- struct ast_datastore *store = ast_channel_datastore_find(chan, &odbc_info, data);
- if (!store) /* Already freed; no big deal. */
- return 0;
- ast_channel_datastore_remove(chan, store);
- ast_datastore_free(store);
+ struct ast_datastore *store;
+
+ ast_channel_lock(chan);
+ store = ast_channel_datastore_find(chan, &odbc_info, data);
+ if (store) {
+ ast_channel_datastore_remove(chan, store);
+ ast_datastore_free(store);
+ }
+ ast_channel_unlock(chan);
return 0;
}