6
#define C(x) x, sizeof(x) - 1
7
#define S(x) x->str, x->len
9
#include "sql-tokenizer.h"
10
#include "sql-tokenizer-lua.h"
12
static int proxy_tokenize_token_get(lua_State *L) {
13
sql_token *token = *(sql_token **)luaL_checkself(L);
15
const char *key = luaL_checklstring(L, 2, &keysize);
17
if (strleq(key, keysize, C("text"))) {
18
lua_pushlstring(L, S(token->text));
20
} else if (strleq(key, keysize, C("token_id"))) {
21
lua_pushinteger(L, token->token_id);
23
} else if (strleq(key, keysize, C("token_name"))) {
24
lua_pushstring(L, sql_token_get_name(token->token_id));
31
int sql_tokenizer_lua_token_getmetatable(lua_State *L) {
32
static const struct luaL_reg methods[] = {
33
{ "__index", proxy_tokenize_token_get },
36
return proxy_getmetatable(L, methods);
40
static int proxy_tokenize_get(lua_State *L) {
41
GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L);
42
int ndx = luaL_checkinteger(L, 2);
46
if (tokens->len > G_MAXINT) {
50
/* lua uses 1 is starting index */
51
if (ndx < 1 && ndx > (int)tokens->len) {
55
token = tokens->pdata[ndx - 1];
57
token_p = lua_newuserdata(L, sizeof(token)); /* (sp += 1) */
60
sql_tokenizer_lua_token_getmetatable(L);
61
lua_setmetatable(L, -2); /* tie the metatable to the udata (sp -= 1) */
66
static int proxy_tokenize_len(lua_State *L) {
67
GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L);
69
lua_pushinteger(L, tokens->len);
74
static int proxy_tokenize_gc(lua_State *L) {
75
GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L);
77
sql_tokens_free(tokens);
83
int sql_tokenizer_lua_getmetatable(lua_State *L) {
84
static const struct luaL_reg methods[] = {
85
{ "__index", proxy_tokenize_get },
86
{ "__len", proxy_tokenize_len },
87
{ "__gc", proxy_tokenize_gc },
90
return proxy_getmetatable(L, methods);
94
* split the SQL query into a stream of tokens
96
int proxy_tokenize(lua_State *L) {
98
const char *str = luaL_checklstring(L, 1, &str_len);
99
GPtrArray *tokens = sql_tokens_new();
100
GPtrArray **tokens_p;
102
sql_tokenizer(tokens, str, str_len);
104
tokens_p = lua_newuserdata(L, sizeof(tokens)); /* (sp += 1) */
107
sql_tokenizer_lua_getmetatable(L);
108
lua_setmetatable(L, -2); /* tie the metatable to the udata (sp -= 1) */