static int lua_proto_get_err_packet (lua_State *L) {
	size_t packet_len;
	const char *packet_str = luaL_checklstring(L, 1, &packet_len);
	network_mysqld_err_packet_t *err_packet;
	network_packet packet;
	GString s;
	int err = 0;

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

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

	err_packet = network_mysqld_err_packet_new();

	err = err || network_mysqld_proto_get_err_packet(&packet, err_packet);
	if (err) {
		network_mysqld_err_packet_free(err_packet);

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

	lua_newtable(L);

	LUA_EXPORT_STR(err_packet, errmsg);
	LUA_EXPORT_STR(err_packet, sqlstate);
	LUA_EXPORT_INT(err_packet, errcode);

	network_mysqld_err_packet_free(err_packet);

	return 1;
}
Example #2
0
static PyObject *
python_proto_get_err_packet(PyObject *self, PyObject *args){
	int packet_len;
	const char* packet_str;
	if(!PyArg_ParseTuple(args, "s#", &packet_str, &packet_len))
		return NULL;
	network_mysqld_err_packet_t *err_packet;
	network_packet packet;
	GString s;
	int err = 0;
	s.str = (char *)packet_str;
	s.len = packet_len;
	packet.data = &s;
	packet.offset = 0;

	err_packet = network_mysqld_err_packet_new();

	err = err || network_mysqld_proto_get_err_packet(&packet, err_packet);
	if (err) {
		network_mysqld_err_packet_free(err_packet);
		PyErr_SetString(PyExc_ValueError, "network_mysqld_proto_get_err_packet() failed");
		return NULL;
	}

	PyObject *result = Spain_New();
	if(!result)
		return NULL;

#define PYTHON_EXPORT_STR(x, y) \
	PyObject *s_ ## y = PyString_FromString(x->y->str);\
	if(!s_ ## y){\
		Py_DECREF(result);\
		network_mysqld_err_packet_free(err_packet);\
		return NULL;\
	}\
	PyObject_SetAttrString(result, #y, s_ ## y);\
	Py_DECREF(s_ ## y);

#define PYTHON_EXPORT_INT(x, y) \
	PyObject *s_ ## y = PyInt_FromLong(x->y);\
	if(!s_ ## y){\
		Py_DECREF(result);\
		network_mysqld_err_packet_free(err_packet);\
		return NULL;\
	}\
	PyObject_SetAttrString(result, #y, s_ ## y);\
	Py_DECREF(s_ ## y);

	PYTHON_EXPORT_STR(err_packet, errmsg)
	PYTHON_EXPORT_STR(err_packet, sqlstate)
	PYTHON_EXPORT_INT(err_packet, errcode)

	network_mysqld_err_packet_free(err_packet);
	return result;
}
void t_err_packet_append(void) {
	network_mysqld_err_packet_t *err_packet;
	network_packet *packet;

	err_packet = network_mysqld_err_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_err_packet(packet->data, err_packet));
	g_assert_cmpint(9, ==, packet->data->len);
	g_assert_cmpint(TRUE, ==, g_memeq(S(packet->data), C("\xff\x00\x00#07000")));

	g_assert_cmpint(0, ==, network_mysqld_proto_get_err_packet(packet, err_packet));

	/* check if encoding and decoding works */
	err_packet->errcode = 3;
	g_string_assign_len(err_packet->errmsg, C("test"));
	g_string_assign_len(err_packet->sqlstate, C("01234"));

	g_string_truncate(packet->data, 0);
	packet->offset = 0;

	g_assert_cmpint(0, ==, network_mysqld_proto_append_err_packet(packet->data, err_packet));
	g_assert_cmpint(13, ==, packet->data->len);
	g_assert_cmpint(TRUE, ==, g_memeq(S(packet->data), C("\xff\x03\x00#01234test")));
	
	network_mysqld_err_packet_free(err_packet);

	err_packet = network_mysqld_err_packet_new();
	g_assert_cmpint(0, ==, network_mysqld_proto_get_err_packet(packet, err_packet));
	g_assert_cmpint(3, ==, err_packet->errcode);
	g_assert_cmpstr("01234", ==, err_packet->sqlstate->str);
	g_assert_cmpstr("test", ==, err_packet->errmsg->str);

	network_mysqld_err_packet_free(err_packet);

	/* check if too-short packet is denied */
	err_packet = network_mysqld_err_packet_new();
	g_string_truncate(packet->data, 0);
	packet->offset = 0;
	g_assert_cmpint(-1, ==, network_mysqld_proto_get_err_packet(packet, err_packet));

	network_mysqld_err_packet_free(err_packet);

	g_string_free(packet->data, TRUE);
	network_packet_free(packet);
}
void t_err_packet_new(void) {
	network_mysqld_err_packet_t *err_packet;

	err_packet = network_mysqld_err_packet_new();
	g_assert(err_packet);

	network_mysqld_err_packet_free(err_packet);
}
static int lua_proto_append_err_packet (lua_State *L) {
	GString *packet;
	network_mysqld_err_packet_t *err_packet;

	luaL_checktype(L, 1, LUA_TTABLE);

	err_packet = network_mysqld_err_packet_new();

	LUA_IMPORT_STR(err_packet, errmsg);
	LUA_IMPORT_STR(err_packet, sqlstate);
	LUA_IMPORT_INT(err_packet, errcode);

	packet = g_string_new(NULL);	
	network_mysqld_proto_append_err_packet(packet, err_packet);

	network_mysqld_err_packet_free(err_packet);

	lua_pushlstring(L, S(packet));
	
	g_string_free(packet, TRUE);

	return 1;
}