Fixed bug on memory allocation for string types and fixed linker problem on example main program

This commit is contained in:
Jan Lindström
2013-07-02 07:09:44 +03:00
parent b51232c518
commit 471b3cbaf2
8 changed files with 37 additions and 19 deletions

View File

@ -12,7 +12,7 @@ IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
ELSE(BUILD_TYPE) ELSE(BUILD_TYPE)
SET(CMAKE_INSTALL_CONFIG_NAME "") SET(CMAKE_INSTALL_CONFIG_NAME "Debug")
ENDIF(BUILD_TYPE) ENDIF(BUILD_TYPE)
MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)

View File

@ -48,10 +48,10 @@ namespace table_replication_listener {
/* Table Consistency data structure */ /* Table Consistency data structure */
typedef struct { typedef struct {
std::string database_dot_table; /* Fully qualified db.table name, char* database_dot_table; /* Fully qualified db.table name,
primary key. */ primary key. */
boost::uint32_t server_id; /* Server id */ boost::uint32_t server_id; /* Server id */
std::string gtid; /* Global transaction id */ char* gtid; /* Global transaction id */
boost::uint64_t binlog_pos; /* Binlog position */ boost::uint64_t binlog_pos; /* Binlog position */
bool gtid_known; /* Is gtid known ? */ bool gtid_known; /* Is gtid known ? */
} table_listener_consistency_t; } table_listener_consistency_t;
@ -75,7 +75,8 @@ boost::mutex table_replication_mutex; /* This mutex is used protect
/***********************************************************************//** /***********************************************************************//**
This is the function that is executed by replication listeners. This is the function that is executed by replication listeners.
At startup it will try to connect the server and start listening At startup it will try to connect the server and start listening
the actual replication stream. the actual replication stream. Stream is listened and events
are handled until a shutdown message is send from the user.
@return Pointer to error message. */ @return Pointer to error message. */
void* tb_replication_listener_reader( void* tb_replication_listener_reader(
/*=================================*/ /*=================================*/
@ -109,9 +110,11 @@ void* tb_replication_listener_reader(
Binary_log_event *event; Binary_log_event *event;
// While we have events
while (true) { while (true) {
Log_event_header *lheader; Log_event_header *lheader;
// Wait for the next event
int result = binlog.wait_for_next_event(&event); int result = binlog.wait_for_next_event(&event);
if (result == ERR_EOF) if (result == ERR_EOF)
@ -132,10 +135,15 @@ void* tb_replication_listener_reader(
<< event->get_event_type() << event->get_event_type()
<< " txt " << get_event_type_str(event->get_event_type()) << " txt " << get_event_type_str(event->get_event_type())
<< " query " << qevent->query << " db " << qevent->db_name << " query " << qevent->query << " db " << qevent->db_name
<< " gtid " << gtid.get_string()
<< std::endl; << std::endl;
break; break;
} }
/*
Event is global transaction identifier. We need to store
value of this and handle actual state later.
*/
case GTID_EVENT_MARIADB: case GTID_EVENT_MARIADB:
case GTID_EVENT_MYSQL: case GTID_EVENT_MYSQL:
{ {
@ -145,15 +153,17 @@ void* tb_replication_listener_reader(
gtid_known = true; gtid_known = true;
gtid = Gtid(gevent->domain_id, gevent->server_id, gevent->sequence_number); gtid = Gtid(gevent->domain_id, gevent->server_id, gevent->sequence_number);
} else { } else {
// TODO MYSQL
std::cout << "Thread: " << id << " server_id " << lheader->server_id
<< " position " << lheader->next_position << " : Found event of type "
<< event->get_event_type()
<< " txt " << get_event_type_str(event->get_event_type())
<< " GTID " << gevent->domain_id << "-" << gevent->server_id << "-" << gevent->sequence_number
<< std::endl;
} }
std::cout << "Thread: " << id << " server_id " << lheader->server_id
<< " position " << lheader->next_position << " : Found event of type "
<< event->get_event_type()
<< " txt " << get_event_type_str(event->get_event_type())
<< " gtid " << gtid.get_string()
<< std::endl;
break; break;
} }
@ -209,11 +219,13 @@ void* tb_replication_listener_reader(
if(not_found) { if(not_found) {
// Consistency for this table and server not found, insert a record // Consistency for this table and server not found, insert a record
table_listener_consistency_t* tb_c = (table_listener_consistency_t*) malloc(sizeof(table_listener_consistency_t)); table_listener_consistency_t* tb_c = (table_listener_consistency_t*) malloc(sizeof(table_listener_consistency_t));
tb_c->database_dot_table = database_dot_table; tb_c->database_dot_table = (char *)malloc(database_dot_table.size()+1);
strcpy(tb_c->database_dot_table, database_dot_table.c_str());
tb_c->server_id = lheader->server_id; tb_c->server_id = lheader->server_id;
tb_c->binlog_pos = lheader->next_position; tb_c->binlog_pos = lheader->next_position;
tb_c->gtid_known = gtid_known; tb_c->gtid_known = gtid_known;
tb_c->gtid = gtid.get_string(); tb_c->gtid = (char *)malloc(gtid.get_string().size()+1);
strcpy(tb_c->gtid, gtid.get_string().c_str());
table_consistency_map.insert(pair<std::string, table_listener_consistency_t*>(database_dot_table,tb_c)); table_consistency_map.insert(pair<std::string, table_listener_consistency_t*>(database_dot_table,tb_c));
} else { } else {
@ -221,7 +233,9 @@ void* tb_replication_listener_reader(
// consistency values // consistency values
tc->binlog_pos = lheader->next_position; tc->binlog_pos = lheader->next_position;
tc->gtid = gtid.get_string(); free(tc->gtid);
tc->gtid = (char *)malloc(gtid.get_string().size()+1);
strcpy(tc->gtid, gtid.get_string().c_str());
tc->gtid_known = gtid_known; tc->gtid_known = gtid_known;
} }
@ -232,10 +246,12 @@ void* tb_replication_listener_reader(
<< " txt " << get_event_type_str(event->get_event_type()) << " txt " << get_event_type_str(event->get_event_type())
<< " table " << revent->table_id << " table " << revent->table_id
<< " tb " << database_dot_table << " tb " << database_dot_table
<< " gtid " << gtid.get_string()
<< std::endl; << std::endl;
break; break;
} }
// Default event handler, do nothing
default: default:
break; break;
} // switch } // switch

View File

@ -23,7 +23,7 @@ CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4
//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or //Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. // CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING= CMAKE_BUILD_TYPE:STRING=Debug
//Enable/Disable color output during build. //Enable/Disable color output during build.
CMAKE_COLOR_MAKEFILE:BOOL=ON CMAKE_COLOR_MAKEFILE:BOOL=ON

View File

@ -2,7 +2,7 @@
# Generated by "Unix Makefiles" Generator, CMake Version 2.8 # Generated by "Unix Makefiles" Generator, CMake Version 2.8
# compile C with /usr/bin/gcc # compile C with /usr/bin/gcc
C_FLAGS = -I/usr/local/include -I/home/jan/skysql/skygateway/skygateway/utils C_FLAGS = -g -I/usr/local/include -I/home/jan/skysql/skygateway/skygateway/utils
C_DEFINES = C_DEFINES =

View File

@ -1 +1 @@
/usr/bin/gcc CMakeFiles/Example.dir/Example.c.o -o Example -rdynamic -Wl,-Bstatic -ltable_replication_consistency -Wl,-Bdynamic -lreplication -lboost_system -lpthread /usr/bin/gcc -g CMakeFiles/Example.dir/Example.c.o -o Example -rdynamic -Wl,-Bstatic -ltable_replication_consistency -Wl,-Bdynamic -lreplication -lboost_system -lpthread

View File

@ -3,6 +3,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
@ -24,7 +25,8 @@ int main(int argc, char** argv)
if ( strncmp("mysql://", uri, 8) == 0) { if ( strncmp("mysql://", uri, 8) == 0) {
mrl[i].server_url = uri; mrl[k].server_url = malloc(strlen(uri)+1);
strcpy(mrl[k].server_url, uri);
k++; k++;
if (argc == 1) { if (argc == 1) {

View File

@ -12,7 +12,7 @@ IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
ELSE(BUILD_TYPE) ELSE(BUILD_TYPE)
SET(CMAKE_INSTALL_CONFIG_NAME "") SET(CMAKE_INSTALL_CONFIG_NAME "Debug")
ENDIF(BUILD_TYPE) ENDIF(BUILD_TYPE)
MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)