ZeroC—ICE分布式数据同步Demo
来源:互联网 发布:天策成男捏脸数据 编辑:程序博客网 时间:2024/05/29 12:48
环境介绍:
操作系统:Windows
数据库:MySQL 5.6
IDE:VS2012
ICE版本:3.5.0
MySQL Lib版本:5.6.12
配置文件:
客户端配置文件 info.conf
# IP和端口ServerIP = 127.0.0.1ServerPort = 10000# DateBase信息DataBase = demoiceTable = demoHostName = 127.0.0.1SqlName = rootSqlPwd = *****
服务器配置文件 serverInfo.conf
# DateBase信息DataBase = demoICETable = synHostName = 127.0.0.1SqlName = rootSqlPwd = ******
数据库脚本:
CREATE TABLE demo( name VARCHAR(20) PRIMARY KEY, pwd VARCHAR(20) NOT NULL);CREATE TABLE syn( name VARCHAR(20) PRIMARY KEY, pwd VARCHAR(20) NOT NULL);
demo为源数据,syn为同步目标
Slice文件:
DBOperator.ice
// **********************************************************************//// Author: X_White//// **********************************************************************#pragma oncemodule dbOperator {interface DBOprtr {int synDropTab();int synAllData();int synRowData();int synSingleData(string s);int transmitData(string s, string index);};};
客户端:
Client.cpp
// **********************************************************************//// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.//// This copy of Ice is licensed to you under the terms described in the// ICE_LICENSE file included in this distribution.//// **********************************************************************#include <Ice/Ice.h>#include <Printer.h>#include <DBOperator.h>#include <cstdio>#include <iostream>#include <cstring>#include <time.h>#include <WinSock2.h>#include <mysql.h>#include <vector>#pragma comment(lib, "libmysql.lib")using namespace std;using namespace Demo;using namespace dbOperator;typedef struct synData {int count;char data[20][20];}synData;void ice_strcpy(char *src, char *des) {size_t i;size_t len1 = strlen(src);size_t len2 = strlen(des);for(i = 0; i < len2; i++) {src[i] = des[i];}src[i] = '\0';}int writeLog() {return 0;}/* * Author:X_White * initConf读取配置文件info.conf 并返回serverIP、端口号、数据库dbName、表名 **/int initConf(char *desIP, char *desPort, char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {FILE *conffp;errno_t err;char buf[1024];err = freopen_s(&conffp, "../conf/info.conf", "r", stdin);if(err != 0) {writeLog();exit(1);}while(gets_s(buf)) {if('#' == buf[0]) continue;char n1[128], n2[128], equ[128];memset(n1, 0, sizeof(n1));memset(n2, 0, sizeof(n2));sscanf_s(buf, "%s %s %s", n1, sizeof(n1), equ, sizeof(equ) , n2, sizeof(n2));//printf("%s %s\n", tmp, num);if(!strcmp(n1, "ServerIP")) {ice_strcpy(desIP, n2);}else if(!strcmp(n1, "ServerPort")) {ice_strcpy(desPort, n2);}else if(!strcmp(n1, "DataBase")) {ice_strcpy(dbName, n2);}else if(!strcmp(n1, "Table")) {ice_strcpy(tableName, n2);}else if(!strcmp(n1, "HostName")) {ice_strcpy(hostName, n2);}else if(!strcmp(n1, "SqlName")) {ice_strcpy(sqlName, n2);}else if(!strcmp(n1, "SqlPwd")) {ice_strcpy(sqlPwd, n2);}}return 0;}/* * Author:X_White * sql_init访问mysql,并取出tableName下所有数据 **/vector<synData> sql_init(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {MYSQL *conn = NULL;MYSQL_RES *res;MYSQL_ROW row;vector<synData> vRet;char sql[256];conn = mysql_init(NULL);if(!conn) {fprintf(stderr, "mysql_init failed\n");exit(1);}conn = mysql_real_connect(conn, hostName, sqlName, sqlPwd, dbName, 0, NULL, 0);if(!conn) {fprintf(stderr, "mysql_real_connect failed\n");exit(1);}memset(sql, 0, sizeof(sql));sprintf_s(sql, "SELECT * FROM %s", tableName);if(mysql_query(conn, sql)) {fprintf(stderr, "mysql_query failed\n");exit(1);}if(!(res = mysql_store_result(conn))) {fprintf(stderr, "Could not get result\n");exit(1);}while(row = mysql_fetch_row(res)) {unsigned int count = mysql_field_count(conn);unsigned int index = 0;struct synData synInfo;synInfo.count = count;while(index < count) {printf("%s ", row[index]);ice_strcpy(synInfo.data[index], row[index]);index++;}vRet.push_back(synInfo);printf("\n");}mysql_free_result(res);mysql_close(conn);return vRet;}/* * Author: X_White * 使用: *1. main 直接同步所有数据 *2. main -s sql 同步该条语句 * */int main(int argc, char * argv[]) { int status = 0;Ice::CommunicatorPtr ic;char serverIP[128], serverPort[128];char dbName[128], tableName[128], hostName[128], sqlName[128], sqlPwd[128];char iceProxyString[128] = "SimplePrinter:default -h ";char iceProxyDB[128] = "DBOperator:default -h ";vector<synData> iceSynData;initConf(serverIP, serverPort, dbName, tableName, hostName, sqlName, sqlPwd);strcat_s(iceProxyString, serverIP);strcat_s(iceProxyString, " -p ");strcat_s(iceProxyString, serverPort);strcat_s(iceProxyDB, serverIP);strcat_s(iceProxyDB, " -p ");strcat_s(iceProxyDB, serverPort);//printf("%s\n", iceProxyString);iceSynData = sql_init(dbName, tableName, hostName, sqlName, sqlPwd); try { ic = Ice::initialize(argc, argv); Ice::ObjectPrx base = ic->stringToProxy(iceProxyString);Ice::ObjectPrx dbBase = ic->stringToProxy(iceProxyDB); PrinterPrx printer = PrinterPrx::checkedCast(base);DBOprtrPrx dbOpAgent = DBOprtrPrx::checkedCast(dbBase); if(!printer) { throw "Invalid proxy printer"; }if(!dbOpAgent) {throw "Invalid proxy dbOpAgent";}// printer->printString("Hello World!");/* * Author: X_White * 远程代理操作数据库*/if(1 == argc) {int i, j;i = 0;//dbOpAgent->transmitCount(iceSynData[0].count);dbOpAgent->synDropTab();for(vector<synData>::iterator it = iceSynData.begin(); it != iceSynData.end(); it++, i++) {for(j = 0; j < iceSynData[0].count; j++) {char tmp[256];sprintf_s(tmp, "%d", j);string str(tmp);dbOpAgent->transmitData(iceSynData[i].data[j], str);}dbOpAgent->synRowData();}}else if(3 == argc) {if(!strcmp(argv[1], "-s")) {dbOpAgent->synSingleData(argv[2]);}else {fprintf(stderr, "Arguments error\n");fprintf(stderr, "Usage: ice_Client [-s sql]\n");exit(1);}}else {fprintf(stderr, "Arguments error\n");fprintf(stderr, "Usage: ice_Client [-s sql]\n");exit(1);} } catch(const Ice::Exception& ex) { cerr << ex << endl; status = 1; } catch(const char* msg) { cerr << msg << endl; status = 1; } if(ic) { try { ic->destroy(); } catch (const Ice::Exception& ex) { cerr << ex << endl; status = 1; } } return status;}
服务器端:
Server.cpp
// **********************************************************************//// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.//// This copy of Ice is licensed to you under the terms described in the// ICE_LICENSE file included in this distribution.//// **********************************************************************#include <Ice/Ice.h>#include <Printer.h>#include <DBoperator.h>#include <cstdio>#include <iostream>#include <cstring>#include <time.h>#include <WinSock2.h>#include <mysql.h>#pragma comment(lib, "libmysql.lib")using namespace std;using namespace Demo;using namespace dbOperator;typedef struct synData {int count;char data[20][20];}synData;synData sqlData;MYSQL *conn = NULL;char dbName[128], tableName[128], hostName[128], sqlName[128], sqlPwd[128];/* * Printer打印服务*/class PrinterI : public Printer {public:virtual void printString(const string &, const Ice::Current&);};void PrinterI::printString(const string &s, const Ice::Current&) {cout << s << endl;}//==================================================================================================/* * Author:X_White * 数据库操作服务*/class DBOprtrI : public DBOprtr {public:virtual int synDropTab(const Ice::Current&);virtual int synAllData(const Ice::Current&);virtual int synRowData(const Ice::Current&);virtual int synSingleData(const string &, const Ice::Current&);virtual int transmitData(const string &, const string&, const Ice::Current&);};int DBOprtrI::synDropTab(const Ice::Current&) {char sql[128];memset(sql, 0, sizeof(sql));strcat_s(sql, "DELETE * FROM ");strcat_s(sql, tableName);return 0;}int DBOprtrI::synAllData(const Ice::Current&) {char sql[128];memset(sql, 0, sizeof(sql));strcat_s(sql, "DELETE * FROM ");strcat_s(sql, tableName);if(mysql_query(conn, sql)) {fprintf(stderr, "mysql_query delete failed\n");return -1;}memset(sql, 0, sizeof(sql));strcat_s(sql, "UPDATE INTO ");strcat_s(sql, tableName);strcat_s(sql, " (name, pwd) VALUES (");strcat_s(sql, sqlData.data[0]);strcat_s(sql, ",");strcat_s(sql, sqlData.data[1]);strcat_s(sql, ")");if(mysql_query(conn, sql)) {fprintf(stderr, "mysql_query update failed\n");return -1;}return 0;}int DBOprtrI::synRowData(const Ice::Current&) {char sql[128];memset(sql, 0, sizeof(sql));strcat_s(sql, "INSERT INTO ");strcat_s(sql, tableName);strcat_s(sql, "(name, pwd) VALUES('");strcat_s(sql, sqlData.data[0]);strcat_s(sql, "','");strcat_s(sql, sqlData.data[1]);strcat_s(sql, "')");//fprintf(stderr, sql);if(mysql_query(conn, sql)) {fprintf(stderr, "mysql_query insert failed\n");return -1;}return 0;}int DBOprtrI::synSingleData(const string &sql, const Ice::Current&) {return 0;}int DBOprtrI::transmitData(const string &data, const string &index, const Ice::Current&) {int num = atoi(index.c_str());strcpy_s(sqlData.data[num], data.c_str());return 0;}//==================================================================================================void ice_strcpy(char *src, char *des) {size_t i;size_t len1 = strlen(src);size_t len2 = strlen(des);for(i = 0; i < len2; i++) {src[i] = des[i];}src[i] = '\0';}int writeLog() {return 0;}/* * Author:X_White * initConf读取配置文件info.conf 并返回数据库dbName、表名 **/int initConf(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {FILE *conffp;errno_t err;char buf[1024];err = freopen_s(&conffp, "../conf/serverInfo.conf", "r", stdin);if(err != 0) {writeLog();exit(1);}while(gets_s(buf)) {if('#' == buf[0]) continue;char n1[128], n2[128], equ[128];memset(n1, 0, sizeof(n1));memset(n2, 0, sizeof(n2));sscanf_s(buf, "%s %s %s", n1, sizeof(n1), equ, sizeof(equ) , n2, sizeof(n2));//printf("%s %s\n", tmp, num);if(!strcmp(n1, "DataBase")) {ice_strcpy(dbName, n2);}else if(!strcmp(n1, "Table")) {ice_strcpy(tableName, n2);}else if(!strcmp(n1, "HostName")) {ice_strcpy(hostName, n2);}else if(!strcmp(n1, "SqlName")) {ice_strcpy(sqlName, n2);}else if(!strcmp(n1, "SqlPwd")) {ice_strcpy(sqlPwd, n2);}}return 0;}int sql_init(char *dbName, char *tableName, char *hostName, char *sqlName, char *sqlPwd) {conn = mysql_init(NULL);if(!conn) {fprintf(stderr, "mysql_init failed\n");exit(1);}conn = mysql_real_connect(conn, hostName, sqlName, sqlPwd, dbName, 0, NULL, 0);if(!conn) {fprintf(stderr, "mysql_real_connect failed\n");exit(1);}return 0;}int main(int argc, char* argv[]) {int status = 0;Ice::CommunicatorPtr ic;initConf(dbName, tableName, hostName, sqlName, sqlPwd);sql_init(dbName, tableName, hostName, sqlName, sqlPwd);try {ic = Ice::initialize(argc, argv);Ice::ObjectAdapterPtr adapter =ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -h localhost -p 10000");//Ice::ObjectAdapterPtr adapter =//ic->createObjectAdapterWithEndpoints("DBOperatorAdapter", "default -h localhost -p 10000");Ice::ObjectPtr object = new PrinterI;Ice::ObjectPtr objectDB = new DBOprtrI;adapter->add(object, ic->stringToIdentity("SimplePrinter"));adapter->activate();adapter->add(objectDB, ic->stringToIdentity("DBOperator"));adapter->activate();ic->waitForShutdown();} catch(const Ice::Exception& e) {cerr << e << endl;status = 1;} catch(const char* msg) {cerr << msg << endl;status = 1;}if(ic) {try {ic->destroy();} catch(const Ice::Exception& e) {cerr << e << endl;status = 1;}}mysql_close(conn);return status;}
运行Servre后,再运行Client。发现目标数据库中已经得到了同步数据。
目前只是一个Demo,部分函数只是写了个框架,并没有实现,到时候在根据需求进行实现。
- ZeroC—ICE分布式数据同步Demo
- ZeroC—ICE分布式数据同步Demo
- ZeroC—ICE中间件初步Demo
- zeroc ice demo project 编译不通过咋办?
- Zeroc Ice 3.4.2 c++ demo之Icegrid simple
- Zeroc Ice 发布订阅者之demo Icestorm之clock
- Zeroc Ice 发布订阅者之demo Icestorm之clock
- Zeroc的ICE
- Zeroc ICE的示例
- Zeroc ICE的示例
- ZeroC ICE之旅
- ZeroC Ice权威指南
- 《ZeroC Ice权威指南》
- ZeroC Ice 安装
- ZeroC Ice IceBox使用
- Zeroc Ice原理介绍
- ZeroC ICE学习经验总结
- ZeroC Ice IceBox使用
- js的兼容性问题
- 精通软件性能测试与LoadRunner最佳实战 连载七
- iOS开发中的单元测试(二)——让断言活泼起来的匹配引擎
- xcode插件管理工具Alcatraz
- java excel 文件操作
- ZeroC—ICE分布式数据同步Demo
- 精通软件性能测试与LoadRunner最佳实战 连载六
- LIUNX命令
- 平淡的日子需要激情
- 做個合格的程序員
- vc中字符日期到数据库日期的转化
- Android学习进阶路线导航线路(Android源码分享)
- TCP的核心系列 — SACK和DSACK的实现(五)
- 结合源码分析Solr&Lucene查询打分的工作流程