summaryrefslogtreecommitdiffstats
path: root/test.lua
blob: 80f774f4c9a37beca9655e4d9e0c8ca59407a527 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env lem
--
-- This file is part of lem-postgres.
-- Copyright 2011 Emil Renner Berthing
-- Copyright 2013 Asbjørn Sloth Tønnesen
--
-- lem-postgres is free software: you can redistribute it and/or
-- modify it under the terms of the GNU General Public License as
-- published by the Free Software Foundation, either version 3 of
-- the License, or (at your option) any later version.
--
-- lem-postgres is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with lem-postgres. If not, see <http://www.gnu.org/licenses/>.
--

package.path = '?.lua;'..package.path
package.cpath = '?.so;'..package.cpath

print("Entering " .. arg[0])

local prettyprint
do
	local write, format, tostring = io.write, string.format, tostring

	function prettyprint(t)
		local widths, columns = {}, #t[0]
		for i = 1, columns do
			widths[i] = 0
		end

		for i = 0, #t do
			local row = t[i]
			for j = 1, columns do
				local value = row[j]
				if value and #value > widths[j] then
					widths[j] = #value
				end
			end
		end

		for i = 1, #widths do
			widths[i] = '%-' .. tostring(widths[i] + 1) .. 's';
		end

		for i = 0, #t do
			local row = t[i]
			for j = 1, columns do
				write(format(widths[j], row[j] or 'NULL'))
			end
			write('\n')
		end
	end
end

local utils    = require 'lem.utils'
local postgres = require 'lem.postgres'

local dbconnstr = [[
host=localhost
user=myuser
password=mypasswd
dbname=mydb
]]

local db = assert(postgres.connect(dbconnstr))

assert(db:exec(
'CREATE TEMPORARY TABLE mytable (id serial PRIMARY KEY, name TEXT, foo integer)'))

assert(db:exec("COPY mytable (name, foo) FROM STDIN (delimiter ',')"))
assert(db:put('alpha,1\n'))
assert(db:put('beta,2\n'))
assert(db:put('gamma,4\n'))
assert(db:put('delta,8\n'))
assert(db:put('epsilon,\\N\n'))
assert(db:done())

local res = assert(db:exec('SELECT * FROM mytable WHERE id = $1', '1'))
prettyprint(res)

local res1, res2 = assert(db:exec([[
SELECT count(id) FROM mytable;
SELECT * FROM mytable WHERE id = 2;
]]));
prettyprint(res2)

assert(db:prepare('mystmt', 'SELECT * FROM mytable WHERE id = $1'))
local res = assert(db:run('mystmt', '3'))
prettyprint(res)

assert(db:prepare('insert', 'INSERT INTO mytable (name, foo) VALUES ($1, $2)'))
assert(db:run('insert', 'zeta', 32))
assert(db:run('insert', 'eta', nil))

assert(db:exec("COPY mytable TO STDIN (format csv, null '\\N')"))

print("\nDumping CSV:")
while true do
	local row = assert(db:get())
	if type(row) ~= 'string' then break end

	io.write(row)
end

assert(db:exec('DROP TABLE mytable'))

assert(db:exec('LISTEN mytest;'))

assert(db:exec('NOTIFY mytest;'))
assert(db:exec("NOTIFY mytest, 'foo';"))

db:set_notifier(function(ev, payload, pid)
	print('notification', ev, payload, pid)
end)

assert(db:exec('SELECT pg_notify($1, $2);', 'mytest', 'bar'))
assert(db:exec('SELECT pg_notify($1, $2), pg_notify($1, $3);', 'mytest', 'foo', 'bar'))

db:set_notifier(function(ev, payload, pid)
	print('\nnotification', ev, payload, pid)
end)

utils.spawn(function()
	local sleeper = utils.newsleeper()
	for i=1,19 do
		sleeper:sleep(0.20)
		io.write('.')
	end
	print('')
end)


utils.spawn(function()
	local sleeper = utils.newsleeper()
	local db2 = assert(postgres.connect(dbconnstr))
	for i=1,3 do
		sleeper:sleep(1)
		assert(db2:exec("NOTIFY mytest, 'foo from secondary connection';"))
	end
end)

local sleeper = utils.newsleeper()
print('\ngoing to sleep')
sleeper:sleep(4)
print('awake again\n')

print("Exiting " .. arg[0])

-- vim: syntax=lua ts=2 sw=2 noet: