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*)
);

Estas funciones agregan, eliminan o modifican una intercalación asociada con la conexión de base de datos especificada como primer argumento.

El nombre de la intercalación es una cadena UTF-8 para sqlite3_create_collation () y sqlite3_create_collation_v2 () y una cadena UTF-16 en orden de bytes nativo para sqlite3_create_collation16 (). Los nombres de intercalación que se comparan igual de acuerdo con sqlite3_strnicmp () se consideran el mismo nombre.

El tercer argumento (eTextRep) debe ser una de las constantes:

  • SQLITE_UTF8,
  • SQLITE_UTF16LE,
  • SQLITE_UTF16BE,
  • SQLITE_UTF16, o
  • SQLITE_UTF16_ALIGNED.

El argumento eTextRep determina la codificación de las cadenas pasadas a la devolución de llamada de la función de clasificación, xCompare. Los valores SQLITE_UTF16 y SQLITE_UTF16_ALIGNED para eTextRep obligan a las cadenas a ser UTF16 con orden de bytes nativo. El valor SQLITE_UTF16_ALIGNED para eTextRep obliga a las cadenas a comenzar en una dirección de byte par.

El cuarto argumento, pArg, es un puntero de datos de aplicación que se pasa como primer argumento a la devolución de llamada de la función de clasificación.

El quinto argumento, xCompare, es un puntero a la función de clasificación. Se pueden registrar múltiples funciones de clasificación usando el mismo nombre pero con diferentes parámetros de eTextRep y SQLite usará la función que requiera la menor cantidad de transformación de datos. Si el argumento xCompare es NULL, la función de clasificación se elimina. Cuando se eliminan todas las funciones de clasificación que tienen el mismo nombre, esa clasificación ya no se puede utilizar.

La devolución de llamada de la función de clasificación se invoca con una copia del puntero de datos de la aplicación pArg y con dos cadenas en la codificación especificada por el argumento eTextRep. Los dos parámetros enteros para la devolución de llamada de la función de clasificación son la longitud de las dos cadenas, en bytes. La función de clasificación debe devolver un número entero negativo, cero o positivo si la primera cadena es menor, igual o mayor que la segunda, respectivamente. Una función de clasificación siempre debe devolver la misma respuesta dadas las mismas entradas. Si dos o más funciones de clasificación están registradas con el mismo nombre de clasificación (utilizando diferentes valores de eTextRep), todas deben dar una respuesta equivalente cuando se invoca con cadenas equivalentes. La función de clasificación debe obedecer las siguientes propiedades para todas las cadenas A, B y C:

  1. Si A == B entonces B == A.
  2. Si A == B y B == C entonces A == C.
  3. Si A A.
  4. Si A

Si una función de clasificación falla en alguna de las restricciones anteriores y esa función de clasificación se registra y se utiliza, entonces el comportamiento de SQLite no está definido.

Sqlite3_create_collation_v2 () funciona como sqlite3_create_collation () con la adición de que la devolución de llamada xDestroy se invoca en pArg cuando se elimina la función de clasificación. Las funciones de clasificación se eliminan cuando son anuladas por llamadas posteriores a las funciones de creación de clasificación o cuando se cierra la conexión de la base de datos usando sqlite3_close ().

La devolución de llamada de xDestroy es no se llama si falla la función sqlite3_create_collation_v2 (). Las aplicaciones que invocan sqlite3_create_collation_v2 () con un argumento xDestroy que no sea NULL deben verificar el código de retorno y deshacerse del puntero de datos de la aplicación en lugar de esperar que SQLite se encargue de él. Esto es diferente de cualquier otra interfaz SQLite. La inconsistencia es desafortunada, pero no se puede cambiar sin romper la compatibilidad con versiones anteriores.

Consulte también: sqlite3_collation_needed () y sqlite3_collation_needed16 ().

Consulte también las listas de objetos, constantes y funciones.