rev 406 - in trunk: modules/Prosist pr src

SVN User <[email protected]> Sat, 24 Apr 2004 01:38:11 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-24 01:38:08 -0400 (Sat, 24 Apr 2004)
New Revision: 406

Added:
   trunk/pr/modint.pr
Modified:
   trunk/modules/Prosist/Prosist.c
   trunk/pr/prosist.pr
   trunk/src/lock.c
Log:
prosist almost works as good as a pickle

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/modules/Prosist/Prosist.c	2004-04-24 05:38:08 UTC (rev 406)
@@ -271,203 +271,6 @@
 	*new_flg = FALSE;
 }
 
-//******************************** load_obj ***********************************
-obj_p load_obj(isp ist, psrec_p psrecp, obj_p id_obj) {
-	apr_datum_t value;
-	psid_t n, id;
-	char *p, *end;
-	obj_p res, obj;
-	id = (psid_t) id_obj->data.i64;
-
-	value = load_obj_by_id(psrecp, id);  if_exc_return NULL;
-	p = value.dptr;
-	end = p + value.dsize;
-	
-	obj = dict_item(ist, psrecp->id_to_obj, id_obj);  if_exc_return NULL;
-
-	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);  
-					del_unlock(ref_idobj);  if_exc_return NULL;
-					if (first_proto)
-						switch_proto(ist, obj, proto);
-					else
-						ins_proto(ist, obj, proto, 0x7fffffff);
-					first_proto = FALSE;
-				}
-				break;
-			}
-			case 'a': {
-				while(*p++ != ';') {
-					obj_p ref_id_obj, aval;
-					char *q, *aname = pr_malloc(value.dsize);
-					for (q=aname; *p != ':';) *q++ = *p++;
-					*q = 0;
-					for(n=0, p++; *p != ',' && *p != ';'; p++)
-						n = n*10 + *p - '0';
-					ref_id_obj = NEW_INT(n);
-					aval = dict_item( ist, psrecp->id_to_obj, ref_id_obj);  
-					if_exc_return NULL;
-					set_attr(ist, obj, sym(ist, aname), aval);  if_exc_return NULL;
-					del_unlock(ref_id_obj);
-				}
-				break;
-			}
-			case 'l': {
-				init_list_data(ist, obj, 0);
-				while(++p < end) {
-					obj_p ref_id_obj, item;
-					for(n=0; *p != ',' && p < end; p++)
-						n = n*10 + *p - '0';
-					ref_id_obj = NEW_INT(n);
-					item = dict_item( ist, psrecp->id_to_obj, ref_id_obj);  
-					if_exc_return NULL;
-					list_append(ist, obj, item);
-					del_unlock(ref_id_obj);
-				}
-				goto done;
-			}
-			case 'i':
-				obj->data_type = DATA_TYPE_IMMDATA;
-				for(n=0,p++; *p != ':'; p++)
-					n = n*10 + *p - '0';
-				obj->imm_data_len = n;
-				memcpy(&(obj->data), p+1, sizeof(obj->data));
-				goto done;
-			case 's':
-				set_string_data(ist, obj, p+1, end-(p+1));
-				goto done;
-			case '`':
-				del_unlock(obj);
-				return NULL;
-			default:
-				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
-				return NULL;
-		}
-	}
-done:
-	res = call_func0(ist, obj, SYM(__FROMSTORPROXY__));
-	del_unlock(obj);
-	return res;
-}
-
-//******************************** append_load_ids *********************************
-void append_load_ids(isp ist, psrec_p psrecp, obj_p idlist, psid_t id) {
-	apr_datum_t value;
-	obj_p id_obj;
-	psid_t n;
-	int new_flg = TRUE;
-	char *p, *end;
-
-	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;
-
-	while (p < end) {
-		switch (*p) {
-			case '`': {
-				int i=0, mlen, module_flg = TRUE;
-				char *module, *name;
-				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;
-				module[i] = 0;
-				if (module[0] == '*')
-					module_flg = FALSE;
-				name = pr_malloc(value.dsize - i);
-				for(i=0,p++; p < end; p++) name[i++] = *p;
-				name[i] = 0;
-				// do auto-import here XXX
-				if (module_flg)	
-					module_obj = get_attr(ist, OBJ(MODULES), sym(ist, module));
-				else
-					module_obj = OBJ(OBJECT);
-				if_exc_return;
-				obj = get_attr(ist, module_obj, sym(ist, name)); if_exc_return;
-				if (!obj) {
-					raise_exception(ist, ProsistExc_OBJ, "identity object %s not found in module %s", name, module);
-					return;
-				}
-				id_tuple = get_attr(ist, obj, SYM(__ID__)); if_exc_return;
-				if (!id_tuple) {
-					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, 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, mw_obj, id_tuple);
-				del_unlock(mw_obj);
-				break;
-			}
-			case 'p': {
-				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';
-					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': {
-				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':
-				empty_obj(ist, psrecp, id_obj, &new_flg);
-				return;
-			default:
-				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
-				return;
-		}
-	}
-}
-
 //******************************** store_obj **********************************
 void store_obj(isp ist, psrec_p psrecp, obj_p obj) {
 	apr_status_t aprerr;
@@ -552,8 +355,9 @@
 	obj_p olst = dict_keys_values(ist, psrecp->obj_to_proxy, 1 /*keys*/);
 	int i, llen = (int) list_len(ist, olst);
 	for(i=0; i < llen; i++) {					
-		obj_p item = list_item(ist, olst, i);		
-		read_unlock(ist, item);				
+		obj_p item = list_item(ist, olst, i);
+		if (item != OBJ(NONE))
+			read_unlock(ist, item);				
 	}											
 	del_unlock(olst);
 }
@@ -677,28 +481,202 @@
 	}
 }
 
