version 1.2, 2010/01/27 22:22:10
|
version 1.10, 2010/03/09 10:18:44
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.10 |
RPL/2 (R) version 4.0.13 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
Line 153 destruction_fichier(unsigned char *nom_f
|
Line 153 destruction_fichier(unsigned char *nom_f
|
* Renvoie le descripteur en fonction de la structure de contrôle du fichier |
* Renvoie le descripteur en fonction de la structure de contrôle du fichier |
*/ |
*/ |
|
|
file * |
struct_descripteur_fichier * |
descripteur_fichier(struct_processus *s_etat_processus, |
descripteur_fichier(struct_processus *s_etat_processus, |
struct_fichier *s_fichier) |
struct_fichier *s_fichier) |
{ |
{ |
Line 174 descripteur_fichier(struct_processus *s_
|
Line 174 descripteur_fichier(struct_processus *s_
|
(*((struct_descripteur_fichier *) (*l_element_courant) |
(*((struct_descripteur_fichier *) (*l_element_courant) |
.donnee)).tid, pthread_self()) != 0)) |
.donnee)).tid, pthread_self()) != 0)) |
{ |
{ |
return((*((struct_descripteur_fichier *) |
return((struct_descripteur_fichier *) |
(*l_element_courant).donnee)).descripteur); |
(*l_element_courant).donnee); |
} |
} |
else |
else |
{ |
{ |
Line 292 recherche_chemin_fichiers_temporaires(st
|
Line 292 recherche_chemin_fichiers_temporaires(st
|
|
|
|
|
/* |
/* |
================================================================================ |
* Fonction d'interrogation du fichier |
Fonction d'interrogation du fichier |
*/ |
================================================================================ |
|
*/ |
|
|
|
logical1 |
logical1 |
caracteristiques_fichier(struct_processus *s_etat_processus, |
caracteristiques_fichier(struct_processus *s_etat_processus, |
Line 312 caracteristiques_fichier(struct_processu
|
Line 310 caracteristiques_fichier(struct_processu
|
(*ouverture) = d_faux; |
(*ouverture) = d_faux; |
(*existence) = d_faux; |
(*existence) = d_faux; |
|
|
if ((descripteur = open(nom, O_CREAT | O_EXCL)) == -1) |
if ((descripteur = open(nom, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1) |
{ |
{ |
if (errno == EEXIST) |
if (errno == EEXIST) |
{ |
{ |
Line 338 caracteristiques_fichier(struct_processu
|
Line 336 caracteristiques_fichier(struct_processu
|
!= 0)) |
!= 0)) |
{ |
{ |
(*ouverture) = d_vrai; |
(*ouverture) = d_vrai; |
|
|
(*unite) = (unsigned long) |
(*unite) = (unsigned long) |
fileno((*((struct_descripteur_fichier *) |
fileno((*((struct_descripteur_fichier *) |
(*l_element_courant).donnee)).descripteur); |
(*l_element_courant).donnee)) |
|
.descripteur_c); |
break; |
break; |
} |
} |
} |
} |
Line 363 caracteristiques_fichier(struct_processu
|
Line 363 caracteristiques_fichier(struct_processu
|
return(erreur); |
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, |
|
integer8 position_clef, logical1 fichier_indexe) |
|
{ |
|
const char commande1[] = |
|
"create table control(id integer primary key asc, key integer)"; |
|
const char commande2[] = |
|
"insert into control (id, key) values (1, %lld)"; |
|
const char *queue; |
|
|
|
sqlite3_stmt *ppStmt; |
|
|
|
unsigned char *commande; |
|
|
|
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 (alsprintf(&commande, commande2, position_clef) < 0) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return(d_erreur); |
|
} |
|
|
|
if (sqlite3_prepare_v2(sqlite, commande, strlen(commande), &ppStmt, |
|
&queue) != SQLITE_OK) |
|
{ |
|
free(commande); |
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return(d_erreur); |
|
} |
|
|
|
if (sqlite3_step(ppStmt) != SQLITE_DONE) |
|
{ |
|
free(commande); |
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return(d_erreur); |
|
} |
|
|
|
if (sqlite3_finalize(ppStmt) != SQLITE_OK) |
|
{ |
|
free(commande); |
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return(d_erreur); |
|
} |
|
|
|
free(commande); |
|
} |
|
|
|
return(d_absence_erreur); |
|
} |
|
|
|
logical1 |
|
initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, |
|
sqlite3 *sqlite, integer8 position_clef, logical1 binaire) |
|
{ |
|
const char commande1[] = |
|
"create table data(id integer primary key asc, key_id integer, " |
|
"data text, sequence integer)"; |
|
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, " |
|
"data blob, sequence integer)"; |
|
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, position_clef, 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, data text)"; |
|
const char commande2[] = |
|
"create table data(id integer primary key asc, data blob)"; |
|
const char commande3[] = |
|
"create index data_idx on data(id)"; |
|
const char *queue; |
|
|
|
sqlite3_stmt *ppStmt; |
|
|
|
if (initialisation_controle(s_etat_processus, sqlite, (integer8) 0, 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); |
|
} |
|
|
// vim: ts=4 |
// vim: ts=4 |