This looks like a great solution. Just another point,
what if I want to fill this "ring buffer" automatically by using triggers on 
other tables, and be able to reset the counter of the ring buffer when I 
arrive at the max integer value of the primary key.
For example :

-- the table to be used as a fifo
create table fifo (
    id integer primary key autoincrement,
    data varchar
);

-- table to store the fifo size limit
create table fifo_size (
    max_entries integer
);

-- set the maximum size of the fifo
-- this can be changed latter
insert into fifo_size values(5);

-- remove any records beyond the fifo size limit
-- whenever the limit is changed
create trigger fifo_resize after update on fifo_size
begin
    delete from fifo
    where id <= (select max(id) from fifo) - (select max_entries from 
fifo_size);
end;

-- remove oldest record from the fifo
-- after each insert into the fifo
create trigger fifo_limit after insert on fifo
begin
    delete from fifo
    where id <= (select max(id) from fifo) - (select max_entries from 
fifo_size);
end;

--Create table for any data storage
CREATE TABLE Data (ID PRIMARY KEY AUTOINCREMENT, FirstName VARCHAR, LastName 
VARCHAR);

--Create trigger on Data table when an event occurs on one of the fields
CREATE TRIGGER Data_Update AFTER UPDATE OF FirstName ON Data
BEGIN
  INSERT INTO fifo VALUES (NULL, new.FirstName);
-----------------------
-- There, what if I get the error SQLITE_FULL while the INSERT INTO Data 
request???
  
-- I'm really not sure of the syntax, but could this work?
-----------------------
  ON CONFLICT UPDATE fifo SET ID = ID - (SELECT MIN(ID)-1 FROM fifo);
  INSERT INTO fifo VALUES (NULL, new.FirstName);

END;

Regards

Julien


Le jeudi 22 Décembre 2005 18:02, Dennis Cote a écrit :
> Adler, Eliedaat wrote:
> >>Sean Wrote ===
> >>I'm considering using SQLLite for an embedded project.  Some of the
> >
> >data I'd like to store is timestamped sensor readings.  I'd like to know
> >if there is a way to >configure a table so that it acts like a fixed
> >length FIFO queue, e.g. stores 10,000 records then once full drops off
> >the oldest record each time a new one is inserted.
> >
> >.>Can anyone tell me if we can do that with SQLLite?
> >=====
> >
> >You could use a simple trigger (example for queue of size 10000 below)
> >and a self-incrementing key column:
> >
> >    create table myqueue (limit_id integer not null primary key, myvalue
> >integer) ;
> >
> >    create trigger queue_limit after insert on myqueue
> >    begin
> >        update myqueue set limit_id = limit_id-1 where (select
> >max(limit_id) from myqueue ) > 10000;
> >        delete from myqueue where limit_id <=0 ;
> >     end ;
> >
> >INSERT TO MYQUEUE:
> >    insert into myqueue (myvalue) values (1) ;
> >    insert into myqueue (myvalue) values(2) ;
> >    ......
> >    insert into myqueue (myvalue) values (10050) ;
> >RESULTS:
> >limit_id    myvalue
> >1                51
> >2                52
> >.....
> >10000         10050
> >
> >Note: Its not very efficient.
> >
> >Regards,
> >Eli
>
> The following SQL should do what you want. It is also quite efficient
> because it always uses the implicit index associated with the integer
> primary key field, and usually only touches the first or last record.
>
> -- the table to be used as a fifo
> create table fifo (
>     id integer primary key autoincrement,
>     data varchar
> );
>
> -- remove oldest record from the fifo
> -- after each insert into the fifo
> create trigger fifo_limit after insert on fifo
> begin
>     delete from fifo
>     where id <= (select max(id) from fifo) - 10000; -- max size is 10000
> end;
>
> The following slightly more complicated version allows the size of the
> fifo to be changed on the fly.
>
> -- the table to be used as a fifo
> create table fifo (
>     id integer primary key autoincrement,
>     data varchar
> );
>
> -- table to store the fifo size limit
> create table fifo_size (
>     max_entries integer
> );
>
> -- set the maximum size of the fifo
> -- this can be changed latter
> insert into fifo_size values(5);
>
> -- remove any records beyond the fifo size limit
> -- whenever the limit is changed
> create trigger fifo_resize after update on fifo_size
> begin
>     delete from fifo
>     where id <= (select max(id) from fifo) - (select max_entries from
> fifo_size);
> end;
>
> -- remove oldest record from the fifo
> -- after each insert into the fifo
> create trigger fifo_limit after insert on fifo
> begin
>     delete from fifo
>     where id <= (select max(id) from fifo) - (select max_entries from
> fifo_size);
> end;
>
> The following is a sample run of the second version using fifo sizes of
> 5 and 8 for demonstration.
>
> insert into fifo values(NULL, 'one');
> insert into fifo values(NULL, 'two');
> insert into fifo values(NULL, 'three');
> select * from fifo;
> 1|one
> 2|two
> 3|three
> insert into fifo values(NULL, 'four');
> insert into fifo values(NULL, 'five');
> insert into fifo values(NULL, 'six');
> select * from fifo;
> 2|two
> 3|three
> 4|four
> 5|five
> 6|six
> insert into fifo values(NULL, 'seven');
> insert into fifo values(NULL, 'eight');
> insert into fifo values(NULL, 'nine');
> select * from fifo;
> 5|five
> 6|six
> 7|seven
> 8|eight
> 9|nine
> update fifo_size set max_entries = 8;
> insert into fifo values(NULL, 'ten');
> insert into fifo values(NULL, 'eleven');
> insert into fifo values(NULL, 'twelve');
> select * from fifo;
> 5|five
> 6|six
> 7|seven
> 8|eight
> 9|nine
> 10|ten
> 11|eleven
> 12|twelve
> insert into fifo values(NULL, 'thirteen');
> insert into fifo values(NULL, 'fourteen');
> insert into fifo values(NULL, 'fifteen');
> select * from fifo;
> 8|eight
> 9|nine
> 10|ten
> 11|eleven
> 12|twelve
> 13|thirteen
> 14|fourteen
> 15|fifteen
>
> For either case, the fifo table can eventually exhaust the available id
> values (after a very long time because of the 64 bit id values). If this
> happens you will receive an SQLITE_FULL error when you try to do an
> insert (because of the autoincrement constraint on the id). When this
> happens you will need to run the following update to reset the lowest id
> to 1 before repeating the failed insert.
>
> update fifo
>     set id = id - (select min(id) - 1 from fifo);
>
> HTH
> Dennis Cote

-- 
----------------------------
Julien LEFORT
Com2gether
16, Allée de la verte vallée
14000 CAEN
tel : +33 2 31 15 61 42
fax : +33 2 31 53 76 14

Reply via email to