SQLite C 接口
定义新的整理顺序
int sqlite3_create_collation( sqlite3*, const char *zName, int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*) ); int sqlite3_create_collation_v2( sqlite3*, const char *zName, int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*), void(*xDestroy)(void*) ); int sqlite3_create_collation16( sqlite3*, const void *zName, int eTextRep, void *pArg, int(*xCompare)(void*,int,const void*,int,const void*) );
这些函数添加、删除或修改与指定为第一个参数的数据库连接关联的排序规则。
排序规则的名称是 sqlite3_create_collation() 和 sqlite3_create_collation_v2() 的 UTF-8 字符串,以及 sqlite3_create_collation16() 的本地字节顺序的 UTF-16 字符串。根据sqlite3_strnicmp()比较相等的排序规则名称被认为是相同的名称。
第三个参数 (eTextRep) 必须是常量之一:
eTextRep 参数确定传递给整理函数回调 xCompare 的字符串的编码。eTextRep的SQLITE_UTF16和SQLITE_UTF16_ALIGNED值强制字符串为具有本机字节顺序的 UTF16。eTextRep的SQLITE_UTF16_ALIGNED值强制字符串从偶数字节地址开始。第四个参数 pArg 是一个应用程序数据指针,它作为第一个参数传递给整理函数回调。
第五个参数 xCompare 是指向整理函数的指针。可以使用相同的名称但使用不同的 eTextRep 参数注册多个整理函数,SQLite 将使用需要最少数据转换的函数。如果 xCompare 参数为 NULL,则删除整理函数。当删除所有具有相同名称的整理功能时,该整理将不再可用。
使用 pArg 应用程序数据指针的副本和 eTextRep 参数指定的编码中的两个字符串调用整理函数回调。整理函数回调的两个整数参数是两个字符串的长度,以字节为单位。如果第一个字符串分别小于、等于或大于第二个字符串,则整理函数必须返回一个负整数、零整数或正整数。给定相同的输入,整理函数必须始终返回相同的答案。如果两个或多个整理函数注册到相同的整理名称(使用不同的 eTextRep 值),那么在使用等效字符串调用时,所有函数都必须给出等效的答案。整理函数必须遵守所有字符串 A、B 和 C 的以下属性:
- 如果 A==B 则 B==A。
- 如果 A==B 且 B==C 则 A==C。
- 如果 A<B 则 B>A。
- 如果 A<B 且 B<C,则 A<C。
如果一个整理函数没有满足上述任何约束,并且该整理函数被注册和使用,那么 SQLite 的行为是未定义的。
sqlite3_create_collation_v2() 的工作方式与 sqlite3_create_collation() 类似,只是在删除整理函数时会在 pArg 上调用 xDestroy 回调。当以后调用归类创建函数或使用sqlite3_close()关闭数据库连接时,归类函数将被删除 。
如果 sqlite3_create_collation_v2() 函数失败,则不会调用xDestroy 回调。使用非 NULL xDestroy 参数调用 sqlite3_create_collation_v2() 的应用程序应该检查返回代码并自行处理应用程序数据指针,而不是期望 SQLite 为它们处理它。这与所有其他 SQLite 接口不同。不一致是不幸的,但在不破坏向后兼容性的情况下无法更改。
另见: sqlite3_collation_needed()和sqlite3_collation_needed16()。