Changeset fcafdb in git for Singular/sing_dbm.cc


Ignore:
Timestamp:
Feb 27, 2001, 4:50:04 PM (23 years ago)
Author:
Viktor Levandovskyy <levandov@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
8cfee1c3269a440dc074eae208795fd4da490c0e
Parents:
c2f5270fb552e6b92d376b11a283d939362193a4
Message:
gdbm-related stuff for win32


git-svn-id: file:///usr/local/Singular/svn/trunk@5284 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/sing_dbm.cc

    rc2f5270 rfcafdb  
    55//**************************************************************************/
    66//
    7 // $Id: sing_dbm.cc,v 1.15 2000-12-12 08:44:53 obachman Exp $
     7// $Id: sing_dbm.cc,v 1.16 2001-02-27 15:50:04 levandov Exp $
    88//
    99//**************************************************************************/
     
    2727#  include "silink.h"
    2828#  include "sing_dbm.h"
    29 
     29#ifdef USE_GDBM
     30#  include "gdbm.h"
     31#endif
     32
     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)
     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;
     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  return TRUE;
     95}
     96
     97//**************************************************************************/
     98LINKAGE BOOLEAN dbClose(si_link l)
     99{
     100  GDBM_info *db = (GDBM_info *)l->data;
     101  gdbm_close(db->db);
     102  omFreeSize((ADDRESS)db,(sizeof *db));
     103  l->data=NULL; 
     104  SI_LINK_SET_CLOSE_P(l);
     105  return FALSE;
     106}
     107
     108//**************************************************************************/
     109static datum d_value;
     110LINKAGE leftv dbRead2(si_link l, leftv key)
     111{
     112  GDBM_info *db = (GDBM_info *)l->data;
     113  // GDBM_info *db;
     114//   db = (GDBM_info *)omAlloc0(sizeof *db);
     115//   db = (GDBM_info *)l->data;
     116  leftv v=NULL;
     117  datum d_key;
     118  int flag;
     119
     120  if (!SI_LINK_R_OPEN_P(l)) //exceptions
     121    //  if (strcmp(l->mode,"rw")==0) //rw-mode
     122    {
     123      if (!SI_LINK_CLOSE_P(l))
     124        {
     125          if (!dbClose(l)) {Print("cannot close link!\n");}
     126        }
     127      //(SI_LINK_CLOSE_P(l)) automatically     
     128      dbOpen(l, SI_LINK_READ);
     129    }
     130  if (SI_LINK_RW_OPEN_P(l)) {Print("I/O Error!\n");}
     131
     132  if(key!=NULL)
     133  {
     134    if (key->Typ()==STRING_CMD)
     135    {
     136      d_key.dptr = (char*)key->Data();
     137      d_key.dsize = strlen(d_key.dptr)+1;
     138      d_value = gdbm_fetch(db->db, d_key);
     139      v=(leftv)omAlloc0Bin(sleftv_bin);
     140      if (d_value.dptr!=NULL) v->data=omStrDup(d_value.dptr);
     141      else                    v->data=omStrDup("");
     142      v->rtyp=STRING_CMD;
     143    }
     144    else
     145    {
     146      WerrorS("read(`GDBM link`,`string`) expected");
     147    }
     148  }
     149  else
     150  {
     151    if (db->first)
     152    {
     153      db->first=0;
     154      d_key = gdbm_firstkey(db->db);
     155   //    db->actual=d_key;
     156//       Print("firstkey:%s\n",d_key.dptr);
     157    }
     158    else
     159    {
     160      if (db->actual.dptr==NULL)
     161      {
     162        db->actual=gdbm_firstkey(db->db);
     163      }
     164      d_key = gdbm_nextkey(db->db,db->actual);
     165      db->actual=d_key;
     166      if (d_key.dptr==NULL)
     167      {
     168        db->first=1;
     169      // Print("nextkey:NULL\n");
     170      }
     171     //  else
     172//       Print("nextkey:%s\n",d_key.dptr);
     173    }
     174
     175    if (d_key.dptr!=NULL)
     176      d_value = gdbm_fetch(db->db, d_key);
     177    else
     178      d_value.dptr=NULL;
     179
     180    v=(leftv)omAlloc0Bin(sleftv_bin);
     181    v->rtyp=STRING_CMD;
     182    if (d_value.dptr!=NULL)
     183    {
     184      v->data=omStrDup(d_key.dptr);
     185      db->first = 0;
     186    }
     187    else
     188    {
     189      v->data=omStrDup("");
     190      //      db->first = 1;
     191    }
     192
     193  }
     194  return v;
     195}
     196LINKAGE leftv dbRead1(si_link l)
     197{
     198  return dbRead2(l,NULL);
     199}
     200//**************************************************************************/
     201LINKAGE BOOLEAN dbWrite(si_link l, leftv key)
     202{
     203  GDBM_info *db = (GDBM_info *)l->data;
     204 //  GDBM_info *db;
     205//   db = (GDBM_info *)omAlloc0(sizeof *db);
     206//   db = (GDBM_info *)l->data;
     207  BOOLEAN b=TRUE;
     208  register int ret;
     209 
     210  if (strcmp(l->mode,"rw")!=0) // r-mode
     211    {
     212      Print("Write error on readonly source\n");
     213    }
     214  else //rw-mode
     215    {
     216      if (!SI_LINK_W_OPEN_P(l)) //exceptions
     217        {
     218          if (!SI_LINK_CLOSE_P(l))
     219            {
     220              if (!dbClose(l)) {Print("close error\n");};
     221            }
     222          if (!dbOpen(l,SI_LINK_WRITE)) {Print("open_for_write error\n");}
     223        }
     224    }
     225
     226  if((key!=NULL) && (key->Typ()==STRING_CMD) )
     227  {
     228    if (key->next!=NULL)                   // have a second parameter ?
     229    {
     230      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
     231      {
     232        datum d_key, d_value;
     233
     234        d_key.dptr = (char *)key->Data();
     235        d_key.dsize = strlen(d_key.dptr)+1;
     236        d_value.dptr = (char *)key->next->Data();
     237        d_value.dsize = strlen(d_value.dptr)+1;
     238        ret  = gdbm_store(db->db, d_key, d_value, GDBM_REPLACE);
     239//         db->actual=d_key;
     240        if (ret==-1) {Print("reader calls gdbm_store!");}
     241        if (ret==0)
     242          { b=FALSE; }
     243        else
     244        {
     245          //          if(gdbm_error(db->db))
     246          if (gdbm_errno!=0)
     247          {
     248            //              Werror("GDBM link I/O error. Is '%s' readonly?", l->name);
     249            Print(gdbm_strerror(gdbm_errno));
     250            //dbm_clearerr(db->db);
     251            //            gdbm_errno=0;
     252          }
     253        }
     254      }
     255    }
     256    else
     257    {                               // delete (key)
     258      datum d_key;
     259
     260      d_key.dptr = (char *)key->Data();
     261      d_key.dsize = strlen(d_key.dptr)+1;
     262 //      db->actual=gdbm_nextkey(db->db,d_key);
     263      gdbm_delete(db->db, d_key);
     264      b=FALSE;
     265    }
     266  }
     267  else
     268  {
     269    WerrorS("write(`GDBM link`,`key string` [,`data string`]) expected");
     270  }
     271  return b;
     272}
     273#endif /* USE_GDBM */
     274
     275#ifndef USE_GDBM
    30276/* These are the routines in dbm. */
    31277#  include "ndbm.h"
     
    206452//**************************************************************************/
    207453
     454#endif /* USE_GDBM */
    208455#endif /* HAVE_DBM */
Note: See TracChangeset for help on using the changeset viewer.