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));