ZeroC—ICE分佈式數據同步Demo

環境介紹:

操作系統:Windows

數據庫:MySQL 5.6

IDE:VS2012

ICE版本:3.5.0

MySQL Lib版本:5.6.12

 

配置文件:

客戶端配置文件 info.conf

[plain] view plain copy
 print?
  1. # IP和端口  
  2. ServerIP = 127.0.0.1  
  3. ServerPort = 10000  
  4.   
  5. # DateBase信息  
  6. DataBase = demoice  
  7. Table = demo  
  8. HostName = 127.0.0.1  
  9. SqlName = root  
  10. SqlPwd = *****  


服務器配置文件 serverInfo.conf

[plain] view plain copy
 print?
  1. # DateBase信息  
  2. DataBase = demoICE  
  3. Table = syn  
  4. HostName = 127.0.0.1  
  5. SqlName = root  
  6. SqlPwd = ******  


 

 

 

數據庫腳本:

  1. CREATE TABLE demo(  
  2.   name VARCHAR(20) PRIMARY KEY,  
  3.   pwd VARCHAR(20) NOT NULL  
  4. );  
  5.   
  6. CREATE TABLE syn(  
  7.   name VARCHAR(20) PRIMARY KEY,  
  8.   pwd VARCHAR(20) NOT NULL  
  9. );  

 

demo爲源數據,syn爲同步目標

 

Slice文件:

DBOperator.ice

[plain] view plain copy
 print?
  1. // **********************************************************************  
  2. //  
  3. // Author: X_White  
  4. //  
  5. // **********************************************************************  
  6.   
  7. #pragma once  
  8.   
  9. module dbOperator {  
  10.     interface DBOprtr {  
  11.         int synDropTab();  
  12.         int synAllData();  
  13.         int synRowData();  
  14.         int synSingleData(string s);  
  15.         int transmitData(string s, string index);  
  16.     };  
  17. };  


 

客戶端:

