Grr.  Copy/paste error.  The create statement was:

CREATE TABLE t (id INTEGER PRIMARY KEY AUTOINCREMENT, config TEXT);

On Thu, Apr 17, 2008 at 5:20 PM, Scott Hess <[EMAIL PROTECTED]> wrote:
> Just to be clear on "try it out", I mean something like the following,
> where A) is in one shell, and B) in another.
>
> A) ...> ./sqlite3 test.db
> A) sqlite> CREATE TABLE t (id INTEGER AUTOINCREMENT PRIMARY KEY NOT
> NULL, config TEXT);
> B) ...> ./sqlite3 test.db
> B) sqlite> BEGIN;
> A) sqlite> BEGIN;
> A) sqlite> INSERT INTO t (id, config) VALUES (null, 'connection a');
> B) sqlite> INSERT INTO t (id, config) VALUES (null, 'connection b');
> B) SQL error: database is locked
>
> -scott
>
> On Thu, Apr 17, 2008 at 5:17 PM, Scott Hess <[EMAIL PROTECTED]> wrote:
>> What will happen if you use BEGIN is that multiple users can get into
>> the configuration mode, but once one user gets past BEGIN and runs
>> anything which updates the database, the updates in other transactions
>> will start throwing SQLITE_LOCKED.  Spin up two sqlite3 command-line
>> tools against the same database and check it out.
>>
>> If you use BEGIN IMMEDIATE, then this problem won't occur, because
>> multiple threads can't get past BEGIN IMMEDIATE on the same database
>> in the first place :-).
>>
>> What you have is basically a revision-control problem.  If you let
>> multiple users configure at the same time, you're going to handle
>> merging the config changes in a sensible way and handle conflicts.
>>
>> -scott
>>
>>
>> On Thu, Apr 17, 2008 at 5:08 PM, Alex Katebi <[EMAIL PROTECTED]> wrote:
>>> Scott,
>>>
>>>   Every user will have thier own sqlite connection. So multiple users are
>>> allowed for configuration. There will be one router connection to actually
>>> act on the commited configurations. The router will act on
>>> individual configuration rows. The router and the users interact with each
>>> other via the database file only. They run on seperate processes. All the
>>> router sees is configuration rows being inserted deleted or updated by
>>> whomever. It does not care. So here is my next question. If I have temporary
>>> triggers for the CLI users to keep track of the uncommited rows. Then I have
>>> another temoprary trigger for the router to act on the configurations after
>>> being committed, would this work?  Would the temporary trigger in the router
>>> connection actually trigger? I guess I need to try this out.
>>>
>>>   This is my own home project. I am my own boss. Once I have my design
>>> figured out I will post it for analysis.
>>>
>>> Thanks,
>>> -Alex
>>>
>>>
>>> On Thu, Apr 17, 2008 at 7:26 PM, Scott Hess <[EMAIL PROTECTED]> wrote:
>>>
>>>> OK.  I suspect that you might find exposing the SQLite transaction
>>>> semantics as part of your user interface may be ... unsatisfactory.
>>>> For instance, by keeping a long-lived transaction in this way, you
>>>> cannot set any of the _other_ data in the config and commit it.  This
>>>> would include other users, so, for instance, while one user is
>>>> configuring something really complex, like firewall rules, another
>>>> user would not be able to set the timezone, or turn on logging, or
>>>> something like that.  I don't know, this may be satisfactory, but it
>>>> seems like a regrettable thing to design into the system at such a low
>>>> level (not letting multiple people configure so that they don't screw
>>>> up is good, but not allowing it just because your design didn't allow
>>>> it, less good).
>>>>
>>>> As an alternative, you might consider layering your config-management
>>>> over something like the undo/redo example (*).  Since this is more
>>>> explicit (_you_ craft the structures in terms of SQLite, rather than
>>>> relying on SQLite's internal semantics), when upper management comes
>>>> to you with some crazy feature request which does not conform to the
>>>> SQL transaction model, you'll be able to change things without too
>>>> much pain.
>>>>
>>>> -scott
>>>>
>>>> (*) http://www.sqlite.org/cvstrac/wiki?p=UndoRedo
>>>>
>>>>
>>>> On Thu, Apr 17, 2008 at 3:56 PM, Alex Katebi <[EMAIL PROTECTED]>
>>>> wrote:
>>>> >   I am glad you asked. I am designing an interactive command line
>>>> > interface to an ip router. A user will begin a transaction and start
>>>> > configuring. At any time he can query for his configurations since the
>>>> > begining of the transaction. When he is satisfied with his configuration
>>>> he
>>>> > will commit the configuration. After this his query should show nothing
>>>> > until he begins another transaction. Also he might press the ?mark key
>>>> on
>>>> > his keyboard at anytime for help information or tab key for automatic
>>>> > command token completion.
>>>> >
>>>> > So I will have to know what are the list of commands since the beginning
>>>> > of his transaction.
>>>> >
>>>> >
>>>> >
>>>> > On Thu, Apr 17, 2008 at 3:53 PM, Scott Hess <[EMAIL PROTECTED]> wrote:
>>>> >
>>>> >> I don't mean in a separate database table - I mean in an in-memory
>>>> >> hashtable or array or something of the sort.  Depending on what the
>>>> >> real goal you're trying to accomplish is, you might use triggers to
>>>> >> call  custom function to accomplish this.
>>>> >>
>>>> >> You presumably desire to get this information in the interests of
>>>> >> implementing a solution to a problem.  You should perhaps post asking
>>>> >> for suggestions on how to solve the problem.  I think the question
>>>> >> itself probably indicates that there's a disconnect in how you're
>>>> >> trying to model the problem, but without knowing what the problem is,
>>>> >> it's hard to do much.
>>>> >>
>>>> >> -scott
>>>> >>
>>>> >> On Thu, Apr 17, 2008 at 12:43 PM, Alex Katebi <[EMAIL PROTECTED]>
>>>> >> wrote:
>>>> >> > The reason I did not keep track in a seperate table was because I
>>>> wanted
>>>> >> to
>>>> >> > do it using triggers. But triggers don't trigger until commit.
>>>> >> >
>>>> >> > On Thu, Apr 17, 2008 at 3:36 PM, Scott Hess <[EMAIL PROTECTED]> wrote:
>>>> >> >
>>>> >> >> Until the data is committed, it's not really in the database.  If
>>>> you
>>>> >> >> crash, it will be rolled back.  So if it's really important to know
>>>> >> >> what data has been written to the database but not committed, why
>>>> >> >> don't you just track what you're writing to the database in an
>>>> >> >> in-memory data structure of some sort?  Or, to save space, just
>>>> track
>>>> >> >> the rowid of the rows you modify.
>>>> >> >>
>>>> >> >> -scott
>>>> >> >>
>>>> >> >>
>>>> >> >> On Thu, Apr 17, 2008 at 12:33 PM, Alex Katebi <[EMAIL PROTECTED]
>>>> >
>>>> >> >> wrote:
>>>> >> >> > Hi Richard,
>>>> >> >> >
>>>> >> >> > create table t1 (name);
>>>> >> >> > insert into t1 values ('Alex');
>>>> >> >> > begin;
>>>> >> >> > insert into t1 values ('Richard');
>>>> >> >> > select * from t1;
>>>> >> >> >
>>>> >> >> > How can I select only the second row in the above example?
>>>> >> >> > If there is not an easy way to do this I would probably have to
>>>> use
>>>> >> >> another
>>>> >> >> > connection then diff the two selects right?
>>>> >> >> >
>>>> >> >> > Thanks,
>>>> >> >> > -Alex
>>>> >> >> >
>>>> >> >> >
>>>> >> >> >
>>>> >> >> >
>>>> >> >> >
>>>> >> >> > On Thu, Apr 17, 2008 at 2:38 PM, D. Richard Hipp <[EMAIL 
>>>> >> >> > PROTECTED]>
>>>> >> wrote:
>>>> >> >> >
>>>> >> >> >>
>>>> >> >> >> On Apr 17, 2008, at 2:35 PM, Alex Katebi wrote:
>>>> >> >> >> > Is there a way to select rows that have not been committed yet?
>>>> >> >> >> >
>>>> >> >> >>
>>>> >> >> >> No.  SQLite doesn't really commit rows.  It commits pages.  A
>>>> >> >> >> single page might hold multiple rows, only some of which might
>>>> >> >> >> have changed.  Or a single row might span multiple pages.
>>>> >> >> >>
>>>> >> >> >>
>>>> >> >> >> D. Richard Hipp
>>>> >> >> >> [EMAIL PROTECTED]
>>>> >> >> >>
>>>> >> >> >>
>>>> >> >> >>
>>>> >> >> >> _______________________________________________
>>>> >> >> >> sqlite-users mailing list
>>>> >> >> >> sqlite-users@sqlite.org
>>>> >> >> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >> >> >>
>>>> >> >> > _______________________________________________
>>>> >> >> > sqlite-users mailing list
>>>> >> >> > sqlite-users@sqlite.org
>>>> >> >> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >> >> >
>>>> >> >> _______________________________________________
>>>> >> >> sqlite-users mailing list
>>>> >> >> sqlite-users@sqlite.org
>>>> >> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >> >>
>>>> >> > _______________________________________________
>>>> >> > sqlite-users mailing list
>>>> >> > sqlite-users@sqlite.org
>>>> >> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >> >
>>>> >> _______________________________________________
>>>> >> sqlite-users mailing list
>>>> >> sqlite-users@sqlite.org
>>>> >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >>
>>>> > _______________________________________________
>>>> > sqlite-users mailing list
>>>> > sqlite-users@sqlite.org
>>>> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>> >
>>>> _______________________________________________
>>>> sqlite-users mailing list
>>>> sqlite-users@sqlite.org
>>>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>>
>>> _______________________________________________
>>> sqlite-users mailing list
>>> sqlite-users@sqlite.org
>>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>>
>>
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to