introducing lua

Upload: bonny-hardi-putra

Post on 07-Apr-2018

230 views

Category:

Documents


0 download

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

    ?