mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 10:37:03 +00:00
[7691] Added MySQL to PostgreSQL converter.
Tested on PostgreSQL 8.3 and MySQL 5.0. For compile see README.
This commit is contained in:
parent
fc0e1ecdf1
commit
c4c093dac6
7 changed files with 704 additions and 1 deletions
21
contrib/mysql_to_pgsql/CMakeLists.txt
Normal file
21
contrib/mysql_to_pgsql/CMakeLists.txt
Normal file
|
|
@ -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})
|
||||||
14
contrib/mysql_to_pgsql/README
Normal file
14
contrib/mysql_to_pgsql/README
Normal file
|
|
@ -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
|
||||||
|
|
||||||
74
contrib/mysql_to_pgsql/cmake/FindMySQL.cmake
Normal file
74
contrib/mysql_to_pgsql/cmake/FindMySQL.cmake
Normal file
|
|
@ -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)
|
||||||
82
contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake
Normal file
82
contrib/mysql_to_pgsql/cmake/FindPostgreSQL.cmake
Normal file
|
|
@ -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)
|
||||||
|
|
||||||
173
contrib/mysql_to_pgsql/src/defines.h
Normal file
173
contrib/mysql_to_pgsql/src/defines.h
Normal file
|
|
@ -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
|
||||||
|
|
||||||
339
contrib/mysql_to_pgsql/src/main.cpp
Normal file
339
contrib/mysql_to_pgsql/src/main.cpp
Normal file
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7690"
|
#define REVISION_NR "7691"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue