root/ext/dba/dba_ndbm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. DBA_OPEN_FUNC
  2. DBA_CLOSE_FUNC
  3. DBA_FETCH_FUNC
  4. DBA_UPDATE_FUNC
  5. DBA_EXISTS_FUNC
  6. DBA_DELETE_FUNC
  7. DBA_FIRSTKEY_FUNC
  8. DBA_NEXTKEY_FUNC
  9. DBA_OPTIMIZE_FUNC
  10. DBA_SYNC_FUNC
  11. DBA_INFO_FUNC

   1 /*
   2    +----------------------------------------------------------------------+
   3    | PHP Version 7                                                        |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1997-2016 The PHP Group                                |
   6    +----------------------------------------------------------------------+
   7    | This source file is subject to version 3.01 of the PHP license,      |
   8    | that is bundled with this package in the file LICENSE, and is        |
   9    | available through the world-wide-web at the following url:           |
  10    | http://www.php.net/license/3_01.txt                                  |
  11    | If you did not receive a copy of the PHP license and are unable to   |
  12    | obtain it through the world-wide-web, please send a note to          |
  13    | license@php.net so we can mail you a copy immediately.               |
  14    +----------------------------------------------------------------------+
  15    | Author: Sascha Schumann <sascha@schumann.cx>                         |
  16    +----------------------------------------------------------------------+
  17  */
  18 
  19 /* $Id$ */
  20 
  21 #ifdef HAVE_CONFIG_H
  22 #include "config.h"
  23 #endif
  24 
  25 #include "php.h"
  26 
  27 #if DBA_NDBM
  28 #include "php_ndbm.h"
  29 
  30 #include <fcntl.h>
  31 #ifdef NDBM_INCLUDE_FILE
  32 #include NDBM_INCLUDE_FILE
  33 #endif
  34 
  35 #define NDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
  36 
  37 DBA_OPEN_FUNC(ndbm)
  38 {
  39         DBM *dbf;
  40         int gmode = 0;
  41         int filemode = 0644;
  42         dba_info *pinfo = (dba_info *) info;
  43 
  44         switch(info->mode) {
  45                 case DBA_READER:
  46                         gmode = O_RDONLY;
  47                         break;
  48                 case DBA_WRITER:
  49                         gmode = O_RDWR;
  50                         break;
  51                 case DBA_CREAT:
  52                         gmode = O_RDWR | O_CREAT;
  53                         break;
  54                 case DBA_TRUNC:
  55                         gmode = O_RDWR | O_CREAT | O_TRUNC;
  56                         break;
  57                 default:
  58                         return FAILURE; /* not possible */
  59         }
  60 
  61         if(info->argc > 0) {
  62                 convert_to_long_ex(&info->argv[0]);
  63                 filemode = Z_LVAL(info->argv[0]);
  64         }
  65 
  66         dbf = dbm_open(info->path, gmode, filemode);
  67 
  68         pinfo->dbf = dbf;
  69         return SUCCESS;
  70 }
  71 
  72 DBA_CLOSE_FUNC(ndbm)
  73 {
  74         dbm_close(info->dbf);
  75 }
  76 
  77 DBA_FETCH_FUNC(ndbm)
  78 {
  79         datum gval;
  80         char *new = NULL;
  81 
  82         NDBM_GKEY;
  83         gval = dbm_fetch(info->dbf, gkey);
  84         if(gval.dptr) {
  85                 if(newlen) *newlen = gval.dsize;
  86                 new = estrndup(gval.dptr, gval.dsize);
  87         }
  88         return new;
  89 }
  90 
  91 DBA_UPDATE_FUNC(ndbm)
  92 {
  93         datum gval;
  94 
  95         NDBM_GKEY;
  96         gval.dptr = (char *) val;
  97         gval.dsize = vallen;
  98 
  99         if(!dbm_store(info->dbf, gkey, gval, mode == 1 ? DBM_INSERT : DBM_REPLACE))
 100                 return SUCCESS;
 101         return FAILURE;
 102 }
 103 
 104 DBA_EXISTS_FUNC(ndbm)
 105 {
 106         datum gval;
 107         NDBM_GKEY;
 108         gval = dbm_fetch(info->dbf, gkey);
 109         if(gval.dptr) {
 110                 return SUCCESS;
 111         }
 112         return FAILURE;
 113 }
 114 
 115 DBA_DELETE_FUNC(ndbm)
 116 {
 117         NDBM_GKEY;
 118         return(dbm_delete(info->dbf, gkey) == -1 ? FAILURE : SUCCESS);
 119 }
 120 
 121 DBA_FIRSTKEY_FUNC(ndbm)
 122 {
 123         datum gkey;
 124         char *key = NULL;
 125 
 126         gkey = dbm_firstkey(info->dbf);
 127         if(gkey.dptr) {
 128                 if(newlen) *newlen = gkey.dsize;
 129                 key = estrndup(gkey.dptr, gkey.dsize);
 130         }
 131         return key;
 132 }
 133 
 134 DBA_NEXTKEY_FUNC(ndbm)
 135 {
 136         datum gkey;
 137         char *nkey = NULL;
 138 
 139         gkey = dbm_nextkey(info->dbf);
 140         if(gkey.dptr) {
 141                 if(newlen) *newlen = gkey.dsize;
 142                 nkey = estrndup(gkey.dptr, gkey.dsize);
 143         }
 144         return nkey;
 145 }
 146 
 147 DBA_OPTIMIZE_FUNC(ndbm)
 148 {
 149         return SUCCESS;
 150 }
 151 
 152 DBA_SYNC_FUNC(ndbm)
 153 {
 154         return SUCCESS;
 155 }
 156 
 157 DBA_INFO_FUNC(ndbm)
 158 {
 159         return estrdup("NDBM");
 160 }
 161 
 162 #endif
 163 
 164 /*
 165  * Local variables:
 166  * tab-width: 4
 167  * c-basic-offset: 4
 168  * End:
 169  * vim600: sw=4 ts=4 fdm=marker
 170  * vim<600: sw=4 ts=4
 171  */

/* [<][>][^][v][top][bottom][index][help] */