From e7ca744da0373f385d17f7521520cd15e8974674 Mon Sep 17 00:00:00 2001 From: Dario Date: Thu, 26 Sep 2019 11:26:24 +0200 Subject: [PATCH] remove curl --- .gitmodules | 6 +- dependencies/mariadb-connector-c | 1 + src/cpp/Crypto/KeyPair.cpp | 0 src/cpp/Crypto/KeyPair.h | 0 src/cpp/Crypto/Obfus_array.cpp | 0 src/cpp/Crypto/Obfus_array.h | 0 src/cpp/HTTPInterface/LoginPage.cpp | 59 ++ src/cpp/HTTPInterface/LoginPage.h | 15 + src/cpp/HTTPInterface/RegisterPage.cpp | 112 +++ src/cpp/HTTPInterface/RegisterPage.h | 15 + src/cpp/MySQL/Binder.cpp | 638 +++++++++++++++++ src/cpp/MySQL/Connector.cpp | 72 ++ src/cpp/MySQL/Extractor.cpp | 641 ++++++++++++++++++ src/cpp/MySQL/MySQLException.cpp | 138 ++++ src/cpp/MySQL/MySQLStatementImpl.cpp | 160 +++++ src/cpp/MySQL/Poco/Binder.h | 262 +++++++ src/cpp/MySQL/Poco/Connector.h | 61 ++ src/cpp/MySQL/Poco/Extractor.h | 336 +++++++++ src/cpp/MySQL/Poco/MySQL.h | 60 ++ src/cpp/MySQL/Poco/MySQLException.h | 156 +++++ src/cpp/MySQL/Poco/MySQLStatementImpl.h | 102 +++ src/cpp/MySQL/Poco/ResultMetadata.h | 67 ++ src/cpp/MySQL/Poco/SessionHandle.h | 93 +++ src/cpp/MySQL/Poco/SessionImpl.h | 230 +++++++ src/cpp/MySQL/Poco/StatementExecutor.h | 97 +++ src/cpp/MySQL/Poco/Utility.h | 79 +++ src/cpp/MySQL/ResultMetadata.cpp | 239 +++++++ src/cpp/MySQL/SessionHandle.cpp | 179 +++++ src/cpp/MySQL/SessionImpl.cpp | 277 ++++++++ src/cpp/MySQL/StatementExecutor.cpp | 148 ++++ src/cpp/MySQL/Utility.cpp | 66 ++ .../SingletonManager/ConnectionManager.cpp | 405 +++++++++++ src/cpp/SingletonManager/ConnectionManager.h | 104 +++ src/cpp/SingletonManager/ErrorManager.cpp | 46 ++ src/cpp/SingletonManager/ErrorManager.h | 42 ++ src/cpp/SingletonManager/SessionManager.cpp | 132 ++++ src/cpp/SingletonManager/SessionManager.h | 50 ++ src/cpp/model/Error.cpp | 29 + src/cpp/model/Error.h | 59 ++ src/cpp/model/ErrorList.cpp | 66 ++ src/cpp/model/ErrorList.h | 44 ++ src/cpp/model/Session.cpp | 13 + src/cpp/model/Session.h | 29 + src/cpp/model/User.cpp | 0 src/cpp/model/User.h | 0 45 files changed, 5327 insertions(+), 1 deletion(-) create mode 160000 dependencies/mariadb-connector-c create mode 100644 src/cpp/Crypto/KeyPair.cpp create mode 100644 src/cpp/Crypto/KeyPair.h create mode 100644 src/cpp/Crypto/Obfus_array.cpp create mode 100644 src/cpp/Crypto/Obfus_array.h create mode 100644 src/cpp/HTTPInterface/LoginPage.cpp create mode 100644 src/cpp/HTTPInterface/LoginPage.h create mode 100644 src/cpp/HTTPInterface/RegisterPage.cpp create mode 100644 src/cpp/HTTPInterface/RegisterPage.h create mode 100644 src/cpp/MySQL/Binder.cpp create mode 100644 src/cpp/MySQL/Connector.cpp create mode 100644 src/cpp/MySQL/Extractor.cpp create mode 100644 src/cpp/MySQL/MySQLException.cpp create mode 100644 src/cpp/MySQL/MySQLStatementImpl.cpp create mode 100644 src/cpp/MySQL/Poco/Binder.h create mode 100644 src/cpp/MySQL/Poco/Connector.h create mode 100644 src/cpp/MySQL/Poco/Extractor.h create mode 100644 src/cpp/MySQL/Poco/MySQL.h create mode 100644 src/cpp/MySQL/Poco/MySQLException.h create mode 100644 src/cpp/MySQL/Poco/MySQLStatementImpl.h create mode 100644 src/cpp/MySQL/Poco/ResultMetadata.h create mode 100644 src/cpp/MySQL/Poco/SessionHandle.h create mode 100644 src/cpp/MySQL/Poco/SessionImpl.h create mode 100644 src/cpp/MySQL/Poco/StatementExecutor.h create mode 100644 src/cpp/MySQL/Poco/Utility.h create mode 100644 src/cpp/MySQL/ResultMetadata.cpp create mode 100644 src/cpp/MySQL/SessionHandle.cpp create mode 100644 src/cpp/MySQL/SessionImpl.cpp create mode 100644 src/cpp/MySQL/StatementExecutor.cpp create mode 100644 src/cpp/MySQL/Utility.cpp create mode 100644 src/cpp/SingletonManager/ConnectionManager.cpp create mode 100644 src/cpp/SingletonManager/ConnectionManager.h create mode 100644 src/cpp/SingletonManager/ErrorManager.cpp create mode 100644 src/cpp/SingletonManager/ErrorManager.h create mode 100644 src/cpp/SingletonManager/SessionManager.cpp create mode 100644 src/cpp/SingletonManager/SessionManager.h create mode 100644 src/cpp/model/Error.cpp create mode 100644 src/cpp/model/Error.h create mode 100644 src/cpp/model/ErrorList.cpp create mode 100644 src/cpp/model/ErrorList.h create mode 100644 src/cpp/model/Session.cpp create mode 100644 src/cpp/model/Session.h create mode 100644 src/cpp/model/User.cpp create mode 100644 src/cpp/model/User.h diff --git a/.gitmodules b/.gitmodules index 86ae71f8c..b0ad8cf75 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,8 @@ url = https://github.com/jibsen/tinf.git [submodule "dependencies/iroha-ed25519"] path = dependencies/iroha-ed25519 - url = https://github.com/hyperledger/iroha-ed25519.git + url = ssh://git@***REMOVED***/~/Forks/iroha-ed25519 +[submodule "dependencies/mariadb-connector-c"] + path = dependencies/mariadb-connector-c + url = https://github.com/MariaDB/mariadb-connector-c.git + diff --git a/dependencies/mariadb-connector-c b/dependencies/mariadb-connector-c new file mode 160000 index 000000000..9ba8e32f6 --- /dev/null +++ b/dependencies/mariadb-connector-c @@ -0,0 +1 @@ +Subproject commit 9ba8e32f6d0fe449114d8eb369cf29303257b460 diff --git a/src/cpp/Crypto/KeyPair.cpp b/src/cpp/Crypto/KeyPair.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/Crypto/KeyPair.h b/src/cpp/Crypto/KeyPair.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/Crypto/Obfus_array.cpp b/src/cpp/Crypto/Obfus_array.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/Crypto/Obfus_array.h b/src/cpp/Crypto/Obfus_array.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/HTTPInterface/LoginPage.cpp b/src/cpp/HTTPInterface/LoginPage.cpp new file mode 100644 index 000000000..b454114a3 --- /dev/null +++ b/src/cpp/HTTPInterface/LoginPage.cpp @@ -0,0 +1,59 @@ +#include "LoginPage.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/Net/HTMLForm.h" +#include "Poco/DeflatingStream.h" + + +#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\login.cpsp" + + + + +void LoginPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + Poco::Net::HTMLForm form(request, request.stream()); + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: Login\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "

