home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / perl-5.003-base.tgz / perl-5.003-base.tar / fsf / perl / ext / ODBM_File / ODBM_File.xs < prev    next >
Text File  |  1995-10-19  |  2KB  |  102 lines

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4.  
  5. #ifdef NULL
  6. #undef NULL
  7. #endif
  8. #ifdef I_DBM
  9. #  include <dbm.h>
  10. #else
  11. #  ifdef I_RPCSVC_DBM
  12. #    include <rpcsvc/dbm.h>
  13. #  endif
  14. #endif
  15.  
  16. #include <fcntl.h>
  17.  
  18. typedef void* ODBM_File;
  19.  
  20. #define odbm_FETCH(db,key)            fetch(key)
  21. #define odbm_STORE(db,key,value,flags)        store(key,value)
  22. #define odbm_DELETE(db,key)            delete(key)
  23. #define odbm_FIRSTKEY(db)            firstkey()
  24. #define odbm_NEXTKEY(db,key)            nextkey(key)
  25.  
  26. static int dbmrefcnt;
  27.  
  28. #ifndef DBM_REPLACE
  29. #define DBM_REPLACE 0
  30. #endif
  31.  
  32. MODULE = ODBM_File    PACKAGE = ODBM_File    PREFIX = odbm_
  33.  
  34. ODBM_File
  35. odbm_TIEHASH(dbtype, filename, flags, mode)
  36.     char *        dbtype
  37.     char *        filename
  38.     int        flags
  39.     int        mode
  40.     CODE:
  41.     {
  42.         char tmpbuf[1025];
  43.         if (dbmrefcnt++)
  44.         croak("Old dbm can only open one database");
  45.         sprintf(tmpbuf,"%s.dir",filename);
  46.         if (stat(tmpbuf, &statbuf) < 0) {
  47.         if (flags & O_CREAT) {
  48.             if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
  49.             croak("ODBM_File: Can't create %s", filename);
  50.             sprintf(tmpbuf,"%s.pag",filename);
  51.             if (close(creat(tmpbuf,mode)) < 0)
  52.             croak("ODBM_File: Can't create %s", filename);
  53.         }
  54.         else
  55.             croak("ODBM_FILE: Can't open %s", filename);
  56.         }
  57.         RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
  58.         ST(0) = sv_mortalcopy(&sv_undef);
  59.         sv_setptrobj(ST(0), RETVAL, "ODBM_File");
  60.     }
  61.  
  62. void
  63. DESTROY(db)
  64.     ODBM_File    db
  65.     CODE:
  66.     dbmrefcnt--;
  67.     dbmclose();
  68.  
  69. datum
  70. odbm_FETCH(db, key)
  71.     ODBM_File    db
  72.     datum        key
  73.  
  74. int
  75. odbm_STORE(db, key, value, flags = DBM_REPLACE)
  76.     ODBM_File    db
  77.     datum        key
  78.     datum        value
  79.     int        flags
  80.     CLEANUP:
  81.     if (RETVAL) {
  82.         if (RETVAL < 0 && errno == EPERM)
  83.         croak("No write permission to odbm file");
  84.         croak("odbm store returned %d, errno %d, key \"%s\"",
  85.             RETVAL,errno,key.dptr);
  86.     }
  87.  
  88. int
  89. odbm_DELETE(db, key)
  90.     ODBM_File    db
  91.     datum        key
  92.  
  93. datum
  94. odbm_FIRSTKEY(db)
  95.     ODBM_File    db
  96.  
  97. datum
  98. odbm_NEXTKEY(db, key)
  99.     ODBM_File    db
  100.     datum        key
  101.  
  102.