-rw-r--r-- | lib/fields.cc | 59 |
1 files changed, 54 insertions, 5 deletions
diff --git a/lib/fields.cc b/lib/fields.cc index d494098..916b603 100644 --- a/lib/fields.cc +++ b/lib/fields.cc | |||
@@ -43,12 +43,16 @@ namespace opkele { | |||
43 | } | 43 | } |
44 | __om_query_builder(const char *p,string& r,const basic_fields& m,const string& u) | 44 | __om_query_builder(const char *p,string& r,const basic_fields& m,const string& u) |
45 | : om(m), first(true), rv(r), pfx(p) { | 45 | : om(m), first(true), rv(r), pfx(p) { |
46 | basic_fields::fields_iterator i=om.fields_begin(), | ||
47 | ie=om.fields_end(); | ||
46 | rv = u; | 48 | rv = u; |
47 | if(rv.find('?')==string::npos) | 49 | if(i!=ie) { |
48 | rv += '?'; | 50 | if(rv.find('?')==string::npos) |
49 | else | 51 | rv += '?'; |
50 | first = false; | 52 | else |
51 | for_each(om.fields_begin(),om.fields_end(),*this); | 53 | first = false; |
54 | for_each(i,ie,*this); | ||
55 | } | ||
52 | } | 56 | } |
53 | 57 | ||
54 | result_type operator()(argument_type f) { | 58 | result_type operator()(argument_type f) { |
@@ -82,5 +86,50 @@ namespace opkele { | |||
82 | throw not_implemented(OPKELE_CP_ "reset_field() not implemented"); | 86 | throw not_implemented(OPKELE_CP_ "reset_field() not implemented"); |
83 | } | 87 | } |
84 | 88 | ||
89 | void basic_fields::from_query(const string& qs) { | ||
90 | for(string::size_type p=0,np;;p=np+1) { | ||
91 | np = qs.find('&',p); | ||
92 | string::size_type eq = qs.find('=',p); | ||
93 | if(eq==string::npos) break; | ||
94 | if(np==string::npos) { | ||
95 | set_field( | ||
96 | util::url_decode(qs.substr(p,eq-p)), | ||
97 | util::url_decode(qs.substr(eq+1)) ); | ||
98 | break; | ||
99 | }else if(eq<np) { | ||
100 | set_field( | ||
101 | util::url_decode(qs.substr(p,eq-p)), | ||
102 | util::url_decode(qs.substr(eq+1,np-eq-1)) ); | ||
103 | } | ||
104 | } | ||
105 | } | ||
106 | |||
107 | |||
108 | bool fields_t::has_field(const string& n) const { | ||
109 | return find(n)!=end(); | ||
110 | } | ||
111 | const string& fields_t::get_field(const string& n) const { | ||
112 | const_iterator i=find(n); | ||
113 | if(i==end()) | ||
114 | throw failed_lookup(OPKELE_CP_ n+": no such field"); | ||
115 | return i->second; | ||
116 | } | ||
117 | |||
118 | fields_t::fields_iterator fields_t::fields_begin() const { | ||
119 | return util::map_keys_iterator<const_iterator,string,const string&,const string*>(begin(),end()); | ||
120 | } | ||
121 | fields_t::fields_iterator fields_t::fields_end() const { | ||
122 | return util::map_keys_iterator<const_iterator,string,const string&,const string*>(end(),end()); | ||
123 | } | ||
124 | |||
125 | void fields_t::reset_fields() { | ||
126 | clear(); | ||
127 | } | ||
128 | void fields_t::set_field(const string& n,const string& v) { | ||
129 | (*this)[n]=v; | ||
130 | } | ||
131 | void fields_t::reset_field(const string& n) { | ||
132 | erase(n); | ||
133 | } | ||
85 | 134 | ||
86 | } | 135 | } |