Skip to content

Commit b19591c

Browse files
release 3.00.2.3
1 parent ea7b2e7 commit b19591c

File tree

175 files changed

+33423
-3012
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

175 files changed

+33423
-3012
lines changed

CMakeLists.txt

Lines changed: 149 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,40 @@
1-
cmake_minimum_required(VERSION 3.13)
1+
cmake_minimum_required(VERSION 3.15)
22

33
project(DolphinDBAPI)
44

55
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
6-
set(CMAKE_CXX_STANDARD 11)
76
set(CMAKE_CXX_EXTENSIONS OFF)
87

98
option(USE_OPENSSL "Use OpenSSL for encrypted communication." ON)
109
option(USE_AERON "Use Aeron for UDP connections. ${CMAKE_PROJECT_NAME} will search for Aeron in $\{CMAKE_INSTALL_PREFIX\} by default, you can specify a different location with AERON_INSTALL_DIR" ON)
11-
option(WITH_GTEST "Compile testcases." OFF)
12-
13-
add_library(${CMAKE_PROJECT_NAME} SHARED)
10+
option(BUILD_SHARED_LIBS "Build shared library" ON)
11+
option(LINK_SHARED_LIBS "Link shared libraries" ON)
12+
option(WITH_UNITTEST "Compile testcases." OFF)
1413

14+
add_library(${CMAKE_PROJECT_NAME})
15+
target_compile_features(${CMAKE_PROJECT_NAME} PRIVATE cxx_std_11)
1516
add_subdirectory(src)
1617

1718
if (USE_OPENSSL)
18-
find_package(OpenSSL REQUIRED)
19-
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE USE_OPENSSL)
19+
if (NOT LINK_SHARED_LIBS)
20+
set(OPENSSL_USE_STATIC_LIBS TRUE)
21+
endif()
22+
# FindOpenSSL from cmake
23+
find_package(OpenSSL)
24+
if (OPENSSL_FOUND)
25+
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE USE_OPENSSL)
26+
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
27+
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
28+
else()
29+
message(WARNING
30+
"Failed to compile ${CMAKE_PROJECT_NAME} with OpenSSL. Encrypted communication features are unavailable.\n"
31+
"To suppress this warning, set -DUSE_OPENSSL=OFF in cmake command.")
32+
endif()
2033
endif()
2134

35+
include(CheckIncludeFileCXX)
36+
include(CheckCXXSourceCompiles)
37+
2238
if (USE_AERON)
2339
if (NOT DEFINED AERON_INSTALL_DIR)
2440
set(AERON_INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
@@ -28,69 +44,155 @@ if (USE_AERON)
2844
"${AERON_INSTALL_DIR}/include/aeron"
2945
"${AERON_INSTALL_DIR}/include"
3046
)
31-
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${AERON_INSTALL_DIR}/lib)
32-
set(AERON_LIBRARY
47+
set(AERON_LIBRARY_DIR ${AERON_INSTALL_DIR}/lib)
48+
set(AERON_LIBRARY_STATIC
49+
aeron_static
50+
aeron_driver_static
51+
aeron_client
52+
)
53+
set(AERON_LIBRARY_SHARED
3354
aeron
34-
aeron_client_shared
3555
aeron_driver
56+
aeron_client_shared
3657
)
37-
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE USE_AERON)
58+
if (LINK_SHARED_LIBS)
59+
set(AERON_LIBRARY ${AERON_LIBRARY_SHARED})
60+
else()
61+
set(AERON_LIBRARY ${AERON_LIBRARY_STATIC})
62+
endif()
63+
set(CMAKE_REQUIRED_INCLUDES ${AERON_INCLUDE_DIR})
64+
check_include_file_cxx("FragmentAssembler.h" HAS_AERON_HEADER)
65+
if (HAS_AERON_HEADER)
66+
set(CMAKE_REQUIRED_LINK_DIRECTORIES ${AERON_LIBRARY_DIR})
67+
set(CMAKE_REQUIRED_LIBRARIES ${AERON_LIBRARY})
68+
check_cxx_source_compiles("int main() {return 0;}" HAS_AERON)
69+
endif()
70+
unset(CMAKE_REQUIRED_INCLUDES)
71+
unset(CMAKE_REQUIRED_LIBRARIES)
72+
unset(CMAKE_REQUIRED_LINK_DIRECTORIES)
73+
if (HAS_AERON)
74+
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE USE_AERON)
75+
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${AERON_INCLUDE_DIR})
76+
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${AERON_LIBRARY_DIR})
77+
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${AERON_LIBRARY})
78+
else()
79+
message(WARNING
80+
"Failed to compile ${CMAKE_PROJECT_NAME} with Aeron. UDP features are unavailable.\n"
81+
"To suppress this warning, set -DUSE_AERON=OFF in cmake command.")
82+
endif()
3883
endif()
3984

