File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / dba / dba_dbm.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:34:37 2012 UTC (12 years, 1 month ago) by misho
Branches: php, MAIN
CVS tags: v5_4_3elwix, v5_4_17p0, HEAD
php 5.4.3+patches

    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: Sascha Schumann <sascha@schumann.cx>                         |
   16:    +----------------------------------------------------------------------+
   17:  */
   18: 
   19: /* $Id: dba_dbm.c,v 1.1.1.2 2012/05/29 12:34:37 misho Exp $ */
   20: 
   21: #ifdef HAVE_CONFIG_H
   22: #include "config.h"
   23: #endif
   24: 
   25: #include "php.h"
   26: 
   27: #if DBA_DBM
   28: #include "php_dbm.h"
   29: 
   30: #ifdef DBM_INCLUDE_FILE
   31: #include DBM_INCLUDE_FILE
   32: #endif
   33: #if DBA_GDBM
   34: #include "php_gdbm.h"
   35: #endif
   36: 
   37: #include <unistd.h>
   38: #include <sys/types.h>
   39: #include <sys/stat.h>
   40: #include <fcntl.h>
   41: 
   42: #define DBM_DATA dba_dbm_data *dba = info->dbf
   43: #define DBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
   44: 
   45: #define TRUNC_IT(extension, mode) \
   46: 	snprintf(buf, MAXPATHLEN, "%s" extension, info->path); \
   47: 	buf[MAXPATHLEN-1] = '\0'; \
   48: 	if((fd = VCWD_OPEN_MODE(buf, O_CREAT | mode | O_WRONLY, filemode)) == -1) \
   49: 		return FAILURE; \
   50: 	close(fd);
   51: 
   52: 
   53: typedef struct {
   54: 	datum nextkey;
   55: } dba_dbm_data;
   56: 
   57: DBA_OPEN_FUNC(dbm)
   58: {
   59: 	int fd;
   60: 	int filemode = 0644;
   61: 
   62: 	if(info->argc > 0) {
   63: 		convert_to_long_ex(info->argv[0]);
   64: 		filemode = Z_LVAL_PP(info->argv[0]);
   65: 	}
   66: 	
   67: 	if(info->mode == DBA_TRUNC) {
   68: 		char buf[MAXPATHLEN];
   69: 
   70: 		/* dbm/ndbm original */
   71: 		TRUNC_IT(".pag", O_TRUNC);
   72: 		TRUNC_IT(".dir", O_TRUNC);
   73: 	}
   74: 
   75: 	if(info->mode == DBA_CREAT) {
   76: 		char buf[MAXPATHLEN];
   77: 
   78: 		TRUNC_IT(".pag", 0);
   79: 		TRUNC_IT(".dir", 0);
   80: 	}
   81: 
   82: 	if(dbminit((char *) info->path) == -1) {
   83: 		return FAILURE;
   84: 	}
   85: 
   86: 	info->dbf = pemalloc(sizeof(dba_dbm_data), info->flags&DBA_PERSISTENT);
   87: 	memset(info->dbf, 0, sizeof(dba_dbm_data));
   88: 	return SUCCESS;
   89: }
   90: 
   91: DBA_CLOSE_FUNC(dbm)
   92: {
   93: 	pefree(info->dbf, info->flags&DBA_PERSISTENT);
   94: 	dbmclose();
   95: }
   96: 
   97: DBA_FETCH_FUNC(dbm)
   98: {
   99: 	datum gval;
  100: 	char *new = NULL;
  101: 
  102: 	DBM_GKEY;
  103: 	gval = fetch(gkey);
  104: 	if(gval.dptr) {
  105: 		if(newlen) *newlen = gval.dsize;
  106: 		new = estrndup(gval.dptr, gval.dsize);
  107: 	}
  108: 	return new;
  109: }
  110: 
  111: DBA_UPDATE_FUNC(dbm)
  112: {
  113: 	datum gval;
  114: 
  115: 	DBM_GKEY;
  116: 
  117: 	if (mode == 1) { /* insert */
  118: 		gval = fetch(gkey);
  119: 		if(gval.dptr) {
  120: 			return FAILURE;
  121: 		}
  122: 	}
  123: 
  124: 	gval.dptr = (char *) val;
  125: 	gval.dsize = vallen;
  126: 	
  127: 	return (store(gkey, gval) == -1 ? FAILURE : SUCCESS);
  128: }
  129: 
  130: DBA_EXISTS_FUNC(dbm)
  131: {
  132: 	datum gval;
  133: 	DBM_GKEY;
  134: 	
  135: 	gval = fetch(gkey);
  136: 	if(gval.dptr) {
  137: 		return SUCCESS;
  138: 	}
  139: 	return FAILURE;
  140: }
  141: 
  142: DBA_DELETE_FUNC(dbm)
  143: {
  144: 	DBM_GKEY;
  145: 	return(delete(gkey) == -1 ? FAILURE : SUCCESS);
  146: }
  147: 
  148: DBA_FIRSTKEY_FUNC(dbm)
  149: {
  150: 	DBM_DATA;
  151: 	datum gkey;
  152: 	char *key = NULL;
  153: 
  154: 	gkey = firstkey();
  155: 	if(gkey.dptr) {
  156: 		if(newlen) *newlen = gkey.dsize;
  157: 		key = estrndup(gkey.dptr, gkey.dsize);
  158: 		dba->nextkey = gkey;
  159: 	} else
  160: 		dba->nextkey.dptr = NULL;
  161: 	return key;
  162: }
  163: 
  164: DBA_NEXTKEY_FUNC(dbm)
  165: {
  166: 	DBM_DATA;
  167: 	datum gkey;
  168: 	char *nkey = NULL;
  169: 	
  170: 	if(!dba->nextkey.dptr) return NULL;
  171: 	
  172: 	gkey = nextkey(dba->nextkey);
  173: 	if(gkey.dptr) {
  174: 		if(newlen) *newlen = gkey.dsize;
  175: 		nkey = estrndup(gkey.dptr, gkey.dsize);
  176: 		dba->nextkey = gkey;
  177: 	} else
  178: 		dba->nextkey.dptr = NULL;
  179: 	return nkey;
  180: }
  181: 
  182: DBA_OPTIMIZE_FUNC(dbm)
  183: {
  184: 	/* dummy */
  185: 	return SUCCESS;
  186: }
  187: 
  188: DBA_SYNC_FUNC(dbm)
  189: {
  190: 	return SUCCESS;
  191: }
  192: 
  193: DBA_INFO_FUNC(dbm)
  194: {
  195: #if DBA_GDBM
  196: 	if (!strcmp(DBM_VERSION, "GDBM"))
  197: 	{
  198: 		return dba_info_gdbm(hnd, info TSRMLS_CC);
  199: 	}
  200: #endif
  201: 	return estrdup(DBM_VERSION);
  202: }
  203: 
  204: #endif
  205: 
  206: /*
  207:  * Local variables:
  208:  * tab-width: 4
  209:  * c-basic-offset: 4
  210:  * End:
  211:  * vim600: sw=4 ts=4 fdm=marker
  212:  * vim<600: sw=4 ts=4
  213:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>