Sorry I send it before time...

2009/9/2 Alejandro Ruiz-Oriol <aruiz...@itelsys.com>

> Ok, I got it!!
>
> In my php functions I use this code to connect to the DB (its in an include
> file)
>
> function OpenDB()
>
   {

>     $dbh=$GLOBALS['dbh'];    // Get Global Handle
>     if ($dbh==null)        // First time? no Handle?
>     {
>         $dbh = new PDO('sqlite:/var/www/db.sqlite'); // Create new handle
>         $GLOBALS['dbh'];     // Save it in globals
>         include_once("/var/www/arduino/sqlite_functions.php"); // Include
> al the functions needed
>         $dbh->sqliteCreateFunction('Test','Test'); // Register functions
>
>     }
>
>     return($dbh);   // Return Handle
> }
>

 You are right, it's quite complicated, what I'm creating it's some kind of
"state machine" and if I do it this way, it's very easy to the rest of the
code to change states (just insert the new state in the DB) and a State
change can trigger diferent actions that can cause state changes again. So,
doing it this way, the client process only needs to know what state it wants
to change.

Thx for your help and advise!!!

>
> 2009/9/1 Kees Nuyt <k.n...@zonnet.nl>
>
> On Tue, 1 Sep 2009 09:51:39 +0200, Alejandro Ruiz-Oriol
>> <aruiz...@itelsys.com> wrote:
>>
>> >Yes, but how do I know in the PHP fired by the trigger what's the PHP
>> >context of his "parent"?.
>> >
>> >Let me explain it.
>> >
>> >Inside the trigger I excute something like
>> >
>> >select test();
>> >
>> >where test is a registered php function.
>> >
>> >When the trigger fires, the php function gets called, but the first thing
>> I
>> >need to have is a database handler. Right know, the first thing I  do in
>> >that test php is:
>> >
>> >$dbh = new PDO('sqlite:mydb.sqlite');
>> >
>> >so that creates a new (an different) context, then if I try to:
>> >
>> >$res=$dbh->query("update set field=1 from same_table_that fired_the
>> >trigger");
>> >
>> >I run in a deadlock, the first trigger is locking the table, and I'm
>> waiting
>> >for that trigger to relese the lock. This will only end by time-out with
>> the
>> >error "Database locked".
>> >
>> >so, how can the php fired by a trigger knows whats the php sqlite context
>> of
>> >its caller??
>>
>> You have a php script. It opens a database handle and
>> registers a function. Then it executes some SQL code which
>> fires a trigger, which in his turn calls your registered
>> function.
>> All these nested calls execute in the same context, not
>> asynchronically. So the database handle you opened in the
>> top level is still valid when your registered function is
>> called. In other words, you don't have to open a second
>> handle.
>>
>> Opening a second handle and starting a transaction causes
>> the lock.
>>
>> How the function gets the handle is another matter.
>> If $dbh is a global variable you could simply use that.
>>
>> All in all, it is quite complicated, probably too
>> complicated. Are you sure your registered function really
>> needs to use the database handle?
>> Can't you just use SQL in the trigger, and restrict the
>> function to what functions are useful for, like calculations
>> which can't be donein SQL or aggregation tasks?
>> --
>>   (  Kees Nuyt
>>  )
>> c[_]
>> _______________________________________________
>> 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