Hi Jay, Wow, thanks for your detailed message below.....much appreciated ;-)
I will try the PRAGMA and also the "msg_seq".....great..... Lynton On 10/05/2011 19:00, Jay A. Kreibich wrote: > On Tue, May 10, 2011 at 12:42:14PM +0200, Lynton Grice scratched on the wall: >> Hi all, >> >> Thanks for your comments...much appreciated...... >> >> BTW: if I am using SQLIte as a logger, what PRAGMA statement can I use >> to say FIX the sqlite database size to say "5 MB"? > PRAGMA max_page_count = N > > http://www.sqlite.org/pragma.html#pragma_max_page_count > > This simply fixes the total size of the database. If you attempt to > perform an operation (such as an INSERT) that would push it over the > limit, you get an out-of-space error. > > This PRAGMA needs to be set every time the database is opened. > >> Also, lets say I have a AUTOINCREMENT INTEGER PRIMARY KEY, what will >> happen when it reaches 5 MB? Will it just keep returning SQLITE_FULL or >> similar? > Yes. > >> I guess I am looking for a "round robin queue" here? > I'd do something like this. This keeps a constant number of messages > in the log. The "msg_id" provides a message counter, while the > "msg_seq" is used to keep the round-robin offset. The use of a view > is required to enable a INSTEAD OF trigger. There might be a way to > do this directly against the a table, but I'm not all that > experienced with SQLite triggers. > > =========================================================================== > > -- Create storage table: > CREATE TABLE log_t ( > msg_id INTEGER PRIMARY KEY AUTOINCREMENT, > msg_seq INTEGER UNIQUE, > time TEXT DEFAULT CURRENT_TIMESTAMP, > msg TEXT ); > > -- Init sqlite_sequence table: > INSERT INTO log_t ( msg_seq, msg ) VALUES ( -1, 'init' ); > DELETE FROM log_t WHERE msg_seq = -1; > > -- Create view: > CREATE VIEW log AS SELECT msg_id, msg_seq, time, msg FROM log_t; > > CREATE TRIGGER log_seq_trg > INSTEAD OF INSERT ON log > FOR EACH ROW > BEGIN > INSERT OR REPLACE INTO log_t ( msg_seq, msg ) VALUES ( > ( SELECT seq + 1 FROM sqlite_sequence WHERE name = 'log_t' ) % > > -- THIS VALUE CONTROLS THE NUMBER OF MESSAGES KEPT IN THE LOG: > 10, > > NEW.msg ); > END; > > =========================================================================== > > To test: > > =========================================================================== > INSERT INTO log ( msg ) VALUES ( 'a' ); > INSERT INTO log ( msg ) VALUES ( 'b' ); > INSERT INTO log ( msg ) VALUES ( 'c' ); > INSERT INTO log ( msg ) VALUES ( 'd' ); > INSERT INTO log ( msg ) VALUES ( 'e' ); > INSERT INTO log ( msg ) VALUES ( 'f' ); > INSERT INTO log ( msg ) VALUES ( 'g' ); > INSERT INTO log ( msg ) VALUES ( 'h' ); > INSERT INTO log ( msg ) VALUES ( 'i' ); > INSERT INTO log ( msg ) VALUES ( 'j' ); > INSERT INTO log ( msg ) VALUES ( 'k' ); > INSERT INTO log ( msg ) VALUES ( 'l' ); > INSERT INTO log ( msg ) VALUES ( 'm' ); > INSERT INTO log ( msg ) VALUES ( 'n' ); > INSERT INTO log ( msg ) VALUES ( 'o' ); > INSERT INTO log ( msg ) VALUES ( 'p' ); > INSERT INTO log ( msg ) VALUES ( 'q' ); > INSERT INTO log ( msg ) VALUES ( 'r' ); > INSERT INTO log ( msg ) VALUES ( 's' ); > INSERT INTO log ( msg ) VALUES ( 't' ); > INSERT INTO log ( msg ) VALUES ( 'u' ); > INSERT INTO log ( msg ) VALUES ( 'v' ); > INSERT INTO log ( msg ) VALUES ( 'w' ); > INSERT INTO log ( msg ) VALUES ( 'x' ); > INSERT INTO log ( msg ) VALUES ( 'y' ); > INSERT INTO log ( msg ) VALUES ( 'z' ); > =========================================================================== > > sqlite> SELECT * FROM log; > 18|8|2011-05-10 13:38:14|q > 19|9|2011-05-10 13:38:14|r > 20|0|2011-05-10 13:38:14|s > 21|1|2011-05-10 13:38:14|t > 22|2|2011-05-10 13:38:14|u > 23|3|2011-05-10 13:38:14|v > 24|4|2011-05-10 13:38:14|w > 25|5|2011-05-10 13:38:14|x > 26|6|2011-05-10 13:38:14|y > 27|7|2011-05-10 13:38:14|z > > =========================================================================== > > Note that because I'm grabbing the msg_seq value out of the > sqlite_sequence table, there is some chance of minor screw-ups if the > logging system is deeply involved in transactions and check-points > that might invalidate a sequence number. Don't do that. > > >> While I'm on it, if I have an AUTOINCREMENT INTEGER PRIMARY KEY with a >> LOGGER implementation, and the integer reaches it's limit > It won't. It's a 63 bit value**. Even if you're inserting a million > rows per second, it will take almost 300,000 years to run out of > numbers. The only way you'll run out is if a very high value is > manually inserted, throwing off the sequence. > > ** OK, technically it is a 64 bit signed value, but sequences start > at 1 by default, limiting them to half the number domain-- hence 63. > >> will the sqlite database assign "un-used >> primary keys" (previously deleted) to any NEW inserts? > No, not with an AUTOINCREMENT: http://www.sqlite.org/autoinc.html > > "If the table has previously held a row with the largest possible > ROWID, then new INSERTs are not allowed and any attempt to insert > a new row will fail with an SQLITE_FULL error." > > > > -j > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users