--- rpl/src/gestion_fichiers.c 2010/03/04 10:17:48 1.5 +++ rpl/src/gestion_fichiers.c 2010/03/06 18:29:06 1.6 @@ -153,7 +153,7 @@ destruction_fichier(unsigned char *nom_f * Renvoie le descripteur en fonction de la structure de contrôle du fichier */ -file * +struct_descripteur_fichier * descripteur_fichier(struct_processus *s_etat_processus, struct_fichier *s_fichier) { @@ -174,8 +174,8 @@ descripteur_fichier(struct_processus *s_ (*((struct_descripteur_fichier *) (*l_element_courant) .donnee)).tid, pthread_self()) != 0)) { - return((*((struct_descripteur_fichier *) - (*l_element_courant).donnee)).descripteur); + return((struct_descripteur_fichier *) + (*l_element_courant).donnee); } else { @@ -292,10 +292,8 @@ recherche_chemin_fichiers_temporaires(st /* -================================================================================ - Fonction d'interrogation du fichier -================================================================================ -*/ + * Fonction d'interrogation du fichier + */ logical1 caracteristiques_fichier(struct_processus *s_etat_processus, @@ -338,9 +336,11 @@ caracteristiques_fichier(struct_processu != 0)) { (*ouverture) = d_vrai; + (*unite) = (unsigned long) fileno((*((struct_descripteur_fichier *) - (*l_element_courant).donnee)).descripteur); + (*l_element_courant).donnee)) + .descripteur_c); break; } } @@ -363,4 +363,414 @@ caracteristiques_fichier(struct_processu return(erreur); } + +/* +================================================================================ + Routines d'initialisation des fichiers à accès direct et indexé +================================================================================ + Entrées : pointeur sur le fichier SQLITE +-------------------------------------------------------------------------------- + Sorties : drapeau d'erreur +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +/* + * Un fichier à accès direct se compose d'une seule table : + * 1: identifiant (entier sur 64 bits) -> enregistrement + * + * Un fichier à accès indexé comporte trois tables : + * 1 : contrôle + * 2 : clef (unique) -> identifiant (entier sur 64 bits) + * 3 : identifiant -> collection d'enregistrements + * + * La table de contrôle contient + * 1/ la position de la clef pour les fichiers à accès indexés + */ + +static logical1 +initialisation_controle(struct_processus *s_etat_processus, sqlite3 *sqlite, + logical1 fichier_indexe) +{ + const char commande1[] = + "create table control(id integer primary key asc, lock text)"; + const char commande2[] = + "insert into control (id, lock) values (2, '0')"; + const char *queue; + + sqlite3_stmt *ppStmt; + + if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (fichier_indexe == d_vrai) + { + if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + } + + return(d_absence_erreur); +} + +logical1 +initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, + sqlite3 *sqlite, logical1 binaire) +{ + const char commande1[] = + "create table data(id integer primary key asc, key_id integer, " + "lock text)"; + const char commande10[] = + "create table key(id integer primary key asc, key text)"; + const char commande2[] = + "create table data(id integer primary key asc, key_id integer, " + "lock blob)"; + const char commande20[] = + "create table key(id integer primary key asc, key blob)"; + const char commande3[] = + "create index data_idx on data(key_id)"; + const char commande4[] = + "create index key_idx on key(key)"; + const char *queue; + + sqlite3_stmt *ppStmt; + + if (initialisation_controle(s_etat_processus, sqlite, d_vrai) + != d_absence_erreur) + { + return(d_erreur); + } + + if (binaire == d_faux) + { + if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_prepare_v2(sqlite, commande10, strlen(commande10), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + } + else + { + if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_prepare_v2(sqlite, commande20, strlen(commande20), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + } + + if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_prepare_v2(sqlite, commande4, strlen(commande4), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + return(d_absence_erreur); +} + +logical1 +initialisation_fichier_acces_direct(struct_processus *s_etat_processus, + sqlite3 *sqlite, logical1 binaire) +{ + const char commande1[] = + "create table data(id integer primary key asc, lock text)"; + const char commande2[] = + "create table data(id integer primary key asc, lock blob)"; + const char commande3[] = + "create index data_idx on data(id)"; + const char *queue; + + sqlite3_stmt *ppStmt; + + if (initialisation_controle(s_etat_processus, sqlite, d_faux) + != d_absence_erreur) + { + return(d_erreur); + } + + if (binaire == d_faux) + { + if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + } + else + { + if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + } + + if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(d_erreur); + } + + return(d_absence_erreur); +} + +unsigned char * +verrouillage_fichier_sqlite(struct_processus *s_etat_processus, + sqlite3 *sqlite, unsigned char *operation) +{ + const char commande1[] = + "select lock from control where id = 1"; + const char commande2[] = + "update control set lock = '%s'"; + const char *queue; + + const unsigned char *resultat; + + sqlite3_stmt *ppStmt; + + unsigned char *verrou; + + resultat = NULL; + + if (operation == NULL) + { + // Lecture du verrou + + if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + if (sqlite3_step(ppStmt) != SQLITE_ROW) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + resultat = sqlite3_column_text(ppStmt, 0); + + if ((verrou = malloc((strlen(resultat) + 1) * sizeof(unsigned char))) + == NULL) + { + return(NULL); + } + + strcpy(verrou, resultat); + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + } + else + { + // Positionnement d'un verrou + + if (alsprintf(&verrou, commande2, operation) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return(NULL); + } + + if (sqlite3_prepare_v2(sqlite, verrou, strlen(verrou), &ppStmt, + &queue) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return(NULL); + } + + free(verrou); + verrou = NULL; + } + + return(verrou); +} + // vim: ts=4