sql-api.h revision 636ece98e31017f94940d1f09c780cab36180e79
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#ifndef __SQL_API_H
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#define __SQL_API_H
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* This SQL API is designed to work asynchronously. The underlying drivers
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen however may not. */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainenenum sql_db_flags {
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen /* Set if queries are not executed asynchronously */
636ece98e31017f94940d1f09c780cab36180e79Timo Sirainen SQL_DB_FLAG_BLOCKING = 0x01
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen};
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct sql_db;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct sql_result;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainentypedef void sql_query_callback_t(struct sql_result *result, void *context);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainentypedef void sql_commit_callback_t(const char *error, void *context);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenvoid sql_drivers_init(void);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenvoid sql_drivers_deinit(void);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen/* register all built-in SQL drivers */
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenvoid sql_drivers_register_all(void);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenvoid sql_driver_register(const struct sql_db *driver);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenvoid sql_driver_unregister(const struct sql_db *driver);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Initialize database connections. db_driver is the database driver name,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen eg. "mysql" or "pgsql". connect_string is driver-specific. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstruct sql_db *sql_init(const char *db_driver, const char *connect_string);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid sql_deinit(struct sql_db **db);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen/* Returns SQL database state flags. */
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainenenum sql_db_flags sql_get_flags(struct sql_db *db);
ccffb125d94adff0ad776de5a96e22f864d6fb0aTimo Sirainen
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen/* Explicitly connect to the database. It's not required to call this function
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen though. Returns -1 if we're not connected, 0 if we started connecting or
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen 1 if we are fully connected now. */
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainenint sql_connect(struct sql_db *db);
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Execute SQL query without waiting for results. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenvoid sql_exec(struct sql_db *db, const char *query);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Execute SQL query and return result in callback. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenvoid sql_query(struct sql_db *db, const char *query,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen sql_query_callback_t *callback, void *context);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Execute blocking SQL query and return result. */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenstruct sql_result *sql_query_s(struct sql_db *db, const char *query);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Go to next row, returns 1 if ok, 0 if this was the last row or -1 if error
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen occurred. This needs to be the first call for result. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenint sql_result_next_row(struct sql_result *result);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Needs to be called only with sql_query_s(). */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenvoid sql_result_free(struct sql_result *result);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Return number of fields in result. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenunsigned int sql_result_get_fields_count(struct sql_result *result);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Return name of the given field index. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenconst char *sql_result_get_field_name(struct sql_result *result,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen unsigned int idx);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Return field index for given name, or -1 if not found. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenint sql_result_find_field(struct sql_result *result, const char *field_name);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Returns value of given field as string. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenconst char *sql_result_get_field_value(struct sql_result *result,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen unsigned int idx);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenconst char *sql_result_find_field_value(struct sql_result *result,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *field_name);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Return all values of current row. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenconst char *const *sql_result_get_values(struct sql_result *result);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen/* Return last error message in result. */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenconst char *sql_result_get_error(struct sql_result *result);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Begin a new transaction. Currently you're limited to only one open
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen transaction at a time. */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenstruct sql_transaction_context *sql_transaction_begin(struct sql_db *db);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Commit transaction. */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid sql_transaction_commit(struct sql_transaction_context **ctx,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen sql_commit_callback_t *callback, void *context);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Synchronous commit. Returns 0 if ok, -1 if error. */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenint sql_transaction_commit_s(struct sql_transaction_context **ctx,
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen const char **error_r);
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainenvoid sql_transaction_rollback(struct sql_transaction_context **ctx);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen/* Execute query in given transaction. */
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenvoid sql_update(struct sql_transaction_context *ctx, const char *query);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen#endif