source: git/Singular/sing_dbm.cc @ a70441f

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