summaryrefslogtreecommitdiffabout
path: root/lib/fields.cc
Unidiff
Diffstat (limited to 'lib/fields.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/fields.cc59
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}