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);
+ }
+}