From: erickson Date: Thu, 25 Aug 2005 15:55:13 +0000 (+0000) Subject: cleaning up the JSON code some X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=14d6f780f34b04b710032282ad247c9f69f47489;p=opensrf%2Fbjwebb.git cleaning up the JSON code some added host config retrieval for the stack did some more memory checking git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@503 9efc2488-bf62-4759-914b-345cdb29e865 --- diff --git a/src/libstack/Makefile b/src/libstack/Makefile index 7f39955..20024a2 100644 --- a/src/libstack/Makefile +++ b/src/libstack/Makefile @@ -1,15 +1,32 @@ -CC_OPTS += -DASSUME_STATELESS -EXE_LD_OPTS += -lxml2 -lopensrf_transport -lopensrf_stack -lobjson -lc_utils +CC_OPTS += -DASSUME_STATELESS +LD_OPTS += -lxml2 -lopensrf_transport -lopensrf_stack -lobjson -lc_utils -SOURCES = osrf_message.c osrf_app_session.c osrf_stack.c osrf_system.c osrf_config.c -TARGETS = osrf_message.o osrf_app_session.o osrf_stack.o osrf_system.o osrf_config.o -HEADERS = osrf_message.h osrf_app_session.h osrf_stack.h osrf_system.h osrf_config.h +SOURCES = osrf_message.c osrf_app_session.c osrf_stack.c osrf_system.c osrf_config.c osrf_settings.c +TARGETS = osrf_message.o osrf_app_session.o osrf_stack.o osrf_system.o osrf_config.o osrf_settings.o +HEADERS = osrf_message.h osrf_app_session.h osrf_stack.h osrf_system.h osrf_config.h osrf_settings.h -all: msg libopensrf_stack.so +all: msg libopensrf_stack.so test msg: echo "-> $$(pwd)" +test: test.o + echo $@ + $(CC) $(LD_OPTS) test.o xml_utils.o -o $@ + +test.o: test.c xml_utils.o + echo $@ + $(CC) -c $(CC_OPTS) test.c -o $@ + +xml_utils.o: + echo $@ + cp ../utils/xml_utils.h . + cp ../utils/xml_utils.c . + $(CC) -c $(CC_OPTS) xml_utils.c -o $@ + +# ------------------------------------------------------------- + + libopensrf_stack.so: $(TARGETS) echo $@ $(CC) -shared -W1 $(TARGETS) -o libopensrf_stack.so @@ -31,10 +48,13 @@ osrf_system.o: osrf_system.c osrf_system.h osrf_config.o: osrf_config.c osrf_config.h echo $@; $(CC) -c $(CC_OPTS) osrf_config.c -o $@ +osrf_settings.o: osrf_settings.c osrf_settings.h + echo $@; $(CC) -c $(CC_OPTS) osrf_settings.c -o $@ + install: echo installing libopensrf_stack.so cp $(HEADERS) $(INCLUDEDIR)/$(OPENSRF) cp $(TMPDIR)/libopensrf_stack.so $(LIBDIR)/ clean: - /bin/rm -f *.o libopensrf_stack.so + /bin/rm -f *.o libopensrf_stack.so test diff --git a/src/libstack/osrf_config.c b/src/libstack/osrf_config.c index a4953b1..84e90da 100644 --- a/src/libstack/osrf_config.c +++ b/src/libstack/osrf_config.c @@ -1,18 +1,5 @@ #include "osrf_config.h" -//object* config_object = NULL; - -/* -char* osrf_config_value(char* path) { -} - - -void _osrf_config_grab_config() { - if(config_object) return; -} -*/ - - void config_reader_init( char* name, char* config_file ) { if( name == NULL || config_file == NULL || strlen(config_file) == 0 ) { diff --git a/src/libstack/osrf_system.c b/src/libstack/osrf_system.c index 92ddb48..62bf673 100644 --- a/src/libstack/osrf_system.c +++ b/src/libstack/osrf_system.c @@ -1,6 +1,7 @@ #include "osrf_system.h" transport_client* global_client; +char* system_config = NULL; transport_client* osrf_system_get_transport_client() { return global_client; @@ -8,12 +9,15 @@ transport_client* osrf_system_get_transport_client() { int osrf_system_bootstrap_client( char* config_file, char* contextnode ) { - if( config_file == NULL ) + if( !config_file || !contextnode ) fatal_handler("No Config File Specified\n" ); + free(system_config); + free(osrf_config_context); + system_config = strdup(config_file); + osrf_config_context = strdup(contextnode); + config_reader_init( "opensrf.bootstrap", config_file ); - - osrf_config_context = contextnode; char* log_file = config_value( "opensrf.bootstrap", "//%s/logfile", contextnode ); char* log_level = config_value( "opensrf.bootstrap", "//%s/loglevel", contextnode ); @@ -57,12 +61,20 @@ int osrf_system_bootstrap_client( char* config_file, char* contextnode ) { return 0; } -int osrf_system_shutdown() { - config_reader_free(); - log_free(); +int osrf_system_disconnect_client() { client_disconnect( global_client ); client_free( global_client ); global_client = NULL; + return 0; +} + +int osrf_system_shutdown() { + config_reader_free(); + osrf_system_disconnect_client(); + free(system_config); + free(osrf_config_context); + osrf_settings_free_host_config(NULL); + log_free(); return 1; } diff --git a/src/libstack/osrf_system.h b/src/libstack/osrf_system.h index 70fe6f3..cf50989 100644 --- a/src/libstack/osrf_system.h +++ b/src/libstack/osrf_system.h @@ -2,6 +2,7 @@ #include "utils.h" #include "logging.h" #include "osrf_config.h" +//#include "osrf_settings.h" #ifndef OSRF_SYSTEM_H #define OSRF_SYSTEM_H @@ -15,6 +16,8 @@ char* osrf_config_context; int osrf_system_bootstrap_client( char* config_file, char* contextnode ); transport_client* osrf_system_get_transport_client(); +/* disconnects and destroys the current client connection */ +int osrf_system_disconnect_client(); int osrf_system_shutdown(); diff --git a/src/libtransport/transport_session.c b/src/libtransport/transport_session.c index 44f88a8..21dfea1 100644 --- a/src/libtransport/transport_session.c +++ b/src/libtransport/transport_session.c @@ -53,30 +53,19 @@ transport_session* init_transport( char* server, session->parser_ctxt = xmlCreatePushParserCtxt(SAXHandler, session, "", 0, NULL); /* initialize the transport_socket structure */ - //session->sock_obj = (transport_socket*) safe_malloc( sizeof(transport_socket) ); session->sock_mgr = (socket_manager*) safe_malloc( sizeof(socket_manager) ); - //int serv_size = strlen( server ); -/* - session->sock_obj->server = server; - session->sock_obj->port = port; - session->sock_obj->data_received_callback = &grab_incoming; -*/ - session->sock_mgr->data_received = &grab_incoming; session->sock_mgr->blob = session; session->port = port; session->server = strdup(server); - if(unix_path) + if(unix_path) session->unix_path = strdup(unix_path); - session->unix_path = NULL; + else session->unix_path = NULL; session->sock_id = 0; - /* this will be handed back to us in callbacks */ - //session->sock_obj->user_data = session; - return session; } @@ -86,18 +75,17 @@ transport_session* init_transport( char* server, int session_free( transport_session* session ) { if( ! session ) { return 0; } - //if( session->sock_obj ) - // free( session->sock_obj ); - if(session->sock_mgr) socket_manager_free(session->sock_mgr); if( session->state_machine ) free( session->state_machine ); if( session->parser_ctxt) { - xmlCleanupCharEncodingHandlers(); xmlFreeDoc( session->parser_ctxt->myDoc ); xmlFreeParserCtxt(session->parser_ctxt); } + + xmlCleanupCharEncodingHandlers(); + xmlDictCleanup(); xmlCleanupParser(); buffer_free(session->body_buffer); diff --git a/src/objson/object.c b/src/objson/object.c index cea3d87..e04d6ad 100644 --- a/src/objson/object.c +++ b/src/objson/object.c @@ -667,11 +667,11 @@ object* object_find_path(object* obj, char* format, ...) { char* t = buf; char* tt = tokbuf; + /* copy the path before strtok_r destroys it */ char* pathcopy = strdup(buf); /* grab the root of the path */ token = strtok_r(t, "/", &tt); - t = NULL; if(!token) return NULL; /* special case where path starts with // (start anywhere) */ @@ -683,6 +683,7 @@ object* object_find_path(object* obj, char* format, ...) { free(pathcopy); + t = NULL; do { obj = obj->get_key(obj, token); } while( (token = strtok_r(NULL, "/", &tt)) && obj); @@ -695,20 +696,22 @@ object* object_find_path(object* obj, char* format, ...) { object* _object_find_path_recurse(object* obj, char* root, char* path) { if(!obj || ! root) return NULL; + + /* collect all of the potential objects */ object* arr = __object_find_path_recurse(obj, root); - object* newarr = json_parse_string("[]"); + /* container for fully matching objects */ + object* newarr = json_parse_string("[]"); int i; /* path is just /root or /root/ */ if( strlen(root) + 2 >= strlen(path) ) { return arr; + } else { + /* gather all of the sub-objects that match the full path */ for( i = 0; i < arr->size; i++ ) { - /* - fprintf(stderr, "Searching root %s and path %s and size %ld\n", root, path + strlen(root) + 1, arr->size); - */ object* a = arr->get_index(arr, i); object* thing = object_find_path(a , path + strlen(root) + 1); if(thing) newarr->push(newarr, thing); @@ -723,6 +726,10 @@ object* __object_find_path_recurse(object* obj, char* root) { object* arr = json_parse_string("[]"); if(!obj) return arr; + + int i; + + /* if the current object has a node that matches, add it */ object* o = obj->get_key(obj, root); if(o) arr->push(arr, object_clone(o)); @@ -730,15 +737,14 @@ object* __object_find_path_recurse(object* obj, char* root) { object* childarr; object_iterator* itr = new_iterator(obj); + /* recurse through the children and find all potential nodes */ while( (tmp = itr->next(itr)) ) { childarr = __object_find_path_recurse(tmp->item, root); if(childarr && childarr->size > 0) { - int i; for( i = 0; i!= childarr->size; i++ ) { arr->push(arr, object_clone(childarr->get_index(childarr, i))); } } - free_object(childarr); } diff --git a/src/objson/object.h b/src/objson/object.h index 8209de1..bf8f4a5 100644 --- a/src/objson/object.h +++ b/src/objson/object.h @@ -219,6 +219,9 @@ char* json_string_format(char* json); object* object_clone(object* o); +/* ------------------------------------------------------------------------ */ +/* XPATH */ + /* provide an XPATH style path (e.g. /some/node/here) and this will return the object at that location if one exists. Naturally, every element in the path must be a proper object ("hash" / {}). @@ -229,9 +232,14 @@ object* object_clone(object* o); object* object_find_path(object* obj, char* format, ...); -/* returns an object array of matches */ +/* Utility method. finds any object in the tree that matches the path. + Use this for finding paths that start with '//' */ object* _object_find_path_recurse(object* obj, char* root, char* path); + +/* returns a list of object whose key is 'root'. These are used as + potential objects when doing a // search */ object* __object_find_path_recurse(object* obj, char* root); +/* ------------------------------------------------------------------------ */ #endif diff --git a/src/utils/Makefile b/src/utils/Makefile index 6964e61..2221ae2 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -4,18 +4,16 @@ # ------------------------------------------------------------------------ -LD_OPTS += -lc_utils -CC_OPTS -= -Wall - UTIL_SOURCES = logging.c utils.c socket_bundle.c md5.c sha.c string_array.c UTIL_HEADERS = logging.h utils.h socket_bundle.h md5.h sha.h string_array.h UTIL_OBJECTS = logging.o utils.o socket_bundle.o md5.o sha.o string_array.o -all: msg libc_utils.so +all: msg libc_utils.so msg: echo "-> $$(pwd)" + install: echo installing libc_utils.so cp $(UTIL_HEADERS) $(INCLUDEDIR)/ @@ -51,8 +49,9 @@ string_array.o: string_array.c string_array.h @echo $@ $(CC) -c $(CC_OPTS) string_array.c -o $@ + clean: - /bin/rm -f *.o socket_test libc_utils.so + /bin/rm -f *.o socket_test libc_utils.so test