Login

\n"; + responseStream << "
\n"; + responseStream << "\t
\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tLogin\n"; + responseStream << "\t\t\t

Bitte gebe deine Zugangsdaten ein um dich einzuloggen.

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t\t

Du hast noch keinen Account? Dann folge dem Link um dir einen anzulegen

\n"; + responseStream << "\t\tNeuen Account anlegen\n"; + responseStream << "\t
\n"; + responseStream << "
\n"; + responseStream << "\n"; + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/LoginPage.h b/src/cpp/HTTPInterface/LoginPage.h new file mode 100644 index 000000000..d55d968f6 --- /dev/null +++ b/src/cpp/HTTPInterface/LoginPage.h @@ -0,0 +1,15 @@ +#ifndef LoginPage_INCLUDED +#define LoginPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +class LoginPage: public Poco::Net::HTTPRequestHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // LoginPage_INCLUDED diff --git a/src/cpp/HTTPInterface/RegisterPage.cpp b/src/cpp/HTTPInterface/RegisterPage.cpp new file mode 100644 index 000000000..eaa3a6eae --- /dev/null +++ b/src/cpp/HTTPInterface/RegisterPage.cpp @@ -0,0 +1,112 @@ +#include "RegisterPage.h" +#include "Poco/Net/HTTPServerRequest.h" +#include "Poco/Net/HTTPServerResponse.h" +#include "Poco/Net/HTMLForm.h" +#include "Poco/DeflatingStream.h" + + +#line 4 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp" + +#include "../SingletonManager/SessionManager.h" + + +void RegisterPage::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) +{ + response.setChunkedTransferEncoding(true); + response.setContentType("text/html"); + bool _compressResponse(request.hasToken("Accept-Encoding", "gzip")); + if (_compressResponse) response.set("Content-Encoding", "gzip"); + + Poco::Net::HTMLForm form(request, request.stream()); + std::ostream& _responseStream = response.send(); + Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); + std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; + responseStream << "\n"; +#line 7 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp" + + auto session = SessionManager::getInstance()->getNewSession(); + bool userReturned = false; + if(!form.empty()) { + userReturned = session->createUser( + form.get("register-name"), + form.get("register-email"), + form.get("register-password"), + form.get("register-key-existing") + ); + } + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "Gradido Login Server: Register\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "\n"; + responseStream << "