Client.cpp

  1. // **********************************************************************  
  2. //  
  3. // Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.  
  4. //  
  5. // This copy of Ice is licensed to you under the terms described in the  
  6. // ICE_LICENSE file included in this distribution.  
  7. //  
  8. // **********************************************************************  
  9.   
  10. #include <Ice/Ice.h>  
  11. #include <Printer.h>  
  12. #include <DBOperator.h>  
  13.   
  14. #include <cstdio>  
  15. #include <iostream>  
  16. #include <cstring>  
  17. #include <time.h>  
  18. #include <WinSock2.h>  
  19. #include <mysql.h>  
  20. #include <vector>  
  21.   
  22. #pragma comment(lib, "libmysql.lib")  
  23.   
  24. using namespace std;  
  25. using namespace Demo;  
  26. using namespace dbOperator;  
  27.   
  28. typedef struct synData {  
  29.     int count;  
  30.     char data[20][20];  
  31. }synData;  
  32.   
  33. void ice_strcpy(char *src, char *des) {  
  34.     size_t i;  
  35.     size_t len1 = strlen(src);  
  36.     size_t len2 = strlen(des);  
  37.     for(i = 0; i < len2; i++) {  
  38.         src[i] = des[i];  
  39.     }  
  40.     src[i] = '\0';  
  41. }  
  42.   
  43. int writeLog() {  
  44.     return 0;  
  45. }  
  46.   
  47. /* 
  48.  * Author:X_White 
  49.  * initConf讀取配置文件info.conf 並返回serverIP、端口號、數據庫dbName、表名 
  50.  * 
  51. */  
  52. int initConf(char *desIP, char *desPort, char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {  
  53.     FILE *conffp;  
  54.     errno_t err;  
  55.     char buf[1024];  
  56.     err = freopen_s(&conffp, "../conf/info.conf""r", stdin);  
  57.     if(err != 0) {  
  58.         writeLog();  
  59.         exit(1);  
  60.     }  
  61.     while(gets_s(buf)) {  
  62.         if('#' == buf[0]) continue;  
  63.         char n1[128], n2[128], equ[128];  
  64.         memset(n1, 0, sizeof(n1));  
  65.         memset(n2, 0, sizeof(n2));  
  66.         sscanf_s(buf, "%s %s %s", n1, sizeof(n1), equ, sizeof(equ) , n2, sizeof(n2));  
  67. //      printf("%s %s\n", tmp, num);  
  68.         if(!strcmp(n1, "ServerIP")) {  
  69.             ice_strcpy(desIP, n2);  
  70.         }  
  71.         else if(!strcmp(n1, "ServerPort")) {  
  72.             ice_strcpy(desPort, n2);  
  73.         }  
  74.         else if(!strcmp(n1, "DataBase")) {  
  75.             ice_strcpy(dbName, n2);  
  76.         }  
  77.         else if(!strcmp(n1, "Table")) {  
  78.             ice_strcpy(tableName, n2);  
  79.         }  
  80.         else if(!strcmp(n1, "HostName")) {  
  81.             ice_strcpy(hostName, n2);  
  82.         }  
  83.         else if(!strcmp(n1, "SqlName")) {  
  84.             ice_strcpy(sqlName, n2);  
  85.         }  
  86.         else if(!strcmp(n1, "SqlPwd")) {  
  87.             ice_strcpy(sqlPwd, n2);  
  88.         }  
  89.     }  
  90.     return 0;  
  91. }  
  92.   
  93. /* 
  94.  * Author:X_White 
  95.  * sql_init訪問mysql,並取出tableName下所有數據 
  96.  * 
  97. */  
  98. vector<synData> sql_init(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {  
  99.     MYSQL *conn = NULL;  
  100.     MYSQL_RES *res;  
  101.     MYSQL_ROW row;  
  102.     vector<synData> vRet;  
  103.     char sql[256];  
  104.       
  105.     conn = mysql_init(NULL);  
  106.     if(!conn) {  
  107.         fprintf(stderr, "mysql_init failed\n");  
  108.         exit(1);  
  109.     }  
  110.     conn = mysql_real_connect(conn, hostName, sqlName, sqlPwd, dbName, 0, NULL, 0);  
  111.     if(!conn) {  
  112.         fprintf(stderr, "mysql_real_connect failed\n");  
  113.         exit(1);  
  114.     }  
  115.     memset(sql, 0, sizeof(sql));  
  116.     sprintf_s(sql, "SELECT * FROM %s", tableName);  
  117.     if(mysql_query(conn, sql)) {  
  118.         fprintf(stderr, "mysql_query failed\n");  
  119.         exit(1);  
  120.     }  
  121.     if(!(res = mysql_store_result(conn))) {  
  122.         fprintf(stderr, "Could not get result\n");  
  123.         exit(1);  
  124.     }  
  125.   
  126.     while(row = mysql_fetch_row(res)) {  
  127.         unsigned int count = mysql_field_count(conn);  
  128.         unsigned int index = 0;  
  129.         struct synData synInfo;  
  130.         synInfo.count = count;  
  131.         while(index < count) {  
  132.             printf("%s ", row[index]);  
  133.             ice_strcpy(synInfo.data[index], row[index]);  
  134.             index++;  
  135.         }  
  136.         vRet.push_back(synInfo);  
  137.         printf("\n");  
  138.     }  
  139.     mysql_free_result(res);  
  140.     mysql_close(conn);  
  141.     return vRet;  
  142. }  
  143.   
  144.   
  145. /* 
  146.  * Author: X_White 
  147.  * 使用: 
  148.  *      1. main 直接同步所有數據 
  149.  *      2. main -s sql 同步該條語句 
  150.  *        
  151. */  
  152.   
  153. int main(int argc, char * argv[]) {  
  154.     int status = 0;  
  155.     Ice::CommunicatorPtr ic;  
  156.   
  157.     char serverIP[128], serverPort[128];  
  158.     char dbName[128], tableName[128], hostName[128], sqlName[128], sqlPwd[128];  
  159.     char iceProxyString[128] = "SimplePrinter:default -h ";  
  160.     char iceProxyDB[128] = "DBOperator:default -h ";  
  161.     vector<synData> iceSynData;  
  162.   
  163.     initConf(serverIP, serverPort, dbName, tableName, hostName, sqlName, sqlPwd);  
  164.     strcat_s(iceProxyString, serverIP);  
  165.     strcat_s(iceProxyString, " -p ");  
  166.     strcat_s(iceProxyString, serverPort);  
  167.   
  168.     strcat_s(iceProxyDB, serverIP);  
  169.     strcat_s(iceProxyDB, " -p ");  
  170.     strcat_s(iceProxyDB, serverPort);  
  171. //  printf("%s\n", iceProxyString);  
  172.   
  173.     iceSynData = sql_init(dbName, tableName, hostName, sqlName, sqlPwd);  
  174.   
  175.     try {  
  176.         ic = Ice::initialize(argc, argv);  
  177.         Ice::ObjectPrx base = ic->stringToProxy(iceProxyString);  
  178.         Ice::ObjectPrx dbBase = ic->stringToProxy(iceProxyDB);  
  179.         PrinterPrx printer = PrinterPrx::checkedCast(base);  
  180.         DBOprtrPrx dbOpAgent = DBOprtrPrx::checkedCast(dbBase);  
  181.         if(!printer) {  
  182.             throw "Invalid proxy printer";  
  183.         }  
  184.         if(!dbOpAgent) {  
  185.             throw "Invalid proxy dbOpAgent";  
  186.         }  
  187. //      printer->printString("Hello World!");  
  188. /* 
  189.  * Author: X_White 
  190.  * 遠程代理操作數據庫 
  191. */  
  192.         if(1 == argc) {           
  193.             int i, j;  
  194.             i = 0;  
  195. //          dbOpAgent->transmitCount(iceSynData[0].count);  
  196.             dbOpAgent->synDropTab();  
  197.             for(vector<synData>::iterator it = iceSynData.begin(); it != iceSynData.end(); it++, i++) {  
  198.                 for(j = 0; j < iceSynData[0].count; j++) {  
  199.                     char tmp[256];  
  200.                     sprintf_s(tmp, "%d", j);  
  201.                     string str(tmp);  
  202.                     dbOpAgent->transmitData(iceSynData[i].data[j], str);  
  203.                 }  
  204.                 dbOpAgent->synRowData();  
  205.             }  
  206.         }  
  207.         else if(3 == argc) {  
  208.             if(!strcmp(argv[1], "-s")) {  
  209.                 dbOpAgent->synSingleData(argv[2]);  
  210.             }  
  211.             else {  
  212.                 fprintf(stderr, "Arguments error\n");  
  213.                 fprintf(stderr, "Usage: ice_Client [-s sql]\n");  
  214.                 exit(1);  
  215.             }  
  216.         }  
  217.         else {  
  218.             fprintf(stderr, "Arguments error\n");  
  219.             fprintf(stderr, "Usage: ice_Client [-s sql]\n");  
  220.             exit(1);  
  221.         }  
  222.     } catch(const Ice::Exception& ex) {  
  223.         cerr << ex << endl;  
  224.         status = 1;  
  225.     } catch(const char* msg) {  
  226.         cerr << msg << endl;  
  227.         status = 1;  
  228.     }  
  229.     if(ic) {  
  230.         try {  
  231.             ic->destroy();  
  232.         } catch (const Ice::Exception& ex) {  
  233.             cerr << ex << endl;  
  234.             status = 1;  
  235.         }  
  236.     }  
  237.     return status;  
  238. }  


 

服務器端:

Server.cpp

  1. // **********************************************************************  
  2. //  
  3. // Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.  
  4. //  
  5. // This copy of Ice is licensed to you under the terms described in the  
  6. // ICE_LICENSE file included in this distribution.  
  7. //  
  8. // **********************************************************************  
  9.   
  10. #include <Ice/Ice.h>  
  11. #include <Printer.h>  
  12. #include <DBoperator.h>  
  13.   
  14. #include <cstdio>  
  15. #include <iostream>  
  16. #include <cstring>  
  17. #include <time.h>  
  18. #include <WinSock2.h>  
  19. #include <mysql.h>  
  20.   
  21. #pragma comment(lib, "libmysql.lib")  
  22.   
  23. using namespace std;  
  24. using namespace Demo;  
  25. using namespace dbOperator;  
  26.   
  27. typedef struct synData {  
  28.     int count;  
  29.     char data[20][20];  
  30. }synData;  
  31. synData sqlData;  
  32.   
  33. MYSQL *conn = NULL;  
  34.   
  35. char dbName[128], tableName[128], hostName[128], sqlName[128], sqlPwd[128];  
  36.   
  37. /* 
  38.  * Printer打印服務 
  39. */  
  40. class PrinterI : public Printer {  
  41. public:  
  42.     virtual void printString(const string &, const Ice::Current&);  
  43. };  
  44.   
  45. void PrinterI::printString(const string &s, const Ice::Current&) {  
  46.     cout << s << endl;  
  47. }  
  48. //==================================================================================================  
  49.   
  50. /* 
  51.  * Author:X_White 
  52.  * 數據庫操作服務 
  53. */  
  54. class DBOprtrI : public DBOprtr {  
  55. public:  
  56.     virtual int synDropTab(const Ice::Current&);  
  57.     virtual int synAllData(const Ice::Current&);  
  58.     virtual int synRowData(const Ice::Current&);  
  59.     virtual int synSingleData(const string &, const Ice::Current&);  
  60.     virtual int transmitData(const string &, const string&, const Ice::Current&);  
  61. };  
  62.   
  63. int DBOprtrI::synDropTab(const Ice::Current&) {  
  64.     char sql[128];  
  65.     memset(sql, 0, sizeof(sql));  
  66.   
  67.     strcat_s(sql, "DELETE * FROM ");  
  68.     strcat_s(sql, tableName);  
  69.   
  70.     return 0;  
  71. }  
  72.   
  73. int DBOprtrI::synAllData(const Ice::Current&) {  
  74.     char sql[128];  
  75.     memset(sql, 0, sizeof(sql));  
  76.     strcat_s(sql, "DELETE * FROM ");  
  77.     strcat_s(sql, tableName);  
  78.   
  79.     if(mysql_query(conn, sql)) {  
  80.         fprintf(stderr, "mysql_query delete failed\n");  
  81.         return -1;  
  82.     }  
  83.   
  84.     memset(sql, 0, sizeof(sql));  
  85.     strcat_s(sql, "UPDATE INTO ");  
  86.     strcat_s(sql, tableName);  
  87.     strcat_s(sql, " (name, pwd) VALUES (");  
  88.     strcat_s(sql, sqlData.data[0]);  
  89.     strcat_s(sql, ",");  
  90.     strcat_s(sql, sqlData.data[1]);  
  91.     strcat_s(sql, ")");  
  92.   
  93.     if(mysql_query(conn, sql)) {  
  94.         fprintf(stderr, "mysql_query update failed\n");  
  95.         return -1;  
  96.     }  
  97.   
  98.     return 0;  
  99. }  
  100.   
  101. int DBOprtrI::synRowData(const Ice::Current&) {  
  102.     char sql[128];  
  103.     memset(sql, 0, sizeof(sql));  
  104.     strcat_s(sql, "INSERT INTO ");  
  105.     strcat_s(sql, tableName);  
  106.     strcat_s(sql, "(name, pwd) VALUES('");  
  107.     strcat_s(sql, sqlData.data[0]);  
  108.     strcat_s(sql, "','");  
  109.     strcat_s(sql, sqlData.data[1]);  
  110.     strcat_s(sql, "')");  
  111.   
  112. //  fprintf(stderr, sql);  
  113.   
  114.     if(mysql_query(conn, sql)) {  
  115.         fprintf(stderr, "mysql_query insert failed\n");  
  116.         return -1;  
  117.     }  
  118.   
  119.     return 0;  
  120. }  
  121.   
  122. int DBOprtrI::synSingleData(const string &sql, const Ice::Current&) {  
  123.     return 0;  
  124. }  
  125.   
  126. int DBOprtrI::transmitData(const string &data, const string &index, const Ice::Current&) {  
  127.   
  128.     int num = atoi(index.c_str());  
  129.     strcpy_s(sqlData.data[num], data.c_str());  
  130.   
  131.     return 0;  
  132. }  
  133. //==================================================================================================  
  134.   
  135. void ice_strcpy(char *src, char *des) {  
  136.     size_t i;  
  137.     size_t len1 = strlen(src);  
  138.     size_t len2 = strlen(des);  
  139.     for(i = 0; i < len2; i++) {  
  140.         src[i] = des[i];  
  141.     }  
  142.     src[i] = '\0';  
  143. }  
  144.   
  145. int writeLog() {  
  146.     return 0;  
  147. }  
  148.   
  149. /* 
  150.  * Author:X_White 
  151.  * initConf讀取配置文件info.conf 並返回數據庫dbName、表名 
  152.  * 
  153. */  
  154.   
  155. int initConf(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {  
  156.     FILE *conffp;  
  157.     errno_t err;  
  158.     char buf[1024];  
  159.     err = freopen_s(&conffp, "../conf/serverInfo.conf""r", stdin);  
  160.     if(err != 0) {  
  161.         writeLog();  
  162.         exit(1);  
  163.     }  
  164.     while(gets_s(buf)) {  
  165.         if('#' == buf[0]) continue;  
  166.         char n1[128], n2[128], equ[128];  
  167.         memset(n1, 0, sizeof(n1));  
  168.         memset(n2, 0, sizeof(n2));  
  169.         sscanf_s(buf, "%s %s %s", n1, sizeof(n1), equ, sizeof(equ) , n2, sizeof(n2));  
  170. //      printf("%s %s\n", tmp, num);  
  171.         if(!strcmp(n1, "DataBase")) {  
  172.             ice_strcpy(dbName, n2);  
  173.         }  
  174.         else if(!strcmp(n1, "Table")) {  
  175.             ice_strcpy(tableName, n2);  
  176.         }  
  177.         else if(!strcmp(n1, "HostName")) {  
  178.             ice_strcpy(hostName, n2);  
  179.         }  
  180.         else if(!strcmp(n1, "SqlName")) {  
  181.             ice_strcpy(sqlName, n2);  
  182.         }  
  183.         else if(!strcmp(n1, "SqlPwd")) {  
  184.             ice_strcpy(sqlPwd, n2);  
  185.         }  
  186.     }  
  187.     return 0;  
  188. }  
  189.   
  190. int sql_init(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {  
  191.     conn = mysql_init(NULL);  
  192.     if(!conn) {  
  193.         fprintf(stderr, "mysql_init failed\n");  
  194.         exit(1);  
  195.     }  
  196.     conn = mysql_real_connect(conn, hostName, sqlName, sqlPwd, dbName, 0, NULL, 0);  
  197.     if(!conn) {  
  198.         fprintf(stderr, "mysql_real_connect failed\n");  
  199.         exit(1);  
  200.     }  
  201.   
  202.     return 0;  
  203. }  
  204.   
  205. int main(int argc, char* argv[]) {  
  206.     int status = 0;  
  207.     Ice::CommunicatorPtr ic;  
  208.   
  209.     initConf(dbName, tableName, hostName, sqlName, sqlPwd);  
  210.     sql_init(dbName, tableName, hostName, sqlName, sqlPwd);  
  211.   
  212.     try {  
  213.         ic = Ice::initialize(argc, argv);  
  214.         Ice::ObjectAdapterPtr adapter =  
  215.             ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter""default -h localhost -p 10000");  
  216. //      Ice::ObjectAdapterPtr adapter =  
  217. //          ic->createObjectAdapterWithEndpoints("DBOperatorAdapter", "default -h localhost -p 10000");  
  218.         Ice::ObjectPtr object = new PrinterI;  
  219.         Ice::ObjectPtr objectDB = new DBOprtrI;  
  220.         adapter->add(object, ic->stringToIdentity("SimplePrinter"));  
  221.         adapter->activate();  
  222.         adapter->add(objectDB, ic->stringToIdentity("DBOperator"));  
  223.         adapter->activate();  
  224.         ic->waitForShutdown();  
  225.     } catch(const Ice::Exception& e) {  
  226.         cerr << e << endl;  
  227.         status = 1;  
  228.     } catch(const char* msg) {  
  229.         cerr << msg << endl;  
  230.         status = 1;  
  231.     }  
  232.     if(ic) {  
  233.         try {  
  234.             ic->destroy();  
  235.         } catch(const Ice::Exception& e) {  
  236.             cerr << e << endl;  
  237.             status = 1;  
  238.         }  
  239.     }  
  240.     mysql_close(conn);  
  241.   
  242.     return status;  
  243. }  


 

運行Servre後,再運行Client。發現目標數據庫中已經得到了同步數據。

 

目前只是一個Demo,部分函數只是寫了個框架,並沒有實現,到時候在根據需求進行實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章