-
Notifications
You must be signed in to change notification settings - Fork 2
/
DBDI_pg.pm6
128 lines (96 loc) · 2.72 KB
/
DBDI_pg.pm6
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
use v6;
use java::sql::Driver;
use java::sql::Connection;
use java::sql::Statement;
use java::sql::ResultSet;
use java::sql::ResultSetMetaData;
use libpq;
class DBDI_pg::ResultSetMetaData does java::sql::ResultSetMetaData {
has $conn;
has $db_conn;
has $db_res;
method getColumnCount (
--> Int # int
) {
return PQnfields($db_res);
} # throws java.sql.SQLException
method getColumnLabel (
Int $v1, # int
--> Str # java.lang.String
) {
return PQfname($db_res, $v1-1);
} # throws java.sql.SQLException
}
class DBDI_pg::ResultSet does java::sql::ResultSet {
has $conn;
has $db_conn;
has $db_res;
has $row_num;
has $metadata;
method next (
--> Bool # boolean
) {
return (++$row_num <= PQntuples($db_res));
} # throws java.sql.SQLException
multi method getString (
Int $v1, # int
--> Str
) {
return Mu if PQgetisnull($db_res, $row_num-1, $v1-1);
my $field = PQgetvalue($db_res, $row_num-1, $v1-1);
return $field;
} # throws java.sql.SQLException
method getMetaData (
--> java::sql::ResultSetMetaData
) {
return $metadata ||= DBDI_pg::ResultSetMetaData.new(:conn(self), :$db_conn, :$db_res);
} # throws java.sql.SQLException
}
class DBDI_pg::Statement does java::sql::Statement {
has $conn;
has $db_conn;
method executeQuery (
Str $v1,
--> java::sql::ResultSet
) {
say "> executeQuery $v1";
my $db_res = PQexec($db_conn, $v1);
if (PQresultStatus($db_res) != PGRES_TUPLES_OK)
{
my $msg = PQerrorMessage($db_conn);
PQclear($db_res);
die sprintf("FETCH ALL failed: %s", $msg);
}
my $result = DBDI_pg::ResultSet.new(:conn(self), :$db_conn, :$db_res);
say "< executeQuery";
return $result;
}
}
class DBDI_pg::Connection does java::sql::Connection {
has $db_conn;
multi method createStatement (
--> java::sql::Statement
) {
say "> createStatement";
my $stmt = DBDI_pg::Statement.new(:conn(self), :$db_conn);
say "< createStatement";
return $stmt;
}
}
class DBDI_pg::Driver does java::sql::Driver {
multi method connect (
Str $v1,
Hash $v2,
--> java::sql::Connection
) {
say "> connect '$v1'";
my $db_conn = PQconnectdb($v1);
if (PQstatus($db_conn) != CONNECTION_OK) {
my $msg = PQerrorMessage($db_conn);
die sprintf( "Connection to database ($v1) failed: %s %s", $msg, PQstatus($db_conn));
}
my DBDI_pg::Connection $conn .= new( :$db_conn );
say "< connect";
return $conn;
}
}