rev 415 - in trunk: include/prothon modules/Prosist pr src

SVN User <[email protected]> Sun, 25 Apr 2004 19:00:35 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-04-25 19:00:31 -0400 (Sun, 25 Apr 2004)
New Revision: 415

Modified:
   trunk/include/prothon/prothon.h
   trunk/include/prothon/prothon_dll.h
   trunk/modules/Prosist/Prosist.c
   trunk/pr/prosist.pr
   trunk/src/builtins-dict.c
   trunk/src/object.c
   trunk/src/pr_snprintf.c
Log:
Prosist commit now works

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/include/prothon/prothon.h	2004-04-25 23:00:31 UTC (rev 415)
@@ -627,6 +627,9 @@
 obj_p new_dict_obj(isp ist, int initial_size);
 #define NEW_DICT(initial_size)  new_dict_obj(ist, initial_size);
 
+// DICT_CLEAR: Remove all contents of the dictionary
+void dict_clear(isp ist, obj_p dict_obj);
+
 // CLONE_LIST_OBJ: Create a new list object that's a shallow copy of another
 obj_p copy_list_obj(isp ist, obj_p list_obj);
 

Modified: trunk/include/prothon/prothon_dll.h
===================================================================
--- trunk/include/prothon/prothon_dll.h	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/include/prothon/prothon_dll.h	2004-04-25 23:00:31 UTC (rev 415)
@@ -114,6 +114,7 @@
 	int			(*is_unclonable)(obj_p obj);
 	char*		(*key_to_symstr)(isp ist, attr_key_t key);
 	obj_p		(*new_dict_obj)(isp ist, int initial_size);
+	void		(*dict_clear)(isp ist, obj_p dict_obj);
 	int			(*proto_len)(isp ist, obj_p obj);
 	obj_p		(*proto_item)(isp ist, obj_p obj, int i);
 	void		(*dump)(isp ist, char* dumpfilename, obj_p obj);
@@ -293,6 +294,7 @@
 #define is_unclonable	 	(*services->is_unclonable)	 
 #define key_to_symstr	 	(*services->key_to_symstr)	 
 #define new_dict_obj	 	(*services->new_dict_obj)	 
+#define dict_clear		 	(*services->dict_clear)	 
 #define proto_len		 	(*services->proto_len)		 
 #define proto_item		 	(*services->proto_item)		 
 #define set_archived	 	(*services->set_archived)

Modified: trunk/modules/Prosist/Prosist.c
===================================================================
--- trunk/modules/Prosist/Prosist.c	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/modules/Prosist/Prosist.c	2004-04-25 23:00:31 UTC (rev 415)
@@ -89,7 +89,9 @@
 MODULE_CONSTANT_DECLARE(Prosist, RWCREATE ); 
 MODULE_CONSTANT_DECLARE(Prosist, RWTRUNCATE  ); 
 
+obj_p PSNONE;
 
