Annotation of embedaddon/strongswan/src/libstrongswan/database/database.h, revision 1.1.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>