diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-06-06 21:47:02 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2015-06-06 21:47:02 +0100 |
commit | 75760ea25c366a47edbd989895b58326da5491d9 (patch) | |
tree | 10e6654c7cf935bf8990231a837ba1024bf8ee0e | |
parent | Tweaks while tracking down Column leak (diff) | |
download | project2-75760ea25c366a47edbd989895b58326da5491d9.tar.bz2 project2-75760ea25c366a47edbd989895b58326da5491d9.tar.xz project2-75760ea25c366a47edbd989895b58326da5491d9.zip |
Move row values stack in ExecContext
Introduce TestAppInstane to provide an AppInstance and ExecContext during UT runs
27 files changed, 127 insertions, 68 deletions
diff --git a/project2/basics/caches/memoryCache.cpp b/project2/basics/caches/memoryCache.cpp index 16bdfa8..6e5aab6 100644 --- a/project2/basics/caches/memoryCache.cpp +++ b/project2/basics/caches/memoryCache.cpp @@ -42,9 +42,9 @@ class MemoryCache : public RowSetCache { { } - void execute(const Glib::ustring&, const RowProcessorCallback & rp, ExecContext *) const { + void execute(const Glib::ustring&, const RowProcessorCallback & rp, ExecContext * ec) const { for (const DataCache::value_type & mcr : dataCache) { - mcr->process(rp, false); + mcr->process(ec, rp, false); } } diff --git a/project2/basics/unittests/testLibraries.cpp b/project2/basics/unittests/testLibraries.cpp index b77b671..e48d77e 100644 --- a/project2/basics/unittests/testLibraries.cpp +++ b/project2/basics/unittests/testLibraries.cpp @@ -4,11 +4,11 @@ #include <testOptionsSource.h> #include <exceptions.h> #include <library.h> -#include <appInstance.h> +#include <testAppInstance.h> const auto self = boost::filesystem::canonical("/proc/self/exe"); -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( load_missing_library ) { diff --git a/project2/basics/unittests/testViews.cpp b/project2/basics/unittests/testViews.cpp index a74c9e3..a2ea224 100644 --- a/project2/basics/unittests/testViews.cpp +++ b/project2/basics/unittests/testViews.cpp @@ -5,10 +5,10 @@ #include <testOptionsSource.h> #include <testScriptHost.h> #include <definedDirs.h> -#include <appInstance.h> +#include <testAppInstance.h> boost::intrusive_ptr<TestScriptHost> -executeRowViewTest(const boost::filesystem::path & script, const boost::filesystem::path & expected) +executeRowViewTest(ExecContext * ec, const boost::filesystem::path & script, const boost::filesystem::path & expected) { TestOptionsSource::LoadTestOptions({ { "common.datasourceRoot", RootDir.string() }, @@ -18,27 +18,27 @@ executeRowViewTest(const boost::filesystem::path & script, const boost::filesyst ScriptReaderPtr r = new XmlScriptParser(script); boost::intrusive_ptr<TestScriptHost> sr = new TestScriptHost(r); BOOST_TEST_CHECKPOINT("Execute"); - sr->process(NULL); + sr->process(ec); BOOST_TEST_CHECKPOINT("Compare"); BOOST_REQUIRE_EQUAL(sr->GetPresenterData(), expected); return sr; } -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( test_rowview_unsetcolumns ) { - executeRowViewTest(RootDir / "test_rowview_unsetcolumns.xml", RootDir / "expected" / "test_rowview_unsetcolumns.log"); + executeRowViewTest(this, RootDir / "test_rowview_unsetcolumns.xml", RootDir / "expected" / "test_rowview_unsetcolumns.log"); } BOOST_AUTO_TEST_CASE( test_rowview_nocolumns ) { - executeRowViewTest(RootDir / "test_rowview_nocolumns.xml", RootDir / "expected" / "test_rowview_nocolumns.log"); + executeRowViewTest(this, RootDir / "test_rowview_nocolumns.xml", RootDir / "expected" / "test_rowview_nocolumns.log"); } BOOST_AUTO_TEST_CASE( test_rowview_columns ) { - executeRowViewTest(RootDir / "test_rowview_columns.xml", RootDir / "expected" / "test_rowview_columns.log"); + executeRowViewTest(this, RootDir / "test_rowview_columns.xml", RootDir / "expected" / "test_rowview_columns.log"); } BOOST_AUTO_TEST_SUITE_END(); diff --git a/project2/common/execContext.cpp b/project2/common/execContext.cpp index e39c72c..1349ab0 100644 --- a/project2/common/execContext.cpp +++ b/project2/common/execContext.cpp @@ -1,6 +1,7 @@ #include "execContext.h" #include "logger.h" #include "presenter.h" +#include "rowSet.h" void ExecContext::logMessage(bool writeLog, const Glib::ustring & g, const Glib::ustring & m) @@ -33,3 +34,25 @@ ExecContext::Message::Message(const Glib::ustring & g, const Glib::ustring & m) { } +void +ExecContext::RowValuesPush(const RowState * rs) +{ + rowValuesStack.push_back(rs); +} + +void +ExecContext::RowValuesPop() +{ + rowValuesStack.pop_back(); +} + +const RowState * +ExecContext::RowValues(size_t depth) const +{ + if (depth > rowValuesStack.size()) { + throw RowSet::ParentOutOfRange(depth); + } + return rowValuesStack.at(rowValuesStack.size() - depth); +} + + diff --git a/project2/common/execContext.h b/project2/common/execContext.h index 6018058..5bce0d7 100644 --- a/project2/common/execContext.h +++ b/project2/common/execContext.h @@ -8,6 +8,7 @@ #include "session.h" class MultiRowSetPresenter; +class RowState; class ExecContext { public: @@ -20,6 +21,7 @@ class ExecContext { }; typedef boost::intrusive_ptr<Message> MessagePtr; typedef std::list<MessagePtr> Messages; + typedef std::vector<const RowState *> RowValuesStack; virtual VariableType getParameter(const VariableType & key) const = 0; virtual SessionPtr getSession() const = 0; @@ -29,8 +31,13 @@ class ExecContext { void addContextData(const MultiRowSetPresenter * p) const; + void RowValuesPush(const RowState *); + void RowValuesPop(); + const RowState * RowValues(size_t depth) const; + private: Messages messages; + RowValuesStack rowValuesStack; }; #endif diff --git a/project2/common/rowSet.cpp b/project2/common/rowSet.cpp index 702aec1..cb7dd31 100644 --- a/project2/common/rowSet.cpp +++ b/project2/common/rowSet.cpp @@ -5,8 +5,7 @@ #include "logger.h" #include "variables.h" #include <boost/bind.hpp> - -RowState::RowValuesStack RowState::stack; +#include "execContext.h" RowSet::RowSet(ScriptNodePtr p) : SourceObject(p) @@ -19,11 +18,11 @@ RowState::RowState() : } void -RowState::process(const RowProcessorCallback & rp, bool r) +RowState::process(ExecContext * ec, const RowProcessorCallback & rp, bool r) { rowNum += 1; - stack.push_back(this); - ScopeObject s(boost::bind(&RowState::RowValuesStack::pop_back, &stack)); + ec->RowValuesPush(this); + ScopeObject s(boost::bind(&ExecContext::RowValuesPop, ec)); rp(this); if (r) { reset(); diff --git a/project2/common/rowSet.h b/project2/common/rowSet.h index e6793c5..f36f79f 100644 --- a/project2/common/rowSet.h +++ b/project2/common/rowSet.h @@ -40,7 +40,7 @@ class RowState { SimpleMessageException(AttributeDoesNotExist); VariableType getRowNum() const; - void process(const RowProcessorCallback &, bool reset = true); + void process(ExecContext *, const RowProcessorCallback &, bool reset = true); void blankRow(); void reset(); virtual VariableType getCurrentValue(ExecContext *, const Glib::ustring & id) const; @@ -52,13 +52,8 @@ class RowState { typedef std::vector<VariableType> FieldValues; FieldValues fields; - - typedef std::vector<const RowState *> RowValuesStack; - static const RowValuesStack & Stack() { return stack; } - private: unsigned int rowNum; - static RowValuesStack stack; }; #endif diff --git a/project2/common/variables.cpp b/project2/common/variables.cpp index eb36d7a..87673a7 100644 --- a/project2/common/variables.cpp +++ b/project2/common/variables.cpp @@ -13,6 +13,7 @@ #include <boost/function.hpp> #include <boost/bind.hpp> #include "instanceStore.impl.h" +#include "execContext.h" VariableImplDyn::VariableImplDyn(ScriptNodePtr e) { @@ -45,10 +46,7 @@ class VariableParent : public VariableImplDyn { VariableType value(ExecContext * ec) const { try { - if (depth > RowState::Stack().size()) { - throw RowSet::ParentOutOfRange(depth); - } - const auto & row = RowState::Stack()[RowState::Stack().size() - depth]; + const auto & row = ec->RowValues(depth); if (attr) { return row->resolveAttr(name)(); } diff --git a/project2/files/fsRows.cpp b/project2/files/fsRows.cpp index 657973f..d22b6ea 100644 --- a/project2/files/fsRows.cpp +++ b/project2/files/fsRows.cpp @@ -104,7 +104,7 @@ FsRows::execute(SearchState & ss, const Path & dir, const RowProcessorCallback & lstat(ss.curPathStr.c_str(), &ss.curStat); if (boost::algorithm::all(ss.specs, boost::bind(&SpecBase::matches, _1, &ss, ec))) { - ss.process(rp); + ss.process(ec, rp); } if (S_ISDIR(ss.curStat.st_mode) && boost::algorithm::all(ss.specs, boost::bind(&SpecBase::recurse, _1, &ss, ec))) { diff --git a/project2/ice/iceRows.cpp b/project2/ice/iceRows.cpp index e9c0e9e..6e2015d 100644 --- a/project2/ice/iceRows.cpp +++ b/project2/ice/iceRows.cpp @@ -26,7 +26,8 @@ class IceRowState : public RowState { VariableType & vt; }; - IceRowState(ModelPartPtr mp) + IceRowState(ExecContext * e, ModelPartPtr mp) : + ec(e) { unsigned int idx = 0; mp->OnEachChild(boost::bind(&IceRowState::AddColumn, this, boost::ref(idx), _1)); @@ -44,7 +45,7 @@ class IceRowState : public RowState { { auto field = fields.begin(); mp->OnEachChild(boost::bind(&IceRowState::AssignFieldValue, this, boost::ref(field), _2)); - this->process(rp); + this->process(ec, rp); } void AssignFieldValue(FieldValues::iterator & field, ModelPartPtr domp) @@ -56,10 +57,12 @@ class IceRowState : public RowState { } Columns columns; + ExecContext * ec; }; -RowProcSerializer::RowProcSerializer(const RowProcessorCallback & r) : - rpc(r) +RowProcSerializer::RowProcSerializer(ExecContext * e, const RowProcessorCallback & r) : + rpc(r), + ec(e) { } @@ -75,7 +78,7 @@ RowProcSerializer::Serialize(ModelPartPtr mp) throw std::runtime_error("Not a sequence of things"); case mpt_Complex: { - IceRowState irs(mp); + IceRowState irs(ec, mp); irs.IterateOver(mp, rpc); break; } @@ -106,7 +109,7 @@ RowProcSerializer::SerializeRow(IceRowState * & irs, ModelPartPtr mp) break; case mpt_Complex: if (!irs) { - irs = new IceRowState(mp); + irs = new IceRowState(ec, mp); } irs->IterateOver(mp, rpc); break; diff --git a/project2/ice/iceRows.h b/project2/ice/iceRows.h index 4c15217..dc729ff 100644 --- a/project2/ice/iceRows.h +++ b/project2/ice/iceRows.h @@ -11,7 +11,7 @@ class IceRowState; class RowProcSerializer : public Slicer::Serializer { public: - RowProcSerializer(const RowProcessorCallback &); + RowProcSerializer(ExecContext *, const RowProcessorCallback &); void Serialize(Slicer::ModelPartPtr) override; @@ -19,6 +19,7 @@ class RowProcSerializer : public Slicer::Serializer { void SerializeRow(IceRowState * &, Slicer::ModelPartPtr); const RowProcessorCallback & rpc; + ExecContext * ec; }; template <typename Interface> diff --git a/project2/ice/slice2Rows.cpp b/project2/ice/slice2Rows.cpp index 1001f4c..8c67222 100644 --- a/project2/ice/slice2Rows.cpp +++ b/project2/ice/slice2Rows.cpp @@ -54,7 +54,7 @@ Slice2Rows::visitOperation(const Slice::OperationPtr & o) fprintf(code, "\t\t\t\t\tvoid execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext * ec) const\n"); fprintf(code, "\t\t\t\t\t{\n"); FunctionBegin(o); - fprintf(code, "\t\t\t\t\t\tSlicer::SerializerPtr toRpc = new RowProcSerializer(rp);\n"); + fprintf(code, "\t\t\t\t\t\tSlicer::SerializerPtr toRpc = new RowProcSerializer(ec, rp);\n"); fprintf(code, "\t\t\t\t\t\tauto result = "); CallOperation(o); fprintf(code, ";\n"); diff --git a/project2/ice/unittests/testClient.cpp b/project2/ice/unittests/testClient.cpp index 97acd0b..55663a0 100644 --- a/project2/ice/unittests/testClient.cpp +++ b/project2/ice/unittests/testClient.cpp @@ -13,7 +13,7 @@ #include <scopeObject.h> #include <unittest.h> #include <unittestComplex.h> -#include <appInstance.h> +#include <testAppInstance.h> #define XSTR(s) STR(s) #define STR(s) #s @@ -103,7 +103,7 @@ class DummyComplex : public UnitTestComplex::ComplexInterface { static void -commonTests() +commonTests(ExecContext * ec) { BOOST_TEST_CHECKPOINT("Verify loaded"); BOOST_REQUIRE(ElementLoader::getFor("UnitTest-SimpleInterface-SomeTask")); @@ -132,7 +132,7 @@ commonTests() boost::intrusive_ptr<TestScriptHost> sr = new TestScriptHost(r); BOOST_REQUIRE_EQUAL(dummy->execCount, 0); BOOST_REQUIRE_EQUAL(dummyComplex->execCount, 0); - sr->process(NULL); + sr->process(ec); BOOST_REQUIRE_EQUAL(dummy->execCount, 4); BOOST_REQUIRE_EQUAL(dummyComplex->execCount, 1); BOOST_REQUIRE_EQUAL(sr->GetPresenterData(), iceroot / "expected" / "clientPresenter.log"); @@ -152,9 +152,9 @@ unloadTests() BOOST_REQUIRE_THROW(ElementLoader::getFor("UnitTestComplex-ComplexInterface-ComplexRow"), NotSupported); } -void test_client_run(const boost::filesystem::path & tmpdir); +void test_client_run(ExecContext *, const boost::filesystem::path & tmpdir); -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( test_client ) { @@ -162,14 +162,14 @@ BOOST_AUTO_TEST_CASE( test_client ) BOOST_TEST_CHECKPOINT("Clean up"); boost::filesystem::remove_all(tmpdir); - test_client_run(tmpdir); - test_client_run(tmpdir); + test_client_run(this, tmpdir); + test_client_run(this, tmpdir); boost::filesystem::remove_all(tmpdir); } BOOST_AUTO_TEST_SUITE_END(); -void test_client_run(const boost::filesystem::path & tmpdir) +void test_client_run(ExecContext * ec, const boost::filesystem::path & tmpdir) { BOOST_TEST_CHECKPOINT("Configure, compile, link, load"); TestOptionsSource::LoadTestOptions({ @@ -186,7 +186,7 @@ void test_client_run(const boost::filesystem::path & tmpdir) BOOST_REQUIRE(!boost::filesystem::exists(tmpdir / "unittestTypes.client.so")); BOOST_REQUIRE(!boost::filesystem::exists(tmpdir / "unittestComplex.so")); BOOST_REQUIRE(boost::filesystem::exists(tmpdir / "unittestComplex.client.so")); - commonTests(); + commonTests(ec); TestOptionsSource::LoadTestOptions({ }); unloadTests(); diff --git a/project2/ice/unittests/testClientCompile.cpp b/project2/ice/unittests/testClientCompile.cpp index 3b27d63..ef4b0ea 100644 --- a/project2/ice/unittests/testClientCompile.cpp +++ b/project2/ice/unittests/testClientCompile.cpp @@ -8,7 +8,7 @@ #include <scripts.h> #include <testScriptHost.h> #include <scopeObject.h> -#include <appInstance.h> +#include <testAppInstance.h> #define XSTR(s) STR(s) #define STR(s) #s @@ -41,7 +41,7 @@ unloadTests() BOOST_REQUIRE_THROW(ElementLoader::getFor("UnitTest-SimpleInterface-SomeRowsParams"), NotSupported); } -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( compile_client_full ) { diff --git a/project2/ice/unittests/testDaemon.cpp b/project2/ice/unittests/testDaemon.cpp index a01782e..3ca9261 100644 --- a/project2/ice/unittests/testDaemon.cpp +++ b/project2/ice/unittests/testDaemon.cpp @@ -8,7 +8,7 @@ #include <task.h> #include <logger.h> #include <variables.h> -#include <appInstance.h> +#include <testAppInstance.h> #define XSTR(s) STR(s) #define STR(s) #s @@ -196,7 +196,7 @@ unloadTests() BOOST_REQUIRE_THROW(IceDaemonAdapterHandlerLoader::createNew("UnitTest-SimpleInterface", NULL), NotSupported); } -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( test_daemon ) { diff --git a/project2/ice/unittests/testDaemonCompile.cpp b/project2/ice/unittests/testDaemonCompile.cpp index 02c64d6..d93dbf0 100644 --- a/project2/ice/unittests/testDaemonCompile.cpp +++ b/project2/ice/unittests/testDaemonCompile.cpp @@ -4,7 +4,7 @@ #include <testOptionsSource.h> #include <exceptions.h> #include <iceDaemon.h> -#include <appInstance.h> +#include <testAppInstance.h> #define XSTR(s) STR(s) #define STR(s) #s @@ -29,7 +29,7 @@ unloadTests() BOOST_REQUIRE_THROW(IceDaemonAdapterHandlerLoader::createNew("UnitTest-SimpleInterface", NULL), NotSupported); } -BOOST_FIXTURE_TEST_SUITE( Core, AppInstance ); +BOOST_FIXTURE_TEST_SUITE( Core, TestAppInstance ); BOOST_AUTO_TEST_CASE( compile_daemon_full ) { diff --git a/project2/regex/regexRows.cpp b/project2/regex/regexRows.cpp index 514d47a..6d72ccc 100644 --- a/project2/regex/regexRows.cpp +++ b/project2/regex/regexRows.cpp @@ -31,7 +31,7 @@ RegexRows::execute(const Glib::ustring&, const RowProcessorCallback & rp, ExecCo for (n = 1; n < cols; n += 1) { cv.fields[n - 1] = matches.fetch(n); } - cv.process(rp); + cv.process(ec, rp); } while (matches.next()); } } diff --git a/project2/sql/sqlCache.cpp b/project2/sql/sqlCache.cpp index 3fca870..142bf6f 100644 --- a/project2/sql/sqlCache.cpp +++ b/project2/sql/sqlCache.cpp @@ -85,7 +85,7 @@ class SqlCache : public RowSetCache { friend class SqlCacheRowSet; const SqlCacheRowSet * sc; }; - void execute(const Glib::ustring&, const RowProcessorCallback & rp, ExecContext *) const { + void execute(const Glib::ustring&, const RowProcessorCallback & rp, ExecContext * ec) const { SqlCacheRowState ss(this); HandleAsVariableType h; do { @@ -115,7 +115,7 @@ class SqlCache : public RowSetCache { col.apply(h); ss.fields[&c - &colCols.front()] = h.variable; } - ss.process(rp); + ss.process(ec, rp); } } while (s->fetch()); } diff --git a/project2/sql/sqlMergeTask.cpp b/project2/sql/sqlMergeTask.cpp index d0f6499..df4b0c0 100644 --- a/project2/sql/sqlMergeTask.cpp +++ b/project2/sql/sqlMergeTask.cpp @@ -7,6 +7,7 @@ #include "sqlVariableBinder.h" #include "scriptLoader.h" #include "scopeObject.h" +#include "execContext.h" #include <misc.h> #include <stdio.h> #include <stdexcept> @@ -277,7 +278,7 @@ class Populate : public NoOutputExecute { void execute(ExecContext * ec) const { unsigned int idx = 0; - RowState::Stack().back()->foreachColumn(ec, boost::bind(&Populate::bind, this, boost::ref(idx), _3)); + ec->RowValues(0)->foreachColumn(ec, boost::bind(&Populate::bind, this, boost::ref(idx), _3)); cmd->execute(); } private: diff --git a/project2/sql/sqlRows.cpp b/project2/sql/sqlRows.cpp index 59aa0e8..f8a16e1 100644 --- a/project2/sql/sqlRows.cpp +++ b/project2/sql/sqlRows.cpp @@ -61,7 +61,7 @@ SqlRows::execute(const Glib::ustring & filter, const RowProcessorCallback & rp, col.apply(h); ss.fields[c] = h.variable; } - ss.process(rp); + ss.process(ec, rp); } } diff --git a/project2/streams/streamNvpRows.cpp b/project2/streams/streamNvpRows.cpp index 02d1adc..8bc5b87 100644 --- a/project2/streams/streamNvpRows.cpp +++ b/project2/streams/streamNvpRows.cpp @@ -33,9 +33,10 @@ class StreamNvpRows : public RowSet { mutable size_t firstMatch; }; - ParseState(const StreamNvpRows * rows, const RowProcessorCallback & proc) : + ParseState(const StreamNvpRows * rows, ExecContext * e, const RowProcessorCallback & proc) : sr(rows), rp(proc), + ec(e), inQuotes(false), inValue(false), prevWasQuote(false) @@ -99,7 +100,7 @@ class StreamNvpRows : public RowSet { } } if (!columns.empty()) { - process(rp); + process(ec, rp); } fields.clear(); columns.clear(); @@ -135,6 +136,7 @@ class StreamNvpRows : public RowSet { const StreamNvpRows * sr; const RowProcessorCallback & rp; + ExecContext * ec; bool inQuotes; bool inValue; bool prevWasQuote; @@ -161,7 +163,7 @@ class StreamNvpRows : public RowSet { void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext * ec) const { - ParseState ps(this, rp); + ParseState ps(this, ec, rp); TextReader::CharSink cs = boost::bind(&StreamNvpRows::ParseState::pushChar, &ps, _1); TextReader t(encoding.c_str()); stream->runStream(boost::bind(&TextReader::read, &t, _1, _2, cs), ec); diff --git a/project2/streams/streamRows.cpp b/project2/streams/streamRows.cpp index 890e1d7..1b9063f 100644 --- a/project2/streams/streamRows.cpp +++ b/project2/streams/streamRows.cpp @@ -14,10 +14,11 @@ class StreamRows : public DefinedColumns, public RowSet { public: class ParseState : public ColumnValues { public: - ParseState(const StreamRows * rows, const RowProcessorCallback & proc) : + ParseState(const StreamRows * rows, ExecContext * e, const RowProcessorCallback & proc) : ColumnValues(rows), sr(rows), rp(proc), + ec(e), skipheader(rows->skipheader), inQuotes(false), prevWasQuote(false), @@ -34,6 +35,7 @@ class StreamRows : public DefinedColumns, public RowSet { const StreamRows * sr; const RowProcessorCallback & rp; + ExecContext * ec; size_t skipheader; bool inQuotes; bool prevWasQuote; @@ -59,7 +61,7 @@ class StreamRows : public DefinedColumns, public RowSet { void execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecContext * ec) const { - ParseState ps(this, rp); + ParseState ps(this, ec, rp); TextReader::CharSink cs = boost::bind(&StreamRows::pushChar, this, _1, boost::ref(ps)); TextReader t(encoding.c_str()); stream->runStream(boost::bind(&TextReader::read, &t, _1, _2, cs), ec); @@ -80,7 +82,7 @@ class StreamRows : public DefinedColumns, public RowSet { while (ps.curCol != ps.fields.end()) { *ps.curCol++ = Null(); } - ps.process(ps.rp); + ps.process(ps.ec, ps.rp); } else if (countBlankRows) { ps.blankRow(); @@ -125,7 +127,7 @@ class StreamRows : public DefinedColumns, public RowSet { while (ps.curCol != ps.fields.end()) { *ps.curCol++ = Null(); } - ps.process(ps.rp); + ps.process(ps.ec, ps.rp); } else if (countBlankRows) { ps.blankRow(); @@ -141,7 +143,6 @@ class StreamRows : public DefinedColumns, public RowSet { const Glib::ustring newline; const std::string encoding; const size_t skipheader; - bool convertRequired; }; DECLARE_LOADER("streamrows", StreamRows); diff --git a/project2/ut/testAppInstance.cpp b/project2/ut/testAppInstance.cpp new file mode 100644 index 0000000..21e9c38 --- /dev/null +++ b/project2/ut/testAppInstance.cpp @@ -0,0 +1,15 @@ +#include "testAppInstance.h" + +VariableType +TestAppInstance::getParameter(const VariableType &) const +{ + throw std::runtime_error("TestAppInstance doesn't support parameters"); +} + +SessionPtr +TestAppInstance::getSession() const +{ + throw std::runtime_error("TestAppInstance doesn't support sessions"); +} + + diff --git a/project2/ut/testAppInstance.h b/project2/ut/testAppInstance.h new file mode 100644 index 0000000..aa52227 --- /dev/null +++ b/project2/ut/testAppInstance.h @@ -0,0 +1,14 @@ +#ifndef TESTAPPINSTANCE_H +#define TESTAPPINSTANCE_H + +#include <appInstance.h> +#include <execContext.h> + +class TestAppInstance : public AppInstance, public ExecContext { + public: + VariableType getParameter(const VariableType & key) const override; + SessionPtr getSession() const override; +}; + +#endif + diff --git a/project2/xml/xmlRawRows.cpp b/project2/xml/xmlRawRows.cpp index f9a236e..eb6e003 100644 --- a/project2/xml/xmlRawRows.cpp +++ b/project2/xml/xmlRawRows.cpp @@ -51,7 +51,7 @@ XmlRawRowsBase::XmlRawRowsBase() : { } -void XmlRawRowsBase::execute(const xmlpp::Document * doc, const RowProcessorCallback & rp, ExecContext *) const +void XmlRawRowsBase::execute(const xmlpp::Document * doc, const RowProcessorCallback & rp, ExecContext * ec) const { XmlRowState rs; for (const xmlpp::Node * n : doc->get_root_node()->get_children()) { @@ -76,7 +76,7 @@ void XmlRawRowsBase::execute(const xmlpp::Document * doc, const RowProcessorCall col++; } } - rs.process(rp); + rs.process(ec, rp); } } } diff --git a/project2/xml/xmlRows.cpp b/project2/xml/xmlRows.cpp index e45ec03..e0ffb5b 100644 --- a/project2/xml/xmlRows.cpp +++ b/project2/xml/xmlRows.cpp @@ -87,7 +87,7 @@ XmlRows::execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecCon } if (empty) { if (position == trigger) { - xs.process(rp, false); + xs.process(ec, rp, false); } if (position == root) { xs.reset(); @@ -104,7 +104,7 @@ XmlRows::execute(const Glib::ustring &, const RowProcessorCallback & rp, ExecCon case XML_READER_TYPE_END_ELEMENT: if (enableCapture) { if (position == trigger) { - xs.process(rp, false); + xs.process(ec, rp, false); } if (position == root) { xs.reset(); diff --git a/project2/xml/xpathRows.cpp b/project2/xml/xpathRows.cpp index a73dd39..e97270f 100644 --- a/project2/xml/xpathRows.cpp +++ b/project2/xml/xpathRows.cpp @@ -111,7 +111,7 @@ XPathRows::execute(const Glib::ustring & filter, const RowProcessorCallback & rp xs.fields[xp->idx] = str; } } - xs.process(rp); + xs.process(ec, rp); } } |