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