diff --git a/dbi/dbi/dbi.fec b/dbi/dbi/dbi.fec index 609e137..2eb4ba9 100755 --- a/dbi/dbi/dbi.fec +++ b/dbi/dbi/dbi.fec @@ -88,6 +88,35 @@ class Dbi */ private string lastQuery; + /** + * @function constructor + * @declaration function constructor( string type, string username, string password, + * string hostname, string database ) + * @brief Create a database connection. + * @param string type + * The database driver to use. (e.g. sqlite/sqlite3) + * @param string database + * The database to connect to. (filename) + * @param string dbdir + * The directory path root to resolve database filename. + * @param int timeout + * The sqlite3_timeout option to dbd-sqlite3 (in milliseconds) + + * @description The constructor will return a null object if the connection to the database fails. + * You should check for this in your code. + * + */ + + native function constructor( string type, string database, string dbdir, number timeout ) + { + self->odata = ferite_dbi_connect_sq3( script, type, database, dbdir, timeout ); + if( self->odata == NULL ) + FE_RETURN_NULL_OBJECT; + { + FeriteVariable *recordQueryMetrics = ferite_object_get_var( script, self, "recordQueryMetrics" ); + VAB(recordQueryMetrics) = FE_FALSE; + } + } /** * @function constructor @@ -193,6 +222,37 @@ class Dbi FE_RETURN_VAR( obj ); } + /** + * @function connect + * @static + * @declaration function connect( string type, string username, string password, + * string hostname, number port, string database ) + * @brief Static function. connect's a dbi object to a database. + * @return An object of the class dbi. + * @param string type + * The database driver to use. (e.g. sqlite/sqlite3) + * @param string database + * The database file to connect to. + * @param string dbdir + * The directory root of databases in ("/tmp" is ok, instead + * of "/tmp/") + */ + + static native function connect( string type, string database, string dbdir, + number timeout ) + { + DBIData *dbi = ferite_dbi_connect_sq3( script, type, database, dbdir, (int)timeout ); + FeriteClass *cls = NULL; + FeriteVariable *obj = NULL; + + if( dbi == NULL ) + FE_RETURN_NULL_OBJECT; + cls = ferite_find_class( script, script->mainns, "Dbi" ); + obj = ferite_build_object( script, cls ); + VAO(obj)->odata = dbi; + FE_RETURN_VAR( obj ); + } + /** * @function disconnect * @declaration function disconnect( ) diff --git a/dbi/dbi/utility.c b/dbi/dbi/utility.c index ffaf298..a86b410 100755 --- a/dbi/dbi/utility.c +++ b/dbi/dbi/utility.c @@ -30,6 +30,40 @@ #include "utility.h" +DBIData *ferite_dbi_connect_sq3( FeriteScript *script, FeriteString *protocol, + FeriteString *database, FeriteString *dbdir, + int timeout ) +{ + + DBIData *dbi = fmalloc( sizeof( DBIData ) ); + dbi->connected = 0; + dbi->conn = NULL; + dbi->version = dbi_version( ); + dbi->result_list = NULL; + + if( ( dbi->conn = dbi_conn_new( protocol->data ) ) == NULL ) { + ferite_error(script, -1, "Failed to activate driver [%s] libdbi version: %s\n", + protocol->data, dbi->version ); + ffree( dbi ); + return NULL; + } + + dbi_conn_set_option( dbi->conn, "dbname", database->data ); + dbi_conn_set_option( dbi->conn, "sqlite3_dbdir", dbdir->data ); + + dbi_conn_set_option_numeric( dbi->conn, "sqlite3_timeout", timeout ); + + if ( dbi_conn_connect( dbi->conn ) != 0 ) { + const char *error_msg = NULL; + dbi_conn_error( dbi->conn, &error_msg ); + ferite_error( script, 0, "Unable to connect to database: '%s'\n", error_msg ); + ffree( dbi ); + return NULL; + } + dbi->connected = 1; + return dbi; +} + DBIData *ferite_dbi_connect( FeriteScript *script, FeriteString *protocol, FeriteString *username, FeriteString *password, FeriteString *hostname, int port, diff --git a/dbi/dbi/utility.h b/dbi/dbi/utility.h index 4b19db2..0d7a90d 100755 --- a/dbi/dbi/utility.h +++ b/dbi/dbi/utility.h @@ -57,6 +57,9 @@ struct llist struct llist *next; }; +DBIData *ferite_dbi_connect_sq3( FeriteScript *script, FeriteString *protocol, + FeriteString *database, FeriteString *dbdir, + int timeout ); DBIData *ferite_dbi_connect( FeriteScript *script, FeriteString *protocol, FeriteString *username, FeriteString *password, FeriteString *hostname, int port, FeriteString *database );