+
 #define IF_APR_DBM_ERR(db, msg1, msg2)													\
 	if (aprerr != APR_SUCCESS){															\
 		char *msg3, buf[256], errbuf[256];												\
@@ -283,7 +285,9 @@
 	int i, plen, added_attr = FALSE;
 	ADD_BUF_DECLARE;
 
-	if (obj == OBJ(NONE)) return;
+	if (obj == PSNONE || is_archived(obj)) return;
+	
+	set_archived(obj);
 
 	id = obj_to_id(ist, psrecp, obj); if_exc_return;
 	ADD_BUF_START();
@@ -357,7 +361,7 @@
 	int i, llen = (int) list_len(ist, olst);
 	for(i=0; i < llen; i++) {					
 		obj_p item = list_item(ist, olst, i);
-		if (item != OBJ(NONE)) {
+		if (item != PSNONE) {
 			if (has_proto_QUES(ist, item, MutWrap_OBJ))
 				item = (obj_p) item->data.ptr;
 			read_unlock(ist, item);				
@@ -367,28 +371,40 @@
 }
 
 //******************************** append_store_refs ****************************
-void append_store_refs(isp ist, psrec_p psrecp, obj_p obj, int objidx, obj_p store_refs) {
-	psid_t id;
+void append_store_refs( isp ist, psrec_p psrecp, obj_p obj, 
+					    int objidx, obj_p store_refs, int commit_flg ) {
+	psid_t id=-1;
 	attr_key_t key;
-	obj_p mw_obj, id_obj, id_tuple, proxy_obj;
-	int i, plen, tuple_type=FALSE;
+	obj_p mw_obj, id_obj=NULL, id_tuple, proxy_obj;
+	int i, plen, tuple_type=FALSE, obj_known = FALSE;
 
 	mw_obj = NEW_MW(obj);
-	if (obj == OBJ(NONE) || dict_item(ist, psrecp->obj_to_id, mw_obj)) {
-		list_item_set(ist, store_refs, objidx, OBJ(NONE));
+	id_obj = dict_item(ist, psrecp->obj_to_id, mw_obj);
+	if (id_obj) {
+		id = (psid_t) id_obj->data.i64;
+		obj_known = TRUE;
+	}
+
+	if (obj == PSNONE || !commit_flg && obj_known) {
+		list_item_set(ist, store_refs, objidx, PSNONE);
 		del_unlock(mw_obj);
 		return;
 	}
 	rdlock_rtrn(obj);
-	id = psrecp->nextid++;
-	id_obj = NEW_INT(id);
 
+	if (!obj_known) {
+		id = psrecp->nextid++;
+		id_obj = NEW_INT(id);
+	}
+
 	if ((id_tuple = get_attr(ist, obj, SYM(__ID__)))) {
 		apr_status_t aprerr;
 		size_t slen;
 		char *s1, *s2;
 		apr_datum_t key, value;
 		ADD_BUF_DECLARE;
+		if (commit_flg & obj_known) 
+			goto endidobj;
 		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);
@@ -421,26 +437,29 @@
 		aprerr = apr_dbm_store(psrecp->db, key, value);
 		IF_APR_DBM_ERR(psrecp->db, "storing id object ", value.dptr);
 		ADD_BUF_END();
+endidobj:
+		list_item_set(ist, store_refs, objidx, PSNONE);
 		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)) { 
+	if (proxy_obj == PSNONE || is_unclonable(proxy_obj)) { 
+		list_item_set(ist, store_refs, objidx, PSNONE);
+		read_unlock(ist, obj);
+		del_unlock(mw_obj); 
+		del_unlock(id_obj);
 		del_unlock(proxy_obj); 
-		del_unlock(mw_obj); 
-		read_unlock(ist, obj);
-		list_item_set(ist, store_refs, objidx, OBJ(NONE));
 		return;
 	}
 	if (proxy_obj->data_type == DATA_TYPE_DATAPTR) {
 		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(mw_obj); 
+			del_unlock(id_obj);
 			del_unlock(proxy_obj); 
-			del_unlock(mw_obj); 
 			return;
 		}
 	}
@@ -457,7 +476,8 @@
 	for(i=0; i < plen; i++) { // Tuple proto 992060
 		obj_p proto = proto_item(ist, proxy_obj, i);
 		mw_obj = NEW_MW(proto);
-		if (!is_unclonable(proto) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
+		if ( !is_unclonable(proto) && 
+			 (commit_flg || !dict_item(ist, psrecp->obj_to_id, mw_obj)) )
 			list_append(ist, store_refs, proto);
 		del_unlock(mw_obj);
 		if_exc_return;
@@ -466,7 +486,8 @@
 	while(key) {
 		obj_p attr = attr_value_by_key(ist, proxy_obj, key);
 		mw_obj = NEW_MW(attr);
-		if (!is_unclonable(attr) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
+		if ( !is_unclonable(attr) && 
+			 (commit_flg || !dict_item(ist, psrecp->obj_to_id, mw_obj)) )
 			list_append(ist, store_refs, attr);
 		del_unlock(mw_obj);
 		if_exc_return;
@@ -477,7 +498,8 @@
 		for (i=0; i < llen; i++) {
 			obj_p item = list_item(ist, proxy_obj, i);
 			mw_obj = NEW_MW(item);
-			if (!is_unclonable(item) && !dict_item(ist, psrecp->obj_to_id, mw_obj))
+			if ( !is_unclonable(item) && 
+			     (commit_flg || !dict_item(ist, psrecp->obj_to_id, mw_obj)) )
 				list_append(ist, store_refs, item);
 			del_unlock(mw_obj);
 			if_exc_return;
@@ -491,8 +513,8 @@
 	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;
@@ -577,6 +599,7 @@
 		del_unlock(mw_res);
 		del_unlock(obj);
 	}
+	set_archived(res);
 	return res;
 }
 
@@ -700,6 +723,9 @@
 void store_new_db(isp ist, psrec_p psrecp) {
 	obj_p store_refs;
 	int i, llen;
+#ifdef PROSIST_DEBUG
+	printf ("\nStarting store_new_db\n\n");
+#endif
 	if (apr_dbm_exists(psrecp->db, apr_str("0"))) {
 		raise_exception(ist, ProsistExc_OBJ, "Database already exists");
 		return;
@@ -712,7 +738,7 @@
 	list_append(ist, store_refs, psrecp->root);
 	for (i=0; i < (int) list_len(ist, store_refs); i++) {
 		obj_p item = list_item(ist, store_refs, i);
-		append_store_refs(ist, psrecp, item, i, store_refs);
+		append_store_refs(ist, psrecp, item, i, store_refs, FALSE);
 		IF_EXC_UNLKOBJS_RTRN();
 	}
 	llen = (int) list_len(ist, store_refs);
@@ -722,13 +748,51 @@
 		IF_EXC_UNLKOBJS_RTRN();
 	}
 	unlock_objects(ist, psrecp);
+	store_dbm_int(psrecp, "!nextid", psrecp->nextid);
+#ifdef PROSIST_DEBUG
+	printf ("\nEnding store_new_db\n\n");
+#endif
 }
 
+//******************************** commit_db ************************************
+void commit_db(isp ist, psrec_p psrecp) {
+	obj_p store_refs;
+	int i, llen;
+
+#ifdef PROSIST_DEBUG
+	printf ("\nStarting commit_db\n\n");
+#endif	
+	dict_clear(ist, psrecp->obj_to_proxy);
+
+	store_refs = new_list_obj(ist, 20);
+	list_append(ist, store_refs, psrecp->root);
+	for (i=0; i < (int) list_len(ist, store_refs); i++) {
+		obj_p item = list_item(ist, store_refs, i);
+		append_store_refs(ist, psrecp, item, i, store_refs, TRUE);
+		IF_EXC_UNLKOBJS_RTRN();
+	}
+	llen = (int) list_len(ist, store_refs);
+	for (i=0; i < llen; i++) {
+		obj_p item = list_item(ist, store_refs, i);
+		store_obj(ist, psrecp, item);
+		IF_EXC_UNLKOBJS_RTRN();
+	}
+	unlock_objects(ist, psrecp);
+	store_dbm_int(psrecp, "!nextid", psrecp->nextid);
+#ifdef PROSIST_DEBUG
+	printf ("\nEnding commit_db\n\n");
+#endif
+}
+
 //******************************** 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;
-		
+	obj_p id_obj, idlist, root = NULL;
+#ifdef PROSIST_DEBUG
+	printf ("\nStarting load_db\n\n");
+#endif
+	psrecp->nextid = load_dbm_int(psrecp, "!nextid");
+	idlist = new_list_obj(ist, 20);
 	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);
@@ -743,12 +807,17 @@
 	id_obj = NEW_INT(0);
 	root = load_obj(ist, psrecp, id_obj);
 	del_unlock(id_obj);
+#ifdef PROSIST_DEBUG
+	printf ("\nEnding load_db\n\n");
+#endif
 	return root;
 }
 
 //******************************** FUNCTION DEFS ******************************
 MODULE_START(Prosist)
 {
+	PSNONE = NEW_OBJ(NULL);
+
 	Prosist_OBJ = NEW_OBJ(NULL);
 	MODULE_SET_DOC(Prosist, "persistant database module for Prothon objects");
 	MODULE_ADD_TO_BASE(Prosist);
@@ -816,13 +885,11 @@
 	psrecp->obj_to_proxy     = NEW_DICT(4*INITIAL_OBJ_COUNT);
 
 	if (root_obj == OBJ(NONE)) {
-		psrecp->nextid = load_dbm_int(psrecp, "!nextid");
 		root_obj = psrecp->root = load_db(ist, psrecp);
 	} else {
 		psrecp->root   = root_obj;
 		psrecp->nextid = 0;
 		store_new_db(ist, psrecp);  if_exc_return NULL; 
-		store_dbm_int(psrecp, "!nextid", psrecp->nextid);
 	}
 	read_unlock(ist, self);
 	set_obj_rdacc(self, ACC_USER1);
@@ -839,19 +906,23 @@
 		trans_abort(ist, dbdatap);
 	return self;
 }
+*/
 
-DEF(DB, commit, NULL) {
-	dbdata_p dbdatap = self->data.ptr;
-	if (dbdatap)
-		trans_commit(ist, dbdatap);
+DEF(Prosist, commit, NULL) {
+	psrec_p psrecp = self->data.ptr;
+	if (psrecp) 
+		commit_db(ist, psrecp);
+	else {
+		raise_exception(ist, ProsistExc_OBJ, "commit attempted on closed database");
+		return NULL;
+	}
 	return self;
 }
-*/
 
+
 DEF(Prosist, close, NULL) { 
 	psrec_p psrecp = self->data.ptr;
 	if (psrecp) {
-		// commit(ist, psrecp);
 		apr_dbm_close(psrecp->db);
 		apr_pool_destroy(psrecp->pool);
 		self->data.ptr = NULL;
@@ -886,6 +957,7 @@
 {
 	MODULE_SUB_INIT(Prosist);
 	MODULE_ADD_SYM(Prosist, __init__);
+	MODULE_ADD_SYM(Prosist, commit);
 	MODULE_ADD_SYM(Prosist, close);
 	MODULE_ADD_SYM(Prosist, closed_QUES);
 	MODULE_ADD_SYM(Prosist, __objList__);

Modified: trunk/pr/prosist.pr
===================================================================
--- trunk/pr/prosist.pr	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/pr/prosist.pr	2004-04-25 23:00:31 UTC (rev 415)
@@ -17,13 +17,22 @@
 g = Object()
 g.a = 1
 g.b = '2'
-g.c = {'3':{4:'5'}}
+g.c = {'3':{4:'5'},'4':None}
 
 a = {1:b, 2:c, 3:[d,e], (4,5): f, 6:g}
 
 db = Prosist('test.pdb', root=a, mode=Prosist.RWTRUNCATE)
+
+a[1] = 999
+a[1] = b
+g.b = []
+
+a[(4,5)] = {'i':'am', 'a':'different', 'dict':'!'}
+a[2] = 'yoohoo'
+
+db.commit()
+
 db.close()
-
 db = Prosist('test.pdb')
 x = db.root
 db.close()

Modified: trunk/src/builtins-dict.c
===================================================================
--- trunk/src/builtins-dict.c	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/src/builtins-dict.c	2004-04-25 23:00:31 UTC (rev 415)
@@ -101,6 +101,16 @@
 	return dict;
 }
 
+//********************************* dict_clear ********************************
+void dict_clear(isp ist, obj_p dict_obj) {
+	dict_p dict;
+	write_lock(ist, dict_obj);
+	dict = dict_d(dict_obj);
+	memset(&(dict->entry)+1, 0, dictsize(dict) * sizeof(dict_entry_t));
+	dictlen(dict) = 0;
+	write_unlock(ist, dict_obj);
+}
+
 //********************************* hash_value ********************************
 i32_t hash_value(isp ist, obj_p key_in) {
 	if (has_proto_QUES(ist, key_in, OBJ(INT_PROTO)))
@@ -440,7 +450,7 @@
 	dict_p dict;
 	def_write_lock(self);
 	dict = dict_d(self);
-	memset(&(dict->entry), 0, dictsize(dict) * sizeof(dict_entry_t));
+	memset(&(dict->entry)+1, 0, dictsize(dict) * sizeof(dict_entry_t));
 	dictlen(dict) = 0;
 	def_write_unlock(self);
 	return self;

Modified: trunk/src/object.c
===================================================================
--- trunk/src/object.c	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/src/object.c	2004-04-25 23:00:31 UTC (rev 415)
@@ -193,6 +193,7 @@
 	dll_services.is_unclonable	   = is_unclonable;
 	dll_services.key_to_symstr	   = key_to_symstr;	  
 	dll_services.new_dict_obj	   = new_dict_obj;	  
+	dll_services.dict_clear	       = dict_clear;	  
 	dll_services.proto_len		   = proto_len;	  
 	dll_services.proto_item		   = proto_item;		 
 	dll_services.dump			   = dump;		 

Modified: trunk/src/pr_snprintf.c
===================================================================
--- trunk/src/pr_snprintf.c	2004-04-25 19:32:02 UTC (rev 414)
+++ trunk/src/pr_snprintf.c	2004-04-25 23:00:31 UTC (rev 415)
@@ -392,7 +392,14 @@
      * number against the largest long value it can be. If <=, we
      * punt to the quicker version.
      */
-    if ((num <= ULONG_MAX && is_unsigned) || (num <= LONG_MAX && !is_unsigned))
+
+	// ULONG_MAX and LONG_MAX are not win32 compatible  XXX
+
+    //if ((num <= ULONG_MAX && is_unsigned) || (num <= LONG_MAX && !is_unsigned))
+    //        return(conv_10( (wide_int)num, is_unsigned, is_negative,
+    //           buf_end, len));
+
+	if ((num <= 0xffffffff && is_unsigned) || (num <= 0x7fffffff && !is_unsigned))
             return(conv_10( (wide_int)num, is_unsigned, is_negative,
                buf_end, len));