返回顶部
首页 > 资讯 > 数据库 >SQLite第四课 sqlite3_set_authoriz
  • 592
分享到

SQLite第四课 sqlite3_set_authoriz

2024-04-02 19:04:59 592人浏览 泡泡鱼
摘要

例子说明 可以将一个如下面格式的my_authorizer函数,注册到sqlite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter

例子说明
 可以将一个如下面格式的my_authorizer函数,注册到sqlite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter。

代码
#include <iOStream>
#include "sqlite/sqlite3.h"
using namespace std;
 

int my_authorizer(void* pszString,
                  int nCode,
                  const char* psz1,
                  const char* psz2,
                  const char* psz3,
                  const char* psz4)
{
  int nNotPermitCode = *(int*)pszString;
  if (nNotPermitCode == 11)
  {
    printf("can not execute drop\n");
    return SQLITE_DENY;
  } 
  return SQLITE_OK;
}
int main()
{
  int rc = 0;
  sqlite3* db = NULL;
  char* pdbName = "test0.db";
  char* pszErrMsg = NULL;
 
  rc = sqlite3_open_v2(pdbName,&db,SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,NULL);
  
  char* pszCreateTb1 = "create virtual table geo_test1 using rtree_i32(id, minx, maxx)";
  rc = sqlite3_exec(db,pszCreateTb1, 0, 0, &pszErrMsg);
 
  char* pszInsertsql1 = "insert into geo_test1 values(1, 400, 400)";
  rc = sqlite3_exec(db,pszInsertsql1, 0, 0, &pszErrMsg);
 
  char* pszDropTable = "drop table geo_test1";
 
 
  int nNotPermitCode = 11;
  //第三个参数是传递给授权注册函数的参数值
  sqlite3_set_authorizer(db, my_authorizer, &nNotPermitCode);
  sqlite3_stmt* statement;
 
  rc = sqlite3_prepare_v2(db, pszDropTable, -1, &statement, NULL);

  //单步调试到perr的错误信息:no authored,表示无权操作
  const char* pszErr = sqlite3_errmsg(db);
  sqlite3_close(db);
  return 0;
}

原理分析
该文件包含了实现sliQte3_set_authorizer函数的代码。对于SQLite库来说,该功能
是可选的。嵌入式系统不需要该功能,可以通过预编译宏-DSQLITE_OMIT_AUTHORIZATioN=1
来禁用该选项。实际上在VS的预编译选项中,添加SQLITE_OMIT_AUTHORIZATION即可!!
 
如果定义了SQLITE_OMIT_AUTHORIZATION宏,就会忽略该文件的所有代码
 
如下介绍两个重量级的函数:
int sqlite3_set_authorizer
(
 sqlite3 *db,
  int(*xAuth)(void*,int,const char*,const char*,const char*,const char*),
 void *pArg
)
设置或者清空访问授权函数
sqlite3_set_authorizer函数会将注册进来的授权函数的指针,传递给
数据库的句柄结构体sqlite3*db,并且也将该函数的第三个参数保存到句柄当中
千万不要想当然,句柄就是一个指针,可以指向一个结构体的指针。
实际上在这里有一个值得考虑的问题:如何防止死,一个锁她的最大范围
如何控制,在什么地方才需要真正的加锁!!
学习如何使用C语言,实现面向对象编程思想,如何组织函数的处理结构
 
第三和第四个参数分别是当前正在访问的表名和列名,认证函数只能返回SQLITE_OK,SQLITE_DENY
SQLITE_IGNORE.如果返回SQLITE_OK,表示允许执行访问操作。SQLITE_DENY意味着SQL语句不会被执
行,sqlite3_exec函数将返回一个错误信息,SQLITE_IGNORE意味着SQL语句将被解析,但是尝试读
取,将返回空集合,尝试写将被忽略!!
 


int sqlite3AuthCheck(
  Parse *pParse,
  int code,
  const char *zArg1,
  const char *zArg2,
  const char *zArg3
){
  sqlite3 *db = pParse->db;
  int rc;

 
  if( db->init.busy || IN_DECLARE_VTAB ){
    return SQLITE_OK;
  }

  if( db->xAuth==0 ){
    return SQLITE_OK;
  }
  rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext
#ifdef SQLITE_USER_AUTHENTICATION
                 ,db->auth.zAuthUser
#endif
                );
  if( rc==SQLITE_DENY ){
    sqlite3ErrORMsg(pParse, "not authorized");
    pParse->rc = SQLITE_AUTH;
  }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){
    rc = SQLITE_DENY;
    sqliteAuthBadReturnCode(pParse);
  }
  return rc;
}


您可能感兴趣的文档:

--结束END--

本文标题: SQLite第四课 sqlite3_set_authoriz

