rev 405 - trunk/modules/Prosist

SVN User <[email protected]> Fri, 23 Apr 2004 19:27:20 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-23 19:27:18 -0400 (Fri, 23 Apr 2004)
New Revision: 405

Modified:
   trunk/modules/Prosist/Prosist.c
Log:
fixed problem losing types in prosist saving

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-23 19:42:56 UTC (rev 404)
+++ trunk/modules/Prosist/Prosist.c	2004-04-23 23:27:18 UTC (rev 405)
@@ -80,6 +80,7 @@
 
 MODULE_DECLARE(Prosist);
 MODULE_DECLARE(ProsistExc);
+MODULE_DECLARE(MutWrap);
 
 MODULE_CONSTANT_DECLARE(Prosist, READONLY ); 
 MODULE_CONSTANT_DECLARE(Prosist, READWRITE); 
@@ -142,6 +143,16 @@
 
 #define ADD_BUF_END()   pr_free(_buf)
 
+//******************************** new_mutwrap_obj ****************************
+obj_p new_mutwrap_obj(isp ist, obj_p obj) {
+	obj_p mutwrap_obj = new_object(ist, MutWrap_OBJ);
+	mutwrap_obj->data_type = DATA_TYPE_DATAPTR;
+	mutwrap_obj->data.ptr = obj;
+	set_immutable(mutwrap_obj);
+	return mutwrap_obj;
+}
+#define NEW_MW(obj)  new_mutwrap_obj(ist, obj)
+
 //******************************** load_dbm_int *******************************
 i32_t load_dbm_int(psrec_p psrecp, char* key) {
 	apr_status_t aprerr;
@@ -226,13 +237,19 @@
 
 //******************************** obj_to_id ********************************
 psid_t obj_to_id(isp ist, psrec_p psrecp, obj_p obj) {
-	obj_p id_obj = dict_item(ist, psrecp->obj_to_id, obj); if_exc_return -1;
+	psid_t res;
+	obj_p id_obj, mw_obj;
+	mw_obj = NEW_MW(obj);
+	id_obj = dict_item(ist, psrecp->obj_to_id, mw_obj); if_exc_return -1;
 	if (!id_obj) {
 		//dump(ist, "obj-to-id.txt", obj);
 		raise_exception(ist, ProsistExc_OBJ, "obj_to_id called on obj with no id");
-		return -1;
+	} else {
+		del_unlock(id_obj);
+		res = (psid_t) id_obj->data.i64;
 	}
-	return (psid_t) id_obj->data.i64;
+	del_unlock(mw_obj);
+	return res;
 }
 
 //******************************** apr_str ************************************
@@ -247,7 +264,8 @@
 void empty_obj(isp ist, psrec_p psrecp, obj_p id_obj, int *new_flg) {
 	if (*new_flg) {
 		obj_p obj = NEW_OBJ(NULL);
-		dict_add(ist, psrecp->obj_to_id, obj, id_obj); if_exc_return;
+		obj_p mw_obj = NEW_MW(obj);
+		dict_add(ist, psrecp->obj_to_id, mw_obj, id_obj); if_exc_return;
 		dict_add(ist, psrecp->id_to_obj, id_obj, obj); 
 	}
 	*new_flg = FALSE;
@@ -276,9 +294,8 @@
 					for(n=0; *p != ',' && *p != ';'; p++)
 						n = n*10 + *p - '0';
 					ref_idobj = NEW_INT(n);
-					proto = dict_item( ist, psrecp->id_to_obj, 
-						               ref_idobj);  if_exc_return NULL;
-					del_unlock(ref_idobj);
+					proto = dict_item( ist, psrecp->id_to_obj, ref_idobj);  
+					del_unlock(ref_idobj);  if_exc_return NULL;
 					if (first_proto)
 						switch_proto(ist, obj, proto);
 					else
@@ -363,7 +380,7 @@
 			case '`': {
 				int i=0, mlen, module_flg = TRUE;
 				char *module, *name;
-				obj_p module_obj, obj, id_tuple;
+				obj_p module_obj, mw_obj, obj, id_tuple;
 				mlen = max(8, (int) value.dsize);
 				module = pr_malloc(mlen);
 				for(p++; *p != '.'; p++) module[i++] = *p;
@@ -389,10 +406,12 @@
 					raise_exception(ist, ProsistExc_OBJ, "identity object is missing id tuple");
 					return;
 				}
+				mw_obj = NEW_MW(obj);
 				dict_add(ist, psrecp->id_to_obj, id_obj, obj);     if_exc_return;
-				dict_add(ist, psrecp->obj_to_id, obj, id_obj);     if_exc_return;
+				dict_add(ist, psrecp->obj_to_id, mw_obj, id_obj);     if_exc_return;
 				dict_add(ist, psrecp->id_to_idobj, id_tuple, obj); if_exc_return;
-				dict_add(ist, psrecp->idobj_to_id, obj, id_tuple);
+				dict_add(ist, psrecp->idobj_to_id, mw_obj, id_tuple);
+				del_unlock(mw_obj);
 				break;
 			}
 			case 'p': {
@@ -453,7 +472,7 @@
 void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
 	apr_status_t aprerr;
 	apr_datum_t key, value;
-	obj_p proxy_obj;
+	obj_p mw_obj, proxy_obj;
 	psid_t id;
 	int i, plen, added_attr = FALSE;
 	ADD_BUF_DECLARE;
@@ -465,7 +484,9 @@
 	ADD_NUM(id); 
 	ADD_BUF_TO_DATUM(key);
 
-	proxy_obj = dict_item(ist, psrecp->obj_to_proxy, obj);
+	mw_obj = NEW_MW(obj);
+	proxy_obj = dict_item(ist, psrecp->obj_to_proxy, mw_obj);
+	del_unlock(mw_obj);
 	if (!proxy_obj) {
 		raise_exception(ist, ProsistExc_OBJ, "store_obj called with unknown obj");
 		return;
@@ -540,10 +561,14 @@
 //******************************** append_store_refs ****************************
 void append_store_refs(isp ist, psrec_p psrecp, obj_p obj, int objidx, obj_p store_refs) {
 	psid_t id;
-	obj_p id_obj, id_tuple, proxy_obj;
+	obj_p mw_obj, id_obj, id_tuple, proxy_obj;
 	int i, idx=0, plen, tuple_type=FALSE;
 
-	if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, obj)) return;
+	mw_obj = NEW_MW(obj);
+	if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, mw_obj)) {
+		del_unlock(mw_obj);
+		return;
+	}
 	rdlock_rtrn(obj);
 	id = psrecp->nextid++;
 	id_obj = NEW_INT(id);
