From: miker Date: Wed, 26 Sep 2007 16:57:46 +0000 (+0000) Subject: initial test of in-xml views for reporting X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=ac8a333a52305e837b80a723aa718274cb8b6c7b;p=Evergreen.git initial test of in-xml views for reporting git-svn-id: svn://svn.open-ils.org/ILS/trunk@7834 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index f6bf30c914..ed2ee8fbc2 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -2584,6 +2584,39 @@ + + + + SELECT t.* + FROM action.transit_copy t + JOIN actor.org_unit so ON (t.source = so.id) + JOIN actor.org_unit do ON (t.dest = do.id) + WHERE so.parent_ou <> do.parent_ou + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Open-ILS/src/c-apps/oils_cstore.c b/Open-ILS/src/c-apps/oils_cstore.c index 592472185f..588b0b4ee1 100644 --- a/Open-ILS/src/c-apps/oils_cstore.c +++ b/Open-ILS/src/c-apps/oils_cstore.c @@ -283,9 +283,23 @@ int osrfAppChildInit() { continue; } - + growing_buffer* tablebuf = buffer_init(128); + char* tabledef = osrfHashGet(class, "tablename"); + if (!tabledef) { + tabledef = osrfHashGet(class, "source_definition"); + buffer_fadd( tablebuf, "(%s)x", tabledef ); + } else { + buffer_add( tablebuf, tabledef ); + } + + free(tabledef); + tabledef = buffer_data(tablebuf); + buffer_free(tablebuf); + growing_buffer* sql_buf = buffer_init(32); - buffer_fadd( sql_buf, "SELECT * FROM %s WHERE 1=0;", osrfHashGet(class, "tablename") ); + buffer_fadd( sql_buf, "SELECT * FROM %s WHERE 1=0;", tabledef ); + + free(tabledef); char* sql = buffer_data(sql_buf); buffer_free(sql_buf); @@ -705,6 +719,19 @@ jsonObject* doCreate(osrfMethodContext* ctx, int* err ) { return jsonNULL; } + if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) { + osrfAppSessionStatus( + ctx->session, + OSRF_STATUS_BADREQUEST, + "osrfMethodException", + ctx->request, + "Cannot INSERT readonly class" + ); + *err = -1; + return jsonNULL; + } + + char* trans_id = osrfHashGet( (osrfHash*)ctx->session->userData, "xact_id" ); // Set the last_xact_id @@ -1325,7 +1352,16 @@ char* searchJOIN ( jsonObject* join_hash, osrfHash* leftmeta ) { osrfHash* idlClass = osrfHashGet( oilsIDL(), snode->key ); char* class = osrfHashGet(idlClass, "classname"); + + growing_buffer* tablebuf = buffer_init(128); char* table = osrfHashGet(idlClass, "tablename"); + if (!table) { + table = osrfHashGet(idlClass, "source_definition"); + buffer_fadd( tablebuf, "(%s)", table ); + free(table); + table = buffer_data(tablebuf); + buffer_free(tablebuf); + } char* type = jsonObjectToSimpleString( jsonObjectGetKey( snode->item, "type" ) ); char* filter_op = jsonObjectToSimpleString( jsonObjectGetKey( snode->item, "filter_op" ) ); @@ -1511,13 +1547,17 @@ char* searchWHERE ( jsonObject* search_hash, osrfHash* meta, int opjoin_type ) { osrfHash* fields = osrfHashGet(meta, "fields"); osrfHash* field = osrfHashGet( fields, node->key ); + char* table = osrfHashGet(meta, "tablename"); + if (!table) table = "[CUSTOM RESULT SOURCE]"; + if (!field) { osrfLogError( OSRF_LOG_MARK, - "%s: Attempt to reference non-existant column %s on table %s", + "%s: Attempt to reference non-existant column %s on %s (%s)", MODULENAME, node->key, - osrfHashGet(meta, "tablename") + table, + class ); buffer_free(sql_buf); return NULL; @@ -1765,8 +1805,18 @@ char* SELECT ( char* col_list = buffer_data(select_buf); buffer_free(select_buf); + growing_buffer* tablebuf = buffer_init(128); + char* table = osrfHashGet(core_meta, "tablename"); + if (!table) { + table = osrfHashGet(core_meta, "source_definition"); + buffer_fadd( tablebuf, "(%s)", table ); + free(table); + table = buffer_data(tablebuf); + buffer_free(tablebuf); + } + // Put it all together - buffer_fadd(sql_buf, "SELECT %s FROM %s AS \"%s\" ", col_list, osrfHashGet(core_meta, "tablename"), core_class ); + buffer_fadd(sql_buf, "SELECT %s FROM %s AS \"%s\" ", col_list, table, core_class ); free(col_list); // Now, walk the join tree and add that clause @@ -2048,7 +2098,17 @@ char* buildSELECT ( jsonObject* search_hash, jsonObject* order_hash, osrfHash* m char* col_list = buffer_data(select_buf); buffer_free(select_buf); - buffer_fadd(sql_buf, "SELECT %s FROM %s AS \"%s\"", col_list, osrfHashGet(meta, "tablename"), core_class ); + growing_buffer* tablebuf = buffer_init(128); + char* table = osrfHashGet(meta, "tablename"); + if (!table) { + table = osrfHashGet(meta, "source_definition"); + buffer_fadd( tablebuf, "(%s)", table ); + free(table); + table = buffer_data(tablebuf); + buffer_free(tablebuf); + } + + buffer_fadd(sql_buf, "SELECT %s FROM %s AS \"%s\"", col_list, table, core_class ); if ( join_hash ) { char* join_clause = searchJOIN( join_hash, meta ); @@ -2586,6 +2646,18 @@ jsonObject* doUpdate(osrfMethodContext* ctx, int* err ) { return jsonNULL; } + if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) { + osrfAppSessionStatus( + ctx->session, + OSRF_STATUS_BADREQUEST, + "osrfMethodException", + ctx->request, + "Cannot UPDATE readonly class" + ); + *err = -1; + return jsonNULL; + } + dbhandle = writehandle; char* trans_id = osrfHashGet( (osrfHash*)ctx->session->userData, "xact_id" ); @@ -2752,6 +2824,18 @@ jsonObject* doDelete(osrfMethodContext* ctx, int* err ) { return jsonNULL; } + if (osrfHashGet( meta, "readonly" ) && strncasecmp("true", osrfHashGet( meta, "readonly" ), 4)) { + osrfAppSessionStatus( + ctx->session, + OSRF_STATUS_BADREQUEST, + "osrfMethodException", + ctx->request, + "Cannot DELETE readonly class" + ); + *err = -1; + return jsonNULL; + } + dbhandle = writehandle; jsonObject* obj; diff --git a/Open-ILS/src/c-apps/oils_idl-core.c b/Open-ILS/src/c-apps/oils_idl-core.c index 19562b5ed1..ebed253394 100644 --- a/Open-ILS/src/c-apps/oils_idl-core.c +++ b/Open-ILS/src/c-apps/oils_idl-core.c @@ -46,6 +46,7 @@ osrfHash* oilsIDLInit( char* idl_filename ) { usrData = osrfNewHash(); osrfHashSet( usrData, xmlGetProp(kid, BAD_CAST "id"), "classname"); osrfHashSet( usrData, xmlGetNsProp(kid, BAD_CAST "fieldmapper", BAD_CAST OBJECT_NS), "fieldmapper"); + osrfHashSet( usrData, xmlGetNsProp(kid, BAD_CAST "readonly", BAD_CAST PERSIST_NS), "readonly"); osrfHashSet( idlHash, usrData, (char*)osrfHashGet(usrData, "classname") ); @@ -255,6 +256,18 @@ osrfHash* oilsIDLInit( char* idl_filename ) { } } + if (!strcmp( (char*)_cur->name, "source_definition" )) { + string_tmp = NULL; + if( (string_tmp = (char*)xmlNodeGetContent(_cur)) ) { + osrfHashSet( + usrData, + strdup( string_tmp ), + "source_definition" + ); + } + + } + _cur = _cur->next; } }