[ UP ] cgi
[archserver.git] / cgi / libcgi.inc
blob25b05e7a8831fd41fb55867ceb2d26f5684774b8
1 -- library for cgi
2 if _lib_inc_init ~= nil then return end
3 _lib_inc_init = 1
4 io.stderr = io.stdout
7 -- parse STDIN and query_string
8 local _as_stdin_init;   -- parsed flag
9 local _as_query_data = {};      -- query data store
10 --local _as_kv_token = "(%w+)=([%w_-%%]+)"
11 local _as_kv_token = "([^&=]+)=([^&=]+)"
12 -- FIXME this MUST work with multi-byte encoded data
13 function QUERY()
14         if _as_stdin_init ~= nil then return _as_query_data end
15         local query_string = os.getenv("QUERY_STRING");
16         local k, v
18         if query_string == nil then return _as_query_data end
19         for k, v in string.gfind(query_string, _as_kv_token) do
20                 _as_query_data[unescape(k)] = unescape(v);
21         end
22         _as_stdin_init = 1;
23         return _as_query_data;
24 end
26 local _as_post_init;
27 local _as_post_data = {};       -- post data store
28 function POST()
29         if _as_post_init ~= nil then return _as_post_data end
30         local read = io.read();
31         local k, v
33         if read == nil then return _as_post_data end
34         for k, v in string.gfind(read, _as_kv_token) do
35                 _as_post_data[unescape(k)] = unescape(v);
36         end
37         _as_post_init = 1;
38         return _as_post_data;
39 end
41 --[[ all key/value in one
42    FIXME how to do it
43 function QP_ENV()
44         return QUERY() .. POST();
45 end
48 function show_errmsg()
49         if err_msg ~= nil then print('<div class="err_msg">'..err_msg..'</div>') end
50 end
52 -- database deal with
53 env, con = nil, nil;
54 function db_open()
55         require "luasql.mysql";
56         env = assert (luasql.mysql())
57         con = assert (env:connect(CONF_DB.DBN, CONF_DB.USR, CONF_DB.PWD, CONF_DB.SRV), "mysql connect bad")
58 end
60 function rows(connection, sql_statement)
61         local cursor = assert(connection:execute(sql_statement))
62         return function()
63                 return cursor:fetch()
64         end
65 end
67 -- form deal with
68 function unescape (s)
69         if s == nil then return s end
70         s = string.gsub(s, "+", " ")
71         s = string.gsub(s, "%%(%x%x)", function (h)
72                   return string.char(tonumber(h, 16))
73                 end)
74         return s
75 end
77 function escape (s)
78         s = string.gsub(s, "([&=+%c])", function (c)
79                   return string.format("%%%02X", string.byte(c))
80                 end)
81         s = string.gsub(s, " ", "+")
82         return s
83 end
85 function encode (t)
86         local s = ""
87         local k, v
88         for k,v in pairs(t) do
89                 s = s .. "&" .. escape(k) .. "=" .. escape(v)
90         end
91         return string.sub(s, 2)     -- remove first `&'
92 end
94 function ui_getqp()
95 --                              local _qt = QUERY()
96 --                              local _pt = POST()
97                                 local _qpt = {}
98 --                              local _k, _v
99 --                              for _k,_v in pairs(_qt) do _qpt["\"".._k.."\""] = _v end
100 --                              for _k,_v in pairs(_qt) do _qpt["\"".._k.."\""] = _v end
101                                 
102                                 local _t = myexec("set")
103                                 string.gsbu(_t, "(.-)=(.-)\n", function(n,v) 
104                                                                 n=tostring(n) 
105                                                                 if(string.sub(n,1,2) == "F_") then _tbl[n] = v  end     
106                                 end)
107                                 return _qpt
110 -- private msg store with "XXX_ARCHSS", we need config it when install
111 -- vim:ft=lu