zoukankan      html  css  js  c++  java
  • 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忽略尾随空格。

  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/mofei004/p/9372360.html
Copyright © 2011-2022 走看看