@@ -554,10 +579,14 @@
 		char *s1, *s2;
 		apr_datum_t key, value;
 		ADD_BUF_DECLARE;
-		dict_add(ist, psrecp->obj_to_id, obj, id_obj);     if_exc_return;
-		dict_add(ist, psrecp->id_to_obj, id_obj, obj);     if_exc_return;
-		dict_add(ist, psrecp->id_to_idobj, id_tuple, obj); if_exc_return;
-		dict_add(ist, psrecp->idobj_to_id, obj, id_tuple);
+		dict_add(ist, psrecp->obj_to_id,   mw_obj,   id_obj);
+		if (ist->exception_obj) { del_unlock(mw_obj); return; }
+		dict_add(ist, psrecp->id_to_obj,   id_obj,   obj);
+		if (ist->exception_obj) { del_unlock(mw_obj); return; }
+		dict_add(ist, psrecp->id_to_idobj, id_tuple, obj);
+		if (ist->exception_obj) { del_unlock(mw_obj); return; }
+		dict_add(ist, psrecp->idobj_to_id, mw_obj,   id_tuple);
+		if (ist->exception_obj) { del_unlock(mw_obj); return; }
 		ADD_BUF_START();
 		ADD_NUM(id); 
 		ADD_BUF_TO_DATUM(key);
@@ -584,12 +613,14 @@
 		ADD_BUF_END();
 		read_unlock(ist, obj);
 		list_item_set(ist, store_refs, objidx, OBJ(NONE));
+		del_unlock(mw_obj);
 		return;
 	}
 	proxy_obj = call_func0(ist, obj, SYM(__TOSTORPROXY__)); if_exc_return;
 	
 	if (proxy_obj == OBJ(NONE) || is_unclonable(proxy_obj)) { 
 		del_unlock(proxy_obj); 
+		del_unlock(mw_obj); 
 		read_unlock(ist, obj);
 		list_item_set(ist, store_refs, objidx, OBJ(NONE));
 		return;
@@ -598,26 +629,37 @@
 		tuple_type = has_proto_QUES(ist, proxy_obj, OBJ(TUPLE_PROTO));
 		if (!tuple_type && !has_proto_QUES(ist, proxy_obj, OBJ(STRING_PROTO))) {
 			raise_exception(ist, ProsistExc_OBJ, "unstorable object (data ptr) found in tree");
+			del_unlock(proxy_obj); 
+			del_unlock(mw_obj); 
 			return;
 		}
 	}
