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)
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' AND TABLE_SCHEMA = DATABASE()"
60 " ORDER BY TABLE_NAME",
65 L
"SELECT TABLE_NAME FROM USER_TABLES"
66 " ORDER BY TABLE_NAME",
71 L
"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES"
72 " WHERE TABLE_TYPE = 'BASE TABLE'"
73 " AND TABLE_SCHEMA NOT In('pg_catalog', 'information_schema')"
74 " ORDER by TABLE_NAME",
80static const DatabaseHelper* __get_helper(
const String& _driverName)
83 while (
r->driverName) {
84 if (_driverName ==
r->driverName) {
112 return String::format(L
"name[%ls] columns[%ls] toName[%ls] toColumns[%ls",
118 const String& _srcDriver,
const String& _dstDriver)
132static void __get_name_columns(
const String& _entity, String& _name, String& _columns)
134 size_t index = _entity.indexOf(L
'(');
135 if (index != (
size_t)-1) {
136 _name = _entity.substring(0, index);
137 _columns = _entity.substring(index).trim().trim(L
"()").trim();
144static void __verbose_out(
Writer& _output,
145 const String& _sql,
const String& _indent)
147 const wchar_t* begin = _sql.data();
148 const wchar_t* end = begin + _sql.length();
149 const wchar_t* p = begin;
154 if (*p == L
' ' || *p == L
',') {
161 if (begin > _sql.data()) {
164 _output.write(begin, p - begin);
174 if (begin > _sql.data()) {
177 _output.write(begin, end - begin);
187 __args.output() << L
"Source database connected. ["
191 __args.output() << L
"Destination database connected. ["
195 __args.output() << L
"Database connection failed. ["
201 if (!
__args.entities().isEmpty()) {
203 __args.entities().split(L
';', a);
204 for (size_t i = 0; i < a.size(); i++) {
205 const String& s = a[i];
207 if (s.contains(L
'=')) {
210 __get_name_columns(pair[0], e.name, e.columns);
211 __get_name_columns(pair[1], e.toName, e.toColumns);
214 __get_name_columns(s, e.name, e.columns);
217 __DCL_TRACE1_N(L
"entity[%ls]\n", e.toString().data());
224 String srcTableSQL = __srcHelper->selectTableList;
225 String dstTableSQL = __dstHelper->selectTableList;
227 if (__args.verbose()) {
228 __args.output() << L
"Source entities SQL" <<
endl;
229 __verbose_out(__args.output(), srcTableSQL, __lineIndent);
230 __args.output() << L
"Destination entities SQL" <<
endl;
231 __verbose_out(__args.output(), dstTableSQL, __lineIndent);
235 __srcConn.startTrans();
237 q.execute(srcTableSQL);
241 e.
name = q.fields()[0].asString().trim();
245 __srcConn.commitTrans();
249 __dstConn.startTrans();
251 q.execute(dstTableSQL);
255 e.
name = q.fields()[0].asString().trim();
259 __dstConn.commitTrans();
262 if (srcEntities.
size() < dstEntities.
size()) {
263 __entities = srcEntities;
266 __entities = dstEntities;
269 StringBuilder sb = L
"{";
270 for (
size_t i = 0; i < __entities.size(); i++) {
274 sb.append(__entities[i].name);
278 srcEntities.
size() < dstEntities.
size() ? L
"src" : L
"dst",
279 sb.toString().data());
282 return __entities.size() > 0;
288 switch (_field.dataType()) {
290 if (_field.dataSizeMax() <=
sizeof(int32_t)) {
292 _field.getValue(value);
293 _param.setValue(value);
297 _field.getValue(value);
298 _param.setValue(value);
303 if (_field.dataSizeMax() <=
sizeof(uint32_t)) {
305 _field.getValue(value);
306 _param.setValue(value);
310 _field.getValue(value);
311 _param.setValue(value);
316 if (_field.dataSizeMax() ==
sizeof(
float)) {
318 _field.getValue(value);
319 _param.setValue(value);
323 _field.getValue(value);
324 _param.setValue(value);
329 if (_field.precision() > 0 && _field.scale() == 0) {
333 if (_field.precision() <=
__args.i4precision()) {
335 _field.getValue(value);
336 _param.setValue(value);
339 else if (_field.precision() <=
__args.i8precision()) {
341 _field.getValue(value);
342 _param.setValue(value);
356 _field.getValue(value);
357 _param.setData(&value,
sizeof(value),
363 _field.getValue(value);
364 _param.setData(&value,
sizeof(value),
371 _field.getValue(value);
372 _param.setData(&value,
sizeof(value),
380 _field.getValue(value);
381 _param.setData(&value,
sizeof(value),
409 << _e.name << L
" [" << begin.
toString()
445 while (!select.
eof()) {
448 for (
size_t i = 0; i < select.
fields().count(); i++) {
451 if (field.isNull()) {
459 __DCL_TRACE4(L
"%ls[%d][%ls] [%ls]\n", _e.name.data(), rows,
485 __args.output() << _e.name
486 << L
" [" << rows << L
" rows transfered. " << (end - begin).toString()
492 for (
size_t i = 0; i <
__entities.size(); i++) {
499 StringBuilder sb = L
"SELECT ";
509 StringBuilder sb = L
"INSERT INTO ";
515 else if (!_e.
columns.isEmpty()) {
519 sb.append(_fields[0].name());
520 for (
size_t i = 1; i < _fields.
count(); i++) {
521 sb.append(L
",").append(_fields[i].name());
524 sb.append(L
") VALUES (?");
526 for (
size_t i = 1; i < _fields.
count(); i++) {
#define __DCL_THROWS2(e1, e2)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __DCL_ASSERT(expr)
#define __DCL_TRACE4(fmt, arg1, arg2, arg3, arg4)
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
_CONST SQLParams & params() _CONST
void prepare(const String &_sql) __DCL_THROWS2(SQLException *
_CONST SQLFields & fields() _CONST
void CharsetConvertException *void execute() __DCL_THROWS1(SQLException *)
void CharsetConvertException *void fetch() __DCL_THROWS1(SQLException *)
Entity & operator=(const Entity &_s)