-//******************************** load_db ************************************
-obj_p load_db(isp ist, psrec_p psrecp) {
-	int llen, idx = 0;
-	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++) {
-		psid_t id = (psid_t) (list_item(ist, idlist, idx)->data.i64);
-		append_load_ids(ist, psrecp, idlist, id); if_exc_return NULL;
+//******************************** load_obj ***********************************
+obj_p load_obj(isp ist, psrec_p psrecp, obj_p id_obj) {
+	apr_datum_t value;
+	psid_t n, id;
+	char *p, *end;
+	obj_p res, obj;
+	id = (psid_t) id_obj->data.i64;
+
+	value = load_obj_by_id(psrecp, id);  if_exc_return NULL;
+	p = value.dptr;
+	end = p + value.dsize;
+	
+	obj = dict_item(ist, psrecp->id_to_obj, id_obj);  if_exc_return NULL;
+
+	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);  
+					del_unlock(ref_idobj);  if_exc_return NULL;
+					if (first_proto)
+						switch_proto(ist, obj, proto);
+					else
+						ins_proto(ist, obj, proto, 0x7fffffff);
+					first_proto = FALSE;
+				}
+				break;
+			}
+			case 'a': {
+				while(*p++ != ';') {
+					obj_p ref_id_obj, aval;
+					char *q, *aname = pr_malloc(value.dsize);
+					for (q=aname; *p != ':';) *q++ = *p++;
+					*q = 0;
+					for(n=0, p++; *p != ',' && *p != ';'; p++)
+						n = n*10 + *p - '0';
+					ref_id_obj = NEW_INT(n);
+					aval = dict_item( ist, psrecp->id_to_obj, ref_id_obj);  
+					if_exc_return NULL;
+					set_attr(ist, obj, sym(ist, aname), aval);  if_exc_return NULL;
+					del_unlock(ref_id_obj);
+				}
+				break;
+			}
+			case 'l': {
+				init_list_data(ist, obj, 0);
+				while(++p < end) {
+					obj_p ref_id_obj, item;
+					for(n=0; *p != ',' && p < end; p++)
+						n = n*10 + *p - '0';
+					ref_id_obj = NEW_INT(n);
+					item = dict_item( ist, psrecp->id_to_obj, ref_id_obj);  
+					if_exc_return NULL;
+					list_append(ist, obj, item);
+					del_unlock(ref_id_obj);
+				}
+				goto done;
+			}
+			case 'i':
+				obj->data_type = DATA_TYPE_IMMDATA;
+				for(n=0,p++; *p != ':'; p++)
+					n = n*10 + *p - '0';
+				obj->imm_data_len = n;
+				memcpy(&(obj->data), p+1, sizeof(obj->data));
+				goto done;
+			case 's':
+				set_string_data(ist, obj, p+1, end-(p+1));
+				goto done;
+			case '`':
+				del_unlock(obj);
+				return NULL;
+			default:
+				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
+				return NULL;
+		}
 	}