40-
target_include_directories(${CMAKE_PROJECT_NAME}
41-
PRIVATE ${OPENSSL_INCLUDE_DIR}
42-
PRIVATE ${AERON_INCLUDE_DIR}
43-
)
44-
target_link_libraries(${CMAKE_PROJECT_NAME}
45-
PRIVATE ${OPENSSL_SSL_LIBRARY}
46-
PRIVATE ${OPENSSL_CRYPTO_LIBRARY}
47-
PRIVATE ${AERON_LIBRARY}
48-
)
49-
5085
if (WIN32)
5186
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE NOMINMAX _DDBAPIDLL)
52-
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ws2_32)
87+
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ws2_32 crypt32)
5388
if (MINGW)
54-
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE _WIN32_WINNT=0x0600)
89+
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE WINDOWS _WIN32_WINNT=0x0600)
5590
endif()
5691
else()
92+
check_include_file_cxx("uuid/uuid.h" HAS_UUID)
93+
if (NOT HAS_UUID)
94+
message(FATAL_ERROR "Failed to find uuid.")
95+
endif()
5796
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE pthread rt uuid)
5897
endif()
5998

60-
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
61-
# C4251: Class member of an exported class is not marked dllexport.
62-
# This is triggered by std::string but we cannot modify STL.
99+
if (MSVC)
100+
# C4251: Class member of an exported class is not marked dllexport. This is triggered by std::string but we cannot modify STL.
63101
# C4100: Parameter is unused. We should fix this later.
64-
# C4996: The code uses a deprecated API. We should fix this later.
65-
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /W3 /MP /wd4251 /wd4100 /wd4996)
102+
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /W4 /MP /wd4251 /wd4100)
103+
# Unicode support of fmt (used in spdlog) requires /utf-8 of MSVC.
104+
target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE FMT_UNICODE=0)
105+
if (${CMAKE_BUILD_TYPE} MATCHES "Dev")
106+
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE /WX)
107+
endif()
66108
else()
67-
# overloaded-virtual: Derived class hides base class virtual functions
68-
# This is triggered by derived classes of Constant and we will fix this later
69-
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall -Wno-overloaded-virtual)
109+
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE -Wall)
110+
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:
111+
-Wno-overloaded-virtual # ConstantImp.h
112+
-Wno-inconsistent-missing-override # ConstantImp.h
113+
>)
114+
# Enable Wextra and Wconversion when possible
115+
set(CMAKE_CXX_FLAGS_DEV "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -Werror -Wpedantic")
70116
endif()
71117

