SQLite C API 中扩展API支持用户自定义函数、聚合和排序规则。用户自定义函数就是映射到用户自己用C语言或其他语言实现的SQL函数。
自定义扩展必须一对一注册到连接,因为他们存在于程序内存中。当程序或脚本启动时,为计划使用自定义扩展的连接负责这侧所需的扩展。
一、创建用户自定义函数
- 编写处理程序。实现想要SQL执行的事情。
- 注册处理程序。提供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聚合函数。
自定义聚合需要三步:
- 注册聚合
- 实现结果集中每个记录调用的步骤函数
- 实现结果处理后调用的完成函数
下面实现了一个称为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忽略尾随空格。