rev 400 - trunk/modules/Prosist

SVN User <[email protected]> Thu, 22 Apr 2004 16:53:41 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-22 16:53:38 -0400 (Thu, 22 Apr 2004)
New Revision: 400

Modified:
   trunk/modules/Prosist/Prosist.c
Log:
more work on prosist

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-22 18:50:47 UTC (rev 399)
+++ trunk/modules/Prosist/Prosist.c	2004-04-22 20:53:38 UTC (rev 400)
@@ -170,6 +170,7 @@
 	ADD_BUF_START();
 	ADD_NUM(val);
 	ADD_BUF_TO_DATUM(value);
+
 	aprerr = apr_dbm_store(psrecp->db, key_d, value);
 	IF_APR_DBM_ERR(psrecp->db, "storing int value ", key_d.dptr);
 printf("key: %s\n", key_d.dptr);
@@ -177,6 +178,22 @@
 	ADD_BUF_END();
 }
 
+//******************************** load_obj_by_id *************************
+apr_datum_t load_obj_by_id(psrec_p psrecp, psid_t id) {
+	apr_status_t aprerr;
+	apr_datum_t key, value;
+	ADD_BUF_DECLARE;
+
+	ADD_BUF_START();
+	ADD_NUM(id);
+	ADD_BUF_TO_DATUM(key);
+
+	aprerr = apr_dbm_fetch(psrecp->db, key, &value);
+	IF_APR_DBM_ERR(psrecp->db, "loading object ", key.dptr);
+	ADD_BUF_END();
+	return value;
+}
+
 //******************************** 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;
@@ -201,19 +218,6 @@
 	return TRUE;
 }
 
-//******************************** id_registered_QUES *************************
-int id_registered_QUES(isp ist, psrec_p psrecp, obj_p id_obj) {
-	obj_p obj = dict_item(ist, psrecp->id_to_obj, id_obj);
-	if_exc_return FALSE;
-	if (!obj) {
-		obj = NEW_OBJ(NULL);
-		dict_add(ist, psrecp->obj_to_id, obj, id_obj); if_exc_return FALSE;
-		dict_add(ist, psrecp->id_to_obj, id_obj, obj); 
-		return FALSE;
-	}
-	return TRUE;
-}
-
 //******************************** apr_str ************************************
 apr_datum_t apr_str(char* str){
 	apr_datum_t apr_str;
@@ -222,22 +226,107 @@
 	return apr_str;
 }
 