72-
if (WITH_GTEST)
73-
if (NOT USE_CXX11_ABI)
74-
message(FATAL_ERROR "cannot compile testcases without C++11 ABI")
118+
if (WITH_UNITTEST)
119+
find_package(GTest REQUIRED)
120+
set(UNITTEST ${CMAKE_PROJECT_NAME}_unittest)
121+
add_executable(${UNITTEST})
122+
add_subdirectory(unittest)
123+
124+
target_link_libraries(${UNITTEST}
125+
${CMAKE_PROJECT_NAME}
126+
GTest::gtest_main
127+
)
128+
endif()
129+
130+
if (API_TEST)
131+
if (NOT DEFINED TEST_BINARY_NAME)
132+
set(TEST_BINARY_NAME ${CMAKE_PROJECT_NAME}_test) # default test binary name is DolphinDBAPI_test
133+
endif()
134+
option(COMPATI "this is a compatibility testing parameter" OFF)
135+
if (COMPATI AND DEFINED ENV{COMPATI_PATH})
136+
set(COMPATI_PATH $ENV{COMPATI_PATH})
137+
file(GLOB COMPATI_SRC "${COMPATI_PATH}/*_gtest.cpp" "${COMPATI_PATH}/gt_main.cpp")
138+
add_executable(${TEST_BINARY_NAME}
139+
${COMPATI_SRC}
140+
"test/config.cpp"
141+
)
142+
else()
143+
file(GLOB TEST_SRC "test/*_gtest.cpp" "test/gt_main.cpp")
144+
add_executable(${TEST_BINARY_NAME}
145+
${TEST_SRC}
146+
"test/config.cpp"
147+
"test/concurrent_testing/ConcurrentTest_gtest.cpp"
148+
"test/HA_testing/HighAvailableTest_gtest.cpp"
149+
)
75150
endif()
76-
add_executable(${CMAKE_PROJECT_NAME}_test)
77-
add_subdirectory(test)
78151

