|
|
| version 1.11, 2024/09/28 14:15:13 | version 1.13, 2024/09/30 19:03:53 |
|---|---|
| Line 150 class SparseArray_sql_event_handlers: pu | Line 150 class SparseArray_sql_event_handlers: pu |
| ArrayValue& result; | ArrayValue& result; |
| Value* row_value; | Value* row_value; |
| int column_index; | int column_index; |
| ArrayString& columns; | ArrayString* columns; |
| bool one_bool_column; | bool one_bool_column; |
| Table2hash_value_type value_type; | Table2hash_value_type value_type; |
| int columns_count; | int columns_count; |
| Line 162 public: | Line 162 public: |
| result(aresult), | result(aresult), |
| row_value(0), | row_value(0), |
| column_index(0), | column_index(0), |
| columns(*new ArrayString), | columns(new ArrayString), |
| one_bool_column(false), | one_bool_column(false), |
| value_type(avalue_type), | value_type(avalue_type), |
| empty(0) { | empty(0) { |
| Line 170 public: | Line 170 public: |
| bool add_column(SQL_Error& error, const char* str, size_t ) { | bool add_column(SQL_Error& error, const char* str, size_t ) { |
| try { | try { |
| columns+=&STRING(str); | if(columns_count){ |
| // another query in multi_statements mode | |
| columns=new ArrayString; | |
| columns_count=0; | |
| } | |
| *columns+=&STRING(str); | |
| return false; | return false; |
| } catch(...) { | } catch(...) { |
| error=SQL_Error("exception occurred in Hash_sql_event_handlers::add_column"); | error=SQL_Error("exception occurred in Hash_sql_event_handlers::add_column"); |
| Line 179 public: | Line 184 public: |
| } | } |
| bool before_rows(SQL_Error& error) { | bool before_rows(SQL_Error& error) { |
| if(columns.count()<1) { | columns_count=columns->count(); |
| if(columns_count<1) { | |
| error=SQL_Error("no columns"); | error=SQL_Error("no columns"); |
| return true; | return true; |
| } | } |
| if(columns.count()==1) { | if(columns_count==1) { |
| one_bool_column=true; | one_bool_column=true; |
| } else { | } else { |
| switch(value_type){ | switch(value_type){ |
| case C_STRING: { | case C_STRING: { |
| if(columns.count()>2){ | if(columns_count>2){ |
| error=SQL_Error("only 2 columns allowed for $.type[string] and $.sparse(true)."); | error=SQL_Error("only 2 columns allowed for $.type[string] and $.sparse(true)"); |
| return true; | return true; |
| } | } |
| break; | break; |
| } | } |
| case C_TABLE: { | case C_TABLE: { |
| // create empty table which we'll copy later | // create empty table which we'll copy later |
| empty=new Table(&columns); | empty=new Table(columns); |
| columns_count=columns.count(); | |
| break; | break; |
| } | } |
| } | } |
| Line 212 public: | Line 217 public: |
| bool add_row_cell(SQL_Error& error, const char *str, size_t ) { | bool add_row_cell(SQL_Error& error, const char *str, size_t ) { |
| try { | try { |
| if(column_index==columns_count){ | |
| // should never happen, buggy driver case | |
| error=SQL_Error("columns index exceed the columns count"); | |
| return true; | |
| } | |
| bool duplicate=false; | bool duplicate=false; |
| if(one_bool_column) { | if(one_bool_column) { |
| size_t index=str ? pa_atoui(str) : 0; | size_t index=str ? pa_atoui(str) : 0; |
| Line 248 public: | Line 259 public: |
| ArrayString* row=new ArrayString(columns_count); | ArrayString* row=new ArrayString(columns_count); |
| *row+=&STRING(str); | *row+=&STRING(str); |
| *vtable->get_table()+=row; | *vtable->get_table()+=row; |
| row_value=(Value*)row; | |
| break; | break; |
| } | } |
| } | } |
| Line 255 public: | Line 267 public: |
| const String& cell=STRING(str); | const String& cell=STRING(str); |
| switch(value_type) { | switch(value_type) { |
| case C_HASH: { | case C_HASH: { |
| row_value->get_hash()->put(*columns[column_index], new VString(cell)); | row_value->get_hash()->put(*columns->get(column_index), new VString(cell)); |
| break; | break; |
| } | } |
| case C_STRING: { | case C_STRING: { |
| Line 292 class Array_sql_event_handlers: public S | Line 304 class Array_sql_event_handlers: public S |
| ArrayValue& result; | ArrayValue& result; |
| Value* row_value; | Value* row_value; |
| int column_index; | int column_index; |
| ArrayString& columns; | ArrayString* columns; |
| Table2hash_value_type value_type; | Table2hash_value_type value_type; |
| int columns_count; | int columns_count; |
| public: | public: |
| Line 302 public: | Line 314 public: |
| result(aresult), | result(aresult), |
| row_value(0), | row_value(0), |
| column_index(0), | column_index(0), |
| columns(*new ArrayString), | columns(new ArrayString), |
| value_type(avalue_type), | value_type(avalue_type), |
| empty(0) { | empty(0) { |
| } | } |
| bool add_column(SQL_Error& error, const char* str, size_t ) { | bool add_column(SQL_Error& error, const char* str, size_t ) { |
| try { | try { |
| columns+=&STRING(str); | if(columns_count){ |
| // another query in multi_statements mode | |
| columns=new ArrayString; | |
| columns_count=0; | |
| } | |
| *columns+=&STRING(str); | |
| return false; | return false; |
| } catch(...) { | } catch(...) { |
| error=SQL_Error("exception occurred in Hash_sql_event_handlers::add_column"); | error=SQL_Error("exception occurred in Hash_sql_event_handlers::add_column"); |
| Line 318 public: | Line 335 public: |
| } | } |
| bool before_rows(SQL_Error& error) { | bool before_rows(SQL_Error& error) { |
| if(columns.count()<1) { | columns_count=columns->count(); |
| if(columns_count<1) { | |
| error=SQL_Error("no columns"); | error=SQL_Error("no columns"); |
| return true; | return true; |
| } | } |
| switch(value_type){ | switch(value_type){ |
| case C_STRING: { | case C_STRING: { |
| if(columns.count()>1){ | if(columns_count>1){ |
| error=SQL_Error("only one column allowed for $.type[string]."); | error=SQL_Error("only one column allowed for $.type[string]"); |
| return true; | return true; |
| } | } |
| break; | break; |
| } | } |
| case C_TABLE: { | case C_TABLE: { |
| // create empty table which we'll copy later | // create empty table which we'll copy later |
| empty=new Table(&columns); | empty=new Table(columns); |
| columns_count=columns.count(); | |
| break; | break; |
| } | } |
| } | } |
| Line 347 public: | Line 364 public: |
| bool add_row_cell(SQL_Error& error, const char *str, size_t ) { | bool add_row_cell(SQL_Error& error, const char *str, size_t ) { |
| try { | try { |
| if(column_index==columns_count){ | |
| // should never happen, buggy driver case | |
| error=SQL_Error("columns index exceed the columns count"); | |
| return true; | |
| } | |
| if(column_index==0) { | if(column_index==0) { |
| switch(value_type){ | switch(value_type){ |
| case C_HASH: { | case C_HASH: { |
| Line 365 public: | Line 388 public: |
| // creating table of same structure as source | // creating table of same structure as source |
| Table::Action_options table_options(0, 0); | Table::Action_options table_options(0, 0); |
| VTable* vtable=new VTable(new Table(*empty, table_options/*no rows, just structure*/)); | VTable* vtable=new VTable(new Table(*empty, table_options/*no rows, just structure*/)); |
| result+=vtable; | |
| ArrayString* row=new ArrayString(columns_count); | ArrayString* row=new ArrayString(columns_count); |
| *vtable->get_table()+=row; | *vtable->get_table()+=row; |
| row_value=(Value*)row; | |
| result+=vtable; | |
| break; | break; |
| } | } |
| } | } |
| Line 377 public: | Line 400 public: |
| const String& cell=STRING(str); | const String& cell=STRING(str); |
| switch(value_type) { | switch(value_type) { |
| case C_HASH: { | case C_HASH: { |
| row_value->get_hash()->put(*columns[column_index], new VString(cell)); | row_value->get_hash()->put(*columns->get(column_index), new VString(cell)); |
| break; | break; |
| } | } |
| case C_STRING: { | case C_STRING: { |
| Line 422 static void _sql(Request& r, MethodParam | Line 445 static void _sql(Request& r, MethodParam |
| if(params.count()>1) | if(params.count()>1) |
| if(HashStringValue* options=params.as_hash(1, "sql options")) { | if(HashStringValue* options=params.as_hash(1, "sql options")) { |
| int valid_options=0; | int valid_options=0; |
| bool distinct_specified=false; | |
| for(HashStringValue::Iterator i(*options); i; i.next() ){ | for(HashStringValue::Iterator i(*options); i; i.next() ){ |
| String::Body key=i.key(); | String::Body key=i.key(); |
| Value* value=i.value(); | Value* value=i.value(); |
| Line 436 static void _sql(Request& r, MethodParam | Line 460 static void _sql(Request& r, MethodParam |
| valid_options++; | valid_options++; |
| } else if (key == sql_distinct_name) { | } else if (key == sql_distinct_name) { |
| distinct=r.process(*value).as_bool(); | distinct=r.process(*value).as_bool(); |
| distinct_specified=true; | |
| valid_options++; | valid_options++; |
| } else if (key == sql_value_type_name) { | } else if (key == sql_value_type_name) { |
| sparse=r.process(*value).as_bool(); | value_type=get_value_type(r.process(*value)); |
| valid_options++; | valid_options++; |
| } else if (key == "sparse") { | } else if (key == "sparse") { |
| value_type=get_value_type(r.process(*value)); | sparse=r.process(*value).as_bool(); |
| valid_options++; | valid_options++; |
| } | } |
| } | } |
| if(valid_options!=options->count()) | if(valid_options!=options->count()) |
| throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); | throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); |
| if(distinct_specified && !sparse) | |
| throw Exception(PARSER_RUNTIME, 0, "'distinct' option can only be used when $.sparse(true) is specified"); | |
| } | } |
| SQL_Driver::Placeholder* placeholders=0; | SQL_Driver::Placeholder* placeholders=0; |
| Line 458 static void _sql(Request& r, MethodParam | Line 485 static void _sql(Request& r, MethodParam |
| const char* statement_cstr=statement_string.untaint_cstr(String::L_SQL, r.connection()); | const char* statement_cstr=statement_string.untaint_cstr(String::L_SQL, r.connection()); |
| VArray& self=GET_SELF(r, VArray); | VArray& self=GET_SELF(r, VArray); |
| self.array().clear(); self.invalidate(); // just in case if called as method | self.array().clear(); self.invalidate(); // just in case if called as method |
| if(sparse){ | if(sparse){ |