示例#1
0
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;
    }
}
示例#2
0
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;
    }
}
示例#3
0
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);
    }
}
示例#4
0
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;
    }
}
示例#5
0
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;
    }
}
示例#6
0
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;
}
示例#7
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;
}