In SELECT(): Don't allow virtual fields in the SELECT clause.
authorscottmk <scottmk@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 26 Feb 2009 20:06:48 +0000 (20:06 +0000)
committerscottmk <scottmk@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 26 Feb 2009 20:06:48 +0000 (20:06 +0000)
The old code allowed them, only to generate invalid queries
asking for non-existent columns.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@12311 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/c-apps/oils_cstore.c

index 868c4de..fe6ef7c 100644 (file)
@@ -2764,6 +2764,34 @@ char* SELECT (
                                                if( defaultselhash ) jsonObjectFree( defaultselhash );
                                                free( core_class );
                                                return NULL;
+                                       } else if ( str_is_true( osrfHashGet( field_def, "virtual" ) ) ) {
+                                               // Virtual field not allowed
+                                               osrfLogError(
+                                                       OSRF_LOG_MARK,
+                                                       "%s: Selected column \"%s\" for class \"%s\" is virtual",
+                                                       MODULENAME,
+                                                       col_name,
+                                                       cname
+                                               );
+                                               if( ctx )
+                                                       osrfAppSessionStatus(
+                                                               ctx->session,
+                                                               OSRF_STATUS_INTERNALSERVERERROR,
+                                                               "osrfMethodException",
+                                                               ctx->request,
+                                                               "Selected column may not be virtual in JSON query"
+                                                       );
+                                               jsonIteratorFree( select_itr );
+                                               jsonIteratorFree( selclass_itr );
+                                               //jsonObjectFree( is_agg );
+                                               buffer_free( sql_buf );
+                                               buffer_free( select_buf );
+                                               buffer_free( order_buf );
+                                               buffer_free( group_buf );
+                                               buffer_free( having_buf );
+                                               if( defaultselhash ) jsonObjectFree( defaultselhash );
+                                               free( core_class );
+                                               return NULL;
                                        }
 
                                        if (locale) {
@@ -2819,6 +2847,34 @@ char* SELECT (
                                                if( defaultselhash ) jsonObjectFree( defaultselhash );
                                                free( core_class );
                                                return NULL;
+                                       } else if ( str_is_true( osrfHashGet( field_def, "virtual" ) ) ) {
+                                               // No such field in current class
+                                               osrfLogError(
+                                                       OSRF_LOG_MARK,
+                                                       "%s: Selected column \"%s\" is virtual for class \"%s\"",
+                                                       MODULENAME,
+                                                       col_name,
+                                                       cname
+                                               );
+                                               if( ctx )
+                                                       osrfAppSessionStatus(
+                                                               ctx->session,
+                                                               OSRF_STATUS_INTERNALSERVERERROR,
+                                                               "osrfMethodException",
+                                                               ctx->request,
+                                                               "Selected column is virtual in JSON query"
+                                                       );
+                                               jsonIteratorFree( select_itr );
+                                               jsonIteratorFree( selclass_itr );
+                                               //jsonObjectFree( is_agg );
+                                               buffer_free( sql_buf );
+                                               buffer_free( select_buf );
+                                               buffer_free( order_buf );
+                                               buffer_free( group_buf );
+                                               buffer_free( having_buf );
+                                               if( defaultselhash ) jsonObjectFree( defaultselhash );
+                                               free( core_class );
+                                               return NULL;
                                        }
 
                                        // Decide what to use as a column alias