--- parser3/src/classes/date.C 2002/11/29 12:13:42 1.41 +++ parser3/src/classes/date.C 2003/02/04 14:04:45 1.42.2.4 @@ -1,11 +1,11 @@ /** @file Parser: @b date 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_DATE_C="$Date: 2002/11/29 12:13:42 $"; +static const char* IDENT_DATE_C="$Date: 2003/02/04 14:04:45 $"; #include "classes.h" #include "pa_request.h" @@ -17,7 +17,7 @@ static const char* IDENT_DATE_C="$Date: class MDate : public Methoded { public: // VStateless_class - Value *create_new_value(Pool& pool) { return new(pool) VDate(pool, 0); } + ValuePtr create_new_value() { return ValuePtr(new VDate(0)); } public: MDate(Pool& pool); @@ -25,15 +25,33 @@ public: // Methoded bool used_directly() { return true; } }; +// helpers + +Table date_calendar_table_template; +/* + // date_calendar_table_template + { + Array *columns=NEW Array(pool); + for(int i=0; i<=6; i++) { + char *column=(char *)pool.malloc(MAX_NUMBER); + snprintf(column, MAX_NUMBER, "%d", i); + *columns+=NEW String(pool, column); // .i column name + } + *columns+=NEW String(pool, DATE_CALENDAR_WEEKNO_NAME); + *columns+=NEW String(pool, DATE_CALENDAR_WEEKYEAR_NAME); + date_calendar_table_template=NEW Table(pool, 0, columns); + } +*/ + // methods -static void _now(Request& r, const String& method_name, MethodParams *params) { +static void _now(Request& r, StringPtr method_name, MethodParams& params) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.get_self()); time_t t=time(0); - if(params->size()==1) // ^now(offset) - t+=(time_t)round(params->as_double(0, "offset must be double", r)*SECS_PER_DAY); + if(params.count()==1) // ^now(offset) + t+=(time_t)round(params.as_double(0, "offset must be double", r)*SECS_PER_DAY); vdate->set_time(t); } @@ -53,14 +71,14 @@ time_t cstr_to_time_t(char *cstr, const char *cur=cstr; int date_delim=isdigit(cur[0])&&isdigit(cur[1])&&isdigit(cur[2])&&isdigit(cur[3])&&cur[4]==':'?':' :'-'; - const char *year=lsplit(&cur, date_delim); - const char *month=lsplit(&cur, date_delim); - const char *mday=lsplit(&cur, ' '); + const char* year=lsplit(&cur, date_delim); + const char* month=lsplit(&cur, date_delim); + const char* mday=lsplit(&cur, ' '); if(!month) cur=cstr; - const char *hour=lsplit(&cur, ':'); - const char *min=lsplit(&cur, ':'); - const char *sec=cur; + const char* hour=lsplit(&cur, ':'); + const char* min=lsplit(&cur, ':'); + const char* sec=cur; tm tmIn={0}; tmIn.tm_isdst=-1; @@ -92,32 +110,32 @@ date_part_set: return result; } -static void _create(Request& r, const String& method_name, MethodParams *params) { +static void _create(Request& r, StringPtr method_name, MethodParams& params) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.get_self()); time_t t; - if(params->size()==1) { + if(params.count()==1) { // ^create[2002-04-25 18:14:00] // ^create[18:14:00] - if(const String *sdate=params->get(0).get_string()) + if(const String *sdate=params.get(0).get_string()) t=cstr_to_time_t(sdate->cstr(), sdate); else { // ^create(float days) - t=(time_t)round(params->as_double(0, "float days must be double", r)*SECS_PER_DAY); + t=(time_t)round(params.as_double(0, "float days must be double", r)*SECS_PER_DAY); if(t<0 || !localtime(&t)) throw Exception(0, &method_name, "invalid datetime"); } - } else if(params->size()>=2) { // ^create(y;m;d[;h[;m[;s]]]) + } else if(params.count()>=2) { // ^create(y;m;d[;h[;m[;s]]]) tm tmIn={0}; tmIn.tm_isdst=-1; - tmIn.tm_year=NN_year_to_NNNN(params->as_int(0, "year must be int", r)); - tmIn.tm_mon=params->as_int(1, "month must be int", r)-1; - tmIn.tm_mday=params->size()>2?params->as_int(2, "mday must be int", r):1; - if(params->size()>3) tmIn.tm_hour=params->as_int(3, "hour must be int", r); - if(params->size()>4) tmIn.tm_min=params->as_int(4, "minutes must be int", r); - if(params->size()>5) tmIn.tm_sec=params->as_int(5, "seconds must be int", r); + tmIn.tm_year=NN_year_to_NNNN(params.as_int(0, "year must be int", r)); + tmIn.tm_mon=params.as_int(1, "month must be int", r)-1; + tmIn.tm_mday=params.count()>2?params.as_int(2, "mday must be int", r):1; + if(params.count()>3) tmIn.tm_hour=params.as_int(3, "hour must be int", r); + if(params.count()>4) tmIn.tm_min=params.as_int(4, "minutes must be int", r); + if(params.count()>5) tmIn.tm_sec=params.as_int(5, "seconds must be int", r); t=mktime(&tmIn); if(t<0) throw Exception(0, @@ -130,7 +148,7 @@ static void _create(Request& r, const St vdate->set_time(t); } -static void _sql_string(Request& r, const String& method_name, MethodParams *) { +static void _sql_string(Request& r, StringPtr method_name, MethodParams& ) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.get_self()); int size=1+ 4+1+2+1+2 +1+ 2+1+2+1+2 +1 +1; @@ -146,11 +164,11 @@ static void _sql_string(Request& r, cons } -static void _roll(Request& r, const String& method_name, MethodParams *params) { +static void _roll(Request& r, StringPtr method_name, MethodParams& params) { Pool& pool=r.pool(); VDate *vdate=static_cast(r.get_self()); - const String& what=params->as_string(0, "'what' must be string"); + const String& what=params.as_string(0, "'what' must be string"); int oyear=0; int omonth=0; int oday=0; @@ -163,7 +181,7 @@ static void _roll(Request& r, const Stri &what, "must be year|month|day"); - *offset=params->as_int(1, "offset must be int", r); + *offset=params.as_int(1, "offset must be int", r); time_t self_time=vdate->get_time(); tm tmIn=*localtime(&self_time); @@ -214,12 +232,12 @@ static void _roll(Request& r, const Stri } static Table *fill_month_days(Request& r, - const String& method_name, MethodParams *params, bool rus){ + StringPtr method_name, MethodParams& params, bool rus){ Pool& pool=r.pool(); Table *result=new(pool) Table(pool, *date_calendar_table_template); - int year=params->as_int(1, "year must be int", r); - int month=max(1, min(params->as_int(2, "month must be int", r), 12)) -1; + int year=params.as_int(1, "year must be int", r); + int month=max(1, min(params.as_int(2, "month must be int", r), 12)) -1; tm tmIn={0, 0, 0, 1, month, year-1900}; time_t t=mktime(&tmIn); @@ -288,7 +306,7 @@ static Table *fill_month_days(Request& r } static Table *fill_week_days(Request& r, - const String& method_name, MethodParams *params, bool rus){ + StringPtr method_name, MethodParams& params, bool rus){ Pool& pool=r.pool(); Array& columns=*new(pool) Array(pool, 4); columns+=new(pool) String(pool, "year"); @@ -297,9 +315,9 @@ static Table *fill_week_days(Request& r, columns+=new(pool) String(pool, "weekday"); Table *result=new(pool) Table(pool, &method_name, &columns); - int year=params->as_int(1, "year must be int", r); - int month=max(1, min(params->as_int(2, "month must be int", r), 12)) -1; - int day=params->as_int(3, "day must be int", r); + int year=params.as_int(1, "year must be int", r); + int month=max(1, min(params.as_int(2, "month must be int", r), 12)) -1; + int day=params.as_int(3, "day must be int", r); tm tmIn={0, 0, 18, day, month, year-1900}; time_t t=mktime(&tmIn); @@ -336,10 +354,10 @@ static Table *fill_week_days(Request& r, return result; } -static void _calendar(Request& r, const String& method_name, MethodParams *params) { +static void _calendar(Request& r, StringPtr method_name, MethodParams& params) { Pool& pool=r.pool(); - const String& what=params->as_string(0, "format must be strig"); + const String& what=params.as_string(0, "format must be strig"); bool rus=false; if(what=="rus") rus=true; @@ -351,7 +369,7 @@ static void _calendar(Request& r, const "must be rus|eng"); Table *table; - if(params->size()==1+2) + if(params.count()==1+2) table=fill_month_days(r, method_name, params, rus); else // 1+3 table=fill_week_days(r, method_name, params, rus);