示例#1
0
/**
 * test if we decode all valid types from EXECUTE stmt 
 */
static void t_com_stmt_execute_from_packet_invalid(void) {
	network_mysqld_stmt_execute_packet_t *cmd;
	const char raw_packet[] = 
		"\x12\x00\x00\x00"
		"\x17" /* COM_STMT_EXECUTE */
		"\x01\x00\x00\x00" /* stmt-id */
		"\x00" /* flags */
		"\x01\x00\x00\x00" /* iteration count */
		"\x00"
		"\x01"
		"\x0f\x00"
		"\x03\x66\x6f\x6f";

	network_packet packet;
	network_mysqld_type_t *param;
	int param_ndx = 0;

	packet.data = g_string_new_len(C(raw_packet));
	packet.offset = 0;

#define EXPECTED_NUM_PARAMS 1
	cmd = network_mysqld_stmt_execute_packet_new();
	g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet));
	g_assert_cmpint(0, !=, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, EXPECTED_NUM_PARAMS));
#undef EXPECTED_NUM_PARAMS

	network_mysqld_stmt_execute_packet_free(cmd);
}
示例#2
0
static void t_com_stmt_execute_new(void) {
	network_mysqld_stmt_execute_packet_t *cmd;

	cmd = network_mysqld_stmt_execute_packet_new();
	g_assert(cmd);

	network_mysqld_stmt_execute_packet_free(cmd);
}
示例#3
0
/**
 * if there are no parameters, we don't have any nul-flags to send
 */
static void t_com_stmt_execute_from_packet_no_params(void) {
	network_mysqld_stmt_execute_packet_t *cmd;
	const char raw_packet[] = 
		"\x0a\x00\x00\x00"
		"\x17" /* COM_STMT_EXECUTE */
		"\x01\x00\x00\x00" /* stmt-id */
		"\x00" /* flags */
		"\x01\x00\x00\x00" /* iteration count */
		;

	network_packet packet;

	packet.data = g_string_new_len(C(raw_packet));
	packet.offset = 0;

	cmd = network_mysqld_stmt_execute_packet_new();
	g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet));
	g_assert_cmpint(0, ==, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, 0));
	g_assert_cmpint(1, ==, cmd->stmt_id);
	g_assert_cmpint(0, ==, cmd->flags);
	g_assert_cmpint(1, ==, cmd->iteration_count);

	network_mysqld_stmt_execute_packet_free(cmd);
}
/**
 * get the stmt-id from the com-stmt-execute packet 
 */
static int lua_proto_get_stmt_execute_packet (lua_State *L) {
	size_t packet_len;
	const char *packet_str = luaL_checklstring(L, 1, &packet_len);
	int param_count = luaL_checkint(L, 2);
	network_mysqld_stmt_execute_packet_t *cmd;
	network_packet packet;
	GString s;
	int err = 0;

	s.str = (char *)packet_str;
	s.len = packet_len;

	packet.data = &s;
	packet.offset = 0;

	cmd = network_mysqld_stmt_execute_packet_new();

	err = err || network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, param_count);
	if (err) {
		network_mysqld_stmt_execute_packet_free(cmd);

		luaL_error(L, "%s: network_mysqld_proto_get_stmt_execute_packet() failed", G_STRLOC);
		return 0;
	}

	lua_newtable(L);

	LUA_EXPORT_INT(cmd, stmt_id);
	LUA_EXPORT_INT(cmd, flags);
	LUA_EXPORT_INT(cmd, iteration_count);
	LUA_EXPORT_BOOL(cmd, new_params_bound);

	if (cmd->new_params_bound) {
		guint i;

		lua_newtable(L);
		for (i = 0; i < cmd->params->len; i++) {
			network_mysqld_type_t *param = g_ptr_array_index(cmd->params, i);

			lua_newtable(L);
			lua_pushnumber(L, param->type);
			lua_setfield(L, -2, "type");

			if (param->is_null) {
				lua_pushnil(L);
			} else {
				const char *const_s;
				char *_s;
				gsize s_len;
				guint64 _i;
				gboolean is_unsigned;
				double d;

				switch (param->type) {
				case MYSQL_TYPE_BLOB:
				case MYSQL_TYPE_MEDIUM_BLOB:
				case MYSQL_TYPE_LONG_BLOB:
				case MYSQL_TYPE_STRING:
				case MYSQL_TYPE_VARCHAR:
				case MYSQL_TYPE_VAR_STRING:
					if (0 != network_mysqld_type_get_string_const(param, &const_s, &s_len)) {
						return luaL_error(L, "%s: _get_string_const() failed for type = %d",
								G_STRLOC,
								param->type);
					}

					lua_pushlstring(L, const_s, s_len);
					break;
				case MYSQL_TYPE_TINY:
				case MYSQL_TYPE_SHORT:
				case MYSQL_TYPE_LONG:
				case MYSQL_TYPE_LONGLONG:
					if (0 != network_mysqld_type_get_int(param, &_i, &is_unsigned)) {
						return luaL_error(L, "%s: _get_int() failed for type = %d",
								G_STRLOC,
								param->type);
					}

					lua_pushinteger(L, _i);
					break;
				case MYSQL_TYPE_DOUBLE:
				case MYSQL_TYPE_FLOAT:
					if (0 != network_mysqld_type_get_double(param, &d)) {
						return luaL_error(L, "%s: _get_double() failed for type = %d",
								G_STRLOC,
								param->type);
					}

					lua_pushnumber(L, d);
					break;
				case MYSQL_TYPE_DATETIME:
				case MYSQL_TYPE_TIMESTAMP:
				case MYSQL_TYPE_DATE:
				case MYSQL_TYPE_TIME:
					_s = NULL;
					s_len = 0;

					if (0 != network_mysqld_type_get_string(param, &_s, &s_len)) {
						return luaL_error(L, "%s: _get_string() failed for type = %d",
								G_STRLOC,
								param->type);
					}

					lua_pushlstring(L, _s, s_len);

					if (NULL != _s) g_free(_s);
					break;
				default:
					luaL_error(L, "%s: can't decode type %d yet",
							G_STRLOC,
							param->type); /* we don't have that value yet */
					break;
				}
			}
			lua_setfield(L, -2, "value");
			lua_rawseti(L, -2, i + 1);
		}
		lua_setfield(L, -2, "params"); 
	}

	network_mysqld_stmt_execute_packet_free(cmd);

	return 1;
}
示例#5
0
/**
 * test if we decode all valid types from EXECUTE stmt 
 */
static void t_com_stmt_execute_from_packet(void) {
	network_mysqld_stmt_execute_packet_t *cmd;
	const char raw_packet[] = 
		"\x7a\x00\x00\x00"
		"\x17" /* COM_STMT_EXECUTE */
		"\x01\x00\x00\x00" /* stmt-id */
		"\x00" /* flags */
		"\x01\x00\x00\x00" /* iteration count */
		"\x03\x00" /* nul-flags */
		"\x01" /* yeah, we have parameters */
		"\xfe\x00\x06\x00\xfe\x00\x08\x00\x08\x80\x03\x00\x02\x00\x01\x00\x05\x00\x04\x00\x0a\x00\x0c\x00\x07\x00\x0b\x00" /* param-defs */
		"\x03\x66\x6f\x6f" /* the string */
		"\x01\x00\x00\x00\x00\x00\x00\x00" /* int64 */
		"\x01\x00\x00\x00\x00\x00\x00\x00" /* int64 (unsigned) */
		"\x01\x00\x00\x00" /* int32 */
		"\x01\x00" /* int16 */
		"\x01" /* int8 */
		"\x66\x66\x66\x66\x66\x66\x24\x40"
		"\x33\x33\x23\x41"
		"\x04\xda\x07\x0a\x11"
		"\x0b\xda\x07\x0a\x11\x13\x1b\x1e\x01\x00\x00\x00"
		"\x0b\xda\x07\x0a\x11\x13\x1b\x1e\x01\x00\x00\x00"
		"\x0c\x01\x78\x00\x00\x00\x13\x1b\x1e\x01\x00\x00\x00";

	network_packet packet;
	network_mysqld_type_t *param;
	int param_ndx = 0;

	packet.data = g_string_new_len(C(raw_packet));
	packet.offset = 0;

#define EXPECTED_NUM_PARAMS 14
	cmd = network_mysqld_stmt_execute_packet_new();
	g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet));
	g_assert_cmpint(0, ==, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, EXPECTED_NUM_PARAMS));
	g_assert_cmpint(1, ==, cmd->stmt_id);
	g_assert_cmpint(0, ==, cmd->flags);
	g_assert_cmpint(1, ==, cmd->iteration_count);
	g_assert_cmpint(1, ==, cmd->new_params_bound);
	g_assert_cmpint(EXPECTED_NUM_PARAMS, ==, cmd->params->len);
