|
15 | 15 | #include <vector> |
16 | 16 | #include <string> |
17 | 17 | #include <fstream> |
| 18 | +#include <iostream> |
18 | 19 | #include <direct.h> |
19 | 20 | #include <cassert> |
20 | 21 | #include <sys/types.h> |
@@ -72,41 +73,191 @@ namespace sqlite3pp |
72 | 73 | return src; |
73 | 74 | } |
74 | 75 |
|
75 | | -#ifdef _UNICODE |
76 | | - std::wstring to_tstring(const std::string &src) |
| 76 | + // Convertion types |
| 77 | + std::string to_string(const Clob& src) |
77 | 78 | { |
78 | | - return to_wstring(src); |
| 79 | + return std::string(src->data(), src->data() + src->size()); |
79 | 80 | } |
80 | | - std::wstring to_tstring(const std::wstring &src) |
| 81 | + |
| 82 | + std::wstring to_wstring(const Clob& src) |
81 | 83 | { |
82 | | - return src; |
| 84 | + return to_wstring(to_string(src)); |
83 | 85 | } |
84 | | - std::wstring to_tstring(const wchar_t* src) |
| 86 | + |
| 87 | + std::string to_string(const Blob& src) |
85 | 88 | { |
86 | | - return to_wstring(src); |
| 89 | + return std::string(src->data(), src->data() + src->size()); |
87 | 90 | } |
88 | | - std::wstring to_tstring(const char* src) |
| 91 | + |
| 92 | + std::wstring to_wstring(const Blob& src) |
89 | 93 | { |
90 | | - return to_wstring(src); |
| 94 | + return to_wstring(std::string(src->data(), src->data() + src->size())); |
91 | 95 | } |
92 | | -#else |
93 | | - std::string to_tstring(const std::wstring &src) |
| 96 | + |
| 97 | + std::string to_string(int src) |
94 | 98 | { |
95 | | - return to_string(src); |
| 99 | + return std::to_string(src); |
96 | 100 | } |
97 | | - std::string to_tstring(const std::string &src) |
| 101 | + |
| 102 | + std::wstring to_wstring(int src) |
98 | 103 | { |
99 | | - return src; |
100 | | - std::string to_tstring(const wchar_t* src) |
| 104 | + return to_wstring(std::to_string(src)); |
| 105 | + } |
| 106 | + |
| 107 | + std::string to_string(long long int src) |
| 108 | + { |
| 109 | + return std::to_string(src); |
| 110 | + } |
| 111 | + |
| 112 | + std::wstring to_wstring(long long int src) |
| 113 | + { |
| 114 | + return to_wstring(std::to_string(src)); |
| 115 | + } |
| 116 | + |
| 117 | + std::string to_string(unsigned long long int src) |
| 118 | + { |
| 119 | + return std::to_string(src); |
| 120 | + } |
| 121 | + |
| 122 | + std::wstring to_wstring(unsigned long long int src) |
| 123 | + { |
| 124 | + return to_wstring(sqlite3pp::to_string(src)); |
| 125 | + } |
| 126 | + |
| 127 | + std::string to_string(short int src) |
101 | 128 | { |
102 | | - return to_string(src); |
| 129 | + return std::to_string(src); |
103 | 130 | } |
104 | | - std::string to_tstring(const char* src) |
| 131 | + |
| 132 | + std::wstring to_wstring(short int src) |
105 | 133 | { |
106 | | - return to_string(src); |
| 134 | + return to_wstring(sqlite3pp::to_string(src)); |
107 | 135 | } |
| 136 | + |
| 137 | + std::string to_string(bool src) |
| 138 | + { |
| 139 | + return std::to_string((int)src); |
108 | 140 | } |
109 | | -#endif // _UNICODE |
| 141 | + |
| 142 | + std::wstring to_wstring(bool src) |
| 143 | + { |
| 144 | + return to_wstring(sqlite3pp::to_string(src)); |
| 145 | + } |
| 146 | + |
| 147 | + std::string to_string(double src) |
| 148 | + { |
| 149 | + return std::to_string(src); |
| 150 | + } |
| 151 | + |
| 152 | + std::wstring to_wstring(double src) |
| 153 | + { |
| 154 | + return to_wstring(sqlite3pp::to_string(src)); |
| 155 | + } |
| 156 | + |
| 157 | + std::string to_string(unsigned char src) |
| 158 | + { |
| 159 | + return std::to_string((int)src); |
| 160 | + } |
| 161 | + |
| 162 | + std::wstring to_wstring(unsigned char src) |
| 163 | + { |
| 164 | + return to_wstring(sqlite3pp::to_string(src)); |
| 165 | + } |
| 166 | + |
| 167 | + std::string to_string(const Date& t) |
| 168 | + { |
| 169 | + if (t.t > 0) |
| 170 | + { |
| 171 | + char buf[256] = { 0 }; |
| 172 | + std::tm tm_struct = { 0 }; |
| 173 | + gmtime_s(&tm_struct, &t.t); |
| 174 | + strftime(buf, sizeof(buf), "%Y-%m-%db", &tm_struct); |
| 175 | + return buf; |
| 176 | + } |
| 177 | + return "0000-00-00"; |
| 178 | + } |
| 179 | + |
| 180 | + std::wstring to_wstring(const Date& src) |
| 181 | + { |
| 182 | + return to_wstring(sqlite3pp::to_string(src)); |
| 183 | + } |
| 184 | + |
| 185 | + std::string to_string(const Datetime& t) |
| 186 | + { |
| 187 | + if (t.tm_struct.tm_mday) |
| 188 | + { |
| 189 | + char buf[256] = { 0 }; |
| 190 | + strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &t.tm_struct); |
| 191 | + return buf; |
| 192 | + } |
| 193 | + return "0000-00-00 00:00:00"; |
| 194 | + } |
| 195 | + |
| 196 | + std::wstring to_wstring(const Datetime& src) |
| 197 | + { |
| 198 | + return to_wstring(sqlite3pp::to_string(src)); |
| 199 | + } |
| 200 | + |
| 201 | + |
| 202 | +//#ifdef _UNICODE |
| 203 | +// std::wstring to_tstring(const std::string &src) |
| 204 | +// { |
| 205 | +// return to_wstring(src); |
| 206 | +// } |
| 207 | +// std::wstring to_tstring(const std::wstring &src) |
| 208 | +// { |
| 209 | +// return src; |
| 210 | +// } |
| 211 | +// std::wstring to_tstring(const wchar_t* src) |
| 212 | +// { |
| 213 | +// return to_wstring(src); |
| 214 | +// } |
| 215 | +// std::wstring to_tstring(const char* src) |
| 216 | +// { |
| 217 | +// return to_wstring(src); |
| 218 | +// } |
| 219 | +// std::wstring to_tstring(const Clob& src) |
| 220 | +// { |
| 221 | +// return to_wstring(to_string(src)); |
| 222 | +// } |
| 223 | +// std::wstring to_tstring(const Blob& src) |
| 224 | +// { |
| 225 | +// return to_wstring(std::string(src->data(), src->data() + src->size())); |
| 226 | +// } |
| 227 | +// std::wstring to_tstring(int src) |
| 228 | +// { |
| 229 | +// return to_wstring(std::to_string(src)); |
| 230 | +// } |
| 231 | +//#else |
| 232 | +// std::string to_tstring(const std::wstring &src) |
| 233 | +// { |
| 234 | +// return to_string(src); |
| 235 | +// } |
| 236 | +// std::string to_tstring(const std::string &src) |
| 237 | +// { |
| 238 | +// return src; |
| 239 | +// std::string to_tstring(const wchar_t* src) |
| 240 | +// { |
| 241 | +// return to_string(src); |
| 242 | +// } |
| 243 | +// std::string to_tstring(const char* src) |
| 244 | +// { |
| 245 | +// return to_string(src); |
| 246 | +// } |
| 247 | +// } |
| 248 | +// std::string to_tstring(const Clob& src) |
| 249 | +// { |
| 250 | +// return std::string(src->data(), src->data() + src->size()); |
| 251 | +// } |
| 252 | +// std::string to_tstring(const Blob& src) |
| 253 | +// { |
| 254 | +// return std::string(src->data(), src->data() + src->size()); |
| 255 | +// } |
| 256 | +// std::string to_tstring(int src) |
| 257 | +// { |
| 258 | +// return std::to_string(src); |
| 259 | +// } |
| 260 | +//#endif // _UNICODE |
110 | 261 |
|
111 | 262 | VerbosityLevels sql_base::m_VerbosityLevels = VBLV_ERROR; |
112 | 263 | void sql_base::SetVerbosityLevel(VerbosityLevels v) |
@@ -373,32 +524,86 @@ namespace sqlite3pp |
373 | 524 | return sql_base::global_db.extended_error_code(); |
374 | 525 | } |
375 | 526 |
|
376 | | - bool dir_exists(const std::string& foldername) |
| 527 | + bool dir_exists(std::string foldername, bool RepaceEnvVar) |
377 | 528 | { |
| 529 | + if (RepaceEnvVar) |
| 530 | + foldername = Get_UpdatedPathCopy(foldername); |
378 | 531 | struct stat st = { 0 }; |
379 | 532 | stat(foldername.c_str(), &st); |
380 | 533 | return st.st_mode & S_IFDIR; |
381 | 534 | } |
382 | 535 |
|
383 | | - bool dir_exists(const std::wstring& foldername) |
| 536 | + bool dir_exists(std::wstring foldername, bool RepaceEnvVar) |
384 | 537 | { |
| 538 | + if (RepaceEnvVar) |
| 539 | + foldername = Get_UpdatedPathCopy(foldername); |
385 | 540 | struct _stat st = { 0 }; |
386 | 541 | _wstat(foldername.c_str(), &st); |
387 | 542 | return st.st_mode & S_IFDIR; |
388 | 543 | } |
389 | 544 |
|
390 | | - bool file_exists(const std::string &filename) |
| 545 | + bool file_exists(std::string filename, bool RepaceEnvVar) |
391 | 546 | { |
| 547 | + if (RepaceEnvVar) |
| 548 | + filename = Get_UpdatedPathCopy(filename); |
392 | 549 | struct stat st = { 0 }; |
393 | 550 | return (stat(filename.c_str(), &st) == 0); |
394 | 551 | } |
395 | 552 |
|
396 | | - bool file_exists(const std::wstring &filename) |
| 553 | + bool file_exists(std::wstring filename, bool RepaceEnvVar) |
397 | 554 | { |
| 555 | + if (RepaceEnvVar) |
| 556 | + filename = Get_UpdatedPathCopy(filename); |
398 | 557 | struct _stat st = { 0 }; |
399 | 558 | return (_wstat(filename.c_str(), &st) == 0); |
400 | 559 | } |
401 | 560 |
|
| 561 | + bool copy_file(std::wstring Src, std::wstring Dest, bool OverWriteIfExist) |
| 562 | + { |
| 563 | + Src = Get_UpdatedPathCopy(Src); |
| 564 | + Dest = Get_UpdatedPathCopy(Dest); |
| 565 | + if (file_exists(Dest)) |
| 566 | + { |
| 567 | + if (OverWriteIfExist) |
| 568 | + { |
| 569 | + if (!DeleteFileW(Dest.c_str())) |
| 570 | + return false; |
| 571 | + } |
| 572 | + else |
| 573 | + return false; |
| 574 | + } |
| 575 | + |
| 576 | + bool RetrnVal = false; |
| 577 | + std::ofstream outfile(Dest.c_str(), std::ios::out | std::ios::binary); |
| 578 | + if (outfile.is_open()) |
| 579 | + { |
| 580 | + std::ifstream is(Src.c_str(), std::ios::in | std::ios::binary); |
| 581 | + if (is.is_open()) |
| 582 | + { |
| 583 | + is.seekg(0, is.end); |
| 584 | + const std::streamoff length = is.tellg(); |
| 585 | + is.seekg(0, is.beg); |
| 586 | + char *buffer = new char[static_cast<size_t>(length) + 1](); |
| 587 | + if (buffer) |
| 588 | + { |
| 589 | + is.read(buffer, length); |
| 590 | + outfile.write(buffer, length); |
| 591 | + delete[] buffer; |
| 592 | + RetrnVal = true; |
| 593 | + } |
| 594 | + is.close(); |
| 595 | + } |
| 596 | + outfile.close(); |
| 597 | + } |
| 598 | + |
| 599 | + return RetrnVal; |
| 600 | + } |
| 601 | + |
| 602 | + bool copy_file(std::string Src, std::string Dest, bool OverWriteIfExist) |
| 603 | + { |
| 604 | + return copy_file(to_wstring(Src), to_wstring(Dest), OverWriteIfExist); |
| 605 | + } |
| 606 | + |
402 | 607 | void replace_all(std::wstring & data, const std::wstring &toSearch, const std::wstring &replaceStr) |
403 | 608 | { |
404 | 609 | // Get the first occurrence |
@@ -773,10 +978,10 @@ namespace sqlite3pp |
773 | 978 | //////////////////////////////////////////////////////////////////////////////////////////// |
774 | 979 | // SQLiteClassBuilder Predefines. |
775 | 980 | // Predefined string options |
776 | | - const StrOptions SQLiteClassBuilder::strOpt_std_string = { "std::string", "", "", "#include <string>" }; |
777 | | - const StrOptions SQLiteClassBuilder::strOpt_std_wstring = { "std::wstring", "L", "", "#include <string>" }; |
778 | | - const StrOptions SQLiteClassBuilder::strOpt_sql_tstring = { "sqlite3pp::tstring", "T_(", ")", "#include \"sqlite3pp_ez.h\"" }; |
779 | | - const StrOptions SQLiteClassBuilder::strOpt_sql_tstring_T = { "sqlite3pp::tstring", "_T(", ")", "#include \"sqlite3pp_ez.h\"" }; |
| 981 | + const StrOptions SQLiteClassBuilder::strOpt_std_string = { "std::string", "sqlite3pp::to_string", "", "", "#include <string>" }; |
| 982 | + const StrOptions SQLiteClassBuilder::strOpt_std_wstring = { "std::wstring", "sqlite3pp::to_wstring", "L", "", "#include <string>" }; |
| 983 | + const StrOptions SQLiteClassBuilder::strOpt_sql_tstring = { "sqlite3pp::tstring", "sqlite3pp::to_tstring", "T_(", ")", "#include \"sqlite3pp_ez.h\"" }; |
| 984 | + const StrOptions SQLiteClassBuilder::strOpt_sql_tstring_T = { "sqlite3pp::tstring", "sqlite3pp::to_tstring", "_T(", ")", "#include \"sqlite3pp_ez.h\"" }; |
780 | 985 | // Predefined MiscOptions for common settings |
781 | 986 | const MiscOptions SQLiteClassBuilder::MiscOpt_max = { ",", false, false, false, false, false, false, false, false, false }; |
782 | 987 | const MiscOptions SQLiteClassBuilder::MiscOpt_min = { ",", true, true, true, true, true, false, false, true, true }; |
@@ -1165,6 +1370,17 @@ namespace sqlite3pp |
1165 | 1370 | myfile << c.second << "\\\"" << c.first << "\\\""; |
1166 | 1371 | myfile << "\"" << m_options.s.str_post << "; }" << std::endl; |
1167 | 1372 |
|
| 1373 | + // Create GetValues member function. Needed for sqlite3pp::Table template class |
| 1374 | + myfile << "\tStrType GetValues() const\n\t{\n\t\tStrType strtype;"; |
| 1375 | + std::string commaDel; |
| 1376 | + for (auto c : columns) |
| 1377 | + { |
| 1378 | + myfile << "\n\t\tstrtype += " << m_options.s.str_pre << "\"" << commaDel << "'\"" << m_options.s.str_post |
| 1379 | + << " + " << m_options.s.str_tostr << "( " << c.first << ") + " << m_options.s.str_pre << "\"'\"" << m_options.s.str_post << ";"; |
| 1380 | + commaDel = ","; |
| 1381 | + } |
| 1382 | + myfile << "\n\t\treturn strtype;\n\t}" << std::endl; |
| 1383 | + |
1168 | 1384 | // Create getStreamData member function. Needed for sqlite3pp::Table template class |
1169 | 1385 | myfile << "\ttemplate<class T> void getStreamData( T q ) { q.getter() "; |
1170 | 1386 | for (auto c : columns) |
|
0 commit comments