File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / dba / dba_db3.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_db3.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_DB3
   28: #include "php_db3.h"
   29: #include <sys/stat.h>
   30: 
   31: #include <string.h>
   32: #ifdef DB3_INCLUDE_FILE
   33: #include DB3_INCLUDE_FILE
   34: #else
   35: #include <db.h>
   36: #endif
   37: 
   38: static void php_dba_db3_errcall_fcn(const char *errpfx, char *msg)
   39: {
   40: 	TSRMLS_FETCH();
   41: 	
   42: 	php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s%s", errpfx?errpfx:"", msg);
   43: }
   44: 
   45: #define DB3_DATA dba_db3_data *dba = info->dbf
   46: #define DB3_GKEY \
   47: 	DBT gkey; \
   48: 	memset(&gkey, 0, sizeof(gkey)); \
   49: 	gkey.data = (char *) key; gkey.size = keylen
   50: 
   51: typedef struct {
   52: 	DB *dbp;
   53: 	DBC *cursor;
   54: } dba_db3_data;
   55: 
   56: DBA_OPEN_FUNC(db3)
   57: {
   58: 	DB *dbp = NULL;
   59: 	DBTYPE type;
   60: 	int gmode = 0, err;
   61: 	int filemode = 0644;
   62: 	struct stat check_stat;
   63: 	int s = VCWD_STAT(info->path, &check_stat);
   64: 
   65: 	if (!s && !check_stat.st_size) {
   66: 		info->mode = DBA_TRUNC; /* force truncate */
   67: 	}
   68: 
   69: 	type = info->mode == DBA_READER ? DB_UNKNOWN :
   70: 		info->mode == DBA_TRUNC ? DB_BTREE :
   71: 		s ? DB_BTREE : DB_UNKNOWN;
   72: 	  
   73: 	gmode = info->mode == DBA_READER ? DB_RDONLY :
   74: 		(info->mode == DBA_CREAT && s) ? DB_CREATE : 
   75: 		(info->mode == DBA_CREAT && !s) ? 0 :
   76: 		info->mode == DBA_WRITER ? 0         : 
   77: 		info->mode == DBA_TRUNC ? DB_CREATE | DB_TRUNCATE : -1;
   78: 
   79: 	if (gmode == -1) {
   80: 		return FAILURE; /* not possible */
   81: 	}
   82: 
   83: 	if (info->argc > 0) {
   84: 		convert_to_long_ex(info->argv[0]);
   85: 		filemode = Z_LVAL_PP(info->argv[0]);
   86: 	}
   87: 
   88: #ifdef DB_FCNTL_LOCKING
   89: 	gmode |= DB_FCNTL_LOCKING;
   90: #endif
   91: 
   92: 	if ((err=db_create(&dbp, NULL, 0)) == 0) {
   93: 	    dbp->set_errcall(dbp, php_dba_db3_errcall_fcn);
   94: 	    if ((err=dbp->open(dbp, info->path, NULL, type, gmode, filemode)) == 0) {
   95: 			dba_db3_data *data;
   96: 
   97: 			data = pemalloc(sizeof(*data), info->flags&DBA_PERSISTENT);
   98: 			data->dbp = dbp;
   99: 			data->cursor = NULL;
  100: 			info->dbf = data;
  101: 		
  102: 			return SUCCESS;
  103: 		} else {
  104: 			dbp->close(dbp, 0);
  105: 			*error = db_strerror(err);
  106: 		}
  107: 	} else {
  108: 		*error = db_strerror(err);
  109: 	}
  110: 
  111: 	return FAILURE;
  112: }
  113: 
  114: DBA_CLOSE_FUNC(db3)
  115: {
  116: 	DB3_DATA;
  117: 	
  118: 	if (dba->cursor) dba->cursor->c_close(dba->cursor);
  119: 	dba->dbp->close(dba->dbp, 0);
  120: 	pefree(dba, info->flags&DBA_PERSISTENT);
  121: }
  122: 
  123: DBA_FETCH_FUNC(db3)
  124: {
  125: 	DBT gval;
  126: 	char *new = NULL;
  127: 	DB3_DATA;
  128: 	DB3_GKEY;
  129: 	
  130: 	memset(&gval, 0, sizeof(gval));
  131: 	if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
  132: 		if (newlen) *newlen = gval.size;
  133: 		new = estrndup(gval.data, gval.size);
  134: 	}
  135: 	return new;
  136: }
  137: 
  138: DBA_UPDATE_FUNC(db3)
  139: {
  140: 	DBT gval;
  141: 	DB3_DATA;
  142: 	DB3_GKEY;
  143: 	
  144: 	memset(&gval, 0, sizeof(gval));
  145: 	gval.data = (char *) val;
  146: 	gval.size = vallen;
  147: 
  148: 	if (!dba->dbp->put(dba->dbp, NULL, &gkey, &gval, 
  149: 				mode == 1 ? DB_NOOVERWRITE : 0)) {
  150: 		return SUCCESS;
  151: 	}
  152: 	return FAILURE;
  153: }
  154: 
  155: DBA_EXISTS_FUNC(db3)
  156: {
  157: 	DBT gval;
  158: 	DB3_DATA;
  159: 	DB3_GKEY;
  160: 	
  161: 	memset(&gval, 0, sizeof(gval));
  162: 	if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) {
  163: 		return SUCCESS;
  164: 	}
  165: 	return FAILURE;
  166: }
  167: 
  168: DBA_DELETE_FUNC(db3)
  169: {
  170: 	DB3_DATA;
  171: 	DB3_GKEY;
  172: 
  173: 	return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS;
  174: }
  175: 
  176: DBA_FIRSTKEY_FUNC(db3)
  177: {
  178: 	DB3_DATA;
  179: 
  180: 	if (dba->cursor) {
  181: 		dba->cursor->c_close(dba->cursor);
  182: 	}
  183: 
  184: 	dba->cursor = NULL;
  185: 	if (dba->dbp->cursor(dba->dbp, NULL, &dba->cursor, 0) != 0) {
  186: 		return NULL;
  187: 	}
  188: 
  189: 	/* we should introduce something like PARAM_PASSTHRU... */
  190: 	return dba_nextkey_db3(info, newlen TSRMLS_CC);
  191: }
  192: 
  193: DBA_NEXTKEY_FUNC(db3)
  194: {
  195: 	DB3_DATA;
  196: 	DBT gkey, gval;
  197: 	char *nkey = NULL;
  198: 	
  199: 	memset(&gkey, 0, sizeof(gkey));
  200: 	memset(&gval, 0, sizeof(gval));
  201: 
  202: 	if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) {
  203: 		if (gkey.data) {
  204: 			nkey = estrndup(gkey.data, gkey.size);
  205: 			if (newlen) *newlen = gkey.size;
  206: 		}
  207: 	}
  208: 
  209: 	return nkey;
  210: }
  211: 
  212: DBA_OPTIMIZE_FUNC(db3)
  213: {
  214: 	return SUCCESS;
  215: }
  216: 
  217: DBA_SYNC_FUNC(db3)
  218: {
  219: 	DB3_DATA;
  220: 
  221: 	return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS;
  222: }
  223: 
  224: DBA_INFO_FUNC(db3)
  225: {
  226: 	return estrdup(DB_VERSION_STRING);
  227: }
  228: 
  229: #endif
  230: 
  231: /*
  232:  * Local variables:
  233:  * tab-width: 4
  234:  * c-basic-offset: 4
  235:  * End:
  236:  * vim600: sw=4 ts=4 fdm=marker
  237:  * vim<600: sw=4 ts=4
  238:  */

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