Last active
February 1, 2016 21:29
-
-
Save JustThisGuyAZ/2a32ba2ff53025710201 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* gdbm.h - The include file for dbm users. */ | |
/* This file is part of GDBM, the GNU data base manager, by Philip A. Nelson. | |
Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc. | |
GDBM is free software; you can redistribute it and/or modify | |
it under the terms of the GNU General Public License as published by | |
the Free Software Foundation; either version 2, or (at your option) | |
any later version. | |
GDBM is distributed in the hope that it will be useful, | |
but WITHOUT ANY WARRANTY; without even the implied warranty of | |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
GNU General Public License for more details. | |
You should have received a copy of the GNU General Public License | |
along with GDBM; see the file COPYING. If not, write to | |
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
You may contact the author by: | |
e-mail: phil@cs.wwu.edu | |
us-mail: Philip A. Nelson | |
Computer Science Department | |
Western Washington University | |
Bellingham, WA 98226 | |
*************************************************************************/ | |
/* Protection for multiple includes. */ | |
#ifndef _GDBM_H_ | |
#define _GDBM_H_ | |
/* Parameters to gdbm_open for READERS, WRITERS, and WRITERS who | |
can create the database. */ | |
#define GDBM_READER 0 /* A reader. */ | |
#define GDBM_WRITER 1 /* A writer. */ | |
#define GDBM_WRCREAT 2 /* A writer. Create the db if needed. */ | |
#define GDBM_NEWDB 3 /* A writer. Always create a new db. */ | |
#define GDBM_FAST 0x10 /* Write fast! => No fsyncs. OBSOLETE. */ | |
#define GDBM_SYNC 0x20 /* Sync operations to the disk. */ | |
#define GDBM_NOLOCK 0x40 /* Don't do file locking operations. */ | |
/* Parameters to gdbm_store for simple insertion or replacement in the | |
case that the key is already in the database. */ | |
#define GDBM_INSERT 0 /* Never replace old data with new. */ | |
#define GDBM_REPLACE 1 /* Always replace old data with new. */ | |
/* Parameters to gdbm_setopt, specifing the type of operation to perform. */ | |
#define GDBM_CACHESIZE 1 /* Set the cache size. */ | |
#define GDBM_FASTMODE 2 /* Toggle fast mode. OBSOLETE. */ | |
#define GDBM_SYNCMODE 3 /* Turn on or off sync operations. */ | |
#define GDBM_CENTFREE 4 /* Keep all free blocks in the header. */ | |
#define GDBM_COALESCEBLKS 5 /* Attempt to coalesce free blocks. */ | |
/* The data and key structure. This structure is defined for compatibility. */ | |
typedef struct { | |
char *dptr; | |
int dsize; | |
} datum; | |
/* The file information header. This is good enough for most applications. */ | |
typedef struct {int dummy[10];} *GDBM_FILE; | |
/* Determine if the C(++) compiler requires complete function prototype */ | |
#ifndef __P | |
#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) | |
#define __P(x) x | |
#else | |
#define __P(x) () | |
#endif | |
#endif | |
/* External variable, the gdbm build release string. */ | |
extern char *gdbm_version; | |
/* GDBM C++ support */ | |
#if defined(__cplusplus) || defined(c_plusplus) | |
extern "C" { | |
#endif | |
/* These are the routines! */ | |
extern GDBM_FILE gdbm_open __P((char *, int, int, int, void (*)())); | |
extern void gdbm_close __P((GDBM_FILE)); | |
extern int gdbm_store __P((GDBM_FILE, datum, datum, int)); | |
extern datum gdbm_fetch __P((GDBM_FILE, datum)); | |
extern int gdbm_delete __P((GDBM_FILE, datum)); | |
extern datum gdbm_firstkey __P((GDBM_FILE)); | |
extern datum gdbm_nextkey __P((GDBM_FILE, datum)); | |
extern int gdbm_reorganize __P((GDBM_FILE)); | |
extern void gdbm_sync __P((GDBM_FILE)); | |
extern int gdbm_exists __P((GDBM_FILE, datum)); | |
extern int gdbm_setopt __P((GDBM_FILE, int, int *, int)); | |
extern int gdbm_fdesc __P((GDBM_FILE)); | |
#if defined(__cplusplus) || defined(c_plusplus) | |
} | |
#endif | |
#define GDBM_NO_ERROR 0 | |
#define GDBM_MALLOC_ERROR 1 | |
#define GDBM_BLOCK_SIZE_ERROR 2 | |
#define GDBM_FILE_OPEN_ERROR 3 | |
#define GDBM_FILE_WRITE_ERROR 4 | |
#define GDBM_FILE_SEEK_ERROR 5 | |
#define GDBM_FILE_READ_ERROR 6 | |
#define GDBM_BAD_MAGIC_NUMBER 7 | |
#define GDBM_EMPTY_DATABASE 8 | |
#define GDBM_CANT_BE_READER 9 | |
#define GDBM_CANT_BE_WRITER 10 | |
#define GDBM_READER_CANT_DELETE 11 | |
#define GDBM_READER_CANT_STORE 12 | |
#define GDBM_READER_CANT_REORGANIZE 13 | |
#define GDBM_UNKNOWN_UPDATE 14 | |
#define GDBM_ITEM_NOT_FOUND 15 | |
#define GDBM_REORGANIZE_FAILED 16 | |
#define GDBM_CANNOT_REPLACE 17 | |
#define GDBM_ILLEGAL_DATA 18 | |
#define GDBM_OPT_ALREADY_SET 19 | |
#define GDBM_OPT_ILLEGAL 20 | |
typedef int gdbm_error; /* For compatibilities sake. */ | |
extern gdbm_error gdbm_errno; | |
/* extra prototypes */ | |
/* GDBM C++ support */ | |
#if defined(__cplusplus) || defined(c_plusplus) | |
extern "C" { | |
#endif | |
extern char *gdbm_strerror __P((gdbm_error)); | |
#if defined(__cplusplus) || defined(c_plusplus) | |
} | |
#endif | |
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl6 | |
use v6; | |
use lib '.'; | |
use DBM::GDBM; | |
my $gdbm = DBM::GDBM.new('foo.gdbm', 0, 0o666); | |
my $value = $gdbm.fetch('foo'); | |
$value.say; | |
$value.perl.say; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DBM::GDBM::GDBM_FILE.new | |
DBM::GDBM::datum.new(dptr => "foo", dsize => 3) | |
foo | |
3 | |
DBM::GDBM::datum | |
(datum) | |
DBM::GDBM::datum |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use v6; | |
class DBM::GDBM { | |
use NativeCall; | |
constant GDBM_BLOCKSIZE = 0; | |
constant GDBM_WRCREAT = 2; | |
constant GDBM_REPLACE = 1; | |
class datum is repr<CStruct> is rw { | |
has str $.dptr; | |
has int32 $.dsize; | |
} | |
class GDBM_FILE is repr<CStruct> {} | |
sub gdbm_open( | |
Str $name, | |
int32 $block_size, | |
int32 $flags, | |
int32 $mode, | |
Pointer[void] $fatal_func | |
) | |
returns GDBM_FILE is native<libgdbm.so.3> { * } | |
sub gdbm_fetch( | |
GDBM_FILE $dbf, | |
datum $key, | |
) | |
returns datum is native<libgdbm.so.3> { * } | |
# attributes ################################################################# | |
has GDBM_FILE $.dbf; | |
has Str $.gdbm_file_name; | |
has Int $.open_flags; | |
has Int $.mode; | |
# methods #################################################################### | |
method new($gdbm_file_name, $open_flags, $mode) { | |
my GDBM_FILE $dbf = | |
gdbm_open($gdbm_file_name, GDBM_BLOCKSIZE, GDBM_WRCREAT, $mode, Nil); | |
return self.bless(:$dbf, :$gdbm_file_name, :$open_flags, :$mode); | |
} | |
method fetch(str $key is copy) { | |
my datum $key_datum = datum.new(dptr => $key, dsize => $key.chars); | |
$!dbf.perl.say; | |
$key_datum.say; | |
$key_datum.dptr.say; | |
$key_datum.dsize.say; | |
my datum $content_datum = gdbm_fetch($!dbf, $key_datum); | |
$content_datum.perl.say; | |
return $content_datum | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment