static int lua_proto_get_eof_packet (lua_State *L) { size_t packet_len; const char *packet_str = luaL_checklstring(L, 1, &packet_len); network_mysqld_eof_packet_t *eof_packet; network_packet packet; GString s; int err = 0; s.str = (char *)packet_str; s.len = packet_len; packet.data = &s; packet.offset = 0; eof_packet = network_mysqld_eof_packet_new(); err = err || network_mysqld_proto_get_eof_packet(&packet, eof_packet); if (err) { network_mysqld_eof_packet_free(eof_packet); luaL_error(L, "%s: network_mysqld_proto_get_eof_packet() failed", G_STRLOC); return 0; } lua_newtable(L); LUA_EXPORT_INT(eof_packet, server_status); LUA_EXPORT_INT(eof_packet, warnings); network_mysqld_eof_packet_free(eof_packet); return 1; }
void t_eof_packet_append(void) { network_mysqld_eof_packet_t *eof_packet; network_packet *packet; eof_packet = network_mysqld_eof_packet_new(); packet = network_packet_new(); packet->data = g_string_new(NULL); /* check if a empty ok-packet is encoded correctly */ g_assert_cmpint(0, ==, network_mysqld_proto_append_eof_packet(packet->data, eof_packet)); g_assert_cmpint(5, ==, packet->data->len); g_assert_cmpint(TRUE, ==, g_memeq(S(packet->data), C("\xfe\x00\x00\x00\x00"))); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(packet, eof_packet)); /* check if encoding and decoding works */ eof_packet->warnings = 1; eof_packet->server_status = 2; g_string_truncate(packet->data, 0); packet->offset = 0; g_assert_cmpint(0, ==, network_mysqld_proto_append_eof_packet(packet->data, eof_packet)); g_assert_cmpint(5, ==, packet->data->len); g_assert_cmpint(TRUE, ==, g_memeq(S(packet->data), C("\xfe\x01\x00\x02\x00"))); network_mysqld_eof_packet_free(eof_packet); eof_packet = network_mysqld_eof_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(packet, eof_packet)); g_assert_cmpint(1, ==, eof_packet->warnings); g_assert_cmpint(2, ==, eof_packet->server_status); network_mysqld_eof_packet_free(eof_packet); /* check if too-short packet is denied */ eof_packet = network_mysqld_eof_packet_new(); g_string_truncate(packet->data, 0); packet->offset = 0; g_assert_cmpint(-1, ==, network_mysqld_proto_get_eof_packet(packet, eof_packet)); network_mysqld_eof_packet_free(eof_packet); g_string_free(packet->data, TRUE); network_packet_free(packet); }
void t_eof_packet_new(void) { network_mysqld_eof_packet_t *eof_packet; eof_packet = network_mysqld_eof_packet_new(); g_assert(eof_packet); network_mysqld_eof_packet_free(eof_packet); }
static int lua_proto_append_eof_packet (lua_State *L) { GString *packet; network_mysqld_eof_packet_t *eof_packet; luaL_checktype(L, 1, LUA_TTABLE); eof_packet = network_mysqld_eof_packet_new(); LUA_IMPORT_INT(eof_packet, server_status); LUA_IMPORT_INT(eof_packet, warnings); packet = g_string_new(NULL); network_mysqld_proto_append_eof_packet(packet, eof_packet); network_mysqld_eof_packet_free(eof_packet); lua_pushlstring(L, S(packet)); g_string_free(packet, TRUE); return 1; }
/** * test if we parse all the fields of a COM_STMT_PREPARE-ok response correctly */ static void t_com_stmt_prepare_ok_from_packet(void) { network_mysqld_stmt_prepare_ok_packet_t *cmd; network_mysqld_eof_packet_t *eof; network_mysqld_proto_fielddef_t *coldef; /* a response for the COM_STMT_PREPARE command * * the OK part with stmt-id and so on is in the first packet. The others are * the field-defs, a EOF, the param-defs, and the last EOF */ strings packets[] = { { C("\x0c\x00\x00\x01\x00\x01\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00") }, /* the PREPARE OK packet */ { C("\x17\x00\x00\x02\x03\x64\x65\x66\x00\x00\x00\x01\x3f\x00\x0c\x3f\x00\x00\x00\x00\x00\xfd\x80\x00\x00\x00\x00") }, /* column-def: param 1 */ { C("\x17\x00\x00\x03\x03\x64\x65\x66\x00\x00\x00\x01\x3f\x00\x0c\x3f\x00\x00\x00\x00\x00\xfd\x80\x00\x00\x00\x00") }, /* column-def: param 2 */ { C("\x05\x00\x00\x04\xfe\x00\x00\x02\x00") }, /* the seperator */ { C("\x1a\x00\x00\x05\x03\x64\x65\x66\x00\x00\x00\x04\x63\x6f\x6c\x31\x00\x0c\x3f\x00\x00\x00\x00\x00\xfd\x80\x00\x1f\x00\x00") }, /* column-def: result-col 1 */ { C("\x05\x00\x00\x06\xfe\x00\x00\x02\x00") } /* the terminator */ }; network_packet packet; packet.data = g_string_new_len(packets[0].s, packets[0].s_len); packet.offset = 0; cmd = network_mysqld_stmt_prepare_ok_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_stmt_prepare_ok_packet(&packet, cmd)); g_assert_cmpint(1, ==, cmd->stmt_id); g_assert_cmpint(1, ==, cmd->num_columns); g_assert_cmpint(2, ==, cmd->num_params); g_assert_cmpint(0, ==, cmd->warnings); network_mysqld_stmt_prepare_ok_packet_free(cmd); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet.data = g_string_new_len(packets[1].s, packets[1].s_len); packet.offset = 0; coldef = network_mysqld_proto_fielddef_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_fielddef(&packet, coldef, CLIENT_PROTOCOL_41)); network_mysqld_proto_fielddef_free(coldef); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet.data = g_string_new_len(packets[2].s, packets[2].s_len); packet.offset = 0; coldef = network_mysqld_proto_fielddef_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_fielddef(&packet, coldef, CLIENT_PROTOCOL_41)); network_mysqld_proto_fielddef_free(coldef); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet.data = g_string_new_len(packets[3].s, packets[3].s_len); packet.offset = 0; eof = network_mysqld_eof_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(&packet, eof)); network_mysqld_eof_packet_free(eof); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet.data = g_string_new_len(packets[4].s, packets[4].s_len); packet.offset = 0; coldef = network_mysqld_proto_fielddef_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_fielddef(&packet, coldef, CLIENT_PROTOCOL_41)); network_mysqld_proto_fielddef_free(coldef); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet.data = g_string_new_len(packets[5].s, packets[5].s_len); packet.offset = 0; eof = network_mysqld_eof_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(&packet, eof)); network_mysqld_eof_packet_free(eof); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); }
/** * test if we parse all the fields of a COM_STMT_EXECUTE result correctly */ static void t_com_stmt_execute_result_from_packet(void) { network_mysqld_eof_packet_t *eof; network_mysqld_proto_fielddefs_t *coldefs; network_mysqld_proto_fielddef_t *coldef; network_mysqld_resultset_row_t *row; network_mysqld_type_t *field; GString *data; guint64 field_count; int packet_id = 0; /* response for a * SELECT ? AS col2, CONCAT(?, ?) AS col1 * with * 1: NULL * 2: STRING bar * 3: STRING foo */ strings packets[] = { { C("\x01\x00\x00\x01\x02") }, { C("\x1a\x00\x00\x02\x03\x64\x65\x66\x00\x00\x00\x04\x63\x6f\x6c\x32\x00\x0c\x3f\x00\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00") }, { C("\x1a\x00\x00\x03\x03\x64\x65\x66\x00\x00\x00\x04\x63\x6f\x6c\x31\x00\x0c\x08\x00\x06\x00\x00\x00\xfd\x00\x00\x1f\x00\x00") }, { C("\x05\x00\x00\x04\xfe\x00\x00\x02\x00") }, { C("\x09\x00\x00\x05\x00\x04\x06" "barfoo") }, { C("\x05\x00\x00\x06\xfe\x00\x00\x02\x00") } }; network_packet packet; /* the field-count */ packet_id = 0; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_lenenc_int(&packet, &field_count)); g_assert_cmpint(2, ==, field_count); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); /* the colum defs */ packet_id++; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; coldefs = network_mysqld_proto_fielddefs_new(); coldef = network_mysqld_proto_fielddef_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_fielddef(&packet, coldef, CLIENT_PROTOCOL_41)); g_ptr_array_add(coldefs, coldef); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); /* the string column */ packet_id++; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; coldef = network_mysqld_proto_fielddef_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_fielddef(&packet, coldef, CLIENT_PROTOCOL_41)); g_ptr_array_add(coldefs, coldef); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); /* the EOF */ packet_id++; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; eof = network_mysqld_eof_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(&packet, eof)); network_mysqld_eof_packet_free(eof); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); /* the row */ packet_id++; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; row = network_mysqld_resultset_row_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_binary_row(&packet, coldefs, row)); /* check if the 1st field is NULL */ field = g_ptr_array_index(row, 0); g_assert(field); g_assert_cmpint(TRUE, ==, field->is_null); /* check if the 2nd field is "barfoo" */ field = g_ptr_array_index(row, 1); g_assert(field); g_assert_cmpint(MYSQL_TYPE_VAR_STRING, ==, field->type); g_assert_cmpint(FALSE, ==, field->is_null); /* FIXME: find a way to test this without touching the internal representation */ data = field->data; g_assert(data); g_assert_cmpint(data->len, ==, 6); g_assert_cmpstr(data->str, ==, "barfoo"); network_mysqld_resultset_row_free(row); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); packet_id++; packet.data = g_string_new_len(packets[packet_id].s, packets[packet_id].s_len); packet.offset = 0; eof = network_mysqld_eof_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_eof_packet(&packet, eof)); network_mysqld_eof_packet_free(eof); g_assert_cmpint(packet.offset, ==, packet.data->len); /* is everything parsed */ g_string_free(packet.data, TRUE); network_mysqld_proto_fielddefs_free(coldefs); }