Changeset 573ae7 in git for Singular/sing_dbm.cc


Ignore:
Timestamp:
Aug 12, 1997, 4:54:52 PM (27 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', '2a584933abf2a2d3082034c7586d38bb6de1a30a')
Children:
1fc83c0842a018ba9551662edf168b82b7976856
Parents:
18dd47919ae71a7ba93f3772eca494ee6bc584ce
Message:
* hannes: fixed open bug in DBM links: could not open rw
          (ndbm.cc sing_dbm.cc)


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

Legend:

Unmodified
Added
Removed
  • Singular/sing_dbm.cc

    r18dd47 r573ae7  
    55//**************************************************************************/
    66//
    7 // $Id: sing_dbm.cc,v 1.5 1997-08-08 12:59:30 obachman Exp $
     7// $Id: sing_dbm.cc,v 1.6 1997-08-12 14:54:52 Singular Exp $
    88//
    99//**************************************************************************/
     
    4444  int dbm_flags = O_RDONLY | O_CREAT;  // open database readonly as default
    4545
    46   if((flag & SI_LINK_OPEN)
    47   || (flag & SI_LINK_READ)
    48   || (flag & SI_LINK_WRITE)) {
    49     if (l->mode[0] == '\0' || (strcmp(l->mode, "r") == 0))
    50       flag = SI_LINK_READ;
    51     else flag = SI_LINK_READ | SI_LINK_WRITE;
    52   }
    53 
    54   if((flag & SI_LINK_READ) || (flag & SI_LINK_WRITE)) {
    55     if( l->data == NULL ) {
    56       if ((db = (DBM_info *)malloc(sizeof *db)) == 0) {
    57         errno = ENOMEM;
    58         return TRUE;
    59       }
    60       if( flag & SI_LINK_WRITE ) {
    61         dbm_flags = O_RDWR | O_CREAT;
    62         mode = "rw";
    63       }
    64       if( (db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL ) {
    65         db->first=1;
    66         if(flag & SI_LINK_WRITE) SI_LINK_SET_RW_OPEN_P(l);
    67         else SI_LINK_SET_R_OPEN_P(l);
    68         l->data=(void *)(db);
    69         FreeL(l->mode);
    70         l->mode=mstrdup(mode);
    71         return FALSE;
    72       }
    73       Werror("dbm_open of `%s` failed",l->name);
    74     }
     46  if((flag & SI_LINK_WRITE)
     47  || ((l->mode!=NULL)&&
     48    ((l->mode[0]='w')||(l->mode[1]='w')))
     49  )
     50  {
     51    dbm_flags = O_RDWR | O_CREAT;
     52    mode = "rw";
     53    flag|=SI_LINK_WRITE;
     54  }
     55  if ((db = (DBM_info *)malloc(sizeof *db)) == 0)
     56  {
     57    return TRUE;
     58  }
     59  if( (db->db = dbm_open(l->name, dbm_flags, 0664 )) != NULL )
     60  {
     61    db->first=1;
     62    if(flag & SI_LINK_WRITE) SI_LINK_SET_RW_OPEN_P(l);
     63    else SI_LINK_SET_R_OPEN_P(l);
     64    l->data=(void *)(db);
     65    FreeL(l->mode);
     66    l->mode=mstrdup(mode);
     67    return FALSE;
    7568  }
    7669  return TRUE;
     
    8073BOOLEAN dbClose(si_link l)
    8174{
    82   DBM_info *db = l->data;
     75  DBM_info *db = (DBM_info *)l->data;
    8376
    8477  dbm_close(db->db);
     
    9386leftv dbRead2(si_link l, leftv key)
    9487{
    95   DBM_info *db = l->data;
     88  DBM_info *db = (DBM_info *)l->data;
    9689  leftv v=NULL;
    97   if(l->data != NULL) {
    98     datum d_key;
    99 
    100     if(key!=NULL)
    101     {
    102       if (key->Typ()==STRING_CMD)
    103       {
    104         d_key.dptr = (char*)key->Data();
    105         d_key.dsize = strlen(d_key.dptr)+1;
    106         d_value = dbm_fetch(db->db, d_key);
    107         v=(leftv)Alloc0(sizeof(sleftv));
    108         if (d_value.dptr!=NULL) v->data=mstrdup(d_value.dptr);
    109         else                    v->data=mstrdup("");
    110         v->rtyp=STRING_CMD;
    111       }
    112       else
    113       {
    114         WerrorS("read(`link`,`string`) expected");
    115       }
    116     }
    117     else {
    118       if(db->first) d_value = dbm_firstkey((DBM *)db->db);
    119       else d_value = dbm_nextkey((DBM *)db->db);
    120 
     90  datum d_key;
     91
     92  if(key!=NULL)
     93  {
     94    if (key->Typ()==STRING_CMD)
     95    {
     96      d_key.dptr = (char*)key->Data();
     97      d_key.dsize = strlen(d_key.dptr)+1;
     98      d_value = dbm_fetch(db->db, d_key);
    12199      v=(leftv)Alloc0(sizeof(sleftv));
     100      if (d_value.dptr!=NULL) v->data=mstrdup(d_value.dptr);
     101      else                    v->data=mstrdup("");
    122102      v->rtyp=STRING_CMD;
    123       if (d_value.dptr!=NULL) {
    124         v->data=mstrdup(d_value.dptr);
    125         db->first = 0;
    126       }
    127       else {
    128         v->data=mstrdup("");
    129         db->first = 1;
    130       }
    131 
     103    }
     104    else
     105    {
     106      WerrorS("read(`DBM link`,`string`) expected");
    132107    }
    133108  }
    134109  else
    135110  {
    136     Werror("DBM-link `%s` not open in read",l->name);
     111    if(db->first) d_value = dbm_firstkey((DBM *)db->db);
     112    else d_value = dbm_nextkey((DBM *)db->db);
     113
     114    v=(leftv)Alloc0(sizeof(sleftv));
     115    v->rtyp=STRING_CMD;
     116    if (d_value.dptr!=NULL)
     117    {
     118      v->data=mstrdup(d_value.dptr);
     119      db->first = 0;
     120    }
     121    else
     122    {
     123      v->data=mstrdup("");
     124      db->first = 1;
     125    }
     126
    137127  }
    138128  return v;
     
    145135BOOLEAN dbWrite(si_link l, leftv key)
    146136{
    147   DBM_info *db = l->data;
     137  DBM_info *db = (DBM_info *)l->data;
    148138  BOOLEAN b=TRUE;
    149139  register int ret;
    150140
    151   if(l->data != NULL) {                      // is database opened ?
    152     if((key!=NULL) && (key->Typ()==STRING_CMD) ) {
    153       if (key->next!=NULL) {                 // have a second parameter ?
    154         if(key->next->Typ()==STRING_CMD) {   // replace (key,value)
    155           datum d_key, d_value;
    156 
    157           d_key.dptr = (char *)key->Data();
    158           d_key.dsize = strlen(d_key.dptr)+1;
    159           d_value.dptr = (char *)key->next->Data();
    160           d_value.dsize = strlen(d_value.dptr)+1;
    161           ret  = dbm_store(db->db, d_key, d_value, DBM_REPLACE);
    162           if(!ret ) b=FALSE;
    163           else {
    164             if(dbm_error(db->db)) {
    165               Werror("DBM link I/O error. is '%s' readonly?", l->name);
    166               dbm_clearerr(db->db);
    167             }
    168           }
    169         }
    170       } else {                               // delete (key)
    171         datum d_key;
    172 
    173         d_key.dptr = (char *)key->Data();
    174         d_key.dsize = strlen(d_key.dptr)+1;
    175         dbm_delete(db->db, d_key);
    176         b=FALSE;
     141  // database is opened
     142  if((key!=NULL) && (key->Typ()==STRING_CMD) )
     143  {
     144    if (key->next!=NULL)                   // have a second parameter ?
     145    {
     146      if(key->next->Typ()==STRING_CMD)     // replace (key,value)
     147      {
     148        datum d_key, d_value;
     149
     150        d_key.dptr = (char *)key->Data();
     151        d_key.dsize = strlen(d_key.dptr)+1;
     152        d_value.dptr = (char *)key->next->Data();
     153        d_value.dsize = strlen(d_value.dptr)+1;
     154        ret  = dbm_store(db->db, d_key, d_value, DBM_REPLACE);
     155        if(!ret )
     156          b=FALSE;
     157        else
     158        {
     159          if(dbm_error(db->db))
     160          {
     161            Werror("DBM link I/O error. Is '%s' readonly?", l->name);
     162            dbm_clearerr(db->db);
     163          }
     164        }
    177165      }
    178     } else {
    179       WerrorS("write(`DBM link`,`key string`,`data string`) expected");
     166    }
     167    else
     168    {                               // delete (key)
     169      datum d_key;
     170
     171      d_key.dptr = (char *)key->Data();
     172      d_key.dsize = strlen(d_key.dptr)+1;
     173      dbm_delete(db->db, d_key);
     174      b=FALSE;
    180175    }
    181176  }
    182177  else
    183178  {
    184     Werror("DBM-link `%s` not open in write",l->name);
     179    WerrorS("write(`DBM link`,`key string`,`data string`) expected");
    185180  }
    186181  return b;
Note: See TracChangeset for help on using the changeset viewer.