-	dict_add(ist, psrecp->obj_to_proxy, obj,    proxy_obj); if_exc_return;
-	dict_add(ist, psrecp->obj_to_id,    obj,    id_obj);    if_exc_return;
-	dict_add(ist, psrecp->id_to_obj,    id_obj, obj);       if_exc_return;
+	dict_add(ist, psrecp->obj_to_proxy, mw_obj,    proxy_obj);
+	if (ist->exception_obj) { del_unlock(mw_obj); return; }
+	dict_add(ist, psrecp->obj_to_id,    mw_obj,    id_obj);
+	if (ist->exception_obj) { del_unlock(mw_obj); return; }
+	dict_add(ist, psrecp->id_to_obj,    id_obj, obj);
+	if (ist->exception_obj) { del_unlock(mw_obj); return; }
 
+	del_unlock(mw_obj);
+
 	plen = proto_len(ist, proxy_obj);
-	for(i=0; i < plen; i++) {
+	for(i=0; i < plen; i++) { // Tuple proto 992060
 		obj_p proto = proto_item(ist, proxy_obj, i);
-		if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, proto))
+		mw_obj = NEW_MW(proto);
+		if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
 			list_append(ist, store_refs, proto);
+		del_unlock(mw_obj);
 		if_exc_return;
 	}
 	if (proxy_obj->has_attrs) {
 		attr_key_t key = attr_first_key(ist, proxy_obj);
 		while(key) {
 			obj_p attr = attr_value_by_key(ist, proxy_obj, key);
-			if (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, attr))
+			mw_obj = NEW_MW(attr);
+			if (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
 				list_append(ist, store_refs, attr);
+			del_unlock(mw_obj);
 			if_exc_return;
 			key = attr_next_key(ist, proxy_obj, key);
 		}
@@ -626,8 +668,10 @@
 		int llen = (int) list_len(ist, proxy_obj);
 		for (i=0; i < llen; i++) {
 			obj_p item = list_item(ist, proxy_obj, i);
-			if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, item))
+			mw_obj = NEW_MW(item);
+			if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
 				list_append(ist, store_refs, item);
+			del_unlock(mw_obj);
 			if_exc_return;
 		}
 	}
@@ -636,7 +680,7 @@
 //******************************** load_db ************************************
 obj_p load_db(isp ist, psrec_p psrecp) {
 	int llen, idx = 0;
-	obj_p debug, idlist = new_list_obj(ist, 20), root = NULL;
+	obj_p idlist = new_list_obj(ist, 20), root = NULL;
 		
 	append_load_ids(ist, psrecp, idlist, 0); if_exc_return NULL;
 	for (; idx < (int) list_len(ist, idlist); idx++) {
@@ -651,8 +695,8 @@
 		del_unlock(id_obj);
 	}
 
-	debug = dict_item(ist, root, NEW_INT(1));
-	dump(ist, "root.txt", debug);
+	//debug = dict_item(ist, root, NEW_MW(NEW_INT(1)));
+	//dump(ist, "root.txt", debug);
 
 	return root;
 }
@@ -702,6 +746,10 @@
 	MODULE_SET_DOC(ProsistExc, "Prosist module error");
 	MODULE_ADD_TO_OBJ(ProsistExc, Prosist_OBJ, "ProsistException");
 
+	MutWrap_OBJ = NEW_OBJ(NULL);
+	MODULE_SET_DOC(MutWrap, "wrapper to make any object immutable and storable by object id");
+	MODULE_ADD_TO_OBJ(MutWrap, Prosist_OBJ, "MutWrap");
+
 	Prosist_OBJ->unclonable = TRUE;
 	set_obj_rdacc(Prosist_OBJ, ACC_USER1);
 	
@@ -809,7 +857,20 @@
 	return parms[1];
 }
 
+DEF(MutWrap, __hash__, NULL) {
+	return new_hash_obj(ist, (i32_t)(intptr_t) self->data.ptr);
+}
 
+DEF(MutWrap, __eq__QUES, FORM_RPARAM) {
+	CHECK_TYPE_EXC(parms[1], MutWrap_OBJ, "immutable object wrapper");
+	if (self->data.ptr == parms[1]->data.ptr) return OBJ(PR_TRUE);
+	else									  return OBJ(PR_FALSE);
+}
+
+DEF(MutWrap, __objList__, FORM_RPARAM) {
+	return parms[1];
+}
+
 MAIN_MODULE_INIT(Prosist)
 {
 	MODULE_SUB_INIT(Prosist);
@@ -818,5 +879,9 @@
 	MODULE_ADD_SYM(Prosist, closed_QUES);
 	MODULE_ADD_SYM(Prosist, __objList__);
 
+	MODULE_ADD_SYM(MutWrap, __hash__);
+	MODULE_ADD_SYM(MutWrap, __eq__QUES);
+	MODULE_ADD_SYM(MutWrap, __objList__);
+
 	check_exceptions(ist);
 }