From 1d18db53ea95e6f80abcd0d5dfd3dfeb678fdce9 Mon Sep 17 00:00:00 2001 From: Roel Standaert Date: Mon, 20 Apr 2020 16:22:10 +0200 Subject: [PATCH] Cherry-picking fixes from master branch into 4.3-release branch: - Fix AbstractQuery's copy ctor/assignment operator not copying join_ field Added test for AbstractQuery::join() join() was working properly, but AbstractQuery's copy ctor was not: it did not copy the join_ field. - widgetgallery: Fixed WDataSeries doc-link - WWebWidget: move id_ out of OtherImpl This fixes an issue when setId() is used. The destructor of jsScrollVisibilityChanged_ (a JSignal) in OtherImpl uses WWebWidget::id() to unexpose the signal. However, resetting the otherImpl_ causes it to be set to nullptr, so the WObject's id is used instead of the id set in OtherImpl. Simply moving this id_ out of OtherImpl and making sure it gets destroyed after OtherImpl solves this problem. - Changing Windows libs to lowercase When cross-compiling with MinGW on Linux, the libraries are lowercase, and Windows is case-insensitive, so let's make them all lowercase. - Issue #7505: it's not necessary to disable Direct2D/DirectWrite with MinGW It works fine, even when cross-compiling (tested on Fedora), so let's just enable it. --- CMakeLists.txt | 10 ++--- cmake/WtFindGL.txt | 2 +- cmake/WtFindMysql.txt | 2 +- cmake/WtFindOdbc.txt | 2 +- cmake/WtFindSkia.txt | 2 +- examples/widgetgallery/approot/text.xml | 2 +- src/CMakeLists.txt | 8 ++-- src/Wt/Dbo/Query.C | 4 +- src/Wt/WWebWidget.C | 15 +++---- src/Wt/WWebWidget.h | 8 +++- test/dbo/DboTest.C | 58 +++++++++++++++++++++++++ 11 files changed, 89 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27b5a50dbf..ddc50b4bc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -324,11 +324,11 @@ ENDIF(BOOST_WT_MT_FOUND) # decide on GraphicsMagick vs skia # todo: set default to whatever was found -IF (WIN32 AND NOT MINGW) +IF (WIN32) SET(WT_WRASTERIMAGE_DEFAULT_IMPLEMENTATION "Direct2D") -ELSE (WIN32 AND NOT MINGW) +ELSE (WIN32) SET(WT_WRASTERIMAGE_DEFAULT_IMPLEMENTATION "none") -ENDIF (WIN32 AND NOT MINGW) +ENDIF (WIN32) SET(WT_WRASTERIMAGE_IMPLEMENTATION ${WT_WRASTERIMAGE_DEFAULT_IMPLEMENTATION} CACHE STRING "Implementation for WRasterImage server-side rendering") IF (CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION LESS 8) @@ -348,9 +348,9 @@ ELSEIF (${WT_WRASTERIMAGE_IMPLEMENTATION} STREQUAL "skia") ENDIF (NOT SKIA_FOUND) SET(WT_HAS_WRASTERIMAGE true) ELSEIF (${WT_WRASTERIMAGE_IMPLEMENTATION} STREQUAL "Direct2D") - IF (WIN32 AND NOT MINGW) + IF (WIN32) SET(WT_HAS_WRASTERIMAGE true) - ENDIF (WIN32 AND NOT MINGW) + ENDIF (WIN32) ELSE (${WT_WRASTERIMAGE_IMPLEMENTATION} STREQUAL "GraphicsMagick") MESSAGE("** Disabled WRasterimage support. Set WT_WRASTERIMAGE_IMPLEMENTATION to GraphicsMagick, skia, or Direct2D.") ENDIF (${WT_WRASTERIMAGE_IMPLEMENTATION} STREQUAL "GraphicsMagick") diff --git a/cmake/WtFindGL.txt b/cmake/WtFindGL.txt index ff27d6977f..d78484ffdb 100644 --- a/cmake/WtFindGL.txt +++ b/cmake/WtFindGL.txt @@ -22,7 +22,7 @@ ELSE(USE_SYSTEM_GLEW) ENDIF(USE_SYSTEM_GLEW) IF(WIN32) - SET(GL_LIBRARIES Opengl32) + SET(GL_LIBRARIES opengl32) ELSEIF(APPLE) FIND_LIBRARY(GL_LIBRARIES OpenGL) ELSEIF(UNIX) diff --git a/cmake/WtFindMysql.txt b/cmake/WtFindMysql.txt index 31a6d553a2..265df59062 100644 --- a/cmake/WtFindMysql.txt +++ b/cmake/WtFindMysql.txt @@ -70,7 +70,7 @@ IF(WIN32) # on zlib, depends on ws2_32 and Shlwapi on Windows IF(_MYSQL_DEBUG_LIB_FILENAME STREQUAL "mariadbclientd" OR _MYSQL_LIB_FILENAME STREQUAL "mariadbclient") - SET(MYSQL_LIBRARIES ${MYSQL_LIBRARIES} ${ZLIB_LIBRARIES} ws2_32 Shlwapi) + SET(MYSQL_LIBRARIES ${MYSQL_LIBRARIES} ${ZLIB_LIBRARIES} ws2_32 shlwapi) ENDIF() set(_MYSQL_DEBUG_LIB_FILENAME) set(_MYSQL_LIB_FILENAME) diff --git a/cmake/WtFindOdbc.txt b/cmake/WtFindOdbc.txt index 8d63488dc2..7299786fdc 100644 --- a/cmake/WtFindOdbc.txt +++ b/cmake/WtFindOdbc.txt @@ -6,7 +6,7 @@ # - ODBC_PREFIX IF(WIN32) -SET(ODBC_LIBRARY Odbc32) +SET(ODBC_LIBRARY odbc32) SET(ODBC_LIBRARIES ${ODBC_LIBRARY}) SET(ODBC_INCLUDE "") SET(ODBC_FOUND TRUE) diff --git a/cmake/WtFindSkia.txt b/cmake/WtFindSkia.txt index 5a92e0da90..cb2d317fb5 100644 --- a/cmake/WtFindSkia.txt +++ b/cmake/WtFindSkia.txt @@ -113,7 +113,7 @@ IF(WIN32) optimized ${SKIA_SKGPU_LIB_R} debug ${SKIA_SKGPU_LIB_D} Usp10.lib - Opengl32.lib + opengl32.lib ) IF(SKIA_OPTS_SSE41_LIB_D AND SKIA_OPTS_SSE41_LIB_R) diff --git a/examples/widgetgallery/approot/text.xml b/examples/widgetgallery/approot/text.xml index 2bbfc978a7..aee7f74e39 100644 --- a/examples/widgetgallery/approot/text.xml +++ b/examples/widgetgallery/approot/text.xml @@ -4218,7 +4218,7 @@ values corresponding to each category are plotted consecutively in model row order. Each data series corresponds to a column from the model and may be rendered differently (This is configured in the data series - See - ${doc-link WDataSeries} for more information). + ${doc-link Chart-WDataSeries} for more information).

