source: git/Singular/links/sing_dbm.cc @ 5acb5a

spielwiese
Last change on this file since 5acb5a was 5acb5a, checked in by Hans Schoenemann <hannes@…>, 4 years ago
fix: warning register
  • Property mode set to 100644
File size: 11.0 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4
5//**************************************************************************/
6//  'sing_dbm.cc' containes command to handle dbm-files under
7// Singular.
8//
9//**************************************************************************/
10
11#include "kernel/mod2.h"
12
13#  include <fcntl.h>
14
15#ifdef HAVE_DBM
16
17#  include "Singular/tok.h"
18#  include "Singular/ipid.h"
19#  include "Singular/links/silink.h"
20#  include "Singular/links/sing_dbm.h"
21
22// #ifdef __CYGWIN__
23// #  define USE_GDBM
24// #  define BLOCKSIZE 1
25// #  define GDBM_STATIC
26// #  include <gdbm.h>
27// #endif
28
29#ifdef USE_GDBM
30typedef struct {
31  GDBM_FILE db;        // pointer to open database
32  int first;      // firstkey to look for?
33  datum actual;  // the actual key
34} GDBM_info;
35
36//**************************************************************************/
37LINKAGE BOOLEAN dbOpen(si_link l, short flag, leftv u)
38{
39  char *mode = "r";
40  GDBM_info *db;
41  datum d_key;
42  //  int dbm_flags = O_RDONLY | O_CREAT;  // open database readonly as default
43  int read_write= GDBM_READER;
44
45  if(flag & SI_LINK_WRITE)
46  {
47 //    if((l->mode==NULL)
48//     || ((l->mode[0]!='w')&&(l->mode[1]!='w')))
49//     {
50//       // request w- open, but mode is not "w" nor "rw" => fail
51//       return TRUE;
52//    }
53    //    dbm_flags = O_RDWR | O_CREAT;
54    read_write =  GDBM_WRCREAT | GDBM_NOLOCK;
55    mode = "rw";
56  }
57  if(flag & SI_LINK_READ)
58    {
59      if (strcmp(l->mode,"rw")==0) mode="rw";
60    }
61  //if (((db = (DBM_info *)omAlloc(sizeof *db)) != NULL)
62  //&&((db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL ))
63  db = (GDBM_info *)omAlloc0(sizeof *db);
64  if((db->db = gdbm_open(l->name, BLOCKSIZE, read_write, 0664, 0)) != NULL )
65  {
66//     if (db->first) // first created?
67//       {
68//         db->actual=gdbm_firstkey(db->db);
69//       }
70//     else
71//       {
72//     d_key=db->actual;
73//     if (d_key.dptr!=NULL)
74//       {
75//         db->actual=gdbm_nextkey(db->db,db->actual);
76//       }
77//     else { db->actual=gdbm_firstkey(db->db); }
78//      }
79    db->first=1;
80    if(flag & SI_LINK_WRITE)
81      SI_LINK_SET_W_OPEN_P(l);
82    else
83      SI_LINK_SET_R_OPEN_P(l);
84    l->data=(void *)(db);
85    omFree(l->mode);
86    l->mode=omStrDup(mode);
87    return FALSE;
88  }
89  Print("%d/%s",gdbm_errno,gdbm_strerror(gdbm_errno));
90  return TRUE;
91}
92
93//**************************************************************************/
94LINKAGE BOOLEAN dbClose(si_link l)
95{
96  GDBM_info *db = (GDBM_info *)l->data;
97  gdbm_sync(db->db);
98  gdbm_close(db->db);
99  omFreeSize((ADDRESS)db,(sizeof *db));
100  l->data=NULL;
101  SI_LINK_SET_CLOSE_P(l);
102  return FALSE;
103}
104
105//**************************************************************************/
106STATIC_VAR datum d_value;
107LINKAGE leftv dbRead2(si_link l, leftv key)
108{
109  GDBM_info *db = (GDBM_info *)l->data;
110  // GDBM_info *db;
111//   db = (GDBM_info *)omAlloc0(sizeof *db);
112//   db = (GDBM_info *)l->data;
113  leftv v=NULL;
114  datum d_key;
115  int flag;
116
117  if (!SI_LINK_R_OPEN_P(l)) //exceptions
118    //  if (strcmp(l->mode,"rw")==0) //rw-mode
119    {
120      if (!SI_LINK_CLOSE_P(l))
121      {
122        if (!dbClose(l)) {PrintS("cannot close link!\n");}
123      }
124      //(SI_LINK_CLOSE_P(l)) automatically
125      if (dbOpen(l, SI_LINK_READ)) return NULL;
126    }
127  if (SI_LINK_RW_OPEN_P(l)) {PrintS("I/O Error!\n");}
128
129  if(key!=NULL)
130  {
131    if (key->Typ()==STRING_CMD)
132    {
133      d_key.dptr = (char*)key->Data();
134      d_key.dsize = strlen(d_key.dptr)+1;
135      d_value = gdbm_fetch(db->db, d_key);
136      v=(leftv)omAlloc0Bin(sleftv_bin);
137      if (d_value.dptr!=NULL) v->data=omStrDup(d_value.dptr);
138      else                    v->data=omStrDup("");
139      v->rtyp=STRING_CMD;
140    }
141    else
142    {
143      WerrorS("read(`GDBM link`,`string`) expected");
144    }
145  }
146  else
147  {
148    if (db->first)
149    {
150      db->first=0;
151      d_key = gdbm_firstkey(db->db);
152   //    db->actual=d_key;
153//       Print("firstkey:%s\n",d_key.dptr);
154    }
155    else
156    {
157      if (db->actual.dptr==NULL)
158      {
159        db->actual=gdbm_firstkey(db->db);
160      }
161      d_key = gdbm_nextkey(db->db,db->actual);
162      db->actual=d_key;
163      if (d_key.dptr==NULL)
164      {
165        db->first=1;
166      // Print("nextkey:NULL\n");
167      }
168     //  else
169//       Print("nextkey:%s\n",d_key.dptr);
170    }
171
172    if (d_key.dptr!=NULL)
173      d_value = gdbm_fetch(db->db, d_key);
174    else
175      d_value.dptr=NULL;
176
177    v=(leftv)omAlloc0Bin(sleftv_bin);
178    v->rtyp=STRING_CMD;
179    if (d_value.dptr!=NULL)
180    {
181      v->data=omStrDup(d_key.dptr);
182      db->first = 0;
183    }
184    else
185    {
186      v->data=omStrDup("");
187      //      db->first = 1;
188    }
189
190  }
191  return v;
192}
193LINKAGE leftv dbRead1(si_link l)
194{
195  return dbRead2(l,NULL);
196}
197//**************************************************************************/
198LINKAGE BOOLEAN dbWrite(si_link l, leftv key)
199{
200  GDBM_info *db = (GDBM_info *)l->data;
201 //  GDBM_info *db;
202//   db = (GDBM_info *)omAlloc0(sizeof *db);
203//   db = (GDBM_info *)l->data;
204  BOOLEAN b=TRUE;
205  REGISTER int ret;
206
207  if (strcmp(l->mode,"rw")!=0) // r-mode
208    {
209      PrintS("Write error on readonly source\n");
210    }
211  else //rw-mode
212    {
213      if (!SI_LINK_W_OPEN_P(l)) //exceptions
214      {
215        if (!SI_LINK_CLOSE_P(l))
216        {
217          if (!dbClose(l)) {PrintS("close error\n");};
218        }
219        if (!dbOpen(l,SI_LINK_WRITE)) {PrintS("open_for_write error\n");}
220      }
221    }
222
223  if((key!=NULL) && (key->Typ()==STRING_CMD) )
224  {
225    if (key->next!=NULL)                   // have a second parameter ?
226    {
227      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
228      {
229        datum d_key, d_value;
230
231        d_key.dptr = (char *)key->Data();
232        d_key.dsize = strlen(d_key.dptr)+1;
233        d_value.dptr = (char *)key->next->Data();
234        d_value.dsize = strlen(d_value.dptr)+1;
235        ret  = gdbm_store(db->db, d_key, d_value, GDBM_REPLACE);
236//         db->actual=d_key;
237        if (ret==-1) {PrintS("reader calls gdbm_store!");}
238        if (ret==0)
239          { b=FALSE; }
240        else
241        {
242          //          if(gdbm_error(db->db))
243          if (gdbm_errno != 0)
244          {
245            Werror("GDBM link I/O error: '%s' ", gdbm_errno);
246            //            Print(gdbm_strerror(gdbm_errno));
247            //dbm_clearerr(db->db);
248            //            gdbm_errno=0;
249          }
250        }
251      }
252    }
253    else
254    {                               // delete (key)
255      datum d_key;
256
257      d_key.dptr = (char *)key->Data();
258      d_key.dsize = strlen(d_key.dptr)+1;
259 //      db->actual=gdbm_nextkey(db->db,d_key);
260      gdbm_delete(db->db, d_key);
261      b=FALSE;
262    }
263  }
264  else
265  {
266    WerrorS("write(`GDBM link`,`key string` [,`data string`]) expected");
267  }
268  gdbm_sync(db->db);
269  return b;
270}
271#endif /* USE_GDBM */
272
273#ifndef USE_GDBM
274/* These are the routines in dbm. */
275#  include "ndbm.h"
276typedef struct {
277  DBM *db;        // pointer to open database
278  int first;      // firstkey to look for?
279} DBM_info;
280
281//**************************************************************************/
282LINKAGE BOOLEAN dbOpen(si_link l, short flag, leftv /*u*/)
283{
284  const char *mode = "r";
285  DBM_info *db;
286  int dbm_flags = O_RDONLY | O_CREAT;  // open database readonly as default
287
288  if((l->mode!=NULL)
289  && ((l->mode[0]=='w')||(l->mode[1]=='w')))
290  {
291    dbm_flags = O_RDWR | O_CREAT;
292    mode = "rw";
293    flag|=SI_LINK_WRITE|SI_LINK_READ;
294  }
295  else if(flag & SI_LINK_WRITE)
296  {
297    // request w- open, but mode is not "w" nor "rw" => fail
298    return TRUE;
299  }
300  //if (((db = (DBM_info *)omAlloc(sizeof *db)) != NULL)
301  //&&((db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL ))
302  db = (DBM_info *)omAlloc(sizeof *db);
303  if((db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL )
304  {
305    db->first=1;
306    if(flag & SI_LINK_WRITE)
307      SI_LINK_SET_RW_OPEN_P(l);
308    else
309      SI_LINK_SET_R_OPEN_P(l);
310    l->data=(void *)(db);
311    omFree(l->mode);
312    l->mode=omStrDup(mode);
313    return FALSE;
314  }
315  return TRUE;
316}
317
318//**************************************************************************/
319LINKAGE BOOLEAN dbClose(si_link l)
320{
321  DBM_info *db = (DBM_info *)l->data;
322
323  dbm_close(db->db);
324  omFreeSize((ADDRESS)db,(sizeof *db));
325  l->data=NULL;
326  SI_LINK_SET_CLOSE_P(l);
327  return FALSE;
328}
329
330//**************************************************************************/
331STATIC_VAR datum d_value;
332LINKAGE leftv dbRead2(si_link l, leftv key)
333{
334  DBM_info *db = (DBM_info *)l->data;
335  leftv v=NULL;
336  datum d_key;
337
338  if(key!=NULL)
339  {
340    if (key->Typ()==STRING_CMD)
341    {
342      d_key.dptr = (char*)key->Data();
343      d_key.dsize = strlen(d_key.dptr)+1;
344      d_value = dbm_fetch(db->db, d_key);
345      v=(leftv)omAlloc0Bin(sleftv_bin);
346      if (d_value.dptr!=NULL) v->data=omStrDup(d_value.dptr);
347      else                    v->data=omStrDup("");
348      v->rtyp=STRING_CMD;
349    }
350    else
351    {
352      WerrorS("read(`DBM link`,`string`) expected");
353    }
354  }
355  else
356  {
357    if(db->first)
358      d_value = dbm_firstkey((DBM *)db->db);
359    else
360      d_value = dbm_nextkey((DBM *)db->db);
361
362    v=(leftv)omAlloc0Bin(sleftv_bin);
363    v->rtyp=STRING_CMD;
364    if (d_value.dptr!=NULL)
365    {
366      v->data=omStrDup(d_value.dptr);
367      db->first = 0;
368    }
369    else
370    {
371      v->data=omStrDup("");
372      db->first = 1;
373    }
374
375  }
376  return v;
377}
378LINKAGE leftv dbRead1(si_link l)
379{
380  return dbRead2(l,NULL);
381}
382//**************************************************************************/
383LINKAGE BOOLEAN dbWrite(si_link l, leftv key)
384{
385  DBM_info *db = (DBM_info *)l->data;
386  BOOLEAN b=TRUE;
387  int ret;
388
389  // database is opened
390  if((key!=NULL) && (key->Typ()==STRING_CMD) )
391  {
392    if (key->next!=NULL)                   // have a second parameter ?
393    {
394      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
395      {
396        datum d_key, d_value;
397
398        d_key.dptr = (char *)key->Data();
399        d_key.dsize = strlen(d_key.dptr)+1;
400        d_value.dptr = (char *)key->next->Data();
401        d_value.dsize = strlen(d_value.dptr)+1;
402        ret  = dbm_store(db->db, d_key, d_value, DBM_REPLACE);
403        if(!ret )
404          b=FALSE;
405        else
406        {
407          if(dbm_error(db->db))
408          {
409            Werror("DBM link I/O error. Is '%s' readonly?", l->name);
410            dbm_clearerr(db->db);
411          }
412        }
413      }
414    }
415    else
416    {                               // delete (key)
417      datum d_key;
418
419      d_key.dptr = (char *)key->Data();
420      d_key.dsize = strlen(d_key.dptr)+1;
421      dbm_delete(db->db, d_key);
422      b=FALSE;
423    }
424  }
425  else
426  {
427    WerrorS("write(`DBM link`,`key string` [,`data string`]) expected");
428  }
429  return b;
430}
431//**************************************************************************/
432//char *dbStatus(si_link l, char *request)
433//{
434//  if (strcmp(request, "read") == 0)
435//  {
436//    if (SI_LINK_R_OPEN_P(l))
437//      return "ready";
438//    else
439//      return "not ready";
440//  }
441//  else if (strcmp(request, "write") == 0)
442//  {
443//    if (SI_LINK_W_OPEN_P(l))
444//      return "ready";
445//    else
446//      return "not ready";
447//  }
448//  else return "unknown status request";
449//}
450//**************************************************************************/
451
452#endif /* USE_GDBM */
453#endif /* HAVE_DBM */
Note: See TracBrowser for help on using the repository browser.