#undef EXPECTED_NUM_PARAMS

	/* (_STRING)NULL */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_STRING, ==, param->type);
	g_assert_cmpint(TRUE, ==, param->is_null);

	/* (_NULL) */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_NULL, ==, param->type);
	g_assert_cmpint(TRUE, ==, param->is_null);

	/* (_STRING)"foo" */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_STRING, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		const char *s;
		gsize s_len;

		g_assert_cmpint(0, ==, param->get_string_const(param, &s, &s_len));
		g_assert_cmpint(s_len, ==, 3);
		g_assert_cmpstr(s, ==, "foo");
	};

	/* (_INT64)1 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_LONGLONG, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	g_assert_cmpint(FALSE, ==, param->is_unsigned);
	{
		guint64 i;
		gboolean is_unsigned;

		g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned));
		g_assert_cmpint(i, ==, 1);
		g_assert_cmpint(is_unsigned, ==, FALSE);
	};

	/* (_UINT64)1 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_LONGLONG, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	g_assert_cmpint(TRUE, ==, param->is_unsigned);
	{
		guint64 i;
		gboolean is_unsigned;

		g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned));
		g_assert_cmpint(i, ==, 1);
	};

	/* (_INT32)1 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_LONG, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	g_assert_cmpint(FALSE, ==, param->is_unsigned);
	{
		guint64 i;
		gboolean is_unsigned;

		g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned));
		g_assert_cmpint(i, ==, 1);
	};

	/* (_INT16)1 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_SHORT, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	g_assert_cmpint(FALSE, ==, param->is_unsigned);
	{
		guint64 i;
		gboolean is_unsigned;

		g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned));
		g_assert_cmpint(i, ==, 1);
	};

	/* (_INT8)1 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_TINY, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	g_assert_cmpint(FALSE, ==, param->is_unsigned);
	{
		guint64 i;
		gboolean is_unsigned;

		g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned));
		g_assert_cmpint(i, ==, 1);
	};

	/* (_DOUBLE)10.2 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_DOUBLE, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		double d;

		g_assert_cmpint(0, ==, param->get_double(param, &d));
		g_assert_cmpfloat(d, ==, 10.2);
	};

	/* (_FLOAT)10.2 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_FLOAT, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		double d;

		g_assert_cmpint(0, ==, param->get_double(param, &d));
		g_assert_cmpfloat(d, ==, (float)10.2);
	};

	/* (_DATE)2010-10-17 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_DATE, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		network_mysqld_type_date_t date;

		g_assert_cmpint(0, ==, param->get_date(param, &date));
		g_assert_cmpint(date.year, ==, 2010);
		g_assert_cmpint(date.month, ==, 10);
		g_assert_cmpint(date.day, ==, 17);

		g_assert_cmpint(date.hour, ==, 0);
		g_assert_cmpint(date.min, ==, 0);
		g_assert_cmpint(date.sec, ==, 0);
		g_assert_cmpint(date.nsec, ==, 0);
	};

	/* (_DATETIME)2010-10-17 19:27:30.000 010 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_DATETIME, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		network_mysqld_type_date_t date;

		g_assert_cmpint(0, ==, param->get_date(param, &date));

		g_assert_cmpint(date.year, ==, 2010);
		g_assert_cmpint(date.month, ==, 10);
		g_assert_cmpint(date.day, ==, 17);

		g_assert_cmpint(date.hour, ==, 19);
		g_assert_cmpint(date.min, ==, 27);
		g_assert_cmpint(date.sec, ==, 30);
		g_assert_cmpint(date.nsec, ==, 1);
	};

	/* (_TIMESTAMP)2010-10-17 19:27:30.000 010 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_TIMESTAMP, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		network_mysqld_type_date_t date;

		g_assert_cmpint(0, ==, param->get_date(param, &date));
		g_assert_cmpint(date.year, ==, 2010);
		g_assert_cmpint(date.month, ==, 10);
		g_assert_cmpint(date.day, ==, 17);

		g_assert_cmpint(date.hour, ==, 19);
		g_assert_cmpint(date.min, ==, 27);
		g_assert_cmpint(date.sec, ==, 30);
		g_assert_cmpint(date.nsec, ==, 1);
	};

	/* (_TIME)-120 19:27:30.000 010 */
	param = g_ptr_array_index(cmd->params, param_ndx++);
	g_assert(param);
	g_assert_cmpint(MYSQL_TYPE_TIME, ==, param->type);
	g_assert_cmpint(FALSE, ==, param->is_null);
	{
		network_mysqld_type_time_t t;

		g_assert_cmpint(0, ==, param->get_time(param, &t));
		g_assert_cmpint(t.sign, ==, 1);
		g_assert_cmpint(t.days, ==, 120);

		g_assert_cmpint(t.hour, ==, 19);
		g_assert_cmpint(t.min, ==, 27);
		g_assert_cmpint(t.sec, ==, 30);
		g_assert_cmpint(t.nsec, ==, 1);
	};

	network_mysqld_stmt_execute_packet_free(cmd);
}