introducing lua
TRANSCRIPT
-
8/4/2019 Introducing Lua
1/63
-
8/4/2019 Introducing Lua
2/63
-
8/4/2019 Introducing Lua
3/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
MySQL Proxy architecture (very quickly) Introducing Lua Language fundamentals
Examples Comments
Agenda
-
8/4/2019 Introducing Lua
4/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
MySQL Forge http://forge.mysql.com/wiki/MySQL_Proxy
Getting started article http://dev.mysql.com/tech-resources/articles/proxy-gettingstarted.html
Lua http://www.lua.org/docs.html http://lua-users.org/wiki/TutorialDirectory
References
http://lua-users.org/wiki/TutorialDirectoryhttp://lua-users.org/wiki/TutorialDirectoryhttp://www.lua.org/docs.html%0Dhttp://www.lua.org/docs.html%0Dhttp://www.lua.org/docs.html%0Dhttp://www.lua.org/docs.html%0Dhttp://dev.mysql.com/tech-resources/articles/proxy-gettingstarted.htmlhttp://dev.mysql.com/tech-resources/articles/proxy-gettingstarted.htmlhttp://dev.mysql.com/tech-resources/articles/proxy-gettingstarted.htmlhttp://dev.mysql.com/tech-resources/articles/proxy-gettingstarted.htmlhttp://forge.mysql.com/wiki/MySQL_Proxyhttp://forge.mysql.com/wiki/MySQL_Proxy -
8/4/2019 Introducing Lua
5/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Proxy (< lat. procuratio)
5
= Someone taking care of
someone else's interests
A server proxy is
something acting on behalfof another server
-
8/4/2019 Introducing Lua
6/63
-
8/4/2019 Introducing Lua
7/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Proxy Overview
7
PROXY
CORE
connection
hook
read query
hook
read resulthook
function
Lua script
function
functionfunctionfunction
-
8/4/2019 Introducing Lua
8/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Lua Overview
8
??Why not ...
Perl ?PHP?Javascript?[whatever]?
-
8/4/2019 Introducing Lua
9/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Lua Overview
9
SMALL ( < 200 KB) DESIGNED for
EMBEDDED systems Widely used (lighttpd)
lighttpd, like MySQLProxy, was created byJan Kneschke
-
8/4/2019 Introducing Lua
10/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Lua Overview
10
Very popular among
game writers
-
8/4/2019 Introducing Lua
11/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Proxy Overview
11
connect_server
Lua script
read_auth
read_auth_result
read_handshake
read_query
read_query_result
disconnect_client
global
context
session
contextsessioncontextsession
contextsession
contextsession
contextsession
contextsession
context
-
8/4/2019 Introducing Lua
12/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Using Lua files
12
/usr/local/sbin/mysql-proxy \--proxy-lua-script=/path/name.lua
IMPORTANT!THE SCRIPT DOES NOT START UNTIL THE
FIRST CLIENT CONNECTION
-
8/4/2019 Introducing Lua
13/63
-
8/4/2019 Introducing Lua
14/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Lua comments
14
-- simple comment
print(1)
--[[print(2)
print('hello')
--]]print(3)
-
8/4/2019 Introducing Lua
15/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Lua comments
15
-- simple comment
--[=[
print(1)--[[
print(2)
print('hello')
--]]
print(3)
--]=]
-
8/4/2019 Introducing Lua
16/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
numbers and strings
16
nil = no value (false) number = floating point '5' =/= 5 a = nil
b = 5; c = '5'print (b == c)false
print (b == c +0)true
-
8/4/2019 Introducing Lua
17/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
numbers and strings
17
conversion on demand
a = 5 ; b = '5'
print(type(a), type(b))number string
print(type(b+0))numberprint(type(a .. ""))string
-
8/4/2019 Introducing Lua
18/63Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
numbers and strings
18
conversion on demand
a = 5 ; b = '5'
print(type(tostring(a)))string
print(type(tonumber(b)))number
-
8/4/2019 Introducing Lua
19/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
strings
19
smart quoting
a = 'Hello'
b = "World"c = "Can't"d = [[Don't say "Hello"]]e = [=["d'oh" [[braces]]!]=]
-
8/4/2019 Introducing Lua
20/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
tables
20
associative arrays can be used as arrays can create complex
structures t1 = {10, 20, 30 }t2 = {a = 'abc',b = 2,c = { 3, 4}
}
-
8/4/2019 Introducing Lua
21/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
functions
21
can be assigned tovariables
new functions can override
existing onesfunction f (x)print(x)
endg = fg(10)
-
8/4/2019 Introducing Lua
22/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
userdata
22
containers to exchangedata between Lua and hostlanguage
can have "tag methods"
-
8/4/2019 Introducing Lua
23/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Statements
23
normal assignmentsa = 3b = get_num() -- func return
multiple assignmentsa,b = 3,2
multiple return valuesfunction x ()
return 1, 'OK'end
a, b, c = x()-- a = 1, b = 'OK', c = nil
-
8/4/2019 Introducing Lua
24/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
statement blocks
24
ifif condition then
statements
end whilewhile condition do
statementsend
-
8/4/2019 Introducing Lua
25/63
-
8/4/2019 Introducing Lua
26/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
sample function
26
read_query
1 function read_query(packet)
2 if packet:byte()~=3 proxy.PROXY_COM_QUERY4 then5 return
6 end7 local query = packet:sub(2)8 print('received ' .. query)
9 end
-
8/4/2019 Introducing Lua
27/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
some details
27
== equals ~= not equal
string.byte(packet)packet:byte()
string.sub(packet,2)packet:sub(2)
'abc' .. '123' == 'abc123'
-
8/4/2019 Introducing Lua
28/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Using tables
28
t = {}t[1] = 'a' --First element 1, ! 0t[2] = 'b'
table.insert(t, 'c')-- or t[ #t +1 ] = 'c'
t = {'a', 'b', 'c' }t = {1 = 'a', 2 = 'b', 3 = 'c'}print (t[2])b
-
8/4/2019 Introducing Lua
29/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Using tables
29
sizes = {}sizes['john'] = 'XL'sizes['paul'] = 'M'
sizes['fred'] = 'L'
sizes = {john = 'XL',paul = 'M',fred = 'L',
}
-
8/4/2019 Introducing Lua
30/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Using tables
30
sizes = {john = 'XL',paul = 'M',
fred = 'L',}print(sizes['john'])XL
print(sizes.paul)M
-
8/4/2019 Introducing Lua
31/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Using tables
31
for i, v in ipairs(t) doprint (i ..' -> ' .. v)
end
for name,size in pairs(sizes) doprint(name .. ' ' ..
wears .. ' ' ..size)
end
-
8/4/2019 Introducing Lua
32/63
-
8/4/2019 Introducing Lua
33/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Watch out
33
-- Luaa = falseprint ( a and "true" or "false")
false
a = nilprint ( a and "true" or "false")false
-
8/4/2019 Introducing Lua
34/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Finding text
34
query = 'SELECT id FROM t1'
local cmd, column =
query:match("(SELECT)%s+(%w+)")
if cmd then-- do something with query
end
-
8/4/2019 Introducing Lua
35/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Finding text
35
Regular expressions similar to Perl/PHP, but simpler
% instead of \ (captures)
[character classes]
^ $ + - ? * no alternation (a|b) no modifiers /i
-
8/4/2019 Introducing Lua
36/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Finding text (Proxy way)
36
local tk =require('proxy.tokenizer')
local tokens = tk.tokenize(query)
if tokens[1].token_name =='TK_SQL_SELECT' then-- do something with query
end
-
8/4/2019 Introducing Lua
37/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Finding text (Proxy way)
37
-- each token is a table
token = {
token_name = 'TK_SQL_SELECT',text = 'select',token_id = 204
}
-
8/4/2019 Introducing Lua
38/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
I/O
38
-- files are objects
local fname = '/tmp/test.txt'
assert(fh = io.open(fname,'r'))
for line in fh:lines() doprint(line)
endfh:close()
-
8/4/2019 Introducing Lua
39/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
I/O
39
-- files are objects
local fname = '/tmp/test.txt'
assert(fh = io.open(fname,'w'))for x = 1, 100 do
fh:write('new row ' .. x)fh:flush()
endfh:close()
-
8/4/2019 Introducing Lua
40/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Examples
40
http://forge.mysql.com/wiki/Lua_Scripts_For_MySQL_Proxy_Examples
all hooks session bandwidth
user bandwidth
blocking commands
http://forge.mysql.com/wiki/Lua_Scripts_For_MySQL_Proxy_Exampleshttp://forge.mysql.com/wiki/Lua_Scripts_For_MySQL_Proxy_Examples -
8/4/2019 Introducing Lua
41/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
all-hooks (1)
41
source: all-hooks.lua
function read_auth( auth )...function connect_server()...function read_handshake( auth )...function read_auth_result( auth )...function disconnect_client()...function read_query (packet)...function read_query_result (inj)...
http://forge.mysql.com/snippets/download.php?id=109http://forge.mysql.com/snippets/download.php?id=109 -
8/4/2019 Introducing Lua
42/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
all-hooks (2)
42
source: all-hooks.lua
local access_ndx = 0
function print_access(msg)access_ndx = access_ndx + 1print( string.format('%3d %-30s',access_ndx,msg))
end
function read_auth( auth )print_access ('inside read_auth ')
end
function connect_server()print_access ('inside connect_server')
end
function read_handshake( auth )print_access ('inside read_handshake' )
end-- ... to be continued
http://forge.mysql.com/snippets/download.php?id=109http://forge.mysql.com/snippets/download.php?id=109 -
8/4/2019 Introducing Lua
43/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
all-hooks (3)
43
source: all-hooks.lua
function read_auth_result( auth )print_access ('inside read_auth_result ')
end
function read_query (packet)print_access('inside read_query \t' .. packet:sub(2))
proxy.queries:append(1, packet)return proxy.PROXY_SEND_QUERY
end
function read_query_result (inj)print_access('inside read_query_result \t' .. inj.query)
end
function disconnect_client()print_access('inside disconnect_client')
end
http://forge.mysql.com/snippets/download.php?id=109http://forge.mysql.com/snippets/download.php?id=109 -
8/4/2019 Introducing Lua
44/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
read_query & read_query_result
44
client
MySQL Proxy
SERVER
query
functionread_query
function
read_query_result
query
result
result
if a query is passed directly to the server,
its result is NOT evaluated by
read_query_result
-
8/4/2019 Introducing Lua
45/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
read_query & read_query_result
45
client
MySQL Proxy
SERVER
query
functionread_query
function
read_query_result
query queue
query
result
result
only ifa query is added
to the query queue,
its result is evaluated by
read_query_result
queryquery
-
8/4/2019 Introducing Lua
46/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
all-hooks (4)
46
source: all-hooks.lua
sample output/usr/local/sbin/mysql-proxy --proxy-lua-script=all-hooks.lua1 inside connect_server2 inside read_handshake3 inside read_auth4 inside read_auth_result5 inside read_query select @@version_comment limit 16 inside read_query_result select @@version_comment limit 17 inside read_query select now()8 inside read_query_result select now()9 inside read_query10 inside disconnect_client
http://forge.mysql.com/snippets/download.php?id=109http://forge.mysql.com/snippets/download.php?id=109 -
8/4/2019 Introducing Lua
47/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
session-bandwidth (1)
47
source: session-bandwidth.lua
local bandwidth = 0
function read_query (packet )bandwidth = bandwidth + packet:len()proxy.queries:append(1, packet )return proxy.PROXY_SEND_QUERY
end
-- to be continued ...
http://forge.mysql.com/snippets/download.php?id=110http://forge.mysql.com/snippets/download.php?id=110 -
8/4/2019 Introducing Lua
48/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
session-bandwidth (2)
48
source: session-bandwidth.lua
-- (continue)
function read_query_result(inj)local fields = inj.resultset.fieldsif (fields) then
for i = 1, #fields dobandwidth = bandwidth +
(fields[i] and fields[i].name:len() or 0)endfor row in inj.resultset.rows do
for i = 1, #inj.resultset.fields dobandwidth = bandwidth +(row[i] and row[i]:len() or 0)
endend
endprint (proxy.connection.server['thread_id'],bandwidth)
end
http://forge.mysql.com/snippets/download.php?id=110http://forge.mysql.com/snippets/download.php?id=110http://forge.mysql.com/snippets/download.php?id=110 -
8/4/2019 Introducing Lua
49/63
-
8/4/2019 Introducing Lua
50/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
user-bandwidth (1)
50
source: user-bandwidth.lua
proxy.global.bandwidth = proxy.global.bandwidth or {}
local session_user
function read_auth( auth )session_user = auth.usernameproxy.global.bandwidth[session_user] =
proxy.global.bandwidth[session_user] or 0end
-- to be continued ...
http://forge.mysql.com/snippets/download.php?id=111http://forge.mysql.com/snippets/download.php?id=111 -
8/4/2019 Introducing Lua
51/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
user-bandwidth (2)
51
source: user-bandwidth.lua
function read_query (packet )proxy.global.bandwidth[session_user ] =
proxy.global.bandwidth[session_user] + packet:len()proxy.queries:append(1, packet )return proxy.PROXY_SEND_QUERY
end
-- to be continued ...
http://forge.mysql.com/snippets/download.php?id=111http://forge.mysql.com/snippets/download.php?id=111 -
8/4/2019 Introducing Lua
52/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 52
function read_query_result(inj)
local fields = inj.resultset.fieldslocal rows = inj.resultset.rowsif fields then
for i = 1, #fields doproxy.global.bandwidth[session_user] =
proxy.global.bandwidth[session_user] +(fields[i] and fields[i].name:len() or 0)
endif rows thenfor row in rows do
for i = 1, #fields doproxy.global.bandwidth[session_user] =
proxy.global.bandwidth[session_user] +(row[i] and row[i]:len() or 0)
endendend
endprint (session_user .. ' -> ' ..
proxy.global.bandwidth[session_user])end
user-bandwidth (3)
-
8/4/2019 Introducing Lua
53/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 53
source: user-bandwidth.lua
Sample session
gmax -> 376gmax -> 399
root -> 599root -> 10641
gmax -> 478gmax -> 20520
user-bandwidth (4)
http://forge.mysql.com/snippets/download.php?id=111http://forge.mysql.com/snippets/download.php?id=111 -
8/4/2019 Introducing Lua
54/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 54
source: query-block.lua
local tokenizer = require("proxy.tokenizer")----- make_regexp_from_command()
---- creates a regular expression for fast scanning of the command---- @param cmd the command to be converted to regexp--function make_regexp_from_command(cmd)
local regexp= '^%s*';
for ch in cmd:gmatch('(.)') doregexp = regexp .. '[' .. ch:upper() .. ch:lower() .. ']'
endreturn regexp
end-- to be continued ...
query-block (1)
http://forge.mysql.com/snippets/download.php?id=108http://forge.mysql.com/snippets/download.php?id=108 -
8/4/2019 Introducing Lua
55/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 55
source: query-block.lua
local SHOW_REGEXP = make_regexp_from_command('show')
queries_to_filter = {
{prefix = SHOW_REGEXP,keywords = { 'SHOW', 'TABLE', 'STATUS'} ,
},{
prefix = SHOW_REGEXP,keywords = { 'SHOW', 'TABLES'} ,
},}
-- to be continued ...
query-block (2)
http://forge.mysql.com/snippets/download.php?id=108http://forge.mysql.com/snippets/download.php?id=108 -
8/4/2019 Introducing Lua
56/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 56
source: query-block.lua
function error_result (msg)proxy.response = {
type = proxy.MYSQLD_PACKET_ERR,errmsg = msg,errcode = 7777,sqlstate = 'X7777',
}return proxy.PROXY_SEND_RESULT
end
-- to be continued ...
query-block (3)
http://forge.mysql.com/snippets/download.php?id=108http://forge.mysql.com/snippets/download.php?id=108 -
8/4/2019 Introducing Lua
57/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 57
function read_query( packet )if (packet:byte() ~= proxy.COM_QUERY) then
returnendlocal query = packet:sub(2)for i,query_to_filter in pairs(queries_to_filter)do
if query:match(query_to_filter.prefix) thenlocal full_tokens = tokenizer.tokenize(query)local tokens = tokenizer.bare_tokens(full_tokens, true)local found = 0local requested = #query_to_filter.keywordsfor j,keyword in pairs(query_to_filter.keywords) do
for k, token in pairs(tokens) doif token:upper() == keyword then
found = found + 1break
endend
end-- to be continued ...
query-block (4)
-
8/4/2019 Introducing Lua
58/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 58
function read_query( packet )-- ...
if found == requested then -- to be filtered offreturn error_result('command is not allowed' )
endend
endend
query-block (5)
-
8/4/2019 Introducing Lua
59/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database 59
source: query-block.lua
sample output:
show tables;ERROR 7777 (X7777): command is not allowed
query-block (6)
http://forge.mysql.com/snippets/download.php?id=108http://forge.mysql.com/snippets/download.php?id=108 -
8/4/2019 Introducing Lua
60/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Read more
60
http://www.lua.org/docs.html
online Luadocumentation
http://www.lua.org/docs.htmlhttp://www.lua.org/docs.html -
8/4/2019 Introducing Lua
61/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Read more
61
http://www.inf.puc-rio.br/~roberto/pil2/
http://www.inf.puc-rio.br/~roberto/pil2/http://www.inf.puc-rio.br/~roberto/pil2/ -
8/4/2019 Introducing Lua
62/63
Copyright 2004-2007 MySQL AB The Worlds Most Popular Open Source Database
Read more
62
http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470069171.html
http://forge.mysql.com/wiki/Lua_Scripts_For_MySQL_Proxy_Exampleshttp://forge.mysql.com/wiki/Lua_Scripts_For_MySQL_Proxy_Examples -
8/4/2019 Introducing Lua
63/63
Giuseppe MaxiaQA Developer
December 2007
QUESTIONS
?