sqlcipher/ext/misc/anycollseq.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;
}