forked from dimarik/mysqlslave
-
Notifications
You must be signed in to change notification settings - Fork 0
shepik/mysqlslave
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
You can configure replication for your any daemon (this daemon has to use MYSQL database, version not below 5.1, and row-based replication has to be configured) with class CLogParser. Your daemon has to be child of CLogParser and has to define three virtual functions:
int on_insert(const mysql::CTable& tbl, const mysql::CTable::TRows& rows);
int on_update(const mysql::CTable& tbl, const mysql::CTable::TRows& rows, const mysql::CTable::TRows& old_rows);
int on_delete(const mysql::CTable& tbl, const mysql::CTable::TRows& rows);
tbl -- changed table
rows -- new rows of the table (in on_delete "rows" -- deleted rows)
old_rows -- old rows, which were changed by UPDATE-query
Class mysql::CTable::TRows is std::list<mysql::CRow>. These operators are defined for class CRow:
const CValue& operator[](const std::string& name) const;
const CValue& operator[](size_t i) const;
In order to get value from CValue in appropriate format, these functions are defined:
typedef uint16_t TYear;
typedef struct
{
TYear y;
uint8_t m;
uint8_t d;
} TDate;
typedef struct
{
uint8_t h;
uint8_t m;
uint8_t s;
} TTime;
typedef struct
{
TDate date;
TTime time;
} TDateTime;
int8_t as_int8() const;
int16_t as_int16() const;
int32_t as_int32() const;
int64_t as_int64() const;
uint8_t as_uint8() const;
uint16_t as_uint16() const;
uint32_t as_uint32() const;
uint64_t as_uint64() const;
double as_double() const;
float as_float() const;
bool as_boolean() const;
time_t as_timestamp() const;
TDateTime as_datetime() const;
TDate as_date() const;
TTime as_time() const;
TYear as_year() const;
std::string as_string() const;
const char* as_string(size_t* length) const;
void as_string(std::string& dst) const;
uint64_t as_enum() const;
uint64_t as_set() const;
In order to select tables for which you want to catch changes, you should use the function:
void watch(const std::string& db_name, const std::string& table_name);
You need special thread for replication. It has to contain the loop:
while (dispatch())
{
try
{
dispatch_events();
}
catch (const std::exception& e)
{
sleep(1);
}
}
You have to use stop_event_loop() for interrupt of replication loop.
Code example:
class my_class : public mysql::CLogParser
{
...
pthread_t th_repl;
...
~my_class()
{
...
stop_event_loop();
::pthread_kill(th_repl, SIGTERM);
...
}
...
void replication_thread_proc()
{
while (dispatch())
{
try
{
dispatch_events();
}
catch (const std::exception& e)
{
fprintf(stderr, "catch exception: %s\n", e.what());
sleep(1);
}
}
}
void connect_mysql_repl(const char* host, const char* user, const char* passwd, int port, int slave_id)
{
set_connection_params(host, slave_id, user, passwd, port);
watch("db1", "db1_table1");
watch("db1", "db1_table2");
watch("db2", "db2_table1");
prepare();
}
int on_insert(const mysql::CTable& tbl, const mysql::CTable::TRows& rows)
{
if (strcasecmp(tbl.get_table_name(), "db1_table1") == 0)
{
for (mysql::CTable::TRows::const_iterator it = rows.begin(); it != rows.end(); ++it)
{
fprintf(stdout, "%u\n", *it["id"].as_uint32());
}
}
return 0;
}
int on_update(const mysql::CTable& tbl, const mysql::CTable::TRows& rows, const mysql::CTable::TRows& old_rows)
{
return 0;
}
int on_delete(const mysql::CTable& tbl, const mysql::CTable::TRows& rows)
{
return 0;
}
...
};
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published
Languages
- C++ 100.0%