Diff for /parser3/src/classes/string.C between versions 1.136 and 1.142

version 1.136, 2004/03/01 08:54:16 version 1.142, 2005/06/06 08:45:11
Line 104  static void _double(Request& r, MethodPa Line 104  static void _double(Request& r, MethodPa
 }  }
   
 static void _left(Request& r, MethodParams& params) {  static void _left(Request& r, MethodParams& params) {
         size_t n=(size_t)params.as_int(0, "n must be int", r);          ssize_t sn=params.as_int(0, "n must be int", r);
                   if(sn<0)
                   throw Exception("parser.runtime",
                           0, 
                           "n(%d) must be >=0", sn);
           size_t n=(size_t)sn;
   
         const String& string=GET_SELF(r, VString).string();          const String& string=GET_SELF(r, VString).string();
         r.write_assign_lang(string.mid(0, n));          r.write_assign_lang(string.mid(0, n));
 }  }
   
 static void _right(Request& r, MethodParams& params) {  static void _right(Request& r, MethodParams& params) {
         size_t n=(size_t)params.as_int(0, "n must be int", r);          ssize_t sn=(size_t)params.as_int(0, "n must be int", r);
           if(sn<0)
                   throw Exception("parser.runtime",
                           0, 
                           "n(%d) must be >=0", sn);
           size_t n=(size_t)sn;
           
                   
         const String& string=GET_SELF(r, VString).string();          const String& string=GET_SELF(r, VString).string();
         size_t length=string.length();          size_t length=string.length();
Line 121  static void _right(Request& r, MethodPar Line 132  static void _right(Request& r, MethodPar
 static void _mid(Request& r, MethodParams& params) {  static void _mid(Request& r, MethodParams& params) {
         const String& string=GET_SELF(r, VString).string();          const String& string=GET_SELF(r, VString).string();
   
         size_t p=(size_t)max(0, params.as_int(0, "p must be int", r));          ssize_t sbegin=params.as_int(0, "p must be int", r);
         size_t n=params.count()>1?          if(sbegin<0)
                 (size_t)max(0, params.as_int(1, "n must be int", r)):string.length();                  throw Exception("parser.runtime",
                           0, 
                           "p(%d) must be >=0", sbegin);
           size_t begin=(size_t)sbegin;
   
           size_t end;
           if(params.count()>1) {
                   ssize_t sn=params.as_int(1, "n must be int", r);
                   if(sn<0)
                           throw Exception("parser.runtime",
                                   0, 
                                   "n(%d) must be >=0", sn);
                   end=begin+(size_t)sn;
           } else 
                   end=string.length();
                   
         r.write_assign_lang(string.mid(p, p+n));          r.write_assign_lang(string.mid(begin, end));
 }  }
   
 static void _pos(Request& r, MethodParams& params) {  static void _pos(Request& r, MethodParams& params) {
Line 390  public: Line 415  public:
         }          }
 };  };
 #endif  #endif
   extern String sql_bind_name;
 extern String sql_limit_name;  extern String sql_limit_name;
 extern String sql_offset_name;  extern String sql_offset_name;
 extern String sql_default_name;  extern String sql_default_name;
 extern String sql_distinct_name;  extern String sql_distinct_name;
   extern int marshal_binds(HashStringValue& hash, SQL_Driver::Placeholder*& placeholders);
   extern void unmarshal_bind_updates(HashStringValue& hash, int placeholder_count, SQL_Driver::Placeholder* placeholders);
   
 const String* sql_result_string(Request& r, MethodParams& params,  const String* sql_result_string(Request& r, MethodParams& params,
                                 HashStringValue*& options, Value*& default_code) {                                  HashStringValue*& options, Value*& default_code) {
         Value& statement=params.as_junction(0, "statement must be code");          Value& statement=params.as_junction(0, "statement must be code");
   
           HashStringValue* bind=0;
         ulong limit=0;          ulong limit=0;
         ulong offset=0;          ulong offset=0;
         default_code=0;          default_code=0;
Line 405  const String* sql_result_string(Request& Line 435  const String* sql_result_string(Request&
                 Value& voptions=params.as_no_junction(1, "options must be hash, not code");                  Value& voptions=params.as_no_junction(1, "options must be hash, not code");
                 if(!voptions.is_string())                  if(!voptions.is_string())
                         if((options=voptions.get_hash())) {                          if((options=voptions.get_hash())) {
                                 if(Value* vlimit=options->get(sql_limit_name))                                  int valid_options=0;
                                   if(Value* vbind=options->get(sql_bind_name)) {
                                           valid_options++;
                                           bind=vbind->get_hash();
                                   }
                                   if(Value* vlimit=options->get(sql_limit_name)) {
                                           valid_options++;
                                         limit=(ulong)r.process_to_value(*vlimit).as_double();                                          limit=(ulong)r.process_to_value(*vlimit).as_double();
                                 if(Value* voffset=options->get(sql_offset_name))                                  }
                                   if(Value* voffset=options->get(sql_offset_name)) {
                                           valid_options++;
                                         offset=(ulong)r.process_to_value(*voffset).as_double();                                          offset=(ulong)r.process_to_value(*voffset).as_double();
                                   }
                                 if((default_code=options->get(sql_default_name))) {                                  if((default_code=options->get(sql_default_name))) {
                                           valid_options++;
                                         if(!default_code->get_junction())                                          if(!default_code->get_junction())
                                                 throw Exception("parser.runtime",                                                  throw Exception("parser.runtime",
                                                         0,                                                          0,
                                                         "default option must be code");                                                          "default option must be code");
                                 }                                  }
                                   if(valid_options!=options->count())
                                           throw Exception("parser.runtime",
                                                   0,
                                                   "called with invalid option");
                         } else                          } else
                                 throw Exception("parser.runtime",                                  throw Exception("parser.runtime",
                                         0,                                          0,
Line 422  const String* sql_result_string(Request& Line 466  const String* sql_result_string(Request&
         } else          } else
                 options=0;                  options=0;
   
           SQL_Driver::Placeholder* placeholders=0;
           uint placeholders_count=0;
           if(bind)
                   placeholders_count=marshal_binds(*bind, placeholders);
   
         Temp_lang temp_lang(r, String::L_SQL);          Temp_lang temp_lang(r, String::L_SQL);
         const String& statement_string=r.process_to_string(statement);          const String& statement_string=r.process_to_string(statement);
         const char* statement_cstr=          const char* statement_cstr=
                 statement_string.cstr(String::L_UNSPECIFIED, r.connection());                  statement_string.cstr(String::L_UNSPECIFIED, r.connection());
         String_sql_event_handlers handlers(statement_string, statement_cstr);          String_sql_event_handlers handlers(statement_string, statement_cstr);
         r.connection()->query(          r.connection()->query(
                 statement_cstr, offset, limit,                   statement_cstr, 
                   placeholders_count, placeholders,
                   offset, limit, 
                 handlers,                  handlers,
                 statement_string);                  statement_string);
                   
           if(bind)
                   unmarshal_bind_updates(*bind, placeholders_count, placeholders);
   
         if(!handlers.got_cell)          if(!handlers.got_cell)
                 return 0; // no lines, caller should return second param[default value]                  return 0; // no lines, caller should return second param[default value]
   
Line 505  static void _trim(Request& r, MethodPara Line 559  static void _trim(Request& r, MethodPara
         if(params.count()>0) {          if(params.count()>0) {
                 const String& skind=params.as_string(0,                   const String& skind=params.as_string(0, 
                         "'where' must be string");                          "'where' must be string");
                 if(skind==TRIM_START_OPTION)                  if(skind.length())
                         kind=String::TRIM_START;                          if(skind==TRIM_START_OPTION)
                 else if(skind==TRIM_END_OPTION)                                  kind=String::TRIM_START;
                         kind=String::TRIM_END;                          else if(skind==TRIM_END_OPTION)
                 else if(skind==TRIM_BOTH_OPTION)                                  kind=String::TRIM_END;
                         kind=String::TRIM_BOTH;                          else if(skind==TRIM_BOTH_OPTION)
                 else                                  kind=String::TRIM_BOTH;
                         throw Exception("parser.runtime",                          else
                                 &skind,                                  throw Exception("parser.runtime",
                                 "'kind' should be one of "TRIM_START_OPTION", "TRIM_BOTH_OPTION", "TRIM_END_OPTION);                                          &skind,
                                           "'kind' must be one of "TRIM_START_OPTION", "TRIM_BOTH_OPTION", "TRIM_END_OPTION);
   
                 if(params.count()>1) {                  if(params.count()>1) {
                         const String& schars=params.as_string(1, "'chars' must be string");                          const String& schars=params.as_string(1, "'chars' must be string");
                         if(!schars.length())                          if(schars.length())
                                 throw Exception("parser.runtime",                                  chars=schars.cstr();
                                         0,  
                                         "'chars' must not be empty");  
                         chars=schars.cstr();  
                 }                  }
         }          }
   
         r.write_assign_lang(src.trim(kind, chars));          r.write_assign_lang(src.trim(kind, chars));
 }  }
   
   static void _append(Request& r, MethodParams& params) {
           // c=a+b
           VString& va=GET_SELF(r, VString);
           const String& a=va.string();
           const String& b=params.as_string(0, "parameter must be string");
           String& c=*new String(a);
           c.append(b, String::L_PASS_APPENDED);
           va.set_string(c);
   }
   
 // constructor  // constructor
   
 MString::MString(): Methoded("string") {  MString::MString(): Methoded("string") {
Line 574  MString::MString(): Methoded("string") { Line 636  MString::MString(): Methoded("string") {
         add_native_method("lower", Method::CT_DYNAMIC, _lower, 0, 0);          add_native_method("lower", Method::CT_DYNAMIC, _lower, 0, 0);
   
         // ^sql[query]          // ^sql[query]
         // ^sql[query][$.limit(1) $.offset(2) $.default[n/a]]          // ^sql[query][options hash]
         add_native_method("sql", Method::CT_STATIC, _sql, 1, 2);          add_native_method("sql", Method::CT_STATIC, _sql, 1, 2);
   
         // ^string.replace[table]          // ^string.replace[table]
Line 588  MString::MString(): Methoded("string") { Line 650  MString::MString(): Methoded("string") {
   
         // ^string.trim[[start|both|end][;chars]]          // ^string.trim[[start|both|end][;chars]]
         add_native_method("trim", Method::CT_DYNAMIC, _trim, 0, 2);          add_native_method("trim", Method::CT_DYNAMIC, _trim, 0, 2);
   
           // ^string.append[string]
           add_native_method("append", Method::CT_DYNAMIC, _append, 1, 1);
 }         }       

Removed from v.1.136  
changed lines
  Added in v.1.142


E-mail: