sqlite3 第五章—扩展API

  SQLite C API 中扩展API支持用户自定义函数、聚合和排序规则。用户自定义函数就是映射到用户自己用C语言或其他语言实现的SQL函数。

  自定义扩展必须一对一注册到连接,因为他们存在于程序内存中。当程序或脚本启动时,为计划使用自定义扩展的连接负责这侧所需的扩展。

一、创建用户自定义函数

  1. 编写处理程序。实现想要SQL执行的事情。
  2. 注册处理程序。提供SQL名称、参数个数及指向该处理程序的指针。
//注册函数,第五个参数“任意指针”,不知道做什么用。
sqlite3_create_function(db, "hello_newman", 0, SQLITE_UTF8, NULL,hello_newman,NULL,NULL);

//自定义函数
void hello_newman(sqlite3_context* ctx, int nargs, sqlite3_value** values)
{
    const char *msg = "Hello Jerry";

    sqlite3_result_text(ctx, msg, strlen(msg), SQLITE_STATIC);
}

  需要说明的是,如果要在app中看到结果,需要使用回调函数或sqlite3_get_table(),把结果打印出来。

二、创建用户自定义聚合

  聚合函数适用于结果集中的所有记录,并从中计算某种聚合值的函数。如sum()、count()、avg()都是标准的SQL聚合函数。

  自定义聚合需要三步:

  1. 注册聚合
  2. 实现结果集中每个记录调用的步骤函数
  3. 实现结果处理后调用的完成函数

  下面实现了一个称为pysum的简单SUM()聚合例子。

 1 #!/usr/bin/env python
 2 
 3 import apsw, string
 4 
 5 connection=apsw.Connection("seinfeld.db")
 6 
 7 #步骤2
 8 def step(context, *args):
 9     context['value'] += args[0]
10         
11 def finalize(context):
12     return context['value']
13 
14 def pysum():
15     
16     return ({'value' : 0}, step, finalize)
17 
18 #步骤1
19 connection.createaggregatefunction("pysum", pysum)
20 
21 #步骤3
22 c = connection.cursor()
23 print c.execute("select pysum(id) from foods").next()[0]

三、创建用户自定义排序

   sqlite3_create_collation()

   通过上述API提供用户自定义排序规则,提供一种不同文本比较和排序方法。SQLite提供了三种默认排序规则:BINARY、NOCASE、RTRIM。

  BINARY使用memcmp()比较字符串值,NOCASE区分大小写,RTRIM忽略尾随空格。

原文地址:https://www.cnblogs.com/mofei004/p/9372360.html