Einen neuen Account anlegen

\n"; + responseStream << "\n"; + responseStream << "
\n"; + responseStream << "\t
\n"; + responseStream << "\t"; +#line 42 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp" + if(!form.empty() && !userReturned) { responseStream << "\n"; + responseStream << "\t\t"; +#line 43 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp" + responseStream << ( session->getErrorsHtml() ); + responseStream << "\n"; + responseStream << "\t"; +#line 44 "I:\\Code\\C++\\Eigene_Projekte\\Gradido_LoginServer\\src\\cpsp\\register.cpsp" +} responseStream << "\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\tAccount anlegen\n"; + responseStream << "\t\t\t

Bitte gebe deine Daten um einen Account anzulegen

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

Hast du bereits schonmal ein Gradido Konto besessen?

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t\t\n"; + responseStream << "\t\t\t

\n"; + responseStream << "\t\t\t\n"; + responseStream << "\t\t
\n"; + responseStream << "\t\t\n"; + responseStream << "\t
\n"; + responseStream << "
\n"; + responseStream << "\n"; + responseStream << "\n"; + if (_compressResponse) _gzipStream.close(); +} diff --git a/src/cpp/HTTPInterface/RegisterPage.h b/src/cpp/HTTPInterface/RegisterPage.h new file mode 100644 index 000000000..21dcdd7e8 --- /dev/null +++ b/src/cpp/HTTPInterface/RegisterPage.h @@ -0,0 +1,15 @@ +#ifndef RegisterPage_INCLUDED +#define RegisterPage_INCLUDED + + +#include "Poco/Net/HTTPRequestHandler.h" + + +class RegisterPage: public Poco::Net::HTTPRequestHandler +{ +public: + void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response); +}; + + +#endif // RegisterPage_INCLUDED diff --git a/src/cpp/MySQL/Binder.cpp b/src/cpp/MySQL/Binder.cpp new file mode 100644 index 000000000..d53d33e47 --- /dev/null +++ b/src/cpp/MySQL/Binder.cpp @@ -0,0 +1,638 @@ +// +// MySQLException.cpp +// +// Library: Data/MySQL +// Package: MySQL +// Module: Binder +// +// Copyright (c) 2008, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Data/MySQL/Binder.h" + + +namespace Poco { +namespace Data { +namespace MySQL { + + +Binder::Binder() +{ +} + + +Binder::~Binder() +{ + for (std::vector::iterator it = _dates.begin(); it != _dates.end(); ++it) + { + delete *it; + *it = 0; + } +} + + +void Binder::bind(std::size_t pos, const Poco::Int8& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_TINY, &val, 0); +} + + +void Binder::bind(std::size_t pos, const Poco::UInt8& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_TINY, &val, 0, true); +} + + +void Binder::bind(std::size_t pos, const Poco::Int16& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_SHORT, &val, 0); +} + + +void Binder::bind(std::size_t pos, const Poco::UInt16& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_SHORT, &val, 0, true); +} + + +void Binder::bind(std::size_t pos, const Poco::Int32& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONG, &val, 0); +} + + +void Binder::bind(std::size_t pos, const Poco::UInt32& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONG, &val, 0, true); +} + + +void Binder::bind(std::size_t pos, const Poco::Int64& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0); +} + + +void Binder::bind(std::size_t pos, const Poco::UInt64& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONGLONG, &val, 0, true); +} + + +#ifndef POCO_LONG_IS_64_BIT + +void Binder::bind(std::size_t pos, const long& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONG, &val, 0); +} + + +void Binder::bind(std::size_t pos, const unsigned long& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_LONG, &val, 0, true); +} + +#endif // POCO_LONG_IS_64_BIT + + +void Binder::bind(std::size_t pos, const bool& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_TINY, &val, 0); +} + + +void Binder::bind(std::size_t pos, const float& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_FLOAT, &val, 0); +} + + +void Binder::bind(std::size_t pos, const double& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_DOUBLE, &val, 0); +} + + +void Binder::bind(std::size_t pos, const char& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_TINY, &val, 0); +} + + +void Binder::bind(std::size_t pos, const std::string& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_STRING, val.c_str(), static_cast(val.length())); +} + + +void Binder::bind(std::size_t pos, const Poco::Data::BLOB& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_BLOB, val.rawContent(), static_cast(val.size())); +} + + +void Binder::bind(std::size_t pos, const Poco::Data::CLOB& val, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_BLOB, val.rawContent(), static_cast(val.size())); +} + + +void Binder::bind(std::size_t pos, const DateTime& val, Direction dir) +{ + poco_assert(dir == PD_IN); + MYSQL_TIME mt = {0}; + + mt.year = val.year(); + mt.month = val.month(); + mt.day = val.day(); + mt.hour = val.hour(); + mt.minute = val.minute(); + mt.second = val.second(); + mt.second_part = val.millisecond() * 1000 + val.microsecond(); + + mt.time_type = MYSQL_TIMESTAMP_DATETIME; + + _dates.push_back(new MYSQL_TIME(mt)); + + realBind(pos, MYSQL_TYPE_DATETIME, _dates.back(), sizeof(MYSQL_TIME)); +} + + +void Binder::bind(std::size_t pos, const Date& val, Direction dir) +{ + poco_assert(dir == PD_IN); + MYSQL_TIME mt = {0}; + + mt.year = val.year(); + mt.month = val.month(); + mt.day = val.day(); + + mt.time_type = MYSQL_TIMESTAMP_DATE; + + _dates.push_back(new MYSQL_TIME(mt)); + + realBind(pos, MYSQL_TYPE_DATE, _dates.back(), sizeof(MYSQL_TIME)); +} + + +void Binder::bind(std::size_t pos, const Time& val, Direction dir) +{ + poco_assert(dir == PD_IN); + MYSQL_TIME mt = {0}; + + mt.hour = val.hour(); + mt.minute = val.minute(); + mt.second = val.second(); + + mt.time_type = MYSQL_TIMESTAMP_TIME; + + _dates.push_back(new MYSQL_TIME(mt)); + + realBind(pos, MYSQL_TYPE_TIME, _dates.back(), sizeof(MYSQL_TIME)); +} + + +void Binder::bind(std::size_t pos, const NullData&, Direction dir) +{ + poco_assert(dir == PD_IN); + realBind(pos, MYSQL_TYPE_NULL, 0, 0); +} + + +std::size_t Binder::size() const +{ + return static_cast(_bindArray.size()); +} + + +MYSQL_BIND* Binder::getBindArray() const +{ + if (_bindArray.size() == 0) + { + return 0; + } + + return const_cast(&_bindArray[0]); +} + + +/*void Binder::updateDates() +{ + for (std::size_t i = 0; i < _dates.size(); i++) + { + switch (_dates[i].mt.time_type) + { + case MYSQL_TIMESTAMP_DATE: + _dates[i].mt.year = _dates[i].link.date->year(); + _dates[i].mt.month = _dates[i].link.date->month(); + _dates[i].mt.day = _dates[i].link.date->day(); + break; + case MYSQL_TIMESTAMP_DATETIME: + _dates[i].mt.year = _dates[i].link.dateTime->year(); + _dates[i].mt.month = _dates[i].link.dateTime->month(); + _dates[i].mt.day = _dates[i].link.dateTime->day(); + _dates[i].mt.hour = _dates[i].link.dateTime->hour(); + _dates[i].mt.minute = _dates[i].link.dateTime->minute(); + _dates[i].mt.second = _dates[i].link.dateTime->second(); + _dates[i].mt.second_part = _dates[i].link.dateTime->millisecond(); + break; + case MYSQL_TIMESTAMP_TIME: + _dates[i].mt.hour = _dates[i].link.time->hour(); + _dates[i].mt.minute = _dates[i].link.time->minute(); + _dates[i].mt.second = _dates[i].link.time->second(); + break; + } + } +}*/ + +/////////////////// +// +// Private +// +//////////////////// + +void Binder::realBind(std::size_t pos, enum_field_types type, const void* buffer, int length, bool isUnsigned) +{ + if (pos >= _bindArray.size()) + { + std::size_t s = static_cast(_bindArray.size()); + _bindArray.resize(pos + 1); + + std::memset(&_bindArray[s], 0, sizeof(MYSQL_BIND) * (_bindArray.size() - s)); + } + + MYSQL_BIND b = {0}; + + b.buffer_type = type; + b.buffer = const_cast(buffer); + b.buffer_length = length; + b.is_unsigned = isUnsigned; + + _bindArray[pos] = b; +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::vector& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::deque& val, Direction dir) +{ + throw NotImplementedException(); +} + + +void Binder::bind(std::size_t pos, const std::list& val, Direction dir) +{ + throw NotImplementedException(); +} + + +} } } // namespace Poco::Data::MySQL diff --git a/src/cpp/MySQL/Connector.cpp b/src/cpp/MySQL/Connector.cpp new file mode 100644 index 000000000..5062bad04 --- /dev/null +++ b/src/cpp/MySQL/Connector.cpp @@ -0,0 +1,72 @@ +// +// MySQLException.cpp +// +// Library: Data/MySQL +// Package: MySQL +// Module: Connector +// +// Copyright (c) 2008, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Data/MySQL/Connector.h" +#include "Poco/Data/MySQL/SessionImpl.h" +#include "Poco/Data/SessionFactory.h" +#include "Poco/Exception.h" +#include + + +namespace Poco { +namespace Data { +namespace MySQL { + + +std::string Connector::KEY("mysql"); + + +Connector::Connector() +{ +} + + +Connector::~Connector() +{ +} + + +const std::string& Connector::name() const +{ + return KEY; +} + + +Poco::AutoPtr Connector::createSession(const std::string& connectionString, + std::size_t timeout) +{ + return Poco::AutoPtr(new SessionImpl(connectionString, timeout)); +} + + +void Connector::registerConnector() +{ + if (mysql_library_init(0, 0, 0) != 0) + { + throw Exception("mysql_library_init error"); + } + + Poco::Data::SessionFactory::instance().add(new Connector()); +} + + +void Connector::unregisterConnector() +{ + Poco::Data::SessionFactory::instance().remove(KEY); + mysql_library_end(); +} + + +} } } // namespace Poco::Data::MySQL + diff --git a/src/cpp/MySQL/Extractor.cpp b/src/cpp/MySQL/Extractor.cpp new file mode 100644 index 000000000..48d8cc67e --- /dev/null +++ b/src/cpp/MySQL/Extractor.cpp @@ -0,0 +1,641 @@ +// +// MySQLException.cpp +// +// Library: Data/MySQL +// Package: MySQL +// Module: Extractor +// +// Copyright (c) 2008, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Data/MySQL/Extractor.h" + +#include "Poco/Data/Date.h" +#include "Poco/Data/Time.h" + +namespace Poco { +namespace Data { +namespace MySQL { + + +Extractor::Extractor(StatementExecutor& st, ResultMetadata& md): _stmt(st), _metadata(md) +{ +} + + +Extractor::~Extractor() +{ +} + + +bool Extractor::extract(std::size_t pos, Poco::Int8& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); +} + + +bool Extractor::extract(std::size_t pos, Poco::UInt8& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_TINY, &val, true); +} + + +bool Extractor::extract(std::size_t pos, Poco::Int16& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_SHORT, &val); +} + + +bool Extractor::extract(std::size_t pos, Poco::UInt16& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_SHORT, &val, true); +} + + +bool Extractor::extract(std::size_t pos, Poco::Int32& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONG, &val); +} + + +bool Extractor::extract(std::size_t pos, Poco::UInt32& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONG, &val, true); +} + + +bool Extractor::extract(std::size_t pos, Poco::Int64& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONGLONG, &val); +} + + +bool Extractor::extract(std::size_t pos, Poco::UInt64& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONGLONG, &val, true); +} + + +#ifndef POCO_LONG_IS_64_BIT +bool Extractor::extract(std::size_t pos, long& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONG, &val); +} + + +bool Extractor::extract(std::size_t pos, unsigned long& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_LONG, &val, true); +} +#endif + + +bool Extractor::extract(std::size_t pos, bool& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); +} + + +bool Extractor::extract(std::size_t pos, float& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_FLOAT, &val); +} + + +bool Extractor::extract(std::size_t pos, double& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_DOUBLE, &val); +} + + +bool Extractor::extract(std::size_t pos, char& val) +{ + return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); +} + + +bool Extractor::extract(std::size_t pos, std::string& val) +{ + if (_metadata.columnsReturned() <= pos) + throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); + + if (_metadata.isNull(static_cast(pos))) + return false; + + //mysql reports TEXT types as FDT_BLOB when being extracted + MetaColumn::ColumnDataType columnType = _metadata.metaColumn(static_cast(pos)).type(); + if (columnType != Poco::Data::MetaColumn::FDT_STRING && columnType != Poco::Data::MetaColumn::FDT_BLOB) + throw MySQLException("Extractor: not a string"); + + val.assign(reinterpret_cast(_metadata.rawData(pos)), _metadata.length(pos)); + return true; +} + + +bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val) +{ + if (_metadata.columnsReturned() <= pos) + throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); + + if (_metadata.isNull(static_cast(pos))) + return false; + + if (_metadata.metaColumn(static_cast(pos)).type() != Poco::Data::MetaColumn::FDT_BLOB) + throw MySQLException("Extractor: not a blob"); + + val.assignRaw(_metadata.rawData(pos), _metadata.length(pos)); + return true; +} + + +bool Extractor::extract(std::size_t pos, Poco::Data::CLOB& val) +{ + if (_metadata.columnsReturned() <= pos) + throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); + + if (_metadata.isNull(static_cast(pos))) + return false; + + if (_metadata.metaColumn(static_cast(pos)).type() != Poco::Data::MetaColumn::FDT_BLOB) + throw MySQLException("Extractor: not a blob"); + + val.assignRaw(reinterpret_cast(_metadata.rawData(pos)), _metadata.length(pos)); + return true; +} + + +bool Extractor::extract(std::size_t pos, DateTime& val) +{ + MYSQL_TIME mt = {0}; + + if (!realExtractFixed(pos, MYSQL_TYPE_DATETIME, &mt)) + return false; + + val.assign(mt.year, mt.month, mt.day, mt.hour, mt.minute, mt.second, mt.second_part / 1000, mt.second_part % 1000); + return true; +} + + +bool Extractor::extract(std::size_t pos, Date& val) +{ + MYSQL_TIME mt = {0}; + + if (!realExtractFixed(pos, MYSQL_TYPE_DATE, &mt)) + return false; + + val.assign(mt.year, mt.month, mt.day); + return true; +} + + +bool Extractor::extract(std::size_t pos, Time& val) +{ + MYSQL_TIME mt = {0}; + + if (!realExtractFixed(pos, MYSQL_TYPE_TIME, &mt)) + return false; + + val.assign(mt.hour, mt.minute, mt.second); + return true; +} + + +bool Extractor::extract(std::size_t pos, Any& val) +{ + return false; +} + + +bool Extractor::extract(std::size_t pos, Dynamic::Var& val) +{ + return false; +} + + +bool Extractor::isNull(std::size_t col, std::size_t row) +{ + poco_assert(row == POCO_DATA_INVALID_ROW); + + if (_metadata.columnsReturned() <= col) + throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); + + if (_metadata.isNull(static_cast(col))) + return true; + + return false; +} + +void Extractor::reset() +{ + AbstractExtractor::reset(); +} + + +bool Extractor::realExtractFixed(std::size_t pos, enum_field_types type, void* buffer, bool isUnsigned) +{ + MYSQL_BIND bind = {0}; + my_bool isNull = 0; + + bind.is_null = &isNull; + bind.buffer_type = type; + bind.buffer = buffer; + bind.is_unsigned = isUnsigned; + + if (!_stmt.fetchColumn(pos, &bind)) + return false; + + return isNull == 0; +} + + +////////////// +// Not implemented +////////////// + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +#ifndef POCO_LONG_IS_64_BIT +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} +#endif + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector& ) +{ + throw NotImplementedException("std::vector extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::deque& ) +{ + throw NotImplementedException("std::deque extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::list& ) +{ + throw NotImplementedException("std::list extractor must be implemented."); +} + + +bool Extractor::extract(std::size_t , std::vector