-
Notifications
You must be signed in to change notification settings - Fork 0
/
Connection.pm6
127 lines (93 loc) · 2.78 KB
/
Connection.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
use v6;
use DBDI::pglibpq::libpq;
use java::sql::Driver;
use java::sql::Connection;
use java::sql::Statement;
use java::sql::ResultSet;
use java::sql::ResultSetMetaData;
class DBDI::pglibpq::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::pglibpq::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::pglibpq::ResultSetMetaData.new(:conn(self), :$db_conn, :$db_res);
} # throws java.sql.SQLException
}
class DBDI::pglibpq::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::pglibpq::ResultSet.new(:conn(self), :$db_conn, :$db_res);
say "< executeQuery";
return $result;
}
}
class DBDI::pglibpq::Connection does java::sql::Connection {
has $db_conn;
method new (
Str $url,
Hash $info,
--> java::sql::Connection
) {
my $conninfo = "host=localhost $url user=$info.<user> password=$info.<password>";
say "- connect '$conninfo'";
my $db = PQconnectdb($conninfo);
if (PQstatus($db) != CONNECTION_OK) {
my $msg = PQerrorMessage($db);
die sprintf( "Connection to database using '$conninfo' failed (status %s): %s", PQstatus($db), $msg);
}
return self.bless( self.CREATE(), :db_conn($db) );
}
multi method createStatement (
--> java::sql::Statement
) {
say "> createStatement";
my $stmt = DBDI::pglibpq::Statement.new(:conn(self), :$db_conn);
say "< createStatement";
return $stmt;
}
}