diff options
-rw-r--r-- | common.mk | 22 | ||||
-rw-r--r-- | config.cpp | 2 | ||||
-rw-r--r-- | debian/control | 2 | ||||
-rw-r--r-- | storage.cpp | 23 | ||||
-rw-r--r-- | tests/Makefile | 10 | ||||
-rw-r--r-- | tests/test-storage.cpp | 20 |
6 files changed, 65 insertions, 14 deletions
@@ -1,11 +1,23 @@ CXX=clang++-14 #CXX=g++-12 +ifeq ($(CXX),clang++-14) +CXXTYPE=clang++ +else ifeq ($(CXX),clang++) +CXXTYPE=clang++ +else +CXXTYPE=g++ +endif + ifeq ($(shell which $(CXX)),) CXX=clang++-13 endif ifeq ($(shell which $(CXX)),) +CXX=clang++-11 +endif + +ifeq ($(shell which $(CXX)),) CXX=clang++-10 endif @@ -36,13 +48,19 @@ endif ifeq ($(CXX),clang++-10) LIBS+=-fuse-ld=lld-10 -lstdc++ +else ifeq ($(CXX),clang++-11) +#LIBS+=-fuse-ld=lld-11 -lc++ -lc++abi +LLVMPROFDATA=llvm-profdata-11 +LLVMCOV=llvm-cov-11 else ifeq ($(CXX),clang++-14) -LIBS+=-fuse-ld=lld-14 -lc++ -lc++abi +#LIBS+=-fuse-ld=lld-14 -lc++ -lc++abi +LLVMPROFDATA=llvm-profdata-14 +LLVMCOV=llvm-cov-14 else LIBS+=-lstdc++ -lstdc++fs endif CXXFLAGS+=$(shell pkg-config --cflags qrcodegencpp Magick++ fmt sqlite3) -LIBS+=-lfcgi -lboost_filesystem +LIBS+=-lfcgi -lboost_filesystem -lpthread LIBS+=-lSQLiteCpp $(shell pkg-config --libs qrcodegencpp Magick++ fmt sqlite3) @@ -23,7 +23,7 @@ Config::Config(const std::string& config_filename): m_dataPath{default_datapath} m_dataPath = tree.get<std::string>("config.datapath", default_datapath); m_maxage = tree.get<uint64_t>("config.maxage", default_maxage); } catch (const std::exception& ex) { - std::cerr << "Error reading config file " << config_filename << ". Using " << default_datapath << "." << std::endl; + std::cerr << "Error reading config file " << config_filename << ". Using defaults." << std::endl; } } diff --git a/debian/control b/debian/control index ed6ee77..a958cca 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: whiteboard Section: web Priority: optional Maintainer: Roland Reichwein <mail@reichwein.it> -Build-Depends: debhelper (>= 12), libboost-all-dev | libboost1.71-all-dev, clang | g++-9, uglifyjs, python3-pkg-resources, htmlmin, cleancss, libfcgi-dev, libqrcodegencpp-dev, libmagick++-dev, pkg-config, libfmt-dev, libsqlitecpp-dev, googletest, gcovr +Build-Depends: debhelper (>= 12), libboost-all-dev | libboost1.71-all-dev, clang | g++-9, llvm | g++-9, lld | g++-9, uglifyjs, python3-pkg-resources, htmlmin, cleancss, libfcgi-dev, libqrcodegencpp-dev, libmagick++-dev, pkg-config, libfmt-dev, libsqlitecpp-dev, googletest, gcovr Standards-Version: 4.5.0 Homepage: http://www.reichwein.it/whiteboard/ diff --git a/storage.cpp b/storage.cpp index ffdb2f4..6fb5b64 100644 --- a/storage.cpp +++ b/storage.cpp @@ -43,12 +43,22 @@ uint64_t Storage::getNumberOfDocuments() return m_stmt_getNumberOfDocuments.getColumn<int64_t>(0); } +namespace { + uint64_t unixepoch() + { + const auto p1 = std::chrono::system_clock::now(); + return std::chrono::duration_cast<std::chrono::seconds>(p1.time_since_epoch()).count(); + } +} // namespace + void Storage::cleanup() { if (m_maxage == 0) return; - m_stmt_cleanup.init("DELETE FROM documents WHERE timestamp + "s + std::to_string(static_cast<int64_t>(m_maxage)) + " < unixepoch()"s); + m_stmt_cleanup.init("DELETE FROM documents WHERE timestamp + ? < ?"); + m_stmt_cleanup.bind(1, static_cast<int64_t>(m_maxage)); + m_stmt_cleanup.bind(2, static_cast<int64_t>(unixepoch())); m_stmt_cleanup.execute(); } @@ -106,16 +116,18 @@ std::tuple<std::string, int, int> Storage::getRow(const std::string& id) void Storage::setDocument(const std::string& id, const std::string& document) { - m_stmt_setDocument.init("UPDATE documents SET value = ? WHERE id = ?"); + m_stmt_setDocument.init("UPDATE documents SET value = ?, timestamp = ?, rev = rev + 1 WHERE id = ?"); m_stmt_setDocument.bind(1, document); - m_stmt_setDocument.bind(2, id); + m_stmt_setDocument.bind(2, static_cast<int64_t>(unixepoch())); + m_stmt_setDocument.bind(3, id); if (!m_stmt_setDocument.execute()) { - m_stmt_setDocument_new.init("INSERT INTO documents (id, value, rev, cursorpos, timestamp) values (?, ?, ?, ?, unixepoch())"); + m_stmt_setDocument_new.init("INSERT INTO documents (id, value, rev, cursorpos, timestamp) values (?, ?, ?, ?, ?)"); m_stmt_setDocument_new.bind(1, id); m_stmt_setDocument_new.bind(2, document); m_stmt_setDocument_new.bind(3, 0); m_stmt_setDocument_new.bind(4, 0); + m_stmt_setDocument_new.bind(5, static_cast<int64_t>(unixepoch())); m_stmt_setDocument_new.execute(); } } @@ -142,11 +154,12 @@ void Storage::setCursorPos(const std::string& id, int cursorPos) void Storage::setRow(const std::string& id, const std::string& document, int rev, int cursorPos) { - m_stmt_setRow.init("INSERT OR REPLACE INTO documents (id, value, rev, cursorpos, timestamp) values (?, ?, ?, ?, unixepoch())"); + m_stmt_setRow.init("INSERT OR REPLACE INTO documents (id, value, rev, cursorpos, timestamp) values (?, ?, ?, ?, ?)"); m_stmt_setRow.bind(1, id); m_stmt_setRow.bind(2, document); m_stmt_setRow.bind(3, rev); m_stmt_setRow.bind(4, cursorPos); + m_stmt_setRow.bind(5, static_cast<int64_t>(unixepoch())); if (!m_stmt_setRow.execute()) throw std::runtime_error("Unable to insert row with id "s + id); } diff --git a/tests/Makefile b/tests/Makefile index 94789f9..4ade005 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -2,7 +2,7 @@ CXXFLAGS=-g -O0 include ../common.mk -ifeq ($(CXX),clang++-14) +ifeq ($(CXXTYPE),clang++) CXXFLAGS+=-fprofile-instr-generate -fcoverage-mapping LDFLAGS+=-fprofile-instr-generate -fcoverage-mapping else @@ -25,10 +25,10 @@ CXXFLAGS+=\ test: unittests # https://clang.llvm.org/docs/SourceBasedCodeCoverage.html -ifeq ($(CXX),clang++-14) +ifeq ($(CXXTYPE),clang++) LLVM_PROFILE_FILE="unittests.profraw" ./unittests - llvm-profdata-14 merge -sparse unittests.profraw -o unittests.profdata - llvm-cov-14 report --ignore-filename-regex='google' --ignore-filename-regex='test-' --show-region-summary=0 -instr-profile unittests.profdata unittests + $(LLVMPROFDATA) merge -sparse unittests.profraw -o unittests.profdata + $(LLVMCOV) report --ignore-filename-regex='google' --ignore-filename-regex='test-' --show-region-summary=0 -instr-profile unittests.profdata unittests else ./unittests #gcov-12 storage.o @@ -36,7 +36,7 @@ else endif coverage: - llvm-cov-14 show -instr-profile unittests.profdata $(UNITS:.cpp=.o) + $(LLVMCOV) show -instr-profile unittests.profdata $(UNITS:.cpp=.o) unittests: libgmock.a $(UNITTESTS:.cpp=.o) $(UNITS:.cpp=.o) $(CXX) $(LDFLAGS) $^ $(LDLIBS) $(LIBS) -o $@ diff --git a/tests/test-storage.cpp b/tests/test-storage.cpp index 87168fc..158a9bd 100644 --- a/tests/test-storage.cpp +++ b/tests/test-storage.cpp @@ -184,3 +184,23 @@ TEST_F(StorageTest, getRow) EXPECT_EQ(std::get<2>(row), 456); } +TEST_F(StorageTest, revision_increment) +{ + Storage storage(m_config); + storage.setDocument("0", "xyz"); + storage.setDocument("0bc", "xyz2"); + storage.setDocument("iabc", "xyz3"); + + EXPECT_EQ(storage.getRevision("0"), 0); + EXPECT_EQ(storage.getRevision("0bc"), 0); + EXPECT_EQ(storage.getRevision("iabc"), 0); + + storage.setDocument("0bc", "xyz234"); + EXPECT_EQ(storage.getRevision("0bc"), 1); + + storage.setDocument("0bc", "xyz2345"); + EXPECT_EQ(storage.getRevision("0"), 0); + EXPECT_EQ(storage.getRevision("0bc"), 2); + EXPECT_EQ(storage.getRevision("iabc"), 0); +} + |