sqlite3事务和锁的实例

#include <stdio.h>
#include <sqlite3.h>

static int lib_get_value_callback(void *buf, int argc, char *argv[], char *column_name[])
{
    printf("argc:%d,%s argv[0]:%s,%s argv[1]:%s\n",argc,column_name[0],argv[0],column_name[1],argv[1]);
    return 0;
}

/*!
 * \fn war_snprintf.
 * \brief the  functions  snprintf produce output according to a format.
 * \param str: the output buffer.
 * \param size: size allow writting to buffer
 * \param format: format string
 * \param ap: variable list
 * \return success: size written to buffer ; fail or output longer than size: -1 
 */
int war_vsnprintf(char *str, size_t size, const char *format, va_list ap)
{
    int res;
    res = vsnprintf(str, size, format, ap);
    if (res >= size) {
	//tr_log(LOG_ERROR, "[v]snprintf failed or output longer than buffer!");
	printf("[v]snprintf failed or output longer than buffer!\n");
        return -1;
    } else
        return res;
}
/*!
 * \fn war_snprintf.
 * \brief the  functions  snprintf produce output according to a format.
 * \param str: the output buffer.
 * \param size: size allow writting to buffer
 * \param format: format string
 * \return success: size written to buffer ; fail: -1 
 */
int war_snprintf(char *str, size_t size, const char *format, ...)
{
    int res;
    va_list ap;

    va_start(ap, format);
    res = war_vsnprintf(str, size, format, ap);
    va_end(ap);

    return res;
}
#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK)\
           {printf("%s error!\n",szInfo);\
           printf("%s\n",szErrMsg);\
           sqlite3_free(szErrMsg);\
           sqlite3_close(db);\
           return 0;}
int main(int argc, char * argv[])
{
  
    sqlite3 *db;
    char *dbPath="tr.db";
    char *szErrMsg = 0;
    int rc = 0;
rc= sqlite3_open(dbPath, &db);
     if(rc == SQLITE_OK){
	 	printf("open succeed\n");
	 	}
	 else{
	 	printf("open fail\n");
	 	}
    //char *szSql ="SELECT type, value FROM tr WHERE id=3";
    //char *szSql = "insert into tr values(null,-1,'','false','false',0,'',1,0,'','node','')";
    char szSql[128];
    int i = 1;

    //char *Sql = "CREATE TABLE tr(id INTEGER PRIMARY KEY,pid INTEGER DEFAULT -1,name TEXT NOT NULL COLLATE NOCASE, rw varchar(5) DEFAULT 'true',getc varchar(5) DEFAULT 'false',noc INTEGER DEFAULT 0,nocc charchar(3) DEFAULT '',nin INTEGER DEFAULT 1,il INTEGER DEFAULT 0,acl varchar(255) DEFAULT '',type varchar(16) DEFAULT 'node',value TEXT DEFAULT NULL,UNIQUE(pid,name));";
    //rc=sqlite3_exec(db,Sql,0,0,&szErrMsg);
    //CHECK_RC(rc,"create table",szErrMsg,db);

    for(i = 1;i <= 30;i++) 
    {
    /*begin*/
     rc = sqlite3_exec(db,"BEGIN EXCLUSIVE", NULL,NULL, &szErrMsg);
     CHECK_RC(rc,"begin",szErrMsg,db);
    war_snprintf(szSql, sizeof(szSql), "insert into tr values(null,%d,'jjhh','true','false',0,'',1,0,'','string','')", i);
    rc = sqlite3_exec(db,szSql, lib_get_value_callback, 0, &szErrMsg);
    CHECK_RC(rc,"insert values",szErrMsg,db);
    if((rc == SQLITE_OK)&&((i%2)==0))
		{
		rc=sqlite3_exec(db,"COMMIT", NULL,NULL, &szErrMsg);
		CHECK_RC(rc,"insert values",szErrMsg,db);

		war_snprintf(szSql, sizeof(szSql), "SELECT id, value FROM tr WHERE pid=%d and name='%s'", i,"jjhh");
              rc = sqlite3_exec(db,szSql, lib_get_value_callback, 0, &szErrMsg);
              CHECK_RC(rc,"query values",szErrMsg,db);
			  
		}
	else
		{
		rc=sqlite3_exec(db,"ROLLBACK", NULL,NULL, &szErrMsg);
		CHECK_RC(rc,"insert values",szErrMsg,db);
		}
	sleep(5);
    }
    
    
    sqlite3_close(db);
    printf("happy everyday!");
    return 0;
}


#include <stdio.h>
#include <sqlite3.h>

