14#define __DCL_TRACE0_N __DCL_TRACE0
15#define __DCL_TRACE1_N __DCL_TRACE1
16#define __DCL_TRACE2_N __DCL_TRACE2
17#define __DCL_TRACE3_N __DCL_TRACE3
18#define __DCL_TRACE4_N __DCL_TRACE4
20#define __DCL_TRACE0_N(fmt, arg)
21#define __DCL_TRACE1_N(fmt, arg)
22#define __DCL_TRACE2_N(fmt, arg1, arg2)
23#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
24#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
29#if __DCL_HAVE_THIS_FILE__
37 L
"SELECT RDB$RELATION_NAME FROM RDB$RELATIONS"
38 " WHERE RDB$SYSTEM_FLAG = 0 AND RDB$RELATION_TYPE = 0"
39 " ORDER BY RDB$RELATION_NAME",
44 L
"SELECT RDB$RELATION_NAME FROM RDB$RELATIONS"
45 " WHERE RDB$SYSTEM_FLAG = 0 AND RDB$RELATION_TYPE = 'PERSISTENT'"
46 " ORDER BY RDB$RELATION_NAME",
51 L
"SELECT TABNAME FROM SYSTABLES"
52 " WHERE OWNER = CURRENT_USER AND TABTYPE = 'T'"
58 L
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
59 " WHERE TABLE_TYPE = 'BASE TABLE'"
60 " AND TABLE_SCHEMA = DATABASE()"
61 " ORDER BY TABLE_NAME",
66 L
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
67 " WHERE TABLE_TYPE = 'BASE TABLE'"
68 " AND TABLE_SCHEMA = 'dbo'"
69 " ORDER BY TABLE_NAME",
74 L
"SELECT TABLE_NAME FROM USER_TABLES"
75 " ORDER BY TABLE_NAME",
80 L
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
81 " WHERE TABLE_TYPE = 'BASE TABLE'"
82 " AND TABLE_SCHEMA NOT IN ('pg_catalog', 'information_schema')"
83 " ORDER BY TABLE_NAME",
88 L
"SELECT NAME FROM SQLITE_SCHEMA"
89 " WHERE TYPE = 'table'"
96static const DatabaseHelper* __get_helper(
const String& _serverInfo)
99 while (
r->identifier) {
100 String serverInfo = _serverInfo.toLowerCase();
101 String identifier = String(
r->identifier).toLowerCase();
102 if (serverInfo.indexOf(identifier) != (
size_t)-1) {
130 return String::format(L
"name[%ls] columns[%ls] toName[%ls] toColumns[%ls",
137 const String& _srcDriver,
const String& _dstDriver
141 __srcHelper = __dstHelper =
NULL;
143 __lineRuler.assign(L
'-', 80);
144 __lineIndent.assign(L
' ', 4);
147static void __get_name_columns(
148 const String& _entity, String& _name, String& _columns
151 size_t index = _entity.indexOf(L
'(');
152 if (index != (
size_t)-1) {
153 _name = _entity.substring(0, index);
154 _columns = _entity.substring(index).trim().trim(L
"()").trim();
161static void __verbose_out(
163 const String& _sql,
const String& _indent
166 const wchar_t* begin = _sql.data();
167 const wchar_t* end = begin + _sql.length();
168 const wchar_t* p = begin;
173 if (*p == L
' ' || *p == L
',') {
180 if (begin > _sql.data()) {
183 _output.write(begin, p - begin);
193 if (begin > _sql.data()) {
196 _output.write(begin, end - begin);
206 __args.output() << L
"Source database connected. ["
210 __args.output() << L
"Destination database connected. ["
214 __args.output() << L
"Database connection failed. ["
221 String serverInfo =
__srcConn.getServerInfo();
224 __args.output() << L
"Unknown Database Vendor. ["
225 << serverInfo << L
"] Failed." <<
endl;
232 __args.output() << L
"Unknown Database Vendor. ["
233 << serverInfo << L
"] Failed." <<
endl;
238 if (!
__args.entities().isEmpty()) {
240 __args.entities().split(L
';', a);
241 for (size_t i = 0; i < a.size(); i++) {
242 const String& s = a[i];
244 if (s.contains(L
'=')) {
247 __get_name_columns(pair[0], e.name, e.columns);
248 __get_name_columns(pair[1], e.toName, e.toColumns);
251 __get_name_columns(s, e.name, e.columns);
254 __DCL_TRACE1_N(L
"entity[%ls]\n", e.toString().data());
261 String srcTableSQL = __srcHelper->selectTableList;
262 String dstTableSQL = __dstHelper->selectTableList;
264 if (__args.verbose()) {
265 __args.output() << L
"Source entities SQL" <<
endl;
266 __verbose_out(__args.output(), srcTableSQL, __lineIndent);
267 __args.output() << L
"Destination entities SQL" <<
endl;
268 __verbose_out(__args.output(), dstTableSQL, __lineIndent);
274 q.execute(srcTableSQL);
278 e.
name = q.fields()[0].asString().trim();
288 q.execute(dstTableSQL);
292 e.
name = q.fields()[0].asString().trim();
299 if (srcEntities.
size() < dstEntities.
size()) {
300 __entities = srcEntities;
303 __entities = dstEntities;
306 StringBuilder sb = L
"{";
307 for (
size_t i = 0; i < __entities.size(); i++) {
311 sb.append(__entities[i].name);
315 srcEntities.
size() < dstEntities.
size() ? L
"src" : L
"dst",
316 sb.toString().data());
319 return __entities.size() > 0;
325 switch (_field.dataType()) {
327 if (_field.dataSizeMax() <=
sizeof(int32_t)) {
329 _field.getValue(value);
330 _param.setValue(value);
334 _field.getValue(value);
335 _param.setValue(value);
340 if (_field.dataSizeMax() <=
sizeof(uint32_t)) {
342 _field.getValue(value);
343 _param.setValue(value);
347 _field.getValue(value);
348 _param.setValue(value);
353 if (_field.dataSizeMax() ==
sizeof(
float)) {
355 _field.getValue(value);
356 _param.setValue(value);
360 _field.getValue(value);
361 _param.setValue(value);
366 if (_field.precision() > 0 && _field.scale() == 0) {
370 if (_field.precision() <=
__args.i4precision()) {
372 _field.getValue(value);
373 _param.setValue(value);
376 else if (_field.precision() <=
__args.i8precision()) {
378 _field.getValue(value);
379 _param.setValue(value);
393 _field.getValue(value);
394 _param.setData(&value,
sizeof(value),
401 _field.getValue(value);
402 _param.setData(&value,
sizeof(value),
409 _field.getValue(value);
410 _param.setData(&value,
sizeof(value),
418 _field.getValue(value);
419 _param.setData(&value,
sizeof(value),
450 << _entity.name << L
" [" << begin.
toString()
480 while (!select.
eof()) {
487 while (!select.
eof()) {
489 for (
size_t i = 0; i < select.
fields().count(); i++) {
492 if (field.isNull()) {
501 _entity.name.data(), rows, field.name().data(),
528 __args.output() << _entity.name
529 << L
" [" << rows << L
" rows transfered. " << (end - begin).toString()
535 for (
size_t i = 0; i <
__entities.size(); i++) {
542 StringBuilder sb = L
"SELECT ";
545 .append(_entity.
name);
552 StringBuilder sb = L
"INSERT INTO ";
558 else if (!_entity.
columns.isEmpty()) {
562 sb.append(_fields[0].name());
563 for (
size_t i = 1; i < _fields.
count(); i++) {
564 sb.append(L
",").append(_fields[i].name());
567 sb.append(L
") VALUES (?");
569 for (
size_t i = 1; i < _fields.
count(); i++) {
#define __DCL_THROWS2(e1, e2)
SQLException __srcConn(_srcDriver)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
SQLException __dstConn(_dstDriver)
#define __DCL_ASSERT(expr)
#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4)
DCLCVAR const struct __endl endl
Array< ELEMENT > & add(const ELEMENT &_element)
static DateTime getCurrentLocalTime()
String getInsertSQL(const Entity &_e, const SQLFields &_fields)
void copyEntity(const Entity &_e) __DCL_THROWS1(SQLException *)
EntityCopy(const MainArguments &_args, const String &_srcDriver, const String &_dstDriver) __DCL_THROWS1(SQLDriverException *)
const MainArguments & __args
const DatabaseHelper * __srcHelper
String getTruncateSQL(const Entity &_e)
bool initialize() __DCL_THROWS1(SQLException *)
Array< Entity > __entities
void translateFieldValue(SQLField &_field, SQLParam &_param) __DCL_THROWS1(SQLException *)
const DatabaseHelper * __dstHelper
String getSelectSQL(const Entity &_e)
String toStringAll() const
void prepare(const String &_sql) __DCL_THROWS1(SQLException *)
_CONST SQLParams & params() _CONST
_CONST SQLFields & fields() _CONST
void execute() __DCL_THROWS1(SQLException *)
void fetch() __DCL_THROWS1(SQLException *)
Entity & operator=(const Entity &_s)