diff --git a/Makefile b/Makefile index 4f8b17a7..7ea2bd25 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,6 @@ LUA_CLIB_SKYNET = \ lua-crypt.c lsha1.c \ lua-sharedata.c \ lua-stm.c \ - lua-mysqlaux.c \ lua-debugchannel.c \ lua-datasheet.c \ \ diff --git a/lualib-src/lua-mysqlaux.c b/lualib-src/lua-mysqlaux.c deleted file mode 100644 index 46fbc67d..00000000 --- a/lualib-src/lua-mysqlaux.c +++ /dev/null @@ -1,166 +0,0 @@ -#define LUA_LIB - -#include -#include -#include - -#include -#include - -static unsigned int num_escape_sql_str(unsigned char *dst, unsigned char *src, size_t size) -{ - unsigned int n =0; - while (size) { - /* the highest bit of all the UTF-8 chars - * is always 1 */ - if ((*src & 0x80) == 0) { - switch (*src) { - case '\0': - case '\b': - case '\n': - case '\r': - case '\t': - case 26: /* \Z */ - case '\\': - case '\'': - case '"': - n++; - break; - default: - break; - } - } - src++; - size--; - } - return n; -} -static unsigned char* -escape_sql_str(unsigned char *dst, unsigned char *src, size_t size) -{ - - while (size) { - if ((*src & 0x80) == 0) { - switch (*src) { - case '\0': - *dst++ = '\\'; - *dst++ = '0'; - break; - - case '\b': - *dst++ = '\\'; - *dst++ = 'b'; - break; - - case '\n': - *dst++ = '\\'; - *dst++ = 'n'; - break; - - case '\r': - *dst++ = '\\'; - *dst++ = 'r'; - break; - - case '\t': - *dst++ = '\\'; - *dst++ = 't'; - break; - - case 26: - *dst++ = '\\'; - *dst++ = 'Z'; - break; - - case '\\': - *dst++ = '\\'; - *dst++ = '\\'; - break; - - case '\'': - *dst++ = '\\'; - *dst++ = '\''; - break; - - case '"': - *dst++ = '\\'; - *dst++ = '"'; - break; - - default: - *dst++ = *src; - break; - } - } else { - *dst++ = *src; - } - src++; - size--; - } /* while (size) */ - - return dst; -} - - - - -static int -quote_sql_str(lua_State *L) -{ - size_t len, dlen, escape; - unsigned char *p; - unsigned char *src, *dst; - - if (lua_gettop(L) != 1) { - return luaL_error(L, "expecting one argument"); - } - - src = (unsigned char *) luaL_checklstring(L, 1, &len); - - if (len == 0) { - dst = (unsigned char *) "''"; - dlen = sizeof("''") - 1; - lua_pushlstring(L, (char *) dst, dlen); - return 1; - } - - escape = num_escape_sql_str(NULL, src, len); - - dlen = sizeof("''") - 1 + len + escape; - p = lua_newuserdata(L, dlen); - - dst = p; - - *p++ = '\''; - - if (escape == 0) { - memcpy(p, src, len); - p+=len; - } else { - p = (unsigned char *) escape_sql_str(p, src, len); - } - - *p++ = '\''; - - if (p != dst + dlen) { - return luaL_error(L, "quote sql string error"); - } - - lua_pushlstring(L, (char *) dst, p - dst); - - return 1; -} - - -static struct luaL_Reg mysqlauxlib[] = { - {"quote_sql_str",quote_sql_str}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_skynet_mysqlaux_c (lua_State *L) { - lua_newtable(L); - luaL_setfuncs(L, mysqlauxlib, 0); - return 1; -} - diff --git a/lualib/skynet/db/mysql.lua b/lualib/skynet/db/mysql.lua index 4c3c2a45..022c7f9b 100644 --- a/lualib/skynet/db/mysql.lua +++ b/lualib/skynet/db/mysql.lua @@ -5,7 +5,6 @@ -- Modified by Cloud Wu (remove bit32 for lua 5.3) local socketchannel = require "skynet.socketchannel" -local mysqlaux = require "skynet.mysqlaux.c" local crypt = require "skynet.crypt" @@ -637,9 +636,20 @@ function _M.server_ver(self) return self._server_ver end +local escape_map = { + ['\0'] = "\\0", + ['\b'] = "\\b", + ['\n'] = "\\n", + ['\r'] = "\\r", + ['\t'] = "\\t", + ['\26'] = "\\Z", + ['\\'] = "\\\\", + ["'"] = "\\'", + ['"'] = '\\"', +} function _M.quote_sql_str( str) - return mysqlaux.quote_sql_str(str) + return strformat("'%s'", strgsub(str, "[\0\b\n\r\t\26\\\'\"]", escape_map)) end function _M.set_compact_arrays(self, value)