Beispiel #1
0
static SLVAL
sl_mysql_use(sl_vm_t* vm, SLVAL self, SLVAL db)
{
    mysql_t* mysql = get_mysql(vm, self);
    mysql_select_db(&mysql->mysql, sl_to_cstr(vm, sl_expect(vm, db, vm->lib.String)));
    sl_mysql_check_error(vm, &mysql->mysql);
    return vm->lib._true;
}
Beispiel #2
0
static SLVAL
sl_mysql_escape(sl_vm_t* vm, SLVAL self, SLVAL str)
{
    mysql_t* mysql = get_mysql(vm, self);
    sl_string_t* s = sl_get_string(vm, str);
    char* esc = sl_alloc(vm->arena, s->buff_len * 2 + 1);
    size_t esc_len = mysql_real_escape_string(&mysql->mysql, esc, (char*)s->buff, s->buff_len);
    return sl_make_string(vm, (uint8_t*)esc, esc_len);
}
Beispiel #3
0
static SLVAL
sl_mysql_prepare(sl_vm_t* vm, SLVAL self, SLVAL query)
{
    mysql_t* mysql = get_mysql(vm, self);
    SLVAL stmtv = sl_allocate(vm, vm->store[cMySQL_Statement]);
    mysql_stmt_t* stmt = sl_data_get_ptr(vm, &mysql_stmt_data_type, stmtv);
    stmt->mysql = mysql;
    if(!(stmt->stmt = mysql_stmt_init(&mysql->mysql))) {
        sl_mysql_check_error(vm, &mysql->mysql);
    }

    sl_string_t* str = sl_get_string(vm, query);
    if(mysql_stmt_prepare(stmt->stmt, (char*)str->buff, str->buff_len)) {
        sl_mysql_stmt_check_error(vm, stmt->stmt);
    }

    return stmtv;
}
Beispiel #4
0
static SLVAL
sl_mysql_raw_query(sl_vm_t* vm, SLVAL self, SLVAL query)
{
    mysql_t* mysql = get_mysql(vm, self);
    sl_string_t* str = sl_get_string(vm, query);

    if(mysql_real_query(&mysql->mysql, (char*)str->buff, str->buff_len)) {
        sl_mysql_check_error(vm, &mysql->mysql);
    }

    MYSQL_RES* result;
    if((result = mysql_store_result(&mysql->mysql))) {
        /* do shit */
        int ncolumns = mysql_num_fields(result);
        int nrows = mysql_num_rows(result);
        SLVAL* rows = sl_alloc(vm->arena, sizeof(SLVAL) * nrows);
        MYSQL_FIELD* fields = mysql_fetch_fields(result);
        for(int i = 0; i < nrows; i++) {
            SLVAL* cells = sl_alloc(vm->arena, sizeof(SLVAL) * ncolumns * 2);
            MYSQL_ROW row = mysql_fetch_row(result);
            size_t* lengths = mysql_fetch_lengths(result);
            for(int j = 0; j < ncolumns; j++) {
                cells[j * 2] = sl_make_cstring(vm, fields[j].name);
                if(row[j]) {
                    cells[j * 2 + 1] = sl_make_string(vm, (uint8_t*)row[j], lengths[j]);
                } else {
                    cells[j * 2 + 1] = vm->lib.nil;
                }
            }
            rows[i] = sl_make_dict(vm, ncolumns, cells);
        }
        mysql_free_result(result);
        return sl_make_array(vm, nrows, rows);
    } else {
        if(mysql_field_count(&mysql->mysql) != 0) {
            sl_mysql_check_error(vm, &mysql->mysql);
        }
        return sl_make_int(vm, mysql_affected_rows(&mysql->mysql));
    }
}
Beispiel #5
0
static SLVAL
sl_mysql_insert_id(sl_vm_t* vm, SLVAL self)
{
    mysql_t* mysql = get_mysql(vm, self);
    return sl_make_int(vm, mysql_insert_id(&mysql->mysql));
}
END_TEST_DATA_CLASS

TEST_MODULE(mysql_administrator_catalog, "MySQL Administrator test suite");

//----------------------------------------------------------------------------------------------------------------------

/**
  Test for bug http://bugs.mysql.com/bug.php?id=19824
  Using a connection with non-existing default schema
*/

TEST_FUNCTION(15)
{
  connection= test_group_singleton.get_connection();
  ensure("Server connection", connection != NULL);
  MYSQL* mysql= connection->get_mysql();

  MYX_USER_CONNECTION *uc= new MYX_USER_CONNECTION;
  uc->connection_name= "test_connection_19824";
  uc->username= const_cast<char *>(test_params->get_user_name());
  uc->password= const_cast<char *>(test_params->get_password());
  uc->hostname= const_cast<char *>(test_params->get_host_name());
  uc->port= test_params->get_port();
  uc->schema= "test_19824_nonexistent_schema";
  uc->advanced_options_num= 0;
  uc->advanced_options= NULL;
  uc->storage_path= NULL;
  uc->notes= NULL;
  uc->connection_type= MYX_MYSQL_CONN;
  uc->storage_type= MYX_HISTORY_USER_CONNECTION;