source: git/Singular/links/sing_dbm.cc @ 2e4ec14

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