Paul wrote:
>> Paul wrote:
>>> How do you check if structure is initializad in an abstract databse?
>
> struct SqliteDatabase {
> ...
>
> /// Callback is called once database is created. Strictly one time.
> virtual bool on_create();
> ...
> };
>
> struct FooDatabase : public SqliteDatabase
> {
> bool on_create()
> {
> return EXEC_SQL("CREATE TABLE foo (id INTEGER);");
> }
>
> };
SQLiteDatabase::open(filename) // or constructor
{
sqlite3_open_v2(...filename...);
EXEC_SQL("BEGIN");
if (database_is_empty())
on_create();
EXEC_SQL("COMMIT");
// error handling omitted
}
> Note: I cannot wrap *on_create* in transaction because I want to allow user
> who
> specifies his own *on_create* callback to be able to use transactions there.
> ... When database is missing I create lock file ...
So you are creating *another* transaction mechanism on top of the
existing one?
The important thing is that the if() and the on_create() _must_ execute
atomically. The easiest way to do this is to use the existing
transaction mechanism.
If you want to allow transactions in on_create(), you should implement
nested transactions, i.e., your own begin()/etc. functions issue SQL
commands only at the outermost level, and let that transaction succeed
only if all nested transactions succeeded.
> So my motivation was to check if community has some standard solutions.
As it happens, this is pretty much the mechanism used by Android's
SQLiteOpenHelper class.
Regards,
Clemens
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users