--- parser3/src/classes/table.C 2001/08/07 13:54:13 1.100 +++ parser3/src/classes/table.C 2001/08/24 06:26:13 1.106 @@ -5,19 +5,15 @@ Author: Alexander Petrosyan (http://design.ru/paf) */ -static const char *RCSId="$Id: table.C,v 1.100 2001/08/07 13:54:13 parser Exp $"; - -#include "pa_config_includes.h" - -#include "pcre.h" +static const char *RCSId="$Id: table.C,v 1.106 2001/08/24 06:26:13 parser Exp $"; #include "classes.h" +#include "pa_config_includes.h" #include "pa_common.h" #include "pa_request.h" #include "pa_vtable.h" #include "pa_vint.h" #include "pa_sql_connection.h" -#include "pa_dir.h" #include "pa_vbool.h" // defines @@ -156,7 +152,7 @@ static Table *fill_month_days(Request& r for(int wday=0; wday<7; wday++, _day++) { String *cell=new(pool) String(pool); if(_day>=1 && _day<=monthDays) { - char *buf=(char *)malloc(2+1); + char *buf=(char *)pool.malloc(2+1); cell->APPEND_CLEAN(buf, sprintf(buf, "%02d", _day), method_name.origin().file, method_name.origin().line); } @@ -200,7 +196,7 @@ static Table *fill_week_days(Request& r, tm *tmOut=localtime(&t); Array& row=*new(pool) Array(pool, 4); #define WDFILL(size, value) { \ - char *buf=(char *)malloc(size+1); \ + char *buf=(char *)pool.malloc(size+1); \ String *cell=new(pool) String(pool); \ cell->APPEND_CLEAN(buf, sprintf(buf, "%0"#size"d", value), \ method_name.origin().file, \ @@ -265,7 +261,7 @@ static void _save(Request& r, const Stri } else { // nameless table if(int lsize=table.size()?static_cast(table.get(0))->size():0) for(int column=0; columnas_junction(0, "key-maker must be code"); - bool reverse=params->size()==2/*..[asc|desc]*/? + bool reverse=params->size()==2/*..[desc|asc|]*/? reverse=params->as_no_junction(1, "order must not be code").as_string()=="desc": - false; - - Table& table=static_cast(r.self)->table(); + false; // default=asc - // anything to sort? - if(!table.size()) - return; + Table& old_table=static_cast(r.self)->table(); + Table& new_table=*new(pool) Table(pool, &method_name, old_table.columns()); - Table_seq_item *seq=(Table_seq_item *)malloc(sizeof(Table_seq_item)*table.size()); + Table_seq_item *seq=(Table_seq_item *)pool.malloc(sizeof(Table_seq_item)*old_table.size()); int i; // calculate key values bool key_values_are_strings=true; - for(i=0; i(r.self)->set_table(*result); } -static void _dir(Request& r, const String& method_name, MethodParams *params) { - Pool& pool=r.pool(); - - Value& relative_path=params->as_no_junction(0, "path must not be code"); - - const String *regexp; - pcre *regexp_code; - int ovecsize; - int *ovector; - if(params->size()>1) { - regexp=¶ms->as_no_junction(1, "regexp must not be code").as_string(); - - const char *pattern=regexp->cstr(String::UL_AS_IS); - const char *errptr; - int erroffset; - regexp_code=pcre_compile(pattern, PCRE_EXTRA | PCRE_DOTALL, - &errptr, &erroffset, - r.pcre_tables); - - if(!regexp_code) - PTHROW(0, 0, - ®exp->mid(erroffset, regexp->size()), - "regular expression syntax error - %s", errptr); - - ovector=(int *)malloc(sizeof(int)*(ovecsize=(1/*match*/)*3)); - } else - regexp_code=0; - - - const char* absolute_path_cstr=r.absolute(relative_path.as_string()) - .cstr(String::UL_FILE_NAME); - - Array& columns=*new(pool) Array(pool); - columns+=new(pool) String(pool, "name"); - Table& table=*new(pool) Table(pool, &method_name, &columns); - - LOAD_DIR(absolute_path_cstr, - size_t file_name_size=strlen(ffblk.ff_name); - bool suits=true; - if(regexp_code) { - int exec_result=pcre_exec(regexp_code, 0, - ffblk.ff_name, file_name_size, 0, - 0, ovector, ovecsize); - - if(exec_result==PCRE_ERROR_NOMATCH) - suits=false; - else if(exec_result<0) { - (*pcre_free)(regexp_code); - PTHROW(0, 0, - regexp, - "regular expression execute (%d)", - exec_result); - } - } - - if(suits) { - char *file_name_cstr=(char *)r.malloc(file_name_size); - memcpy(file_name_cstr, ffblk.ff_name, file_name_size); - String &file_name=*new(pool) String(pool); - file_name.APPEND(file_name_cstr, file_name_size, String::UL_FILE_NAME, - method_name.origin().file, method_name.origin().line); - - Array& row=*new(pool) Array(pool); - row+=&file_name; - table+=&row; - } - ); - - if(regexp_code) - (*pcre_free)(regexp_code); - - // replace any previous table value - static_cast(r.self)->set_table(table); -} - static void _columns(Request& r, const String& method_name, MethodParams *) { Pool& pool=r.pool(); @@ -798,8 +720,8 @@ MTable::MTable(Pool& apool) : Methoded(a // ^table:hash[key field name][value field name;...] add_native_method("hash", Method::CT_DYNAMIC, _hash, 1, 1000); - // ^table.sort{string-key-maker} ^table.sort{string-key-maker}[asc|desc] - // ^table.sort(numeric-key-maker) ^table.sort(numeric-key-maker)[asc|desc] + // ^table.sort{string-key-maker} ^table.sort{string-key-maker}[desc|asc] + // ^table.sort(numeric-key-maker) ^table.sort(numeric-key-maker)[desc|asc] add_native_method("sort", Method::CT_DYNAMIC, _sort, 1, 2); // ^table.locate[field;value] @@ -819,10 +741,6 @@ MTable::MTable(Pool& apool) : Methoded(a // ^table:sql[query][$.limit(1) $.offset(2)] add_native_method("sql", Method::CT_DYNAMIC, _sql, 1, 2); - // ^table:dir[path] - // ^table:dir[path][regexp] - add_native_method("dir", Method::CT_DYNAMIC, _dir, 1, 2); - // ^table:columns[] add_native_method("columns", Method::CT_DYNAMIC, _columns, 0, 0); }