From d5bc58c38d040b2aba0bcbbe397ecd6a265d9ccb Mon Sep 17 00:00:00 2001 From: Sergey Lyubka <valenok@gmail.com> Date: Thu, 31 Jan 2013 15:17:40 +0000 Subject: [PATCH] Using sqlite as an example --- test/page.lp | 78 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/test/page.lp b/test/page.lp index 0f7901e1c..5024acb79 100644 --- a/test/page.lp +++ b/test/page.lp @@ -1,40 +1,52 @@ -<html> - <p>Prime numbers from 0 to 100, calculated by Lua:</p> - <? +<? + -- Lua server pages have full control over the output, including HTTP + -- headers they send to the client. Send HTTP headers: + print('HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n') +?><html><body> - function is_prime(n) - if n <= 0 then return false end - if n <= 2 then return true end - if (n % 2 == 0) then return false end - for i = 3, n / 2, 2 do - if (n % i == 0) then return false end - end - return true - end +<p>This is an example Lua server page served by +<a href="http://code.google.com/p/mongoose">Mongoose web server</a>. +Mongoose has Lua, Sqlite, and other functionality built in the binary. +This example page stores the request in the Sqlite database, and shows +all requests done previously.</p> - for i = 1, 100 do - if is_prime(i) then print('<span>' .. i .. '</span> ') end - end +<pre> +<? + -- Open database + local db = sqlite3.open('requests.db') - ?> + -- Setup a trace callback, to show SQL statements we'll be executing. + -- db:trace(function(data, sql) print('Executing: ' .. sql .. '\n') end, nil) - <p>Reading POST data from Lua (click submit):</p> - <form method="POST"><input type="text" name="t1"/><input type="submit"></form> + -- Create a table if it is not created already + db:exec([[ + CREATE TABLE IF NOT EXISTS requests ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + timestamp NOT NULL, + method NOT NULL, + uri NOT NULL, + user_agent + ); + ]]) - <pre> - POST data: [<? post_data = read() print(post_data) ?>] - request method: [<? print(request_info.request_method) ?>] - IP/port: [<? print(request_info.remote_ip, ':', request_info.remote_port) ?>] - URI: [<? print(request_info.uri) ?>] - HTTP version [<? print(request_info.http_version) ?>] - HEADERS: - <? - for name, value in pairs(request_info.http_headers) do - print(name, ':', value, '\n') - end - ?> - - </pre> + -- Add entry about this request + local stmt = db:prepare( + 'INSERT INTO requests VALUES(NULL, datetime("now"), ?, ?, ?);'); + stmt:bind_values(request_info.request_method, request_info.uri, + request_info.http_headers['User-Agent']) + stmt:step() + stmt:finalize() + -- Show all previous records + print('Previous requests:\n') + stmt = db:prepare('SELECT * FROM requests ORDER BY id DESC;') + while stmt:step() == sqlite3.ROW do + local v = stmt:get_values() + print(v[1] .. ' ' .. v[2] .. ' ' .. v[3] .. ' ' + .. v[4] .. ' ' .. v[5] .. '\n') + end -</html> + -- Close database + db:close() +?> +</pre></body></html> -- GitLab