rev 380 - in trunk: modules/dbm src

SVN User <[email protected]> Sat, 17 Apr 2004 22:01:55 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-17 22:01:52 -0400 (Sat, 17 Apr 2004)
New Revision: 380

Modified:
   trunk/modules/dbm/DBM.c
   trunk/src/src.vcproj
Log:


Modified: trunk/modules/dbm/DBM.c
===================================================================
--- trunk/modules/dbm/DBM.c	2004-04-18 01:03:46 UTC (rev 379)
+++ trunk/modules/dbm/DBM.c	2004-04-18 02:01:52 UTC (rev 380)
@@ -110,6 +110,35 @@
 	MODULE_CONSTANT_INT(DBM, RWTRUNC,   APR_DBM_RWTRUNC  ); // r/w, truncate if already there
 }
 
+DEF( DB, getNames, FPARM2( name,  NULL, 
+	                       type,  NEW_STRING("SDBM") ) ) {
+	apr_status_t aprerr;
+	apr_pool_t* pool;
+	obj_p res;
+	char *name, *type, *used1, *used2;
+
+	STRING_PARAM(1, name);
+	STRING_PARAM(2, type);
+
+	aprerr = apr_pool_create(&pool, get_pr_head_pool());
+	IF_APR_ERR("out of memory in getNames()") return NULL;
+
+	aprerr = apr_dbm_get_usednames_ex(pool, type, name, &used1, &used2);
+	IF_APR_ERR("getNames() in dbm") return NULL;
+
+	res = NEW_LIST(2);
+	list_append(ist, res, NEW_STRING(used1));
+	// apr_free(used1); XXX how do I free these?
+	if (used2) {
+		list_append(ist, res, NEW_STRING(used2));
+		// apr_free(used2); XXX how do I free these?
+	} else
+		list_append(ist, res, OBJ(NONE));
+	set_immutable(res);
+	switch_proto(ist, res, OBJ(TUPLE_PROTO));
+	return res;
+}
+
 DEF( DB, __init__, FPARM4( name,  NULL, 
 	                       mode,  DBM_RWCREATE, 
 	                       type,  NEW_STRING("SDBM"), 
@@ -131,10 +160,12 @@
 	aprerr = apr_dbm_open_ex(&db, type, name, mode, uperm, cntxt);  
 	IF_APR_ERR("opening dbm database") return NULL;
 
+	read_unlock(ist, self);
 	set_attr(ist, self, sym(ist, "name"),  parms[1]);
 	set_attr(ist, self, sym(ist, "mode"),  parms[3]);
 	set_attr(ist, self, sym(ist, "type"),  parms[5]);
 	set_attr(ist, self, sym(ist, "uperm"), parms[7]);
+	read_lock(ist, self);
 
 	self->data_type = DATA_TYPE_DATAPTR;
 	self->data.ptr  = db;
@@ -142,19 +173,6 @@
 	return OBJ(NONE);
 }
 
-DEF(DB, close, NULL) {
-	apr_dbm_p db = self->data.ptr;
-	if (db) apr_dbm_close(db);
-	self->data.ptr = NULL;
-	return self;
-}
-
-DEF(DB, closed_QUES, NULL) {
-	apr_dbm_p db = self->data.ptr;
-	if (db) return OBJ(PR_FALSE);
-	else    return OBJ(PR_TRUE);
-}
-
 DEF(DB, fetch, FPARM1(key, NULL)) {
 	apr_status_t aprerr;
 	apr_dbm_p db = self->data.ptr;
@@ -166,7 +184,10 @@
 	aprerr = apr_dbm_fetch (db, key, &value);
 	IF_APR_DBM_ERR(db, "fetch(key)");
 
-	return NEW_STRINGN(value.dptr, value.dsize);
+	if (value.dptr)
+		return NEW_STRINGN(value.dptr, value.dsize);
+	else
+		return OBJ(NONE);
 }
 
 DEF(DB, store, FPARM2(key, NULL, value, NULL)) {
@@ -219,7 +240,10 @@
 	aprerr = apr_dbm_firstkey(db, &key);
 	IF_APR_DBM_ERR(db, "firstKey()");
 
-	return NEW_STRINGN(key.dptr, key.dsize);
+	if (key.dptr)
+		return NEW_STRINGN(key.dptr, key.dsize);
+	else
+		return OBJ(NONE);
 }
 
 DEF(DB, nextKey, FPARM1(key, NULL)) {
@@ -232,7 +256,11 @@
 
 	aprerr = apr_dbm_nextkey(db, &key);
 	IF_APR_DBM_ERR(db, "nextKey(key)");
-	return NEW_STRINGN(key.dptr, key.dsize);
+
+	if (key.dptr)
+		return NEW_STRINGN(key.dptr, key.dsize);
+	else
+		return OBJ(NONE);
 }
 
 DEF(DB, freeDatum, FPARM1(data, NULL)) {
@@ -245,33 +273,22 @@
 	apr_dbm_freedatum(db, data);
 	return parms[1];
 }
-DEF( DB, getNames, FPARM2( name,  NULL, 
-	                       type,  NEW_STRING("SDBM") ) ) {
-	apr_status_t aprerr;
-	apr_pool_t* pool;
-	obj_p res;
-	char *name, *type, *used1, *used2;
 
-	STRING_PARAM(1, name);
-	STRING_PARAM(2, type);
+DEF(DB, close, NULL) {
+	apr_dbm_p db = self->data.ptr;
+	if (db) apr_dbm_close(db);
+	self->data.ptr = NULL;
+	return self;
+}
 
-	aprerr = apr_pool_create(&pool, get_pr_head_pool());
-	IF_APR_ERR("out of memory in getNames()") return NULL;
+DEF(DB, closed_QUES, NULL) {
+	apr_dbm_p db = self->data.ptr;
+	if (db) return OBJ(PR_FALSE);
+	else    return OBJ(PR_TRUE);
+}
 
-	aprerr = apr_dbm_get_usednames_ex(pool, type, name, &used1, &used2);
-	IF_APR_ERR("getNames() in dbm") return NULL;
-
-	res = NEW_LIST(2);
-	list_append(ist, res, NEW_STRING(used1));
-	// apr_free(used1); XXX how do I free these?
-	if (used2) {
-		list_append(ist, res, NEW_STRING(used2));
-		// apr_free(used2); XXX how do I free these?
-	} else
-		list_append(ist, res, OBJ(NONE));
-	set_immutable(res);
-	switch_proto(ist, res, OBJ(TUPLE_PROTO));
-	return res;
+DEF(DB, __objList__, FORM_RPARAM) {
+	return parms[1];
 }
 
 MAIN_MODULE_INIT(DBM) {
@@ -287,4 +304,5 @@
 	MODULE_ADD_SYM(DB, freeDatum);
 	MODULE_ADD_SYM(DB, close);
 	MODULE_ADD_SYM(DB, closed_QUES);
+	MODULE_ADD_SYM(DB, __objList__);
 }
Modified: trunk/src/src.vcproj
===================================================================
--- trunk/src/src.vcproj	2004-04-18 01:03:46 UTC (rev 379)
+++ trunk/src/src.vcproj	2004-04-18 02:01:52 UTC (rev 380)
@@ -250,6 +250,9 @@
 				RelativePath="..\pr\chained.pr">
 			</File>
 			<File
+				RelativePath="..\pr\dbm.pr">
+			</File>
+			<File
 				RelativePath="..\pr\defs.pr">
 			</File>
 			<File