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; }
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); }
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; }
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)); } }
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;