]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/did.c
Se agrega una razon más para elegir algoritmo de external sort.
[z.facultad/75.06/emufs.git] / emufs / did.c
1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2  *----------------------------------------------------------------------------
3  *                                  emufs
4  *----------------------------------------------------------------------------
5  * This file is part of emufs.
6  *
7  * emufs is free software; you can redistribute it and/or modify it under the
8  * terms of the GNU General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option) any later
10  * version.
11  *
12  * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
13  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
19  * Place, Suite 330, Boston, MA  02111-1307  USA
20  *----------------------------------------------------------------------------
21  * Creado:  jue abr  8 18:07:57 ART 2004
22  * Autores: Nicolás Dimov <sagardua@uolsinectis.com.ar>
23  *          Leandro Lucarella <llucare@fi.uba.ar>
24  *----------------------------------------------------------------------------
25  *
26  * $Id$
27  *
28  */
29
30 /** \file
31  *
32  * Manejo de archivos de índices de registros borrados (reutilizables).
33  * 
34  * Implementación del manejo de archivos de índices de registros borrados
35  * (reutilizables).
36  *
37  */
38
39 #include "did.h"
40 #include "error.h"
41 #include "common.h"
42 #include <unistd.h>
43 #include <string.h>
44
45 int emufs_did_crear(EMUFS* efs)
46 {
47         return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT);
48 }
49
50 EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err)
51 {
52         FILE *f_did;
53         EMUFS_REG_ID n_regid;
54         EMUFS_OFFSET n_offset;
55         char name_f_did[255];
56         long pos;
57         
58         strcpy(name_f_did, efs->nombre);
59         strcat(name_f_did, EMUFS_DID_EXT);
60         
61         if ((f_did = fopen(name_f_did, "rb")) == NULL) {
62                 PERR("No se puede abrir archivo");
63                 *err = EMUFS_ERROR_CANT_OPEN_FILE;
64                 return EMUFS_NOT_FOUND;
65         }
66         if (fseek(f_did, 0l, SEEK_END)) {
67                 PERR("No se pudo hacer fseek()");
68                 fclose(f_did);
69                 *err = EMUFS_ERROR_SEEK_FILE;
70                 return EMUFS_NOT_FOUND;
71         }
72         
73         if ((pos = ftell(f_did)) > 0){
74                 /* si el archivo no esta vacio es porque hay un nro disponible*/
75                 if (fseek(f_did, -sizeof(EMUFS_REG_ID), SEEK_END)) {
76                         PERR("No se pudo hacer fseek()");
77                         fclose(f_did);
78                         *err = EMUFS_ERROR_SEEK_FILE;
79                         return EMUFS_NOT_FOUND;
80                 }
81                 /* leo el ultimo numero */
82                 if (fread(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did) != 1) {
83                         fclose(f_did);
84                         PERR("Error al leer did");
85                         *err = EMUFS_ERROR_FILE_READ;
86                         return EMUFS_NOT_FOUND;
87                 }
88                 /* voy al final */
89                 if (fseek(f_did, 0l, SEEK_END)) {
90                         PERR("No se pudo hacer fseek()");
91                         fclose(f_did);
92                         *err = EMUFS_ERROR_SEEK_FILE;
93                         return EMUFS_NOT_FOUND;
94                 }
95                 /* mido el tamaño del archivo */
96                 if ((n_offset = ftell(f_did)) == -1) {
97                         PERR("No se pudo hacer ftell()");
98                         fclose(f_did);
99                         *err = EMUFS_ERROR_TELL_FILE;
100                         return EMUFS_NOT_FOUND;
101                 }
102                 fclose(f_did);
103                 /* lo trunco */
104                 if (truncate(name_f_did, n_offset - sizeof(EMUFS_REG_ID))) {
105                         PERR("No se pudo truncar el archivo did");
106                         *err = EMUFS_ERROR_TRUNCATE_FILE;
107                         return EMUFS_NOT_FOUND;
108                 }
109         } else if (!pos) {
110                 fclose(f_did);
111                 /* si el archivo esta vacio */
112                 n_regid = EMUFS_NOT_FOUND;
113         } else {
114                 PERR("No se pudo hacer ftell()");
115                 fclose(f_did);
116                 *err = EMUFS_ERROR_TELL_FILE;
117                 return EMUFS_NOT_FOUND;
118         }
119         return n_regid;
120 }
121
122 int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_regid)
123 {
124         FILE *f_did;
125         char name_f_did[255];
126         
127         strcpy(name_f_did, efs->nombre);
128         strcat(name_f_did, EMUFS_DID_EXT);
129         
130         if ( (f_did = fopen(name_f_did,"a+")) == NULL) return -1;
131         fwrite(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did);
132         fclose(f_did);
133         
134         return 0;
135 }
136
137 long emufs_did_get_file_size(EMUFS* efs, int* err)
138 {
139         char name[255];
140         strcpy(name, efs->nombre);
141         strcat(name, EMUFS_DID_EXT);
142         return emufs_common_get_file_size(name, err);
143 }