--- parser3/src/classes/void.C 2001/06/28 07:41:59 1.2 +++ parser3/src/classes/void.C 2001/08/31 13:25:34 1.8 @@ -4,10 +4,8 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - - $Id: void.C,v 1.2 2001/06/28 07:41:59 parser Exp $ */ -static char *RCSId="$Id: void.C,v 1.2 2001/06/28 07:41:59 parser Exp $"; +static const char *RCSId="$Id: void.C,v 1.8 2001/08/31 13:25:34 parser Exp $"; #include "classes.h" #include "pa_request.h" @@ -31,20 +29,41 @@ public: // Methoded // methods -static void _int(Request& r, const String&, MethodParams *) { +static void _int(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - VInt *vunknown=static_cast(r.self); - Value& value=*new(pool) VInt(pool, vunknown->as_int()); - r.write_no_lang(value); + VVoid *vvoid=static_cast(r.self); + r.write_no_lang(*new(pool) VInt(pool, + params->size()==0?vvoid->as_int():params->as_int(0, r)/*default*/)); } -static void _double(Request& r, const String&, MethodParams *) { +static void _double(Request& r, const String&, MethodParams *params) { Pool& pool=r.pool(); - VInt *vunknown=static_cast(r.self); - Value& value=*new(pool) VDouble(pool, vunknown->as_double()); - r.write_no_lang(value); + VVoid *vvoid=static_cast(r.self); + r.write_no_lang(*new(pool) VDouble(pool, + params->size()==0?vvoid->as_double():params->as_double(0, r)/*default*/)); } +#ifndef DOXYGEN +class Void_sql_event_handlers : public SQL_Driver_query_event_handlers { +public: + Void_sql_event_handlers(Pool& apool, const String& astatement_string) : + pool(apool), statement_string(astatement_string) { + } + void add_column(void *ptr, size_t size) { /* ignore */ } + void before_rows() { + // there are some result rows, which is wrong + PTHROW(0, 0, + &statement_string, + "must return nothing"); + } + void add_row() { /* never */ } + void add_row_cell(void *ptr, size_t size) { /* never */ } + +private: + Pool& pool; + const String& statement_string; +}; +#endif static void _sql(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); @@ -53,22 +72,20 @@ static void _sql(Request& r, const Strin &method_name, "without connect"); - Value& statement=params->get_junction(0, "statement must be code"); + Value& statement=params->as_junction(0, "statement must be code"); Temp_lang temp_lang(r, String::UL_SQL); const String& statement_string=r.process(statement).as_string(); const char *statement_cstr= statement_string.cstr(String::UL_UNSPECIFIED, r.connection); - unsigned int sql_column_count; SQL_Driver::Cell *sql_columns; - unsigned long sql_row_count; SQL_Driver::Cell **sql_rows; + Void_sql_event_handlers handlers(pool, statement_string); bool need_rethrow=false; Exception rethrow_me; PTRY { r.connection->query( statement_cstr, 0, 0, - &sql_column_count, &sql_columns, - &sql_row_count, &sql_rows); + handlers); } - PCATCH(e) { // connect/process problem + PCATCH(e) { rethrow_me=e; need_rethrow=true; } PEND_CATCH @@ -76,12 +93,6 @@ static void _sql(Request& r, const Strin PTHROW(rethrow_me.type(), rethrow_me.code(), &statement_string, // setting more specific source [were url] rethrow_me.comment()); - - // there are some result rows, which is wrong - if(sql_row_count) - PTHROW(0, 0, - &statement_string, - "must not return result"); } // constructor @@ -91,10 +102,10 @@ MVoid::MVoid(Pool& apool) : Methoded(apo // ^VOID.int[] - add_native_method("int", Method::CT_DYNAMIC, _int, 0, 0); + add_native_method("int", Method::CT_DYNAMIC, _int, 0, 1); // ^VOID.double[] - add_native_method("double", Method::CT_DYNAMIC, _double, 0, 0); + add_native_method("double", Method::CT_DYNAMIC, _double, 0, 1); // ^sql[query] add_native_method("sql", Method::CT_STATIC, _sql, 1, 1);