]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/mgr/QueryParams.cc
2 * DEBUG: section 16 Cache Manager API
7 #include "base/TextException.h"
8 #include "ipc/TypedMsgHdr.h"
9 #include "mgr/IntParam.h"
10 #include "mgr/QueryParams.h"
11 #include "mgr/StringParam.h"
13 Mgr::QueryParam::Pointer
14 Mgr::QueryParams::get(const String
& name
) const
16 Must(name
.size() != 0);
17 Params::const_iterator pos
= find(name
);
18 return (pos
== params
.end() ? NULL
: pos
->second
);
22 Mgr::QueryParams::pack(Ipc::TypedMsgHdr
& msg
) const
24 msg
.putInt(params
.size());
25 for (Params::const_iterator iter
= params
.begin(); iter
!= params
.end(); ++iter
) {
26 Must(iter
->first
.size() != 0);
27 msg
.putString(iter
->first
);
28 Must(iter
->second
!= NULL
);
29 iter
->second
->pack(msg
);
34 Mgr::QueryParams::unpack(const Ipc::TypedMsgHdr
& msg
)
36 int count
= msg
.getInt();
39 for ( ; count
> 0; --count
) {
42 Must(name
.size() != 0);
43 QueryParam::Type type
;
45 QueryParam::Pointer value
= CreateParam(type
);
46 value
->unpackValue(msg
);
47 params
.push_back(Param(name
, value
));
51 Mgr::QueryParams::Params::const_iterator
52 Mgr::QueryParams::find(const String
& name
) const
54 Must(name
.size() != 0);
55 Params::const_iterator iter
= params
.begin();
56 for ( ; iter
!= params
.end(); ++iter
) {
57 if (name
.caseCmp(iter
->first
) == 0)
64 Mgr::QueryParams::ParseParam(const String
& paramStr
, Param
& param
)
69 regcomp(&intExpr
, "^([a-z][a-z0-9_]*)=([0-9]+((,[0-9]+))*)$", REG_EXTENDED
| REG_ICASE
);
71 regcomp(&stringExpr
, "^([a-z][a-z0-9_]*)=([^&= ]+)$", REG_EXTENDED
| REG_ICASE
);
72 if (regexec(&intExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
73 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
74 std::vector
<int> array
;
75 int n
= pmatch
[2].rm_so
;
76 for (int i
= n
; i
< pmatch
[2].rm_eo
; ++i
) {
77 if (paramStr
[i
] == ',') {
78 array
.push_back(atoi(paramStr
.substr(n
, i
).termedBuf()));
82 if (n
< pmatch
[2].rm_eo
)
83 array
.push_back(atoi(paramStr
.substr(n
, pmatch
[2].rm_eo
).termedBuf()));
84 param
.second
= new IntParam(array
);
86 } else if (regexec(&stringExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
87 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
88 param
.second
= new StringParam(paramStr
.substr(pmatch
[2].rm_so
, pmatch
[2].rm_eo
));
97 Mgr::QueryParams::Parse(const String
& aParamsStr
, QueryParams
& aParams
)
99 if (aParamsStr
.size() != 0) {
102 size_t len
= aParamsStr
.size();
103 for (size_t i
= n
; i
< len
; ++i
) {
104 if (aParamsStr
[i
] == '&') {
105 if (!ParseParam(aParamsStr
.substr(n
, i
), param
))
107 aParams
.params
.push_back(param
);
112 if (!ParseParam(aParamsStr
.substr(n
, len
), param
))
114 aParams
.params
.push_back(param
);
120 Mgr::QueryParam::Pointer
121 Mgr::QueryParams::CreateParam(QueryParam::Type aType
)
124 case QueryParam::ptInt
:
125 return new IntParam();
127 case QueryParam::ptString
:
128 return new StringParam();
131 throw TexcHere("unknown parameter type");