~jan-kneschke/mysql-proxy/packet-tracking-assertions

« back to all changes in this revision

Viewing changes to trunk/src/sql-tokenizer-lua.c

  • Committer: Kay Roepke
  • Date: 2008-06-09 09:42:54 UTC
  • Revision ID: kay@mysql.com-20080609094254-nmvzndymkzyl4cj2
merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <lua.h>
 
2
 
 
3
#include "lua-env.h"
 
4
#include "glib-ext.h"
 
5
 
 
6
#define C(x) x, sizeof(x) - 1
 
7
#define S(x) x->str, x->len
 
8
 
 
9
#include "sql-tokenizer.h"
 
10
#include "sql-tokenizer-lua.h"
 
11
 
 
12
static int proxy_tokenize_token_get(lua_State *L) {
 
13
        sql_token *token = *(sql_token **)luaL_checkself(L); 
 
14
        size_t keysize;
 
15
        const char *key = luaL_checklstring(L, 2, &keysize);
 
16
 
 
17
        if (strleq(key, keysize, C("text"))) {
 
18
                lua_pushlstring(L, S(token->text));
 
19
                return 1;
 
20
        } else if (strleq(key, keysize, C("token_id"))) {
 
21
                lua_pushinteger(L, token->token_id);
 
22
                return 1;
 
23
        } else if (strleq(key, keysize, C("token_name"))) {
 
24
                lua_pushstring(L, sql_token_get_name(token->token_id));
 
25
                return 1;
 
26
        }
 
27
 
 
28
        return 0;
 
29
}
 
30
 
 
31
int sql_tokenizer_lua_token_getmetatable(lua_State *L) {
 
32
        static const struct luaL_reg methods[] = {
 
33
                { "__index", proxy_tokenize_token_get },
 
34
                { NULL, NULL },
 
35
        };
 
36
        return proxy_getmetatable(L, methods);
 
37
}       
 
38
 
 
39
 
 
40
static int proxy_tokenize_get(lua_State *L) {
 
41
        GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L); 
 
42
        int ndx = luaL_checkinteger(L, 2);
 
43
        sql_token *token;
 
44
        sql_token **token_p;
 
45
 
 
46
        if (tokens->len > G_MAXINT) {
 
47
                return 0;
 
48
        }
 
49
 
 
50
        /* lua uses 1 is starting index */
 
51
        if (ndx < 1 && ndx > (int)tokens->len) {
 
52
                return 0;
 
53
        }
 
54
 
 
55
        token = tokens->pdata[ndx - 1];
 
56
 
 
57
        token_p = lua_newuserdata(L, sizeof(token));                          /* (sp += 1) */
 
58
        *token_p = token;
 
59
 
 
60
        sql_tokenizer_lua_token_getmetatable(L);
 
61
        lua_setmetatable(L, -2);             /* tie the metatable to the udata   (sp -= 1) */
 
62
 
 
63
        return 1;
 
64
}
 
65
 
 
66
static int proxy_tokenize_len(lua_State *L) {
 
67
        GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L); 
 
68
 
 
69
        lua_pushinteger(L, tokens->len);
 
70
 
 
71
        return 1;
 
72
}
 
73
 
 
74
static int proxy_tokenize_gc(lua_State *L) {
 
75
        GPtrArray *tokens = *(GPtrArray **)luaL_checkself(L); 
 
76
 
 
77
        sql_tokens_free(tokens);
 
78
 
 
79
        return 0;
 
80
}
 
81
 
 
82
 
 
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 },
 
88
                { NULL, NULL },
 
89
        };
 
90
        return proxy_getmetatable(L, methods);
 
91
}       
 
92
 
 
93
/**
 
94
 * split the SQL query into a stream of tokens
 
95
 */
 
96
int proxy_tokenize(lua_State *L) {
 
97
        size_t str_len;
 
98
        const char *str = luaL_checklstring(L, 1, &str_len);
 
99
        GPtrArray *tokens = sql_tokens_new();
 
100
        GPtrArray **tokens_p;
 
101
 
 
102
        sql_tokenizer(tokens, str, str_len);
 
103
 
 
104
        tokens_p = lua_newuserdata(L, sizeof(tokens));                          /* (sp += 1) */
 
105
        *tokens_p = tokens;
 
106
 
 
107
        sql_tokenizer_lua_getmetatable(L);
 
108
        lua_setmetatable(L, -2);          /* tie the metatable to the udata   (sp -= 1) */
 
109
 
 
110
        return 1;
 
111
}
 
112
 
 
113