+//******************************** empty_obj **********************************
+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;
+		dict_add(ist, psrecp->id_to_obj, id_obj, obj); 
+	}
+	*new_flg = FALSE;
+}
+
+//******************************** load_obj ***********************************
+void load_obj(isp ist, psrec_p psrecp, obj_p id_obj) {
+	apr_datum_t value;
+	psid_t n, id;
+	char *p, *end;
+	obj_p obj;
+	id = (psid_t) id_obj->data.i64;
+
+	value = load_obj_by_id(psrecp, id);  if_exc_return;
+	p = value.dptr;
+	end = p + value.dsize;
+
+	obj = dict_item(ist, psrecp->id_to_obj, id_obj);  if_exc_return;
+
+	while (p < end) {
+		switch (*p) {
+			case 'p': {
+				int first_proto = TRUE;
+				while(*p++ != ';') {
+					obj_p ref_idobj, proto;
+					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;
+					del_unlock(ref_idobj);
+					if (first_proto)
+						switch_proto(ist, obj, proto);
+					else
+						ins_proto(ist, obj, proto, 0x7fffffff);
+					first_proto = FALSE;
+				}
+				break;
+			}
+					  /*
+			case 'a': {
+				empty_obj(ist, psrecp, id_obj, &new_flg);
+				while(*p++ != ';') {
+					obj_p ref_id_obj;
+					while(*p++ != ':');
+					for(n=0; *p != ',' && *p != ';'; p++)
+						n = n*10 + *p - '0';
+					ref_id_obj = NEW_INT(n);
+					if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+						list_append(ist, idlist, ref_id_obj);
+					else
+						del_unlock(ref_id_obj);
+				}
+				break;
+			}
+			case 'l': {
+				empty_obj(ist, psrecp, id_obj, &new_flg);
+				while(++p < end) {
+					obj_p ref_id_obj;
+					for(n=0; *p != ',' && p < end; p++)
+						n = n*10 + *p - '0';
+					ref_id_obj = NEW_INT(n);
+					if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+						list_append(ist, idlist, ref_id_obj);
+					else
+						del_unlock(ref_id_obj);
+				}
+				return;
+			}
+			*/
+			case 'i':
+			case 's':
+				return;
+			default:
+				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
+				return;
+		}
+	}
+}
+
 //******************************** append_ids *********************************
 void append_ids(isp ist, psrec_p psrecp, obj_p idlist, psid_t id) {
-	apr_status_t aprerr;
-	apr_datum_t key, value;
+	apr_datum_t value;
+	obj_p id_obj;
+	psid_t n;
+	int new_flg = TRUE;
 	char *p, *end;
-	ADD_BUF_DECLARE;
 
-	ADD_BUF_START();
-	ADD_NUM(id);
-	ADD_BUF_TO_DATUM(key);
-	ADD_BUF_START();
-	aprerr = apr_dbm_fetch(psrecp->db, key, &value);
-	IF_APR_DBM_ERR(psrecp->db, "loading obj value ", key.dptr);
+	id_obj = NEW_INT(id);
+	if (dict_item(ist, psrecp->id_to_obj, id_obj)) {
+		del_unlock(id_obj);
+		return;
+	}
+	value = load_obj_by_id(psrecp, id); if_exc_return;
 	p = value.dptr;
 	end = p + value.dsize;
-	ADD_BUF_END();
 
 	while (p < end) {
 		switch (*p) {
@@ -270,52 +359,61 @@
 					raise_exception(ist, ProsistExc_OBJ, "identity object is missing id tuple");
 					return;
 				}
+				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->id_to_idobj, id_tuple, obj); if_exc_return;
-				dict_add(ist, psrecp->idobj_to_id, obj, id_tuple); if_exc_return;
+				dict_add(ist, psrecp->idobj_to_id, obj, id_tuple);
 				break;
 			}
 			case 'p': {
-				obj_p id_obj;
-				psid_t n;
+				empty_obj(ist, psrecp, id_obj, &new_flg);
 				while(*p++ != ';') {
+					obj_p ref_id_obj;
 					for(n=0; *p != ',' && *p != ';'; p++)
 						n = n*10 + *p - '0';
-					id_obj = NEW_INT(n);
-					if(!id_registered_QUES(ist, psrecp, id_obj))
-						list_append(ist, idlist, id_obj);
+					ref_id_obj = NEW_INT(n);
+					if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+						list_append(ist, idlist, ref_id_obj);
+					else
+						del_unlock(ref_id_obj);
 				}
 				break;
 			}
 			case 'a': {
-				obj_p id_obj;
-				psid_t n;
+				empty_obj(ist, psrecp, id_obj, &new_flg);
 				while(*p++ != ';') {
+					obj_p ref_id_obj;
 					while(*p++ != ':');
 					for(n=0; *p != ',' && *p != ';'; p++)
 						n = n*10 + *p - '0';
-					id_obj = NEW_INT(n);
-					if(!id_registered_QUES(ist, psrecp, id_obj))
-						list_append(ist, idlist, id_obj);
+					ref_id_obj = NEW_INT(n);
+					if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+						list_append(ist, idlist, ref_id_obj);
+					else
+						del_unlock(ref_id_obj);
 				}
 				break;
 			}
 			case 'l': {
-				obj_p id_obj;
-				int n;
+				empty_obj(ist, psrecp, id_obj, &new_flg);
 				while(++p < end) {
+					obj_p ref_id_obj;
 					for(n=0; *p != ',' && p < end; p++)
 						n = n*10 + *p - '0';
-					id_obj = NEW_INT(n);
-					if(!id_registered_QUES(ist, psrecp, id_obj))
-						list_append(ist, idlist, id_obj);
+					ref_id_obj = NEW_INT(n);
+					if (!dict_item(ist, psrecp->id_to_obj, ref_id_obj))
+						list_append(ist, idlist, ref_id_obj);
+					else
+						del_unlock(ref_id_obj);
 				}
 				return;
 			}
 			case 'i':
 			case 's':
+				empty_obj(ist, psrecp, id_obj, &new_flg);
 				return;
 			default:
-				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %s", key.dptr);
+				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
 				return;
 		}
 	}
@@ -323,7 +421,7 @@
 
 //******************************** load_db ************************************
 obj_p load_db(isp ist, psrec_p psrecp) {
-	int idx = 0;
+	int llen, idx = 0;
 	obj_p idlist = new_list_obj(ist, 20);
 		
 	append_ids(ist, psrecp, idlist, 0); if_exc_return NULL;
@@ -331,12 +429,16 @@
 		psid_t id = (psid_t) (list_item(ist, idlist, idx)->data.i64);
 		append_ids(ist, psrecp, idlist, id); if_exc_return NULL;
 	}
-
+	llen = (int) list_len(ist, idlist);
+	for(idx=0; idx < llen; idx++) {
+		obj_p id_obj = list_item(ist, idlist, idx);
+		load_obj(ist, psrecp, id_obj);
+	}
 	return NULL;
 }
 
-//******************************** write_obj **********************************
-void write_obj(isp ist, psrec_p psrecp, obj_p obj) {
+//******************************** store_obj **********************************
+void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
 	apr_status_t aprerr;
 	apr_datum_t key, value;
 	obj_p id_tuple, proxy_obj;
@@ -373,7 +475,7 @@
 	}
 	proxy_obj = dict_item(ist, psrecp->proxies, obj);
 	if (!proxy_obj) {
-		raise_exception(ist, ProsistExc_OBJ, "write_obj called with unknown obj");
+		raise_exception(ist, ProsistExc_OBJ, "store_obj called with unknown obj");
 		return;
 	}
 	ADD_BUF_START();
@@ -535,7 +637,7 @@
 	for (i=0; i < llen; i++) {
 		obj_p item = list_item(ist, locked_objs, i);
 		if (item != OBJ(NONE)) {
-			write_obj(ist, psrecp, item);
+			store_obj(ist, psrecp, item);
 			IF_EXC_UNLKLIST_RTRN();
 		}
 	}