diff options
| -rw-r--r-- | icetray/icetray/abstractCachingDatabaseClient.h | 2 | ||||
| -rw-r--r-- | icetray/icetray/sqlSource.cpp | 12 | ||||
| -rw-r--r-- | icetray/icetray/sqlSource.h | 17 | ||||
| -rw-r--r-- | icetray/icetray/staticSqlSource.cpp | 20 | ||||
| -rw-r--r-- | icetray/icetray/staticSqlSource.h | 9 | ||||
| -rw-r--r-- | icetray/tool/icetray.jam | 3 | ||||
| -rw-r--r-- | icetray/tool/icetraySql.cpp | 41 | ||||
| -rw-r--r-- | icetray/unittests/testIceTray.cpp | 1 | ||||
| -rw-r--r-- | icetray/unittests/testIceTrayServiceTestSql.sql | 3 | 
9 files changed, 75 insertions, 33 deletions
| diff --git a/icetray/icetray/abstractCachingDatabaseClient.h b/icetray/icetray/abstractCachingDatabaseClient.h index 4abeba7..f910626 100644 --- a/icetray/icetray/abstractCachingDatabaseClient.h +++ b/icetray/icetray/abstractCachingDatabaseClient.h @@ -22,7 +22,7 @@ namespace IceTray {  			{  				CacheKey key;  				key.reserve(sizeof...(Params) + 2); -				key.push_back(sql.getSqlHash()); +				key.push_back(*sql.getCommandOptions()->hash);  				key.push_back(typeid(Domain).hash_code());  				keyPushParams(key, params...);  				if (auto cached = cache.get(key)) { diff --git a/icetray/icetray/sqlSource.cpp b/icetray/icetray/sqlSource.cpp index b7d705e..de970bb 100644 --- a/icetray/icetray/sqlSource.cpp +++ b/icetray/icetray/sqlSource.cpp @@ -1,10 +1,16 @@  #include "sqlSource.h"  namespace IceTray { -	std::size_t -	SqlSource::getSqlHash() const +	DB::ModifyCommandPtr +	SqlSource::modify(DB::Connection * db) const  	{ -		return std::hash<std::string>()(getSql()); +		return db->modify(getSql(), getCommandOptions()); +	} + +	DB::SelectCommandPtr +	SqlSource::select(DB::Connection * db) const +	{ +		return db->select(getSql(), getCommandOptions());  	}  } diff --git a/icetray/icetray/sqlSource.h b/icetray/icetray/sqlSource.h index a0e8ea1..70afe8c 100644 --- a/icetray/icetray/sqlSource.h +++ b/icetray/icetray/sqlSource.h @@ -14,21 +14,10 @@ namespace IceTray {  			virtual ~SqlSource() = default;  			virtual const std::string & getSql() const = 0; -			virtual std::size_t getSqlHash() const; +			virtual const DB::CommandOptions * getCommandOptions() const = 0; -			template<typename OptsType = DB::CommandOptions, typename ... Opts> -			DB::ModifyCommandPtr modify(DB::Connection * db, const Opts & ... opts) const -			{ -				OptsType o(getSqlHash(), opts...); -				return db->modify(getSql(), &o); -			} - -			template<typename OptsType = DB::CommandOptions, typename ... Opts> -			DB::SelectCommandPtr select(DB::Connection * db, const Opts & ... opts) const -			{ -				OptsType o(getSqlHash(), opts...); -				return db->select(getSql(), &o); -			} +			DB::ModifyCommandPtr modify(DB::Connection * db) const; +			DB::SelectCommandPtr select(DB::Connection * db) const;  	};  } diff --git a/icetray/icetray/staticSqlSource.cpp b/icetray/icetray/staticSqlSource.cpp index 3c404e3..7e3570f 100644 --- a/icetray/icetray/staticSqlSource.cpp +++ b/icetray/icetray/staticSqlSource.cpp @@ -3,20 +3,32 @@  namespace IceTray {  	StaticSqlSource::StaticSqlSource(const std::string & s) :  		sql(s), -		hash(std::hash<std::string>()(sql)) +		opts(new DB::CommandOptions(std::hash<std::string>()(sql)))  	{  	} +	StaticSqlSource::StaticSqlSource(const std::string & s, const std::string & optsName, const DB::CommandOptionsMap & map) : +		sql(s), +		opts(DB::CommandOptionsFactory::createNew(optsName, std::hash<std::string>()(sql), map)) +	{ + +	} + +	StaticSqlSource::~StaticSqlSource() +	{ +		delete opts; +	} +  	const std::string &  	StaticSqlSource::getSql() const  	{  		return sql;  	} -	std::size_t -	StaticSqlSource::getSqlHash() const +	const DB::CommandOptions * +	StaticSqlSource::getCommandOptions() const  	{ -		return hash; +		return opts;  	}  } diff --git a/icetray/icetray/staticSqlSource.h b/icetray/icetray/staticSqlSource.h index 5b5658f..84fd402 100644 --- a/icetray/icetray/staticSqlSource.h +++ b/icetray/icetray/staticSqlSource.h @@ -2,18 +2,21 @@  #define ICETRAY_STATICSQLSOURCE_H  #include "sqlSource.h" +#include <command.h>  namespace IceTray {  	class DLL_PUBLIC StaticSqlSource : public SqlSource {  		public: -			StaticSqlSource(const std::string &); +			StaticSqlSource(const std::string & sql); +			StaticSqlSource(const std::string & sql, const std::string & optsName, const DB::CommandOptionsMap &); +			virtual ~StaticSqlSource();  			const std::string & getSql() const override; -			std::size_t getSqlHash() const override; +			const DB::CommandOptions * getCommandOptions() const override;  		protected:  			const std::string sql; -			const std::size_t hash; +			const DB::CommandOptions * opts;  	};  } diff --git a/icetray/tool/icetray.jam b/icetray/tool/icetray.jam index 1b40c0e..bc0b861 100644 --- a/icetray/tool/icetray.jam +++ b/icetray/tool/icetray.jam @@ -8,6 +8,7 @@ project.initialize $(__name__) ;  project icetray ;  feature.feature icetray.sql.namespace : : free ; +feature.feature icetray.sql.connector : : free ;  feature.feature icetray.sql.basedir : : free path ;  type.register SQL : sql ;  toolset.flags icetray.c++.sql CONNECTOR <icetray.sql.connector> ; @@ -17,7 +18,7 @@ generators.register-standard icetray.c++.sql : SQL : CPP(%.sql) H(%.sql) ;  actions icetray.c++.sql  { -	icetray-sql --basedir="$(BASEDIR)" --namespace="$(NAMESPACE)" "$(2[1])" "$(1[1])" "$(1[2])" +	icetray-sql --basedir="$(BASEDIR)" --connector="$(CONNECTOR)" --namespace="$(NAMESPACE)" "$(2[1])" "$(1[1])" "$(1[2])"  }  IMPORT $(__name__) : icetray.c++.sql : : icetray.c++.sql ; diff --git a/icetray/tool/icetraySql.cpp b/icetray/tool/icetraySql.cpp index 5817ca8..8663c8b 100644 --- a/icetray/tool/icetraySql.cpp +++ b/icetray/tool/icetraySql.cpp @@ -5,6 +5,7 @@  #include <boost/filesystem/convenience.hpp>  #include <boost/algorithm/string/split.hpp>  #include <boost/algorithm/string/classification.hpp> +#include <boost/algorithm/string/predicate.hpp>  #include <compileTimeFormatter.h>  namespace po = boost::program_options; @@ -15,9 +16,13 @@ AdHocFormatter(CPPHeader,  const IceTray::StaticSqlSource )C");  AdHocFormatter(CPPNS, "%?::"); -AdHocFormatter(CPPOpen, R"C(%? ( -R"SQL()C"); -AdHocFormatter(CPPFooter, R"C()SQL"); +AdHocFormatter(CPPOpen, R"C(%? +__attribute__((init_priority(209))) (R"SQL()C"); +AdHocFormatter(CPPConnectorOpts, R"C(, "%?", {%?})C"); +AdHocFormatter(CPPConnectorOpt, R"C({ "%?", "%?" },)C"); +AdHocFormatter(CPPConnectorOptFlag, R"C({ "%?", "" },)C"); +AdHocFormatter(CPPClose, R"C()SQL")C"); +AdHocFormatter(CPPFooter, R"C();  )C");  AdHocFormatter(HHeader, @@ -35,7 +40,7 @@ main(int argc, char ** argv)  {  	po::options_description opts("IceTray SQL-to-C++ precompiler");  	fs::path sql, cpp, h, base; -	std::string sqlns; +	std::string sqlns, connector;  	opts.add_options()  		("help,h", "Show this help message") @@ -44,6 +49,7 @@ main(int argc, char ** argv)  		("h", po::value(&h)->required(), "Path of header file to write")  		("basedir,d", po::value(&base)->default_value(fs::current_path()), "Base directory of SQL scripts (namespaces are created relative to here)")  		("namespace", po::value(&sqlns), "Namespace to create SqlSource in") +		("connector,c", po::value(&connector), "Specifiy a default connector name")  		;  	po::positional_options_description p; @@ -76,9 +82,30 @@ main(int argc, char ** argv)  		CPPNS::write(cppout, nsp);  	});  	CPPOpen::write(cppout, sql.stem().string()); -	std::copy(std::istreambuf_iterator<char>(sqlin), -			std::istreambuf_iterator<char>(), -			std::ostreambuf_iterator<char>(cppout)); +	std::string buf; +	std::stringstream map; +	while (!std::getline(sqlin, buf).eof()) { +		if (boost::algorithm::starts_with(buf, "-- libdbpp-")) { +			connector = buf.substr(11); +		} +		else if (boost::algorithm::starts_with(buf, "-- libdbpp:")) { +			auto opt = buf.substr(11); +			auto colon = opt.find(':'); +			if (colon != std::string::npos) { +				CPPConnectorOpt::write(map, opt.substr(0, colon), opt.substr(colon + 1)); +			} +			else { +				CPPConnectorOptFlag::write(map, opt); +			} +		} +		else { +			cppout << buf << std::endl; +		} +	} +	CPPClose::write(cppout); +	if (!connector.empty() && !map.str().empty()) { +		CPPConnectorOpts::write(cppout, connector, map.str()); +	}  	CPPFooter::write(cppout);  	HHeader::write(hout); diff --git a/icetray/unittests/testIceTray.cpp b/icetray/unittests/testIceTray.cpp index 20beeb8..48bd8f1 100644 --- a/icetray/unittests/testIceTray.cpp +++ b/icetray/unittests/testIceTray.cpp @@ -4,6 +4,7 @@  #include <dryice.h>  #include <Ice/Communicator.h>  #include "testIceTrayServiceI.h" +#include <staticSqlSource.h>  #include <pq-mock.h>  #include <definedDirs.h> diff --git a/icetray/unittests/testIceTrayServiceTestSql.sql b/icetray/unittests/testIceTrayServiceTestSql.sql index 162c801..83112a7 100644 --- a/icetray/unittests/testIceTrayServiceTestSql.sql +++ b/icetray/unittests/testIceTrayServiceTestSql.sql @@ -1,3 +1,6 @@ +-- libdbpp-postgresql +-- libdbpp:no-cursor +-- libdbpp:page-size:12  SELECT COUNT(*)  FROM testTable  WHERE id = ? | 
