source: git/Singular/sing_dbm.cc @ 5480da

spielwiese
Last change on this file since 5480da was 8fda0d, checked in by Hans Schönemann <hannes@…>, 27 years ago
* hannes: made mode "r" the default for DBM: (sing_dbm.cc) git-svn-id: file:///usr/local/Singular/svn/trunk@616 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4
5//**************************************************************************/
6//
7// $Id: sing_dbm.cc,v 1.8 1997-08-13 13:51:42 Singular Exp $
8//
9//**************************************************************************/
10//  'sing_dbm.cc' containes command to handle dbm-files under
11// Singular.
12//
13//**************************************************************************/
14
15#include "mod2.h"
16
17#ifdef HAVE_DBM
18
19#  include <stdio.h>
20#  include <fcntl.h>
21#  include <errno.h>
22#  include "tok.h"
23#  include "febase.h"
24#  include "mmemory.h"
25#  include "ipid.h"
26#  include "silink.h"
27#  include "sing_dbm.h"
28
29/* These are the routines in dbm. */
30#  include "ndbm.h"
31typedef struct {
32  DBM *db;        // pointer to open database
33  int first;      // firstkey to look for?
34} DBM_info;
35
36//**************************************************************************/
37BOOLEAN dbOpen(si_link l, short flag)
38{
39  char *mode = "r";
40  DBM_info *db;
41  int dbm_flags = O_RDONLY | O_CREAT;  // open database readonly as default
42
43  if((l->mode!=NULL)
44  && ((l->mode[0]=='w')||(l->mode[1]=='w')))
45  {
46    dbm_flags = O_RDWR | O_CREAT;
47    mode = "rw";
48    flag|=SI_LINK_WRITE|SI_LINK_READ;
49  }
50  else if(flag & SI_LINK_WRITE)
51  {
52    // request w- open, but mode is not "w" nor "rw" => fail
53    return TRUE;
54  }
55  if (((db = (DBM_info *)Alloc(sizeof *db)) != NULL)
56  &&((db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL ))
57  {
58    db->first=1;
59    if(flag & SI_LINK_WRITE)
60      SI_LINK_SET_RW_OPEN_P(l);
61    else
62      SI_LINK_SET_R_OPEN_P(l);
63    l->data=(void *)(db);
64    FreeL(l->mode);
65    l->mode=mstrdup(mode);
66    return FALSE;
67  }
68  return TRUE;
69}
70
71//**************************************************************************/
72BOOLEAN dbClose(si_link l)
73{
74  DBM_info *db = (DBM_info *)l->data;
75
76  dbm_close(db->db);
77  Free((ADDRESS)db,(sizeof *db));
78  l->data=NULL; 
79  SI_LINK_SET_CLOSE_P(l);
80  return FALSE;
81}
82
83//**************************************************************************/
84static datum d_value;
85leftv dbRead2(si_link l, leftv key)
86{
87  DBM_info *db = (DBM_info *)l->data;
88  leftv v=NULL;
89  datum d_key;
90
91  if(key!=NULL)
92  {
93    if (key->Typ()==STRING_CMD)
94    {
95      d_key.dptr = (char*)key->Data();
96      d_key.dsize = strlen(d_key.dptr)+1;
97      d_value = dbm_fetch(db->db, d_key);
98      v=(leftv)Alloc0(sizeof(sleftv));
99      if (d_value.dptr!=NULL) v->data=mstrdup(d_value.dptr);
100      else                    v->data=mstrdup("");
101      v->rtyp=STRING_CMD;
102    }
103    else
104    {
105      WerrorS("read(`DBM link`,`string`) expected");
106    }
107  }
108  else
109  {
110    if(db->first)
111      d_value = dbm_firstkey((DBM *)db->db);
112    else
113      d_value = dbm_nextkey((DBM *)db->db);
114
115    v=(leftv)Alloc0(sizeof(sleftv));
116    v->rtyp=STRING_CMD;
117    if (d_value.dptr!=NULL)
118    {
119      v->data=mstrdup(d_value.dptr);
120      db->first = 0;
121    }
122    else
123    {
124      v->data=mstrdup("");
125      db->first = 1;
126    }
127
128  }
129  return v;
130}
131leftv dbRead1(si_link l)
132{
133  return dbRead2(l,NULL);
134}
135//**************************************************************************/
136BOOLEAN dbWrite(si_link l, leftv key)
137{
138  DBM_info *db = (DBM_info *)l->data;
139  BOOLEAN b=TRUE;
140  register int ret;
141
142  // database is opened
143  if((key!=NULL) && (key->Typ()==STRING_CMD) )
144  { 
145    if (key->next!=NULL)                   // have a second parameter ?
146    {
147      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
148      {
149        datum d_key, d_value;
150
151        d_key.dptr = (char *)key->Data();
152        d_key.dsize = strlen(d_key.dptr)+1;
153        d_value.dptr = (char *)key->next->Data();
154        d_value.dsize = strlen(d_value.dptr)+1;
155        ret  = dbm_store(db->db, d_key, d_value, DBM_REPLACE);
156        if(!ret )
157          b=FALSE;
158        else
159        {
160          if(dbm_error(db->db))
161          {
162            Werror("DBM link I/O error. Is '%s' readonly?", l->name);
163            dbm_clearerr(db->db);
164          }
165        }
166      }
167    }
168    else
169    {                               // delete (key)
170      datum d_key;
171
172      d_key.dptr = (char *)key->Data();
173      d_key.dsize = strlen(d_key.dptr)+1;
174      dbm_delete(db->db, d_key);
175      b=FALSE;
176    }
177  }
178  else
179  {
180    WerrorS("write(`DBM link`,`key string` [,`data string`]) expected");
181  }
182  return b;
183}
184//**************************************************************************/
185//char *dbStatus(si_link l, char *request)
186//{
187//  if (strcmp(request, "read") == 0)
188//  {
189//    if (SI_LINK_R_OPEN_P(l))
190//      return "ready";
191//    else
192//      return "not ready";
193//  }
194//  else if (strcmp(request, "write") == 0)
195//  {
196//    if (SI_LINK_W_OPEN_P(l))
197//      return "ready";
198//    else
199//      return "not ready";
200//  }
201//  else return "unknown status request";
202//}
203//**************************************************************************/
204si_link_extension slInitDBMExtension(si_link_extension s)
205{
206  s->Open=dbOpen;
207  s->Close=dbClose;
208  s->Read=dbRead1;
209  s->Read2=dbRead2;
210  s->Write=dbWrite;
211  //s->Dump=NULL;
212  //s->GetDump=NULL;
213  //s->Status=dbStatus;
214  s->Status=slStatusAscii;
215  s->type="DBM";
216  return s;
217}
218#endif /* HAVE_DBM */
Note: See TracBrowser for help on using the repository browser.