I am ready to rebuild sqlite3 with the foreign_key support enabled as default. to do this, I should UNDEFINE SQLITE_OMIT_FOREIGN_KEY. I can't find a decent way to do this undef. I use g++ on linux.
Thanks, Shalom On Thu, Mar 24, 2011 at 7:41 AM, Shalom Elkin <[email protected]>wrote: > Sorry - it doesn't work. > sqlite3_exec with the pragma directive returns no error, but the program > still agrees to insert a record that violates foreign_key constraint. > > Here is the tables creation > ============== > CREATE TABLE people( > id integer, > nm text); > INSERT INTO "people" VALUES(1,'Jack'); > INSERT INTO "people" VALUES(2,'Jill'); > CREATE TABLE activity( > aid integer, > act text, > foreign key (aid) references people(id) > ); > ============= > Here's the simple c++ program (it is actually c...) > ============ > #include <stdio.h> > #include <sqlite3.h> > #include <unistd.h> > int main(int argc, char **argv){ > sqlite3 *db; > char *zErrMsg = 0,*P0; > const char *Q0; > const char *Z0= {"insert into activity values (1,\"play\")"}; > const char *Z1= {"insert into activity values (3,\"eat\")"}; > int rc; > if( argc<2 ){ > fprintf(stderr, "Usage: %s DATABASE\n", argv[0]); > return 101; > } > //open > rc = sqlite3_open(argv[1], &db); > if( rc ){ > fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); > return 111; > } > rc = sqlite3_exec(db,"PRAGMA foreign_keys = ON;",NULL,NULL,&P0); > printf("pragma returns &d |%s|\n",rc,P0); > //clear > rc = sqlite3_exec(db,"delete from activity;",NULL,NULL,&P0); > // > rc = sqlite3_exec(db,"begin transaction;",NULL,NULL,&P0); > rc = sqlite3_exec(db,Z0,NULL,NULL,&P0); > Q0 = sqlite3_errmsg(db); > printf("|%s| - should succeed : %d,|%s|=>|%s|\n",Z0,rc,P0,Q0); > // > rc = sqlite3_exec(db,Z1,NULL,NULL,&P0); > Q0 = sqlite3_errmsg(db); > printf("|%s| - should fail : %d,|%s|=>|%s|\n",Z1,rc,P0,Q0); > rc = sqlite3_exec(db,"commit;",NULL,NULL,&P0); > sqlite3_close(db); > } > ========= > and the results: > [shalom@pato sqlite]$ ./porta tik > pragma returns &d |(null)| > |insert into activity values (1,"play")| - should succeed : > 0,|(null)|=>|not an error| > |insert into activity values (3,"eat")| - should fail : 0,|(null)|=>|not an > error| > [shalom@pato sqlite]$ sqlite3 tik "select * from activity" > 1|play > 3|eat > ============= > > ???? > > Shalom > On Thu, Mar 24, 2011 at 1:48 AM, BareFeetWare > <[email protected]>wrote: > >> On 24/03/2011, at 2:50 AM, Shalom Elkin wrote: >> >> > I appreciate the input. Some of the advice comes obviously from very >> good >> > and talented people who find a challenge at doing things WITHOUT >> reverting >> > to code writing. >> >> Doing as much (or most often, all) of the logic in SQL (instead of >> application code) removes a level of complexity, but is also generally >> faster and internally consistent. >> >> > I did a small program. Current show -stopper : >> > >> > what is the API equivalent of >> > >> > PRAGMA foreign_keys = ON; >> >> You can just send each of the SQL commands, including the pragma >> statement, in sqlite_exec (or you can get fancy with sqlite_prepare etc >> where it makes sense). >> >> Tom >> BareFeetWare >> >> -- >> iPhone/iPad/iPod and Mac software development, specialising in databases >> [email protected] >> -- >> Comparison of SQLite GUI tools: >> http://www.barefeetware.com/sqlite/compare/?ml >> >> _______________________________________________ >> sqlite-users mailing list >> [email protected] >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> > > > > -- > Shalom Elkin > +972-544-704994 > -- Shalom Elkin +972-544-704994 _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

