int mysql_alter_add_table(eng_ctx_t* eng_ctx) { int ret = 0; MYSQL* mysql = get_server_mysql(eng_ctx->write_server); table_t *ptable = eng_ctx->table; table_schema_t *pschema = get_table_schema(ptable); ret = mysql_select_db(mysql, database); if (ret != 0) { return ret; } if (is_table_schema_full(pschema)) { return 0; } add_table_data(pschema); sql_gen(eng_ctx, ALTER_ADD); my_assert(eng_ctx->sql); const char* sql = eng_ctx->sql; ret = mysql_real_query(mysql, sql, strlen(sql)); if (0 == ret) { return 0; } else { log_error("%s", mysql_error(mysql)); return ret; } }
int mysql_update(eng_ctx_t* eng_ctx) { int ret = 0; MYSQL* mysql = get_server_mysql(eng_ctx->write_server); ret = mysql_select_db(mysql, database); if (ret != 0) { return ret; } sql_gen(eng_ctx, UPDATE); my_assert(eng_ctx->sql); const char* sql = eng_ctx->sql; ret = mysql_real_query(mysql, sql, strlen(sql)); if (0 == ret) { set_sql_write_time(eng_ctx); eng_ctx->prev_cmd = UPDATE; eng_ctx->stats.nupdate++; g_stat.nupdate = __sync_add_and_fetch(&g_stat.nupdate, 1); return 0; } else { log_debug("%s", mysql_error(mysql)); return ret; } }
void EngineBase::create_schema(const Schema &schema, bool ignore_errors) { SqlSchemaGenerator sql_gen(schema, get_dialect()); String sql; while (sql_gen.generate_next_statement(sql)) { auto_ptr<SqlCursor> cursor = get_conn()->new_cursor(); if (ignore_errors) { try { cursor->exec_direct(sql); } catch (const DBError &) { // ignore } } else cursor->exec_direct(sql); } }
int mysql_alter_drop_table(eng_ctx_t* eng_ctx) { int ret = 0; MYSQL* mysql = get_server_mysql(eng_ctx->write_server); int ndata = 0; table_t *ptable = eng_ctx->table; table_schema_t *pschema = get_table_schema(ptable); const table_data_t **table_datas = get_table_val_types(ptable, &ndata); if (ndata <= 0) return 0; ret = mysql_select_db(mysql, database); if (ret != 0) { return ret; } char *data_name = get_table_data_name(table_datas[ndata - 1]); if (strncmp(data_name, "col", 3) != 0) { return 0; } sql_gen(eng_ctx, ALTER_DROP); my_assert(eng_ctx->sql); const char* sql = eng_ctx->sql; ret = mysql_real_query(mysql, sql, strlen(sql)); if (0 == ret) { drop_table_data(pschema); return 0; } else { log_error("%s", mysql_error(mysql)); return ret; } }
int mysql_create_table(eng_ctx_t* eng_ctx) { int ret = 0; MYSQL* mysql = get_server_mysql(eng_ctx->write_server); ret = mysql_select_db(mysql, database); if (ret != 0) { return ret; } sql_gen(eng_ctx, CREATE); my_assert(eng_ctx->sql); const char* sql = eng_ctx->sql; ret = mysql_real_query(mysql, sql, strlen(sql)); if (0 == ret) { return 0; } else { log_error("%s", mysql_error(mysql)); return ret; } }
int mysql_select(eng_ctx_t* eng_ctx) { int ret = 0; MYSQL* wmysql; MYSQL* rmysql; MYSQL_RES* wmysql_result; MYSQL_RES* rmysql_result; MYSQL_ROW wrow; MYSQL_ROW rrow; int wnum_fields; int rnum_fields; int wnum_rows; int rnum_rows; size_t* wlengths; size_t* rlengths; wmysql = get_server_mysql(eng_ctx->write_server); ret = mysql_select_db(wmysql, database); if (ret != 0) { return ret; } sql_gen(eng_ctx, SELECT); my_assert(eng_ctx->sql); const char* sql = eng_ctx->sql; // get pre data value from write server ret = mysql_real_query(wmysql, sql, strlen(sql)); if (ret != 0) { log_debug("%s", mysql_error(wmysql)); return ret; } eng_ctx->stats.nselect++; g_stat.nselect = __sync_add_and_fetch(&g_stat.nselect, 1); wmysql_result = mysql_store_result(wmysql); wnum_fields = mysql_num_fields(wmysql_result); wnum_rows = mysql_num_rows(wmysql_result); wrow = mysql_fetch_row(wmysql_result); wlengths = mysql_fetch_lengths(wmysql_result); if (0 == wnum_rows) { mysql_free_result(wmysql_result); return 1; // this obj do not exist in mysql } // get data from other nodes for (int i = 0; i < eng_ctx->nread_server; i++) { rmysql = get_server_mysql(eng_ctx->read_servers[i]); ret = mysql_select_db(rmysql, database); if (ret != 0) { log_warn("can not connect to server:%s, db:%s", get_server_name(eng_ctx->read_servers[i]), database); continue; } ret = mysql_real_query(rmysql, sql, strlen(sql)); if (ret != 0) { log_debug("%s", mysql_error(rmysql)); continue; } set_sql_read_time(eng_ctx); eng_ctx->stats.nselect++; g_stat.nselect = __sync_add_and_fetch(&g_stat.nselect, 1); rmysql_result = mysql_store_result(rmysql); rnum_fields = mysql_num_fields(rmysql_result); rnum_rows = mysql_num_rows(rmysql_result); rrow = mysql_fetch_row(rmysql_result); rlengths = mysql_fetch_lengths(rmysql_result); if (rnum_rows > 0) { for (int j = 0; j < wnum_fields; j++) { if (strncmp(wrow[j], rrow[j], wlengths[j]) != 0) { #ifdef READABLE_DATA_LOG char* logbuf_offset = eng_ctx->data_inconsist_log_buf; logbuf_offset += sprintf(logbuf_offset, "Check ERROR !!!\n"); logbuf_offset += sprintf(logbuf_offset, "Command: %s ", cmdtype_toString(eng_ctx->prev_cmd)); logbuf_offset += sprintf(logbuf_offset, "Host: %15s ", get_server_name(eng_ctx->write_server)); logbuf_offset += sprintf(logbuf_offset, "Table: %s ", get_table_name(eng_ctx->table)); logbuf_offset += sprintf(logbuf_offset, "Key: %.*s ", 20, wrow[0]); logbuf_offset += sprintf(logbuf_offset, "Value: %.*s ...\n", 8, wrow[1]); logbuf_offset += sprintf(logbuf_offset, "Command: SELECT "); logbuf_offset += sprintf(logbuf_offset, "Host: %15s ", get_server_name(eng_ctx->read_servers[i])); logbuf_offset += sprintf(logbuf_offset, "Table: %s ", get_table_name(eng_ctx->table)); logbuf_offset += sprintf(logbuf_offset, "Key: %.*s ", 20, rrow[0]); logbuf_offset += sprintf(logbuf_offset, "Value: %.*s ...\n\n", 8, rrow[1]); *(logbuf_offset) = '\0'; fprintf(stderr, "%s", eng_ctx->data_inconsist_log_buf); #else /* log_error("Data inconsistent detected!"); log_error("Write server is %s, read server is %s", get_server_name(eng_ctx->write_server), get_server_name(eng_ctx->read_servers[i])); log_error("Last command is %s", cmdtype_toString(eng_ctx->prev_cmd)); log_error("There are %lld microseconds since last successful" "sql request", diff_sql_write_read_time(eng_ctx)); abort(); */ #endif g_stat.ncheck_fail = __sync_add_and_fetch(&g_stat.ncheck_fail, 1); abort(); } } } else { #ifdef READABLE_DATA_LOG char* logbuf_offset = eng_ctx->data_inconsist_log_buf; logbuf_offset += sprintf(logbuf_offset, "Check ERROR !!!\n"); logbuf_offset += sprintf(logbuf_offset, "Command: %s ", cmdtype_toString(eng_ctx->prev_cmd)); logbuf_offset += sprintf(logbuf_offset, "Host: %15s ", get_server_name(eng_ctx->write_server)); logbuf_offset += sprintf(logbuf_offset, "Table: %s ", get_table_name(eng_ctx->table)); logbuf_offset += sprintf(logbuf_offset, "Key: %.*s ", 20, wrow[0]); logbuf_offset += sprintf(logbuf_offset, "Value: %.*s ...\n", 8, wrow[1]); logbuf_offset += sprintf(logbuf_offset, "Command: SELECT "); logbuf_offset += sprintf(logbuf_offset, "Host: %15s ", get_server_name(eng_ctx->read_servers[i])); logbuf_offset += sprintf(logbuf_offset, "Table: %s ", get_table_name(eng_ctx->table)); logbuf_offset += sprintf(logbuf_offset, "Key: NULL "); logbuf_offset += sprintf(logbuf_offset, "Value: NULL \n\n"); *(logbuf_offset) = '\0'; fprintf(stderr, "%s", eng_ctx->data_inconsist_log_buf); #else /* log_error("Data inconsistent detected!"); log_error("Write server is %s, read server is %s", get_server_name(eng_ctx->write_server), get_server_name(eng_ctx->read_servers[i])); log_error("Last command is %s", cmdtype_toString(eng_ctx->prev_cmd)); log_error("There are %lld microseconds since last successful" "sql request", diff_sql_write_read_time(eng_ctx)); abort(); */ #endif g_stat.ncheck_fail = __sync_add_and_fetch(&g_stat.ncheck_fail, 1); abort(); } mysql_free_result(rmysql_result); } mysql_free_result(wmysql_result); return 0; }
int main(int argc, char* argv[]) { table_data_t* ptable_data; schema_t* pschema_key; schema_t* pschema_val; table_schema_t* ptable_schema; table_t* ptable; srand((int)(time(0))); schema_set_init(); table_set_init(); // loop begin pschema_key = schema_init(); pschema_val = schema_init(); ptable_data = table_data_init("col1", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("col2", VARCHAR, 10); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col3", VARCHAR, 11); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col4", VARCHAR, 12); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col5", VARCHAR, 13); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col6", VARCHAR, 14); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col7", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_schema = table_schema_init(pschema_key, pschema_val); schema_set_add(ptable_schema); // loop end // loop begin pschema_key = schema_init(); pschema_val = schema_init(); ptable_data = table_data_init("t2col1", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("t2col2", VARCHAR, 10); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col3", VARCHAR, 11); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col4", VARCHAR, 12); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col5", VARCHAR, 13); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col6", VARCHAR, 14); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col7", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("t2col8", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_schema = table_schema_init(pschema_key, pschema_val); schema_set_add(ptable_schema); // loop end // loop begin pschema_key = schema_init(); pschema_val = schema_init(); ptable_data = table_data_init("col1", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("col2", VARCHAR, 10); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col3", VARCHAR, 11); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col4", VARCHAR, 12); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col5", VARCHAR, 13); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col6", VARCHAR, 14); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col7", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_schema = table_schema_init(pschema_key, pschema_val); schema_set_add(ptable_schema); // loop end // loop begin pschema_key = schema_init(); pschema_val = schema_init(); ptable_data = table_data_init("col1", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("col2", VARCHAR, 10); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col3", VARCHAR, 11); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col4", VARCHAR, 12); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col5", VARCHAR, 13); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col6", VARCHAR, 14); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col7", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_schema = table_schema_init(pschema_key, pschema_val); schema_set_add(ptable_schema); // loop end // loop begin pschema_key = schema_init(); pschema_val = schema_init(); ptable_data = table_data_init("col1", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("col2", BIGINT, 0); schema_add(pschema_key, ptable_data); ptable_data = table_data_init("col3", VARCHAR, 11); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col4", VARCHAR, 12); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col5", VARCHAR, 13); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col6", VARCHAR, 14); schema_add(pschema_val, ptable_data); ptable_data = table_data_init("col7", VARCHAR, 15); schema_add(pschema_val, ptable_data); ptable_schema = table_schema_init(pschema_key, pschema_val); schema_set_add(ptable_schema); // loop end ptable = table_init("test_mysql_cmd", ptable_schema); table_set_add(ptable); char* sql = my_malloc((size_t)1024000); memset(sql, 0, sizeof(sql)); eng_ctx_t* eng_ctx = my_malloc(sizeof(eng_ctx_t)); memset(eng_ctx, 0, sizeof(eng_ctx_t)); eng_ctx->sql = sql; eng_ctx->table = ptable; eng_ctx->table_schema = ptable_schema; sql_gen(eng_ctx, INSERT); sql_gen(eng_ctx, UPDATE); sql_gen(eng_ctx, DELETE); sql_gen(eng_ctx, SELECT); sql_gen(eng_ctx, CREATE); my_free(sql); my_free(eng_ctx); schema_set_destroy(); table_set_destroy(); return 0; }