本文链接: https://lsjlt.com/news/35962.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQLite第四课 sqlite3_set_authoriz
    例子说明 可以将一个如下面格式的my_authorizer函数,注册到SQLite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter...
    99+
    2024-04-02
  • MySQL第四课
    CREATE TABLE biao(    name VARCHAR(20) PRIMARY KEY,    age INT(11) NOT NULL,    sex CHAR(11)DEFAULT 1,    love V...
    99+
    2019-04-06
    MySQL第四课
  • Python第四课----函数
    函数一、函数由若干语句组成的语句块,函数名称、参数列表构成,它是组织代码的最小单元。二、函数的作用1、对代码的最基本封装,按照功能组织一段代码。 2、目的为了复用,减少冗余代码。三、函数分类1、内建函数:max(),reversed()。 ...
    99+
    2023-01-31
    函数 Python
  • SQLite第二课 下载编译
    文件说明下载源码包两个:sqlite-dll-win32-x86-3081101.zip,里面提供了导出sqlite3的函数的文件sqlite3.def主要用于生成LIB文件,确定链接使用sqlite-pr...
    99+
    2024-04-02
  • 微课程 | 第四课《目录结构演示》
    https://v.youku.com/v_show/id_XNDQ1MjQ3NjE2OA==.html 上一期我们介绍了 DBLE 的普通安装方式,这一期我们来了解一下安装好的目录结构。 https://v.youku.com/v_sho...
    99+
    2018-04-27
    微课程 | 第四课《目录结构演示》
  • SQLite第一课 sqlite3.exe使用教程
    1).open 打开数据库例子:sqlite> .open test.db注意:>后面有点2) .tables 查看数据库包含的表名例子:sqlite> .tables注意:>后面有...
    99+
    2024-04-02
  • 阿里云ecs使用教程第四节课
    简介 在上一节课中,我们学习了如何创建和配置阿里云ECS实例,接下来我们将继续深入学习如何使用ECS实例来搭建一个网站服务器。本文将介绍如何安装Web服务器软件,并配置域名解析和SSL证书,以便让你的网站能够正常访问。安装Web服务器软件要...
    99+
    2024-01-21
    阿里 节课 教程
  • SAP标准培训课程C4C10学习笔记(四)第四单元
    这个单元的内容是产品主数据和Price list。Hierarchy UI上按钮New的enable/disable逻辑SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI一种轻量级的C4C业务数据同步到S/4HANA的方式:...
    99+
    2023-06-05
  • MySQL第三课
    首先创建一个数据库: CREATE DATABASE ku; Query OK, 1 row affected 查看一下是否有此数据库: SHOW DATABASES; +--------------------+| Database   ...
    99+
    2018-10-18
    MySQL第三课
  • mysql第五课
    修改表中一行或多行数据: SELECT*FROM student;+----+------+------+| id | name | ban  |+----+------+------+|  1 | yy   | 1913...
    99+
    2020-07-04
    mysql第五课
  • MySQL第六课
    SELECT [DISTINCT]     * /{字段名1,字段名2,字段名3,.........} FROM 表名 [WHERE 条件表达式1] [GROUP BY 字段名[HAVING 条件表达式2]...
    99+
    2022-03-23
    MySQL第六课
  • MySQL第七课
    统计记录条数 SELECT COUNT(*)  FROM 表名; SUM():总和 AVG():平均值 MAX():最大值 MIN():最小值     排序: SELECT 字段名  FROM 表名 ORDER B...
    99+
    2019-04-05
    MySQL第七课
  • mysql第八课
    开启事务: START TRANSACTION; 提交事务: COMMIT; 回滚事务: ROLLBACK;   事务的概念:原子性,一致性,隔离性,持久性   READ UNCOMMITTED(读了未提交) READ COMMI...
    99+
    2020-05-07
    mysql第八课
  • Docker-第一课
    1.概述Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议。Docker可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。Docker的理念:Build, Ship...
    99+
    2023-06-04
  • python第十一课
    一、Cluster概念1、系统扩展方式:Scale UP:向上扩展,增强Scale Out:向外扩展,增加设备,调度分配问题,Cluster2、Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统3、Linux Clu...
    99+
    2023-01-31
    第十一课 python
  • 开课第3天
    今天是学习第三天,昨天报的名,看手机时无意中看到刘遄有在线讲课,简单了解下就报了,,昨天着急忙慌的听课,之后注册了51博客,老师让我们把讲课笔记发到博客上,试试吧! ...
    99+
    2023-01-31
  • 微课程 | 第八课《Global 表简介》
    https://v.youku.com/v_show/id_XNDQ2ODE3NTAxMg==.html 上一期我们主要介绍了一些不同拆分规则的表怎样使用,接下来我们介绍一下 Global 表。 什么是 Global 表 我们有一个定义:对...
    99+
    2015-04-05
    微课程 | 第八课《Global 表简介》
  • 微课程 | 第六课《复杂查询》
    https://v.youku.com/v_show/id_XNDQ2MDAzOTE2MA==.html 上一期我们通过基本拆分算法,展示基本配置是什么样的。现在来介绍下 dble 其他的一些功能。 dble 查询流程图 首先基本的 DM...
    99+
    2016-04-10
    微课程 | 第六课《复杂查询》
  • 3月3日完成第17课,准备开始第18课
      昨天,也就是3月3日终于完成word文档“lvs+keepalived集群架构服务应用指南.doc”第17课的部分。之前,又完成1节51cto学院里,oldboy关于职业发展的视频笔记“linux运维人员需要具备的技能说明”。  本来的...
    99+
    2023-01-31
  • python入门课程第四讲之内置数据类型有哪些
    目录前言变量数据类型总览Python是弱类型的语言各数据类型的详细介绍整数(int)整数的不同进制浮点数/小数(float)小数的书写形式复数(complex)布尔类型(bool)总...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作