資料庫雙機同步問題

來源:互聯網
上載者:User

問題描述:

現有軟體系統中資料庫同步是通過傳遞SQL字串實現的,在處理字串是很多地方都用到了strlen和sprintf函數;
目前新增的功能在同步bblog資料時,除了需要傳遞sql字串,還需要傳遞位元據,位元據有些位元組為0,在使用strlen時造成判斷長度出錯,在使用sprintf函數時遇到0則認為是結束符。問題解決:如果更改原有的邏輯,更改地方較多且會影響原有的處理方法。更改後需測試環節較多。所以在傳遞之前將位元據轉換為ascii碼進行傳遞,在資料終點再將ascii轉換為位元據。只需測試新增功能和函數即可,對原有系統幾乎沒有影響。具體實現:在寫入資料的地方將位元據轉換為字串;具體轉換原則為:一個位元組的位元據轉換為4個位元組的字串,每個字串的值為+、-、0-9(ascii)。在資料傳遞終點,沒4個位元組的字串轉換為1個位元組的位元據,還原資料。轉換和還原函數:static int ConverDataToStr(int data_len,char *data,int &str_len,char *&str){/*功能:裝換位元據為ASCII碼輸入:data_len:位元據長度data:位元據緩衝輸出:str_len:轉換後的字串資料長度str:轉換後的字串,調用者需要釋放。*/int i,ptr,temp_ptr;str_len = data_len*4;str = (char *)realloc(str,sizeof(char)*(str_len+1));ptr = 0;temp_ptr = 0;for(i=0;i<data_len;i++){temp_ptr = sprintf(str+ptr,"%4d",data[i]);ptr += temp_ptr;}return 0;}static int ConverStrToData(int str_len,char *str,int &data_len,char *&data){/*功能:裝換位元據為ASCII碼輸出:data_len:轉換後的位元據長度data:轉換後的位元據緩衝,調用者需要釋放。輸入:str_len:字串資料長度str:字串資料*/

char temp_str[5];int i=0;char temp_data;int temp_data_len;data_len = str_len/4;data = (char *)realloc(data,sizeof(char)*data_len);temp_data_len = 0;while (i<str_len){memset(temp_str,0,5);memcpy(temp_str,str+i,4);temp_data = atoi(temp_str);memcpy(data+temp_data_len,&temp_data,sizeof(temp_data));temp_data_len++;i+=4;}if (temp_data_len != data_len){data_len = temp_data_len;printf("data len error,data_len:%d,str_data_len:%d",data_len,temp_data_len);}return 0;}demo:#include <stdio.h>#include <stdlib.h>#include <string.h>static int ConverDataToStr(int data_len,char *data,int &str_len,char *&str);static int ConverStrToData(int str_len,char *str,int &data_len,char *&data);int main(int argc, char* argv[]){char data[10];for (int i=0;i<10;i++){data[i] = i*100;if (i==8){data[i] = 255;}}  char *str;int ret,str_len;str = NULL;str_len = 0;str = (char *)malloc(1);ret = ConverDataToStr(10,(char *)data,str_len,str);printf("conver data to string ret = %d\n",ret);char *ret_data;int data_len;data_len = 0;ret_data = NULL;ret = ConverStrToData(str_len,str,data_len,ret_data);printf("conver string to data ret = %d\n",ret);for (i=0;i<data_len;i++){if((i!=0) && (i%20 == 0)) printf("\n");printf("data %d = %d ",i+1,data[i]);}free(str);str = NULL;free(ret_data);ret_data = NULL;return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.