source: git/Singular/sing_dbm.cc @ 97a7b44

spielwiese
Last change on this file since 97a7b44 was 80419f, checked in by Olaf Bachmann <obachman@…>, 26 years ago
1998-10-14 Olaf Bachmann <obachman@mathematik.uni-kl.de> * sing_mp.cc (slOpenMPLaunch): added slKill as link function * added --MPrsh to slOpenLaunch git-svn-id: file:///usr/local/Singular/svn/trunk@2563 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.10 1998-10-14 10:18:55 obachman 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  db = (DBM_info *)Alloc(sizeof *db);
58  if((db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL )
59  {
60    db->first=1;
61    if(flag & SI_LINK_WRITE)
62      SI_LINK_SET_RW_OPEN_P(l);
63    else
64      SI_LINK_SET_R_OPEN_P(l);
65    l->data=(void *)(db);
66    FreeL(l->mode);
67    l->mode=mstrdup(mode);
68    return FALSE;
69  }
70  return TRUE;
71}
72
73//**************************************************************************/
74BOOLEAN dbClose(si_link l)
75{
76  DBM_info *db = (DBM_info *)l->data;
77
78  dbm_close(db->db);
79  Free((ADDRESS)db,(sizeof *db));
80  l->data=NULL; 
81  SI_LINK_SET_CLOSE_P(l);
82  return FALSE;
83}
84
85//**************************************************************************/
86static datum d_value;
87leftv dbRead2(si_link l, leftv key)
88{
89  DBM_info *db = (DBM_info *)l->data;
90  leftv v=NULL;
91  datum d_key;
92
93  if(key!=NULL)
94  {
95    if (key->Typ()==STRING_CMD)
96    {
97      d_key.dptr = (char*)key->Data();
98      d_key.dsize = strlen(d_key.dptr)+1;
99      d_value = dbm_fetch(db->db, d_key);
100      v=(leftv)Alloc0(sizeof(sleftv));
101      if (d_value.dptr!=NULL) v->data=mstrdup(d_value.dptr);
102      else                    v->data=mstrdup("");
103      v->rtyp=STRING_CMD;
104    }
105    else
106    {
107      WerrorS("read(`DBM link`,`string`) expected");
108    }
109  }
110  else
111  {
112    if(db->first)
113      d_value = dbm_firstkey((DBM *)db->db);
114    else
115      d_value = dbm_nextkey((DBM *)db->db);
116
117    v=(leftv)Alloc0(sizeof(sleftv));
118    v->rtyp=STRING_CMD;
119    if (d_value.dptr!=NULL)
120    {
121      v->data=mstrdup(d_value.dptr);
122      db->first = 0;
123    }
124    else
125    {
126      v->data=mstrdup("");
127      db->first = 1;
128    }
129
130  }
131  return v;
132}
133leftv dbRead1(si_link l)
134{
135  return dbRead2(l,NULL);
136}
137//**************************************************************************/
138BOOLEAN dbWrite(si_link l, leftv key)
139{
140  DBM_info *db = (DBM_info *)l->data;
141  BOOLEAN b=TRUE;
142  register int ret;
143
144  // database is opened
145  if((key!=NULL) && (key->Typ()==STRING_CMD) )
146  { 
147    if (key->next!=NULL)                   // have a second parameter ?
148    {
149      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
150      {
151        datum d_key, d_value;
152
153        d_key.dptr = (char *)key->Data();
154        d_key.dsize = strlen(d_key.dptr)+1;
155        d_value.dptr = (char *)key->next->Data();
156        d_value.dsize = strlen(d_value.dptr)+1;
157        ret  = dbm_store(db->db, d_key, d_value, DBM_REPLACE);
158        if(!ret )
159          b=FALSE;
160        else
161        {
162          if(dbm_error(db->db))
163          {
164            Werror("DBM link I/O error. Is '%s' readonly?", l->name);
165            dbm_clearerr(db->db);
166          }
167        }
168      }
169    }
170    else
171    {                               // delete (key)
172      datum d_key;
173
174      d_key.dptr = (char *)key->Data();
175      d_key.dsize = strlen(d_key.dptr)+1;
176      dbm_delete(db->db, d_key);
177      b=FALSE;
178    }
179  }
180  else
181  {
182    WerrorS("write(`DBM link`,`key string` [,`data string`]) expected");
183  }
184  return b;
185}
186//**************************************************************************/
187//char *dbStatus(si_link l, char *request)
188//{
189//  if (strcmp(request, "read") == 0)
190//  {
191//    if (SI_LINK_R_OPEN_P(l))
192//      return "ready";
193//    else
194//      return "not ready";
195//  }
196//  else if (strcmp(request, "write") == 0)
197//  {
198//    if (SI_LINK_W_OPEN_P(l))
199//      return "ready";
200//    else
201//      return "not ready";
202//  }
203//  else return "unknown status request";
204//}
205//**************************************************************************/
206si_link_extension slInitDBMExtension(si_link_extension s)
207{
208  s->Open=dbOpen;
209  s->Close=dbClose;
210  s->Kill=dbClose;
211  s->Read=dbRead1;
212  s->Read2=dbRead2;
213  s->Write=dbWrite;
214  //s->Dump=NULL;
215  //s->GetDump=NULL;
216  //s->Status=dbStatus;
217  s->Status=slStatusAscii;
218  s->type="DBM";
219  return s;
220}
221#endif /* HAVE_DBM */
Note: See TracBrowser for help on using the repository browser.