59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
|
/*
|
||
|
** 2017-04-16
|
||
|
**
|
||
|
** The author disclaims copyright to this source code. In place of
|
||
|
** a legal notice, here is a blessing:
|
||
|
**
|
||
|
** May you do good and not evil.
|
||
|
** May you find forgiveness for yourself and forgive others.
|
||
|
** May you share freely, never taking more than you give.
|
||
|
**
|
||
|
*************************************************************************
|
||
|
**
|
||
|
** This file implements a run-time loadable extension to SQLite that
|
||
|
** registers a sqlite3_collation_needed() callback to register a fake
|
||
|
** collating function for any unknown collating sequence. The fake
|
||
|
** collating function works like BINARY.
|
||
|
**
|
||
|
** This extension can be used to load schemas that contain one or more
|
||
|
** unknown collating sequences.
|
||
|
*/
|
||
|
#include "sqlite3ext.h"
|
||
|
SQLITE_EXTENSION_INIT1
|
||
|
#include <string.h>
|
||
|
|
||
|
static int anyCollFunc(
|
||
|
void *NotUsed,
|
||
|
int nKey1, const void *pKey1,
|
||
|
int nKey2, const void *pKey2
|
||
|
){
|
||
|
int rc, n;
|
||
|
n = nKey1<nKey2 ? nKey1 : nKey2;
|
||
|
rc = memcmp(pKey1, pKey2, n);
|
||
|
if( rc==0 ) rc = nKey1 - nKey2;
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
static void anyCollNeeded(
|
||
|
void *NotUsed,
|
||
|
sqlite3 *db,
|
||
|
int eTextRep,
|
||
|
const char *zCollName
|
||
|
){
|
||
|
sqlite3_create_collation(db, zCollName, eTextRep, 0, anyCollFunc);
|
||
|
}
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
__declspec(dllexport)
|
||
|
#endif
|
||
|
int sqlite3_anycollseq_init(
|
||
|
sqlite3 *db,
|
||
|
char **pzErrMsg,
|
||
|
const sqlite3_api_routines *pApi
|
||
|
){
|
||
|
int rc = SQLITE_OK;
|
||
|
SQLITE_EXTENSION_INIT2(pApi);
|
||
|
rc = sqlite3_collation_needed(db, 0, anyCollNeeded);
|
||
|
return rc;
|
||
|
}
|