/
mysql.pm6
198 lines (165 loc) · 5.63 KB
/
mysql.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
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# FakeDBD::mysql.pm6
use NativeCall; # from project 'zavolaj'
use FakeDBD; # roles for drivers
#------------ mysql library functions in alphabetical order ------------
sub mysql_affected_rows( OpaquePointer $mysql_client )
returns Int
is native('libmysqlclient')
{ ... }
sub mysql_close( OpaquePointer $mysql_client )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_data_seek( OpaquePointer $result_set, Int $row_number )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_error( OpaquePointer $mysql_client)
returns Str
is native('libmysqlclient')
{ ... }
sub mysql_fetch_field( OpaquePointer $result_set )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_fetch_lengths( OpaquePointer $result_set )
returns Positional of Int
is native('libmysqlclient')
{ ... }
sub mysql_fetch_row( OpaquePointer $result_set )
returns Positional of Str
is native('libmysqlclient')
{ ... }
sub mysql_field_count( OpaquePointer $mysql_client )
returns Int
is native('libmysqlclient')
{ ... }
sub mysql_free_result( OpaquePointer $result_set )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_get_client_info( OpaquePointer $mysql_client)
returns Str
is native('libmysqlclient')
{ ... }
sub mysql_init( OpaquePointer $mysql_client )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_library_init( Int $argc, OpaquePointer $argv,
OpaquePointer $group )
returns Int
is native('libmysqlclient')
{ ... }
sub mysql_library_end()
returns OpaquePointer # currently not working, should be void
is native('libmysqlclient')
{ ... }
sub mysql_num_rows( OpaquePointer $result_set )
returns Int
is native('libmysqlclient')
{ ... }
sub mysql_query( OpaquePointer $mysql_client, Str $sql_command )
returns Int
is native('libmysqlclient')
{ ... }
sub mysql_real_connect( OpaquePointer $mysql_client, Str $host, Str $user,
Str $password, Str $database, Int $port, Str $socket, Int $flag )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_stat( OpaquePointer $mysql_client)
returns Str
is native('libmysqlclient')
{ ... }
sub mysql_store_result( OpaquePointer $mysql_client )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
sub mysql_use_result( OpaquePointer $mysql_client )
returns OpaquePointer
is native('libmysqlclient')
{ ... }
#---------------------------
class FakeDBD::mysql::StatementHandle does FakeDBD::StatementHandle {
has $!mysql_client;
has $!statement;
has $!result_set;
has $!row_count;
method execute(*@params) {
# warn "in FakeDBD::mysql::StatementHandle.execute()";
mysql_query( $!mysql_client, $!statement );
return Bool::True;
}
method fetchrow_arrayref() {
my $row_data;
unless defined $!result_set {
$!result_set = mysql_use_result( $!mysql_client);
$!row_count = mysql_num_rows($!result_set);
}
if $!row_count != 0 {
$row_data = [ mysql_fetch_row($!result_set) ];
}
return $row_data;
}
method finish() {
$!result_set = Mu;
}
}
class FakeDBD::mysql::Connection does FakeDBD::Connection {
has $!mysql_client;
method prepare( Str $statement ) {
# warn "in FakeDBD::mysql::Connection.prepare()";
my $statement_handle = FakeDBD::mysql::StatementHandle.bless(
FakeDBD::mysql::StatementHandle.CREATE(),
mysql_client => $!mysql_client,
statement => $statement
);
return $statement_handle;
}
}
class FakeDBD::mysql:auth<mberends>:ver<0.0.1> {
has $.Version = 0.01;
#------------------ methods to be called from FakeDBI ------------------
method connect( Str $user, Str $password, Str $params ) {
# warn "in FakeDBD::mysql.connect('$user',*,'$params')";
my ( $mysql_client, $mysql_error );
unless defined $mysql_client {
$mysql_client = mysql_init( pir::null__P() );
$mysql_error = mysql_error( $mysql_client );
}
my @params = $params.split(';');
my %params;
for @params -> $p {
my ( $key, $value ) = $p.split('=');
%params{$key} = $value;
}
my $host = %params<host> // 'localhost';
my $port = %params<port> // 0;
my $database = %params<database> // 'mysql';
# real_connect() returns either the same client pointer or null
my $result = mysql_real_connect( $mysql_client, $host,
$user, $password, $database, $port, pir::null__P(), 0 );
my $error = mysql_error( $mysql_client );
my $connection;
if $error eq '' {
$connection = FakeDBD::mysql::Connection.bless(
FakeDBD::mysql::Connection.CREATE(),
mysql_client => $mysql_client
);
}
return $connection;
}
}
# warn "module FakeDBD::mysql.pm has loaded";
=begin pod
# 'zavolaj' is a Native Call Interface for Rakudo/Parrot. 'FakeDBI' and
# 'FakeDBD::mysql' are Perl 6 modules that use 'zavolaj' to use the
# standard mysqlclient library. There is a long term Parrot based
# project to develop a new, comprehensive DBI architecture for Parrot
# and Perl 6. FakeDBI is not that, it is a naive rewrite of the
# similarly named Perl 5 modules. Hence the 'Fake' part of the name.
=head1 SEE ALSO
The MySQL 5.1 Reference Manual, C API.
L<http://dev.mysql.com/doc/refman/5.1/en/c-api-function-overview.html>
=end pod