static int lib_get_value_callback(void *buf, int argc, char *argv[], char *column_name[])
{
    printf("argc:%d,%s argv[0]:%s,%s argv[1]:%s\n",argc,column_name[0],argv[0],column_name[1],argv[1]);
    return 0;
}

/*!
 * \fn war_snprintf.
 * \brief the  functions  snprintf produce output according to a format.
 * \param str: the output buffer.
 * \param size: size allow writting to buffer
 * \param format: format string
 * \param ap: variable list
 * \return success: size written to buffer ; fail or output longer than size: -1 
 */
int war_vsnprintf(char *str, size_t size, const char *format, va_list ap)
{
    int res;
    res = vsnprintf(str, size, format, ap);
    if (res >= size) {
	//tr_log(LOG_ERROR, "[v]snprintf failed or output longer than buffer!");
	printf("[v]snprintf failed or output longer than buffer!\n");
        return -1;
    } else
        return res;
}
/*!
 * \fn war_snprintf.
 * \brief the  functions  snprintf produce output according to a format.
 * \param str: the output buffer.
 * \param size: size allow writting to buffer
 * \param format: format string
 * \return success: size written to buffer ; fail: -1 
 */
int war_snprintf(char *str, size_t size, const char *format, ...)
{
    int res;
    va_list ap;

    va_start(ap, format);
    res = war_vsnprintf(str, size, format, ap);
    va_end(ap);

    return res;
}
#define CHECK_RC(rc,szInfo,szErrMsg,db) if(rc!=SQLITE_OK)\
           {printf("%s error!\n",szInfo);\
           printf("%s\n",szErrMsg);\
           sqlite3_free(szErrMsg);\
           sqlite3_close(db);\
           return 0;}
int main(int argc, char * argv[])
{
  
    sqlite3 *db;
    char *dbPath="tr.db";
    char *szErrMsg = 0;
    int rc = 0;

     rc= sqlite3_open(dbPath, &db);
     if(rc == SQLITE_OK){
	 	printf("open succeed\n");
	 	}
	 else{
	 	printf("open fail\n");
	 	}
    //char *szSql ="SELECT type, value FROM tr WHERE id=3";
    //char *szSql = "insert into tr values(null,-1,'','false','false',0,'',1,0,'','node','')";
    char szSql[128];
    int i = 1;

   

    //char *Sql = "CREATE TABLE tr(id INTEGER PRIMARY KEY,pid INTEGER DEFAULT -1,name TEXT NOT NULL COLLATE NOCASE, rw varchar(5) DEFAULT 'true',getc varchar(5) DEFAULT 'false',noc INTEGER DEFAULT 0,nocc charchar(3) DEFAULT '',nin INTEGER DEFAULT 1,il INTEGER DEFAULT 0,acl varchar(255) DEFAULT '',type varchar(16) DEFAULT 'node',value TEXT DEFAULT NULL,UNIQUE(pid,name));";
    //rc=sqlite3_exec(db,Sql,0,0,&szErrMsg);
    //CHECK_RC(rc,"create table",szErrMsg,db);

    for(i = 1;i <= 30;i++) 
    {
    /*begin*/
     rc = sqlite3_exec(db,"BEGIN EXCLUSIVE", NULL,NULL, &szErrMsg);
     CHECK_RC(rc,"begin",szErrMsg,db);
	 
    war_snprintf(szSql, sizeof(szSql), "insert into tr values(null,%d,'hhjj','true','false',0,'',1,0,'','string','')", i);
    rc = sqlite3_exec(db,szSql, lib_get_value_callback, 0, &szErrMsg);
    CHECK_RC(rc,"insert values",szErrMsg,db);
	
    if((rc == SQLITE_OK)&&((i%2)==0))
		{
		rc=sqlite3_exec(db,"COMMIT", NULL,NULL, &szErrMsg);
		CHECK_RC(rc,"insert values",szErrMsg,db);
		
		war_snprintf(szSql, sizeof(szSql), "SELECT id, value FROM tr WHERE pid=%d and name='%s'", i,"hhjj");
              rc = sqlite3_exec(db,szSql, lib_get_value_callback, 0, &szErrMsg);
              CHECK_RC(rc,"query values",szErrMsg,db);
		}
	else
		{
		rc=sqlite3_exec(db,"ROLLBACK", NULL,NULL, &szErrMsg);
		CHECK_RC(rc,"insert values",szErrMsg,db);
		}
	sleep(5);
    }
    
    //sleep(60);
    sqlite3_close(db);
    printf("happy everyday!");
    return 0;
}

同时运行



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值