79-
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
80-
target_compile_options(${CMAKE_PROJECT_NAME}_test PRIVATE /W0 /utf-8 /MP)
81-
target_compile_definitions(${CMAKE_PROJECT_NAME}_test PRIVATE WINDOWS NOMINMAX)
152+
153+
if(USE_OPENSSL AND OPENSSL_FOUND)
154+
target_compile_definitions(${TEST_BINARY_NAME} PRIVATE TEST_OPENSSL)
155+
target_include_directories(${TEST_BINARY_NAME} PRIVATE ${OPENSSL_INCLUDE_DIR})
156+
target_link_libraries(${TEST_BINARY_NAME} PRIVATE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
157+
endif()
158+
if(USE_AERON AND HAS_AERON)
159+
target_compile_definitions(${TEST_BINARY_NAME} PRIVATE TEST_AERON)
160+
target_include_directories(${TEST_BINARY_NAME} PRIVATE ${AERON_INCLUDE_DIR})
161+
target_link_directories(${TEST_BINARY_NAME} PRIVATE ${AERON_LIBRARY_DIR})
162+
target_link_libraries(${TEST_BINARY_NAME} PRIVATE ${AERON_LIBRARY})
163+
endif()
164+
165+
if (MSVC)
166+
target_compile_options(${TEST_BINARY_NAME} PRIVATE /W0 /utf-8 /MP /bigobj)
167+
target_compile_definitions(${TEST_BINARY_NAME} PRIVATE WINDOWS NOMINMAX)
168+
elseif (MINGW)
169+
target_compile_options(${TEST_BINARY_NAME} PRIVATE -w -Wa,-mbig-obj -pthread -std=c++11 -g)
170+
target_compile_definitions(${TEST_BINARY_NAME} PRIVATE WINDOWS _WIN32_WINNT=0x0600)
82171
else()
83-
target_compile_options(${CMAKE_PROJECT_NAME}_test PRIVATE -w)
172+
target_compile_options(${TEST_BINARY_NAME} PRIVATE -w -pthread -std=c++11 -g)
84173
endif()
85174

86-
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
87-
add_subdirectory("${PROJECT_SOURCE_DIR}/thirdparty/googletest")
175+
if(CMAKE_VERSION VERSION_GREATER "3.27.0")
176+
cmake_policy(SET CMP0144 NEW)
177+
endif()
88178

89-
enable_testing()
179+
find_package(GTest 1.12.0 REQUIRED)
180+
if (NOT DEFINED API_INSTALL_DIR)
181+
set(API_INSTALL_LIB ${CMAKE_PROJECT_NAME})
182+
else()
183+
if (MSVC)
184+
set(LIB_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${CMAKE_PROJECT_NAME}.lib")
185+
else()
186+
set(LIB_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}${CMAKE_PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
187+
endif()
188+
set(API_INSTALL_LIB ${API_INSTALL_DIR}/${LIB_NAME})
189+
endif()
190+
target_include_directories(${TEST_BINARY_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include)
90191

91-
target_link_libraries(${CMAKE_PROJECT_NAME}_test
92-
${CMAKE_PROJECT_NAME}
93-
gtest_main
94-
gmock_main
192+
target_link_libraries(${TEST_BINARY_NAME} PRIVATE
193+
${API_INSTALL_LIB}
194+
GTest::gtest
195+
GTest::gmock
196+
GTest::gtest_main
95197
)
96198
endif()

include/AsynWorker.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ class AsynWorker: public Runnable {
1010
using Task = DBConnectionPoolImpl::Task;
1111
AsynWorker(DBConnectionPoolImpl& pool, CountDownLatchSP latch, const SmartPointer<DBConnection>& conn,
1212
const SmartPointer<SynchronizedQueue<Task>>& queue, TaskStatusMgmt& status,
13-
const std::string& hostName, int port, const std::string& userId , const std::string& password)
13+
const std::string& hostName, const std::string& userId , const std::string& password)
1414
: pool_(pool), latch_(latch), conn_(conn), queue_(queue),taskStatus_(status),
15-
hostName_(hostName), port_(port), userId_(userId), password_(password){}
15+
hostName_(hostName), userId_(userId), password_(password){}
1616
protected:
1717
virtual void run();
1818

@@ -23,7 +23,6 @@ class AsynWorker: public Runnable {
2323
SmartPointer<SynchronizedQueue<Task>> queue_;
2424
TaskStatusMgmt& taskStatus_;
2525
const std::string hostName_;
26-
int port_;
2726
const std::string userId_;
2827
const std::string password_;
2928
};

include/Constant.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#pragma once
2-
2+
#ifdef _MSC_VER
3+
#pragma warning( push )
4+
#pragma warning( disable : 4100 )
5+
#endif
36
#include <string>
47
#include "SmartPointer.h"
58
#include "Types.h"
@@ -54,7 +57,7 @@ class EXPORT_DECL Constant {
5457
inline bool transferAsString() const {return flag_ & 64;}
5558
inline void transferAsString(bool val){ if(val) flag_ |= 64; else flag_ &= ~64;}
5659
inline DATA_FORM getForm() const {return DATA_FORM(flag_ >> 8);}
57-
inline void setForm(DATA_FORM df){ flag_ = (flag_ & 127) + (df << 8);}
60+
inline void setForm(DATA_FORM df){ flag_ = (flag_ & static_cast<unsigned short>(127)) + static_cast<unsigned short>(df << 8);}
5861
inline bool isScalar() const { return getForm()==DF_SCALAR;}
5962
inline bool isArray() const { return getForm()==DF_VECTOR;}
6063
inline bool isPair() const { return getForm()==DF_PAIR;}
@@ -250,9 +253,21 @@ class EXPORT_DECL Constant {
250253
virtual int getSegmentSizeInBit() const { return 0;}
251254
virtual bool containNotMarshallableObject() const {return false;}
252255
virtual ConstantSP castTemporal(DATA_TYPE expectType) { throw IncompatibleTypeException(getType(), expectType); }
256+
protected:
257+
void checkSize(const INDEX start, const INDEX length) const
258+
{
259+
auto mySize = size();
260+
if (start < 0 || length < 0 || start >= mySize || length > (mySize - start)) {
261+
throw RuntimeException("Invalid index");
262+
}
263+
}
253264
private:
254265
unsigned short flag_;
255266

256267
};
257268

258269
}
270+
271+
#ifdef _MSC_VER
272+
#pragma warning( pop )
273+
#endif

include/ConstantFactory.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
#include "Exceptions.h"
1717
#include "Util.h"
1818

19+
#ifdef _MSC_VER
20+
#pragma warning( push )
21+
#pragma warning( disable : 4100 )
22+
#endif
23+
1924
namespace dolphindb {
2025

2126
class ConstantFactory{
@@ -1027,4 +1032,9 @@ class ConstantFactory{
10271032
};
10281033

10291034
}
1035+
1036+
#ifdef _MSC_VER
1037+
#pragma warning( pop )
1038+
#endif
1039+
10301040
#endif /* CONSTANTFACTORY_H_ */

0 commit comments

Comments
 (0)