--- parser3/src/classes/hash.C 2002/12/09 11:07:39 1.52 +++ parser3/src/classes/hash.C 2003/01/31 12:34:26 1.54.2.2 @@ -1,11 +1,11 @@ /** @file Parser: @b hash parser class. - Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ -static const char* IDENT_HASH_C="$Date: 2002/12/09 11:07:39 $"; +static const char* IDENT_HASH_C="$Date: 2003/01/31 12:34:26 $"; #include "classes.h" #include "pa_request.h" @@ -20,7 +20,7 @@ static const char* IDENT_HASH_C="$Date: class MHash : public Methoded { public: // VStateless_class - Value *create_new_value(Pool& pool) { return new(pool) VHash(pool); } + ValuePtr create_new_value() { return ValuePtr(new VHash()); } public: MHash(Pool& pool); @@ -34,7 +34,7 @@ public: // Methoded class Hash_sql_event_handlers: public SQL_Driver_query_event_handlers { public: Hash_sql_event_handlers(Pool& apool, const String& amethod_name, - const String& astatement_string, const char *astatement_cstr, + const String& astatement_string, const char* astatement_cstr, bool adistinct, Hash& arows_hash): pool(apool), @@ -46,45 +46,66 @@ public: columns(pool), row_index(0) { } - void add_column(void *ptr, size_t size) { - String *column=new(pool) String(pool); - column->APPEND_TAINTED( - (const char *)ptr, size, - statement_cstr, 0); - columns+=column; - } - void before_rows() { - if(columns.size()<=1) - throw SQL_Exception("parser.runtime", + bool add_column(SQL_Error& error, void *ptr, size_t size) { + try { + String *column=new(pool) String(pool); + column->APPEND_TAINTED( + (const char* )ptr, size, + statement_cstr, 0); + columns+=column; + + return false; + } catch(...) { + error=SQL_Error("exception occured in Hash_sql_event_handlers::add_column"); + return true; + } + } + bool before_rows(SQL_Error& error) { + if(columns.size()<=1) { + error=SQL_Error("parser.runtime", &method_name, "column count must be more than 1 to create a hash"); + return true; + } + + return false; } - void add_row() { + bool add_row(SQL_Error& /*error*/) { column_index=0; + return false; } - void add_row_cell(void *ptr, size_t size) { - String *cell=new(pool) String(pool); - if(size) - cell->APPEND_TAINTED( - (const char *)ptr, size, - statement_cstr, row_index++); - if(column_index==0) { - VHash *row_vhash=new(pool) VHash(pool); - row_hash=row_vhash->get_hash(0); - if(rows_hash.put_dont_replace(*cell, row_vhash)) // put. existed? - if(!distinct) - throw SQL_Exception("parser.runtime", - cell, - "duplicate key"); - } else - row_hash->put(*columns.get_string(column_index), new(pool) VString(*cell)); - column_index++; + bool add_row_cell(SQL_Error& error, void *ptr, size_t size) { + try { + String *cell=new(pool) String(pool); + if(size) + cell->APPEND_TAINTED( + (const char* )ptr, size, + statement_cstr, row_index++); + if(column_index==0) { + VHash *row_vhash=new(pool) VHash(pool); + row_hash=row_vhash->get_hash(0); + if(rows_hash.put_dont_replace(*cell, row_vhash)) // put. existed? + if(!distinct) { + error=SQL_Error("parser.runtime", + cell, + "duplicate key"); + return true; + } + } else + row_hash->put(*columns.get_string(column_index), new(pool) VString(*cell)); + column_index++; + + return false; + } catch(...) { + error=SQL_Error("exception occured in Hash_sql_event_handlers::add_row_cell"); + return true; + } } private: Pool& pool; const String& method_name; - const String& statement_string; const char *statement_cstr; + const String& statement_string; const char* statement_cstr; bool distinct; Hash& rows_hash; Hash *row_hash; @@ -229,7 +250,7 @@ static void _sql(Request& r, const Strin Temp_lang temp_lang(r, String::UL_SQL); const String& statement_string=r.process_to_string(statement); - const char *statement_cstr= + const char* statement_cstr= statement_string.cstr(String::UL_UNSPECIFIED, r.connection(&method_name)); Hash& hash=static_cast(r.get_self())->hash(&method_name); hash.clear();