C语言中怎么利用SQLite3实现事务和锁

发布时间:2021-07-02 17:40:57 作者:Leah
来源:亿速云 阅读:159

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语言中怎么利用SQLite3实现事务和锁问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. MySQL事务和InnoDB锁类型介绍
  2. Redis中的事务/锁

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言 sqlite3

上一篇:分布式架构Jenkins部署及配置方法

下一篇:asp.net System.Guid ToString的五种格式介绍

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》