当前位置: 首页 > 编程笔记 >

C语言SQLite3事务和锁的操作实例

归翔
2023-03-14
本文向大家介绍C语言SQLite3事务和锁的操作实例,包括了C语言SQLite3事务和锁的操作实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C语言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;
}

希望本文所述对大家C语言程序设计有所帮助。

 类似资料:
  • 我们使用Go语言开发一些程序的时候,往往出现多个进程同时操作同一份文件的情况,这很容易导致文件中的数据混乱。这时我们就需要采用一些手段来平衡这些冲突,文件锁(flock)应运而生,下面我们就来介绍一下。 对于 flock,最常见的例子就是 Nginx,进程运行起来后就会把当前的 PID 写入这个文件,当然如果这个文件已经存在了,也就是前一个进程还没有退出,那么 Nginx 就不会重新启动,所以 f

  • SQLite具有不同级别的锁:、、、、。 我找不到调用SQLite API获取和释放锁定的信息。 据我所知,调用sqlite3\U步骤时获得锁。锁的类型取决于预处理语句的表达式。此外,此命令还可以升级自定义事务内的锁定写入操作。 据我所知,写入锁也是由sqlite3\u步骤释放的-此函数返回SQLITE\u DONE或错误代码。我没有找到任何文档,但该函数应该在执行结束时释放保留的待处理的独占的。

  • 本文向大家介绍C语言实现数据结构和双向链表操作,包括了C语言实现数据结构和双向链表操作的使用技巧和注意事项,需要的朋友参考一下 数据结构  双向链表的实现 双向链表中的每一个结点都含有两个指针域,一个指针域存放其后继结点的存储地址,另一个指针域则存放其前驱结点的存储地址。 双向链表结点的类型描述:     其中,prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。 双

  • 使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。 使用 transaction 方法操作数据库事务,当发生异常会自动回滚,例如: 自动控制事务处理 Db::transaction(function(){ Db::name('user')->find(1); Db::name('user')->delet

  • 使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。 使用 transaction 方法操作数据库事务,当发生异常会自动回滚,例如: 自动控制事务处理 Db::transaction(function(){ Db::name('user')->find(1); Db::name('user')->delet

  • 使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。 最简单的方式是使用 transaction 方法操作数据库事务,当闭包中的代码发生异常会自动回滚,例如: Db::transaction(function () { Db::table('think_user')->find(1); Db::table(