2011-12-06 7 views
6

Intento habilitar claves externas usando la biblioteca HDBC-sqlite3 haskell. Esta biblioteca utiliza un pequeño ayudante c - FunciónTeclas externas Sqlite

int sqlite3_open2(const char *filename, finalizeonce **ppo) 

que exige a su vez una sqlite3_open. En el sqlite documentation encontré una bonita función sqlite3_db_config que se supone que habilita las claves externas. Para probarlo He añadido rápidamente 2 líneas en sqlite3_open2 (los dos últimos de la lista):

int sqlite3_open2(const char *filename, finalizeonce **ppo) { 
    sqlite3 *ppDb; 
    finalizeonce *newobj; 
    int res, *resFK, resFK1; 

    fprintf(stderr, "DB pointer: %d\n", ppDb); 

    res = sqlite3_open(filename, &ppDb); 

    resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);      
    fprintf(stderr, "\nForeign Keys: ON/OFF:%d ERR:%d\n", resFK, resFK1); 

    ... 

Mi sorpresa fue el resultado: Foreign Keys: ON/OFF:0 ERR:1.

¿Podría alguien darme una pista de qué estoy haciendo mal o cuál sería la forma adecuada de habilitar las claves externas?

Respuesta

6

De acuerdo con la docs:

Suponiendo que la biblioteca se compila con restricciones de clave externa habilitada, todavía debe estar habilitado por la aplicación en tiempo de ejecución, utilizando el comando PRAGMA FOREIGN_KEYS. Por ejemplo:

sqlite> PRAGMA foreign_keys = ON;

Las restricciones de clave externa están deshabilitadas por defecto (para compatibilidad con versiones anteriores ), por lo que deben habilitarse por separado para cada base de datos por separado.

Así que, después de su sqlite3_open(), es probable que desee agregar lo siguiente:

sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0); 
+0

su solución funciona. Has abierto mis ojos con respecto a cómo resolver mi problema en el nivel de Haskell. Una vez que lo termine lo publicaré aquí. – bartoszw

3

que tenían dificultades con que permite claves externas utilizando HDBC-sqlite3 API ya mencionado PRAGMA requiere para ser invocada más allá de la transacción y la biblioteca abre en el fondo una nueva transacción después de que se establece la conexión y después de cada confirmación. Aún la solución fue fácil:

main = do 
    conn <- connectSqlite3 "test.db" 
    runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"