Add nanodbc

This commit is contained in:
Jon Evans 2022-05-29 16:48:58 -04:00
parent 1a672aba56
commit 31c24f4421
7 changed files with 7807 additions and 0 deletions

View File

@ -463,6 +463,7 @@ target_link_libraries( common
pybind11::embed pybind11::embed
compoundfilereader compoundfilereader
pcm_settings pcm_settings
nanodbc # for now; maybe hoist out of common
${Boost_LIBRARIES} ${Boost_LIBRARIES}
${CURL_LIBRARIES} ${CURL_LIBRARIES}
${wxWidgets_LIBRARIES} ${wxWidgets_LIBRARIES}

View File

@ -32,6 +32,7 @@ add_subdirectory( gzip-hpp )
add_subdirectory( lemon ) add_subdirectory( lemon )
add_subdirectory( libcontext ) add_subdirectory( libcontext )
add_subdirectory( markdown2html ) add_subdirectory( markdown2html )
add_subdirectory( nanodbc )
add_subdirectory( nanosvg ) add_subdirectory( nanosvg )
add_subdirectory( other_math ) add_subdirectory( other_math )
add_subdirectory( rtree ) add_subdirectory( rtree )

209
thirdparty/nanodbc/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,209 @@
cmake_minimum_required(VERSION 3.0.0)
project(nanodbc CXX)
# nanodbc specific options
option(NANODBC_DISABLE_ASYNC "Disable async features entirely" OFF)
option(NANODBC_DISABLE_LIBCXX "Do not use libc++, if available." OFF)
option(NANODBC_ENABLE_BOOST "Use Boost for Unicode string convertions (requires Boost.Locale)" ON)
option(NANODBC_ENABLE_UNICODE "Enable Unicode support" ON)
option(NANODBC_ENABLE_WORKAROUND_NODATA "Enable SQL_NO_DATA workaround (see Issue #33)" OFF)
########################################
## nanodbc version
########################################
file(STRINGS VERSION.txt NANODBC_VERSION REGEX "[0-9]+\\.[0-9]+\\.[0-9]+")
string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" NANODBC_VERSION_MAJOR "${NANODBC_VERSION}")
string(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" NANODBC_VERSION_MINOR "${NANODBC_VERSION}")
string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" NANODBC_VERSION_PATCH "${NANODBC_VERSION}")
message(STATUS "nanodbc version: ${NANODBC_VERSION}")
########################################
## require and enable C++0x/11/14
########################################
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
message(STATUS "nanodbc compile: C++${CMAKE_CXX_STANDARD}")
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wnarrowing -Werror")
include(CheckCXXCompilerFlag)
if(NOT NANODBC_DISABLE_LIBCXX)
check_cxx_compiler_flag("-stdlib=libc++" CXX_SUPPORTS_STDLIB)
if(CXX_SUPPORTS_STDLIB)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -stdlib=libc++")
endif()
set(NANODBC_DISABLE_LIBCXX ${NANODBC_DISABLE_LIBCXX} CACHE BOOL "Do not use libc++, if available." FORCE)
endif()
message(STATUS "nanodbc build: Disable linking libc++ - ${NANODBC_DISABLE_LIBCXX}")
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
string(REGEX REPLACE "[/-]W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
if (NOT (CMAKE_VERSION VERSION_LESS 3.6.0)) # Compiler features for Intel in CMake 3.6+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qstd=c++17")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /QaxCORE-AVX2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:precise")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O3")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Qipo")
elseif(MSVC)
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
if(MSVC_VERSION LESS 1700)
message(FATAL_ERROR, "nanodbc requires C++11-compliant compiler")
endif()
endif()
########################################
## nanodbc features
########################################
IF(NOT DEFINED NANODBC_ODBC_VERSION)
message(STATUS "nanodbc feature: ODBC Version Override - OFF")
else()
message(STATUS "nanodbc feature: ODBC Version Override - ${NANODBC_ODBC_VERSION}")
add_definitions(-DNANODBC_ODBC_VERSION=${NANODBC_ODBC_VERSION})
endif()
if(NANODBC_DISABLE_ASYNC)
add_definitions(-DNANODBC_DISABLE_ASYNC)
endif()
message(STATUS "nanodbc feature: Disable async features - ${NANODBC_DISABLE_ASYNC}")
if(NANODBC_ENABLE_UNICODE)
add_definitions(-DNANODBC_ENABLE_UNICODE)
if(MSVC)
# Sets "Use Unicode Character Set" property in Visual Studio projects
add_definitions(-DUNICODE -D_UNICODE)
endif()
endif()
message(STATUS "nanodbc feature: Enable Unicode - ${NANODBC_ENABLE_UNICODE}")
if(NANODBC_ENABLE_BOOST)
add_definitions(-DNANODBC_ENABLE_BOOST)
endif()
message(STATUS "nanodbc feature: Enable Boost - ${NANODBC_ENABLE_BOOST}")
if(NANODBC_ENABLE_WORKAROUND_NODATA)
add_definitions(-DNANODBC_ENABLE_WORKAROUND_NODATA)
endif()
message(STATUS "nanodbc feature: Enable SQL_NO_DATA bug workaround - ${NANODBC_ENABLE_WORKAROUND_NODATA}")
########################################
## find unixODBC or iODBC config binary
########################################
if(UNIX)
# Try to find unixODBC first via odbc_config program.
find_program(ODBC_CONFIG odbc_config
PATHS $ENV{ODBC_PATH}/bin /usr/bin /usr/local/bin)
if(ODBC_CONFIG)
message(STATUS "nanodbc build: ODBC on Unix - unixODBC")
set(ODBCLIB odbc)
execute_process(COMMAND ${ODBC_CONFIG} --include-prefix
OUTPUT_VARIABLE ODBC_INCLUDE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
set(ODBC_CFLAGS "-I${ODBC_INCLUDE_DIR}")
set(CMAKE_FLAGS "${CMAKE_FLAGS} ${ODBC_CFLAGS}")
execute_process(COMMAND ${ODBC_CONFIG} --libs
OUTPUT_VARIABLE ODBC_LINK_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
endif()
# Fallback to finding unixODBC via install paths
if(NOT ODBC_CONFIG)
find_path(UnixODBC_INCLUDE_DIR uodbc_stats.h
/usr/include
/usr/local/include
/usr/include/odbc
/usr/local/include/odbc
/usr/include/libodbc
/usr/local/include/libodbc)
if(UnixODBC_INCLUDE_DIR)
set(ODBC_CONFIG 1)
message(STATUS "nanodbc build: ODBC on Unix - unixODBC")
set(ODBCLIB odbc)
set(ODBC_CFLAGS "-I${UnixODBC_INCLUDE_DIR} -DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG -DSIZEOF_LONG_INT=8")
endif()
endif()
# Fallback to using iODBC
if(NOT ODBC_CONFIG)
find_program(ODBC_CONFIG iodbc-config
PATHS $ENV{ODBC_PATH}/bin /usr/bin /usr/local/bin)
if(ODBC_CONFIG)
message(STATUS "nanodbc build: ODBC on Unix - iODBC")
set(ODBCLIB iodbc)
execute_process(COMMAND ${ODBC_CONFIG} --cflags
OUTPUT_VARIABLE ODBC_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CMAKE_FLAGS "${CMAKE_FLAGS} ${ODBC_CFLAGS}")
execute_process(COMMAND ${ODBC_CONFIG} --libs
OUTPUT_VARIABLE ODBC_LINK_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NANODBC_ENABLE_UNICODE)
add_definitions(-DNANODBC_USE_IODBC_WIDE_STRINGS)
endif()
endif()
endif()
if(NOT ODBC_CONFIG)
message(FATAL_ERROR "can not find a suitable odbc driver manager")
endif()
message(STATUS "ODBC compile flags: ${ODBC_CFLAGS}")
message(STATUS "ODBC link flags: ${ODBC_LINK_FLAGS}")
endif()
########################################
## find ODBC libraries to link
########################################
if(UNIX)
set(ODBC_LIBRARIES ${ODBCLIB})
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ODBC_LINK_FLAGS}")
elseif(MSVC OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
set(ODBC_LIBRARIES odbc32.lib odbccp32.lib Ws2_32.lib)
elseif(MINGW)
set(ODBC_LIBRARIES odbc32 odbccp32)
endif()
########################################
## find Boost if necessary
########################################
if(NANODBC_ENABLE_BOOST)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS locale REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${CMAKE_BINARY_DIR}/lib ${Boost_LIBRARY_DIRS})
else()
message(FATAL_ERROR "can not find boost")
endif()
endif()
########################################
## Mac OS X specifics for targets
########################################
if(APPLE)
set(CMAKE_MACOSX_RPATH ON)
message(STATUS "Use rpaths on Mac OS X - ${CMAKE_MACOSX_RPATH}")
# AppleClang complains of unused `-I/path/` arguments.
# These are harmless and can be safely ignored.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-command-line-argument")
endif()
########################################
## library target
########################################
add_library(nanodbc nanodbc/nanodbc.cpp nanodbc/nanodbc.h)
target_link_libraries(nanodbc ${Boost_LIBRARIES} ${ODBC_LIBRARIES})
target_include_directories(nanodbc PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include/nanodbc>) # <prefix>/include/nanodbc
if(UNIX)
set_target_properties(nanodbc PROPERTIES
COMPILE_FLAGS "${ODBC_CFLAGS}"
LIBRARY_OUTPUT_DIRECTORY "lib")
endif()

19
thirdparty/nanodbc/LICENSE vendored Normal file
View File

@ -0,0 +1,19 @@
The MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

1
thirdparty/nanodbc/VERSION.txt vendored Normal file
View File

@ -0,0 +1 @@
2.14.0

5478
thirdparty/nanodbc/nanodbc/nanodbc.cpp vendored Normal file

File diff suppressed because it is too large Load Diff

2098
thirdparty/nanodbc/nanodbc/nanodbc.h vendored Normal file

File diff suppressed because it is too large Load Diff