-	root = load_obj(ist, psrecp, NEW_INT(0)); 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); if_exc_return NULL;
+done:
+	res = call_func0(ist, obj, SYM(__FROMSTORPROXY__));
+	if (obj != res)
+		del_unlock(obj);
+	return res;
+}
+
+//******************************** append_load_ids *********************************
+void append_load_ids(isp ist, psrec_p psrecp, obj_p idlist, psid_t id) {
+	apr_datum_t value;
+	obj_p id_obj;
+	psid_t n;
+	int new_flg = TRUE;
+	char *p, *end;
+
+	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;
 
-	//debug = dict_item(ist, root, NEW_MW(NEW_INT(1)));
-	//dump(ist, "root.txt", debug);
-
-	return root;
+	while (p < end) {
+		switch (*p) {
+			case '`': {
+				int i=0, mlen, module_flg = TRUE;
+				char *module, *name;
+				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;
+				module[i] = 0;
+				if (module[0] == '*')
+					module_flg = FALSE;
+				name = pr_malloc(value.dsize - i);
+				for(i=0,p++; p < end; p++) name[i++] = *p;
+				name[i] = 0;
+				// do auto-import here XXX
+				if (module_flg)	
+					module_obj = get_attr(ist, OBJ(MODULES), sym(ist, module));
+				else
+					module_obj = OBJ(OBJECT);
+				if_exc_return;
+				obj = get_attr(ist, module_obj, sym(ist, name)); if_exc_return;
+				if (!obj) {
+					raise_exception(ist, ProsistExc_OBJ, "identity object %s not found in module %s", name, module);
+					return;
+				}
+				id_tuple = get_attr(ist, obj, SYM(__ID__)); if_exc_return;
+				if (!id_tuple) {
+					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, 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, mw_obj, id_tuple);
+				del_unlock(mw_obj);
+				break;
+			}
+			case 'p': {
+				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';
+					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': {
+				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':
+				empty_obj(ist, psrecp, id_obj, &new_flg);
+				return;
+			default:
+				raise_exception(ist, ProsistExc_OBJ, "invalid record from db: %d", id);
+				return;
+		}
+	}
 }
 
 #define IF_EXC_UNLKOBJS_RTRN()			\
@@ -735,6 +713,28 @@
 	unlock_objects(ist, psrecp);
 }
 
+//******************************** load_db ************************************
+obj_p load_db(isp ist, psrec_p psrecp) {
+	int llen, idx = 0;
+	obj_p id_obj, 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++) {
+		psid_t id = (psid_t) (list_item(ist, idlist, idx)->data.i64);
+		append_load_ids(ist, psrecp, idlist, id); if_exc_return NULL;
+	}
+	llen = (int) list_len(ist, idlist);
+	for(idx=llen-1; idx >= 0; idx--) {
+		id_obj = list_item(ist, idlist, idx);
+		load_obj(ist, psrecp, id_obj); if_exc_return NULL;
+		del_unlock(id_obj);
+	}
+	id_obj = NEW_INT(0);
+	root = load_obj(ist, psrecp, id_obj);
+	del_unlock(id_obj);
+	return root;
+}
+
 //******************************** FUNCTION DEFS ******************************
 MODULE_START(Prosist)
 {

Added: trunk/pr/modint.pr
===================================================================
--- trunk/pr/modint.pr	2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/pr/modint.pr	2004-04-24 05:38:08 UTC (rev 406)
@@ -0,0 +1,19 @@
+# tested code
+
+ModInt = Object()
+with ModInt:
+    .modulo = 10 #default
+    def .__init__(*x):
+        if Len(x): .val = x[0]      # val kludge here
+    def .__add__(other):
+        if .modulo != other.modulo:
+            raise TypeError
+        return (.val + other.val) % .modulo
+        
+Mod16Int = ModInt() 
+Mod16Int.modulo = 16    
+
+i = Mod16Int(27)
+j = Mod16Int(4)
+print "sum is %02i" % (i + j)  # prints 15
+
Modified: trunk/pr/prosist.pr
===================================================================
--- trunk/pr/prosist.pr	2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/pr/prosist.pr	2004-04-24 05:38:08 UTC (rev 406)
@@ -4,7 +4,7 @@
 
 import Prosist
 
-#/*
+/*
 print
 
 a = {1:(2,)}
@@ -17,9 +17,9 @@
 print db.root
 db.close()
 
-#*/
+*/
 
-/*
+#/*
 b = 7.3
 
 c = "hello"
@@ -52,7 +52,6 @@
 a = 1
 
 print
-print x
-#, x[6].a , x[6].b , x[6].c 
+print x, x[6].a , x[6].b , x[6].c 
 
-*/
\ No newline at end of file
+#*/
\ No newline at end of file

Modified: trunk/src/lock.c
===================================================================
--- trunk/src/lock.c	2004-04-23 23:27:18 UTC (rev 405)
+++ trunk/src/lock.c	2004-04-24 05:38:08 UTC (rev 406)
@@ -112,6 +112,8 @@
 //********************************* read_lock *********************************
 int read_lock(isp ist, obj_p obj) {
 	get_wrlock(obj, NO_WAIT);
+	if ((intptr_t)obj == 0x009ab9e0)
+		obj = obj + 0;
 	if (ist->access < obj->rd_access) {
 		raise_exception(ist, OBJ(PERMISSION_EXC), "read permission exception");
 		free_wrlock(obj);