Hello!

This may be used for table versioning and replication.

Source code is available here
http://mobigroup.ru/files/sqlite-ext/

You can get from the debian repository the SQLite build with some extra 
extensions:
deb http://mobigroup.ru/debian/ lenny main contrib non-free
deb-src http://mobigroup.ru/debian/ lenny main contrib non-free

=========Test script==============
CREATE TABLE sessions (
    key text not null,
    value text not null
);
insert into sessions (key,value) values ('test key 0','test value 0');

select versioning_table('sessions');
.schema
select * from _versioning_sessions;

insert into sessions (key,value) values ('test key 1','test value 1');
insert into sessions (key,value) values ('test key 2','test value 2');
select * from _versioning_sessions;

delete from sessions;
select * from _versioning_sessions;

select unversioning_table('sessions');
.schema

==========Test script results=========
sqlite> CREATE TABLE sessions (                   
   ...>     key text not null,                    
   ...>     value text not null
   ...> );
sqlite> insert into sessions (key,value) values ('test key 0','test value 0');
sqlite>
sqlite> select versioning_table('sessions');

sqlite> .schema
CREATE TABLE _undo(sql TEXT, status TEXT);
CREATE TABLE _versioning_sessions(key text,value text, _date REAL, _action 
TEXT, _rowid INTEGER);
CREATE TABLE sessions (
    key text not null,
    value text not null
);
CREATE TRIGGER _versioning_sessions_d AFTER DELETE ON sessions BEGIN INSERT 
INTO _versioning_sessions (_date, _action, _rowid) values (julianday('now'), 
'D', old.rowid);END;
CREATE TRIGGER _versioning_sessions_i AFTER INSERT ON sessions BEGIN INSERT 
INTO _versioning_sessions SELECT *, julianday('now') as _date, 'I' as _action, 
new.rowid as _rowid FROM sessions WHERE rowid=new.rowid;END;
CREATE TRIGGER _versioning_sessions_u AFTER UPDATE ON sessions BEGIN INSERT 
INTO _versioning_sessions SELECT *, julianday('now') as _date, 'U' as _action, 
new.rowid as _rowid FROM sessions WHERE rowid=new.rowid;END;
sqlite> select * from _versioning_sessions;
test key 0|test value 0|2455027.00753221|I|1
sqlite>
sqlite> insert into sessions (key,value) values ('test key 1','test value 1');
sqlite> insert into sessions (key,value) values ('test key 2','test value 2');
sqlite> select * from _versioning_sessions;
test key 0|test value 0|2455027.00753221|I|1
test key 1|test value 1|2455027.00753347|I|2
test key 2|test value 2|2455027.00753368|I|3
sqlite>
sqlite> delete from sessions;
sqlite> select * from _versioning_sessions;
test key 0|test value 0|2455027.00753221|I|1
test key 1|test value 1|2455027.00753347|I|2
test key 2|test value 2|2455027.00753368|I|3
||2455027.00753382|D|1
||2455027.00753382|D|2
||2455027.00753382|D|3
sqlite>
sqlite> select unversioning_table('sessions');

sqlite> .schema
CREATE TABLE _undo(sql TEXT, status TEXT);
CREATE TABLE _versioning_sessions(key text,value text, _date REAL, _action 
TEXT, _rowid INTEGER);
CREATE TABLE sessions (
    key text not null,
    value text not null
);
sqlite> select * from _versioning_sessions;
test key 0|test value 0|2455027.00753221|I|1
test key 1|test value 1|2455027.00753347|I|2
test key 2|test value 2|2455027.00753368|I|3
||2455027.00753382|D|1
||2455027.00753382|D|2
||2455027.00753382|D|3
==============================

Best regards, Alexey Pechnikov.
http://pechnikov.tel/
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to