home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Updates / Perl / Non-RPC / !Perl / riscos / RDBM_File.pm < prev    next >
Text File  |  1998-07-12  |  5KB  |  163 lines

  1. # By S.W.Ellacott@brighton.ac.uk
  2. # This is version 3: Mon 14th July 1997
  3. # Requires gdbm module version 0.03 or later
  4.  
  5. package RDBM_File;
  6. $debug = 0;
  7.  
  8. use RISCOS::SWI;
  9. require Exporter;
  10. require Tie::Hash;
  11. @ISA = qw(Exporter Tie::Hash);
  12. @EXPORT = qw(O_RDONLY  O_RDWR O_CREAT);
  13. $VERSION = 0.04;
  14.  
  15. print "RDBM Loading\n" if $debug;
  16.  
  17. %lastkey = ();
  18. $buffer = ' 'x255;
  19. $buflen = length($buffer);
  20.  
  21. system('*rmensure gdbm 0.03 rmload system:modules.gdbm');
  22. die("You need gdbm 0.03 or later") if `*rmensure gdbm 0.03 echo too old`;
  23.  
  24. # Get the SWI numbers
  25. $Gdbm_Open = SWINumberFromString("XGdbm_Open");
  26. $Gdbm_Store = SWINumberFromString("XGdbm_Store");
  27. $Gdbm_Fetch = SWINumberFromString("XGdbm_Fetch");
  28. $Gdbm_Exists = SWINumberFromString("XGdbm_Exists");
  29. $Gdbm_Delete = SWINumberFromString("XGdbm_Delete");
  30. $Gdbm_FirstKey = SWINumberFromString("XGdbm_FirstKey");
  31. $Gdbm_NextKey = SWINumberFromString("XGdbm_NextKey");
  32. $Gdbm_Clear = SWINumberFromString("XGdbm_Clear");
  33. $Gdbm_Close = SWINumberFromString("XGdbm_Close");
  34. $Gdbm_OpenIn = SWINumberFromString("XGdbm_OpenIn");
  35.  
  36. use Fcntl;
  37.  
  38. #Set up some register masks
  39. $ocmask = ®mask([0]);
  40. $sfmask = ®mask([0..4]);
  41. $edmask = ®mask([0..2]);
  42.  
  43. #Set up a default work directory
  44. $workdir = '<PerlArchLib$Dir>.work.rdbm.'; # Directory used if no pathname for the database
  45.  
  46. print "RDBM initialisation completed\n" if $debug;
  47.  
  48. sub TIEHASH ($$$$) {
  49.     print "In TIEHASH, package is $_[0], database is $_[1], flags is $_[2], mode is $_[3],\n" if $debug;
  50.     my ($pkg,$file,$flags) = @_; # Any mode parameter is ignored
  51.     my $OpenSWI = ( $flags ) ? $Gdbm_Open : $Gdbm_OpenIn; # If $flags is 0, open for read only
  52.     my ($pathname, $handle);
  53.     my @path = split( m@\.@, $file);
  54.     $file = pop(@path);
  55.     if ( @path ) {
  56.         $pathname = join('.', @path ).'.';
  57.     } else {
  58.         $pathname = $workdir;
  59.     }
  60.     $file = $pathname.$file;
  61.         $handle = 0 + swix($OpenSWI,$ocmask,$file) if ( ( -e $file ) || ( $flags&O_CREAT ) );
  62.     print "Handle is $handle\n" if $debug;
  63.     return undef unless $handle;
  64.     my $self = \$handle;
  65.     bless $self;
  66. }
  67.  
  68. sub STORE ($$$;$) {
  69.     print "In STORE, storing in database ${$_[0]}:\-   $_[1] : $_[2]\n" if $debug;
  70.     my $handle = ${$_[0]};
  71.     my $key = $_[1]; my $keylen = length($key);
  72.     my $value = $_[2];
  73.     $value = "$value"; # Force it to be a string
  74.     my $vallen = length($value);
  75.     swi($Gdbm_Store,$sfmask,$handle,$key,$keylen,$value,$vallen);
  76. }
  77.  
  78. sub FETCH ($$) {
  79.     print "In FETCH, finding value for $_[1] in database ${$_[0]}\n " if $debug;
  80.     my $handle = ${$_[0]};
  81.     my $key = $_[1]; my $keylen = length($key);
  82.     my $itemlen = swi($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  83.     return 0 if ($itemlen == -1);
  84.     if ( $itemlen > $buflen ) {
  85.         warn "Buffer extended" if $debug;
  86.         $buffer = ' ' x $itemlen;
  87.         $buflen = $itemlen;
  88.         $itemlen = swi($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  89.     }
  90.     substr($buffer, 0, $itemlen);
  91. }
  92.  
  93. sub EXISTS ($$) {
  94.     print "In EXISTS, finding value for $_[1] in database ${$_[0]}\n " if $debug;
  95.     my $handle = ${$_[0]};
  96.     my $key = $_[1]; my $keylen = length($key);
  97.     swi($Gdbm_Exists,$edmask,$handle,$key,$keylen);
  98. }
  99.  
  100. sub DELETE ($$) {
  101.     print "In DELETE, deleting value for $_[1] in database ${$_[0]}\n " if $debug;
  102.     my $handle = ${$_[0]};
  103.     my $key = $_[1]; my $keylen = length($key);
  104.     # DELETE should return deleted value, so we have to fetch it
  105.     my $itemlen = swi($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  106.     if ( $itemlen > $buflen ) {
  107.         warn "Buffer extended" if $debug;
  108.         $buffer = ' ' x $itemlen;
  109.         $buflen = $itemlen;
  110.         $itemlen = swi($Gdbm_Fetch,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  111.     }
  112.     swi($Gdbm_Delete,$edmask,$handle,$key,$keylen);
  113.     return undef if ($itemlen == -1);
  114.     substr($buffer, 0, $itemlen);
  115. }
  116.  
  117. sub FIRSTKEY ($) {
  118.     print "In FIRSTKEY, database ${$_[0]}\n " if $debug;
  119.     my $handle = ${$_[0]};
  120.     $itemlen = swi($Gdbm_FirstKey,$edmask,$handle,$buffer,$buflen);
  121.     return undef if ($itemlen == -1);
  122.     if ( $itemlen > $buflen ) {
  123.         warn "Buffer extended" if $debug;
  124.         $buffer = ' ' x $itemlen;
  125.         $buflen = $itemlen;
  126.         $itemlen = swi($Gdbm_FirstKey,$edmask,$handle,$buffer,$buflen);
  127.     }
  128.     $lastkey{$handle} = substr($buffer, 0, $itemlen);
  129. }
  130.  
  131. sub NEXTKEY ($$) {
  132.     print "In NEXTTKEY, database ${$_[0]}\n " if $debug;
  133.     my $handle = ${$_[0]};
  134.     my $key = $lastkey{$handle}; my $keylen = length($key);
  135.     $itemlen = swi($Gdbm_NextKey,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  136.     return undef if ($itemlen == -1);
  137.     if ( $itemlen > $buflen ) {
  138.         warn "Buffer extended" if $debug;
  139.         $buffer = ' ' x $itemlen;
  140.         $buflen = $itemlen;
  141.         $itemlen = swi($Gdbm_NextKey,$sfmask,$handle,$key,$keylen,$buffer,$buflen);
  142.     }
  143.     $lastkey{$handle} = substr($buffer, 0, $itemlen);
  144. }
  145.  
  146. sub CLEAR ($) {
  147.     print "In CLEAR, database ${$_[0]}\n " if $debug;
  148.     my $handle = ${$_[0]};
  149.     swi($Gdbm_Clear,$ocmask,$handle);
  150. }
  151.  
  152. sub DESTROY ($) {
  153.     print "DESTROY called for ${$_[0]}\n" if $debug;
  154.     my $handle = ${$_[0]};
  155.     # I don't think we want actually to delete the database, just close it
  156.     swi($Gdbm_Close,$ocmask,$handle);
  157. }
  158.  
  159. 1;
  160.  
  161. __END__
  162.  
  163.