Annotation of rpl/src/gestion_fichiers.c, revision 1.6
1.1 bertrand 1: /*
2: ================================================================================
1.5 bertrand 3: RPL/2 (R) version 4.0.12
1.1 bertrand 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl.conv.h"
24:
25:
26: /*
27: ================================================================================
28: Routines de gestion des fichiers
29: ================================================================================
30: Entrées : nom du fichier
31: --------------------------------------------------------------------------------
32: Sorties : 0, le fichier n'existe pas, -1, il existe.
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: /*
39: * Génère un nom de fichier
40: */
41:
42: unsigned char *
43: creation_nom_fichier(struct_processus *s_etat_processus,
44: unsigned char *chemin)
45: {
46: /*
47: * Le nom du fichier est créé à l'aide du pid du processus et
48: * d'un numéro d'ordre pour ce processus.
49: */
50:
51: logical1 erreur;
52:
53: logical1 existence;
54: logical1 ouverture;
55:
56: pthread_mutex_t exclusion = PTHREAD_MUTEX_INITIALIZER;
57:
58: unsigned char *nom;
59: unsigned char tampon[256 + 1];
60:
61: unsigned long ordre_initial;
62: unsigned long unite;
63:
64: static unsigned long ordre = 0;
65:
66: if (pthread_mutex_lock(&exclusion) != 0)
67: {
68: return(NULL);
69: }
70:
71: ordre_initial = ordre;
72:
73: if (pthread_mutex_unlock(&exclusion) != 0)
74: {
75: return(NULL);
76: }
77:
78: do
79: {
80: sprintf(tampon, "RPL2-%lu-%lu-%lu", (unsigned long) getpid(),
81: (unsigned long) pthread_self(), ordre);
82:
83: if (chemin == NULL)
84: {
85: if ((nom = malloc((strlen(tampon) + 1) *
86: sizeof(unsigned char))) == NULL)
87: {
88: return(NULL);
89: }
90:
91: strcpy(nom, tampon);
92: }
93: else
94: {
95: if ((nom = malloc((strlen(chemin) + strlen(tampon) + 2) *
96: sizeof(unsigned char))) == NULL)
97: {
98: return(NULL);
99: }
100:
101: sprintf(nom, "%s/%s", chemin, tampon);
102: }
103:
104: if (pthread_mutex_lock(&exclusion) != 0)
105: {
106: return(NULL);
107: }
108:
109: ordre++;
110:
111: if (pthread_mutex_unlock(&exclusion) != 0)
112: {
113: return(NULL);
114: }
115:
116: if (ordre == ordre_initial)
117: {
118: // Il n'existe plus aucun nom de fichier disponible...
119:
120: free(nom);
121: return(NULL);
122: }
123:
124: erreur = caracteristiques_fichier(s_etat_processus,
125: nom, &existence, &ouverture, &unite);
126:
127: if (erreur != 0)
128: {
129: free(nom);
130: return(NULL);
131: }
132:
133: if (existence == d_vrai)
134: {
135: free(nom);
136: }
137: } while(existence == d_vrai);
138:
139: return(nom);
140: }
141:
142: /*
143: * Efface un fichier
144: */
145:
146: logical1
147: destruction_fichier(unsigned char *nom_fichier)
148: {
149: return((unlink(nom_fichier) == 0) ? d_absence_erreur : d_erreur);
150: }
151:
152: /*
153: * Renvoie le descripteur en fonction de la structure de contrôle du fichier
154: */
155:
1.6 ! bertrand 156: struct_descripteur_fichier *
1.1 bertrand 157: descripteur_fichier(struct_processus *s_etat_processus,
158: struct_fichier *s_fichier)
159: {
160: logical1 concordance_descripteurs;
161:
162: struct_liste_chainee *l_element_courant;
163:
164: l_element_courant = (*s_etat_processus).s_fichiers;
165: concordance_descripteurs = d_faux;
166:
167: while(l_element_courant != NULL)
168: {
169: if ((*((struct_descripteur_fichier *) (*l_element_courant).donnee))
170: .identifiant == (*s_fichier).descripteur)
171: {
172: if (((*((struct_descripteur_fichier *) (*l_element_courant).donnee))
173: .pid == (*s_fichier).pid) && (pthread_equal(
174: (*((struct_descripteur_fichier *) (*l_element_courant)
175: .donnee)).tid, pthread_self()) != 0))
176: {
1.6 ! bertrand 177: return((struct_descripteur_fichier *)
! 178: (*l_element_courant).donnee);
1.1 bertrand 179: }
180: else
181: {
182: concordance_descripteurs = d_vrai;
183: }
184: }
185:
186: l_element_courant = (*l_element_courant).suivant;
187: }
188:
189: if (concordance_descripteurs == d_vrai)
190: {
191: (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
192: }
193: else
194: {
195: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
196: }
197:
198: return(NULL);
199: }
200:
201: /*
202: * Recherche un chemin pour les fichiers temporaires
203: */
204:
205: unsigned char *
206: recherche_chemin_fichiers_temporaires(struct_processus *s_etat_processus)
207: {
208: file *fichier;
209:
210: unsigned char *candidat;
211: unsigned char *chemin;
212: unsigned char *chemins[] = { "$RPL_TMP_PATH",
213: "/tmp", "/var/tmp", NULL };
214: unsigned char *nom_candidat;
215:
216: unsigned long int i;
217:
218: i = 0;
219: chemin = NULL;
220:
221: while(chemin == NULL)
222: {
223: if (chemins[i][0] == '$')
224: {
225: candidat = getenv("RPL_TMP_PATH");
226:
227: if (candidat != NULL)
228: {
229: if ((nom_candidat = creation_nom_fichier(s_etat_processus,
230: candidat)) == NULL)
231: {
232: return NULL;
233: }
234:
235: if ((fichier = fopen(nom_candidat, "w+")) != NULL)
236: {
237: fclose(fichier);
238: unlink(nom_candidat);
239: free(nom_candidat);
240:
241: if ((chemin = malloc((strlen(candidat) + 1)
242: * sizeof(unsigned char))) != NULL)
243: {
244: strcpy(chemin, candidat);
245: }
246: else
247: {
248: return NULL;
249: }
250: }
251: else
252: {
253: free(nom_candidat);
254: }
255: }
256: }
257: else
258: {
259: if ((nom_candidat = creation_nom_fichier(s_etat_processus,
260: chemins[i])) == NULL)
261: {
262: return NULL;
263: }
264:
265: if ((fichier = fopen(nom_candidat, "w+")) != NULL)
266: {
267: fclose(fichier);
268: unlink(nom_candidat);
269: free(nom_candidat);
270:
271: if ((chemin = malloc((strlen(chemins[i]) + 1)
272: * sizeof(unsigned char))) != NULL)
273: {
274: strcpy(chemin, chemins[i]);
275: }
276: else
277: {
278: return NULL;
279: }
280: }
281: else
282: {
283: free(nom_candidat);
284: }
285: }
286:
287: i++;
288: }
289:
290: return chemin;
291: }
292:
293:
294: /*
1.6 ! bertrand 295: * Fonction d'interrogation du fichier
! 296: */
1.1 bertrand 297:
298: logical1
299: caracteristiques_fichier(struct_processus *s_etat_processus,
300: unsigned char *nom, logical1 *existence, logical1 *ouverture,
301: unsigned long *unite)
302: {
303: int descripteur;
304:
305: logical1 erreur;
306:
307: struct_liste_chainee *l_element_courant;
308:
309: (*unite) = 0;
310: (*ouverture) = d_faux;
311: (*existence) = d_faux;
312:
1.4 bertrand 313: if ((descripteur = open(nom, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) == -1)
1.1 bertrand 314: {
315: if (errno == EEXIST)
316: {
317: // Le fichier préexiste.
318:
319: erreur = d_absence_erreur;
320: (*existence) = d_vrai;
321:
322: // On chercher à savoir si le fichier est ouvert. S'il est ouvert,
323: // on renvoie son unité de rattachement.
324:
325: l_element_courant = (*s_etat_processus).s_fichiers;
326:
327: while(l_element_courant != NULL)
328: {
329: if (strcmp((*((struct_descripteur_fichier *)
330: (*l_element_courant).donnee)).nom, nom) == 0)
331: {
332: if (((*((struct_descripteur_fichier *) (*l_element_courant)
333: .donnee)).pid == getpid()) &&
334: (pthread_equal((*((struct_descripteur_fichier *)
335: (*l_element_courant).donnee)).tid, pthread_self())
336: != 0))
337: {
338: (*ouverture) = d_vrai;
1.6 ! bertrand 339:
1.1 bertrand 340: (*unite) = (unsigned long)
341: fileno((*((struct_descripteur_fichier *)
1.6 ! bertrand 342: (*l_element_courant).donnee))
! 343: .descripteur_c);
1.1 bertrand 344: break;
345: }
346: }
347:
348: l_element_courant = (*l_element_courant).suivant;
349: }
350: }
351: else
352: {
353: erreur = d_erreur;
354: }
355: }
356: else
357: {
358: close(descripteur);
359: unlink(nom);
360: erreur = d_absence_erreur;
361: }
362:
363: return(erreur);
364: }
365:
1.6 ! bertrand 366:
! 367: /*
! 368: ================================================================================
! 369: Routines d'initialisation des fichiers à accès direct et indexé
! 370: ================================================================================
! 371: Entrées : pointeur sur le fichier SQLITE
! 372: --------------------------------------------------------------------------------
! 373: Sorties : drapeau d'erreur
! 374: --------------------------------------------------------------------------------
! 375: Effets de bord : néant
! 376: ================================================================================
! 377: */
! 378:
! 379: /*
! 380: * Un fichier à accès direct se compose d'une seule table :
! 381: * 1: identifiant (entier sur 64 bits) -> enregistrement
! 382: *
! 383: * Un fichier à accès indexé comporte trois tables :
! 384: * 1 : contrôle
! 385: * 2 : clef (unique) -> identifiant (entier sur 64 bits)
! 386: * 3 : identifiant -> collection d'enregistrements
! 387: *
! 388: * La table de contrôle contient
! 389: * 1/ la position de la clef pour les fichiers à accès indexés
! 390: */
! 391:
! 392: static logical1
! 393: initialisation_controle(struct_processus *s_etat_processus, sqlite3 *sqlite,
! 394: logical1 fichier_indexe)
! 395: {
! 396: const char commande1[] =
! 397: "create table control(id integer primary key asc, lock text)";
! 398: const char commande2[] =
! 399: "insert into control (id, lock) values (2, '0')";
! 400: const char *queue;
! 401:
! 402: sqlite3_stmt *ppStmt;
! 403:
! 404: if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
! 405: &queue) != SQLITE_OK)
! 406: {
! 407: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 408: return(d_erreur);
! 409: }
! 410:
! 411: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 412: {
! 413: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 414: return(d_erreur);
! 415: }
! 416:
! 417: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 418: {
! 419: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 420: return(d_erreur);
! 421: }
! 422:
! 423: if (fichier_indexe == d_vrai)
! 424: {
! 425: if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt,
! 426: &queue) != SQLITE_OK)
! 427: {
! 428: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 429: return(d_erreur);
! 430: }
! 431:
! 432: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 433: {
! 434: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 435: return(d_erreur);
! 436: }
! 437:
! 438: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 439: {
! 440: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 441: return(d_erreur);
! 442: }
! 443: }
! 444:
! 445: return(d_absence_erreur);
! 446: }
! 447:
! 448: logical1
! 449: initialisation_fichier_acces_indexe(struct_processus *s_etat_processus,
! 450: sqlite3 *sqlite, logical1 binaire)
! 451: {
! 452: const char commande1[] =
! 453: "create table data(id integer primary key asc, key_id integer, "
! 454: "lock text)";
! 455: const char commande10[] =
! 456: "create table key(id integer primary key asc, key text)";
! 457: const char commande2[] =
! 458: "create table data(id integer primary key asc, key_id integer, "
! 459: "lock blob)";
! 460: const char commande20[] =
! 461: "create table key(id integer primary key asc, key blob)";
! 462: const char commande3[] =
! 463: "create index data_idx on data(key_id)";
! 464: const char commande4[] =
! 465: "create index key_idx on key(key)";
! 466: const char *queue;
! 467:
! 468: sqlite3_stmt *ppStmt;
! 469:
! 470: if (initialisation_controle(s_etat_processus, sqlite, d_vrai)
! 471: != d_absence_erreur)
! 472: {
! 473: return(d_erreur);
! 474: }
! 475:
! 476: if (binaire == d_faux)
! 477: {
! 478: if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
! 479: &queue) != SQLITE_OK)
! 480: {
! 481: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 482: return(d_erreur);
! 483: }
! 484:
! 485: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 486: {
! 487: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 488: return(d_erreur);
! 489: }
! 490:
! 491: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 492: {
! 493: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 494: return(d_erreur);
! 495: }
! 496:
! 497: if (sqlite3_prepare_v2(sqlite, commande10, strlen(commande10), &ppStmt,
! 498: &queue) != SQLITE_OK)
! 499: {
! 500: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 501: return(d_erreur);
! 502: }
! 503:
! 504: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 505: {
! 506: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 507: return(d_erreur);
! 508: }
! 509:
! 510: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 511: {
! 512: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 513: return(d_erreur);
! 514: }
! 515: }
! 516: else
! 517: {
! 518: if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt,
! 519: &queue) != SQLITE_OK)
! 520: {
! 521: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 522: return(d_erreur);
! 523: }
! 524:
! 525: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 526: {
! 527: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 528: return(d_erreur);
! 529: }
! 530:
! 531: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 532: {
! 533: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 534: return(d_erreur);
! 535: }
! 536:
! 537: if (sqlite3_prepare_v2(sqlite, commande20, strlen(commande20), &ppStmt,
! 538: &queue) != SQLITE_OK)
! 539: {
! 540: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 541: return(d_erreur);
! 542: }
! 543:
! 544: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 545: {
! 546: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 547: return(d_erreur);
! 548: }
! 549:
! 550: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 551: {
! 552: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 553: return(d_erreur);
! 554: }
! 555: }
! 556:
! 557: if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt,
! 558: &queue) != SQLITE_OK)
! 559: {
! 560: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 561: return(d_erreur);
! 562: }
! 563:
! 564: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 565: {
! 566: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 567: return(d_erreur);
! 568: }
! 569:
! 570: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 571: {
! 572: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 573: return(d_erreur);
! 574: }
! 575:
! 576: if (sqlite3_prepare_v2(sqlite, commande4, strlen(commande4), &ppStmt,
! 577: &queue) != SQLITE_OK)
! 578: {
! 579: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 580: return(d_erreur);
! 581: }
! 582:
! 583: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 584: {
! 585: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 586: return(d_erreur);
! 587: }
! 588:
! 589: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 590: {
! 591: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 592: return(d_erreur);
! 593: }
! 594:
! 595: return(d_absence_erreur);
! 596: }
! 597:
! 598: logical1
! 599: initialisation_fichier_acces_direct(struct_processus *s_etat_processus,
! 600: sqlite3 *sqlite, logical1 binaire)
! 601: {
! 602: const char commande1[] =
! 603: "create table data(id integer primary key asc, lock text)";
! 604: const char commande2[] =
! 605: "create table data(id integer primary key asc, lock blob)";
! 606: const char commande3[] =
! 607: "create index data_idx on data(id)";
! 608: const char *queue;
! 609:
! 610: sqlite3_stmt *ppStmt;
! 611:
! 612: if (initialisation_controle(s_etat_processus, sqlite, d_faux)
! 613: != d_absence_erreur)
! 614: {
! 615: return(d_erreur);
! 616: }
! 617:
! 618: if (binaire == d_faux)
! 619: {
! 620: if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
! 621: &queue) != SQLITE_OK)
! 622: {
! 623: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 624: return(d_erreur);
! 625: }
! 626:
! 627: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 628: {
! 629: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 630: return(d_erreur);
! 631: }
! 632:
! 633: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 634: {
! 635: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 636: return(d_erreur);
! 637: }
! 638: }
! 639: else
! 640: {
! 641: if (sqlite3_prepare_v2(sqlite, commande2, strlen(commande2), &ppStmt,
! 642: &queue) != SQLITE_OK)
! 643: {
! 644: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 645: return(d_erreur);
! 646: }
! 647:
! 648: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 649: {
! 650: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 651: return(d_erreur);
! 652: }
! 653:
! 654: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 655: {
! 656: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 657: return(d_erreur);
! 658: }
! 659: }
! 660:
! 661: if (sqlite3_prepare_v2(sqlite, commande3, strlen(commande3), &ppStmt,
! 662: &queue) != SQLITE_OK)
! 663: {
! 664: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 665: return(d_erreur);
! 666: }
! 667:
! 668: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 669: {
! 670: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 671: return(d_erreur);
! 672: }
! 673:
! 674: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 675: {
! 676: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 677: return(d_erreur);
! 678: }
! 679:
! 680: return(d_absence_erreur);
! 681: }
! 682:
! 683: unsigned char *
! 684: verrouillage_fichier_sqlite(struct_processus *s_etat_processus,
! 685: sqlite3 *sqlite, unsigned char *operation)
! 686: {
! 687: const char commande1[] =
! 688: "select lock from control where id = 1";
! 689: const char commande2[] =
! 690: "update control set lock = '%s'";
! 691: const char *queue;
! 692:
! 693: const unsigned char *resultat;
! 694:
! 695: sqlite3_stmt *ppStmt;
! 696:
! 697: unsigned char *verrou;
! 698:
! 699: resultat = NULL;
! 700:
! 701: if (operation == NULL)
! 702: {
! 703: // Lecture du verrou
! 704:
! 705: if (sqlite3_prepare_v2(sqlite, commande1, strlen(commande1), &ppStmt,
! 706: &queue) != SQLITE_OK)
! 707: {
! 708: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 709: return(NULL);
! 710: }
! 711:
! 712: if (sqlite3_step(ppStmt) != SQLITE_ROW)
! 713: {
! 714: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 715: return(NULL);
! 716: }
! 717:
! 718: if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
! 719: {
! 720: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 721: return(NULL);
! 722: }
! 723:
! 724: resultat = sqlite3_column_text(ppStmt, 0);
! 725:
! 726: if ((verrou = malloc((strlen(resultat) + 1) * sizeof(unsigned char)))
! 727: == NULL)
! 728: {
! 729: return(NULL);
! 730: }
! 731:
! 732: strcpy(verrou, resultat);
! 733:
! 734: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 735: {
! 736: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 737: return(NULL);
! 738: }
! 739: }
! 740: else
! 741: {
! 742: // Positionnement d'un verrou
! 743:
! 744: if (alsprintf(&verrou, commande2, operation) < 0)
! 745: {
! 746: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 747: return(NULL);
! 748: }
! 749:
! 750: if (sqlite3_prepare_v2(sqlite, verrou, strlen(verrou), &ppStmt,
! 751: &queue) != SQLITE_OK)
! 752: {
! 753: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 754: return(NULL);
! 755: }
! 756:
! 757: if (sqlite3_step(ppStmt) != SQLITE_DONE)
! 758: {
! 759: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 760: return(NULL);
! 761: }
! 762:
! 763: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
! 764: {
! 765: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
! 766: return(NULL);
! 767: }
! 768:
! 769: free(verrou);
! 770: verrou = NULL;
! 771: }
! 772:
! 773: return(verrou);
! 774: }
! 775:
1.1 bertrand 776: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>