dbms: Server: HTTP handler: made GET readonly; fixed error in SET query [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2013-02-16 13:48:25 +00:00
parent 743108b25e
commit fb0f651db4
3 changed files with 10 additions and 5 deletions

View File

@ -76,7 +76,7 @@ private:
Context * global_context; /// Глобальный контекст или NULL, если его нет. (Возможно, равен this.)
public:
Context() : shared(new ContextShared) {}
Context() : shared(new ContextShared), session_context(NULL), global_context(NULL) {}
String getPath() const;
void setPath(const String & path);

View File

@ -40,11 +40,12 @@ struct HTMLForm : public Poco::Net::HTMLForm
};
void HTTPHandler::processQuery(Poco::Net::NameValueCollection & params, Poco::Net::HTTPServerResponse & response, std::istream & istr)
void HTTPHandler::processQuery(Poco::Net::NameValueCollection & params, Poco::Net::HTTPServerResponse & response, std::istream & istr, bool readonly)
{
BlockInputStreamPtr query_plan;
/** Часть запроса может быть передана в параметре query, а часть - POST-ом.
/** Часть запроса может быть передана в параметре query, а часть - POST-ом
* (точнее - в теле запроса, а метод не обязательно должен быть POST).
* В таком случае, считается, что запрос - параметр query, затем перевод строки, а затем - данные POST-а.
*/
std::string query_param = params.get("query", "");
@ -89,6 +90,9 @@ void HTTPHandler::processQuery(Poco::Net::NameValueCollection & params, Poco::Ne
if (params.has("database"))
context.setCurrentDatabase(params.get("database"));
if (readonly)
new_settings.limits.readonly = true;
context.setSettings(new_settings);
Stopwatch watch;
@ -137,7 +141,8 @@ void HTTPHandler::handleRequest(Poco::Net::HTTPServerRequest & request, Poco::Ne
HTMLForm params(request);
std::istream & istr = request.stream();
processQuery(params, response, istr);
bool readonly = request.getMethod() == Poco::Net::HTTPServerRequest::HTTP_GET;
processQuery(params, response, istr, readonly);
LOG_INFO(log, "Done processing query");
}

View File

@ -24,7 +24,7 @@ private:
Logger * log;
void processQuery(Poco::Net::NameValueCollection & params, Poco::Net::HTTPServerResponse & response, std::istream & istr);
void processQuery(Poco::Net::NameValueCollection & params, Poco::Net::HTTPServerResponse & response, std::istream & istr, bool readonly);
};
}