diff options
author | megamage <none@none> | 2009-04-20 20:32:53 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-04-20 20:32:53 -0500 |
commit | 5bb13802a70196e0d4ae31a01f7185b11a6bd525 (patch) | |
tree | d653636ce3cacab79278276fcbd6d1994ea146cd | |
parent | 0c56b79e9698058e26b7f3e19215fc602cd4fa63 (diff) |
[7691] Added MySQL to PostgreSQL converter. Author: AlexDereka
Tested on PostgreSQL 8.3 and MySQL 5.0.
For compile see README.
--HG--
branch : trunk
-rw-r--r-- | contrib/mysql_to_pgsql/CMakeLists.txt | 21 | ||||
-rw-r--r-- | contrib/mysql_to_pgsql/README | 14 | ||||
-rw-r--r-- | contrib/mysql_to_pgsql/cmake/FindMySQL.cmake | 74 | ||||
-rw-r--r-- | contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake | 82 | ||||
-rw-r--r-- | contrib/mysql_to_pgsql/src/defines.h | 173 | ||||
-rw-r--r-- | contrib/mysql_to_pgsql/src/main.cpp | 339 |
6 files changed, 703 insertions, 0 deletions
diff --git a/contrib/mysql_to_pgsql/CMakeLists.txt b/contrib/mysql_to_pgsql/CMakeLists.txt new file mode 100644 index 00000000000..490a023e4ec --- /dev/null +++ b/contrib/mysql_to_pgsql/CMakeLists.txt @@ -0,0 +1,21 @@ +SET(CMAKE_VERBOSE_MAKEFILE ON) +cmake_minimum_required (VERSION 2.6) + +INCLUDE(cmake/FindMySQL.cmake) +INCLUDE(cmake/FindPostgreSQL.cmake) + +MESSAGE("-- Check PostgreSQL") +FIND_PGSQL() +ADD_DEFINITIONS(-DDO_POSTGRESQL) + +MESSAGE("-- Check MySQL") +FIND_MYSQL() +ADD_DEFINITIONS(-DDO_MYSQL) + +INCLUDE_DIRECTORIES(${MYSQL_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${PGSQL_INCLUDE_DIR}) + +ADD_EXECUTABLE (mysql2pgsql src/main.cpp) + +TARGET_LINK_LIBRARIES(mysql2pgsql ${PGSQL_LIBRARIES}) +TARGET_LINK_LIBRARIES(mysql2pgsql ${MYSQL_LIBRARIES}) diff --git a/contrib/mysql_to_pgsql/README b/contrib/mysql_to_pgsql/README new file mode 100644 index 00000000000..bf7083fb663 --- /dev/null +++ b/contrib/mysql_to_pgsql/README @@ -0,0 +1,14 @@ +Using cmake on a Windows +------------------ + 1. install cmake (http://www.cmake.org/cmake/resources/software.html) + 2. cmake -i + 3. Project.sln + 4. {Debug/Release}/mysql2pgsql.exe + +Using cmake on a Unix/Linux +------------------ + 1. install cmake + 2. cmake -i + 3. make + 4. ./mysql2pgsql + diff --git a/contrib/mysql_to_pgsql/cmake/FindMySQL.cmake b/contrib/mysql_to_pgsql/cmake/FindMySQL.cmake new file mode 100644 index 00000000000..e7d158de275 --- /dev/null +++ b/contrib/mysql_to_pgsql/cmake/FindMySQL.cmake @@ -0,0 +1,74 @@ +# - Find mysqlclient +# Find the native MySQL includes and library +# +# MYSQL_INCLUDE_DIR - where to find mysql.h, etc. +# MYSQL_LIBRARIES - List of libraries when using MySQL. +# MYSQL_FOUND - True if MySQL found. +MACRO(FIND_MYSQL) + +IF (MYSQL_INCLUDE_DIR) + # Already in cache, be silent + SET(MySQL_FIND_QUIETLY TRUE) +ENDIF (MYSQL_INCLUDE_DIR) + +FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 6.0;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 4.1;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 4.0;Location]/include" + /usr/local/mysql/include + /usr/local/include/mysql + /usr/local/include + /usr/include/mysql + /usr/include + /usr/mysql/include +) + +IF(MSVC) + SET(MYSQL_NAMES libmysql) +ELSE(MSVC) + SET(MYSQL_NAMES mysqlclient mysqlclient_r) +ENDIF(MSVC) +SET(MYSQL_SEARCH_LIB_PATHS + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 6.0;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 4.1;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 4.0;Location]/lib/opt" + /usr/local/mysql/lib + /usr/local/lib/mysql + /usr/local/lib + /usr/lib/mysql + /usr/lib +) +FIND_LIBRARY(MYSQL_LIBRARY + NAMES ${MYSQL_NAMES} + PATHS ${MYSQL_SEARCH_LIB_PATHS} +) + +IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND TRUE) + SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} ) +ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + SET(MYSQL_FOUND FALSE) + SET( MYSQL_LIBRARIES ) +ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY) + +IF (MYSQL_FOUND) + IF (NOT MySQL_FIND_QUIETLY) + MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}") + ENDIF (NOT MySQL_FIND_QUIETLY) +ELSE (MYSQL_FOUND) + IF (MySQL_FIND_REQUIRED) + MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find MySQL library") + ENDIF (MySQL_FIND_REQUIRED) +ENDIF (MYSQL_FOUND) + +MARK_AS_ADVANCED( + MYSQL_LIBRARY + MYSQL_INCLUDE_DIR +) + +ENDMACRO(FIND_MYSQL)
\ No newline at end of file diff --git a/contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake b/contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake new file mode 100644 index 00000000000..06a1adc9e7a --- /dev/null +++ b/contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake @@ -0,0 +1,82 @@ +# - Find libpq +# Find the native PostgreSQL includes and library +# +# PGSQL_INCLUDE_DIR - where to find libpq-fe.h, etc. +# PGSQL_LIBRARIES - List of libraries when using PGSQL. +# PGSQL_FOUND - True if PGSQL found. + +MACRO(FIND_PGSQL) +IF (PGSQL_INCLUDE_DIR) + # Already in cache, be silent + SET(PostgreSQL_FIND_QUIETLY TRUE) +ENDIF (PGSQL_INCLUDE_DIR) + +# the registry settings checked are in order: +# - for pgInstaller 8.2.x postgresql version +# - for pgInstaller 8.3.x postgresql version +SET(PGSQL_WIN_BASE + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{B823632F-3B72-4514-8861-B961CE263224};Base Directory]" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{1F701DBD-1660-4108-B10A-FB435EA63BF0};Base Directory]") + +IF(PGSQL_WIN_BASE) + IF(MSVC) + SET(PGSQL_SEARCH_LIB_PATHS "${PGSQL_WIN_BASE}/lib/ms") + ELSE(MSVC) + SET(PGSQL_SEARCH_LIB_PATHS "${PGSQL_WIN_BASE}/lib") + ENDIF(MSVC) +ENDIF(PGSQL_WIN_BASE) + +FIND_PATH(PGSQL_INCLUDE_DIR libpq-fe.h + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{1F701DBD-1660-4108-B10A-FB435EA63BF0};Base Directory]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{B823632F-3B72-4514-8861-B961CE263224};Base Directory]/include" + /usr/local/pgsql/include + /usr/local/postgresql/include + /usr/local/include/pgsql + /usr/local/include/postgresql + /usr/local/include + /usr/include/pgsql + /usr/include/postgresql + /usr/include + /usr/pgsql/include + /usr/postgresql/include +) + +SET(PGSQL_NAMES pq libpq) +SET(PGSQL_SEARCH_LIB_PATHS + ${PGSQL_SEARCH_LIB_PATHS} + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{1F701DBD-1660-4108-B10A-FB435EA63BF0};Base Directory]/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\PostgreSQL\\Installations\\{B823632F-3B72-4514-8861-B961CE263224};Base Directory]/lib" + /usr/local/pgsql/lib + /usr/local/lib + /usr/lib +) +FIND_LIBRARY(PGSQL_LIBRARY + NAMES ${PGSQL_NAMES} + PATHS ${PGSQL_SEARCH_LIB_PATHS} +) + +IF (PGSQL_INCLUDE_DIR AND PGSQL_LIBRARY) + SET(PGSQL_FOUND TRUE) + SET( PGSQL_LIBRARIES ${PGSQL_LIBRARY} ) +ELSE (PGSQL_INCLUDE_DIR AND PGSQL_LIBRARY) + SET(PGSQL_FOUND FALSE) + SET( PGSQL_LIBRARIES ) +ENDIF (PGSQL_INCLUDE_DIR AND PGSQL_LIBRARY) + +IF (PGSQL_FOUND) + IF (NOT PostgreSQL_FIND_QUIETLY) + MESSAGE(STATUS "Found PostgreSQL: ${PGSQL_LIBRARY}") + ENDIF (NOT PostgreSQL_FIND_QUIETLY) +ELSE (PGSQL_FOUND) + IF (PostgreSQL_FIND_REQUIRED) + MESSAGE(STATUS "Looked for PostgreSQL libraries named ${PGSQL_NAMES}.") + MESSAGE(FATAL_ERROR "Could NOT find PostgreSQL library") + ENDIF (PostgreSQL_FIND_REQUIRED) +ENDIF (PGSQL_FOUND) + +MARK_AS_ADVANCED( + PGSQL_LIBRARY + PGSQL_INCLUDE_DIR +) +ENDMACRO(FIND_PGSQL) + diff --git a/contrib/mysql_to_pgsql/src/defines.h b/contrib/mysql_to_pgsql/src/defines.h new file mode 100644 index 00000000000..662a7aab2fd --- /dev/null +++ b/contrib/mysql_to_pgsql/src/defines.h @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _DEFINES_ +#define _DEFINES_ + +#ifdef WIN32 +#include <winsock2.h> +#pragma warning(disable:4996) +#endif + +#include <libpq-fe.h> +#include <mysql.h> +#include <string> +#include <vector> +#include <map> +#include <iostream> +#include <sstream> +#include <cstdlib> +#include <string.h> +using namespace std; + + +#ifdef WIN32 +typedef unsigned __int64 uint64; +typedef unsigned int uint32; +#else +#include <stdint.h> +#ifndef uint64_t +#include <linux/types.h> +#endif +typedef uint64_t uint64; +typedef unsigned int uint32; +#endif + +struct sField +{ + string name; // field name + string def; // field default data + string type; // field type + uint32 flags; // filed flags, see field flags; +}; +typedef vector<sField> T_Table; +typedef vector<string> T_TableList; +typedef map< string, T_Table > TDataBase; + +static +void pg_notice(void *arg, const char *message) +{ + /// Do nothing + //printf("%s\n", message); +} + +inline +string ConvertNativeType(enum_field_types mysqlType, uint32 length) +{ + + switch (mysqlType) + { + case FIELD_TYPE_TIMESTAMP: + return "timestamp"; + case FIELD_TYPE_BIT: + return "bit(1)"; + case FIELD_TYPE_DATETIME: + return "date"; + case FIELD_TYPE_YEAR: + case FIELD_TYPE_BLOB: + case FIELD_TYPE_SET: + case FIELD_TYPE_NULL: + case FIELD_TYPE_ENUM: + return "text"; + case FIELD_TYPE_TINY: + case FIELD_TYPE_SHORT: + case FIELD_TYPE_INT24: + return "integer"; + case FIELD_TYPE_LONGLONG: + return "int8"; + case FIELD_TYPE_LONG: + return "bigint"; + case FIELD_TYPE_DECIMAL: + case FIELD_TYPE_FLOAT: + case FIELD_TYPE_DOUBLE: + return "float"; + case FIELD_TYPE_STRING: + { + string temp; + char str[10]; + temp = "char"; + if (length) + { + temp.append("("); + sprintf(str,"%d",length); + temp.append(str); + temp.append(")"); + } + return temp; + } + case FIELD_TYPE_VAR_STRING: + { + string temp; + char str[10]; + temp = "varchar"; + if (length) + { + temp.append("("); + sprintf(str,"%d",length); + temp.append(str); + temp.append(")"); + } + return temp; + } + default: + return "text"; + } + return "text"; +} + +inline +bool IsNeeedEscapeString(enum_field_types mysqlType) +{ + switch(mysqlType) + { + case FIELD_TYPE_VAR_STRING: + case FIELD_TYPE_STRING: + case FIELD_TYPE_TINY_BLOB: + case FIELD_TYPE_MEDIUM_BLOB: + case FIELD_TYPE_LONG_BLOB: + case FIELD_TYPE_BLOB: + return true; + default: + return false; + } + return false; +} + +inline +void PG_Exec_str(string sql, PGconn *mPGconn) +{ + PGresult *res = PQexec (mPGconn, sql.c_str()); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + printf( "SQL: %s", sql.c_str() ); + printf( "SQL %s", PQerrorMessage(mPGconn) ); + } +} + +void PG_Escape_Str(string& str) +{ + if(str.empty()) + return; + char* buf = new char[str.size()*2+1]; + PQescapeString(buf,str.c_str(),str.size()); + str = buf; + delete[] buf; +} + +#endif + diff --git a/contrib/mysql_to_pgsql/src/main.cpp b/contrib/mysql_to_pgsql/src/main.cpp new file mode 100644 index 00000000000..8ca6772de20 --- /dev/null +++ b/contrib/mysql_to_pgsql/src/main.cpp @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "defines.h" + +int main(int argc, char* argv[]) +{ + char sPGhost[26], sPGport[26], sPGdb[26], sPGuser[26], sPGpass[26]; + printf("Postgres connection settings\n Host>"); + scanf("%s",sPGhost); + printf(" Port>"); + scanf("%s",sPGport); + printf(" Base>"); + scanf("%s",sPGdb); + printf(" User>"); + scanf("%s",sPGuser); + printf(" Pass>"); + scanf("%s",sPGpass); + + /////////////////////////////// + ///////PGSQL Connect/////////// + /////////////////////////////// + PGconn *mPGconn=NULL; + mPGconn = PQsetdbLogin(sPGhost,sPGport, NULL, NULL, sPGdb, sPGuser, sPGpass); + + if (PQstatus(mPGconn) != CONNECTION_OK) + { + printf("Could not connect to Postgre database at [%s]: \n %s\n",sPGhost, PQerrorMessage(mPGconn)); + PQfinish(mPGconn); + return 1; + } + else + { + printf("Connected to Postgre database at [%s]\n", sPGhost); + printf(" PostgreSQL server ver: [%d]\n\n",PQserverVersion(mPGconn)); + } + + /// Set dummy notice processor + PQsetNoticeProcessor(mPGconn, pg_notice, mPGconn); + + /////////////////////////////// + ///////MySQL Connect/////////// + /////////////////////////////// + MYSQL *mysqlInit; + mysqlInit = mysql_init(NULL); + if (!mysqlInit) + { + printf( "Could not initialize Mysql connection\n" ); + return 1; + } + + char sMYhost[26], sMYdb[26], sMYuser[26], sMYpass[26]; + int iMYport; + printf("Mysql connection settings \n Host>"); + scanf("%s",sMYhost); + printf(" Port>"); + scanf("%d",&iMYport); + printf(" Base>"); + scanf("%s",sMYdb); + printf(" User>"); + scanf("%s",sMYuser); + printf(" Pass>"); + scanf("%s",sMYpass); + + mysql_options(mysqlInit,MYSQL_SET_CHARSET_NAME,"utf8"); + + MYSQL *mMysql; + mMysql = mysql_real_connect(mysqlInit, sMYhost, sMYuser, sMYpass, sMYdb, iMYport, NULL, 0); + + if (mMysql) + { + printf( "Connected to MySQL database at [%s] \n", sMYhost); + printf( " MySQL client library: [%s] \n", mysql_get_client_info()); + printf( " MySQL server ver: [%s] \n\n", mysql_get_server_info( mMysql)); + } + else + { + printf("Could not connect to MySQL database at [%s]:\n %s\n", sMYhost ,mysql_error(mysqlInit)); + mysql_close(mysqlInit); + return 1; + } + + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + MYSQL_RES *result = NULL; + MYSQL_ROW row; + MYSQL_FIELD *fields = NULL; + uint64 rowCount = 0; + uint32 fieldCount =0; + result = mysql_list_tables( mMysql , NULL ); + rowCount = mysql_num_rows(result); + + /***********************/ + /* get list of tables */ + /***********************/ + T_TableList mTableList; + mTableList.reserve((size_t)rowCount); + while( (row = mysql_fetch_row(result)) !=NULL ) + { + for (uint32 i = 0;i<mysql_num_fields(result);i++) + { + mTableList.push_back(row[i]); + } + } + mysql_free_result(result); + + /****************************************/ + /* convert filed type and default type */ + /****************************************/ + T_Table m_Table; + TDataBase m_DataBase_Map; + m_DataBase_Map.clear(); + for (uint32 j=0; j<mTableList.size();++j) + { + result = mysql_list_fields(mMysql, mTableList[j].c_str(), NULL); + fieldCount = mysql_num_fields(result); + fields = mysql_fetch_fields(result); + + for (uint32 i=0; i<fieldCount;++i) + { + sField mfield; + mfield.name = fields[i].name; + if (!fields[i].def) + { + mfield.def = "NULL"; + } + else if (!strcmp(fields[i].def,"0000-00-00 00:00:00")) + { + /// Convert MySQL Default timestamp to PGSQL Default timestamp + mfield.def.append("'1970-01-01 00:00:00'"); + } + else + { + /// Append ' + mfield.def.append("'"); + mfield.def.append(fields[i].def);; + mfield.def.append("'"); + } + mfield.type = ConvertNativeType(fields[i].type,fields[i].length); + mfield.flags = fields[i].flags; + m_Table.push_back(mfield); + } + m_DataBase_Map[mTableList[j]] = m_Table; + m_Table.clear(); + mysql_free_result(result); + } + + /******************************************/ + /* Conversion of the layout of the tables */ + /******************************************/ + + uint32 count = 0; + TDataBase::const_iterator citr; + for (citr = m_DataBase_Map.begin(); citr != m_DataBase_Map.end(); ++citr) + { + ostringstream sql_str; + sql_str<<"DROP TABLE IF EXISTS "<<(*citr).first.c_str()<<";\n"; + sql_str<<"CREATE TABLE "<<(*citr).first.c_str()<<"(\n"; + + T_Table::const_iterator v_iter; + ostringstream prim_key_str; + ostringstream index_str; + for (v_iter = (*citr).second.begin(); + v_iter != (*citr).second.end(); + ++v_iter) + { + sql_str<<" "<<(*v_iter).name; + if (((*v_iter).flags & AUTO_INCREMENT_FLAG)!=0) + { + /// AUTO_INCREMENT fields not have "default" data + sql_str<<" bigserial"; + } + else + { + sql_str<<" "<<(*v_iter).type; + sql_str<<" default "<<(*v_iter).def; + } + /// IF column have PRIMARY KEY flag then use column in PRIMARY KEY + if (IS_PRI_KEY( (*v_iter).flags )!=0) + { + if( prim_key_str.str().size()) + prim_key_str << ", "; + else + { + prim_key_str << "ALTER TABLE "; + prim_key_str << (*citr).first.c_str(); + prim_key_str << " ADD CONSTRAINT pk_"; + prim_key_str << (*citr).first.c_str(); + prim_key_str << "_"; + prim_key_str << (*v_iter).name; + prim_key_str << " PRIMARY KEY ("; + } + prim_key_str<<(*v_iter).name; + } + else if (((*v_iter).flags & MULTIPLE_KEY_FLAG)!=0) + { + /// IF column have INDEX flag then create INDEX + index_str << "CREATE INDEX idx_"; + index_str << (*citr).first.c_str(); + index_str << "_"; + index_str << (*v_iter).name; + index_str << " ON "; + index_str << (*citr).first.c_str(); + index_str << " USING btree ("; + index_str << (*v_iter).name; + index_str << ");\n"; + } + else if (((*v_iter).flags & UNIQUE_KEY_FLAG)!=0) + { + /// IF column have UNIQUE INDEX flag then create INDEX + index_str << "CREATE UNIQUE INDEX uidx_"; + index_str << (*citr).first.c_str(); + index_str << "_"; + index_str << (*v_iter).name; + index_str << " ON "; + index_str << (*citr).first.c_str(); + index_str << " USING btree ("; + index_str << (*v_iter).name; + index_str << ");\n"; + } + /// don't output "," for last column + if(v_iter + 1 != (*citr).second.end()) + sql_str<< ",\n"; + else + sql_str<< "\n"; + } + sql_str<< ")\n"; + + /// Out Table structure + PG_Exec_str(sql_str.str(),mPGconn); + + /// out PRIMARY KEY + if(prim_key_str.str().size()) + { + prim_key_str<<")"; + PG_Exec_str(prim_key_str.str(),mPGconn); + } + + /// out INDEX's + if (index_str.str().size()) + PG_Exec_str(index_str.str(),mPGconn); + + ++count; + printf("Convert [%d] tables...\r",count); + } + printf("Completed the conversion of [%d] tables!\n", count); + + /****************/ + /* Copying data */ + /****************/ + + count = 0; + for (uint32 j=0; j<mTableList.size();++j) + { + ostringstream sql_str; + sql_str << "SELECT * FROM "; + sql_str << mTableList[j].c_str(); + + if (mysql_query(mysqlInit,sql_str.str().c_str()) ) + continue; + if (!(result = mysql_store_result(mysqlInit))) + continue; + + while ((row = mysql_fetch_row(result))!=NULL) + { + ostringstream insert_str; + insert_str << "INSERT INTO "; + insert_str << mTableList[j].c_str(); + insert_str << " VALUES ("; + + fieldCount = mysql_num_fields(result); + fields = mysql_fetch_fields(result); + for (uint32 i = 0 ; i < fieldCount ; ++i) + { + if (!row[i]) + insert_str << "NULL"; + else + { + if (IsNeeedEscapeString(fields[i].type)) + { + string field_str = row[i]; + PG_Escape_Str(field_str); + insert_str << "E'"; + insert_str << field_str.c_str(); + insert_str << "'"; + } + else if (!strcmp(row[i],"0000-00-00 00:00:00")) + { + /// Convert MySQL timestamp to PGSQL timestamp + insert_str << "'1970-01-01 00:00:00'"; + } + else + { + insert_str << "'"; + insert_str << row[i]; + insert_str << "'"; + } + } + + /// don't output "," for last column + if(i + 1 != fieldCount ) + insert_str<< ","; + else + insert_str<< ")\n"; + } + PG_Exec_str(insert_str.str(), mPGconn); + } + mysql_free_result(result); + ++count; + printf("Copied data from [%d] tables...\r",count); + } + printf("Finished copying the data from [%d] tables!\n",count); + mTableList.clear(); + m_DataBase_Map.clear(); + + /// Close connections + mysql_close(mMysql); + PQfinish(mPGconn); + + printf("end\n"); + return 0; + +} + |