]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/mgr/QueryParams.cc
4 * DEBUG: section 16 Cache Manager API
9 #include "base/TextException.h"
10 #include "ipc/TypedMsgHdr.h"
11 #include "mgr/IntParam.h"
12 #include "mgr/StringParam.h"
13 #include "mgr/QueryParams.h"
16 Mgr::QueryParam::Pointer
17 Mgr::QueryParams::get(const String
& name
) const
19 Must(name
.size() != 0);
20 Params::const_iterator pos
= find(name
);
21 return (pos
== params
.end() ? NULL
: pos
->second
);
25 Mgr::QueryParams::pack(Ipc::TypedMsgHdr
& msg
) const
27 msg
.putInt(params
.size());
28 for (Params::const_iterator iter
= params
.begin(); iter
!= params
.end(); ++iter
) {
29 Must(iter
->first
.size() != 0);
30 msg
.putString(iter
->first
);
31 Must(iter
->second
!= NULL
);
32 iter
->second
->pack(msg
);
37 Mgr::QueryParams::unpack(const Ipc::TypedMsgHdr
& msg
)
39 int count
= msg
.getInt();
42 for ( ; count
> 0; --count
) {
45 Must(name
.size() != 0);
46 QueryParam::Type type
;
48 QueryParam::Pointer value
= CreateParam(type
);
49 value
->unpackValue(msg
);
50 params
.push_back(Param(name
, value
));
54 Mgr::QueryParams::Params::const_iterator
55 Mgr::QueryParams::find(const String
& name
) const
57 Must(name
.size() != 0);
58 Params::const_iterator iter
= params
.begin();
59 for ( ; iter
!= params
.end(); ++iter
) {
60 if (name
.caseCmp(iter
->first
) == 0)
67 Mgr::QueryParams::ParseParam(const String
& paramStr
, Param
& param
)
72 regcomp(&intExpr
, "^([a-z][a-z0-9_]*)=([0-9]+((,[0-9]+))*)$", REG_EXTENDED
| REG_ICASE
);
74 regcomp(&stringExpr
, "^([a-z][a-z0-9_]*)=([^&= ]+)$", REG_EXTENDED
| REG_ICASE
);
75 if (regexec(&intExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
76 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
77 std::vector
<int> array
;
78 int n
= pmatch
[2].rm_so
;
79 for (int i
= n
; i
< pmatch
[2].rm_eo
; ++i
) {
80 if (paramStr
[i
] == ',') {
81 array
.push_back(atoi(paramStr
.substr(n
, i
).termedBuf()));
85 if (n
< pmatch
[2].rm_eo
)
86 array
.push_back(atoi(paramStr
.substr(n
, pmatch
[2].rm_eo
).termedBuf()));
87 param
.second
= new IntParam(array
);
89 } else if (regexec(&stringExpr
, paramStr
.termedBuf(), 3, pmatch
, 0) == 0) {
90 param
.first
= paramStr
.substr(pmatch
[1].rm_so
, pmatch
[1].rm_eo
);
91 param
.second
= new StringParam(paramStr
.substr(pmatch
[2].rm_so
, pmatch
[2].rm_eo
));
100 Mgr::QueryParams::Parse(const String
& aParamsStr
, QueryParams
& aParams
)
102 if (aParamsStr
.size() != 0) {
105 size_t len
= aParamsStr
.size();
106 for (size_t i
= n
; i
< len
; ++i
) {
107 if (aParamsStr
[i
] == '&') {
108 if (!ParseParam(aParamsStr
.substr(n
, i
), param
))
110 aParams
.params
.push_back(param
);
115 if (!ParseParam(aParamsStr
.substr(n
, len
), param
))
117 aParams
.params
.push_back(param
);
123 Mgr::QueryParam::Pointer
124 Mgr::QueryParams::CreateParam(QueryParam::Type aType
)
127 case QueryParam::ptInt
:
128 return new IntParam();
130 case QueryParam::ptString
:
131 return new StringParam();
134 throw TexcHere("unknown parameter type");