mirror of
https://github.com/pocoproject/poco.git
synced 2025-03-25 16:13:42 +01:00
purge trailing whitespace (#1947)
This commit is contained in:
parent
1101439eb0
commit
151304135e
12
.gitattributes
vendored
12
.gitattributes
vendored
@ -1,17 +1,17 @@
|
|||||||
# Set default behaviour, in case users don't have core.autocrlf set.
|
# Set default behaviour, in case users don't have core.autocrlf set.
|
||||||
* text=auto
|
* text=auto
|
||||||
|
|
||||||
# Explicitly declare text files we want to always be normalized and converted
|
# Explicitly declare text files we want to always be normalized and converted
|
||||||
# to native line endings on checkout.
|
# to native line endings on checkout.
|
||||||
*.txt text
|
*.txt text
|
||||||
*.cpp text
|
*.cpp text
|
||||||
*.c text
|
*.c text
|
||||||
*.h text
|
*.h text
|
||||||
*.cmd text
|
*.cmd text
|
||||||
*.sln text
|
*.sln text
|
||||||
*.vcproj text
|
*.vcproj text
|
||||||
*.vcxproj text
|
*.vcxproj text
|
||||||
*.vcxproj.filters text
|
*.vcxproj.filters text
|
||||||
*.page text
|
*.page text
|
||||||
*.html text
|
*.html text
|
||||||
*.xhtml text
|
*.xhtml text
|
||||||
|
38
.travis.yml
38
.travis.yml
@ -11,7 +11,7 @@ branches:
|
|||||||
before_install:
|
before_install:
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y libpcre3-dev libssl-dev libexpat1-dev; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y libpcre3-dev libssl-dev libexpat1-dev; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y libpq-dev unixodbc-dev libmysqlclient-dev libsqlite3-dev; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y libpq-dev unixodbc-dev libmysqlclient-dev libsqlite3-dev; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y sloccount cppcheck; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq -y sloccount cppcheck; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
|
||||||
@ -30,7 +30,7 @@ services:
|
|||||||
|
|
||||||
dist: trusty
|
dist: trusty
|
||||||
sudo: enabled
|
sudo: enabled
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
postgresql: "9.4"
|
postgresql: "9.4"
|
||||||
|
|
||||||
@ -39,16 +39,16 @@ notifications:
|
|||||||
email:
|
email:
|
||||||
on_success: never # default: change
|
on_success: never # default: change
|
||||||
on_failure: always # default: always
|
on_failure: always # default: always
|
||||||
slack:
|
slack:
|
||||||
rooms:
|
rooms:
|
||||||
- pocoproject:ItIUZvs8aJGyPdaKxIKMnS1t#travis
|
- pocoproject:ItIUZvs8aJGyPdaKxIKMnS1t#travis
|
||||||
on_success: never # default: change
|
on_success: never # default: change
|
||||||
on_failure: always # default: always
|
on_failure: always # default: always
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
TEST_NAME=""
|
TEST_NAME=""
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- echo ${TEST_NAME}
|
- echo ${TEST_NAME}
|
||||||
- chmod 755 ./travis/Linux/runtests.sh
|
- chmod 755 ./travis/Linux/runtests.sh
|
||||||
@ -70,7 +70,7 @@ matrix:
|
|||||||
- export CXX="g++-4.9"
|
- export CXX="g++-4.9"
|
||||||
- $CXX --version
|
- $CXX --version
|
||||||
- ./configure --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
- ./configure --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
- env: TEST_NAME="gcc 5.4 (make) bundled"
|
- env: TEST_NAME="gcc 5.4 (make) bundled"
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
script:
|
script:
|
||||||
@ -78,15 +78,15 @@ matrix:
|
|||||||
- export CXX="g++-5"
|
- export CXX="g++-5"
|
||||||
- $CXX --version
|
- $CXX --version
|
||||||
- ./configure --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
- ./configure --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
#- env: TEST_NAME="gcc 5.4 (make) unbundled"
|
#- env: TEST_NAME="gcc 5.4 (make) unbundled"
|
||||||
# ======================================= unit tests fail ures due to unbundled pcre
|
# ======================================= unit tests fail ures due to unbundled pcre
|
||||||
# There was 1 error:
|
# There was 1 error:
|
||||||
# 1: N7CppUnit10TestCallerI21RegularExpressionTestEE.testSubst2
|
# 1: N7CppUnit10TestCallerI21RegularExpressionTestEE.testSubst2
|
||||||
# "St9bad_alloc: std::bad_alloc"
|
# "St9bad_alloc: std::bad_alloc"
|
||||||
# in "<unknown>", line -1
|
# in "<unknown>", line -1
|
||||||
#
|
#
|
||||||
# There were 4 failures:
|
# There were 4 failures:
|
||||||
# 1: N7CppUnit10TestCallerI21RegularExpressionTestEE.testMatch4
|
# 1: N7CppUnit10TestCallerI21RegularExpressionTestEE.testMatch4
|
||||||
# "re.match("123 456", 0, matches) == 3"
|
# "re.match("123 456", 0, matches) == 3"
|
||||||
# in "src/RegularExpressionTest.cpp", line 103
|
# in "src/RegularExpressionTest.cpp", line 103
|
||||||
@ -99,7 +99,7 @@ matrix:
|
|||||||
# 4: N7CppUnit10TestCallerI21RegularExpressionTestEE.testGroup
|
# 4: N7CppUnit10TestCallerI21RegularExpressionTestEE.testGroup
|
||||||
# "re.match("abcd 1234", 0, matches) == 3"
|
# "re.match("abcd 1234", 0, matches) == 3"
|
||||||
# in "src/RegularExpressionTest.cpp", line 271
|
# in "src/RegularExpressionTest.cpp", line 271
|
||||||
#
|
#
|
||||||
# failed=Foundation
|
# failed=Foundation
|
||||||
# =======================================
|
# =======================================
|
||||||
# compiler: gcc
|
# compiler: gcc
|
||||||
@ -109,7 +109,7 @@ matrix:
|
|||||||
# - export CXX="g++-5"
|
# - export CXX="g++-5"
|
||||||
# - $CXX --version
|
# - $CXX --version
|
||||||
# - ./configure --everything --unbundled && make -s -j2 && ./travis/Linux/runtests.sh
|
# - ./configure --everything --unbundled && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
- env: TEST_NAME="gcc 4.9 (CMake)"
|
- env: TEST_NAME="gcc 4.9 (CMake)"
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
script:
|
script:
|
||||||
@ -120,7 +120,7 @@ matrix:
|
|||||||
- source ./travis/ignored.sh
|
- source ./travis/ignored.sh
|
||||||
- export POCO_BASE=`pwd`
|
- export POCO_BASE=`pwd`
|
||||||
- mkdir cmake-build && cd cmake-build && cmake -DENABLE_TESTS=ON .. && make -s -j2 && ctest -VV -E Data && cd ..
|
- mkdir cmake-build && cd cmake-build && cmake -DENABLE_TESTS=ON .. && make -s -j2 && ctest -VV -E Data && cd ..
|
||||||
|
|
||||||
|
|
||||||
- env: TEST_NAME="clang (make) bundled"
|
- env: TEST_NAME="clang (make) bundled"
|
||||||
os: osx
|
os: osx
|
||||||
@ -141,7 +141,7 @@ matrix:
|
|||||||
- export CXX="clang++-4.0"
|
- export CXX="clang++-4.0"
|
||||||
- $CXX --version
|
- $CXX --version
|
||||||
- ./configure --config=Linux-clang --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
- ./configure --config=Linux-clang --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
- env: TEST_NAME="clang 5.0 (make) bundled"
|
- env: TEST_NAME="clang 5.0 (make) bundled"
|
||||||
compiler: clang
|
compiler: clang
|
||||||
script:
|
script:
|
||||||
@ -151,20 +151,20 @@ matrix:
|
|||||||
- export CXX="clang++-5.0"
|
- export CXX="clang++-5.0"
|
||||||
- $CXX --version
|
- $CXX --version
|
||||||
- ./configure --config=Linux-clang --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
- ./configure --config=Linux-clang --everything && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
#- env: TEST_NAME="clang 3.5.0 (make) unbundled"
|
#- env: TEST_NAME="clang 3.5.0 (make) unbundled"
|
||||||
# ======================================= compiler error on generating debug info for auto return
|
# ======================================= compiler error on generating debug info for auto return
|
||||||
# error: debug information for auto is not yet supported
|
# error: debug information for auto is not yet supported
|
||||||
# error: debug information for auto is not yet supported
|
# error: debug information for auto is not yet supported
|
||||||
# ** Creating dependency info for src/Timespan.cpp
|
# ** Creating dependency info for src/Timespan.cpp
|
||||||
# make[1]: *** [/home/travis/build/Kampbell/poco/CppUnit/obj/Linux/x86_64/debug_shared/TestRunner.o] Error 1 # compiler: clang
|
# make[1]: *** [/home/travis/build/Kampbell/poco/CppUnit/obj/Linux/x86_64/debug_shared/TestRunner.o] Error 1 # compiler: clang
|
||||||
# =======================================
|
# =======================================
|
||||||
# script:
|
# script:
|
||||||
# - export CC="clang"
|
# - export CC="clang"
|
||||||
# - export CXX="clang++"
|
# - export CXX="clang++"
|
||||||
# - $CXX --version
|
# - $CXX --version
|
||||||
# - ./configure --config=Linux-clang --everything --unbundled && make -s -j2 && ./travis/Linux/runtests.sh
|
# - ./configure --config=Linux-clang --everything --unbundled && make -s -j2 && ./travis/Linux/runtests.sh
|
||||||
|
|
||||||
#- env: TEST_NAME="arm-linux-gnueabi-g++ (make)"
|
#- env: TEST_NAME="arm-linux-gnueabi-g++ (make)"
|
||||||
# compiler: gcc
|
# compiler: gcc
|
||||||
# script:
|
# script:
|
||||||
@ -190,7 +190,7 @@ matrix:
|
|||||||
# - $CXX --version
|
# - $CXX --version
|
||||||
# - source ./travis/ignored.sh
|
# - source ./travis/ignored.sh
|
||||||
# - export POCO_BASE=`pwd`
|
# - export POCO_BASE=`pwd`
|
||||||
# - mkdir cmake-build
|
# - mkdir cmake-build
|
||||||
# - cd cmake-build && cmake -DENABLE_NETSSL=OFF -DENABLE_CRYPTO=OFF -DENABLE_TESTS=ON .. && make -s -j2 && cd ..
|
# - cd cmake-build && cmake -DENABLE_NETSSL=OFF -DENABLE_CRYPTO=OFF -DENABLE_TESTS=ON .. && make -s -j2 && cd ..
|
||||||
|
|
||||||
- env: TEST_NAME="arm-linux-gnueabihf-g++ (CMake)"
|
- env: TEST_NAME="arm-linux-gnueabihf-g++ (CMake)"
|
||||||
|
@ -8,7 +8,7 @@ vc.project.platforms = Win32, x64
|
|||||||
vc.project.configurations = debug_shared, release_shared
|
vc.project.configurations = debug_shared, release_shared
|
||||||
vc.project.prototype = ApacheConnector_vs90.vcproj
|
vc.project.prototype = ApacheConnector_vs90.vcproj
|
||||||
vc.project.compiler.include = ..\\Foundation\\include;..\\Net\\include;..\\Util\\include
|
vc.project.compiler.include = ..\\Foundation\\include;..\\Net\\include;..\\Util\\include
|
||||||
vc.project.compiler.defines =
|
vc.project.compiler.defines =
|
||||||
vc.project.compiler.defines.shared = ApacheHandlers_EXPORTS
|
vc.project.compiler.defines.shared = ApacheHandlers_EXPORTS
|
||||||
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
||||||
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
||||||
|
@ -16,7 +16,7 @@ file (usually <[httpd.conf]>):
|
|||||||
|
|
||||||
LoadModule poco_module modules/mod_pocod.so
|
LoadModule poco_module modules/mod_pocod.so
|
||||||
----
|
----
|
||||||
|
|
||||||
!!!Configuring ApacheConnector
|
!!!Configuring ApacheConnector
|
||||||
ApacheConnector must be able to find shared libraries containing request handler, as well
|
ApacheConnector must be able to find shared libraries containing request handler, as well
|
||||||
as optional configuration files. ApacheConnector provides an Poco::Util::Application class
|
as optional configuration files. ApacheConnector provides an Poco::Util::Application class
|
||||||
@ -30,7 +30,7 @@ is used in the Apache configuration file:
|
|||||||
|
|
||||||
AddPocoRequestHandler <FactoryClass> <SharedLibrary> <Path>...
|
AddPocoRequestHandler <FactoryClass> <SharedLibrary> <Path>...
|
||||||
----
|
----
|
||||||
|
|
||||||
The first argument specifies the name of the request handler factory class. The second argument
|
The first argument specifies the name of the request handler factory class. The second argument
|
||||||
contains the path of the shared library containing the request handler.
|
contains the path of the shared library containing the request handler.
|
||||||
The third (and optionally following) argument(s) specify the URI paths handled by the
|
The third (and optionally following) argument(s) specify the URI paths handled by the
|
||||||
@ -38,7 +38,7 @@ request handler. For example:
|
|||||||
|
|
||||||
AddPocoRequestHandler TimeRequestHandlerFactory p:/Poco/ApacheConnector/samples/TimeServer/bin/TimeServerd.dll /time
|
AddPocoRequestHandler TimeRequestHandlerFactory p:/Poco/ApacheConnector/samples/TimeServer/bin/TimeServerd.dll /time
|
||||||
----
|
----
|
||||||
|
|
||||||
loads the TimeRequestHandlerFactory from TimeServerd.dll. Whenever a request for a URI starting with "/time"
|
loads the TimeRequestHandlerFactory from TimeServerd.dll. Whenever a request for a URI starting with "/time"
|
||||||
is sent by a client, this request will be handled by the TimeRequestHandler.
|
is sent by a client, this request will be handled by the TimeRequestHandler.
|
||||||
|
|
||||||
@ -76,8 +76,8 @@ Following is a sample for a request handler implementation. The complete sample
|
|||||||
#include "Poco/DateTimeFormatter.h"
|
#include "Poco/DateTimeFormatter.h"
|
||||||
#include "Poco/DateTimeFormat.h"
|
#include "Poco/DateTimeFormat.h"
|
||||||
#include "Poco/ClassLibrary.h"
|
#include "Poco/ClassLibrary.h"
|
||||||
|
|
||||||
|
|
||||||
using Poco::Net::HTTPRequestHandler;
|
using Poco::Net::HTTPRequestHandler;
|
||||||
using Poco::Net::HTTPRequestHandlerFactory;
|
using Poco::Net::HTTPRequestHandlerFactory;
|
||||||
using Poco::Net::HTTPServerRequest;
|
using Poco::Net::HTTPServerRequest;
|
||||||
@ -85,24 +85,24 @@ Following is a sample for a request handler implementation. The complete sample
|
|||||||
using Poco::Timestamp;
|
using Poco::Timestamp;
|
||||||
using Poco::DateTimeFormatter;
|
using Poco::DateTimeFormatter;
|
||||||
using Poco::DateTimeFormat;
|
using Poco::DateTimeFormat;
|
||||||
|
|
||||||
|
|
||||||
class TimeRequestHandler: public HTTPRequestHandler
|
class TimeRequestHandler: public HTTPRequestHandler
|
||||||
/// Return a HTML document with the current date and time.
|
/// Return a HTML document with the current date and time.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TimeRequestHandler()
|
TimeRequestHandler()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
|
void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
|
||||||
{
|
{
|
||||||
Timestamp now;
|
Timestamp now;
|
||||||
std::string dt(DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
std::string dt(DateTimeFormatter::format(now, DateTimeFormat::SORTABLE_FORMAT));
|
||||||
|
|
||||||
response.setChunkedTransferEncoding(true);
|
response.setChunkedTransferEncoding(true);
|
||||||
response.setContentType("text/html");
|
response.setContentType("text/html");
|
||||||
|
|
||||||
std::ostream& ostr = response.send();
|
std::ostream& ostr = response.send();
|
||||||
ostr << "<html><head><title>TimeServer powered by POCO ApacheConnector</title>";
|
ostr << "<html><head><title>TimeServer powered by POCO ApacheConnector</title>";
|
||||||
ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>";
|
ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>";
|
||||||
@ -111,22 +111,22 @@ Following is a sample for a request handler implementation. The complete sample
|
|||||||
ostr << "</p></body></html>";
|
ostr << "</p></body></html>";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class TimeRequestHandlerFactory: public HTTPRequestHandlerFactory
|
class TimeRequestHandlerFactory: public HTTPRequestHandlerFactory
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TimeRequestHandlerFactory()
|
TimeRequestHandlerFactory()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
|
HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request)
|
||||||
{
|
{
|
||||||
return new TimeRequestHandler;
|
return new TimeRequestHandler;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
POCO_BEGIN_MANIFEST(HTTPRequestHandlerFactory)
|
POCO_BEGIN_MANIFEST(HTTPRequestHandlerFactory)
|
||||||
POCO_EXPORT_CLASS(TimeRequestHandlerFactory)
|
POCO_EXPORT_CLASS(TimeRequestHandlerFactory)
|
||||||
POCO_END_MANIFEST
|
POCO_END_MANIFEST
|
||||||
|
@ -25,10 +25,10 @@ class ApacheServerRequest: public Poco::Net::HTTPServerRequest
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ApacheServerRequest(
|
ApacheServerRequest(
|
||||||
ApacheRequestRec* pApacheRequest,
|
ApacheRequestRec* pApacheRequest,
|
||||||
const char* serverName,
|
const char* serverName,
|
||||||
int serverPort,
|
int serverPort,
|
||||||
const char* clientName,
|
const char* clientName,
|
||||||
int clientPort);
|
int clientPort);
|
||||||
/// Creates a new ApacheServerRequest.
|
/// Creates a new ApacheServerRequest.
|
||||||
|
|
||||||
|
@ -55,14 +55,14 @@ public:
|
|||||||
/// The returned stream is valid until the response
|
/// The returned stream is valid until the response
|
||||||
/// object is destroyed.
|
/// object is destroyed.
|
||||||
///
|
///
|
||||||
/// Must not be called after sendFile(), sendBuffer()
|
/// Must not be called after sendFile(), sendBuffer()
|
||||||
/// or redirect() has been called.
|
/// or redirect() has been called.
|
||||||
|
|
||||||
void sendFile(const std::string& path, const std::string& mediaType);
|
void sendFile(const std::string& path, const std::string& mediaType);
|
||||||
/// Sends the response header to the client, followed
|
/// Sends the response header to the client, followed
|
||||||
/// by the content of the given file.
|
/// by the content of the given file.
|
||||||
///
|
///
|
||||||
/// Must not be called after send(), sendBuffer()
|
/// Must not be called after send(), sendBuffer()
|
||||||
/// or redirect() has been called.
|
/// or redirect() has been called.
|
||||||
///
|
///
|
||||||
/// Throws a FileNotFoundException if the file
|
/// Throws a FileNotFoundException if the file
|
||||||
@ -77,10 +77,10 @@ public:
|
|||||||
/// to length and chunked transfer encoding is disabled.
|
/// to length and chunked transfer encoding is disabled.
|
||||||
///
|
///
|
||||||
/// If both the HTTP message header and body (from the
|
/// If both the HTTP message header and body (from the
|
||||||
/// given buffer) fit into one single network packet, the
|
/// given buffer) fit into one single network packet, the
|
||||||
/// complete response can be sent in one network packet.
|
/// complete response can be sent in one network packet.
|
||||||
///
|
///
|
||||||
/// Must not be called after send(), sendFile()
|
/// Must not be called after send(), sendFile()
|
||||||
/// or redirect() has been called.
|
/// or redirect() has been called.
|
||||||
|
|
||||||
void redirect(const std::string& uri, Poco::Net::HTTPResponse::HTTPStatus status);
|
void redirect(const std::string& uri, Poco::Net::HTTPResponse::HTTPStatus status);
|
||||||
|
@ -33,7 +33,7 @@ protected:
|
|||||||
int writeToDevice(const char* buffer, std::streamsize length);
|
int writeToDevice(const char* buffer, std::streamsize length);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
STREAM_BUFFER_SIZE = 1024
|
STREAM_BUFFER_SIZE = 1024
|
||||||
};
|
};
|
||||||
|
@ -91,7 +91,7 @@ class FormRequestHandler: public HTTPRequestHandler
|
|||||||
/// Return a HTML document with the current date and time.
|
/// Return a HTML document with the current date and time.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FormRequestHandler()
|
FormRequestHandler()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class TimeRequestHandler: public HTTPRequestHandler
|
|||||||
/// Return a HTML document with the current date and time.
|
/// Return a HTML document with the current date and time.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TimeRequestHandler()
|
TimeRequestHandler()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ extern "C" int ApacheConnector_handler(request_rec *r)
|
|||||||
return DECLINED;
|
return DECLINED;
|
||||||
|
|
||||||
apr_status_t rv;
|
apr_status_t rv;
|
||||||
if ((rv = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)))
|
if ((rv = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)))
|
||||||
return rv;
|
return rv;
|
||||||
|
|
||||||
// The properties conn_rec->remote_ip and conn_rec->remote_addr have undergone significant changes in Apache 2.4.
|
// The properties conn_rec->remote_ip and conn_rec->remote_addr have undergone significant changes in Apache 2.4.
|
||||||
@ -274,25 +274,25 @@ extern "C" const char* ApacheConnector_config(cmd_parms *cmd, void *in_dconf, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" const command_rec ApacheConnector_cmds[] =
|
extern "C" const command_rec ApacheConnector_cmds[] =
|
||||||
{
|
{
|
||||||
AP_INIT_RAW_ARGS(
|
AP_INIT_RAW_ARGS(
|
||||||
"AddPocoRequestHandler",
|
"AddPocoRequestHandler",
|
||||||
reinterpret_cast<cmd_func>(ApacheConnector_uris),
|
reinterpret_cast<cmd_func>(ApacheConnector_uris),
|
||||||
NULL,
|
NULL,
|
||||||
RSRC_CONF,
|
RSRC_CONF,
|
||||||
"POCO RequestHandlerFactory class name followed by shared library path followed by a list of ' ' separated URIs that must be handled by this module."),
|
"POCO RequestHandlerFactory class name followed by shared library path followed by a list of ' ' separated URIs that must be handled by this module."),
|
||||||
AP_INIT_RAW_ARGS(
|
AP_INIT_RAW_ARGS(
|
||||||
"AddPocoConfig",
|
"AddPocoConfig",
|
||||||
reinterpret_cast<cmd_func>(ApacheConnector_config),
|
reinterpret_cast<cmd_func>(ApacheConnector_config),
|
||||||
NULL,
|
NULL,
|
||||||
RSRC_CONF,
|
RSRC_CONF,
|
||||||
"Path of the POCO configuration file."),
|
"Path of the POCO configuration file."),
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
module AP_MODULE_DECLARE_DATA poco_module =
|
module AP_MODULE_DECLARE_DATA poco_module =
|
||||||
{
|
{
|
||||||
STANDARD20_MODULE_STUFF,
|
STANDARD20_MODULE_STUFF,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
|
|
||||||
ApacheServerRequest::ApacheServerRequest(
|
ApacheServerRequest::ApacheServerRequest(
|
||||||
ApacheRequestRec* pApacheRequest,
|
ApacheRequestRec* pApacheRequest,
|
||||||
const char* serverName,
|
const char* serverName,
|
||||||
int serverPort,
|
int serverPort,
|
||||||
const char* clientName,
|
const char* clientName,
|
||||||
int clientPort):
|
int clientPort):
|
||||||
_pApacheRequest(pApacheRequest),
|
_pApacheRequest(pApacheRequest),
|
||||||
_pResponse(0),
|
_pResponse(0),
|
||||||
|
@ -21,7 +21,7 @@ using Poco::BufferedStreamBuf;
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
ApacheStreamBuf::ApacheStreamBuf(ApacheRequestRec* pApacheRequest, bool haveData):
|
ApacheStreamBuf::ApacheStreamBuf(ApacheRequestRec* pApacheRequest, bool haveData):
|
||||||
BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in | std::ios::out),
|
BufferedStreamBuf(STREAM_BUFFER_SIZE, std::ios::in | std::ios::out),
|
||||||
_pApacheRequest(pApacheRequest),
|
_pApacheRequest(pApacheRequest),
|
||||||
_haveData(haveData)
|
_haveData(haveData)
|
||||||
|
@ -337,7 +337,7 @@ set(CPACK_PACKAGE_INSTALL_DIRECTORY "/usr/local")
|
|||||||
include(CPack)
|
include(CPack)
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
# cmake config files
|
# cmake config files
|
||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
|
@ -18,7 +18,7 @@ David Shawley
|
|||||||
Sergey Skorokhodov
|
Sergey Skorokhodov
|
||||||
Tom Tan
|
Tom Tan
|
||||||
Sergey N. Yatskevich
|
Sergey N. Yatskevich
|
||||||
Marc Chevrier
|
Marc Chevrier
|
||||||
Philippe Cuvillier
|
Philippe Cuvillier
|
||||||
Marian Krivos
|
Marian Krivos
|
||||||
Franky Braem
|
Franky Braem
|
||||||
@ -40,7 +40,7 @@ Pascal Bach
|
|||||||
Cristian Thiago Moecke
|
Cristian Thiago Moecke
|
||||||
Sergei Nikulov
|
Sergei Nikulov
|
||||||
Aaron Kaluszka
|
Aaron Kaluszka
|
||||||
Iyed Bennour
|
Iyed Bennour
|
||||||
Scott Davis
|
Scott Davis
|
||||||
Kristin Cowalcijk
|
Kristin Cowalcijk
|
||||||
Yuval Kashtan
|
Yuval Kashtan
|
||||||
|
@ -74,7 +74,7 @@ public:
|
|||||||
bool getBool(const std::string& name) const;
|
bool getBool(const std::string& name) const;
|
||||||
/// Returns the attribute's value as a boolean.
|
/// Returns the attribute's value as a boolean.
|
||||||
/// The returned value is 'true', iff the stored value is not "false".
|
/// The returned value is 'true', iff the stored value is not "false".
|
||||||
///
|
///
|
||||||
/// Throws a Poco::NotFoundException if the attribute does not exist.
|
/// Throws a Poco::NotFoundException if the attribute does not exist.
|
||||||
|
|
||||||
bool getBool(const std::string& name, bool defaultValue) const;
|
bool getBool(const std::string& name, bool defaultValue) const;
|
||||||
|
@ -34,13 +34,13 @@ class CppParser_API AttributesParser
|
|||||||
/// structs/classes, functions, types, etc. can be annotated
|
/// structs/classes, functions, types, etc. can be annotated
|
||||||
/// with attributes.
|
/// with attributes.
|
||||||
///
|
///
|
||||||
/// Attributes always come immediately before the symbol that
|
/// Attributes always come immediately before the symbol that
|
||||||
/// is being annotated, and are written inside special comments
|
/// is being annotated, and are written inside special comments
|
||||||
/// with the syntax:
|
/// with the syntax:
|
||||||
/// //@ <attrDecl>[,<attrDec>...]
|
/// //@ <attrDecl>[,<attrDec>...]
|
||||||
/// where <attrDecl> is
|
/// where <attrDecl> is
|
||||||
/// <name>[=<value>]
|
/// <name>[=<value>]
|
||||||
/// <name> is a valid C++ identifier, or two identifiers separated by
|
/// <name> is a valid C++ identifier, or two identifiers separated by
|
||||||
/// a period (struct accessor notation).
|
/// a period (struct accessor notation).
|
||||||
/// <value> is a string, integer, identifier, bool literal, or a complex value
|
/// <value> is a string, integer, identifier, bool literal, or a complex value
|
||||||
/// in the form
|
/// in the form
|
||||||
|
@ -66,7 +66,7 @@ public:
|
|||||||
OP_BITAND_ASSIGN, // &=
|
OP_BITAND_ASSIGN, // &=
|
||||||
OP_AND, // &&
|
OP_AND, // &&
|
||||||
OP_BITOR, // |
|
OP_BITOR, // |
|
||||||
OP_BITOR_ASSIGN, // |=
|
OP_BITOR_ASSIGN, // |=
|
||||||
OP_OR, // ||
|
OP_OR, // ||
|
||||||
OP_XOR, // ^
|
OP_XOR, // ^
|
||||||
OP_XOR_ASSIGN, // ^=
|
OP_XOR_ASSIGN, // ^=
|
||||||
|
@ -37,7 +37,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
std::string beginNameSpaceDecl; // contains either $(NS)_BEGIN or the namespace x { decl
|
std::string beginNameSpaceDecl; // contains either $(NS)_BEGIN or the namespace x { decl
|
||||||
std::string endNameSpaceDecl; // contains either $(NS)_END or the closing brackets }
|
std::string endNameSpaceDecl; // contains either $(NS)_END or the closing brackets }
|
||||||
std::vector<std::string> classDecls; // contains strings of the form "class X;"
|
std::vector<std::string> classDecls; // contains strings of the form "class X;"
|
||||||
};
|
};
|
||||||
|
|
||||||
static void parse(const std::string& file, NameSpace::SymbolTable& st, const std::string& exec, const std::string& options, const std::string& path);
|
static void parse(const std::string& file, NameSpace::SymbolTable& st, const std::string& exec, const std::string& options, const std::string& path);
|
||||||
|
@ -96,7 +96,7 @@ OperatorToken::OperatorToken()
|
|||||||
_opMap[":"] = i++;
|
_opMap[":"] = i++;
|
||||||
_opMap["::"] = i++;
|
_opMap["::"] = i++;
|
||||||
_opMap[";"] = i++;
|
_opMap[";"] = i++;
|
||||||
_opMap["?"] = i++;
|
_opMap["?"] = i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -345,7 +345,7 @@ void IdentifierToken::finish(std::istream& istr)
|
|||||||
while ((next >= 'A' && next <= 'Z') ||
|
while ((next >= 'A' && next <= 'Z') ||
|
||||||
(next >= 'a' && next <= 'z') ||
|
(next >= 'a' && next <= 'z') ||
|
||||||
(next >= '0' && next <= '9') ||
|
(next >= '0' && next <= '9') ||
|
||||||
(next == '_' || next == '$'))
|
(next == '_' || next == '$'))
|
||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
next = istr.peek();
|
next = istr.peek();
|
||||||
@ -517,14 +517,14 @@ void NumberLiteralToken::finish(std::istream& istr)
|
|||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
next = istr.peek();
|
next = istr.peek();
|
||||||
while (std::isxdigit(next))
|
while (std::isxdigit(next))
|
||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
next = istr.peek();
|
next = istr.peek();
|
||||||
}
|
}
|
||||||
while (next == 'L' || next == 'l' || next == 'U' || next == 'u')
|
while (next == 'L' || next == 'l' || next == 'U' || next == 'u')
|
||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
next = istr.peek();
|
next = istr.peek();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -587,13 +587,13 @@ void NumberLiteralToken::finish(std::istream& istr)
|
|||||||
if (_isFloat)
|
if (_isFloat)
|
||||||
{
|
{
|
||||||
if (next == 'L' || next == 'l' || next == 'F' || next == 'f')
|
if (next == 'L' || next == 'l' || next == 'F' || next == 'f')
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (next == 'L' || next == 'l' || next == 'U' || next == 'u')
|
while (next == 'L' || next == 'l' || next == 'U' || next == 'u')
|
||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
next = istr.peek();
|
next = istr.peek();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -656,7 +656,7 @@ void CommentToken::finish(std::istream& istr)
|
|||||||
{
|
{
|
||||||
next = istr.get();
|
next = istr.get();
|
||||||
_value += (char) next;
|
_value += (char) next;
|
||||||
if (next == '*' && istr.peek() == '/')
|
if (next == '*' && istr.peek() == '/')
|
||||||
{
|
{
|
||||||
_value += (char) istr.get();
|
_value += (char) istr.get();
|
||||||
break;
|
break;
|
||||||
@ -704,7 +704,7 @@ void PreprocessorToken::finish(std::istream& istr)
|
|||||||
int next = istr.peek();
|
int next = istr.peek();
|
||||||
while (next != -1 && next != '\r' && next != '\n')
|
while (next != -1 && next != '\r' && next != '\n')
|
||||||
{
|
{
|
||||||
if (next == '\\')
|
if (next == '\\')
|
||||||
{
|
{
|
||||||
istr.get();
|
istr.get();
|
||||||
int p = istr.peek();
|
int p = istr.peek();
|
||||||
|
@ -108,7 +108,7 @@ Symbol* NameSpace::lookup(const std::string& name, std::set<const NameSpace*>& a
|
|||||||
bool currentNSInserted = true;
|
bool currentNSInserted = true;
|
||||||
|
|
||||||
|
|
||||||
if (head.empty())
|
if (head.empty())
|
||||||
{
|
{
|
||||||
alreadyVisited.insert(this);
|
alreadyVisited.insert(this);
|
||||||
return root()->lookup(tail, alreadyVisited);
|
return root()->lookup(tail, alreadyVisited);
|
||||||
@ -220,7 +220,7 @@ void NameSpace::splitName(const std::string& name, std::string& head, std::strin
|
|||||||
head.assign(name, 0, pos);
|
head.assign(name, 0, pos);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
poco_assert (pos < name.length());
|
poco_assert (pos < name.length());
|
||||||
tail.assign(name, pos, name.length() - pos);
|
tail.assign(name, pos, name.length() - pos);
|
||||||
}
|
}
|
||||||
else head = name;
|
else head = name;
|
||||||
}
|
}
|
||||||
|
@ -628,7 +628,7 @@ const Token* Parser::parseFunc(const Token* pNext, std::string& decl)
|
|||||||
expectOperator(pNext, OperatorToken::OP_CLOSPARENT, ")");
|
expectOperator(pNext, OperatorToken::OP_CLOSPARENT, ")");
|
||||||
pNext = next();
|
pNext = next();
|
||||||
while (pNext->is(Poco::Token::IDENTIFIER_TOKEN) || pNext->is(Poco::Token::KEYWORD_TOKEN))
|
while (pNext->is(Poco::Token::IDENTIFIER_TOKEN) || pNext->is(Poco::Token::KEYWORD_TOKEN))
|
||||||
{
|
{
|
||||||
if (isKeyword(pNext, IdentifierToken::KW_CONST))
|
if (isKeyword(pNext, IdentifierToken::KW_CONST))
|
||||||
{
|
{
|
||||||
if (pFunc) pFunc->makeConst();
|
if (pFunc) pFunc->makeConst();
|
||||||
@ -636,7 +636,7 @@ const Token* Parser::parseFunc(const Token* pNext, std::string& decl)
|
|||||||
}
|
}
|
||||||
if (isKeyword(pNext, IdentifierToken::KW_THROW))
|
if (isKeyword(pNext, IdentifierToken::KW_THROW))
|
||||||
{
|
{
|
||||||
while (!isOperator(pNext, OperatorToken::OP_ASSIGN) && !isOperator(pNext, OperatorToken::OP_SEMICOLON) &&
|
while (!isOperator(pNext, OperatorToken::OP_ASSIGN) && !isOperator(pNext, OperatorToken::OP_SEMICOLON) &&
|
||||||
!isOperator(pNext, OperatorToken::OP_OPENBRACE) && !isEOF(pNext))
|
!isOperator(pNext, OperatorToken::OP_OPENBRACE) && !isEOF(pNext))
|
||||||
pNext = next();
|
pNext = next();
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,6 @@ vc.project.platforms = Win32, x64
|
|||||||
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
||||||
vc.project.prototype = TestSuite_vs90.vcproj
|
vc.project.prototype = TestSuite_vs90.vcproj
|
||||||
vc.project.compiler.include = ..\\..\\Foundation\\include
|
vc.project.compiler.include = ..\\..\\Foundation\\include
|
||||||
vc.project.linker.dependencies.Win32 =
|
vc.project.linker.dependencies.Win32 =
|
||||||
vc.project.linker.dependencies.x64 =
|
vc.project.linker.dependencies.x64 =
|
||||||
vc.project.linker.dependencies.WinCE =
|
vc.project.linker.dependencies.WinCE =
|
||||||
|
@ -22,7 +22,7 @@ target_include_directories( "${LIBNAME}"
|
|||||||
PUBLIC
|
PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
$<INSTALL_INTERFACE:include>
|
$<INSTALL_INTERFACE:include>
|
||||||
PRIVATE
|
PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
target_compile_definitions("${LIBNAME}" PUBLIC ${LIB_MODE_DEFINITIONS})
|
target_compile_definitions("${LIBNAME}" PUBLIC ${LIB_MODE_DEFINITIONS})
|
||||||
|
@ -7,8 +7,8 @@ vc.project.outdir = ${vc.project.pocobase}
|
|||||||
vc.project.platforms = Win32, x64, WinCE
|
vc.project.platforms = Win32, x64, WinCE
|
||||||
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
||||||
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
||||||
vc.project.compiler.include =
|
vc.project.compiler.include =
|
||||||
vc.project.compiler.defines =
|
vc.project.compiler.defines =
|
||||||
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS, _CRT_SECURE_NO_WARNINGS
|
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS, _CRT_SECURE_NO_WARNINGS
|
||||||
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
||||||
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#define IDC_CHK_AUTORUN 1013
|
#define IDC_CHK_AUTORUN 1013
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 131
|
#define _APS_NEXT_RESOURCE_VALUE 131
|
||||||
|
@ -52,7 +52,7 @@ protected:
|
|||||||
// Construct the active test
|
// Construct the active test
|
||||||
inline ActiveTest::ActiveTest(Test *test): TestDecorator(test)
|
inline ActiveTest::ActiveTest(Test *test): TestDecorator(test)
|
||||||
{
|
{
|
||||||
_currentTestResult = NULL;
|
_currentTestResult = NULL;
|
||||||
_threadHandle = INVALID_HANDLE_VALUE;
|
_threadHandle = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ inline ActiveTest::ActiveTest(Test *test): TestDecorator(test)
|
|||||||
// Pend until the test has completed
|
// Pend until the test has completed
|
||||||
inline ActiveTest::~ActiveTest()
|
inline ActiveTest::~ActiveTest()
|
||||||
{
|
{
|
||||||
CSingleLock(&_runCompleted, TRUE);
|
CSingleLock(&_runCompleted, TRUE);
|
||||||
CloseHandle(_threadHandle);
|
CloseHandle(_threadHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ inline ActiveTest::~ActiveTest()
|
|||||||
// Set the test result that we are to run
|
// Set the test result that we are to run
|
||||||
inline void ActiveTest::setTestResult(TestResult* result)
|
inline void ActiveTest::setTestResult(TestResult* result)
|
||||||
{
|
{
|
||||||
_currentTestResult = result;
|
_currentTestResult = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
// Construct with lightweight synchronization
|
// Construct with lightweight synchronization
|
||||||
inline GUITestResult::GUITestResult(TestRunnerDlg* runner): _runner(runner)
|
inline GUITestResult::GUITestResult(TestRunnerDlg* runner): _runner(runner)
|
||||||
{
|
{
|
||||||
setSynchronizationObject(new LightweightSynchronizationObject());
|
setSynchronizationObject(new LightweightSynchronizationObject());
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ inline GUITestResult::~GUITestResult()
|
|||||||
// Override without protection to prevent deadlock
|
// Override without protection to prevent deadlock
|
||||||
inline void GUITestResult::stop()
|
inline void GUITestResult::stop()
|
||||||
{
|
{
|
||||||
_stop = true;
|
_stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,12 +44,12 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
// Construct a ProgressBar
|
// Construct a ProgressBar
|
||||||
inline ProgressBar::ProgressBar(CWnd* baseWindow, CRect& bounds):
|
inline ProgressBar::ProgressBar(CWnd* baseWindow, CRect& bounds):
|
||||||
_baseWindow(baseWindow),
|
_baseWindow(baseWindow),
|
||||||
_bounds(bounds),
|
_bounds(bounds),
|
||||||
_error(false),
|
_error(false),
|
||||||
_total(0),
|
_total(0),
|
||||||
_progress(0),
|
_progress(0),
|
||||||
_progressX(0)
|
_progressX(0)
|
||||||
{
|
{
|
||||||
WINDOWINFO wi;
|
WINDOWINFO wi;
|
||||||
|
@ -15,14 +15,14 @@
|
|||||||
<P>CppUnit is a simple unit test framework for C++. It is a port from JUnit, a testing framework for Java, developed by Kent Beck and Erich Gamma. </P>
|
<P>CppUnit is a simple unit test framework for C++. It is a port from JUnit, a testing framework for Java, developed by Kent Beck and Erich Gamma. </P>
|
||||||
<H3>Contents</H3>
|
<H3>Contents</H3>
|
||||||
<PRE>README.html this file
|
<PRE>README.html this file
|
||||||
|
|
||||||
test the source code
|
test the source code
|
||||||
framework the testing framework
|
framework the testing framework
|
||||||
		extensions	some framework extension classes
|
		extensions	some framework extension classes
|
||||||
textui a command line interface to run tests
|
textui a command line interface to run tests
|
||||||
ms code for a Microsoft specific TestRunner
|
ms code for a Microsoft specific TestRunner
|
||||||
samples some example test cases and extensions to the framework
|
samples some example test cases and extensions to the framework
|
||||||
multicaster a sample illustrating a publish/subscribe
|
multicaster a sample illustrating a publish/subscribe
|
||||||
				multicaster under test
|
				multicaster under test
|
||||||
doc documentation</PRE>
|
doc documentation</PRE>
|
||||||
<H3>Installation</H3>
|
<H3>Installation</H3>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<P>Subclass the TestCase class. Override the method "runTest ()". When you want to check a value, call "assert (bool)" and pass in an expression that is true if the test succeeds. </P>
|
<P>Subclass the TestCase class. Override the method "runTest ()". When you want to check a value, call "assert (bool)" and pass in an expression that is true if the test succeeds. </P>
|
||||||
<P>For example, to test the equality comparison for a Complex number class, write:</P>
|
<P>For example, to test the equality comparison for a Complex number class, write:</P>
|
||||||
<TT><PRE>	class ComplexNumberTest : public TestCase {
|
<TT><PRE>	class ComplexNumberTest : public TestCase {
|
||||||
	public:
|
	public:
|
||||||
ComplexNumberTest (string name) : TestCase (name) {}
|
ComplexNumberTest (string name) : TestCase (name) {}
|
||||||
void runTest () {
|
void runTest () {
|
||||||
assert (Complex (10, 1) == Complex (10, 1));
|
assert (Complex (10, 1) == Complex (10, 1));
|
||||||
@ -59,7 +59,7 @@
|
|||||||
	void		setUp () {
|
	void		setUp () {
|
||||||
			 m_10_1 = new Complex (10, 1);
|
			 m_10_1 = new Complex (10, 1);
|
||||||
			 m_1_1 = new Complex (1, 1);
|
			 m_1_1 = new Complex (1, 1);
|
||||||
			 m_11_2 = new Complex (11, 2);
|
			 m_11_2 = new Complex (11, 2);
|
||||||
}
|
}
|
||||||
	void		tearDown () {
|
	void		tearDown () {
|
||||||
			 delete m_10_1, delete m_1_1, delete m_11_2;
|
			 delete m_10_1, delete m_1_1, delete m_11_2;
|
||||||
@ -83,7 +83,7 @@
|
|||||||
	void		setUp () {
|
	void		setUp () {
|
||||||
			 m_10_1 = new Complex (10, 1);
|
			 m_10_1 = new Complex (10, 1);
|
||||||
			 m_1_1 = new Complex (1, 1);
|
			 m_1_1 = new Complex (1, 1);
|
||||||
			 m_11_2 = new Complex (11, 2);
|
			 m_11_2 = new Complex (11, 2);
|
||||||
}
|
}
|
||||||
	void		tearDown () {
|
	void		tearDown () {
|
||||||
			 delete m_10_1, delete m_1_1, delete m_11_2;
|
			 delete m_10_1, delete m_1_1, delete m_11_2;
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
@ -54,8 +54,8 @@ class TestCaller: public TestCase
|
|||||||
typedef void (Fixture::*TestMethod)();
|
typedef void (Fixture::*TestMethod)();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestCaller(const std::string& name, TestMethod test):
|
TestCaller(const std::string& name, TestMethod test):
|
||||||
TestCase(name),
|
TestCase(name),
|
||||||
_test(test),
|
_test(test),
|
||||||
_fixture(new Fixture(name))
|
_fixture(new Fixture(name))
|
||||||
{
|
{
|
||||||
|
@ -78,8 +78,8 @@
|
|||||||
#pragma warning(disable:4503) // decorated name length exceeded - mainly a problem with STLPort
|
#pragma warning(disable:4503) // decorated name length exceeded - mainly a problem with STLPort
|
||||||
#pragma warning(disable:4018) // signed/unsigned comparison
|
#pragma warning(disable:4018) // signed/unsigned comparison
|
||||||
#pragma warning(disable:4284) // return type for operator -> is not UDT
|
#pragma warning(disable:4284) // return type for operator -> is not UDT
|
||||||
#pragma warning(disable:4251) // ... needs to have dll-interface warning
|
#pragma warning(disable:4251) // ... needs to have dll-interface warning
|
||||||
#pragma warning(disable:4273)
|
#pragma warning(disable:4273)
|
||||||
#pragma warning(disable:4275) // ... non dll-interface class used as base for dll-interface class
|
#pragma warning(disable:4275) // ... non dll-interface class used as base for dll-interface class
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ class CppUnit_API CppUnitException: public std::exception
|
|||||||
/// descriptive strings through its what() method
|
/// descriptive strings through its what() method
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CppUnitException(const std::string& message = "",
|
CppUnitException(const std::string& message = "",
|
||||||
long lineNumber = CPPUNIT_UNKNOWNLINENUMBER,
|
long lineNumber = CPPUNIT_UNKNOWNLINENUMBER,
|
||||||
const std::string& fileName = CPPUNIT_UNKNOWNFILENAME);
|
const std::string& fileName = CPPUNIT_UNKNOWNFILENAME);
|
||||||
CppUnitException(const std::string& message,
|
CppUnitException(const std::string& message,
|
||||||
long lineNumber,
|
long lineNumber,
|
||||||
@ -110,26 +110,26 @@ inline const char* CppUnitException::what() const throw ()
|
|||||||
|
|
||||||
inline long CppUnitException::lineNumber() const
|
inline long CppUnitException::lineNumber() const
|
||||||
{
|
{
|
||||||
return _lineNumber;
|
return _lineNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline long CppUnitException::data1LineNumber() const
|
inline long CppUnitException::data1LineNumber() const
|
||||||
{
|
{
|
||||||
return _data1lineNumber;
|
return _data1lineNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline long CppUnitException::data2LineNumber() const
|
inline long CppUnitException::data2LineNumber() const
|
||||||
{
|
{
|
||||||
return _data2lineNumber;
|
return _data2lineNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The file in which the error occurred
|
// The file in which the error occurred
|
||||||
inline const std::string& CppUnitException::fileName() const
|
inline const std::string& CppUnitException::fileName() const
|
||||||
{
|
{
|
||||||
return _fileName;
|
return _fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,11 +45,11 @@ namespace CppUnit {
|
|||||||
*
|
*
|
||||||
* see TestSuite
|
* see TestSuite
|
||||||
*/
|
*/
|
||||||
template <class ClassUnderTest>
|
template <class ClassUnderTest>
|
||||||
class Orthodox: public TestCase
|
class Orthodox: public TestCase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Orthodox(): TestCase("Orthodox")
|
Orthodox(): TestCase("Orthodox")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
// Run an orthodoxy test
|
// Run an orthodoxy test
|
||||||
template <class ClassUnderTest>
|
template <class ClassUnderTest>
|
||||||
void Orthodox<ClassUnderTest>::runTest()
|
void Orthodox<ClassUnderTest>::runTest()
|
||||||
{
|
{
|
||||||
// make sure we have a default constructor
|
// make sure we have a default constructor
|
||||||
@ -90,7 +90,7 @@ void Orthodox<ClassUnderTest>::runTest()
|
|||||||
|
|
||||||
|
|
||||||
// Exercise a call
|
// Exercise a call
|
||||||
template <class ClassUnderTest>
|
template <class ClassUnderTest>
|
||||||
ClassUnderTest Orthodox<ClassUnderTest>::call(ClassUnderTest object)
|
ClassUnderTest Orthodox<ClassUnderTest>::call(ClassUnderTest object)
|
||||||
{
|
{
|
||||||
return object;
|
return object;
|
||||||
|
@ -29,7 +29,7 @@ class CppUnit_API RepeatedTest: public TestDecorator
|
|||||||
REFERENCEOBJECT (RepeatedTest)
|
REFERENCEOBJECT (RepeatedTest)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RepeatedTest(Test* test, int timesRepeat): TestDecorator (test), _timesRepeat (timesRepeat)
|
RepeatedTest(Test* test, int timesRepeat): TestDecorator (test), _timesRepeat (timesRepeat)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ inline std::string RepeatedTest::toString()
|
|||||||
// Runs a repeated test
|
// Runs a repeated test
|
||||||
inline void RepeatedTest::run(TestResult *result)
|
inline void RepeatedTest::run(TestResult *result)
|
||||||
{
|
{
|
||||||
for (int n = 0; n < _timesRepeat; n++)
|
for (int n = 0; n < _timesRepeat; n++)
|
||||||
{
|
{
|
||||||
if (result->shouldStop())
|
if (result->shouldStop())
|
||||||
break;
|
break;
|
||||||
|
@ -46,7 +46,7 @@ inline void Test::run(TestResult *result)
|
|||||||
// Counts the number of test cases that will be run by this test.
|
// Counts the number of test cases that will be run by this test.
|
||||||
inline int Test::countTestCases()
|
inline int Test::countTestCases()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,8 +54,8 @@ class TestCaller: public TestCase
|
|||||||
typedef void (Fixture::*TestMethod)();
|
typedef void (Fixture::*TestMethod)();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestCaller(const std::string& name, TestMethod test):
|
TestCaller(const std::string& name, TestMethod test):
|
||||||
TestCase(name),
|
TestCase(name),
|
||||||
_test(test),
|
_test(test),
|
||||||
_fixture(new Fixture(name))
|
_fixture(new Fixture(name))
|
||||||
{
|
{
|
||||||
@ -64,8 +64,8 @@ public:
|
|||||||
// Returns the name of the test case instance
|
// Returns the name of the test case instance
|
||||||
virtual std::string toString()
|
virtual std::string toString()
|
||||||
{
|
{
|
||||||
const std::type_info& thisClass = typeid(*this);
|
const std::type_info& thisClass = typeid(*this);
|
||||||
return std::string(thisClass.name()) + "." + name();
|
return std::string(thisClass.name()) + "." + name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ protected:
|
|||||||
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
||||||
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
||||||
|
|
||||||
void assertEquals(const std::string& expected,
|
void assertEquals(const std::string& expected,
|
||||||
const std::string& actual,
|
const std::string& actual,
|
||||||
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
||||||
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
||||||
@ -151,7 +151,7 @@ protected:
|
|||||||
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
||||||
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
||||||
|
|
||||||
void assertNull(const void* pointer,
|
void assertNull(const void* pointer,
|
||||||
const std::string& pointerExpression = "",
|
const std::string& pointerExpression = "",
|
||||||
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
long lineNumber = CppUnitException::CPPUNIT_UNKNOWNLINENUMBER,
|
||||||
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
const std::string& fileName = CppUnitException::CPPUNIT_UNKNOWNFILENAME);
|
||||||
@ -185,14 +185,14 @@ inline TestCase::~TestCase()
|
|||||||
// Returns a count of all the tests executed
|
// Returns a count of all the tests executed
|
||||||
inline int TestCase::countTestCases()
|
inline int TestCase::countTestCases()
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns the name of the test case
|
// Returns the name of the test case
|
||||||
inline const std::string& TestCase::name() const
|
inline const std::string& TestCase::name() const
|
||||||
{
|
{
|
||||||
return _name;
|
return _name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -211,8 +211,8 @@ inline void TestCase::tearDown()
|
|||||||
// Returns the name of the test case instance
|
// Returns the name of the test case instance
|
||||||
inline std::string TestCase::toString()
|
inline std::string TestCase::toString()
|
||||||
{
|
{
|
||||||
const std::type_info& thisClass = typeid(*this);
|
const std::type_info& thisClass = typeid(*this);
|
||||||
return std::string(thisClass.name()) + "." + name();
|
return std::string(thisClass.name()) + "." + name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ inline TestFailure::TestFailure(Test* failedTest, CppUnitException* thrownExcept
|
|||||||
|
|
||||||
// Deletes the owned exception.
|
// Deletes the owned exception.
|
||||||
inline TestFailure::~TestFailure()
|
inline TestFailure::~TestFailure()
|
||||||
{
|
{
|
||||||
delete _thrownException;
|
delete _thrownException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ protected:
|
|||||||
// Construct a TestResult
|
// Construct a TestResult
|
||||||
inline TestResult::TestResult(): _syncObject(new SynchronizationObject())
|
inline TestResult::TestResult(): _syncObject(new SynchronizationObject())
|
||||||
{
|
{
|
||||||
_runTests = 0;
|
_runTests = 0;
|
||||||
_stop = false;
|
_stop = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ inline TestResult::TestResult(): _syncObject(new SynchronizationObject())
|
|||||||
// caused the error
|
// caused the error
|
||||||
inline void TestResult::addError(Test* test, CppUnitException* e)
|
inline void TestResult::addError(Test* test, CppUnitException* e)
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
_errors.push_back(new TestFailure(test, e));
|
_errors.push_back(new TestFailure(test, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ inline void TestResult::addError(Test* test, CppUnitException* e)
|
|||||||
// caused the failure.
|
// caused the failure.
|
||||||
inline void TestResult::addFailure(Test* test, CppUnitException* e)
|
inline void TestResult::addFailure(Test* test, CppUnitException* e)
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
_failures.push_back(new TestFailure(test, e));
|
_failures.push_back(new TestFailure(test, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ inline void TestResult::addFailure(Test* test, CppUnitException* e)
|
|||||||
// Informs the result that a test will be started.
|
// Informs the result that a test will be started.
|
||||||
inline void TestResult::startTest(Test* test)
|
inline void TestResult::startTest(Test* test)
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
_runTests++;
|
_runTests++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ inline void TestResult::endTest(Test* test)
|
|||||||
// Gets the number of run tests.
|
// Gets the number of run tests.
|
||||||
inline int TestResult::runTests()
|
inline int TestResult::runTests()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return _runTests;
|
return _runTests;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ inline int TestResult::runTests()
|
|||||||
// Gets the number of detected errors.
|
// Gets the number of detected errors.
|
||||||
inline int TestResult::testErrors()
|
inline int TestResult::testErrors()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return (int) _errors.size();
|
return (int) _errors.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ inline int TestResult::testErrors()
|
|||||||
// Gets the number of detected failures.
|
// Gets the number of detected failures.
|
||||||
inline int TestResult::testFailures()
|
inline int TestResult::testFailures()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return (int) _failures.size();
|
return (int) _failures.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,15 +177,15 @@ inline int TestResult::testFailures()
|
|||||||
// Returns whether the entire test was successful or not.
|
// Returns whether the entire test was successful or not.
|
||||||
inline bool TestResult::wasSuccessful()
|
inline bool TestResult::wasSuccessful()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return _failures.size() == 0 && _errors.size () == 0;
|
return _failures.size() == 0 && _errors.size () == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns a std::vector of the errors.
|
// Returns a std::vector of the errors.
|
||||||
inline std::vector<TestFailure*>& TestResult::errors()
|
inline std::vector<TestFailure*>& TestResult::errors()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return _errors;
|
return _errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +193,7 @@ inline std::vector<TestFailure*>& TestResult::errors()
|
|||||||
// Returns a std::vector of the failures.
|
// Returns a std::vector of the failures.
|
||||||
inline std::vector<TestFailure*>& TestResult::failures()
|
inline std::vector<TestFailure*>& TestResult::failures()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return _failures;
|
return _failures;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ inline std::vector<TestFailure*>& TestResult::failures()
|
|||||||
// Returns whether testing should be stopped
|
// Returns whether testing should be stopped
|
||||||
inline bool TestResult::shouldStop()
|
inline bool TestResult::shouldStop()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
return _stop;
|
return _stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ inline bool TestResult::shouldStop()
|
|||||||
// Stop testing
|
// Stop testing
|
||||||
inline void TestResult::stop()
|
inline void TestResult::stop()
|
||||||
{
|
{
|
||||||
ExclusiveZone zone(_syncObject);
|
ExclusiveZone zone(_syncObject);
|
||||||
_stop = true;
|
_stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ inline void TestResult::stop()
|
|||||||
// TestResult assumes ownership of the object
|
// TestResult assumes ownership of the object
|
||||||
inline void TestResult::setSynchronizationObject(SynchronizationObject* syncObject)
|
inline void TestResult::setSynchronizationObject(SynchronizationObject* syncObject)
|
||||||
{
|
{
|
||||||
delete _syncObject;
|
delete _syncObject;
|
||||||
_syncObject = syncObject;
|
_syncObject = syncObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,14 +24,14 @@ class CppUnit_API TestSetup: public TestDecorator
|
|||||||
REFERENCEOBJECT (TestSetup)
|
REFERENCEOBJECT (TestSetup)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TestSetup(Test* test): TestDecorator(test)
|
TestSetup(Test* test): TestDecorator(test)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void run(TestResult* result);
|
void run(TestResult* result);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setUp()
|
void setUp()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ protected:
|
|||||||
inline void TestSetup::run(TestResult* result)
|
inline void TestSetup::run(TestResult* result)
|
||||||
{
|
{
|
||||||
setUp();
|
setUp();
|
||||||
TestDecorator::run(result);
|
TestDecorator::run(result);
|
||||||
tearDown();
|
tearDown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ inline void TestSuite::addTest(Test* test)
|
|||||||
// Returns a std::string representation of the test suite.
|
// Returns a std::string representation of the test suite.
|
||||||
inline std::string TestSuite::toString()
|
inline std::string TestSuite::toString()
|
||||||
{
|
{
|
||||||
return "suite " + _name;
|
return "suite " + _name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,26 +32,26 @@ inline std::string estring(std::string& expandedString)
|
|||||||
// Create a std::string from an int
|
// Create a std::string from an int
|
||||||
inline std::string estring(int number)
|
inline std::string estring(int number)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "%d", number);
|
sprintf(buffer, "%d", number);
|
||||||
return std::string (buffer);
|
return std::string (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create a string from a long
|
// Create a string from a long
|
||||||
inline std::string estring(long number)
|
inline std::string estring(long number)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "%ld", number);
|
sprintf(buffer, "%ld", number);
|
||||||
return std::string (buffer);
|
return std::string (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Create a std::string from a double
|
// Create a std::string from a double
|
||||||
inline std::string estring(double number)
|
inline std::string estring(double number)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "%lf", number);
|
sprintf(buffer, "%lf", number);
|
||||||
return std::string(buffer);
|
return std::string(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,8 +59,8 @@ inline std::string estring(double number)
|
|||||||
// Create a std::string from a double
|
// Create a std::string from a double
|
||||||
inline std::string estring(const void* ptr)
|
inline std::string estring(const void* ptr)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
sprintf(buffer, "%p", ptr);
|
sprintf(buffer, "%p", ptr);
|
||||||
return std::string(buffer);
|
return std::string(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,11 +111,11 @@ void TestCase::run(TestResult *result)
|
|||||||
result->startTest(this);
|
result->startTest(this);
|
||||||
|
|
||||||
setUp();
|
setUp();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
runTest();
|
runTest();
|
||||||
}
|
}
|
||||||
catch (CppUnitException& e)
|
catch (CppUnitException& e)
|
||||||
{
|
{
|
||||||
CppUnitException* copy = new CppUnitException(e);
|
CppUnitException* copy = new CppUnitException(e);
|
||||||
result->addFailure(this, copy);
|
result->addFailure(this, copy);
|
||||||
|
@ -29,7 +29,7 @@ int TestDecorator::countTestCases()
|
|||||||
void TestDecorator::run(TestResult* result)
|
void TestDecorator::run(TestResult* result)
|
||||||
{
|
{
|
||||||
_test->run(result);
|
_test->run(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string TestDecorator::toString()
|
std::string TestDecorator::toString()
|
||||||
|
@ -34,7 +34,7 @@ TestRunner::~TestRunner()
|
|||||||
|
|
||||||
void TestRunner::printBanner()
|
void TestRunner::printBanner()
|
||||||
{
|
{
|
||||||
_ostr
|
_ostr
|
||||||
<< "Usage: driver [-all] [-print] [-wait] [name] ..." << std::endl
|
<< "Usage: driver [-all] [-print] [-wait] [name] ..." << std::endl
|
||||||
<< " where name is the name of a test case class" << std::endl;
|
<< " where name is the name of a test case class" << std::endl;
|
||||||
}
|
}
|
||||||
@ -49,10 +49,10 @@ bool TestRunner::run(const std::vector<std::string>& args)
|
|||||||
bool wait = false;
|
bool wait = false;
|
||||||
bool printed = false;
|
bool printed = false;
|
||||||
|
|
||||||
for (int i = 1; i < args.size(); i++)
|
for (int i = 1; i < args.size(); i++)
|
||||||
{
|
{
|
||||||
const std::string& arg = args[i];
|
const std::string& arg = args[i];
|
||||||
if (arg == "-wait")
|
if (arg == "-wait")
|
||||||
{
|
{
|
||||||
wait = true;
|
wait = true;
|
||||||
continue;
|
continue;
|
||||||
@ -64,7 +64,7 @@ bool TestRunner::run(const std::vector<std::string>& args)
|
|||||||
}
|
}
|
||||||
else if (arg == "-print")
|
else if (arg == "-print")
|
||||||
{
|
{
|
||||||
for (Mappings::iterator it = _mappings.begin(); it != _mappings.end(); ++it)
|
for (Mappings::iterator it = _mappings.begin(); it != _mappings.end(); ++it)
|
||||||
{
|
{
|
||||||
print(it->first, it->second, 0);
|
print(it->first, it->second, 0);
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ bool TestRunner::run(const std::vector<std::string>& args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Test* testToRun = 0;
|
Test* testToRun = 0;
|
||||||
for (Mappings::iterator it = _mappings.begin(); !testToRun && it != _mappings.end(); ++it)
|
for (Mappings::iterator it = _mappings.begin(); !testToRun && it != _mappings.end(); ++it)
|
||||||
{
|
{
|
||||||
testToRun = find(testCase, it->second, it->first);
|
testToRun = find(testCase, it->second, it->first);
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ bool TestRunner::run(const std::vector<std::string>& args)
|
|||||||
}
|
}
|
||||||
numberOfTests++;
|
numberOfTests++;
|
||||||
|
|
||||||
if (!testToRun)
|
if (!testToRun)
|
||||||
{
|
{
|
||||||
_ostr << "Test " << testCase << " not found." << std::endl;
|
_ostr << "Test " << testCase << " not found." << std::endl;
|
||||||
return false;
|
return false;
|
||||||
@ -103,20 +103,20 @@ bool TestRunner::run(const std::vector<std::string>& args)
|
|||||||
|
|
||||||
if (all)
|
if (all)
|
||||||
{
|
{
|
||||||
for (Mappings::iterator it = _mappings.begin(); it != _mappings.end(); ++it)
|
for (Mappings::iterator it = _mappings.begin(); it != _mappings.end(); ++it)
|
||||||
{
|
{
|
||||||
if (!run(it->second)) success = false;
|
if (!run(it->second)) success = false;
|
||||||
numberOfTests++;
|
numberOfTests++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numberOfTests == 0 && !printed)
|
if (numberOfTests == 0 && !printed)
|
||||||
{
|
{
|
||||||
printBanner();
|
printBanner();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wait)
|
if (wait)
|
||||||
{
|
{
|
||||||
_ostr << "<RETURN> to continue" << std::endl;
|
_ostr << "<RETURN> to continue" << std::endl;
|
||||||
std::cin.get();
|
std::cin.get();
|
||||||
|
@ -21,7 +21,7 @@ void TestSuite::deleteContents()
|
|||||||
// Runs the tests and collects their result in a TestResult.
|
// Runs the tests and collects their result in a TestResult.
|
||||||
void TestSuite::run(TestResult *result)
|
void TestSuite::run(TestResult *result)
|
||||||
{
|
{
|
||||||
for (std::vector<Test*>::iterator it = _tests.begin(); it != _tests.end(); ++it)
|
for (std::vector<Test*>::iterator it = _tests.begin(); it != _tests.end(); ++it)
|
||||||
{
|
{
|
||||||
if (result->shouldStop ())
|
if (result->shouldStop ())
|
||||||
break;
|
break;
|
||||||
|
@ -89,7 +89,7 @@ void TextTestResult::startTest(Test* test)
|
|||||||
|
|
||||||
void TextTestResult::printErrors(std::ostream& stream)
|
void TextTestResult::printErrors(std::ostream& stream)
|
||||||
{
|
{
|
||||||
if (testErrors() != 0)
|
if (testErrors() != 0)
|
||||||
{
|
{
|
||||||
stream << "\n";
|
stream << "\n";
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ void TextTestResult::printErrors(std::ostream& stream)
|
|||||||
<< ": "
|
<< ": "
|
||||||
<< failure->failedTest()->toString() << "\n"
|
<< failure->failedTest()->toString() << "\n"
|
||||||
<< " \"" << (e ? e->what() : "") << "\"\n"
|
<< " \"" << (e ? e->what() : "") << "\"\n"
|
||||||
<< " in \""
|
<< " in \""
|
||||||
<< (e ? e->fileName() : std::string())
|
<< (e ? e->fileName() : std::string())
|
||||||
<< "\", line ";
|
<< "\", line ";
|
||||||
if (e == 0)
|
if (e == 0)
|
||||||
@ -156,7 +156,7 @@ void TextTestResult::printFailures(std::ostream& stream)
|
|||||||
<< ": "
|
<< ": "
|
||||||
<< failure->failedTest()->toString() << "\n"
|
<< failure->failedTest()->toString() << "\n"
|
||||||
<< " \"" << (e ? e->what() : "") << "\"\n"
|
<< " \"" << (e ? e->what() : "") << "\"\n"
|
||||||
<< " in \""
|
<< " in \""
|
||||||
<< (e ? e->fileName() : std::string())
|
<< (e ? e->fileName() : std::string())
|
||||||
<< "\", line ";
|
<< "\", line ";
|
||||||
if (e == 0)
|
if (e == 0)
|
||||||
@ -168,7 +168,7 @@ void TextTestResult::printFailures(std::ostream& stream)
|
|||||||
stream << e->lineNumber();
|
stream << e->lineNumber();
|
||||||
if (e->data2LineNumber() != CppUnitException::CPPUNIT_UNKNOWNLINENUMBER)
|
if (e->data2LineNumber() != CppUnitException::CPPUNIT_UNKNOWNLINENUMBER)
|
||||||
{
|
{
|
||||||
stream << " data lines "
|
stream << " data lines "
|
||||||
<< e->data1LineNumber()
|
<< e->data1LineNumber()
|
||||||
<< ", " << e->data2LineNumber();
|
<< ", " << e->data2LineNumber();
|
||||||
}
|
}
|
||||||
@ -196,8 +196,8 @@ void TextTestResult::printHeader(std::ostream& stream)
|
|||||||
{
|
{
|
||||||
stream << "\n\n";
|
stream << "\n\n";
|
||||||
if (wasSuccessful())
|
if (wasSuccessful())
|
||||||
stream << "OK ("
|
stream << "OK ("
|
||||||
<< runTests() << " tests)"
|
<< runTests() << " tests)"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
else
|
else
|
||||||
stream << "!!!FAILURES!!!" << std::endl
|
stream << "!!!FAILURES!!!" << std::endl
|
||||||
|
@ -29,7 +29,7 @@ target_include_directories( "${LIBNAME}"
|
|||||||
PUBLIC
|
PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
$<INSTALL_INTERFACE:include>
|
$<INSTALL_INTERFACE:include>
|
||||||
PRIVATE
|
PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
${OPENSSL_INCLUDE_DIR}
|
${OPENSSL_INCLUDE_DIR}
|
||||||
)
|
)
|
||||||
|
@ -8,7 +8,7 @@ vc.project.platforms = Win32, x64, WinCE
|
|||||||
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
||||||
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
||||||
vc.project.compiler.include = ..\\Foundation\\include;..\\openssl\\include
|
vc.project.compiler.include = ..\\Foundation\\include;..\\openssl\\include
|
||||||
vc.project.compiler.defines =
|
vc.project.compiler.defines =
|
||||||
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS
|
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS
|
||||||
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
||||||
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
||||||
|
@ -75,10 +75,10 @@ class Crypto_API Cipher: public Poco::RefCountedObject
|
|||||||
/// // and write pass it to the underlying file stream.
|
/// // and write pass it to the underlying file stream.
|
||||||
/// Poco::FileOutputStream sink("encrypted.dat");
|
/// Poco::FileOutputStream sink("encrypted.dat");
|
||||||
/// CryptoOutputStream encryptor(sink, pCipher->createEncryptor());
|
/// CryptoOutputStream encryptor(sink, pCipher->createEncryptor());
|
||||||
///
|
///
|
||||||
/// Poco::FileInputStream source("source.txt");
|
/// Poco::FileInputStream source("source.txt");
|
||||||
/// Poco::StreamCopier::copyStream(source, encryptor);
|
/// Poco::StreamCopier::copyStream(source, encryptor);
|
||||||
///
|
///
|
||||||
/// // Always close output streams to flush all internal buffers
|
/// // Always close output streams to flush all internal buffers
|
||||||
/// encryptor.close();
|
/// encryptor.close();
|
||||||
/// sink.close();
|
/// sink.close();
|
||||||
|
@ -42,8 +42,8 @@ public:
|
|||||||
/// Destroys the CipherFactory.
|
/// Destroys the CipherFactory.
|
||||||
|
|
||||||
Cipher* createCipher(const CipherKey& key);
|
Cipher* createCipher(const CipherKey& key);
|
||||||
/// Creates a Cipher object for the given Cipher name. Valid cipher
|
/// Creates a Cipher object for the given Cipher name. Valid cipher
|
||||||
/// names depend on the OpenSSL version the library is linked with;
|
/// names depend on the OpenSSL version the library is linked with;
|
||||||
/// see the output of
|
/// see the output of
|
||||||
///
|
///
|
||||||
/// openssl enc --help
|
/// openssl enc --help
|
||||||
|
@ -38,7 +38,7 @@ class Crypto_API CipherKey
|
|||||||
/// file.
|
/// file.
|
||||||
///
|
///
|
||||||
/// To create a key using a human-readable password
|
/// To create a key using a human-readable password
|
||||||
/// string, use the following code. We create a AES Cipher and
|
/// string, use the following code. We create a AES Cipher and
|
||||||
/// use a salt value to make the key more robust:
|
/// use a salt value to make the key more robust:
|
||||||
///
|
///
|
||||||
/// std::string password = "secret";
|
/// std::string password = "secret";
|
||||||
@ -68,22 +68,22 @@ public:
|
|||||||
/// an iteration count of at least 1000.
|
/// an iteration count of at least 1000.
|
||||||
};
|
};
|
||||||
|
|
||||||
CipherKey(const std::string& name,
|
CipherKey(const std::string& name,
|
||||||
const std::string& passphrase,
|
const std::string& passphrase,
|
||||||
const std::string& salt = "",
|
const std::string& salt = "",
|
||||||
int iterationCount = DEFAULT_ITERATION_COUNT,
|
int iterationCount = DEFAULT_ITERATION_COUNT,
|
||||||
const std::string& digest = "md5");
|
const std::string& digest = "md5");
|
||||||
/// Creates a new CipherKeyImpl object using the given
|
/// Creates a new CipherKeyImpl object using the given
|
||||||
/// cipher name, passphrase, salt value, iteration count and digest.
|
/// cipher name, passphrase, salt value, iteration count and digest.
|
||||||
|
|
||||||
CipherKey(const std::string& name,
|
CipherKey(const std::string& name,
|
||||||
const ByteVec& key,
|
const ByteVec& key,
|
||||||
const ByteVec& iv);
|
const ByteVec& iv);
|
||||||
/// Creates a new CipherKeyImpl object using the given cipher
|
/// Creates a new CipherKeyImpl object using the given cipher
|
||||||
/// name, key and initialization vector.
|
/// name, key and initialization vector.
|
||||||
|
|
||||||
CipherKey(const std::string& name);
|
CipherKey(const std::string& name);
|
||||||
/// Creates a new CipherKeyImpl object. Autoinitializes key and
|
/// Creates a new CipherKeyImpl object. Autoinitializes key and
|
||||||
/// initialization vector.
|
/// initialization vector.
|
||||||
|
|
||||||
~CipherKey();
|
~CipherKey();
|
||||||
|
@ -60,11 +60,11 @@ public:
|
|||||||
/// the given cipher name, passphrase, salt value
|
/// the given cipher name, passphrase, salt value
|
||||||
/// and iteration count.
|
/// and iteration count.
|
||||||
|
|
||||||
CipherKeyImpl(const std::string& name,
|
CipherKeyImpl(const std::string& name,
|
||||||
const ByteVec& key,
|
const ByteVec& key,
|
||||||
const ByteVec& iv
|
const ByteVec& iv
|
||||||
);
|
);
|
||||||
/// Creates a new CipherKeyImpl object, using the
|
/// Creates a new CipherKeyImpl object, using the
|
||||||
/// given cipher name, key and initialization vector.
|
/// given cipher name, key and initialization vector.
|
||||||
|
|
||||||
CipherKeyImpl(const std::string& name);
|
CipherKeyImpl(const std::string& name);
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
// OS X 10.7 deprecates some OpenSSL functions
|
// OS X 10.7 deprecates some OpenSSL functions
|
||||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -33,20 +33,20 @@ enum RSAPaddingMode
|
|||||||
/// The padding mode used for RSA public key encryption.
|
/// The padding mode used for RSA public key encryption.
|
||||||
{
|
{
|
||||||
RSA_PADDING_PKCS1,
|
RSA_PADDING_PKCS1,
|
||||||
/// PKCS #1 v1.5 padding. This currently is the most widely used mode.
|
/// PKCS #1 v1.5 padding. This currently is the most widely used mode.
|
||||||
|
|
||||||
RSA_PADDING_PKCS1_OAEP,
|
RSA_PADDING_PKCS1_OAEP,
|
||||||
/// EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty
|
/// EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty
|
||||||
/// encoding parameter. This mode is recommended for all new applications.
|
/// encoding parameter. This mode is recommended for all new applications.
|
||||||
|
|
||||||
RSA_PADDING_SSLV23,
|
RSA_PADDING_SSLV23,
|
||||||
/// PKCS #1 v1.5 padding with an SSL-specific modification that denotes
|
/// PKCS #1 v1.5 padding with an SSL-specific modification that denotes
|
||||||
/// that the server is SSL3 capable.
|
/// that the server is SSL3 capable.
|
||||||
|
|
||||||
RSA_PADDING_NONE
|
RSA_PADDING_NONE
|
||||||
/// Raw RSA encryption. This mode should only be used to implement cryptographically
|
/// Raw RSA encryption. This mode should only be used to implement cryptographically
|
||||||
/// sound padding modes in the application code. Encrypting user data directly with RSA
|
/// sound padding modes in the application code. Encrypting user data directly with RSA
|
||||||
/// is insecure.
|
/// is insecure.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ void Crypto_API initializeCrypto();
|
|||||||
/// libraries, by calling OpenSSLInitializer::initialize().
|
/// libraries, by calling OpenSSLInitializer::initialize().
|
||||||
///
|
///
|
||||||
/// Should be called before using any class from the Crypto library.
|
/// Should be called before using any class from the Crypto library.
|
||||||
/// The Crypto library will be initialized automatically, through
|
/// The Crypto library will be initialized automatically, through
|
||||||
/// OpenSSLInitializer instances held by various Crypto classes
|
/// OpenSSLInitializer instances held by various Crypto classes
|
||||||
/// (Cipher, CipherKey, RSAKey, X509Certificate).
|
/// (Cipher, CipherKey, RSAKey, X509Certificate).
|
||||||
/// However, it is recommended to call initializeCrypto()
|
/// However, it is recommended to call initializeCrypto()
|
||||||
@ -120,7 +120,7 @@ void Crypto_API initializeCrypto();
|
|||||||
|
|
||||||
|
|
||||||
void Crypto_API uninitializeCrypto();
|
void Crypto_API uninitializeCrypto();
|
||||||
/// Uninitializes the Crypto library by calling
|
/// Uninitializes the Crypto library by calling
|
||||||
/// OpenSSLInitializer::uninitialize().
|
/// OpenSSLInitializer::uninitialize().
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,9 +45,9 @@ public:
|
|||||||
/// Returns the block size for this CryptoTransform.
|
/// Returns the block size for this CryptoTransform.
|
||||||
|
|
||||||
virtual int setPadding(int padding);
|
virtual int setPadding(int padding);
|
||||||
/// Enables or disables padding. By default encryption operations are padded using standard block
|
/// Enables or disables padding. By default encryption operations are padded using standard block
|
||||||
/// padding and the padding is checked and removed when decrypting. If the padding parameter is zero then
|
/// padding and the padding is checked and removed when decrypting. If the padding parameter is zero then
|
||||||
/// no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of
|
/// no padding is performed, the total amount of data encrypted or decrypted must then be a multiple of
|
||||||
/// the block size or an error will occur.
|
/// the block size or an error will occur.
|
||||||
|
|
||||||
virtual std::streamsize transform(const unsigned char* input,
|
virtual std::streamsize transform(const unsigned char* input,
|
||||||
|
@ -40,7 +40,7 @@ class Crypto_API ECDSADigestEngine: public Poco::DigestEngine
|
|||||||
/// signed. Then, the hash value is encrypted, using
|
/// signed. Then, the hash value is encrypted, using
|
||||||
/// the ECDSA private key.
|
/// the ECDSA private key.
|
||||||
///
|
///
|
||||||
/// To verify a signature, pass it to the verify()
|
/// To verify a signature, pass it to the verify()
|
||||||
/// member function. It will decrypt the signature
|
/// member function. It will decrypt the signature
|
||||||
/// using the ECDSA public key and compare the resulting
|
/// using the ECDSA public key and compare the resulting
|
||||||
/// hash with the actual hash of the data.
|
/// hash with the actual hash of the data.
|
||||||
@ -66,9 +66,9 @@ public:
|
|||||||
/// digest can be computed.
|
/// digest can be computed.
|
||||||
|
|
||||||
const DigestEngine::Digest& digest();
|
const DigestEngine::Digest& digest();
|
||||||
/// Finishes the computation of the digest
|
/// Finishes the computation of the digest
|
||||||
/// (the first time it's called) and
|
/// (the first time it's called) and
|
||||||
/// returns the message digest.
|
/// returns the message digest.
|
||||||
///
|
///
|
||||||
/// Can be called multiple times.
|
/// Can be called multiple times.
|
||||||
|
|
||||||
|
@ -62,8 +62,8 @@ public:
|
|||||||
|
|
||||||
ECKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
ECKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
||||||
/// Creates the ECKey, by reading public and private key from the given files and
|
/// Creates the ECKey, by reading public and private key from the given files and
|
||||||
/// using the given passphrase for the private key. Can only by used for signing if
|
/// using the given passphrase for the private key. Can only by used for signing if
|
||||||
/// a private key is available.
|
/// a private key is available.
|
||||||
|
|
||||||
ECKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
ECKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
||||||
/// Creates the ECKey. Can only by used for signing if pPrivKey
|
/// Creates the ECKey. Can only by used for signing if pPrivKey
|
||||||
@ -91,7 +91,7 @@ public:
|
|||||||
void save(const std::string& publicKeyFile,
|
void save(const std::string& publicKeyFile,
|
||||||
const std::string& privateKeyFile = "",
|
const std::string& privateKeyFile = "",
|
||||||
const std::string& privateKeyPassphrase = "") const;
|
const std::string& privateKeyPassphrase = "") const;
|
||||||
/// Exports the public and private keys to the given files.
|
/// Exports the public and private keys to the given files.
|
||||||
///
|
///
|
||||||
/// If an empty filename is specified, the corresponding key
|
/// If an empty filename is specified, the corresponding key
|
||||||
/// is not exported.
|
/// is not exported.
|
||||||
|
@ -57,7 +57,7 @@ public:
|
|||||||
virtual void save(const std::string& publicKeyPairFile,
|
virtual void save(const std::string& publicKeyPairFile,
|
||||||
const std::string& privateKeyPairFile = "",
|
const std::string& privateKeyPairFile = "",
|
||||||
const std::string& privateKeyPairPassphrase = "") const;
|
const std::string& privateKeyPairPassphrase = "") const;
|
||||||
/// Exports the public and private keys to the given files.
|
/// Exports the public and private keys to the given files.
|
||||||
///
|
///
|
||||||
/// If an empty filename is specified, the corresponding key
|
/// If an empty filename is specified, the corresponding key
|
||||||
/// is not exported.
|
/// is not exported.
|
||||||
|
@ -58,7 +58,7 @@ public:
|
|||||||
virtual void save(const std::string& publicKeyFile,
|
virtual void save(const std::string& publicKeyFile,
|
||||||
const std::string& privateKeyFile = "",
|
const std::string& privateKeyFile = "",
|
||||||
const std::string& privateKeyPassphrase = "") const = 0;
|
const std::string& privateKeyPassphrase = "") const = 0;
|
||||||
/// Exports the public and private keys to the given files.
|
/// Exports the public and private keys to the given files.
|
||||||
///
|
///
|
||||||
/// If an empty filename is specified, the corresponding key
|
/// If an empty filename is specified, the corresponding key
|
||||||
/// is not exported.
|
/// is not exported.
|
||||||
|
@ -30,9 +30,9 @@ namespace Crypto {
|
|||||||
|
|
||||||
|
|
||||||
class RSACipherImpl: public Cipher
|
class RSACipherImpl: public Cipher
|
||||||
/// An implementation of the Cipher class for
|
/// An implementation of the Cipher class for
|
||||||
/// asymmetric (public-private key) encryption
|
/// asymmetric (public-private key) encryption
|
||||||
/// based on the the RSA algorithm in OpenSSL's
|
/// based on the the RSA algorithm in OpenSSL's
|
||||||
/// crypto library.
|
/// crypto library.
|
||||||
///
|
///
|
||||||
/// Encryption is using the public key, decryption
|
/// Encryption is using the public key, decryption
|
||||||
|
@ -39,7 +39,7 @@ class Crypto_API RSADigestEngine: public Poco::DigestEngine
|
|||||||
/// signed. Then, the hash value is encrypted, using
|
/// signed. Then, the hash value is encrypted, using
|
||||||
/// the RSA private key.
|
/// the RSA private key.
|
||||||
///
|
///
|
||||||
/// To verify a signature, pass it to the verify()
|
/// To verify a signature, pass it to the verify()
|
||||||
/// member function. It will decrypt the signature
|
/// member function. It will decrypt the signature
|
||||||
/// using the RSA public key and compare the resulting
|
/// using the RSA public key and compare the resulting
|
||||||
/// hash with the actual hash of the data.
|
/// hash with the actual hash of the data.
|
||||||
@ -76,9 +76,9 @@ public:
|
|||||||
/// digest can be computed.
|
/// digest can be computed.
|
||||||
|
|
||||||
const DigestEngine::Digest& digest();
|
const DigestEngine::Digest& digest();
|
||||||
/// Finishes the computation of the digest
|
/// Finishes the computation of the digest
|
||||||
/// (the first time it's called) and
|
/// (the first time it's called) and
|
||||||
/// returns the message digest.
|
/// returns the message digest.
|
||||||
///
|
///
|
||||||
/// Can be called multiple times.
|
/// Can be called multiple times.
|
||||||
|
|
||||||
|
@ -67,8 +67,8 @@ public:
|
|||||||
|
|
||||||
RSAKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
RSAKeyImpl(const std::string& publicKeyFile, const std::string& privateKeyFile, const std::string& privateKeyPassphrase);
|
||||||
/// Creates the RSAKey, by reading public and private key from the given files and
|
/// Creates the RSAKey, by reading public and private key from the given files and
|
||||||
/// using the given passphrase for the private key. Can only by used for signing if
|
/// using the given passphrase for the private key. Can only by used for signing if
|
||||||
/// a private key is available.
|
/// a private key is available.
|
||||||
|
|
||||||
RSAKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
RSAKeyImpl(std::istream* pPublicKeyStream, std::istream* pPrivateKeyStream, const std::string& privateKeyPassphrase);
|
||||||
/// Creates the RSAKey. Can only by used for signing if pPrivKey
|
/// Creates the RSAKey. Can only by used for signing if pPrivKey
|
||||||
@ -99,7 +99,7 @@ public:
|
|||||||
void save(const std::string& publicKeyFile,
|
void save(const std::string& publicKeyFile,
|
||||||
const std::string& privateKeyFile = "",
|
const std::string& privateKeyFile = "",
|
||||||
const std::string& privateKeyPassphrase = "") const;
|
const std::string& privateKeyPassphrase = "") const;
|
||||||
/// Exports the public and private keys to the given files.
|
/// Exports the public and private keys to the given files.
|
||||||
///
|
///
|
||||||
/// If an empty filename is specified, the corresponding key
|
/// If an empty filename is specified, the corresponding key
|
||||||
/// is not exported.
|
/// is not exported.
|
||||||
|
@ -62,13 +62,13 @@ public:
|
|||||||
|
|
||||||
explicit X509Certificate(X509* pCert);
|
explicit X509Certificate(X509* pCert);
|
||||||
/// Creates the X509Certificate from an existing
|
/// Creates the X509Certificate from an existing
|
||||||
/// OpenSSL certificate. Ownership is taken of
|
/// OpenSSL certificate. Ownership is taken of
|
||||||
/// the certificate.
|
/// the certificate.
|
||||||
|
|
||||||
X509Certificate(X509* pCert, bool shared);
|
X509Certificate(X509* pCert, bool shared);
|
||||||
/// Creates the X509Certificate from an existing
|
/// Creates the X509Certificate from an existing
|
||||||
/// OpenSSL certificate. Ownership is taken of
|
/// OpenSSL certificate. Ownership is taken of
|
||||||
/// the certificate. If shared is true, the
|
/// the certificate. If shared is true, the
|
||||||
/// certificate's reference count is incremented.
|
/// certificate's reference count is incremented.
|
||||||
|
|
||||||
X509Certificate(const X509Certificate& cert);
|
X509Certificate(const X509Certificate& cert);
|
||||||
@ -76,7 +76,7 @@ public:
|
|||||||
|
|
||||||
X509Certificate& operator = (const X509Certificate& cert);
|
X509Certificate& operator = (const X509Certificate& cert);
|
||||||
/// Assigns a certificate.
|
/// Assigns a certificate.
|
||||||
|
|
||||||
void swap(X509Certificate& cert);
|
void swap(X509Certificate& cert);
|
||||||
/// Exchanges the certificate with another one.
|
/// Exchanges the certificate with another one.
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ public:
|
|||||||
/// string in decimal encoding.
|
/// string in decimal encoding.
|
||||||
|
|
||||||
const std::string& issuerName() const;
|
const std::string& issuerName() const;
|
||||||
/// Returns the certificate issuer's distinguished name.
|
/// Returns the certificate issuer's distinguished name.
|
||||||
|
|
||||||
std::string issuerName(NID nid) const;
|
std::string issuerName(NID nid) const;
|
||||||
/// Extracts the information specified by the given
|
/// Extracts the information specified by the given
|
||||||
|
@ -26,7 +26,7 @@ namespace Crypto {
|
|||||||
|
|
||||||
|
|
||||||
CipherKeyImpl::CipherKeyImpl(const std::string& name,
|
CipherKeyImpl::CipherKeyImpl(const std::string& name,
|
||||||
const std::string& passphrase,
|
const std::string& passphrase,
|
||||||
const std::string& salt,
|
const std::string& salt,
|
||||||
int iterationCount,
|
int iterationCount,
|
||||||
const std::string& digest): _pCipher(0),
|
const std::string& digest): _pCipher(0),
|
||||||
@ -54,8 +54,8 @@ CipherKeyImpl::CipherKeyImpl(const std::string& name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CipherKeyImpl::CipherKeyImpl(const std::string& name,
|
CipherKeyImpl::CipherKeyImpl(const std::string& name,
|
||||||
const ByteVec& key,
|
const ByteVec& key,
|
||||||
const ByteVec& iv): _pCipher(0),
|
const ByteVec& iv): _pCipher(0),
|
||||||
_pDigest(0),
|
_pDigest(0),
|
||||||
_name(name),
|
_name(name),
|
||||||
|
@ -28,7 +28,7 @@ CryptoTransform::~CryptoTransform()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CryptoTransform::setPadding(int padding)
|
int CryptoTransform::setPadding(int padding)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -77,8 +77,8 @@ ECKeyImpl::ECKeyImpl(int curve):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ECKeyImpl::ECKeyImpl(const std::string& publicKeyFile,
|
ECKeyImpl::ECKeyImpl(const std::string& publicKeyFile,
|
||||||
const std::string& privateKeyFile,
|
const std::string& privateKeyFile,
|
||||||
const std::string& privateKeyPassphrase): KeyPairImpl("ec", KT_EC_IMPL), _pEC(0)
|
const std::string& privateKeyPassphrase): KeyPairImpl("ec", KT_EC_IMPL), _pEC(0)
|
||||||
{
|
{
|
||||||
if (EVPPKey::loadKey(&_pEC, PEM_read_PrivateKey, EVP_PKEY_get1_EC_KEY, privateKeyFile, privateKeyPassphrase))
|
if (EVPPKey::loadKey(&_pEC, PEM_read_PrivateKey, EVP_PKEY_get1_EC_KEY, privateKeyFile, privateKeyPassphrase))
|
||||||
|
@ -87,8 +87,8 @@ void OpenSSLInitializer::initialize()
|
|||||||
// https://sourceforge.net/p/poco/bugs/110/
|
// https://sourceforge.net/p/poco/bugs/110/
|
||||||
//
|
//
|
||||||
// From http://www.openssl.org/docs/crypto/threads.html :
|
// From http://www.openssl.org/docs/crypto/threads.html :
|
||||||
// "If the application does not register such a callback using CRYPTO_THREADID_set_callback(),
|
// "If the application does not register such a callback using CRYPTO_THREADID_set_callback(),
|
||||||
// then a default implementation is used - on Windows and BeOS this uses the system's
|
// then a default implementation is used - on Windows and BeOS this uses the system's
|
||||||
// default thread identifying APIs"
|
// default thread identifying APIs"
|
||||||
#ifndef OPENSSL_NO_DEPRECATED
|
#ifndef OPENSSL_NO_DEPRECATED
|
||||||
CRYPTO_set_id_callback(&OpenSSLInitializer::id);
|
CRYPTO_set_id_callback(&OpenSSLInitializer::id);
|
||||||
|
@ -90,8 +90,8 @@ RSAKeyImpl::RSAKeyImpl(int keyLength, unsigned long exponent): KeyPairImpl("rsa"
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RSAKeyImpl::RSAKeyImpl(const std::string& publicKeyFile,
|
RSAKeyImpl::RSAKeyImpl(const std::string& publicKeyFile,
|
||||||
const std::string& privateKeyFile,
|
const std::string& privateKeyFile,
|
||||||
const std::string& privateKeyPassphrase): KeyPairImpl("rsa", KT_RSA_IMPL),
|
const std::string& privateKeyPassphrase): KeyPairImpl("rsa", KT_RSA_IMPL),
|
||||||
_pRSA(0)
|
_pRSA(0)
|
||||||
{
|
{
|
||||||
@ -109,7 +109,7 @@ RSAKeyImpl::RSAKeyImpl(const std::string& publicKeyFile,
|
|||||||
if (!pubKey)
|
if (!pubKey)
|
||||||
{
|
{
|
||||||
int rc = BIO_reset(bio);
|
int rc = BIO_reset(bio);
|
||||||
// BIO_reset() normally returns 1 for success and 0 or -1 for failure.
|
// BIO_reset() normally returns 1 for success and 0 or -1 for failure.
|
||||||
// File BIOs are an exception, they return 0 for success and -1 for failure.
|
// File BIOs are an exception, they return 0 for success and -1 for failure.
|
||||||
if (rc != 0) throw Poco::FileException("Failed to load public key", publicKeyFile);
|
if (rc != 0) throw Poco::FileException("Failed to load public key", publicKeyFile);
|
||||||
pubKey = PEM_read_bio_RSA_PUBKEY(bio, &_pRSA, 0, 0);
|
pubKey = PEM_read_bio_RSA_PUBKEY(bio, &_pRSA, 0, 0);
|
||||||
@ -174,7 +174,7 @@ RSAKeyImpl::RSAKeyImpl(std::istream* pPublicKeyStream,
|
|||||||
if (!publicKey)
|
if (!publicKey)
|
||||||
{
|
{
|
||||||
int rc = BIO_reset(bio);
|
int rc = BIO_reset(bio);
|
||||||
// BIO_reset() normally returns 1 for success and 0 or -1 for failure.
|
// BIO_reset() normally returns 1 for success and 0 or -1 for failure.
|
||||||
// File BIOs are an exception, they return 0 for success and -1 for failure.
|
// File BIOs are an exception, they return 0 for success and -1 for failure.
|
||||||
if (rc != 1) throw Poco::FileException("Failed to load public key");
|
if (rc != 1) throw Poco::FileException("Failed to load public key");
|
||||||
publicKey = PEM_read_bio_RSA_PUBKEY(bio, &_pRSA, 0, 0);
|
publicKey = PEM_read_bio_RSA_PUBKEY(bio, &_pRSA, 0, 0);
|
||||||
@ -306,8 +306,8 @@ void RSAKeyImpl::save(const std::string& publicKeyFile,
|
|||||||
if (privateKeyPassphrase.empty())
|
if (privateKeyPassphrase.empty())
|
||||||
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, 0, 0, 0, 0, 0);
|
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, 0, 0, 0, 0, 0);
|
||||||
else
|
else
|
||||||
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, EVP_des_ede3_cbc(),
|
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, EVP_des_ede3_cbc(),
|
||||||
reinterpret_cast<unsigned char*>(const_cast<char*>(privateKeyPassphrase.c_str())),
|
reinterpret_cast<unsigned char*>(const_cast<char*>(privateKeyPassphrase.c_str())),
|
||||||
static_cast<int>(privateKeyPassphrase.length()), 0, 0);
|
static_cast<int>(privateKeyPassphrase.length()), 0, 0);
|
||||||
if (!rc) throw Poco::FileException("Failed to write private key to file", privateKeyFile);
|
if (!rc) throw Poco::FileException("Failed to write private key to file", privateKeyFile);
|
||||||
}
|
}
|
||||||
@ -350,10 +350,10 @@ void RSAKeyImpl::save(std::ostream* pPublicKeyStream,
|
|||||||
if (privateKeyPassphrase.empty())
|
if (privateKeyPassphrase.empty())
|
||||||
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, 0, 0, 0, 0, 0);
|
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, 0, 0, 0, 0, 0);
|
||||||
else
|
else
|
||||||
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, EVP_des_ede3_cbc(),
|
rc = PEM_write_bio_RSAPrivateKey(bio, _pRSA, EVP_des_ede3_cbc(),
|
||||||
reinterpret_cast<unsigned char*>(const_cast<char*>(privateKeyPassphrase.c_str())),
|
reinterpret_cast<unsigned char*>(const_cast<char*>(privateKeyPassphrase.c_str())),
|
||||||
static_cast<int>(privateKeyPassphrase.length()), 0, 0);
|
static_cast<int>(privateKeyPassphrase.length()), 0, 0);
|
||||||
if (!rc)
|
if (!rc)
|
||||||
{
|
{
|
||||||
BIO_free(bio);
|
BIO_free(bio);
|
||||||
throw Poco::FileException("Failed to write private key to stream");
|
throw Poco::FileException("Failed to write private key to stream");
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// fix for WIN32 header conflict
|
// fix for WIN32 header conflict
|
||||||
#undef X509_NAME
|
#undef X509_NAME
|
||||||
#endif
|
#endif
|
||||||
#include <openssl/x509v3.h>
|
#include <openssl/x509v3.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
@ -154,7 +154,7 @@ void X509Certificate::save(std::ostream& stream) const
|
|||||||
if (!pBIO) throw Poco::IOException("Cannot create BIO for writing certificate");
|
if (!pBIO) throw Poco::IOException("Cannot create BIO for writing certificate");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!PEM_write_bio_X509(pBIO, _pCert))
|
if (!PEM_write_bio_X509(pBIO, _pCert))
|
||||||
throw Poco::IOException("Failed to write certificate to stream");
|
throw Poco::IOException("Failed to write certificate to stream");
|
||||||
|
|
||||||
char *pData;
|
char *pData;
|
||||||
@ -182,7 +182,7 @@ void X509Certificate::save(const std::string& path) const
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!PEM_write_bio_X509(pBIO, _pCert))
|
if (!PEM_write_bio_X509(pBIO, _pCert))
|
||||||
throw Poco::WriteFileException("Failed to write certificate to file", path);
|
throw Poco::WriteFileException("Failed to write certificate to file", path);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@ -247,7 +247,7 @@ std::string X509Certificate::subjectName(NID nid) const
|
|||||||
|
|
||||||
void X509Certificate::extractNames(std::string& cmnName, std::set<std::string>& domainNames) const
|
void X509Certificate::extractNames(std::string& cmnName, std::set<std::string>& domainNames) const
|
||||||
{
|
{
|
||||||
domainNames.clear();
|
domainNames.clear();
|
||||||
if (STACK_OF(GENERAL_NAME)* names = static_cast<STACK_OF(GENERAL_NAME)*>(X509_get_ext_d2i(_pCert, NID_subject_alt_name, 0, 0)))
|
if (STACK_OF(GENERAL_NAME)* names = static_cast<STACK_OF(GENERAL_NAME)*>(X509_get_ext_d2i(_pCert, NID_subject_alt_name, 0, 0)))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < sk_GENERAL_NAME_num(names); ++i)
|
for (int i = 0; i < sk_GENERAL_NAME_num(names); ++i)
|
||||||
@ -262,7 +262,7 @@ void X509Certificate::extractNames(std::string& cmnName, std::set<std::string>&
|
|||||||
}
|
}
|
||||||
GENERAL_NAMES_free(names);
|
GENERAL_NAMES_free(names);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmnName = commonName();
|
cmnName = commonName();
|
||||||
if (!cmnName.empty() && domainNames.empty())
|
if (!cmnName.empty() && domainNames.empty())
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
Bag Attributes
|
Bag Attributes
|
||||||
friendlyName: vally
|
friendlyName: vally
|
||||||
localKeyID: ED 49 E2 A7 BA 66 AF 36 58 98 85 03 44 85 AE 96 38 03 61 70
|
localKeyID: ED 49 E2 A7 BA 66 AF 36 58 98 85 03 44 85 AE 96 38 03 61 70
|
||||||
subject=/C=CH/ST=Zug/O=Crypto Vally/CN=CV Server
|
subject=/C=CH/ST=Zug/O=Crypto Vally/CN=CV Server
|
||||||
issuer=/C=CH/ST=Zug/O=Crypto Vally/CN=CV Intermediate CA v3
|
issuer=/C=CH/ST=Zug/O=Crypto Vally/CN=CV Intermediate CA v3
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
@ -105,7 +105,7 @@ D9vIMsVTPxxnOIRWskE=
|
|||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
Bag Attributes
|
Bag Attributes
|
||||||
friendlyName: vally
|
friendlyName: vally
|
||||||
localKeyID: ED 49 E2 A7 BA 66 AF 36 58 98 85 03 44 85 AE 96 38 03 61 70
|
localKeyID: ED 49 E2 A7 BA 66 AF 36 58 98 85 03 44 85 AE 96 38 03 61 70
|
||||||
Key Attributes: <No Attributes>
|
Key Attributes: <No Attributes>
|
||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXPX+EQwbPNE83
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXPX+EQwbPNE83
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
class CryptoTest: public CppUnit::TestCase
|
class CryptoTest: public CppUnit::TestCase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MAX_DATA_SIZE = 10000
|
MAX_DATA_SIZE = 10000
|
||||||
};
|
};
|
||||||
|
@ -8,7 +8,7 @@ vc.project.platforms = Win32, x64, WinCE
|
|||||||
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md
|
||||||
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
vc.project.prototype = ${vc.project.name}_vs90.vcproj
|
||||||
vc.project.compiler.include = ..\\Foundation\\include
|
vc.project.compiler.include = ..\\Foundation\\include
|
||||||
vc.project.compiler.defines =
|
vc.project.compiler.defines =
|
||||||
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS
|
vc.project.compiler.defines.shared = ${vc.project.name}_EXPORTS
|
||||||
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared}
|
||||||
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared}
|
||||||
|
@ -108,7 +108,7 @@ public:
|
|||||||
/// Binds a null.
|
/// Binds a null.
|
||||||
|
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::vector<Poco::Int8>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::vector<Poco::Int8>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::deque<Poco::Int8>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::deque<Poco::Int8>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
@ -136,25 +136,25 @@ public:
|
|||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::deque<Poco::Int32>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::deque<Poco::Int32>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::list<Poco::Int32>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::list<Poco::Int32>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::vector<Poco::UInt32>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::vector<Poco::UInt32>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::deque<Poco::UInt32>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::deque<Poco::UInt32>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::list<Poco::UInt32>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::list<Poco::UInt32>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::vector<Poco::Int64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::vector<Poco::Int64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::deque<Poco::Int64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::deque<Poco::Int64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::list<Poco::Int64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::list<Poco::Int64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::vector<Poco::UInt64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::vector<Poco::UInt64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::deque<Poco::UInt64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::deque<Poco::UInt64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::list<Poco::UInt64>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::list<Poco::UInt64>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
virtual void bind(std::size_t pos, const std::vector<bool>& val, Direction dir = PD_IN);
|
virtual void bind(std::size_t pos, const std::vector<bool>& val, Direction dir = PD_IN);
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ private:
|
|||||||
/// Don't copy the binder
|
/// Don't copy the binder
|
||||||
|
|
||||||
virtual void bind(std::size_t, const char* const&, Direction, const WhenNullCb& )
|
virtual void bind(std::size_t, const char* const&, Direction, const WhenNullCb& )
|
||||||
/// Binds a const char ptr.
|
/// Binds a const char ptr.
|
||||||
/// This is a private no-op in this implementation
|
/// This is a private no-op in this implementation
|
||||||
/// due to security risk.
|
/// due to security risk.
|
||||||
{
|
{
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// Note: to avoid static (de)initialization problems,
|
// Note: to avoid static (de)initialization problems,
|
||||||
// during connector automatic (un)registration, it is
|
// during connector automatic (un)registration, it is
|
||||||
// best to have this as a macro.
|
// best to have this as a macro.
|
||||||
#define POCO_DATA_MYSQL_CONNECTOR_NAME "mysql"
|
#define POCO_DATA_MYSQL_CONNECTOR_NAME "mysql"
|
||||||
|
|
||||||
@ -67,14 +67,14 @@ public:
|
|||||||
} } } // namespace Poco::Data::MySQL
|
} } } // namespace Poco::Data::MySQL
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Automatic Connector registration
|
// Automatic Connector registration
|
||||||
//
|
//
|
||||||
|
|
||||||
struct MySQL_API MySQLConnectorRegistrator
|
struct MySQL_API MySQLConnectorRegistrator
|
||||||
/// Connector registering class.
|
/// Connector registering class.
|
||||||
/// A global instance of this class is instantiated
|
/// A global instance of this class is instantiated
|
||||||
/// with sole purpose to automatically register the
|
/// with sole purpose to automatically register the
|
||||||
/// MySQL connector with central Poco Data registry.
|
/// MySQL connector with central Poco Data registry.
|
||||||
{
|
{
|
||||||
MySQLConnectorRegistrator()
|
MySQLConnectorRegistrator()
|
||||||
@ -120,9 +120,9 @@ struct MySQL_API MySQLConnectorRegistrator
|
|||||||
POCO_DATA_MYSQL_FORCE_SYMBOL(pocoMySQLConnectorRegistrator)
|
POCO_DATA_MYSQL_FORCE_SYMBOL(pocoMySQLConnectorRegistrator)
|
||||||
#endif // POCO_NO_AUTOMATIC_LIB_INIT
|
#endif // POCO_NO_AUTOMATIC_LIB_INIT
|
||||||
|
|
||||||
//
|
//
|
||||||
// End automatic Connector registration
|
// End automatic Connector registration
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
#endif // Data_MySQL_Connector_INCLUDED
|
#endif // Data_MySQL_Connector_INCLUDED
|
||||||
|
@ -32,7 +32,7 @@ namespace Data {
|
|||||||
namespace MySQL {
|
namespace MySQL {
|
||||||
|
|
||||||
// End-user include this file and use in code ConnectionException/StatementException
|
// End-user include this file and use in code ConnectionException/StatementException
|
||||||
// So it need not know
|
// So it need not know
|
||||||
|
|
||||||
class MySQL_API MySQLException: public Poco::Data::DataException
|
class MySQL_API MySQLException: public Poco::Data::DataException
|
||||||
/// Base class for all MySQL exceptions
|
/// Base class for all MySQL exceptions
|
||||||
|
@ -268,7 +268,7 @@ MYSQL_BIND* Binder::getBindArray() const
|
|||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
//
|
//
|
||||||
// Private
|
// Private
|
||||||
//
|
//
|
||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
@ -293,7 +293,7 @@ void Binder::realBind(std::size_t pos, enum_field_types type, const void* buffer
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Int8>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Int8>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -305,13 +305,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Int8>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Int8>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Int8>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt8>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt8>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -323,13 +323,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::UInt8>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::UInt8>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::UInt8>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Int16>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Int16>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -341,13 +341,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Int16>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Int16>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Int16>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt16>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt16>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -359,13 +359,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::UInt16>& val, Directio
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::UInt16>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::UInt16>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Int32>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Int32>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -377,13 +377,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Int32>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Int32>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Int32>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt32>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt32>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -395,13 +395,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::UInt32>& val, Directio
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::UInt32>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::UInt32>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Int64>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Int64>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -413,13 +413,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Int64>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Int64>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Int64>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt64>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::UInt64>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -431,13 +431,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::UInt64>& val, Directio
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::UInt64>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::UInt64>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<bool>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<bool>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -449,13 +449,13 @@ void Binder::bind(std::size_t pos, const std::deque<bool>& val, Direction dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<bool>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<bool>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<float>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<float>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -467,13 +467,13 @@ void Binder::bind(std::size_t pos, const std::deque<float>& val, Direction dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<float>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<float>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<double>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<double>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -485,13 +485,13 @@ void Binder::bind(std::size_t pos, const std::deque<double>& val, Direction dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<double>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<double>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<char>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<char>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -503,13 +503,13 @@ void Binder::bind(std::size_t pos, const std::deque<char>& val, Direction dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<char>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<char>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::BLOB>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::BLOB>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -521,13 +521,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Data::BLOB>& val, Dire
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Data::BLOB>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Data::BLOB>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::CLOB>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::CLOB>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -539,13 +539,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Data::CLOB>& val, Dire
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Data::CLOB>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Data::CLOB>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::DateTime>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::DateTime>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -557,13 +557,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::DateTime>& val, Direct
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::DateTime>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::DateTime>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::Date>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::Date>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -575,13 +575,13 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Data::Date>& val, Dire
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Data::Date>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Data::Date>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::Time>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<Poco::Data::Time>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -593,7 +593,7 @@ void Binder::bind(std::size_t pos, const std::deque<Poco::Data::Time>& val, Dire
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<Poco::Data::Time>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<Poco::Data::Time>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -617,7 +617,7 @@ void Binder::bind(std::size_t pos, const std::list<Poco::Data::NullData>& val, D
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::vector<std::string>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::vector<std::string>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
@ -629,7 +629,7 @@ void Binder::bind(std::size_t pos, const std::deque<std::string>& val, Direction
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Binder::bind(std::size_t pos, const std::list<std::string>& val, Direction dir)
|
void Binder::bind(std::size_t pos, const std::list<std::string>& val, Direction dir)
|
||||||
{
|
{
|
||||||
throw NotImplementedException();
|
throw NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -20,10 +20,10 @@ namespace MySQL {
|
|||||||
|
|
||||||
|
|
||||||
MySQLStatementImpl::MySQLStatementImpl(SessionImpl& h) :
|
MySQLStatementImpl::MySQLStatementImpl(SessionImpl& h) :
|
||||||
Poco::Data::StatementImpl(h),
|
Poco::Data::StatementImpl(h),
|
||||||
_stmt(h.handle()),
|
_stmt(h.handle()),
|
||||||
_pBinder(new Binder),
|
_pBinder(new Binder),
|
||||||
_pExtractor(new Extractor(_stmt, _metadata)),
|
_pExtractor(new Extractor(_stmt, _metadata)),
|
||||||
_hasNext(NEXT_DONTKNOW)
|
_hasNext(NEXT_DONTKNOW)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ namespace
|
|||||||
|
|
||||||
switch (field.type)
|
switch (field.type)
|
||||||
{
|
{
|
||||||
case MYSQL_TYPE_TINY:
|
case MYSQL_TYPE_TINY:
|
||||||
if (unsig) return Poco::Data::MetaColumn::FDT_UINT8;
|
if (unsig) return Poco::Data::MetaColumn::FDT_UINT8;
|
||||||
return Poco::Data::MetaColumn::FDT_INT8;
|
return Poco::Data::MetaColumn::FDT_INT8;
|
||||||
|
|
||||||
@ -95,19 +95,19 @@ namespace
|
|||||||
return Poco::Data::MetaColumn::FDT_INT16;
|
return Poco::Data::MetaColumn::FDT_INT16;
|
||||||
|
|
||||||
case MYSQL_TYPE_INT24:
|
case MYSQL_TYPE_INT24:
|
||||||
case MYSQL_TYPE_LONG:
|
case MYSQL_TYPE_LONG:
|
||||||
if (unsig) return Poco::Data::MetaColumn::FDT_UINT32;
|
if (unsig) return Poco::Data::MetaColumn::FDT_UINT32;
|
||||||
return Poco::Data::MetaColumn::FDT_INT32;
|
return Poco::Data::MetaColumn::FDT_INT32;
|
||||||
|
|
||||||
case MYSQL_TYPE_FLOAT:
|
case MYSQL_TYPE_FLOAT:
|
||||||
return Poco::Data::MetaColumn::FDT_FLOAT;
|
return Poco::Data::MetaColumn::FDT_FLOAT;
|
||||||
|
|
||||||
case MYSQL_TYPE_DECIMAL:
|
case MYSQL_TYPE_DECIMAL:
|
||||||
case MYSQL_TYPE_NEWDECIMAL:
|
case MYSQL_TYPE_NEWDECIMAL:
|
||||||
case MYSQL_TYPE_DOUBLE:
|
case MYSQL_TYPE_DOUBLE:
|
||||||
return Poco::Data::MetaColumn::FDT_DOUBLE;
|
return Poco::Data::MetaColumn::FDT_DOUBLE;
|
||||||
|
|
||||||
case MYSQL_TYPE_LONGLONG:
|
case MYSQL_TYPE_LONGLONG:
|
||||||
if (unsig) return Poco::Data::MetaColumn::FDT_UINT64;
|
if (unsig) return Poco::Data::MetaColumn::FDT_UINT64;
|
||||||
return Poco::Data::MetaColumn::FDT_INT64;
|
return Poco::Data::MetaColumn::FDT_INT64;
|
||||||
|
|
||||||
@ -226,12 +226,12 @@ std::size_t ResultMetadata::length(std::size_t pos) const
|
|||||||
return _lengths[pos];
|
return _lengths[pos];
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned char* ResultMetadata::rawData(std::size_t pos) const
|
const unsigned char* ResultMetadata::rawData(std::size_t pos) const
|
||||||
{
|
{
|
||||||
return reinterpret_cast<const unsigned char*>(_row[pos].buffer);
|
return reinterpret_cast<const unsigned char*>(_row[pos].buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ResultMetadata::isNull(std::size_t pos) const
|
bool ResultMetadata::isNull(std::size_t pos) const
|
||||||
{
|
{
|
||||||
return (_isNull[pos] != 0);
|
return (_isNull[pos] != 0);
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ const std::string SessionImpl::MYSQL_REPEATABLE_READ = "REPEATABLE READ";
|
|||||||
const std::string SessionImpl::MYSQL_SERIALIZABLE = "SERIALIZABLE";
|
const std::string SessionImpl::MYSQL_SERIALIZABLE = "SERIALIZABLE";
|
||||||
|
|
||||||
|
|
||||||
SessionImpl::SessionImpl(const std::string& connectionString, std::size_t loginTimeout) :
|
SessionImpl::SessionImpl(const std::string& connectionString, std::size_t loginTimeout) :
|
||||||
Poco::Data::AbstractSessionImpl<SessionImpl>(connectionString, loginTimeout),
|
Poco::Data::AbstractSessionImpl<SessionImpl>(connectionString, loginTimeout),
|
||||||
_handle(0),
|
_handle(0),
|
||||||
_connected(false),
|
_connected(false),
|
||||||
@ -88,7 +88,7 @@ void SessionImpl::open(const std::string& connect)
|
|||||||
options["character-set"] = "utf8";
|
options["character-set"] = "utf8";
|
||||||
|
|
||||||
const std::string& connString = connectionString();
|
const std::string& connString = connectionString();
|
||||||
for (std::string::const_iterator start = connString.begin();;)
|
for (std::string::const_iterator start = connString.begin();;)
|
||||||
{
|
{
|
||||||
std::string::const_iterator finish = std::find(start, connString.end(), ';');
|
std::string::const_iterator finish = std::find(start, connString.end(), ';');
|
||||||
std::string::const_iterator middle = std::find(start, finish, '=');
|
std::string::const_iterator middle = std::find(start, finish, '=');
|
||||||
@ -101,7 +101,7 @@ void SessionImpl::open(const std::string& connect)
|
|||||||
if ((finish == connString.end()) || (finish + 1 == connString.end())) break;
|
if ((finish == connString.end()) || (finish + 1 == connString.end())) break;
|
||||||
|
|
||||||
start = finish + 1;
|
start = finish + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options["user"].empty())
|
if (options["user"].empty())
|
||||||
throw MySQLException("create session: specify user name");
|
throw MySQLException("create session: specify user name");
|
||||||
@ -139,14 +139,14 @@ void SessionImpl::open(const std::string& connect)
|
|||||||
_handle.options(MYSQL_SET_CHARSET_NAME, options["character-set"].c_str());
|
_handle.options(MYSQL_SET_CHARSET_NAME, options["character-set"].c_str());
|
||||||
|
|
||||||
// Real connect
|
// Real connect
|
||||||
_handle.connect(options["host"].c_str(),
|
_handle.connect(options["host"].c_str(),
|
||||||
options["user"].c_str(),
|
options["user"].c_str(),
|
||||||
options["password"].c_str(),
|
options["password"].c_str(),
|
||||||
db,
|
db,
|
||||||
port);
|
port);
|
||||||
|
|
||||||
addFeature("autoCommit",
|
addFeature("autoCommit",
|
||||||
&SessionImpl::autoCommit,
|
&SessionImpl::autoCommit,
|
||||||
&SessionImpl::isAutoCommit);
|
&SessionImpl::isAutoCommit);
|
||||||
|
|
||||||
_connected = true;
|
_connected = true;
|
||||||
|
@ -119,7 +119,7 @@ bool StatementExecutor::fetch()
|
|||||||
int res = mysql_stmt_fetch(_pHandle);
|
int res = mysql_stmt_fetch(_pHandle);
|
||||||
|
|
||||||
// we have specified zero buffers for BLOBs, so DATA_TRUNCATED is normal in this case
|
// we have specified zero buffers for BLOBs, so DATA_TRUNCATED is normal in this case
|
||||||
if ((res != 0) && (res != MYSQL_NO_DATA) && (res != MYSQL_DATA_TRUNCATED))
|
if ((res != 0) && (res != MYSQL_NO_DATA) && (res != MYSQL_DATA_TRUNCATED))
|
||||||
throw StatementException("mysql_stmt_fetch error", _pHandle, _query);
|
throw StatementException("mysql_stmt_fetch error", _pHandle, _query);
|
||||||
|
|
||||||
return (res == 0) || (res == MYSQL_DATA_TRUNCATED);
|
return (res == 0) || (res == MYSQL_DATA_TRUNCATED);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
class MySQLTest: public CppUnit::TestCase
|
class MySQLTest: public CppUnit::TestCase
|
||||||
/// MySQL test class
|
/// MySQL test class
|
||||||
/// Tested:
|
/// Tested:
|
||||||
///
|
///
|
||||||
/// Driver | DB | OS
|
/// Driver | DB | OS
|
||||||
/// ----------------+---------------------------+------------------------------------------
|
/// ----------------+---------------------------+------------------------------------------
|
||||||
/// 03.51.12.00 | MySQL 5.0.27-community-nt | MS Windows XP Professional x64 v.2003/SP1
|
/// 03.51.12.00 | MySQL 5.0.27-community-nt | MS Windows XP Professional x64 v.2003/SP1
|
||||||
|
@ -152,7 +152,7 @@ private:
|
|||||||
} } // namespace Poco::Data
|
} } // namespace Poco::Data
|
||||||
|
|
||||||
|
|
||||||
SQLExecutor::SQLExecutor(const std::string& name, Poco::Data::Session* pSession):
|
SQLExecutor::SQLExecutor(const std::string& name, Poco::Data::Session* pSession):
|
||||||
CppUnit::TestCase(name),
|
CppUnit::TestCase(name),
|
||||||
_pSession(pSession)
|
_pSession(pSession)
|
||||||
{
|
{
|
||||||
@ -179,14 +179,14 @@ void SQLExecutor::bareboneMySQLTest(const std::string& host, const std::string&
|
|||||||
mysql_real_query(hsession, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
mysql_real_query(hsession, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
||||||
|
|
||||||
sql = tableCreateString;
|
sql = tableCreateString;
|
||||||
int rc = mysql_stmt_prepare(hstmt, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
int rc = mysql_stmt_prepare(hstmt, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
||||||
poco_assert (rc == 0);
|
poco_assert (rc == 0);
|
||||||
|
|
||||||
rc = mysql_stmt_execute(hstmt);
|
rc = mysql_stmt_execute(hstmt);
|
||||||
poco_assert (rc == 0);
|
poco_assert (rc == 0);
|
||||||
|
|
||||||
sql = "INSERT INTO Test VALUES (?,?,?,?,?)";
|
sql = "INSERT INTO Test VALUES (?,?,?,?,?)";
|
||||||
rc = mysql_stmt_prepare(hstmt, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
rc = mysql_stmt_prepare(hstmt, sql.c_str(), static_cast<unsigned long>(sql.length()));
|
||||||
poco_assert (rc == 0);
|
poco_assert (rc == 0);
|
||||||
|
|
||||||
std::string str[3] = { "111", "222", "333" };
|
std::string str[3] = { "111", "222", "333" };
|
||||||
@ -289,10 +289,10 @@ void SQLExecutor::simpleAccess()
|
|||||||
std::string result;
|
std::string result;
|
||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Statement stmt(*_pSession);
|
Statement stmt(*_pSession);
|
||||||
stmt << "INSERT INTO Person VALUES (?,?,?,?)", use(lastName), use(firstName), use(address), use(age);//, now;
|
stmt << "INSERT INTO Person VALUES (?,?,?,?)", use(lastName), use(firstName), use(address), use(age);//, now;
|
||||||
stmt.execute();
|
stmt.execute();
|
||||||
}
|
}
|
||||||
catch(ConnectionException& ce){ std::cout << ce.displayText() << std::endl; fail (funct); }
|
catch(ConnectionException& ce){ std::cout << ce.displayText() << std::endl; fail (funct); }
|
||||||
@ -1132,7 +1132,7 @@ void SQLExecutor::selectIntoSingleStep()
|
|||||||
catch(StatementException& se){ std::cout << se.displayText() << std::endl; fail (funct); }
|
catch(StatementException& se){ std::cout << se.displayText() << std::endl; fail (funct); }
|
||||||
poco_assert (count == 2);
|
poco_assert (count == 2);
|
||||||
Person result;
|
Person result;
|
||||||
Statement stmt = (*_pSession << "SELECT * FROM Person", into(result), limit(1));
|
Statement stmt = (*_pSession << "SELECT * FROM Person", into(result), limit(1));
|
||||||
stmt.execute();
|
stmt.execute();
|
||||||
poco_assert (result == p1);
|
poco_assert (result == p1);
|
||||||
poco_assert (!stmt.done());
|
poco_assert (!stmt.done());
|
||||||
@ -1595,7 +1595,7 @@ void SQLExecutor::tupleVector()
|
|||||||
typedef Tuple<int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int> TupleType;
|
typedef Tuple<int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int> TupleType;
|
||||||
std::string funct = "tupleVector()";
|
std::string funct = "tupleVector()";
|
||||||
TupleType t(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
|
TupleType t(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
|
||||||
Tuple<int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int>
|
Tuple<int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int>
|
||||||
t10(10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29);
|
t10(10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29);
|
||||||
TupleType t100(100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119);
|
TupleType t100(100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119);
|
||||||
std::vector<TupleType> v;
|
std::vector<TupleType> v;
|
||||||
@ -1683,8 +1683,8 @@ void SQLExecutor::internalExtraction()
|
|||||||
catch(ConnectionException& ce){ std::cout << ce.displayText() << std::endl; fail (funct); }
|
catch(ConnectionException& ce){ std::cout << ce.displayText() << std::endl; fail (funct); }
|
||||||
catch(StatementException& se){ std::cout << se.displayText() << std::endl; fail (funct); }
|
catch(StatementException& se){ std::cout << se.displayText() << std::endl; fail (funct); }
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Statement stmt = (*_pSession << "SELECT * FROM Vectors", now);
|
Statement stmt = (*_pSession << "SELECT * FROM Vectors", now);
|
||||||
RecordSet rset(stmt);
|
RecordSet rset(stmt);
|
||||||
|
|
||||||
@ -1788,9 +1788,9 @@ void SQLExecutor::doNull()
|
|||||||
{
|
{
|
||||||
std::string funct = "null()";
|
std::string funct = "null()";
|
||||||
|
|
||||||
*_pSession << "INSERT INTO Vectors VALUES (?, ?, ?)",
|
*_pSession << "INSERT INTO Vectors VALUES (?, ?, ?)",
|
||||||
use(Poco::Data::Keywords::null),
|
use(Poco::Data::Keywords::null),
|
||||||
use(Poco::Data::Keywords::null),
|
use(Poco::Data::Keywords::null),
|
||||||
use(Poco::Data::Keywords::null), now;
|
use(Poco::Data::Keywords::null), now;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@ -1823,12 +1823,12 @@ void SQLExecutor::doNull()
|
|||||||
|
|
||||||
|
|
||||||
void SQLExecutor::setTransactionIsolation(Session& session, Poco::UInt32 ti)
|
void SQLExecutor::setTransactionIsolation(Session& session, Poco::UInt32 ti)
|
||||||
{
|
{
|
||||||
if (session.hasTransactionIsolation(ti))
|
if (session.hasTransactionIsolation(ti))
|
||||||
{
|
{
|
||||||
std::string funct = "setTransactionIsolation()";
|
std::string funct = "setTransactionIsolation()";
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Transaction t(session, false);
|
Transaction t(session, false);
|
||||||
t.setIsolation(ti);
|
t.setIsolation(ti);
|
||||||
@ -2129,9 +2129,9 @@ void SQLExecutor::reconnect()
|
|||||||
poco_assert (_pSession->isConnected());
|
poco_assert (_pSession->isConnected());
|
||||||
_pSession->close();
|
_pSession->close();
|
||||||
poco_assert (!_pSession->isConnected());
|
poco_assert (!_pSession->isConnected());
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
(*_pSession) << "SELECT LastName FROM Person", into(result), now;
|
(*_pSession) << "SELECT LastName FROM Person", into(result), now;
|
||||||
fail ("must fail");
|
fail ("must fail");
|
||||||
}
|
}
|
||||||
catch(NotConnectedException&){ }
|
catch(NotConnectedException&){ }
|
||||||
|
@ -37,7 +37,7 @@ public:
|
|||||||
~SQLExecutor();
|
~SQLExecutor();
|
||||||
|
|
||||||
void bareboneMySQLTest(const std::string& host, const std::string& user, const std::string& pwd, const std::string& db, const std::string& port, const char* tableCreateString);
|
void bareboneMySQLTest(const std::string& host, const std::string& user, const std::string& pwd, const std::string& db, const std::string& port, const char* tableCreateString);
|
||||||
/// This function uses "bare bone" MySQL API calls (i.e. calls are not
|
/// This function uses "bare bone" MySQL API calls (i.e. calls are not
|
||||||
/// "wrapped" in PocoData framework structures).
|
/// "wrapped" in PocoData framework structures).
|
||||||
/// The purpose of the function is to verify that driver behaves
|
/// The purpose of the function is to verify that driver behaves
|
||||||
/// correctly. If this test passes, subsequent tests failures are likely ours.
|
/// correctly. If this test passes, subsequent tests failures are likely ours.
|
||||||
|
@ -10,7 +10,7 @@ include ODBC.make
|
|||||||
|
|
||||||
objects = Binder ConnectionHandle Connector EnvironmentHandle \
|
objects = Binder ConnectionHandle Connector EnvironmentHandle \
|
||||||
Extractor ODBCException ODBCMetaColumn ODBCStatementImpl \
|
Extractor ODBCException ODBCMetaColumn ODBCStatementImpl \
|
||||||
Parameter Preparator SessionImpl TypeInfo Unicode Utility
|
Parameter Preparator SessionImpl TypeInfo Unicode Utility
|
||||||
|
|
||||||
target = PocoDataODBC
|
target = PocoDataODBC
|
||||||
target_version = $(LIBVERSION)
|
target_version = $(LIBVERSION)
|
||||||
|
@ -361,7 +361,7 @@ public:
|
|||||||
/// Returns bound data size for parameter at specified position.
|
/// Returns bound data size for parameter at specified position.
|
||||||
|
|
||||||
void synchronize();
|
void synchronize();
|
||||||
/// Transfers the results of non-POD outbound parameters from internal
|
/// Transfers the results of non-POD outbound parameters from internal
|
||||||
/// holders back into the externally supplied buffers.
|
/// holders back into the externally supplied buffers.
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
@ -394,7 +394,7 @@ private:
|
|||||||
/// Sets the description field for the parameter, if needed.
|
/// Sets the description field for the parameter, if needed.
|
||||||
|
|
||||||
void bind(std::size_t pos, const char* const& pVal, Direction dir, const WhenNullCb& nullCb);
|
void bind(std::size_t pos, const char* const& pVal, Direction dir, const WhenNullCb& nullCb);
|
||||||
/// Binds a const char ptr.
|
/// Binds a const char ptr.
|
||||||
/// This is a private no-op in this implementation
|
/// This is a private no-op in this implementation
|
||||||
/// due to security risk.
|
/// due to security risk.
|
||||||
|
|
||||||
@ -417,14 +417,14 @@ private:
|
|||||||
}
|
}
|
||||||
_lengthIndicator.push_back(pLenIn);
|
_lengthIndicator.push_back(pLenIn);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
cDataType,
|
cDataType,
|
||||||
Utility::sqlDataType(cDataType),
|
Utility::sqlDataType(cDataType),
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER)&val, 0,
|
(SQLPOINTER)&val, 0,
|
||||||
_lengthIndicator.back())))
|
_lengthIndicator.back())))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter()");
|
throw StatementException(_rStmt, "SQLBindParameter()");
|
||||||
@ -454,15 +454,15 @@ private:
|
|||||||
_lengthIndicator.push_back(pLenIn);
|
_lengthIndicator.push_back(pLenIn);
|
||||||
SQLSMALLINT sqlType = (isInBound(dir) && size <= _maxVarBinColSize) ? SQL_VARBINARY : SQL_LONGVARBINARY;
|
SQLSMALLINT sqlType = (isInBound(dir) && size <= _maxVarBinColSize) ? SQL_VARBINARY : SQL_LONGVARBINARY;
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
SQL_PARAM_INPUT,
|
SQL_PARAM_INPUT,
|
||||||
SQL_C_BINARY,
|
SQL_C_BINARY,
|
||||||
sqlType,
|
sqlType,
|
||||||
(SQLUINTEGER) size,
|
(SQLUINTEGER) size,
|
||||||
0,
|
0,
|
||||||
pVal,
|
pVal,
|
||||||
(SQLINTEGER) size,
|
(SQLINTEGER) size,
|
||||||
_lengthIndicator.back())))
|
_lengthIndicator.back())))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(LOB)");
|
throw StatementException(_rStmt, "SQLBindParameter(LOB)");
|
||||||
@ -487,15 +487,15 @@ private:
|
|||||||
_vecLengthIndicator[pos] = new LengthVec(length);
|
_vecLengthIndicator[pos] = new LengthVec(length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
cDataType,
|
cDataType,
|
||||||
Utility::sqlDataType(cDataType),
|
Utility::sqlDataType(cDataType),
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER) &val[0],
|
(SQLPOINTER) &val[0],
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter()");
|
throw StatementException(_rStmt, "SQLBindParameter()");
|
||||||
@ -548,15 +548,15 @@ private:
|
|||||||
typename C::const_iterator end = val.end();
|
typename C::const_iterator end = val.end();
|
||||||
for (int i = 0; it != end; ++it, ++i) _boolPtrs[pos][i] = *it;
|
for (int i = 0; it != end; ++it, ++i) _boolPtrs[pos][i] = *it;
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
cDataType,
|
cDataType,
|
||||||
Utility::sqlDataType(cDataType),
|
Utility::sqlDataType(cDataType),
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER) &_boolPtrs[pos][0],
|
(SQLPOINTER) &_boolPtrs[pos][0],
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter()");
|
throw StatementException(_rStmt, "SQLBindParameter()");
|
||||||
@ -616,15 +616,15 @@ private:
|
|||||||
}
|
}
|
||||||
SQLSMALLINT sqlType = (isInBound(dir) && size < _maxCharColLength) ? SQL_VARCHAR : SQL_LONGVARCHAR;
|
SQLSMALLINT sqlType = (isInBound(dir) && size < _maxCharColLength) ? SQL_VARCHAR : SQL_LONGVARCHAR;
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
SQL_C_CHAR,
|
SQL_C_CHAR,
|
||||||
sqlType,
|
sqlType,
|
||||||
(SQLUINTEGER) size - 1,
|
(SQLUINTEGER) size - 1,
|
||||||
0,
|
0,
|
||||||
_charPtrs[pos],
|
_charPtrs[pos],
|
||||||
(SQLINTEGER) size,
|
(SQLINTEGER) size,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(std::vector<std::string>)");
|
throw StatementException(_rStmt, "SQLBindParameter(std::vector<std::string>)");
|
||||||
@ -726,7 +726,7 @@ private:
|
|||||||
std::vector<SQLLEN>::iterator lIt = _vecLengthIndicator[pos]->begin();
|
std::vector<SQLLEN>::iterator lIt = _vecLengthIndicator[pos]->begin();
|
||||||
std::vector<SQLLEN>::iterator lEnd = _vecLengthIndicator[pos]->end();
|
std::vector<SQLLEN>::iterator lEnd = _vecLengthIndicator[pos]->end();
|
||||||
typename C::const_iterator cIt = val.begin();
|
typename C::const_iterator cIt = val.begin();
|
||||||
for (; lIt != lEnd; ++lIt, ++cIt)
|
for (; lIt != lEnd; ++lIt, ++cIt)
|
||||||
{
|
{
|
||||||
SQLLEN sz = static_cast<SQLLEN>(cIt->size());
|
SQLLEN sz = static_cast<SQLLEN>(cIt->size());
|
||||||
if (sz > size) size = static_cast<SQLINTEGER>(sz);
|
if (sz > size) size = static_cast<SQLINTEGER>(sz);
|
||||||
@ -753,15 +753,15 @@ private:
|
|||||||
}
|
}
|
||||||
SQLSMALLINT sqlType = (isInBound(dir) && size <= _maxVarBinColSize) ? SQL_VARBINARY : SQL_LONGVARBINARY;
|
SQLSMALLINT sqlType = (isInBound(dir) && size <= _maxVarBinColSize) ? SQL_VARBINARY : SQL_LONGVARBINARY;
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
SQL_PARAM_INPUT,
|
SQL_PARAM_INPUT,
|
||||||
SQL_C_BINARY,
|
SQL_C_BINARY,
|
||||||
sqlType,
|
sqlType,
|
||||||
(SQLUINTEGER) size,
|
(SQLUINTEGER) size,
|
||||||
0,
|
0,
|
||||||
_charPtrs[pos],
|
_charPtrs[pos],
|
||||||
(SQLINTEGER) size,
|
(SQLINTEGER) size,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(std::vector<BLOB>)");
|
throw StatementException(_rStmt, "SQLBindParameter(std::vector<BLOB>)");
|
||||||
@ -802,15 +802,15 @@ private:
|
|||||||
SQLSMALLINT decDigits = 0;
|
SQLSMALLINT decDigits = 0;
|
||||||
getColSizeAndPrecision(pos, SQL_TYPE_DATE, colSize, decDigits);
|
getColSizeAndPrecision(pos, SQL_TYPE_DATE, colSize, decDigits);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
SQL_C_TYPE_DATE,
|
SQL_C_TYPE_DATE,
|
||||||
SQL_TYPE_DATE,
|
SQL_TYPE_DATE,
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER) &(*_dateVecVec[pos])[0],
|
(SQLPOINTER) &(*_dateVecVec[pos])[0],
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(Date[])");
|
throw StatementException(_rStmt, "SQLBindParameter(Date[])");
|
||||||
@ -850,15 +850,15 @@ private:
|
|||||||
SQLSMALLINT decDigits = 0;
|
SQLSMALLINT decDigits = 0;
|
||||||
getColSizeAndPrecision(pos, SQL_TYPE_TIME, colSize, decDigits);
|
getColSizeAndPrecision(pos, SQL_TYPE_TIME, colSize, decDigits);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
SQL_C_TYPE_TIME,
|
SQL_C_TYPE_TIME,
|
||||||
SQL_TYPE_TIME,
|
SQL_TYPE_TIME,
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER) &(*_timeVecVec[pos])[0],
|
(SQLPOINTER) &(*_timeVecVec[pos])[0],
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(Time[])");
|
throw StatementException(_rStmt, "SQLBindParameter(Time[])");
|
||||||
@ -899,15 +899,15 @@ private:
|
|||||||
SQLSMALLINT decDigits = 0;
|
SQLSMALLINT decDigits = 0;
|
||||||
getColSizeAndPrecision(pos, SQL_TYPE_TIMESTAMP, colSize, decDigits);
|
getColSizeAndPrecision(pos, SQL_TYPE_TIMESTAMP, colSize, decDigits);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
toODBCDirection(dir),
|
toODBCDirection(dir),
|
||||||
SQL_C_TYPE_TIMESTAMP,
|
SQL_C_TYPE_TIMESTAMP,
|
||||||
SQL_TYPE_TIMESTAMP,
|
SQL_TYPE_TIMESTAMP,
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
(SQLPOINTER) &(*_dateTimeVecVec[pos])[0],
|
(SQLPOINTER) &(*_dateTimeVecVec[pos])[0],
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter(Time[])");
|
throw StatementException(_rStmt, "SQLBindParameter(Time[])");
|
||||||
@ -941,31 +941,31 @@ private:
|
|||||||
SQLSMALLINT colType = _pTypeInfo->tryTypeidToCType(bindElemType, SQL_C_STINYINT);
|
SQLSMALLINT colType = _pTypeInfo->tryTypeidToCType(bindElemType, SQL_C_STINYINT);
|
||||||
getColSizeAndPrecision(pos, colType, colSize, decDigits);
|
getColSizeAndPrecision(pos, colType, colSize, decDigits);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindParameter(_rStmt,
|
if (Utility::isError(SQLBindParameter(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
SQL_PARAM_INPUT,
|
SQL_PARAM_INPUT,
|
||||||
colType,
|
colType,
|
||||||
Utility::sqlDataType(colType),
|
Utility::sqlDataType(colType),
|
||||||
colSize,
|
colSize,
|
||||||
decDigits,
|
decDigits,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
&(*_vecLengthIndicator[pos])[0])))
|
&(*_vecLengthIndicator[pos])[0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindParameter()");
|
throw StatementException(_rStmt, "SQLBindParameter()");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void getColSizeAndPrecision(std::size_t pos,
|
void getColSizeAndPrecision(std::size_t pos,
|
||||||
SQLSMALLINT cDataType,
|
SQLSMALLINT cDataType,
|
||||||
SQLINTEGER& colSize,
|
SQLINTEGER& colSize,
|
||||||
SQLSMALLINT& decDigits);
|
SQLSMALLINT& decDigits);
|
||||||
/// Used to retrieve column size and precision.
|
/// Used to retrieve column size and precision.
|
||||||
/// Not all drivers cooperate with this inquiry under all circumstances
|
/// Not all drivers cooperate with this inquiry under all circumstances
|
||||||
/// This function runs for query and stored procedure parameters (in and
|
/// This function runs for query and stored procedure parameters (in and
|
||||||
/// out-bound). Some drivers, however, do not care about knowing this
|
/// out-bound). Some drivers, however, do not care about knowing this
|
||||||
/// information to start with. For that reason, after all the attempts
|
/// information to start with. For that reason, after all the attempts
|
||||||
/// to discover the required values are unsuccessfully exhausted, the values
|
/// to discover the required values are unsuccessfully exhausted, the values
|
||||||
/// are both set to zero and no exception is thrown.
|
/// are both set to zero and no exception is thrown.
|
||||||
|
|
||||||
void setParamSetSize(std::size_t length);
|
void setParamSetSize(std::size_t length);
|
||||||
@ -974,7 +974,7 @@ private:
|
|||||||
void getColumnOrParameterSize(std::size_t pos, SQLINTEGER& size);
|
void getColumnOrParameterSize(std::size_t pos, SQLINTEGER& size);
|
||||||
/// Fills the column or parameter size into the 'size' argument.
|
/// Fills the column or parameter size into the 'size' argument.
|
||||||
/// Does nothing if neither can be obtained from the driver, so
|
/// Does nothing if neither can be obtained from the driver, so
|
||||||
/// size should be set to some default value prior to calling this
|
/// size should be set to some default value prior to calling this
|
||||||
/// function in order to avoid undefined size value.
|
/// function in order to avoid undefined size value.
|
||||||
|
|
||||||
void freeMemory();
|
void freeMemory();
|
||||||
@ -984,9 +984,9 @@ private:
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
void getMinValueSize(T& val, SQLINTEGER& size)
|
void getMinValueSize(T& val, SQLINTEGER& size)
|
||||||
/// Some ODBC drivers return DB-wide maximum allowed size for variable size columns,
|
/// Some ODBC drivers return DB-wide maximum allowed size for variable size columns,
|
||||||
/// rather than the allowed size for the actual column. In such cases, the length is
|
/// rather than the allowed size for the actual column. In such cases, the length is
|
||||||
/// automatically resized to the maximum field size allowed by the session.
|
/// automatically resized to the maximum field size allowed by the session.
|
||||||
/// This function, in order to prevent unnecessary memory allocation, does further
|
/// This function, in order to prevent unnecessary memory allocation, does further
|
||||||
/// optimization, looking for the maximum length within supplied data container and
|
/// optimization, looking for the maximum length within supplied data container and
|
||||||
/// uses the smaller of maximum found and maximum predefined data length.
|
/// uses the smaller of maximum found and maximum predefined data length.
|
||||||
{
|
{
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// Note: to avoid static (de)initialization problems,
|
// Note: to avoid static (de)initialization problems,
|
||||||
// during connector automatic (un)registration, it is
|
// during connector automatic (un)registration, it is
|
||||||
// best to have this as a macro.
|
// best to have this as a macro.
|
||||||
#define POCO_DATA_ODBC_CONNECTOR_NAME "odbc"
|
#define POCO_DATA_ODBC_CONNECTOR_NAME "odbc"
|
||||||
|
|
||||||
@ -75,14 +75,14 @@ inline const std::string& Connector::name() const
|
|||||||
} } } // namespace Poco::Data::ODBC
|
} } } // namespace Poco::Data::ODBC
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Automatic Connector registration
|
// Automatic Connector registration
|
||||||
//
|
//
|
||||||
|
|
||||||
struct ODBC_API ODBCConnectorRegistrator
|
struct ODBC_API ODBCConnectorRegistrator
|
||||||
/// Connector registering class.
|
/// Connector registering class.
|
||||||
/// A global instance of this class is instantiated
|
/// A global instance of this class is instantiated
|
||||||
/// with sole purpose to automatically register the
|
/// with sole purpose to automatically register the
|
||||||
/// ODBC connector with central Poco Data registry.
|
/// ODBC connector with central Poco Data registry.
|
||||||
{
|
{
|
||||||
ODBCConnectorRegistrator()
|
ODBCConnectorRegistrator()
|
||||||
@ -128,9 +128,9 @@ struct ODBC_API ODBCConnectorRegistrator
|
|||||||
POCO_DATA_ODBC_FORCE_SYMBOL(pocoODBCConnectorRegistrator)
|
POCO_DATA_ODBC_FORCE_SYMBOL(pocoODBCConnectorRegistrator)
|
||||||
#endif // POCO_NO_AUTOMATIC_LIB_INIT
|
#endif // POCO_NO_AUTOMATIC_LIB_INIT
|
||||||
|
|
||||||
//
|
//
|
||||||
// End automatic Connector registration
|
// End automatic Connector registration
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
#endif // Data_ODBC_Connector_INCLUDED
|
#endif // Data_ODBC_Connector_INCLUDED
|
||||||
|
@ -36,7 +36,7 @@ template <typename H, SQLSMALLINT handleType>
|
|||||||
class Diagnostics
|
class Diagnostics
|
||||||
/// Utility class providing functionality for retrieving ODBC diagnostic
|
/// Utility class providing functionality for retrieving ODBC diagnostic
|
||||||
/// records. Diagnostics object must be created with corresponding handle
|
/// records. Diagnostics object must be created with corresponding handle
|
||||||
/// as constructor argument. During construction, diagnostic records fields
|
/// as constructor argument. During construction, diagnostic records fields
|
||||||
/// are populated and the object is ready for querying.
|
/// are populated and the object is ready for querying.
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -92,7 +92,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string connectionName() const
|
std::string connectionName() const
|
||||||
/// Returns the connection name.
|
/// Returns the connection name.
|
||||||
/// If there is no active connection, connection name defaults to NONE.
|
/// If there is no active connection, connection name defaults to NONE.
|
||||||
/// If connection name is not applicable for query context (such as when querying environment handle),
|
/// If connection name is not applicable for query context (such as when querying environment handle),
|
||||||
/// connection name defaults to NOT_APPLICABLE.
|
/// connection name defaults to NOT_APPLICABLE.
|
||||||
@ -146,54 +146,54 @@ public:
|
|||||||
|
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
while (!Utility::isError(SQLGetDiagRec(handleType,
|
while (!Utility::isError(SQLGetDiagRec(handleType,
|
||||||
handle,
|
handle,
|
||||||
count,
|
count,
|
||||||
df._sqlState,
|
df._sqlState,
|
||||||
&df._nativeError,
|
&df._nativeError,
|
||||||
df._message,
|
df._message,
|
||||||
SQL_MESSAGE_LENGTH,
|
SQL_MESSAGE_LENGTH,
|
||||||
&messageLength)))
|
&messageLength)))
|
||||||
{
|
{
|
||||||
if (1 == count)
|
if (1 == count)
|
||||||
{
|
{
|
||||||
// success of the following two calls is optional
|
// success of the following two calls is optional
|
||||||
// (they fail if connection has not been established yet
|
// (they fail if connection has not been established yet
|
||||||
// or return empty string if not applicable for the context)
|
// or return empty string if not applicable for the context)
|
||||||
if (Utility::isError(SQLGetDiagField(handleType,
|
if (Utility::isError(SQLGetDiagField(handleType,
|
||||||
handle,
|
handle,
|
||||||
count,
|
count,
|
||||||
SQL_DIAG_CONNECTION_NAME,
|
SQL_DIAG_CONNECTION_NAME,
|
||||||
_connectionName,
|
_connectionName,
|
||||||
sizeof(_connectionName),
|
sizeof(_connectionName),
|
||||||
&messageLength)))
|
&messageLength)))
|
||||||
{
|
{
|
||||||
std::size_t len = sizeof(_connectionName) > none.length() ?
|
std::size_t len = sizeof(_connectionName) > none.length() ?
|
||||||
none.length() : sizeof(_connectionName) - 1;
|
none.length() : sizeof(_connectionName) - 1;
|
||||||
std::memcpy(_connectionName, none.c_str(), len);
|
std::memcpy(_connectionName, none.c_str(), len);
|
||||||
}
|
}
|
||||||
else if (0 == _connectionName[0])
|
else if (0 == _connectionName[0])
|
||||||
{
|
{
|
||||||
std::size_t len = sizeof(_connectionName) > na.length() ?
|
std::size_t len = sizeof(_connectionName) > na.length() ?
|
||||||
na.length() : sizeof(_connectionName) - 1;
|
na.length() : sizeof(_connectionName) - 1;
|
||||||
std::memcpy(_connectionName, na.c_str(), len);
|
std::memcpy(_connectionName, na.c_str(), len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Utility::isError(SQLGetDiagField(handleType,
|
if (Utility::isError(SQLGetDiagField(handleType,
|
||||||
handle,
|
handle,
|
||||||
count,
|
count,
|
||||||
SQL_DIAG_SERVER_NAME,
|
SQL_DIAG_SERVER_NAME,
|
||||||
_serverName,
|
_serverName,
|
||||||
sizeof(_serverName),
|
sizeof(_serverName),
|
||||||
&messageLength)))
|
&messageLength)))
|
||||||
{
|
{
|
||||||
std::size_t len = sizeof(_serverName) > none.length() ?
|
std::size_t len = sizeof(_serverName) > none.length() ?
|
||||||
none.length() : sizeof(_serverName) - 1;
|
none.length() : sizeof(_serverName) - 1;
|
||||||
std::memcpy(_serverName, none.c_str(), len);
|
std::memcpy(_serverName, none.c_str(), len);
|
||||||
}
|
}
|
||||||
else if (0 == _serverName[0])
|
else if (0 == _serverName[0])
|
||||||
{
|
{
|
||||||
std::size_t len = sizeof(_serverName) > na.length() ?
|
std::size_t len = sizeof(_serverName) > na.length() ?
|
||||||
na.length() : sizeof(_serverName) - 1;
|
na.length() : sizeof(_serverName) - 1;
|
||||||
std::memcpy(_serverName, na.c_str(), len);
|
std::memcpy(_serverName, na.c_str(), len);
|
||||||
}
|
}
|
||||||
|
@ -66,11 +66,11 @@ public:
|
|||||||
std::string& toString(int index, std::string& str) const
|
std::string& toString(int index, std::string& str) const
|
||||||
/// Generates the string for the diagnostic record.
|
/// Generates the string for the diagnostic record.
|
||||||
{
|
{
|
||||||
if ((index < 0) || (index > (count() - 1)))
|
if ((index < 0) || (index > (count() - 1)))
|
||||||
return str;
|
return str;
|
||||||
|
|
||||||
std::string s;
|
std::string s;
|
||||||
Poco::format(s,
|
Poco::format(s,
|
||||||
"===========================\n"
|
"===========================\n"
|
||||||
"ODBC Diagnostic record #%d:\n"
|
"ODBC Diagnostic record #%d:\n"
|
||||||
"===========================\n"
|
"===========================\n"
|
||||||
@ -90,7 +90,7 @@ public:
|
|||||||
{
|
{
|
||||||
std::string str;
|
std::string str;
|
||||||
|
|
||||||
Poco::format(str,
|
Poco::format(str,
|
||||||
"Connection:%s\nServer:%s\n",
|
"Connection:%s\nServer:%s\n",
|
||||||
_diagnostics.connectionName(),
|
_diagnostics.connectionName(),
|
||||||
_diagnostics.serverName());
|
_diagnostics.serverName());
|
||||||
|
@ -52,7 +52,7 @@ class ODBC_API Extractor: public Poco::Data::AbstractExtractor
|
|||||||
public:
|
public:
|
||||||
typedef Preparator::Ptr PreparatorPtr;
|
typedef Preparator::Ptr PreparatorPtr;
|
||||||
|
|
||||||
Extractor(const StatementHandle& rStmt,
|
Extractor(const StatementHandle& rStmt,
|
||||||
Preparator::Ptr pPreparator);
|
Preparator::Ptr pPreparator);
|
||||||
/// Creates the Extractor.
|
/// Creates the Extractor.
|
||||||
|
|
||||||
@ -339,7 +339,7 @@ public:
|
|||||||
/// Returns true if the value at [col,row] is null.
|
/// Returns true if the value at [col,row] is null.
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
/// Resets the internally cached length indicators.
|
/// Resets the internally cached length indicators.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const int CHUNK_SIZE = 1024;
|
static const int CHUNK_SIZE = 1024;
|
||||||
@ -365,7 +365,7 @@ private:
|
|||||||
{
|
{
|
||||||
if (isNull(pos)) return false;
|
if (isNull(pos)) return false;
|
||||||
poco_assert_dbg (typeid(T) == _pPreparator->at(pos).type());
|
poco_assert_dbg (typeid(T) == _pPreparator->at(pos).type());
|
||||||
val = *AnyCast<T>(&_pPreparator->at(pos));
|
val = *AnyCast<T>(&_pPreparator->at(pos));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,7 +384,7 @@ private:
|
|||||||
|
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::vector<std::string>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::vector<std::string>& values);
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::deque<std::string>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::deque<std::string>& values);
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::list<std::string>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::list<std::string>& values);
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::vector<Poco::UTF16String>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::vector<Poco::UTF16String>& values);
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::deque<Poco::UTF16String>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::deque<Poco::UTF16String>& values);
|
||||||
bool extractBoundImplContainer(std::size_t pos, std::list<Poco::UTF16String>& values);
|
bool extractBoundImplContainer(std::size_t pos, std::list<Poco::UTF16String>& values);
|
||||||
@ -466,8 +466,8 @@ private:
|
|||||||
|
|
||||||
resizeLengths(pos);
|
resizeLengths(pos);
|
||||||
|
|
||||||
rc = SQLGetData(_rStmt,
|
rc = SQLGetData(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
cType, //C data type
|
cType, //C data type
|
||||||
&value, //returned value
|
&value, //returned value
|
||||||
0, //buffer length (ignored)
|
0, //buffer length (ignored)
|
||||||
@ -476,9 +476,9 @@ private:
|
|||||||
if (Utility::isError(rc))
|
if (Utility::isError(rc))
|
||||||
throw StatementException(_rStmt, "SQLGetData()");
|
throw StatementException(_rStmt, "SQLGetData()");
|
||||||
|
|
||||||
if (isNullLengthIndicator(_lengths[pos]))
|
if (isNullLengthIndicator(_lengths[pos]))
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//for fixed-length data, buffer must be large enough
|
//for fixed-length data, buffer must be large enough
|
||||||
//otherwise, driver may write past the end
|
//otherwise, driver may write past the end
|
||||||
@ -570,7 +570,7 @@ private:
|
|||||||
case MetaColumn::FDT_TIMESTAMP:
|
case MetaColumn::FDT_TIMESTAMP:
|
||||||
{ return extAny<T, Poco::DateTime>(pos, val); }
|
{ return extAny<T, Poco::DateTime>(pos, val); }
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw DataFormatException("Unsupported data type.");
|
throw DataFormatException("Unsupported data type.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,8 +578,8 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool isNullLengthIndicator(SQLLEN val) const;
|
bool isNullLengthIndicator(SQLLEN val) const;
|
||||||
/// The reason for this utility wrapper are platforms where
|
/// The reason for this utility wrapper are platforms where
|
||||||
/// SQLLEN macro (a.k.a. SQLINTEGER) yields 64-bit value,
|
/// SQLLEN macro (a.k.a. SQLINTEGER) yields 64-bit value,
|
||||||
/// while SQL_NULL_DATA (#define'd as -1 literal) remains 32-bit.
|
/// while SQL_NULL_DATA (#define'd as -1 literal) remains 32-bit.
|
||||||
|
|
||||||
SQLINTEGER columnSize(std::size_t pos) const;
|
SQLINTEGER columnSize(std::size_t pos) const;
|
||||||
@ -643,42 +643,42 @@ inline bool Extractor::extractBoundImplContainer(std::size_t pos, std::list<Poco
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::vector<Poco::Data::CLOB>& values)
|
std::vector<Poco::Data::CLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::deque<Poco::Data::CLOB>& values)
|
std::deque<Poco::Data::CLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::list<Poco::Data::CLOB>& values)
|
std::list<Poco::Data::CLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::vector<Poco::Data::BLOB>& values)
|
std::vector<Poco::Data::BLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::deque<Poco::Data::BLOB>& values)
|
std::deque<Poco::Data::BLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
inline bool Extractor::extractBoundImplContainer(std::size_t pos,
|
||||||
std::list<Poco::Data::BLOB>& values)
|
std::list<Poco::Data::BLOB>& values)
|
||||||
{
|
{
|
||||||
return extractBoundImplContainerLOB(pos, values);
|
return extractBoundImplContainerLOB(pos, values);
|
||||||
@ -705,7 +705,7 @@ inline void Extractor::reset()
|
|||||||
|
|
||||||
inline void Extractor::resizeLengths(std::size_t pos)
|
inline void Extractor::resizeLengths(std::size_t pos)
|
||||||
{
|
{
|
||||||
if (pos >= _lengths.size())
|
if (pos >= _lengths.size())
|
||||||
_lengths.resize(pos + 1, (SQLLEN) 0);
|
_lengths.resize(pos + 1, (SQLLEN) 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,14 +39,14 @@ class Handle
|
|||||||
/// ODBC handle class template
|
/// ODBC handle class template
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Handle(const ConnectionHandle& rConnection):
|
Handle(const ConnectionHandle& rConnection):
|
||||||
_rConnection(rConnection),
|
_rConnection(rConnection),
|
||||||
_handle(0)
|
_handle(0)
|
||||||
/// Creates the Handle.
|
/// Creates the Handle.
|
||||||
{
|
{
|
||||||
if (Utility::isError(SQLAllocHandle(handleType,
|
if (Utility::isError(SQLAllocHandle(handleType,
|
||||||
_rConnection,
|
_rConnection,
|
||||||
&_handle)))
|
&_handle)))
|
||||||
{
|
{
|
||||||
throw ODBCException("Could not allocate statement handle.");
|
throw ODBCException("Could not allocate statement handle.");
|
||||||
}
|
}
|
||||||
@ -58,7 +58,7 @@ public:
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
#if defined(_DEBUG)
|
#if defined(_DEBUG)
|
||||||
SQLRETURN rc =
|
SQLRETURN rc =
|
||||||
#endif
|
#endif
|
||||||
SQLFreeHandle(handleType, _handle);
|
SQLFreeHandle(handleType, _handle);
|
||||||
// N.B. Destructors should not throw, but neither do we want to
|
// N.B. Destructors should not throw, but neither do we want to
|
||||||
|
@ -41,7 +41,7 @@ template <class H, SQLSMALLINT handleType>
|
|||||||
class HandleException: public ODBCException
|
class HandleException: public ODBCException
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HandleException(const H& handle, int code = 0) :
|
HandleException(const H& handle, int code = 0) :
|
||||||
ODBCException(code),
|
ODBCException(code),
|
||||||
_error(handle)
|
_error(handle)
|
||||||
/// Creates HandleException
|
/// Creates HandleException
|
||||||
@ -49,29 +49,29 @@ public:
|
|||||||
message(_error.toString());
|
message(_error.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleException(const H& handle, const std::string& msg):
|
HandleException(const H& handle, const std::string& msg):
|
||||||
ODBCException(msg),
|
ODBCException(msg),
|
||||||
_error(handle)
|
_error(handle)
|
||||||
/// Creates HandleException
|
/// Creates HandleException
|
||||||
{
|
{
|
||||||
extendedMessage(_error.toString());
|
extendedMessage(_error.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleException(const H& handle, const std::string& msg, const std::string& arg):
|
HandleException(const H& handle, const std::string& msg, const std::string& arg):
|
||||||
ODBCException(msg, arg),
|
ODBCException(msg, arg),
|
||||||
_error(handle)
|
_error(handle)
|
||||||
/// Creates HandleException
|
/// Creates HandleException
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleException(const H& handle, const std::string& msg, const Poco::Exception& exc):
|
HandleException(const H& handle, const std::string& msg, const Poco::Exception& exc):
|
||||||
ODBCException(msg, exc),
|
ODBCException(msg, exc),
|
||||||
_error(handle)
|
_error(handle)
|
||||||
/// Creates HandleException
|
/// Creates HandleException
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleException(const HandleException& exc):
|
HandleException(const HandleException& exc):
|
||||||
ODBCException(exc),
|
ODBCException(exc),
|
||||||
_error(exc._error)
|
_error(exc._error)
|
||||||
/// Creates HandleException
|
/// Creates HandleException
|
||||||
|
@ -45,10 +45,10 @@ public:
|
|||||||
/// Destroys the ODBCMetaColumn.
|
/// Destroys the ODBCMetaColumn.
|
||||||
|
|
||||||
std::size_t dataLength() const;
|
std::size_t dataLength() const;
|
||||||
/// A numeric value that is either the maximum or actual character length of a character
|
/// A numeric value that is either the maximum or actual character length of a character
|
||||||
/// string or binary data type. It is the maximum character length for a fixed-length data type,
|
/// string or binary data type. It is the maximum character length for a fixed-length data type,
|
||||||
/// or the actual character length for a variable-length data type. Its value always excludes the
|
/// or the actual character length for a variable-length data type. Its value always excludes the
|
||||||
/// null-termination byte that ends the character string.
|
/// null-termination byte that ends the character string.
|
||||||
/// This information is returned from the SQL_DESC_LENGTH record field of the IRD.
|
/// This information is returned from the SQL_DESC_LENGTH record field of the IRD.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -76,7 +76,7 @@ protected:
|
|||||||
/// Returns true if another compile is possible.
|
/// Returns true if another compile is possible.
|
||||||
|
|
||||||
void compileImpl();
|
void compileImpl();
|
||||||
/// Compiles the statement, doesn't bind yet.
|
/// Compiles the statement, doesn't bind yet.
|
||||||
/// Does nothing if the statement has already been compiled.
|
/// Does nothing if the statement has already been compiled.
|
||||||
|
|
||||||
void bindImpl();
|
void bindImpl();
|
||||||
@ -123,8 +123,8 @@ private:
|
|||||||
void doPrepare();
|
void doPrepare();
|
||||||
/// Prepares placeholders for data returned by statement.
|
/// Prepares placeholders for data returned by statement.
|
||||||
/// It is called during statement compilation for SQL statements
|
/// It is called during statement compilation for SQL statements
|
||||||
/// returning data. For stored procedures returning datasets,
|
/// returning data. For stored procedures returning datasets,
|
||||||
/// it is called upon the first check for data availability
|
/// it is called upon the first check for data availability
|
||||||
/// (see hasNext() function).
|
/// (see hasNext() function).
|
||||||
|
|
||||||
bool hasData() const;
|
bool hasData() const;
|
||||||
@ -137,8 +137,8 @@ private:
|
|||||||
/// Returns true if there is a row fetched but not yet extracted.
|
/// Returns true if there is a row fetched but not yet extracted.
|
||||||
|
|
||||||
void putData();
|
void putData();
|
||||||
/// Called whenever SQLExecute returns SQL_NEED_DATA. This is expected
|
/// Called whenever SQLExecute returns SQL_NEED_DATA. This is expected
|
||||||
/// behavior for PB_AT_EXEC binding mode.
|
/// behavior for PB_AT_EXEC binding mode.
|
||||||
|
|
||||||
void getData();
|
void getData();
|
||||||
|
|
||||||
|
@ -47,11 +47,11 @@ public:
|
|||||||
/// Returns the SQL data type.
|
/// Returns the SQL data type.
|
||||||
|
|
||||||
std::size_t columnSize() const;
|
std::size_t columnSize() const;
|
||||||
/// Returns the the size of the column or expression of the corresponding
|
/// Returns the the size of the column or expression of the corresponding
|
||||||
/// parameter marker as defined by the data source.
|
/// parameter marker as defined by the data source.
|
||||||
|
|
||||||
std::size_t decimalDigits() const;
|
std::size_t decimalDigits() const;
|
||||||
/// Returns the number of decimal digits of the column or expression
|
/// Returns the number of decimal digits of the column or expression
|
||||||
/// of the corresponding parameter as defined by the data source.
|
/// of the corresponding parameter as defined by the data source.
|
||||||
|
|
||||||
bool isNullable() const;
|
bool isNullable() const;
|
||||||
|
@ -49,13 +49,13 @@ namespace ODBC {
|
|||||||
|
|
||||||
|
|
||||||
class ODBC_API Preparator : public AbstractPreparator
|
class ODBC_API Preparator : public AbstractPreparator
|
||||||
/// Class used for database preparation where we first have to register all data types
|
/// Class used for database preparation where we first have to register all data types
|
||||||
/// with respective memory output locations before extracting data.
|
/// with respective memory output locations before extracting data.
|
||||||
/// Extraction works in two-phases: first prepare is called once, then extract n-times.
|
/// Extraction works in two-phases: first prepare is called once, then extract n-times.
|
||||||
/// In ODBC, SQLBindCol/SQLFetch is the preferred method of data retrieval (SQLGetData is available,
|
/// In ODBC, SQLBindCol/SQLFetch is the preferred method of data retrieval (SQLGetData is available,
|
||||||
/// however with numerous driver implementation dependent limitations and inferior performance).
|
/// however with numerous driver implementation dependent limitations and inferior performance).
|
||||||
/// In order to fit this functionality into Poco DataConnectors framework, every ODBC SQL statement
|
/// In order to fit this functionality into Poco DataConnectors framework, every ODBC SQL statement
|
||||||
/// instantiates its own Preparator object.
|
/// instantiates its own Preparator object.
|
||||||
/// This is done once per statement execution (from StatementImpl::bindImpl()).
|
/// This is done once per statement execution (from StatementImpl::bindImpl()).
|
||||||
///
|
///
|
||||||
/// Preparator object is used to :
|
/// Preparator object is used to :
|
||||||
@ -69,7 +69,7 @@ class ODBC_API Preparator : public AbstractPreparator
|
|||||||
/// - Value datatypes in this interface prepare() calls serve only for the purpose of type distinction.
|
/// - Value datatypes in this interface prepare() calls serve only for the purpose of type distinction.
|
||||||
/// - Preparator keeps its own std::vector<Any> buffer for fetched data to be later retrieved by Extractor.
|
/// - Preparator keeps its own std::vector<Any> buffer for fetched data to be later retrieved by Extractor.
|
||||||
/// - prepare() methods should not be called when extraction mode is DE_MANUAL
|
/// - prepare() methods should not be called when extraction mode is DE_MANUAL
|
||||||
///
|
///
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::vector<char*> CharArray;
|
typedef std::vector<char*> CharArray;
|
||||||
@ -96,8 +96,8 @@ public:
|
|||||||
DT_DATETIME
|
DT_DATETIME
|
||||||
};
|
};
|
||||||
|
|
||||||
Preparator(const StatementHandle& rStmt,
|
Preparator(const StatementHandle& rStmt,
|
||||||
const std::string& statement,
|
const std::string& statement,
|
||||||
std::size_t maxFieldSize,
|
std::size_t maxFieldSize,
|
||||||
DataExtraction dataExtraction,
|
DataExtraction dataExtraction,
|
||||||
bool isPostgres
|
bool isPostgres
|
||||||
@ -397,12 +397,12 @@ public:
|
|||||||
|
|
||||||
std::size_t maxDataSize(std::size_t pos) const;
|
std::size_t maxDataSize(std::size_t pos) const;
|
||||||
/// Returns max supported size for column at position pos.
|
/// Returns max supported size for column at position pos.
|
||||||
/// Returned length for variable length fields is the one
|
/// Returned length for variable length fields is the one
|
||||||
/// supported by this implementation, not the underlying DB.
|
/// supported by this implementation, not the underlying DB.
|
||||||
|
|
||||||
std::size_t actualDataSize(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW) const;
|
std::size_t actualDataSize(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW) const;
|
||||||
/// Returns the returned length for the column and row specified.
|
/// Returns the returned length for the column and row specified.
|
||||||
/// This is usually equal to the column size, except for
|
/// This is usually equal to the column size, except for
|
||||||
/// variable length fields (BLOB and variable length strings).
|
/// variable length fields (BLOB and variable length strings).
|
||||||
/// For null values, the return value is -1 (SQL_NO_DATA)
|
/// For null values, the return value is -1 (SQL_NO_DATA)
|
||||||
|
|
||||||
@ -437,7 +437,7 @@ private:
|
|||||||
if (pVal)
|
if (pVal)
|
||||||
return prepareFixedSize<Poco::Int8>(pos, SQL_C_STINYINT, pVal->size());
|
return prepareFixedSize<Poco::Int8>(pos, SQL_C_STINYINT, pVal->size());
|
||||||
else
|
else
|
||||||
return prepareFixedSize<Poco::Int8>(pos, SQL_C_STINYINT);
|
return prepareFixedSize<Poco::Int8>(pos, SQL_C_STINYINT);
|
||||||
|
|
||||||
case MetaColumn::FDT_UINT8:
|
case MetaColumn::FDT_UINT8:
|
||||||
if (pVal)
|
if (pVal)
|
||||||
@ -550,7 +550,7 @@ private:
|
|||||||
else
|
else
|
||||||
return prepareFixedSize<DateTime>(pos, SQL_C_TYPE_TIMESTAMP);
|
return prepareFixedSize<DateTime>(pos, SQL_C_TYPE_TIMESTAMP);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw DataFormatException("Unsupported data type.");
|
throw DataFormatException("Unsupported data type.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -569,11 +569,11 @@ private:
|
|||||||
_values[pos] = Poco::Any(T());
|
_values[pos] = Poco::Any(T());
|
||||||
|
|
||||||
T* pVal = AnyCast<T>(&_values[pos]);
|
T* pVal = AnyCast<T>(&_values[pos]);
|
||||||
if (Utility::isError(SQLBindCol(_rStmt,
|
if (Utility::isError(SQLBindCol(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
valueType,
|
valueType,
|
||||||
(SQLPOINTER) pVal,
|
(SQLPOINTER) pVal,
|
||||||
(SQLINTEGER) dataSize,
|
(SQLINTEGER) dataSize,
|
||||||
&_lengths[pos])))
|
&_lengths[pos])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindCol()");
|
throw StatementException(_rStmt, "SQLBindCol()");
|
||||||
@ -598,11 +598,11 @@ private:
|
|||||||
std::vector<T>& cache = RefAnyCast<std::vector<T> >(_values[pos]);
|
std::vector<T>& cache = RefAnyCast<std::vector<T> >(_values[pos]);
|
||||||
cache.resize(length);
|
cache.resize(length);
|
||||||
|
|
||||||
if (Utility::isError(SQLBindCol(_rStmt,
|
if (Utility::isError(SQLBindCol(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
valueType,
|
valueType,
|
||||||
(SQLPOINTER) &cache[0],
|
(SQLPOINTER) &cache[0],
|
||||||
(SQLINTEGER) dataSize,
|
(SQLINTEGER) dataSize,
|
||||||
&_lenLengths[pos][0])))
|
&_lenLengths[pos][0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindCol()");
|
throw StatementException(_rStmt, "SQLBindCol()");
|
||||||
@ -616,18 +616,18 @@ private:
|
|||||||
poco_assert (DE_BOUND == _dataExtraction);
|
poco_assert (DE_BOUND == _dataExtraction);
|
||||||
poco_assert (pos < _values.size());
|
poco_assert (pos < _values.size());
|
||||||
|
|
||||||
T* pCache = new T[size];
|
T* pCache = new T[size];
|
||||||
std::memset(pCache, 0, size);
|
std::memset(pCache, 0, size);
|
||||||
|
|
||||||
_values[pos] = Any(pCache);
|
_values[pos] = Any(pCache);
|
||||||
_lengths[pos] = (SQLLEN) size;
|
_lengths[pos] = (SQLLEN) size;
|
||||||
_varLengthArrays.insert(IndexMap::value_type(pos, dt));
|
_varLengthArrays.insert(IndexMap::value_type(pos, dt));
|
||||||
|
|
||||||
if (Utility::isError(SQLBindCol(_rStmt,
|
if (Utility::isError(SQLBindCol(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
valueType,
|
valueType,
|
||||||
(SQLPOINTER) pCache,
|
(SQLPOINTER) pCache,
|
||||||
(SQLINTEGER) size*sizeof(T),
|
(SQLINTEGER) size*sizeof(T),
|
||||||
&_lengths[pos])))
|
&_lengths[pos])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindCol()");
|
throw StatementException(_rStmt, "SQLBindCol()");
|
||||||
@ -650,11 +650,11 @@ private:
|
|||||||
_lenLengths[pos].resize(length);
|
_lenLengths[pos].resize(length);
|
||||||
_varLengthArrays.insert(IndexMap::value_type(pos, DT));
|
_varLengthArrays.insert(IndexMap::value_type(pos, DT));
|
||||||
|
|
||||||
if (Utility::isError(SQLBindCol(_rStmt,
|
if (Utility::isError(SQLBindCol(_rStmt,
|
||||||
(SQLUSMALLINT) pos + 1,
|
(SQLUSMALLINT) pos + 1,
|
||||||
valueType,
|
valueType,
|
||||||
(SQLPOINTER) pArray,
|
(SQLPOINTER) pArray,
|
||||||
(SQLINTEGER) size,
|
(SQLINTEGER) size,
|
||||||
&_lenLengths[pos][0])))
|
&_lenLengths[pos][0])))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt, "SQLBindCol()");
|
throw StatementException(_rStmt, "SQLBindCol()");
|
||||||
|
@ -53,15 +53,15 @@ public:
|
|||||||
|
|
||||||
SessionImpl(const std::string& connect,
|
SessionImpl(const std::string& connect,
|
||||||
std::size_t loginTimeout,
|
std::size_t loginTimeout,
|
||||||
std::size_t maxFieldSize = ODBC_MAX_FIELD_SIZE,
|
std::size_t maxFieldSize = ODBC_MAX_FIELD_SIZE,
|
||||||
bool autoBind = true,
|
bool autoBind = true,
|
||||||
bool autoExtract = true);
|
bool autoExtract = true);
|
||||||
/// Creates the SessionImpl. Opens a connection to the database.
|
/// Creates the SessionImpl. Opens a connection to the database.
|
||||||
/// Throws NotConnectedException if connection was not successful.
|
/// Throws NotConnectedException if connection was not successful.
|
||||||
|
|
||||||
//@ deprecated
|
//@ deprecated
|
||||||
SessionImpl(const std::string& connect,
|
SessionImpl(const std::string& connect,
|
||||||
Poco::Any maxFieldSize = ODBC_MAX_FIELD_SIZE,
|
Poco::Any maxFieldSize = ODBC_MAX_FIELD_SIZE,
|
||||||
bool enforceCapability=false,
|
bool enforceCapability=false,
|
||||||
bool autoBind = true,
|
bool autoBind = true,
|
||||||
bool autoExtract = true);
|
bool autoExtract = true);
|
||||||
|
@ -124,8 +124,8 @@ private:
|
|||||||
void fillCTypes();
|
void fillCTypes();
|
||||||
void fillSQLTypes();
|
void fillSQLTypes();
|
||||||
|
|
||||||
DataTypeMap _cDataTypes;
|
DataTypeMap _cDataTypes;
|
||||||
DataTypeMap _sqlDataTypes;
|
DataTypeMap _sqlDataTypes;
|
||||||
TypeInfoVec _typeInfo;
|
TypeInfoVec _typeInfo;
|
||||||
CppTypeInfoMap _cppDataTypes;
|
CppTypeInfoMap _cppDataTypes;
|
||||||
SQLHDBC* _pHDBC;
|
SQLHDBC* _pHDBC;
|
||||||
|
@ -27,7 +27,7 @@ inline void makeUTF16(SQLCHAR* pSQLChar, SQLINTEGER length, std::wstring& target
|
|||||||
/// Utility function for conversion from UTF-8 to UTF-16
|
/// Utility function for conversion from UTF-8 to UTF-16
|
||||||
{
|
{
|
||||||
int len = length;
|
int len = length;
|
||||||
if (SQL_NTS == len)
|
if (SQL_NTS == len)
|
||||||
len = (int) std::strlen((const char *) pSQLChar);
|
len = (int) std::strlen((const char *) pSQLChar);
|
||||||
|
|
||||||
UnicodeConverter::toUTF16((const char *) pSQLChar, len, target);
|
UnicodeConverter::toUTF16((const char *) pSQLChar, len, target);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user