28 #ifndef _DB_ADO_HELPER_H_ 29 #define _DB_ADO_HELPER_H_ 40 #define BEGIN_TRY_SECTION() try { 42 #define CATCH_TRY_SECTION(ret_val) CATCH_TRY_SECTION_MESS(ret_val, "") 44 #define CATCH_TRY_SECTION_MESS(ret_val, mess_where) }\ 45 catch(const std::exception&ex)\ 47 LOG_PRINT_J("DB_ERROR: " << ex.what(), LOG_LEVEL_0);\ 50 catch(const _com_error& comm_err)\ 52 const TCHAR* pstr = comm_err.Description();\ 53 std::string descr = string_encoding::convert_to_ansii(pstr?pstr:TEXT(""));\ 54 const TCHAR* pmessage = comm_err.ErrorMessage();\ 55 pstr = comm_err.Source();\ 56 std::string source = string_encoding::convert_to_ansii(pstr?pstr:TEXT(""));\ 57 LOG_PRINT_J("COM_ERROR " << mess_where << ":\n\tDescriprion:" << descr << ", \n\t Message: " << string_encoding::convert_to_ansii(pmessage) << "\n\t Source: " << source, LOG_LEVEL_0);\ 62 LOG_PRINT_J("..._ERROR: Unknown error.", LOG_LEVEL_0);\ 68 namespace ado_db_helper
85 typedef std::map<std::string, profile_entry>
sqls_map;
88 static bool sort_by_timing(
const sqls_map::iterator&
a,
const sqls_map::iterator& b)
90 return a->second.m_avrg.get_avg() > b->second.m_avrg.get_avg();
96 std::stringstream strm;
97 strm <<
"SQL PROFILE:\r\nStatements: " << m_sqls.size() <<
"\r\n";
98 std::list<sqls_map::iterator> m_sorted_by_time_sqls;
99 for(std::map<std::string, profile_entry>::iterator it = m_sqls.begin();it!=m_sqls.end();it++)
100 m_sorted_by_time_sqls.push_back(it);
104 for(std::list<sqls_map::iterator>::iterator it = m_sorted_by_time_sqls.begin();it!=m_sorted_by_time_sqls.end();it++)
106 strm <<
"---------------------------------------------------------------------------------------------------------\r\nSQL: " << (*it)->first <<
"\r\n";
107 strm <<
"\tavrg: " << (*it)->second.m_avrg.get_avg() <<
"\r\n\tmax: " << (*it)->second.m_max_time <<
"\r\n\tmin: " << (*it)->second.m_min_time <<
"\r\n\tcount: " << (*it)->second.m_call_count <<
"\r\n";
129 sqls_map::iterator it = m_sqls.find(sql);
133 time =
static_cast<DWORD
>(it->second.m_avrg.get_avg());
148 pmanager = *pprofiler;
196 m_start_time = ::GetTickCount();
202 DWORD timing = ::GetTickCount() - m_start_time;
206 #define PROFILE_SQL(sql) timing_guard local_timing(sql) 209 typedef std::vector<std::vector<_variant_t> >
table;
213 _variant_t param(parametr.c_str());
214 ADODB::ADO_LONGPTR size =
sizeof(parametr);
215 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"", ADODB::adVarChar, ADODB::adParamInput, static_cast<long>(parametr.size()+1), param);
216 cmd->Parameters->Append(param_obj);
222 _variant_t param(parametr.c_str());
223 ADODB::ADO_LONGPTR size =
sizeof(parametr);
224 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"", ADODB::adVarWChar, ADODB::adParamInput, static_cast<long>(parametr.size()+2), param);
225 cmd->Parameters->Append(param_obj);
229 inline bool add_parametr(ADODB::_CommandPtr cmd,
const __int64 parametr)
231 _variant_t param(parametr);
232 ADODB::ADO_LONGPTR size =
static_cast<long>(
sizeof(parametr));
233 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adBigInt, ADODB::adParamInput, static_cast<long>(size), param);
234 cmd->Parameters->Append(param_obj);
238 inline bool add_parametr(ADODB::_CommandPtr cmd,
const unsigned __int64 parametr)
240 _variant_t param(parametr);
241 ADODB::ADO_LONGPTR size =
static_cast<long>(
sizeof(parametr));
242 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adUnsignedBigInt, ADODB::adParamInput, static_cast<long>(size), param);
243 cmd->Parameters->Append(param_obj);
250 _variant_t param(parametr);
251 ADODB::ADO_LONGPTR size =
static_cast<long>(
sizeof(parametr));
252 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adInteger, ADODB::adParamInput, static_cast<long>(size), param);
253 cmd->Parameters->Append(param_obj);
257 inline bool add_parametr(ADODB::_CommandPtr cmd,
const unsigned int parametr)
259 _variant_t param(parametr);
260 ADODB::ADO_LONGPTR size =
static_cast<long>(
sizeof(parametr));
261 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adUnsignedInt, ADODB::adParamInput, static_cast<long>(size), param);
262 cmd->Parameters->Append(param_obj);
269 param.ChangeType(VT_R4);
270 param.fltVal = parametr;
271 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adSingle, ADODB::adParamInput, static_cast<long>(
sizeof(
float)), param);
272 cmd->Parameters->Append(param_obj);
276 inline bool add_parametr(ADODB::_CommandPtr cmd,
bool parametr)
280 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adBoolean, ADODB::adParamInput,
sizeof(parametr), param);
281 cmd->Parameters->Append(param_obj);
288 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adDBTimeStamp, ADODB::adParamInput,
sizeof(parametr), parametr);
289 cmd->Parameters->Append(param_obj);
297 param.ChangeType(VT_R8);
298 param.dblVal = parametr;
299 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adDouble, ADODB::adParamInput,
sizeof(
float), param);
300 cmd->Parameters->Append(param_obj);
304 template<
typename TParam>
305 inline bool add_parametr(ADODB::_CommandPtr cmd,
const std::list<TParam> params)
307 for(std::list<TParam>::const_iterator it = params.begin(); it!=params.end(); it++)
334 param.ChangeType(VT_DATE);
335 param.date = parametr;
336 ADODB::_ParameterPtr param_obj = cmd->CreateParameter(
"parametr", ADODB::adDBDate, ADODB::adParamInput,
sizeof(parametr), param);
337 cmd->Parameters->Append(param_obj);
343 inline bool execute_helper(ADODB::_CommandPtr cmd, _variant_t* pcount_processed = NULL)
347 cmd->Execute(pcount_processed, NULL, ADODB::adExecuteNoRecords);
358 result_vector.clear();
361 ADODB::_RecordsetPtr precordset = cmd->Execute(NULL, NULL, NULL);
364 LOG_ERROR(
"DB_ERROR: cmd->Execute returned NULL!!!");
385 size_t current_record_index = 0;
386 while(precordset->EndOfFile != EOF)
388 result_vector.push_back(table::value_type());
389 size_t fields_count = precordset->Fields->Count;
390 result_vector[current_record_index].resize(fields_count);
391 for(
size_t current_field_index = 0; current_field_index < fields_count; current_field_index++)
394 var.ChangeType(VT_I2);
395 var.intVal =
static_cast<INT
>(current_field_index);
396 result_vector[current_record_index][current_field_index] = precordset->Fields->GetItem(var)->Value;
398 precordset->MoveNext();
399 current_record_index++;
406 template<
typename TParam1>
412 template<
typename TParam1>
417 template<
typename TParam1,
typename TParam2>
425 template<
typename TParam1,
typename TParam2,
typename TParam3>
433 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4>
442 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5>
452 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6>
463 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7>
475 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7,
typename TParam8,
typename TParam9>
489 template<
typename TParam1>
495 template<
typename TParam1>
501 template<
typename TParam1,
typename TParam2>
508 template<
typename TParam1,
typename TParam2,
typename TParam3>
516 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4>
525 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5>
535 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6>
546 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7>
558 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7,
typename TParam8,
typename TParam9>
572 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7>
575 std::stringstream strm;
580 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7,
typename TParam8,
typename TParam9>
583 std::stringstream strm;
588 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6>
591 std::stringstream strm;
596 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5>
599 std::stringstream strm;
605 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4>
608 std::stringstream strm;
613 template<
typename TParam1,
typename TParam2,
typename TParam3>
616 std::stringstream strm;
621 template<
typename TParam>
624 std::stringstream strm;
629 template<
typename TParam>
632 std::stringstream strm;
633 for(std::list<TParam>::const_iterator it = prm_lst.begin();it!=prm_lst.end();it++)
639 template<
typename TParam1,
typename TParam2>
642 std::stringstream strm;
647 template<
typename TParam1>
650 std::stringstream strm;
655 template<
typename TParam1>
658 std::stringstream strm;
659 strm <<
"(no parametrs)";
664 template<
typename TParams>
671 ADODB::_CommandPtr cmd;
672 cmd.CreateInstance(__uuidof(ADODB::Command));
673 cmd->CommandText = _bstr_t(sql_statment.c_str());
678 cmd->ActiveConnection = pconnection;
686 template<
typename TParams>
693 ADODB::_CommandPtr cmd;
694 cmd.CreateInstance(__uuidof(ADODB::Command));
695 cmd->CommandText = _bstr_t(sql_statment.c_str());
701 cmd->ActiveConnection = pconnection;
708 template<
typename TParams>
715 ADODB::_CommandPtr cmd;
716 cmd.CreateInstance(__uuidof(ADODB::Command));
717 cmd->CommandText = _bstr_t(sql_statment.c_str());
720 for(TParams::const_iterator it = parametrs.begin(); it!=parametrs.end(); it++)
725 cmd->ActiveConnection = pconnection;
740 template<
typename TParam>
749 template<
typename TParam1,
typename TParam2>
750 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2)
759 template<
typename TParam1,
typename TParam2,
typename TParam3>
760 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2,
const TParam3& parametr3)
769 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4>
770 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2,
const TParam3& parametr3,
const TParam4& parametr4)
780 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5>
781 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2,
const TParam3& parametr3,
const TParam4& parametr4,
const TParam5& parametr5)
792 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6>
793 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2,
const TParam3& parametr3,
const TParam4& parametr4,
const TParam5& parametr5,
const TParam6& parametr6)
806 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7>
807 bool execute_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1& parametr1,
const TParam2& parametr2,
const TParam3& parametr3,
const TParam4& parametr4,
const TParam5& parametr5,
const TParam6& parametr6,
const TParam7& parametr7)
828 template<
typename TParam>
836 template<
typename TParam1,
typename TParam2>
837 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
table& result_vector)
846 template<
typename TParam1,
typename TParam2,
typename TParam3>
847 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
table& result_vector)
857 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4>
858 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
const TParam4 parametr4,
table& result_vector)
868 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5>
869 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
const TParam4 parametr4,
const TParam5 parametr5,
table& result_vector)
881 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6>
882 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
const TParam4 parametr4,
const TParam5 parametr5,
const TParam6 parametr6,
table& result_vector)
894 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7>
895 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
const TParam4 parametr4,
const TParam5 parametr5,
const TParam6 parametr6,
const TParam7 parametr7,
table& result_vector)
908 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename TParam5,
typename TParam6,
typename TParam7,
typename TParam8,
typename TParam9>
909 bool select_helper(ADODB::_ConnectionPtr pconnection,
const std::string& sql_statment,
const TParam1 parametr1,
const TParam2 parametr2,
const TParam3 parametr3,
const TParam4 parametr4,
const TParam5 parametr5,
const TParam6 parametr6,
const TParam7 parametr7,
const TParam8 parametr8,
const TParam9 parametr9,
table& result_vector)
936 m_connection_string = connection_string;
950 m_db_connections_lock.
lock();
951 boost::shared_ptr<ADODB::_ConnectionPtr>& conn_ptr = m_db_connections[::GetCurrentThreadId()];
952 m_db_connections_lock.
unlock();
955 conn_ptr.reset(
new ADODB::_ConnectionPtr());
956 ADODB::_ConnectionPtr& conn = *conn_ptr.get();
962 if(S_OK != conn.CreateInstance(__uuidof(ADODB::Connection)))
964 LOG_ERROR(
"Failed to Create, instance, was CoInitialize called ???!");
968 HRESULT
res = conn->Open(_bstr_t(m_connection_string.c_str()), _bstr_t(m_login.c_str()), _bstr_t(m_password.c_str()), NULL);
971 LOG_ERROR(
"Failed to connect do DB, connection str:" << m_connection_string);
975 LOG_PRINT(
"New DB Connection added for threadid=" << ::GetCurrentThreadId(), LOG_LEVEL_0);
980 return *conn_ptr.get();
991 HRESULT
res = rconn->Close();
999 HRESULT
res = rconn->Open(_bstr_t(m_connection_string.c_str()), _bstr_t(m_login.c_str()), _bstr_t(m_password.c_str()), NULL);
1002 LOG_PRINT(
"Failed to restore connection to local AI DB", LOG_LEVEL_1);
1013 std::map<DWORD, boost::shared_ptr<ADODB::_ConnectionPtr> > m_db_connections;
1021 template<
typename TParam1,
typename default_
id_type,
typename t_conn>
1030 template<
typename TParam1,
typename TParam2,
typename default_
id_type,
typename t_conn>
1040 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename default_
id_type,
typename t_conn>
1041 bool find_or_add_t(
const std::string& sql_select_statment,
const std::string& sql_insert_statment,
OUT default_id_type&
id,
OUT bool& new_object_added, TParam1 parametr_1, TParam2 parametr_2, TParam3 parametr_3, t_conn& c)
1050 template<
typename TParam1,
typename TParam2,
typename TParam3,
typename TParam4,
typename default_
id_type,
typename t_conn>
1051 bool find_or_add_t(
const std::string& sql_select_statment,
const std::string& sql_insert_statment,
OUT default_id_type&
id,
OUT bool& new_object_added, TParam1 parametr_1, TParam2 parametr_2, TParam3 parametr_3, TParam4 parametr_4, t_conn& c)
1061 template<
typename TParams,
typename default_
id_type,
typename t_conn>
1067 new_object_added =
false;
1071 if(!result_table.size())
1074 if(!
res || !result_table.size())
1079 CHECK_AND_ASSERT_MES(result_table.size(),
false,
"No records returned from statment: " << sql_select_statment);
1082 new_object_added =
true;
1087 id = result_table[0][0];
std::vector< std::vector< _variant_t > > table
ADODB::_ConnectionPtr & get_db_connection()
static bool sort_by_timing(const sqls_map::iterator &a, const sqls_map::iterator &b)
bool execute_helper(ADODB::_CommandPtr cmd, _variant_t *pcount_processed=NULL)
timing_guard(const std::string &sql)
#define CHECK_AND_ASSERT_MES(expr, fail_ret_val, message)
#define BEGIN_TRY_SECTION()
std::map< std::string, profile_entry > sqls_map
std::string get_str_param(const TParam &prm)
bool get_entry_avarege(const std::string sql, DWORD &time)
bool select_helper(ADODB::_CommandPtr cmd, table &result_vector)
std::string print_parameters_multi(const adapter_sevento< TParam1, TParam2, TParam3, TParam4, TParam5, TParam6, TParam7 > ¶ms)
void push(const value_type &vl)
#define CRITICAL_REGION_END()
profiler_manager * get_set_profiler(bool need_to_set=false, profiler_manager **pprofiler=NULL)
bool add_parametrs_multi(ADODB::_CommandPtr cmd, const adapter_zero< TParam1 > ¶ms)
bool init(const std::string &connection_string, const std::string &login, const std::string &pass)
#define CATCH_TRY_SECTION_MESS(ret_val, mess_where)
bool select_helper_param_container(ADODB::_ConnectionPtr pconnection, const std::string &sql_statment, const TParams ¶metrs, table &result_vector)
bool add_parametr_as_double(ADODB::_CommandPtr cmd, const DATE parametr)
#define CRITICAL_REGION_BEGIN(x)
bool flush_profiler(const std::string path)
bool flush_log(const std::string &path)
bool save_string_to_file(const std::string &path_to_file, const std::string &str)
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
math_helper::average< DWORD, 10 > m_avrg
bool find_or_add_t_multiparametred(const std::string &sql_select_statment, const std::string &sql_insert_statment, OUT default_id_type &id, OUT bool &new_object_added, TParams params, t_conn &c)
bool push_entry(const std::string sql, DWORD time)
#define CATCH_TRY_SECTION(ret_val)
bool push_timing(const std::string sql, DWORD time)
bool execute_helper_multiparam(ADODB::_ConnectionPtr pconnection, const std::string &sql_statment, const TParams ¶metrs, _variant_t *pcount_processed=NULL)
bool add_parametr(ADODB::_CommandPtr cmd, const std::string ¶metr)
bool select_helper_multiparam(ADODB::_ConnectionPtr pconnection, const std::string &sql_statment, const TParams ¶metrs, table &result_vector)
bool find_or_add_t(const std::string &sql_select_statment, const std::string &sql_insert_statment, OUT default_id_type &id, OUT bool &new_object_added, TParam1 parametr_1, t_conn &c)