As a cartesian chart it provides automatic configuration of the axes, and diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f16afc0653..1f287027b9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -459,9 +459,9 @@ SET(WT_FONTSUPPORT_SIMPLE false) SET(WT_FONTSUPPORT_PANGO false) SET(WT_FONTSUPPORT_DIRECTWRITE false) SET(HAVE_DIRECTWRITE false) -IF(WIN32 AND NOT MINGW) +IF(WIN32) SET(HAVE_DIRECTWRITE true) -ENDIF(WIN32 AND NOT MINGW) +ENDIF(WIN32) IF(HAVE_HARU OR "${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "GraphicsMagick" OR "${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "Direct2D") IF(HAVE_PANGO AND NOT "${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "Direct2D") @@ -602,7 +602,7 @@ ELSEIF("${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "skia") INCLUDE_DIRECTORIES(${SKIA_INCLUDE_DIRS}) ADD_DEFINITIONS(${SKIA_DEFINES}) ELSEIF("${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "Direct2D") - TARGET_LINK_LIBRARIES(wt PRIVATE D2d1 Dwrite Windowscodecs Shlwapi) + TARGET_LINK_LIBRARIES(wt PRIVATE d2d1 dwrite windowscodecs shlwapi) ELSE("${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "GraphicsMagick") MESSAGE("** Disabling raster image support (WRasterImage): set WT_WRASTERIMAGE_IMPLEMENTATION to GraphicsMagick or skia.") ENDIF("${WT_WRASTERIMAGE_IMPLEMENTATION}" STREQUAL "GraphicsMagick") @@ -629,7 +629,7 @@ ELSEIF(WT_FONTSUPPORT_PANGO) ADD_DEFINITIONS(-DWT_FONTSUPPORT_PANGO) MESSAGE("** Enabling advanced font support using libpango") ELSEIF(WT_FONTSUPPORT_DIRECTWRITE) - TARGET_LINK_LIBRARIES(wt PRIVATE Dwrite) + TARGET_LINK_LIBRARIES(wt PRIVATE dwrite) ADD_DEFINITIONS(-DWT_FONTSUPPORT_DIRECTWRITE) MESSAGE("** Enabling advanced font support using DirectWrite") ENDIF(WT_FONTSUPPORT_SIMPLE) diff --git a/src/Wt/Dbo/Query.C b/src/Wt/Dbo/Query.C index 8fcc834327..780475735c 100644 --- a/src/Wt/Dbo/Query.C +++ b/src/Wt/Dbo/Query.C @@ -334,7 +334,8 @@ AbstractQuery::~AbstractQuery() { } AbstractQuery::AbstractQuery(const AbstractQuery& other) - : where_(other.where_), + : join_(other.join_), + where_(other.where_), groupBy_(other.groupBy_), having_(other.having_), orderBy_(other.orderBy_), @@ -347,6 +348,7 @@ AbstractQuery::AbstractQuery(const AbstractQuery& other) AbstractQuery& AbstractQuery::operator=(const AbstractQuery& other) { + join_ = other.join_; where_ = other.where_; groupBy_ = other.groupBy_; having_ = other.having_; diff --git a/src/Wt/WWebWidget.C b/src/Wt/WWebWidget.C index 055c8a54fa..9f74035722 100644 --- a/src/Wt/WWebWidget.C +++ b/src/Wt/WWebWidget.C @@ -119,7 +119,6 @@ WWebWidget::OtherImpl::JavaScriptStatement::JavaScriptStatement WWebWidget::OtherImpl::OtherImpl(WWebWidget *const self) : elementTagName_(nullptr), - id_(nullptr), tabIndex_(std::numeric_limits::min()), scrollVisibilityMargin_(0), jsScrollVisibilityChanged_(self, "scrollVisibilityChanged") @@ -172,10 +171,10 @@ void WWebWidget::setId(const std::string& id) app->removeExposedSignal(signal); } - if (!otherImpl_->id_) - otherImpl_->id_.reset(new std::string()); + if (!id_) + id_.reset(new std::string()); - *otherImpl_->id_ = id; + *id_ = id; for (std::size_t i = 0; i < jsignals_.size(); ++i) { EventSignalBase* signal = jsignals_[i]; @@ -195,8 +194,8 @@ void WWebWidget::setSelectable(bool selectable) const std::string WWebWidget::id() const { - if (otherImpl_ && otherImpl_->id_) - return *otherImpl_->id_; + if (id_) + return *id_; else return WWidget::id(); } @@ -2195,7 +2194,7 @@ std::string WWebWidget::htmlTagName() const void WWebWidget::setId(DomElement *element, WApplication *app) { if (!app->environment().agentIsSpiderBot() - || (otherImpl_ && otherImpl_->id_)) { + || id_) { if (!flags_.test(BIT_FORM_OBJECT)) element->setId(id()); else @@ -2294,7 +2293,7 @@ DomElement *WWebWidget::createStubElement(WApplication *app) stub->setProperty(Property::InnerHTML, "..."); if (!app->environment().agentIsSpiderBot() - || (otherImpl_ && otherImpl_->id_)) + || id_) stub->setId(id()); return stub; diff --git a/src/Wt/WWebWidget.h b/src/Wt/WWebWidget.h index 1cc8029501..5556a8796b 100644 --- a/src/Wt/WWebWidget.h +++ b/src/Wt/WWebWidget.h @@ -420,6 +420,13 @@ class WT_API WWebWidget : public WWidget std::unique_ptr width_; std::unique_ptr height_; + /* + * id_ is separate instead of in OtherImpl, + * because it is accessed when OtherImpl is being destroyed, + * from the destructor of jsScrollVisibilityChanged_ + */ + std::unique_ptr id_; + /* * Data only stored transiently, during event handling. */ @@ -495,7 +502,6 @@ class WT_API WWebWidget : public WWidget }; std::unique_ptr elementTagName_; - std::unique_ptr id_; std::unique_ptr > attributes_; std::unique_ptr > jsMembers_; std::unique_ptr > jsStatements_; diff --git a/test/dbo/DboTest.C b/test/dbo/DboTest.C index b13cabc6bf..e182f0f704 100644 --- a/test/dbo/DboTest.C +++ b/test/dbo/DboTest.C @@ -3159,3 +3159,61 @@ BOOST_AUTO_TEST_CASE( dbo_test39c ) } #endif } + +BOOST_AUTO_TEST_CASE( dbo_test40 ) +{ + // Test join function + DboFixture f; + dbo::Session &session = *f.session_; + + { + dbo::Transaction t(session); + + dbo::ptr a = session.addNew(); + a.modify()->i = 5; + dbo::ptr b = session.addNew(); + b.modify()->name = "Test"; + dbo::ptr b2 = session.addNew(); + b2.modify()->name = "Test2"; + + a.modify()->b = b; + } + + { + dbo::Transaction t(session); + + dbo::collection > results = session.query >("select a from \"table_a\" a") + .join("\"table_b\" b on a.\"b_id\" = b.\"id\"") + .where("b.\"name\" = ?") + .bind("Test"); + + BOOST_REQUIRE(results.size() == 1); + + dbo::ptr first = *results.begin(); + + BOOST_REQUIRE(first); + + BOOST_REQUIRE(first->i == 5); + } + + { + // This was a bug: AbstractQuery's copy ctor would not copy over the join_ field, + // causing an error + + dbo::Transaction t(session); + dbo::Query > q = session.query >("select a from \"table_a\" a") + .join("\"table_b\" b on a.\"b_id\" = b.\"id\""); + + q.where("b.\"name\" = ?").bind("Test"); + + dbo::collection > results = q.resultList(); + + BOOST_REQUIRE(results.size() == 1); + + dbo::ptr first = *results.begin(); + + BOOST_REQUIRE(first); + + BOOST_REQUIRE(first->i == 5); + } +}