diff --git a/include/Database.h b/include/Database.h index 37f60e0..8972d7f 100644 --- a/include/Database.h +++ b/include/Database.h @@ -20,6 +20,7 @@ # include "Database/database.h" # include "Database/engine.h" +# include "Database/statement.h" #endif /* !LIBDATABASE_DATABASE_H */ diff --git a/include/Database/database.h b/include/Database/database.h index 7c06484..b05bc49 100644 --- a/include/Database/database.h +++ b/include/Database/database.h @@ -34,7 +34,6 @@ typedef enum _DatabaseType } DatabaseType; typedef struct _Database Database; -typedef struct _DatabaseStatement DatabaseStatement; typedef int (*DatabaseCallback)(void * data, int argc, char ** argv, char ** columns); @@ -50,13 +49,6 @@ void database_delete(Database * database); int64_t database_get_last_id(Database * database); /* useful */ -DatabaseStatement * database_prepare_new(Database * database, - char const * query); -void database_prepare_delete(Database * database, - DatabaseStatement * statement); -int database_prepare_query(Database * database, DatabaseStatement * statement, - DatabaseCallback callback, void * data, ...); - int database_query(Database * database, char const * query, DatabaseCallback callback, void * data); diff --git a/include/Database/engine.h b/include/Database/engine.h index 1e596fe..6702cb1 100644 --- a/include/Database/engine.h +++ b/include/Database/engine.h @@ -28,6 +28,7 @@ /* public */ /* types */ typedef struct _DatabaseEngine DatabaseEngine; +typedef struct _DatabaseEngineStatement DatabaseEngineStatement; typedef struct _DatabaseEngineDefinition { @@ -46,12 +47,12 @@ typedef struct _DatabaseEngineDefinition DatabaseCallback callback, void * data); /* prepared statements */ - DatabaseStatement * (*prepare_new)(DatabaseEngine * engine, + DatabaseEngineStatement * (*statement_new)(DatabaseEngine * engine, char const * query); - void (*prepare_delete)(DatabaseEngine * engine, - DatabaseStatement * statement); - int (*prepare_query)(DatabaseEngine * engine, - DatabaseStatement * statement, + void (*statement_delete)(DatabaseEngine * engine, + DatabaseEngineStatement * statement); + int (*statement_query)(DatabaseEngine * engine, + DatabaseEngineStatement * statement, DatabaseCallback callback, void * data, va_list args); } DatabaseEngineDefinition; diff --git a/include/Database/project.conf b/include/Database/project.conf index c63e374..1ccb7e9 100644 --- a/include/Database/project.conf +++ b/include/Database/project.conf @@ -1,4 +1,4 @@ -includes=database.h,engine.h +includes=database.h,engine.h,statement.h dist=Makefile [database.h] @@ -6,3 +6,6 @@ install=$(INCLUDEDIR)/Database [engine.h] install=$(INCLUDEDIR)/Database + +[statement.h] +install=$(INCLUDEDIR)/Database diff --git a/include/Database/statement.h b/include/Database/statement.h new file mode 100644 index 0000000..1eabfa3 --- /dev/null +++ b/include/Database/statement.h @@ -0,0 +1,40 @@ +/* $Id$ */ +/* Copyright (c) 2019 Pierre Pronchery */ +/* This file is part of DeforaOS Database libDatabase */ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#ifndef LIBDATABASE_DATABASE_STATEMENT_H +# define LIBDATABASE_DATABASE_STATEMENT_H + +# include "database.h" + + +/* DatabaseStatement */ +/* public */ +/* types */ +typedef struct _DatabaseStatement DatabaseStatement; + + +/* public */ +/* functions */ +DatabaseStatement * databasestatement_new(Database * database, + char const * query); +void databasestatement_delete(DatabaseStatement * statement); + +/* useful */ +int databasestatement_query(DatabaseStatement * statement, + DatabaseCallback callback, void * data, ...); + +#endif /* !LIBDATABASE_DATABASE_STATEMENT_H */ diff --git a/src/database.c b/src/database.c index 4e411ce..a024b3f 100644 --- a/src/database.c +++ b/src/database.c @@ -17,7 +17,9 @@ #include #include -#include "Database.h" +#include "Database/database.h" +#include "Database/engine.h" +#include "database.h" #include "../config.h" #ifndef PREFIX @@ -87,36 +89,7 @@ int64_t database_get_last_id(Database * database) } -/* database_prepare_new */ -DatabaseStatement * database_prepare_new(Database * database, - char const * query) -{ - return database->dplugin->prepare_new(database->database, query); -} - - -/* database_prepare_delete */ -void database_prepare_delete(Database * database, DatabaseStatement * statement) -{ - database->dplugin->prepare_delete(database->database, statement); -} - - -/* database_prepare_query */ -int database_prepare_query(Database * database, DatabaseStatement * statement, - DatabaseCallback callback, void * data, ...) -{ - int ret; - va_list ap; - - va_start(ap, data); - ret = database->dplugin->prepare_query(database->database, statement, - callback, data, ap); - va_end(ap); - return ret; -} - - +/* useful */ /* database_query */ int database_query(Database * database, char const * query, DatabaseCallback callback, void * data) @@ -124,3 +97,34 @@ int database_query(Database * database, char const * query, return database->dplugin->query(database->database, query, callback, data); } + + +/* protected */ +/* functions */ +/* database_engine_statement_new */ +DatabaseEngineStatement * database_engine_statement_new(Database * database, + char const * query) +{ + return database->dplugin->statement_new(database->database, query); +} + + +/* database_engine_statement_delete */ +void database_engine_statement_delete(Database * database, + DatabaseEngineStatement * statement) +{ + database->dplugin->statement_delete(database->database, statement); +} + + +/* useful */ +/* database_engine_statement_query */ +int database_engine_statement_query(Database * database, + DatabaseEngineStatement * statement, + DatabaseCallback callback, void * data, va_list args) +{ + return database->dplugin->statement_query(database->database, statement, + callback, data, args); +} + + diff --git a/src/database.h b/src/database.h new file mode 100644 index 0000000..88b6d28 --- /dev/null +++ b/src/database.h @@ -0,0 +1,38 @@ +/* $Id$ */ +/* Copyright (c) 2019 Pierre Pronchery */ +/* This file is part of DeforaOS Database libDatabase */ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#ifndef LIBDATABASE_SRC_DATABASE_H +# define LIBDATABASE_SRC_DATABASE_H + +# include "Database/database.h" +# include "Database/engine.h" + + +/* Database */ +/* protected */ +/* functions */ +DatabaseEngineStatement * database_engine_statement_new(Database * database, + char const * query); +void database_engine_statement_delete(Database * database, + DatabaseEngineStatement * statement); + +/* useful */ +int database_engine_statement_query(Database * database, + DatabaseEngineStatement * statement, + DatabaseCallback callback, void * data, va_list args); + +#endif /* !LIBDATABASE_SRC_DATABASE_H */ diff --git a/src/engines/pdo.c b/src/engines/pdo.c index bb65ef6..023440f 100644 --- a/src/engines/pdo.c +++ b/src/engines/pdo.c @@ -44,9 +44,9 @@ typedef struct _DatabaseEngine DatabaseEngine * database; } PDO; -typedef struct _DatabaseStatement +typedef struct _DatabaseEngineStatement { - DatabaseStatement * statement; + DatabaseEngineStatement * statement; } PDOStatement; @@ -61,9 +61,9 @@ static int64_t _pdo_get_last_id(PDO * pdo); static int _pdo_query(PDO * pdo, char const * query, DatabaseCallback callback, void * data); -static PDOStatement * _pdo_prepare_new(PDO * pdo, char const * query); -static void _pdo_prepare_delete(PDO * pdo, PDOStatement * statement); -static int _pdo_prepare_query(PDO * pdo, PDOStatement * statement, +static PDOStatement * _pdo_statement_new(PDO * pdo, char const * query); +static void _pdo_statement_delete(PDO * pdo, PDOStatement * statement); +static int _pdo_statement_query(PDO * pdo, PDOStatement * statement, DatabaseCallback callback, void * data, va_list args); @@ -77,9 +77,9 @@ DatabaseEngineDefinition database = _pdo_destroy, _pdo_get_last_id, _pdo_query, - _pdo_prepare_new, - _pdo_prepare_delete, - _pdo_prepare_query + _pdo_statement_new, + _pdo_statement_delete, + _pdo_statement_query }; @@ -210,14 +210,14 @@ static int64_t _pdo_get_last_id(PDO * pdo) /* useful */ -/* pdo_prepare_new */ -static PDOStatement * _pdo_prepare_new(PDO * pdo, char const * query) +/* pdo_statement_new */ +static PDOStatement * _pdo_statement_new(PDO * pdo, char const * query) { PDOStatement * statement; if((statement = object_new(sizeof(*statement))) == NULL) return NULL; - if((statement->statement = pdo->dplugin->prepare_new(pdo->database, + if((statement->statement = pdo->dplugin->statement_new(pdo->database, query)) == NULL) { object_delete(statement); @@ -227,20 +227,20 @@ static PDOStatement * _pdo_prepare_new(PDO * pdo, char const * query) } -/* pdo_prepare_delete */ -static void _pdo_prepare_delete(PDO * pdo, PDOStatement * statement) +/* pdo_statement_delete */ +static void _pdo_statement_delete(PDO * pdo, PDOStatement * statement) { - pdo->dplugin->prepare_delete(pdo->database, statement->statement); + pdo->dplugin->statement_delete(pdo->database, statement->statement); object_delete(statement); } -/* pdo_prepare_query */ -static int _pdo_prepare_query(PDO * pdo, PDOStatement * statement, +/* pdo_statement_query */ +static int _pdo_statement_query(PDO * pdo, PDOStatement * statement, DatabaseCallback callback, void * data, va_list args) { - return pdo->dplugin->prepare_query(pdo->database, statement->statement, - callback, data, args); + return pdo->dplugin->statement_query(pdo->database, + statement->statement, callback, data, args); } diff --git a/src/engines/pgsql.c b/src/engines/pgsql.c index 41d8694..4a47ace 100644 --- a/src/engines/pgsql.c +++ b/src/engines/pgsql.c @@ -36,7 +36,7 @@ typedef struct _DatabaseEngine Oid last; } PgSQL; -typedef struct _DatabaseStatement +typedef struct _DatabaseEngineStatement { PGresult * res; char * query; @@ -60,9 +60,9 @@ static int64_t _pgsql_get_last_id(PgSQL * pgsql); static int _pgsql_query(PgSQL * pgsql, char const * query, DatabaseCallback callback, void * data); -static PgSQLStatement * _pgsql_prepare_new(PgSQL * pgsql, char const * query); -static void _pgsql_prepare_delete(PgSQL * pgsql, PgSQLStatement * statement); -static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement, +static PgSQLStatement * _pgsql_statement_new(PgSQL * pgsql, char const * query); +static void _pgsql_statement_delete(PgSQL * pgsql, PgSQLStatement * statement); +static int _pgsql_statement_query(PgSQL * pgsql, PgSQLStatement * statement, DatabaseCallback callback, void * data, va_list args); @@ -76,9 +76,9 @@ DatabaseEngineDefinition database = _pgsql_destroy, _pgsql_get_last_id, _pgsql_query, - _pgsql_prepare_new, - _pgsql_prepare_delete, - _pgsql_prepare_query + _pgsql_statement_new, + _pgsql_statement_delete, + _pgsql_statement_query }; @@ -158,10 +158,10 @@ static int64_t _pgsql_get_last_id(PgSQL * pgsql) /* useful */ -/* pgsql_prepare_new */ -static void _prepare_new_adapt(char * q); +/* pgsql_statement_new */ +static void _statement_new_adapt(char * q); -static PgSQLStatement * _pgsql_prepare_new(PgSQL * pgsql, +static PgSQLStatement * _pgsql_statement_new(PgSQL * pgsql, char const * query) { PgSQLStatement * statement; @@ -178,25 +178,25 @@ static PgSQLStatement * _pgsql_prepare_new(PgSQL * pgsql, if(statement->query == NULL || q == NULL) { free(q); - _pgsql_prepare_delete(pgsql, statement); + _pgsql_statement_delete(pgsql, statement); return NULL; } /* adapt the statement for PostgreSQL */ - _prepare_new_adapt(q); + _statement_new_adapt(q); if((statement->res = PQprepare(pgsql->handle, query, q, 0, NULL)) == NULL || PQresultStatus(statement->res) != PGRES_COMMAND_OK) { error_set_code(1, "%s", PQerrorMessage(pgsql->handle)); free(q); - _pgsql_prepare_delete(pgsql, statement); + _pgsql_statement_delete(pgsql, statement); return NULL; } free(q); return statement; } -static void _prepare_new_adapt(char * query) +static void _statement_new_adapt(char * query) { int i; char * p; @@ -218,8 +218,8 @@ static void _prepare_new_adapt(char * query) } -/* pgsql_prepare_delete */ -static void _pgsql_prepare_delete(PgSQL * pgsql, +/* pgsql_statement_delete */ +static void _pgsql_statement_delete(PgSQL * pgsql, PgSQLStatement * statement) { (void) pgsql; @@ -230,8 +230,8 @@ static void _pgsql_prepare_delete(PgSQL * pgsql, } -/* pgsql_prepare_query */ -static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement, +/* pgsql_statement_query */ +static int _pgsql_statement_query(PgSQL * pgsql, PgSQLStatement * statement, DatabaseCallback callback, void * data, va_list args) { int ret = 0; diff --git a/src/engines/pgsqlpool.c b/src/engines/pgsqlpool.c index d00cdb1..946a6e0 100644 --- a/src/engines/pgsqlpool.c +++ b/src/engines/pgsqlpool.c @@ -37,9 +37,9 @@ DatabaseEngineDefinition database = _pgsql_destroy, _pgsql_get_last_id, _pgsql_query, - _pgsql_prepare_new, - _pgsql_prepare_delete, - _pgsql_prepare_query + _pgsql_statement_new, + _pgsql_statement_delete, + _pgsql_statement_query }; diff --git a/src/engines/sqlite2.c b/src/engines/sqlite2.c index 0e96d38..9cc2098 100644 --- a/src/engines/sqlite2.c +++ b/src/engines/sqlite2.c @@ -34,7 +34,7 @@ typedef struct _DatabaseEngine sqlite * handle; } SQLite2; -typedef struct _DatabaseStatement +typedef struct _DatabaseEngineStatement { char * query; } SQLite2Statement; @@ -51,10 +51,10 @@ static int64_t _sqlite2_get_last_id(SQLite2 * pgsql); static int _sqlite2_query(SQLite2 * pgsql, char const * query, DatabaseCallback callback, void * data); -static SQLite2Statement * _sqlite2_prepare_new(SQLite2 * pgsql, +static SQLite2Statement * _sqlite2_statement_new(SQLite2 * pgsql, char const * query); -static void _sqlite2_prepare_delete(SQLite2 * pgsql, SQLite2Statement * statement); -static int _sqlite2_prepare_query(SQLite2 * sqlite, +static void _sqlite2_statement_delete(SQLite2 * pgsql, SQLite2Statement * statement); +static int _sqlite2_statement_query(SQLite2 * sqlite, SQLite2Statement * statement, DatabaseCallback callback, void * data, va_list args); @@ -69,9 +69,9 @@ DatabaseEngineDefinition database = _sqlite2_destroy, _sqlite2_get_last_id, _sqlite2_query, - _sqlite2_prepare_new, - _sqlite2_prepare_delete, - _sqlite2_prepare_query + _sqlite2_statement_new, + _sqlite2_statement_delete, + _sqlite2_statement_query }; @@ -124,8 +124,8 @@ static int64_t _sqlite2_get_last_id(SQLite2 * sqlite) /* useful */ -/* _sqlite2_prepare_new */ -static SQLite2Statement * _sqlite2_prepare_new(SQLite2 * sqlite, +/* _sqlite2_statement_new */ +static SQLite2Statement * _sqlite2_statement_new(SQLite2 * sqlite, char const * query) { SQLite2Statement * statement; @@ -138,16 +138,16 @@ static SQLite2Statement * _sqlite2_prepare_new(SQLite2 * sqlite, } -/* _sqlite2_prepare_delete */ -static void _sqlite2_prepare_delete(SQLite2 * sqlite, SQLite2Statement * statement) +/* _sqlite2_statement_delete */ +static void _sqlite2_statement_delete(SQLite2 * sqlite, SQLite2Statement * statement) { string_delete(statement->query); object_delete(statement); } -/* _sqlite2_prepare_query */ -static int _sqlite2_prepare_query(SQLite2 * sqlite, +/* _sqlite2_statement_query */ +static int _sqlite2_statement_query(SQLite2 * sqlite, SQLite2Statement * statement, DatabaseCallback callback, void * data, va_list args) { diff --git a/src/engines/sqlite3.c b/src/engines/sqlite3.c index fc132e6..b6b40bd 100644 --- a/src/engines/sqlite3.c +++ b/src/engines/sqlite3.c @@ -34,7 +34,7 @@ typedef struct _DatabaseEngine sqlite3 * handle; } SQLite3; -typedef struct _DatabaseStatement +typedef struct _DatabaseEngineStatement { sqlite3_stmt * stmt; } SQLite3Statement; @@ -51,11 +51,11 @@ static int64_t _sqlite3_get_last_id(SQLite3 * sqlite3); static int _sqlite3_query(SQLite3 * sqlite3, char const * query, DatabaseCallback callback, void * data); -static SQLite3Statement * _sqlite3_prepare_new(SQLite3 * sqlite3, +static SQLite3Statement * _sqlite3_statement_new(SQLite3 * sqlite3, char const * query); -static void _sqlite3_prepare_delete(SQLite3 * sqlite3, +static void _sqlite3_statement_delete(SQLite3 * sqlite3, SQLite3Statement * statement); -static int _sqlite3_prepare_query(SQLite3 * sqlite3, +static int _sqlite3_statement_query(SQLite3 * sqlite3, SQLite3Statement * statement, DatabaseCallback callback, void * data, va_list args); @@ -70,9 +70,9 @@ DatabaseEngineDefinition database = _sqlite3_destroy, _sqlite3_get_last_id, _sqlite3_query, - _sqlite3_prepare_new, - _sqlite3_prepare_delete, - _sqlite3_prepare_query + _sqlite3_statement_new, + _sqlite3_statement_delete, + _sqlite3_statement_query }; @@ -123,8 +123,8 @@ static int64_t _sqlite3_get_last_id(SQLite3 * sqlite3) /* useful */ -/* _sqlite3_prepare_new */ -static SQLite3Statement * _sqlite3_prepare_new(SQLite3 * sqlite3, +/* _sqlite3_statement_new */ +static SQLite3Statement * _sqlite3_statement_new(SQLite3 * sqlite3, char const * query) { SQLite3Statement * statement; @@ -145,8 +145,8 @@ static SQLite3Statement * _sqlite3_prepare_new(SQLite3 * sqlite3, } -/* _sqlite3_prepare_delete */ -static void _sqlite3_prepare_delete(SQLite3 * sqlite3, +/* _sqlite3_statement_delete */ +static void _sqlite3_statement_delete(SQLite3 * sqlite3, SQLite3Statement * statement) { (void) sqlite3; @@ -157,8 +157,8 @@ static void _sqlite3_prepare_delete(SQLite3 * sqlite3, } -/* _sqlite3_prepare_query */ -static int _sqlite3_prepare_query(SQLite3 * sqlite3, +/* _sqlite3_statement_query */ +static int _sqlite3_statement_query(SQLite3 * sqlite3, SQLite3Statement * statement, DatabaseCallback callback, void * data, va_list args) { diff --git a/src/engines/template.c b/src/engines/template.c index c626ed6..accee0b 100644 --- a/src/engines/template.c +++ b/src/engines/template.c @@ -33,7 +33,7 @@ typedef struct _DatabaseEngine void * handle; } Template; -typedef struct _DatabaseStatement +typedef struct _DatabaseEngineStatement { char * query; } TemplateStatement; @@ -50,10 +50,10 @@ static int64_t _template_get_last_id(Template * pgsql); static int _template_query(Template * pgsql, char const * query, DatabaseCallback callback, void * data); -static TemplateStatement * _template_prepare_new(Template * pgsql, +static TemplateStatement * _template_statement_new(Template * pgsql, char const * query); -static void _template_prepare_delete(Template * pgsql, TemplateStatement * statement); -static int _template_prepare_query(Template * template, +static void _template_statement_delete(Template * pgsql, TemplateStatement * statement); +static int _template_statement_query(Template * template, TemplateStatement * statement, DatabaseCallback callback, void * data, va_list args); @@ -68,9 +68,9 @@ DatabaseEngineDefinition database = _template_destroy, _template_get_last_id, _template_query, - _template_prepare_new, - _template_prepare_delete, - _template_prepare_query + _template_statement_new, + _template_statement_delete, + _template_statement_query }; @@ -105,8 +105,8 @@ static int64_t _template_get_last_id(Template * template) /* useful */ -/* template_prepare_new */ -static TemplateStatement * _template_prepare_new(Template * template, +/* template_statement_new */ +static TemplateStatement * _template_statement_new(Template * template, char const * query) { TemplateStatement * statement; @@ -118,16 +118,16 @@ static TemplateStatement * _template_prepare_new(Template * template, } -/* template_prepare_delete */ -static void _template_prepare_delete(Template * template, TemplateStatement * statement) +/* template_statement_delete */ +static void _template_statement_delete(Template * template, TemplateStatement * statement) { string_delete(statement->query); object_delete(statement); } -/* template_prepare_query */ -static int _template_prepare_query(Template * template, +/* template_statement_query */ +static int _template_statement_query(Template * template, TemplateStatement * statement, DatabaseCallback callback, void * data, va_list args) { diff --git a/src/project.conf b/src/project.conf index ba802fb..4403852 100644 --- a/src/project.conf +++ b/src/project.conf @@ -1,17 +1,20 @@ subdirs=engines targets=libDatabase -cppflags_force=-I ../include +cppflags_force=-I../include cflags_force=`pkg-config --cflags libSystem` -fPIC cflags=-W -Wall -g -O2 -pedantic -D_FORTIFY_SOURCE=2 -fstack-protector-all ldflags_force=`pkg-config --libs libSystem` ldflags=-Wl,-z,relro -Wl,-z,now -dist=Makefile,python/project.conf,python/Makefile,python/libDatabase.c,python/libDatabase.py +dist=Makefile,database.h,python/project.conf,python/Makefile,python/libDatabase.c,python/libDatabase.py [libDatabase] type=library -sources=database.c +sources=database.c,statement.c install=$(LIBDIR) [database.c] -depends=../include/Database/database.h,../config.h +depends=../include/Database/database.h,../include/Database/engine.h,database.h,../config.h cppflags=-D PREFIX=\"$(PREFIX)\" -D LIBDIR=\"$(LIBDIR)\" + +[statement.c] +depends=../include/Database/database.h,../include/Database/statement.h,database.h diff --git a/src/statement.c b/src/statement.c new file mode 100644 index 0000000..6786ded --- /dev/null +++ b/src/statement.c @@ -0,0 +1,76 @@ +/* $Id$ */ +/* Copyright (c) 2019 Pierre Pronchery */ +/* This file is part of DeforaOS Database libDatabase */ +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + + + +#include +#include +#include "Database/engine.h" +#include "Database/statement.h" +#include "database.h" + + +/* DatabaseStatement */ +/* private */ +/* types */ +struct _DatabaseStatement +{ + Database * database; + DatabaseEngineStatement * statement; +}; + + +/* public */ +/* functions */ +/* databasestatement_new */ +DatabaseStatement * databasestatement_new(Database * database, + char const * query) +{ + DatabaseStatement * statement; + + if((statement = object_new(sizeof(*statement))) == NULL) + return NULL; + statement->database = database; + if(database_engine_statement_new(database, query) != 0) + { + object_delete(statement); + return NULL; + } + return statement; +} + + +/* databasestatement_delete */ +void databasestatement_delete(DatabaseStatement * statement) +{ + database_engine_statement_delete(statement->database, + statement->statement); + object_delete(statement); +} + + +/* databasestatement_query */ +int databasestatement_query(DatabaseStatement * statement, + DatabaseCallback callback, void * data, ...) +{ + int ret; + va_list args; + + va_start(args, data); + ret = database_engine_statement_query(statement->database, + statement->statement, callback, data, args); + va_end(args); + return ret; +}