Return to dba_db1.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / dba |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 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: Shen Cheng-Da <cdsheen@gmail.com> | ! 16: +----------------------------------------------------------------------+ ! 17: */ ! 18: ! 19: /* $Id: dba_db1.c 321634 2012-01-01 13:15:04Z felipe $ */ ! 20: ! 21: #ifdef HAVE_CONFIG_H ! 22: #include "config.h" ! 23: #endif ! 24: ! 25: #include "php.h" ! 26: ! 27: #if DBA_DB1 ! 28: #include "php_db1.h" ! 29: ! 30: #ifdef DB1_INCLUDE_FILE ! 31: #include DB1_INCLUDE_FILE ! 32: #endif ! 33: ! 34: #include <sys/types.h> ! 35: #include <sys/stat.h> ! 36: #include <fcntl.h> ! 37: ! 38: #define DB1_DATA dba_db1_data *dba = info->dbf ! 39: #define DB1_GKEY DBT gkey; gkey.data = (char *) key; gkey.size = keylen ! 40: ! 41: typedef struct { ! 42: DB *dbp; ! 43: } dba_db1_data; ! 44: ! 45: DBA_OPEN_FUNC(db1) ! 46: { ! 47: dba_db1_data *dba; ! 48: DB *db; ! 49: ! 50: int gmode; ! 51: int filemode = 0644; ! 52: ! 53: if (info->argc > 0) { ! 54: convert_to_long_ex(info->argv[0]); ! 55: filemode = Z_LVAL_PP(info->argv[0]); ! 56: } ! 57: ! 58: gmode = 0; ! 59: switch (info->mode) { ! 60: case DBA_READER: ! 61: gmode = O_RDONLY; ! 62: break; ! 63: case DBA_WRITER: ! 64: gmode = O_RDWR; ! 65: break; ! 66: case DBA_CREAT: ! 67: gmode = O_RDWR | O_CREAT; ! 68: break; ! 69: case DBA_TRUNC: ! 70: gmode = O_RDWR | O_CREAT | O_TRUNC; ! 71: break; ! 72: default: ! 73: return FAILURE; /* not possible */ ! 74: } ! 75: ! 76: db = dbopen((char *)info->path, gmode, filemode, DB_HASH, NULL); ! 77: ! 78: if (db == NULL) { ! 79: return FAILURE; ! 80: } ! 81: ! 82: dba = pemalloc(sizeof(*dba), info->flags&DBA_PERSISTENT); ! 83: dba->dbp = db; ! 84: ! 85: info->dbf = dba; ! 86: ! 87: return SUCCESS; ! 88: } ! 89: ! 90: DBA_CLOSE_FUNC(db1) ! 91: { ! 92: DB1_DATA; ! 93: dba->dbp->close(dba->dbp); ! 94: pefree(info->dbf, info->flags&DBA_PERSISTENT); ! 95: } ! 96: ! 97: DBA_FETCH_FUNC(db1) ! 98: { ! 99: DBT gval; ! 100: DB1_DATA; ! 101: DB1_GKEY; ! 102: ! 103: memset(&gval, 0, sizeof(gval)); ! 104: if (dba->dbp->get(dba->dbp, &gkey, &gval, 0) == RET_SUCCESS) { ! 105: if (newlen) *newlen = gval.size; ! 106: return estrndup(gval.data, gval.size); ! 107: } ! 108: return NULL; ! 109: } ! 110: ! 111: DBA_UPDATE_FUNC(db1) ! 112: { ! 113: DBT gval; ! 114: DB1_DATA; ! 115: DB1_GKEY; ! 116: ! 117: gval.data = (char *) val; ! 118: gval.size = vallen; ! 119: ! 120: return dba->dbp->put(dba->dbp, &gkey, &gval, mode == 1 ? R_NOOVERWRITE : 0) != RET_SUCCESS ? FAILURE : SUCCESS; ! 121: } ! 122: ! 123: DBA_EXISTS_FUNC(db1) ! 124: { ! 125: DBT gval; ! 126: DB1_DATA; ! 127: DB1_GKEY; ! 128: ! 129: return dba->dbp->get(dba->dbp, &gkey, &gval, 0) != RET_SUCCESS ? FAILURE : SUCCESS; ! 130: } ! 131: ! 132: DBA_DELETE_FUNC(db1) ! 133: { ! 134: DB1_DATA; ! 135: DB1_GKEY; ! 136: ! 137: return dba->dbp->del(dba->dbp, &gkey, 0) != RET_SUCCESS ? FAILURE : SUCCESS; ! 138: } ! 139: ! 140: DBA_FIRSTKEY_FUNC(db1) ! 141: { ! 142: DBT gkey; ! 143: DBT gval; ! 144: DB1_DATA; ! 145: ! 146: memset(&gkey, 0, sizeof(gkey)); ! 147: memset(&gval, 0, sizeof(gval)); ! 148: ! 149: if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_FIRST) == RET_SUCCESS) { ! 150: if (newlen) *newlen = gkey.size; ! 151: return estrndup(gkey.data, gkey.size); ! 152: } ! 153: return NULL; ! 154: } ! 155: ! 156: DBA_NEXTKEY_FUNC(db1) ! 157: { ! 158: DBT gkey; ! 159: DBT gval; ! 160: DB1_DATA; ! 161: ! 162: memset(&gkey, 0, sizeof(gkey)); ! 163: memset(&gval, 0, sizeof(gval)); ! 164: ! 165: if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_NEXT) == RET_SUCCESS) { ! 166: if (newlen) *newlen = gkey.size; ! 167: return estrndup(gkey.data, gkey.size); ! 168: } ! 169: return NULL; ! 170: } ! 171: ! 172: DBA_OPTIMIZE_FUNC(db1) ! 173: { ! 174: /* dummy */ ! 175: return SUCCESS; ! 176: } ! 177: ! 178: DBA_SYNC_FUNC(db1) ! 179: { ! 180: return SUCCESS; ! 181: } ! 182: ! 183: DBA_INFO_FUNC(db1) ! 184: { ! 185: return estrdup(DB1_VERSION); ! 186: } ! 187: ! 188: #endif ! 189: ! 190: /* ! 191: * Local variables: ! 192: * tab-width: 4 ! 193: * c-basic-offset: 4 ! 194: * End: ! 195: * vim600: sw=4 ts=4 fdm=marker ! 196: * vim<600: sw=4 ts=4 ! 197: */