Скрыть
Dr.Uid - а почему у меня строки без коммита сохраняются?
Делаю тестовую базу:
sql
sqlite3 test1. sqlite << EOF
CREATE TABLE table1( KEY varchar( 8) , val integer) ;
INSERT INTO table1 VALUES ( 'counter' , 0) ;
. quit
EOF
Вот такой хелловорлд, который апдейтит строку, вставляет ещё одну и просто выходит:
c
/*
* Test utility incrementing field in the table
* Compilation string:
* gcc -o test1 test1.c -lsqlite3
*
* SQLite API: http://www.sqlite.org/c3ref/intro.html
* Res.codes: http://www.sqlite.org/rescode.html
*
*/
#include <sqlite3.h>
#include <unistd.h>
#include <stdio.h>
void fuckup
( sqlite3
* dbp
, char * sqliteErrorStr
, const char * custonMsg
) {
if ( NULL
!= sqliteErrorStr
) {
fprintf
( stderr
, "sqlite error: %s\n " , sqliteErrorStr
) ;
sqlite3_free
( sqliteErrorStr
) ;
}
if ( NULL
!= custonMsg
) {
fprintf
( stderr
, "%s\n " , custonMsg
) ;
}
fprintf
( stderr
, "Lib version: %s\n " , sqlite3_libversion
( ) ) ;
sqlite3_close
( dbp
) ;
_exit
( 1
) ;
}
int main
( void ) {
sqlite3
* db
;
int rc
= sqlite3_open
( "./test1.sqlite" , & db
) ;
if ( SQLITE_OK
!= rc
) {
fprintf
( stderr
, "Факап нах: %s\n " , sqlite3_errmsg
( db
) ) ;
printf ( "Lib version: %s\n " , sqlite3_libversion
( ) ) ;
sqlite3_close
( db
) ;
return 1 ;
}
char * err_msg
= NULL
;
rc
= sqlite3_exec
( db
, "update table1 set val=val+1 where key='counter'" , 0
, 0
, & err_msg
) ;
if ( SQLITE_OK
!= rc
) {
fuckup
( db
, err_msg
, " # error is in update table1" ) ;
}
/* ===============================================================
* Below insert is done in addendum to updating string above
* this part can be removed since it does not add up anything
* ===============================================================
*/
sqlite3_stmt
* res
;
rc
= sqlite3_prepare_v2
( db
, "insert into table1 values('PID', :pid)" , - 1
, & res
, NULL
) ;
if ( SQLITE_OK
!= rc
) {
fprintf
( stderr
, "Error in sqlite3_prepare_v2: %d\n " , rc
) ;
fuckup
( db
, NULL
, sqlite3_errmsg
( db
) ) ;
}
int idx
= sqlite3_bind_parameter_index
( res
, ":pid" ) ;
if ( 0 >= idx
) {
fprintf
( stderr
, "sqlite3_bind_parameter_index: %d\n " , idx
) ;
fuckup
( db
, NULL
, sqlite3_errmsg
( db
) ) ;
}
rc
= sqlite3_bind_int
( res
, idx
, getpid
( ) ) ;
if ( SQLITE_OK
!= rc
) {
fuckup
( db
, err_msg
, " # error is in sqlite3_bind_int" ) ;
}
rc
= sqlite3_step
( res
) ;
if ( SQLITE_DONE
== rc
) {
fprintf
( stderr
, "OK, done!\n " ) ;
} else if ( SQLITE_ROW
== rc
) {
fprintf
( stderr
, "sqlite3_step ROW: %s | %s \n " , \
sqlite3_column_text
( res
, 0
) , \
sqlite3_column_text
( res
, 1
) ) ;
} else if ( SQLITE_OK
!= rc
) {
fprintf
( stderr
, "Errror %d in sqlite3_step: \n " , rc
) ;
fuckup
( db
, NULL
, sqlite3_errstr
( rc
) ) ;
}
/* ==========================================
* Just EXIT, no commit executed
*
* Intentionally not calling functions below:
*
* sqlite3_finalize(res)
* sqlite3_close(db)
*
* ==========================================
*/
return 0 ;
}
Результат такой:
bash
[ president@ whitehouse] # rm test1.sqlite
[ president@ whitehouse] # sqlite3 test1.sqlite <<EOF
> create table table1( key varchar( 8) , val integer) ;
> insert into table1 values( 'counter' ,0) ;
> .quit
> EOF
[ president@ whitehouse] # sqlite3 test1.sqlite <<EOF
> select * from table1;
> .exit
> EOF
counter| 0
[ president@ whitehouse] # gcc -o test1 test1.c -lsqlite3 -Wall
[ president@ whitehouse] # ./test1
OK, done !
[ president@ whitehouse] # ./test1
OK, done !
[ president@ whitehouse] # sqlite3 test1.sqlite <<EOF
select * from table1;
.exit
EOF
counter| 2
PID| 29343
PID| 29390
т.е. всё сохраняется. Что я делаю не так?
Re:Dr.Uid - а почему у меня строки без коммита сохраняются?
Вот это у меня без коммита не работало
Отредактировано Dr.uid по причине "не указана"
Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/48.0