diff --git a/.travis.yml b/.travis.yml index 8edea08..5991952 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,136 +1,166 @@ -# Copyright (c) 2012-2023 Sebastien Rombauts (sebastien.rombauts@gmail.com) - -language: cpp - -# Use Linux unless specified otherwise -os: linux - -cache: - apt: true - -env: - global: - - BUILD_TYPE=Debug - - ASAN=ON - - INTERNAL_SQLITE=ON - - VALGRIND=OFF - -# Build variants (should test a reasonable number of combination of CMake options) -jobs: - include: - - ########################################################################## - # GCC on Linux - ########################################################################## - - # Coverity static code analysis - - dist: bionic - env: - - COVERITY_SCAN_PROJECT_NAME=SRombauts/SQLiteCpp - - COVERITY_SCAN_BRANCH_PATTERN=master - - COVERITY_SCAN_NOTIFICATION_EMAIL=sebastien.rombauts@gmail.com - - COVERITY_SCAN_BUILD_COMMAND_PREPEND="cmake ." - - COVERITY_SCAN_BUILD_COMMAND="make -j8" - # Encrypted COVERITY_SCAN_TOKEN, created via the "travis encrypt" command using the project repo's public key - - secure: "Qm4d8NEDPBtYZCYav46uPEvDCtaRsjLXlkVS+C+WCJAPcwXCGkrr96wEi7RWcq2xD86QCh0XiqaPT+xdUmlohOYIovRhaaBmZ1lwIJ4GsG/ZR6xoFr3DYsZ3o4GyXk2vNXNxEl82AC+Xs6e6gkLOV9XRkBcjpVIvoIXgNlKWeGY=" - - # GCC 7.4.0 Debug build with GCov for coverage build - - dist: bionic - env: - - cc=gcc cxx=g++ - - GCOV=ON - - COVERALLS=true - - # GCC 7.4.0 Debug build with Valgrind instead of Address Sanitizer - - dist: bionic - env: - - cc=gcc cxx=g++ - - ASAN=OFF - - VALGRIND=true - - # GCC 7.4.0 Release build - - dist: bionic - env: - - cc=gcc cxx=g++ - - BUILD_TYPE=Release - - # GCC 7.4.0 test linking with libsqlite3-dev package - - dist: bionic - env: - - cc=gcc cxx=g++ - - INTERNAL_SQLITE=OFF - - # GCC 5.4.0 - - dist: xenial - env: - - cc=gcc cxx=g++ - - # GCC 4.8.4 - - dist: trusty - env: - - cc=gcc cxx=g++ - - ########################################################################## - # Clang on Linux - ########################################################################## - - # Clang 7.0.0 - - dist: bionic - env: - - cc=clang cxx=clang++ - - # Clang 7.0.0 - - dist: xenial - env: - - cc=clang cxx=clang++ - - # Clang 5.0.0 - - dist: trusty - env: - - cc=clang cxx=clang++ - - ########################################################################## - # Clang on OSX - ########################################################################## - - # Latest XCode - AppleClang 9.1.0 - - os: osx - env: - - cc=clang cxx=clang++ - - # XCode 8.3 - AppleClang 8.1.0 - - os: osx - osx_image: xcode8.3 - env: - - cc=clang cxx=clang++ - -before_install: - # Coverity: don't use addons.coverity_scan since it run on every job of the build matrix, which waste resources and exhausts quotas - # Note: the job dedicated to Coverity need to only run the shell script and then exit (to not try to build and run unit tests etc.) - - if [[ -n "$COVERITY_SCAN_PROJECT_NAME" ]] ; then curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh | bash ; exit 0 ; fi - - - if [[ "$INTERNAL_SQLITE" == "OFF" ]]; then sudo apt-get install libsqlite3-dev ; fi - - if [[ "$VALGRIND" == "true" ]]; then sudo apt-get install valgrind ; fi - - if [[ "$COVERALLS" == "true" ]]; then pip install --user cpp-coveralls ; fi - - # Set the compiler environment variables properly - - export CC=${cc} - - export CXX=${cxx} - -# scripts to run before build -before_script: - - mkdir build - - cd build - - cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DSQLITECPP_INTERNAL_SQLITE=$INTERNAL_SQLITE -DSQLITECPP_USE_ASAN=$ASAN -DSQLITECPP_USE_GCOV=$GCOV -DSQLITECPP_BUILD_EXAMPLES=ON -DSQLITECPP_BUILD_TESTS=ON .. - -# build examples, and run tests (ie make & make test) -script: - - cmake --build . - - export ASAN_OPTIONS=verbosity=1:debug=1 - - ctest --verbose --output-on-failure - - if [[ "$VALGRIND" == "true" ]]; then valgrind --leak-check=full --error-exitcode=1 ./SQLiteCpp_example1 ; fi - - if [[ "$VALGRIND" == "true" ]]; then valgrind --leak-check=full --error-exitcode=1 ./SQLiteCpp_tests ; fi - -# generate and publish GCov coveralls results -after_success: - - if [[ "$COVERALLS" == "true" ]]; then coveralls --root .. -e examples -e googletest -e sqlite3 -e tests -E ".*feature_tests.*" -E ".*CompilerId.*" --gcov-options '\-lp' ; fi +# Copyright (c) 2012-2023 Sebastien Rombauts (sebastien.rombauts@gmail.com) + +language: cpp + +# Use Linux unless specified otherwise +os: linux + +cache: + apt: true + +env: + global: + - BUILD_TYPE=Debug + - ASAN=ON + - INTERNAL_SQLITE=ON + - VALGRIND=OFF + - TESTS=ON + - SHARED_LIBS=OFF + +# Build variants (should test a reasonable number of combination of CMake options) +jobs: + include: + + ########################################################################## + # GCC on Linux + ########################################################################## + + # GCC 11.2.0 (Ubuntu Jammy 22.04) + - dist: jammy + env: + - cc=gcc cxx=g++ + + # Clang 9.3.0 (Ubuntu Focal 20.04) + - dist: focal + env: + - cc=gcc cxx=g++ + + # Coverity static code analysis (Ubuntu Bionic 18.04) + - dist: bionic + env: + - COVERITY_SCAN_PROJECT_NAME=SRombauts/SQLiteCpp + - COVERITY_SCAN_BRANCH_PATTERN=master + - COVERITY_SCAN_NOTIFICATION_EMAIL=sebastien.rombauts@gmail.com + - COVERITY_SCAN_BUILD_COMMAND_PREPEND="cmake ." + - COVERITY_SCAN_BUILD_COMMAND="make -j8" + # Encrypted COVERITY_SCAN_TOKEN, created via the "travis encrypt" command using the project repo's public key + - secure: "Qm4d8NEDPBtYZCYav46uPEvDCtaRsjLXlkVS+C+WCJAPcwXCGkrr96wEi7RWcq2xD86QCh0XiqaPT+xdUmlohOYIovRhaaBmZ1lwIJ4GsG/ZR6xoFr3DYsZ3o4GyXk2vNXNxEl82AC+Xs6e6gkLOV9XRkBcjpVIvoIXgNlKWeGY=" + + # GCC 7.4.0 Debug build with GCov for coverage build (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=gcc cxx=g++ + - GCOV=ON + - COVERALLS=ON + + # GCC 7.4.0 Debug build with Valgrind instead of Address Sanitizer (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=gcc cxx=g++ + - ASAN=OFF + - VALGRIND=ON + + # GCC 7.4.0 Release build (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=gcc cxx=g++ + - BUILD_TYPE=Release + + # GCC 7.4.0 Shared Libs (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=gcc cxx=g++ + - SHARED_LIBS=ON + + # GCC 7.4.0 test linking with libsqlite3-dev package (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=gcc cxx=g++ + - INTERNAL_SQLITE=OFF + + # GCC 5.4.0 (Ubuntu Xenial 16.04) + - dist: xenial + env: + - cc=gcc cxx=g++ + + # GCC 4.8.4 (Ubuntu Trusty 14.04) + - dist: trusty + env: + - cc=gcc cxx=g++ + - TESTS=OFF + + ########################################################################## + # Clang on Linux + ########################################################################## + + # Clang 7.0.0 (Ubuntu Jammy 22.04) + - dist: jammy + env: + - cc=clang cxx=clang++ + + # Clang 7.0.0 (Ubuntu Focal 20.04) + - dist: focal + env: + - cc=clang cxx=clang++ + + # Clang 7.0.0 (Ubuntu Bionic 18.04) + - dist: bionic + env: + - cc=clang cxx=clang++ + + # Clang 7.0.0 (Ubuntu Xenial 16.04) + - dist: xenial + env: + - cc=clang cxx=clang++ + + # Clang 5.0.0 (Ubuntu Trusty 14.04) + - dist: trusty + env: + - cc=clang cxx=clang++ + - TESTS=OFF + + ########################################################################## + # Clang on OSX + ########################################################################## + + # Latest XCode - AppleClang 9.1.0 + - os: osx + env: + - cc=clang cxx=clang++ + + # XCode 8.3 - AppleClang 8.1.0 + - os: osx + osx_image: xcode8.3 + env: + - cc=clang cxx=clang++ + +before_install: + # Coverity: don't use addons.coverity_scan since it run on every job of the build matrix, which waste resources and exhausts quotas + # Note: the job dedicated to Coverity need to only run the shell script and then exit (to not try to build and run unit tests etc.) + - if [[ -n "$COVERITY_SCAN_PROJECT_NAME" ]] ; then curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh | bash ; exit 0 ; fi + + - if [[ "$INTERNAL_SQLITE" == "OFF" ]]; then sudo apt-get install libsqlite3-dev ; fi + - if [[ "$VALGRIND" == "ON" ]]; then sudo apt-get install valgrind ; fi + - if [[ "$COVERALLS" == "ON" ]]; then pip install --user cpp-coveralls ; fi + + # Set the compiler environment variables properly + - export CC=${cc} + - export CXX=${cxx} + +# scripts to run before build +before_script: + - mkdir build + - cd build + - cmake -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SHARED_LIBS=$SHARED_LIBS -DSQLITECPP_INTERNAL_SQLITE=$INTERNAL_SQLITE -DSQLITECPP_USE_ASAN=$ASAN -DSQLITECPP_USE_GCOV=$GCOV -DSQLITECPP_BUILD_EXAMPLES=$TESTS -DSQLITECPP_BUILD_TESTS=$TESTS .. + +# build examples, and run tests (ie make & make test) +script: + - cmake --build . + - export ASAN_OPTIONS=verbosity=1:debug=1 + - if [[ "$TESTS" == "ON" ]]; then ctest --verbose --output-on-failure ; fi + - if [[ "$VALGRIND" == "ON" ]]; then valgrind --leak-check=full --error-exitcode=1 bin/SQLiteCpp_example1 ; fi + - if [[ "$VALGRIND" == "ON" ]]; then valgrind --leak-check=full --error-exitcode=1 bin/SQLiteCpp_tests ; fi + +# generate and publish GCov coveralls results +after_success: + - if [[ "$COVERALLS" == "ON" ]]; then coveralls --root .. -e examples -e googletest -e sqlite3 -e tests -E ".*feature_tests.*" -E ".*CompilerId.*" --gcov-options '\-lp' ; fi diff --git a/include/SQLiteCpp/Statement.h b/include/SQLiteCpp/Statement.h index ba846a8..5f1e390 100644 --- a/include/SQLiteCpp/Statement.h +++ b/include/SQLiteCpp/Statement.h @@ -77,9 +77,9 @@ public: Statement(const Statement&) = delete; Statement& operator=(const Statement&) = delete; - // TODO: Change Statement move constructor to default + // Statement is movable Statement(Statement&& aStatement) noexcept; - Statement& operator=(Statement&& aStatement) noexcept = default; + Statement& operator=(Statement&& aStatement) = default; /// Finalize and unregister the SQL query from the SQLite Database Connection. /// The finalization will be done by the destructor of the last shared pointer diff --git a/tests/Column_test.cpp b/tests/Column_test.cpp index 7506f81..ed23bf0 100644 --- a/tests/Column_test.cpp +++ b/tests/Column_test.cpp @@ -98,7 +98,7 @@ static void test_column_basis(bool utf16) EXPECT_STREQ("first", ptxt); EXPECT_EQ("first", msg); EXPECT_EQ(-123, integer); - EXPECT_EQ(0.123, real); + EXPECT_DOUBLE_EQ(0.123, real); EXPECT_EQ(0, memcmp("bl\0b", pblob, size)); #if !defined(_MSC_VER) || _MSC_VER >= 1900 EXPECT_EQ((size_t)size, sblob.size()); @@ -129,7 +129,7 @@ static void test_column_basis(bool utf16) EXPECT_EQ("first", msg1); EXPECT_EQ("first", msg2); EXPECT_EQ(-123, integer); - EXPECT_EQ(0.123, real); + EXPECT_DOUBLE_EQ(0.123, real); EXPECT_EQ(0, memcmp("bl\0b", pblob, 4)); EXPECT_EQ(0, memcmp("bl\0b", &sblob[0], 4)); } @@ -195,7 +195,7 @@ static void test_column_basis(bool utf16) const SQLite::Column integer = query.getColumn(2); EXPECT_EQ(-123, integer.getInt()); const SQLite::Column dbl = query.getColumn(3); - EXPECT_EQ(0.123, dbl.getDouble()); + EXPECT_DOUBLE_EQ(0.123, dbl.getDouble()); } } diff --git a/tests/Statement_test.cpp b/tests/Statement_test.cpp index 0976ce1..83208e5 100644 --- a/tests/Statement_test.cpp +++ b/tests/Statement_test.cpp @@ -174,7 +174,7 @@ TEST(Statement, executeStep) EXPECT_EQ("first", msg); EXPECT_EQ(123, integer); EXPECT_EQ(123, integer2); - EXPECT_EQ(0.123, real); + EXPECT_DOUBLE_EQ(0.123, real); // Step one more time to discover there is nothing more query.executeStep(); @@ -227,7 +227,7 @@ TEST(Statement, tryExecuteStep) EXPECT_EQ("first", msg); EXPECT_EQ(123, integer); EXPECT_EQ(123, integer2); - EXPECT_EQ(0.123, real); + EXPECT_DOUBLE_EQ(0.123, real); // Step one more time to discover there is nothing more EXPECT_EQ(query.tryExecuteStep(), SQLITE_DONE); @@ -343,7 +343,7 @@ TEST(Statement, bindings) EXPECT_EQ(4, query.getColumn(0).getInt64()); EXPECT_EQ(fourth, query.getColumn(1).getText()); EXPECT_EQ(12345678900000LL, query.getColumn(2).getInt64()); - EXPECT_EQ(0.234f, query.getColumn(3).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(3).getDouble()); } // reset() without clearbindings() @@ -364,7 +364,7 @@ TEST(Statement, bindings) EXPECT_STREQ(buffer, query.getColumn(1).getText()); EXPECT_TRUE (query.isColumnNull(2)); EXPECT_EQ(0, query.getColumn(2).getInt()); - EXPECT_EQ(0.234f, query.getColumn(3).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(3).getDouble()); } @@ -510,7 +510,7 @@ TEST(Statement, bindByName) EXPECT_EQ(second, query.getColumn(1).getText()); EXPECT_EQ(-123, query.getColumn(2).getInt()); EXPECT_EQ(12345678900000LL, query.getColumn(3).getInt64()); - EXPECT_EQ(0.234f, query.getColumn(4).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(4).getDouble()); } // reset() without clearbindings() @@ -531,7 +531,7 @@ TEST(Statement, bindByName) EXPECT_STREQ(buffer, query.getColumn(1).getText()); EXPECT_TRUE (query.isColumnNull(2)); EXPECT_EQ(0, query.getColumn(2).getInt()); - EXPECT_EQ(0.234f, query.getColumn(4).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(4).getDouble()); } // reset() without clearbindings() @@ -595,7 +595,7 @@ TEST(Statement, bindByNameString) EXPECT_EQ(1, query.getColumn(0).getInt64()); EXPECT_STREQ("first", query.getColumn(1).getText()); EXPECT_EQ(123, query.getColumn(2).getInt()); - EXPECT_EQ(0.123, query.getColumn(3).getDouble()); + EXPECT_DOUBLE_EQ(0.123, query.getColumn(3).getDouble()); EXPECT_EQ(-123, query.getColumn(4).getInt()); // reset() with clearbindings() and new bindings @@ -622,7 +622,7 @@ TEST(Statement, bindByNameString) EXPECT_EQ(2, query.getColumn(0).getInt64()); EXPECT_EQ(second, query.getColumn(1).getText()); EXPECT_EQ(12345678900000LL, query.getColumn(2).getInt64()); - EXPECT_EQ(0.234f, query.getColumn(3).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(3).getDouble()); EXPECT_EQ(-123, query.getColumn(4).getInt()); } @@ -644,7 +644,7 @@ TEST(Statement, bindByNameString) EXPECT_STREQ(buffer, query.getColumn(1).getText()); EXPECT_TRUE(query.isColumnNull(2)); EXPECT_EQ(0, query.getColumn(2).getInt()); - EXPECT_EQ(0.234f, query.getColumn(3).getDouble()); + EXPECT_FLOAT_EQ(0.234f, (float)query.getColumn(3).getDouble()); } // reset() without clearbindings() @@ -899,7 +899,7 @@ TEST(Statement, getColumnByName) const double real = query.getColumn("double"); EXPECT_EQ("first", msg); EXPECT_EQ(123, integer); - EXPECT_EQ(0.123, real); + EXPECT_DOUBLE_EQ(0.123, real); } TEST(Statement, getName) @@ -1000,14 +1000,14 @@ TEST(Statement, getColumns) EXPECT_EQ(1, testStruct.id); EXPECT_EQ("first", testStruct.msg); EXPECT_EQ(123, testStruct.integer); - EXPECT_EQ(0.123, testStruct.real); + EXPECT_DOUBLE_EQ(0.123, testStruct.real); // Get only the first 2 columns auto testStruct2 = query.getColumns(); EXPECT_EQ(1, testStruct2.id); EXPECT_EQ("first", testStruct2.msg); EXPECT_EQ(-1, testStruct2.integer); - EXPECT_EQ(0.0, testStruct2.real); + EXPECT_DOUBLE_EQ(0.0, testStruct2.real); } #endif