Annotation of embedaddon/strongswan/src/libstrongswan/database/database.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013 Tobias Brunner
! 3: * Copyright (C) 2008 Martin Willi
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: /**
! 18: * @defgroup database_t database
! 19: * @{ @ingroup database
! 20: */
! 21:
! 22: #ifndef DATABASE_H_
! 23: #define DATABASE_H_
! 24:
! 25: typedef enum db_type_t db_type_t;
! 26: typedef enum db_driver_t db_driver_t;
! 27: typedef struct database_t database_t;
! 28:
! 29: #include <collections/enumerator.h>
! 30:
! 31: /**
! 32: * Database column types
! 33: */
! 34: enum db_type_t {
! 35: /** integer type, argument is an "int" */
! 36: DB_INT,
! 37: /** unsigned integer, argument is an "u_int" */
! 38: DB_UINT,
! 39: /** string type, argument is a "char*" */
! 40: DB_TEXT,
! 41: /** binary large object type, argument is a "chunk_t" */
! 42: DB_BLOB,
! 43: /** floating point, argument is a "double" */
! 44: DB_DOUBLE,
! 45: /** NULL, takes no argument */
! 46: DB_NULL,
! 47: };
! 48:
! 49: /**
! 50: * Database implementation type.
! 51: */
! 52: enum db_driver_t {
! 53: /** matches to other databases */
! 54: DB_ANY = 0,
! 55: /** SQLite database */
! 56: DB_SQLITE,
! 57: /** MySQL database */
! 58: DB_MYSQL,
! 59: };
! 60:
! 61: /**
! 62: * Names for db_driver_t
! 63: */
! 64: extern enum_name_t *db_driver_names;
! 65:
! 66: /**
! 67: * Interface for a database implementation.
! 68: *
! 69: * @code
! 70: int affected, rowid, aint;
! 71: char *atext;
! 72: database_t *db;
! 73: enumerator_t *enumerator;
! 74:
! 75: db = lib->database->create("mysql://user:pass@host/database");
! 76: affected = db->execute(db, &rowid, "INSERT INTO table VALUES (?, ?)",
! 77: DB_INT, 77, DB_TEXT, "a text");
! 78: printf("inserted %d row, new row ID: %d\n", affected, rowid);
! 79:
! 80: enumerator = db->query(db, "SELECT aint, atext FROM table WHERE aint > ?",
! 81: DB_INT, 10, // 1 argument to SQL string
! 82: DB_INT, DB_TEXT); // 2 enumerated types in query
! 83: if (enumerator)
! 84: {
! 85: while (enumerator->enumerate(enumerator, &aint, &atext))
! 86: {
! 87: printf("%d: %s\n", aint, atext);
! 88: }
! 89: enumerator->destroy(enumerator);
! 90: }
! 91: @endcode
! 92: */
! 93: struct database_t {
! 94:
! 95: /**
! 96: * Run a query which returns rows, such as a SELECT.
! 97: *
! 98: * @param sql sql query string, containing '?' placeholders
! 99: * @param ... list of sql placeholder db_type_t followed by its value,
! 100: * followed by enumerators arguments as db_type_t's
! 101: * @return enumerator as defined with arguments, NULL on failure
! 102: */
! 103: enumerator_t* (*query)(database_t *this, char *sql, ...);
! 104:
! 105: /**
! 106: * Execute a query which does not return rows, such as INSERT.
! 107: *
! 108: * @param rowid pointer to write inserted AUTO_INCREMENT row ID, or NULL
! 109: * @param sql sql string, containing '?' placeholders
! 110: * @param ... list of sql placeholder db_type_t followed by its value
! 111: * @return number of affected rows, < 0 on failure
! 112: */
! 113: int (*execute)(database_t *this, int *rowid, char *sql, ...);
! 114:
! 115: /**
! 116: * Start a transaction.
! 117: *
! 118: * A serializable transaction forces a strict separation between other
! 119: * transactions. Due to the performance overhead they should only be used
! 120: * in certain situations (e.g. SELECT->INSERT|UPDATE).
! 121: *
! 122: * @note Either commit() or rollback() has to be called to end the
! 123: * transaction.
! 124: * @note Transactions are thread-specific. So commit()/rollback() has to be
! 125: * called from the same thread.
! 126: * @note While this method can be called multiple times (commit/rollback
! 127: * have to be called an equal number of times) real nested transactions are
! 128: * not supported. So if any if the "inner" transactions are rolled back
! 129: * the outer most transaction is rolled back.
! 130: *
! 131: * @param serializable TRUE to create a serializable transaction
! 132: * @return TRUE on success
! 133: */
! 134: bool (*transaction)(database_t *this, bool serializable);
! 135:
! 136: /**
! 137: * Commit all changes made during the current transaction.
! 138: *
! 139: * @return TRUE on success
! 140: */
! 141: bool (*commit)(database_t *this);
! 142:
! 143: /**
! 144: * Rollback/revert all changes made during the current transaction.
! 145: *
! 146: * @return TRUE on success
! 147: */
! 148: bool (*rollback)(database_t *this);
! 149:
! 150: /**
! 151: * Get the database implementation type.
! 152: *
! 153: * To allow driver specific SQL or performance optimizations each database
! 154: * implementations can be queried for its type.
! 155: *
! 156: * @return database implementation type
! 157: */
! 158: db_driver_t (*get_driver)(database_t *this);
! 159:
! 160: /**
! 161: * Destroy a database connection.
! 162: */
! 163: void (*destroy)(database_t *this);
! 164: };
! 165:
! 166: #endif /** DATABASE_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>