Showing 138 changed files with 111 additions and 15409 deletions
-25
DBIx-Custom-0.0501/Build.PL
... ...
@@ -1,25 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    recommends => {
14
-        'DBD::SQLite' => 1.25,
15
-        'Time::Piece' => 1.15
16
-    },
17
-    requires => {
18
-        'Object::Simple' => 2.0702,
19
-        'DBI'            => 1.605,
20
-    },
21
-    add_to_cleanup      => [ 'DBIx-Custom-*' ],
22
-    create_makefile_pl => 'traditional',
23
-);
24
-
25
-$builder->create_build_script();
-11
DBIx-Custom-0.0501/Changes
... ...
@@ -1,11 +0,0 @@
1
-0.0501
2
-  packaging DBIx::Custom::Result DBIx::Custom::Query DBIx::Custom::MySQL DBIx::Custom::SQLite DBIx::Custom::SQL::Template 
3
-0.0401
4
-  catch up with DBIx::Custom::Result version up
5
-0.0301
6
-  exchange filter argument 'key', 'value' (not backword compatible)
7
-0.0201
8
-  rename tranzaction to transaction
9
-  add filter_off
10
-0.0101
11
-  First release
-15
DBIx-Custom-0.0501/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom
2
-
3
-Custamizable DBI
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-2
DBIx-Custom-0.0501/_build/auto_features
... ...
@@ -1,2 +0,0 @@
1
-do{ my $x = {};
2
-$x; }
-280
DBIx-Custom-0.0501/_build/build_params
... ...
@@ -1,280 +0,0 @@
1
-do{ my $x = [
2
-       {
3
-         'ARGV' => []
4
-       },
5
-       {},
6
-       {
7
-         'verbose' => undef,
8
-         'PL_files' => undef,
9
-         'pollute' => undef,
10
-         'bindoc_dirs' => [
11
-                            'blib/script'
12
-                          ],
13
-         'conflicts' => {},
14
-         'scripts' => undef,
15
-         'recommends' => {
16
-                           'DBD::SQLite' => '1.25',
17
-                           'Time::Piece' => '1.15'
18
-                         },
19
-         'dist_version' => bless( {
20
-                                    'original' => '0.0501',
21
-                                    'version' => [
22
-                                                   0,
23
-                                                   50,
24
-                                                   100
25
-                                                 ]
26
-                                  }, 'Module::Build::Version' ),
27
-         'pod_files' => undef,
28
-         'config_dir' => '_build',
29
-         'sign' => undef,
30
-         'recurse_into' => [],
31
-         'build_bat' => 0,
32
-         'extra_linker_flags' => [],
33
-         'build_class' => 'Module::Build',
34
-         'prereq_action_types' => [
35
-                                    'requires',
36
-                                    'build_requires',
37
-                                    'conflicts',
38
-                                    'recommends'
39
-                                  ],
40
-         'base_dir' => '/root/labo/DBIx-Custom/DBIx-Custom-0.0501',
41
-         'allow_mb_mismatch' => 0,
42
-         'xs_files' => undef,
43
-         'destdir' => undef,
44
-         'metafile' => 'META.yml',
45
-         'mb_version' => '0.31012',
46
-         'use_tap_harness' => 0,
47
-         'test_file_exts' => [
48
-                               '.t'
49
-                             ],
50
-         'dist_name' => 'DBIx-Custom',
51
-         'has_config_data' => undef,
52
-         'install_base' => undef,
53
-         'module_name' => 'DBIx::Custom',
54
-         'recursive_test_files' => undef,
55
-         'libdoc_dirs' => [
56
-                            'blib/lib',
57
-                            'blib/arch'
58
-                          ],
59
-         'perl' => '/usr/bin/perl',
60
-         'dist_author' => [
61
-                            'Yuki Kimoto <kimoto.yuki@gmail.com>'
62
-                          ],
63
-         'use_rcfile' => 1,
64
-         'configure_requires' => {},
65
-         'test_files' => undef,
66
-         'dist_abstract' => undef,
67
-         'create_readme' => undef,
68
-         'prefix_relpaths' => {
69
-                                'core' => {
70
-                                            'libdoc' => [
71
-                                                          'man',
72
-                                                          'man3'
73
-                                                        ],
74
-                                            'script' => [
75
-                                                          'bin'
76
-                                                        ],
77
-                                            'libhtml' => [
78
-                                                           'html'
79
-                                                         ],
80
-                                            'bindoc' => [
81
-                                                          'man',
82
-                                                          'man1'
83
-                                                        ],
84
-                                            'bin' => [
85
-                                                       'bin'
86
-                                                     ],
87
-                                            'arch' => [
88
-                                                        'lib',
89
-                                                        'perl5',
90
-                                                        '5.8.8',
91
-                                                        'i386-linux-thread-multi'
92
-                                                      ],
93
-                                            'binhtml' => [
94
-                                                           'html'
95
-                                                         ],
96
-                                            'lib' => [
97
-                                                       'lib',
98
-                                                       'perl5'
99
-                                                     ]
100
-                                          },
101
-                                'site' => {
102
-                                            'libdoc' => [
103
-                                                          'man',
104
-                                                          'man3'
105
-                                                        ],
106
-                                            'script' => [
107
-                                                          'bin'
108
-                                                        ],
109
-                                            'libhtml' => [
110
-                                                           'html'
111
-                                                         ],
112
-                                            'bindoc' => [
113
-                                                          'man',
114
-                                                          'man1'
115
-                                                        ],
116
-                                            'bin' => [
117
-                                                       'bin'
118
-                                                     ],
119
-                                            'arch' => [
120
-                                                        'lib',
121
-                                                        'perl5',
122
-                                                        'site_perl',
123
-                                                        '5.8.8',
124
-                                                        'i386-linux-thread-multi'
125
-                                                      ],
126
-                                            'binhtml' => [
127
-                                                           'html'
128
-                                                         ],
129
-                                            'lib' => [
130
-                                                       'lib',
131
-                                                       'perl5',
132
-                                                       'site_perl'
133
-                                                     ]
134
-                                          },
135
-                                'vendor' => {
136
-                                              'libdoc' => [
137
-                                                            'man',
138
-                                                            'man3'
139
-                                                          ],
140
-                                              'script' => [
141
-                                                            'bin'
142
-                                                          ],
143
-                                              'libhtml' => [
144
-                                                             'html'
145
-                                                           ],
146
-                                              'bindoc' => [
147
-                                                            'man',
148
-                                                            'man1'
149
-                                                          ],
150
-                                              'bin' => [
151
-                                                         'bin'
152
-                                                       ],
153
-                                              'arch' => [
154
-                                                          'lib',
155
-                                                          'perl5',
156
-                                                          '5.8.8',
157
-                                                          'i386-linux-thread-multi'
158
-                                                        ],
159
-                                              'binhtml' => [
160
-                                                             'html'
161
-                                                           ],
162
-                                              'lib' => [
163
-                                                         'lib',
164
-                                                         'perl5'
165
-                                                       ]
166
-                                            }
167
-                              },
168
-         'meta_merge' => {},
169
-         'get_options' => {},
170
-         'dist_version_from' => 'lib/DBIx/Custom.pm',
171
-         'create_license' => undef,
172
-         'debugger' => undef,
173
-         'html_css' => '',
174
-         'build_elements' => [
175
-                               'PL',
176
-                               'support',
177
-                               'pm',
178
-                               'xs',
179
-                               'pod',
180
-                               'script'
181
-                             ],
182
-         'orig_dir' => '/root/labo/DBIx-Custom/DBIx-Custom-0.0501',
183
-         'include_dirs' => [],
184
-         'installdirs' => 'site',
185
-         'create_makefile_pl' => 'traditional',
186
-         'magic_number' => undef,
187
-         'install_sets' => {
188
-                             'core' => {
189
-                                         'libdoc' => '/usr/share/man/man3',
190
-                                         'script' => '/usr/bin',
191
-                                         'libhtml' => undef,
192
-                                         'bindoc' => '/usr/share/man/man1',
193
-                                         'bin' => '/usr/bin',
194
-                                         'arch' => '/usr/lib/perl5/5.8.8/i386-linux-thread-multi',
195
-                                         'binhtml' => undef,
196
-                                         'lib' => '/usr/lib/perl5/5.8.8'
197
-                                       },
198
-                             'site' => {
199
-                                         'libdoc' => '/usr/share/man/man3',
200
-                                         'script' => '/usr/bin',
201
-                                         'libhtml' => undef,
202
-                                         'bindoc' => '/usr/share/man/man1',
203
-                                         'bin' => '/usr/bin',
204
-                                         'arch' => '/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi',
205
-                                         'binhtml' => undef,
206
-                                         'lib' => '/usr/lib/perl5/site_perl/5.8.8'
207
-                                       },
208
-                             'vendor' => {
209
-                                           'libdoc' => '/usr/share/man/man3',
210
-                                           'script' => '/usr/bin',
211
-                                           'libhtml' => undef,
212
-                                           'bindoc' => '/usr/share/man/man1',
213
-                                           'bin' => '/usr/bin',
214
-                                           'arch' => '/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi',
215
-                                           'binhtml' => undef,
216
-                                           'lib' => '/usr/lib/perl5/vendor_perl/5.8.8'
217
-                                         }
218
-                           },
219
-         'tap_harness_args' => {},
220
-         'install_base_relpaths' => {
221
-                                      'libdoc' => [
222
-                                                    'man',
223
-                                                    'man3'
224
-                                                  ],
225
-                                      'script' => [
226
-                                                    'bin'
227
-                                                  ],
228
-                                      'libhtml' => [
229
-                                                     'html'
230
-                                                   ],
231
-                                      'bindoc' => [
232
-                                                    'man',
233
-                                                    'man1'
234
-                                                  ],
235
-                                      'bin' => [
236
-                                                 'bin'
237
-                                               ],
238
-                                      'arch' => [
239
-                                                  'lib',
240
-                                                  'perl5',
241
-                                                  'i386-linux-thread-multi'
242
-                                                ],
243
-                                      'binhtml' => [
244
-                                                     'html'
245
-                                                   ],
246
-                                      'lib' => [
247
-                                                 'lib',
248
-                                                 'perl5'
249
-                                               ]
250
-                                    },
251
-         'meta_add' => {},
252
-         'create_packlist' => 1,
253
-         'requires' => {
254
-                         'Object::Simple' => '2.0702',
255
-                         'DBI' => '1.605'
256
-                       },
257
-         'install_path' => {},
258
-         'pm_files' => undef,
259
-         'quiet' => undef,
260
-         'script_files' => undef,
261
-         'extra_compiler_flags' => [],
262
-         'build_script' => 'Build',
263
-         'original_prefix' => {
264
-                                'core' => '/usr',
265
-                                'site' => '/usr',
266
-                                'vendor' => '/usr'
267
-                              },
268
-         'c_source' => undef,
269
-         'autosplit' => undef,
270
-         'program_name' => undef,
271
-         'license' => 'perl',
272
-         'build_requires' => {
273
-                               'Test::More' => 0
274
-                             },
275
-         'config' => undef,
276
-         'blib' => 'blib',
277
-         'prefix' => undef
278
-       }
279
-     ];
280
-$x; }
-5
DBIx-Custom-0.0501/_build/cleanup
... ...
@@ -1,5 +0,0 @@
1
-do{ my $x = {
2
-       'blib' => 1,
3
-       'DBIx-Custom-*' => 1
4
-     };
5
-$x; }
-2
DBIx-Custom-0.0501/_build/config_data
... ...
@@ -1,2 +0,0 @@
1
-do{ my $x = {};
2
-$x; }
-2
DBIx-Custom-0.0501/_build/features
... ...
@@ -1,2 +0,0 @@
1
-do{ my $x = {};
2
-$x; }
-1
DBIx-Custom-0.0501/_build/magicnum
... ...
@@ -1 +0,0 @@
1
-793374
-2
DBIx-Custom-0.0501/_build/notes
... ...
@@ -1,2 +0,0 @@
1
-do{ my $x = {};
2
-$x; }
-15
DBIx-Custom-0.0501/_build/prereqs
... ...
@@ -1,15 +0,0 @@
1
-do{ my $x = {
2
-       'build_requires' => {
3
-                             'Test::More' => 0
4
-                           },
5
-       'conflicts' => {},
6
-       'requires' => {
7
-                       'Object::Simple' => '2.0702',
8
-                       'DBI' => '1.605'
9
-                     },
10
-       'recommends' => {
11
-                         'DBD::SQLite' => '1.25',
12
-                         'Time::Piece' => '1.15'
13
-                       }
14
-     };
15
-$x; }
-2
DBIx-Custom-0.0501/_build/runtime_params
... ...
@@ -1,2 +0,0 @@
1
-do{ my $x = {};
2
-$x; }
-1127
DBIx-Custom-0.0501/blib/lib/DBIx/Custom.pm
... ...
@@ -1,1127 +0,0 @@
1
-use 5.008001;
2
-
3
-package DBIx::Custom;
4
-use Object::Simple;
5
-
6
-our $VERSION = '0.0501';
7
-
8
-use Carp 'croak';
9
-use DBI;
10
-use DBIx::Custom::Query;
11
-use DBIx::Custom::Result;
12
-use DBIx::Custom::SQL::Template;
13
-
14
-
15
-### Class-Object Accessors
16
-sub user        : ClassObjectAttr { initialize => {clone => 'scalar'} }
17
-sub password    : ClassObjectAttr { initialize => {clone => 'scalar'} }
18
-sub data_source : ClassObjectAttr { initialize => {clone => 'scalar'} }
19
-sub dbi_options : ClassObjectAttr { initialize => {clone => 'hash', 
20
-                                                   default => sub { {} } } }
21
-sub database    : ClassObjectAttr { initialize => {clone => 'scalar'} }
22
-
23
-sub bind_filter  : ClassObjectAttr { initialize => {clone => 'scalar'} }
24
-sub fetch_filter : ClassObjectAttr { initialize => {clone => 'scalar'} }
25
-
26
-sub no_bind_filters   : ClassObjectAttr { initialize => {clone => 'array'} }
27
-sub no_fetch_filters  : ClassObjectAttr { initialize => {clone => 'array'} }
28
-
29
-sub filters : ClassObjectAttr {
30
-    type => 'hash',
31
-    deref => 1,
32
-    initialize => {
33
-        clone   => 'hash',
34
-        default => sub { {} }
35
-    }
36
-}
37
-
38
-sub formats : ClassObjectAttr {
39
-    type => 'hash',
40
-    deref => 1,
41
-    initialize => {
42
-        clone   => 'hash',
43
-        default => sub { {} }
44
-    }
45
-}
46
-
47
-sub result_class : ClassObjectAttr {
48
-    initialize => {
49
-        clone   => 'scalar',
50
-        default => 'DBIx::Custom::Result'
51
-    }
52
-}
53
-
54
-sub sql_template : ClassObjectAttr {
55
-    initialize => {
56
-        clone   => sub {$_[0] ? $_[0]->clone : undef},
57
-        default => sub {DBIx::Custom::SQL::Template->new}
58
-    }
59
-}
60
-
61
-### Object Accessor
62
-sub dbh          : Attr {}
63
-
64
-
65
-### Methods
66
-
67
-# Add filter
68
-sub add_filter {
69
-    my $invocant = shift;
70
-    
71
-    my %old_filters = $invocant->filters;
72
-    my %new_filters = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
73
-    $invocant->filters(%old_filters, %new_filters);
74
-    return $invocant;
75
-}
76
-
77
-# Add format
78
-sub add_format{
79
-    my $invocant = shift;
80
-    
81
-    my %old_formats = $invocant->formats;
82
-    my %new_formats = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
83
-    $invocant->formats(%old_formats, %new_formats);
84
-    return $invocant;
85
-}
86
-
87
-# Auto commit
88
-sub _auto_commit {
89
-    my $self = shift;
90
-    
91
-    croak("Not yet connect to database") unless $self->dbh;
92
-    
93
-    if (@_) {
94
-        $self->dbh->{AutoCommit} = $_[0];
95
-        return $self;
96
-    }
97
-    return $self->dbh->{AutoCommit};
98
-}
99
-
100
-# Connect
101
-sub connect {
102
-    my $self = shift;
103
-    my $data_source = $self->data_source;
104
-    my $user        = $self->user;
105
-    my $password    = $self->password;
106
-    my $dbi_options  = $self->dbi_options;
107
-    
108
-    my $dbh = eval{DBI->connect(
109
-        $data_source,
110
-        $user,
111
-        $password,
112
-        {
113
-            RaiseError => 1,
114
-            PrintError => 0,
115
-            AutoCommit => 1,
116
-            %{$dbi_options || {} }
117
-        }
118
-    )};
119
-    
120
-    croak $@ if $@;
121
-    
122
-    $self->dbh($dbh);
123
-    return $self;
124
-}
125
-
126
-# DESTROY
127
-sub DESTROY {
128
-    my $self = shift;
129
-    $self->disconnect if $self->connected;
130
-}
131
-
132
-# Is connected?
133
-sub connected {
134
-    my $self = shift;
135
-    return ref $self->{dbh} eq 'DBI::db';
136
-}
137
-
138
-# Disconnect
139
-sub disconnect {
140
-    my $self = shift;
141
-    if ($self->connected) {
142
-        $self->dbh->disconnect;
143
-        delete $self->{dbh};
144
-    }
145
-}
146
-
147
-# Reconnect
148
-sub reconnect {
149
-    my $self = shift;
150
-    $self->disconnect if $self->connected;
151
-    $self->connect;
152
-}
153
-
154
-# Prepare statement handle
155
-sub prepare {
156
-    my ($self, $sql) = @_;
157
-    
158
-    # Connect if not
159
-    $self->connect unless $self->connected;
160
-    
161
-    # Prepare
162
-    my $sth = eval{$self->dbh->prepare($sql)};
163
-    
164
-    # Error
165
-    croak("$@<Your SQL>\n$sql") if $@;
166
-    
167
-    return $sth;
168
-}
169
-
170
-# Execute SQL directly
171
-sub do{
172
-    my ($self, $sql, @bind_values) = @_;
173
-    
174
-    # Connect if not
175
-    $self->connect unless $self->connected;
176
-    
177
-    # Do
178
-    my $ret_val = eval{$self->dbh->do($sql, @bind_values)};
179
-    
180
-    # Error
181
-    if ($@) {
182
-        my $error = $@;
183
-        require Data::Dumper;
184
-        
185
-        my $bind_value_dump
186
-          = Data::Dumper->Dump([\@bind_values], ['*bind_valuds']);
187
-        
188
-        croak("$error<Your SQL>\n$sql\n<Your bind values>\n$bind_value_dump\n");
189
-    }
190
-}
191
-
192
-# Create query
193
-sub create_query {
194
-    my ($self, $template) = @_;
195
-    my $class = ref $self;
196
-    
197
-    # Create query from SQL template
198
-    my $sql_template = $self->sql_template;
199
-    
200
-    # Try to get cached query
201
-    my $query = $class->_query_caches->{$template};
202
-    
203
-    # Create query
204
-    unless ($query) {
205
-        $query = eval{$sql_template->create_query($template)};
206
-        croak($@) if $@;
207
-        
208
-        $query = DBIx::Custom::Query->new($query);
209
-        
210
-        $class->_add_query_cache($template, $query);
211
-    }
212
-    
213
-    # Connect if not
214
-    $self->connect unless $self->connected;
215
-    
216
-    # Prepare statement handle
217
-    my $sth = $self->prepare($query->{sql});
218
-    
219
-    # Set statement handle
220
-    $query->sth($sth);
221
-    
222
-    # Set bind filter
223
-    $query->bind_filter($self->bind_filter);
224
-    
225
-    # Set no filter keys when binding
226
-    $query->no_bind_filters($self->no_bind_filters);
227
-    
228
-    # Set fetch filter
229
-    $query->fetch_filter($self->fetch_filter);
230
-    
231
-    # Set no filter keys when fetching
232
-    $query->no_fetch_filters($self->no_fetch_filters);
233
-    
234
-    return $query;
235
-}
236
-
237
-# Execute query
238
-sub execute {
239
-    my ($self, $query, $params)  = @_;
240
-    $params ||= {};
241
-    
242
-    # First argument is SQL template
243
-    if (!ref $query) {
244
-        my $template = $query;
245
-        $query = $self->create_query($template);
246
-        my $query_edit_cb = $_[3];
247
-        $query_edit_cb->($query) if ref $query_edit_cb eq 'CODE';
248
-    }
249
-    
250
-    # Create bind value
251
-    my $bind_values = $self->_build_bind_values($query, $params);
252
-    
253
-    # Execute
254
-    my $sth = $query->sth;
255
-    my $ret_val = eval{$sth->execute(@$bind_values)};
256
-    
257
-    # Execute error
258
-    if (my $execute_error = $@) {
259
-        require Data::Dumper;
260
-        my $sql              = $query->{sql} || '';
261
-        my $key_infos_dump   = Data::Dumper->Dump([$query->key_infos], ['*key_infos']);
262
-        my $params_dump      = Data::Dumper->Dump([$params], ['*params']);
263
-        
264
-        croak("$execute_error" . 
265
-              "<Your SQL>\n$sql\n" . 
266
-              "<Your parameters>\n$params_dump");
267
-    }
268
-    
269
-    # Return resultset if select statement is executed
270
-    if ($sth->{NUM_OF_FIELDS}) {
271
-        
272
-        # Get result class
273
-        my $result_class = $self->result_class;
274
-        
275
-        # Create result
276
-        my $result = $result_class->new({
277
-            sth              => $sth,
278
-            fetch_filter     => $query->fetch_filter,
279
-            no_fetch_filters => $query->no_fetch_filters
280
-        });
281
-        return $result;
282
-    }
283
-    return $ret_val;
284
-}
285
-
286
-# Build binding values
287
-sub _build_bind_values {
288
-    my ($self, $query, $params) = @_;
289
-    my $key_infos           = $query->key_infos;
290
-    my $bind_filter         = $query->bind_filter;
291
-    my $no_bind_filters_map = $query->_no_bind_filters_map || {};
292
-    
293
-    # binding values
294
-    my @bind_values;
295
-    
296
-    # Create bind values
297
-    KEY_INFOS :
298
-    foreach my $key_info (@$key_infos) {
299
-        # Set variable
300
-        my $access_keys  = $key_info->{access_keys};
301
-        my $original_key = $key_info->{original_key} || '';
302
-        my $table        = $key_info->{table}        || '';
303
-        my $column       = $key_info->{column}       || '';
304
-        
305
-        # Key is found?
306
-        my $found;
307
-        
308
-        # Build bind values
309
-        ACCESS_KEYS :
310
-        foreach my $access_key (@$access_keys) {
311
-            # Root parameter
312
-            my $root_params = $params;
313
-            
314
-            # Search corresponding value
315
-            for (my $i = 0; $i < @$access_key; $i++) {
316
-                # Current key
317
-                my $current_key = $access_key->[$i];
318
-                
319
-                # Last key
320
-                if ($i == @$access_key - 1) {
321
-                    # Key is array reference
322
-                    if (ref $current_key eq 'ARRAY') {
323
-                        # Filtering 
324
-                        if ($bind_filter &&
325
-                            !$no_bind_filters_map->{$original_key})
326
-                        {
327
-                            push @bind_values, 
328
-                                 $bind_filter->($root_params->[$current_key->[0]], 
329
-                                                $original_key,
330
-                                                $table, $column);
331
-                        }
332
-                        # Not filtering
333
-                        else {
334
-                            push @bind_values,
335
-                                 scalar $root_params->[$current_key->[0]];
336
-                        }
337
-                    }
338
-                    # Key is string
339
-                    else {
340
-                        # Key is not found
341
-                        next ACCESS_KEYS
342
-                          unless exists $root_params->{$current_key};
343
-                        
344
-                        # Filtering
345
-                        if ($bind_filter &&
346
-                            !$no_bind_filters_map->{$original_key}) 
347
-                        {
348
-                            push @bind_values,
349
-                                 $bind_filter->($root_params->{$current_key},
350
-                                                $original_key,
351
-                                                $table, $column);
352
-                        }
353
-                        # Not filtering
354
-                        else {
355
-                            push @bind_values,
356
-                                 scalar $root_params->{$current_key};
357
-                        }
358
-                    }
359
-                    
360
-                    # Key is found
361
-                    $found = 1;
362
-                    next KEY_INFOS;
363
-                }
364
-                # First or middle key
365
-                else {
366
-                    # Key is array reference
367
-                    if (ref $current_key eq 'ARRAY') {
368
-                        # Go next key
369
-                        $root_params = $root_params->[$current_key->[0]];
370
-                    }
371
-                    # Key is string
372
-                    else {
373
-                        # Not found
374
-                        next ACCESS_KEYS
375
-                          unless exists $root_params->{$current_key};
376
-                        
377
-                        # Go next key
378
-                        $root_params = $root_params->{$current_key};
379
-                    }
380
-                }
381
-            }
382
-        }
383
-        
384
-        # Key is not found
385
-        unless ($found) {
386
-            require Data::Dumper;
387
-            my $key_info_dump  = Data::Dumper->Dump([$key_info], ['*key_info']);
388
-            my $params_dump    = Data::Dumper->Dump([$params], ['*params']);
389
-            croak("Corresponding key is not found in your parameters\n" . 
390
-                  "<Key information>\n$key_info_dump\n\n" .
391
-                  "<Your parameters>\n$params_dump\n");
392
-        }
393
-    }
394
-    return \@bind_values;
395
-}
396
-
397
-# Run transaction
398
-sub run_transaction {
399
-    my ($self, $transaction) = @_;
400
-    
401
-    # Check auto commit
402
-    croak("AutoCommit must be true before transaction start")
403
-      unless $self->_auto_commit;
404
-    
405
-    # Auto commit off
406
-    $self->_auto_commit(0);
407
-    
408
-    # Run transaction
409
-    eval {$transaction->()};
410
-    
411
-    # Tranzaction error
412
-    my $transaction_error = $@;
413
-    
414
-    # Tranzaction is failed.
415
-    if ($transaction_error) {
416
-        # Rollback
417
-        eval{$self->dbh->rollback};
418
-        
419
-        # Rollback error
420
-        my $rollback_error = $@;
421
-        
422
-        # Auto commit on
423
-        $self->_auto_commit(1);
424
-        
425
-        if ($rollback_error) {
426
-            # Rollback is failed
427
-            croak("${transaction_error}Rollback is failed : $rollback_error");
428
-        }
429
-        else {
430
-            # Rollback is success
431
-            croak("${transaction_error}Rollback is success");
432
-        }
433
-    }
434
-    # Tranzaction is success
435
-    else {
436
-        # Commit
437
-        eval{$self->dbh->commit};
438
-        my $commit_error = $@;
439
-        
440
-        # Auto commit on
441
-        $self->_auto_commit(1);
442
-        
443
-        # Commit is failed
444
-        croak($commit_error) if $commit_error;
445
-    }
446
-}
447
-
448
-# Get last insert id
449
-sub last_insert_id {
450
-    my $self = shift;
451
-    
452
-    # Not connected
453
-    croak("Not yet connect to database")
454
-      unless $self->connected;
455
-    
456
-    return $self->dbh->last_insert_id(@_);
457
-}
458
-
459
-# Insert
460
-sub insert {
461
-    my ($self, $table, $insert_params, $query_edit_cb) = @_;
462
-    $table         ||= '';
463
-    $insert_params ||= {};
464
-    
465
-    # Insert keys
466
-    my @insert_keys = keys %$insert_params;
467
-    
468
-    # Not exists insert keys
469
-    croak("Key-value pairs for insert must be specified to 'insert' second argument")
470
-      unless @insert_keys;
471
-    
472
-    # Templte for insert
473
-    my $template = "insert into $table {insert " . join(' ', @insert_keys) . '}';
474
-    
475
-    # Create query
476
-    my $query = $self->create_query($template);
477
-    
478
-    # Query edit callback must be code reference
479
-    croak("Query edit callback must be code reference")
480
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
481
-    
482
-    # Query edit if need
483
-    $query_edit_cb->($query) if $query_edit_cb;
484
-    
485
-    # Execute query
486
-    my $ret_val = $self->execute($query, $insert_params);
487
-    
488
-    return $ret_val;
489
-}
490
-
491
-# Update
492
-sub update {
493
-    my ($self, $table, $update_params,
494
-        $where_params, $query_edit_cb, $options) = @_;
495
-    
496
-    $table         ||= '';
497
-    $update_params ||= {};
498
-    $where_params  ||= {};
499
-    
500
-    # Update keys
501
-    my @update_keys = keys %$update_params;
502
-    
503
-    # Not exists update kyes
504
-    croak("Key-value pairs for update must be specified to 'update' second argument")
505
-      unless @update_keys;
506
-    
507
-    # Where keys
508
-    my @where_keys = keys %$where_params;
509
-    
510
-    # Not exists where keys
511
-    croak("Key-value pairs for where clause must be specified to 'update' third argument")
512
-      if !@where_keys && !$options->{allow_update_all};
513
-    
514
-    # Update clause
515
-    my $update_clause = '{update ' . join(' ', @update_keys) . '}';
516
-    
517
-    # Where clause
518
-    my $where_clause = '';
519
-    if (@where_keys) {
520
-        $where_clause = 'where ';
521
-        foreach my $where_key (@where_keys) {
522
-            $where_clause .= "{= $where_key} and ";
523
-        }
524
-        $where_clause =~ s/ and $//;
525
-    }
526
-    
527
-    # Template for update
528
-    my $template = "update $table $update_clause $where_clause";
529
-    
530
-    # Create query
531
-    my $query = $self->create_query($template);
532
-    
533
-    # Query edit callback must be code reference
534
-    croak("Query edit callback must be code reference")
535
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
536
-    
537
-    # Query edit if need
538
-    $query_edit_cb->($query) if $query_edit_cb;
539
-    
540
-    # Rearrange parammeters
541
-    my $params = {'#update' => $update_params, %$where_params};
542
-    
543
-    # Execute query
544
-    my $ret_val = $self->execute($query, $params);
545
-    
546
-    return $ret_val;
547
-}
548
-
549
-# Update all rows
550
-sub update_all {
551
-    my ($self, $table, $update_params, $query_edit_cb) = @_;
552
-    
553
-    return $self->update($table, $update_params, {}, $query_edit_cb,
554
-                         {allow_update_all => 1});
555
-}
556
-
557
-# Delete
558
-sub delete {
559
-    my ($self, $table, $where_params, $query_edit_cb, $options) = @_;
560
-    $table        ||= '';
561
-    $where_params ||= {};
562
-    
563
-    # Where keys
564
-    my @where_keys = keys %$where_params;
565
-    
566
-    # Not exists where keys
567
-    croak("Key-value pairs for where clause must be specified to 'delete' second argument")
568
-      if !@where_keys && !$options->{allow_delete_all};
569
-    
570
-    # Where clause
571
-    my $where_clause = '';
572
-    if (@where_keys) {
573
-        $where_clause = 'where ';
574
-        foreach my $where_key (@where_keys) {
575
-            $where_clause .= "{= $where_key} and ";
576
-        }
577
-        $where_clause =~ s/ and $//;
578
-    }
579
-    
580
-    # Template for delete
581
-    my $template = "delete from $table $where_clause";
582
-    
583
-    # Create query
584
-    my $query = $self->create_query($template);
585
-    
586
-    # Query edit callback must be code reference
587
-    croak("Query edit callback must be code reference")
588
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
589
-    
590
-    # Query edit if need
591
-    $query_edit_cb->($query) if $query_edit_cb;
592
-    
593
-    # Execute query
594
-    my $ret_val = $self->execute($query, $where_params);
595
-    
596
-    return $ret_val;
597
-}
598
-
599
-# Delete all rows
600
-sub delete_all {
601
-    my ($self, $table) = @_;
602
-    return $self->delete($table, {}, undef, {allow_delete_all => 1});
603
-}
604
-
605
-sub _select_usage { return << 'EOS' }
606
-Your select arguments is wrong.
607
-select usage:
608
-$dbi->select(
609
-    $table,                # must be string or array ref
610
-    [@$columns],           # must be array reference. this is optional
611
-    {%$where_params},      # must be hash reference.  this is optional
612
-    $append_statement,     # must be string.          this is optional
613
-    $query_edit_callback   # must be code reference.  this is optional
614
-);
615
-EOS
616
-
617
-sub select {
618
-    my $self = shift;
619
-    
620
-    # Check argument
621
-    croak($self->_select_usage) unless @_;
622
-    
623
-    # Arguments
624
-    my $tables = shift || '';
625
-    $tables    = [$tables] unless ref $tables;
626
-    
627
-    my $columns          = ref $_[0] eq 'ARRAY' ? shift : [];
628
-    my $where_params     = ref $_[0] eq 'HASH'  ? shift : {};
629
-    my $append_statement = $_[0] && !ref $_[0]  ? shift : '';
630
-    my $query_edit_cb    = shift if ref $_[0] eq 'CODE';
631
-    
632
-    # Check rest argument
633
-    croak($self->_select_usage) if @_;
634
-    
635
-    # SQL template for select statement
636
-    my $template = 'select ';
637
-    
638
-    # Join column clause
639
-    if (@$columns) {
640
-        foreach my $column (@$columns) {
641
-            $template .= "$column, ";
642
-        }
643
-        $template =~ s/, $/ /;
644
-    }
645
-    else {
646
-        $template .= '* ';
647
-    }
648
-    
649
-    # Join table
650
-    $template .= 'from ';
651
-    foreach my $table (@$tables) {
652
-        $template .= "$table, ";
653
-    }
654
-    $template =~ s/, $/ /;
655
-    
656
-    # Where clause keys
657
-    my @where_keys = keys %$where_params;
658
-    
659
-    # Join where clause
660
-    if (@where_keys) {
661
-        $template .= 'where ';
662
-        foreach my $where_key (@where_keys) {
663
-            $template .= "{= $where_key} and ";
664
-        }
665
-    }
666
-    $template =~ s/ and $//;
667
-    
668
-    # Append something to last of statement
669
-    if ($append_statement =~ s/^where //) {
670
-        if (@where_keys) {
671
-            $template .= " and $append_statement";
672
-        }
673
-        else {
674
-            $template .= " where $append_statement";
675
-        }
676
-    }
677
-    else {
678
-        $template .= " $append_statement";
679
-    }
680
-    
681
-    # Create query
682
-    my $query = $self->create_query($template);
683
-    
684
-    # Query edit
685
-    $query_edit_cb->($query) if $query_edit_cb;
686
-    
687
-    # Execute query
688
-    my $result = $self->execute($query, $where_params);
689
-    
690
-    return $result;
691
-}
692
-
693
-sub _query_caches     : ClassAttr { type => 'hash',
694
-                                    auto_build => sub {shift->_query_caches({}) } }
695
-                                    
696
-sub _query_cache_keys : ClassAttr { type => 'array',
697
-                                    auto_build => sub {shift->_query_cache_keys([])} }
698
-                                    
699
-sub query_cache_max   : ClassAttr { auto_build => sub {shift->query_cache_max(50)} }
700
-
701
-# Add query cahce
702
-sub _add_query_cache {
703
-    my ($class, $template, $query) = @_;
704
-    my $query_cache_keys = $class->_query_cache_keys;
705
-    my $query_caches     = $class->_query_caches;
706
-    
707
-    return $class if $query_caches->{$template};
708
-    
709
-    $query_caches->{$template} = $query;
710
-    push @$query_cache_keys, $template;
711
-    
712
-    my $overflow = @$query_cache_keys - $class->query_cache_max;
713
-    
714
-    for (my $i = 0; $i < $overflow; $i++) {
715
-        my $template = shift @$query_cache_keys;
716
-        delete $query_caches->{$template};
717
-    }
718
-    
719
-    return $class;
720
-}
721
-
722
-# Both bind_filter and fetch_filter off
723
-sub filter_off {
724
-    my $self = shift;
725
-    
726
-    # filter off
727
-    $self->bind_filter(undef);
728
-    $self->fetch_filter(undef);
729
-    
730
-    return $self;
731
-}
732
-
733
-Object::Simple->build_class;
734
-
735
-=head1 NAME
736
-
737
-DBIx::Custom - Customizable simple DBI
738
-
739
-=head1 VERSION
740
-
741
-Version 0.0501
742
-
743
-=head1 CAUTION
744
-
745
-This module is now experimental stage.
746
-
747
-I want you to try this module
748
-because I want this module stable, and not to damage your DB data by this module bug.
749
-
750
-Please tell me bug if you find
751
-
752
-=head1 SYNOPSIS
753
-
754
-  my $dbi = DBIx::Custom->new;
755
-  
756
-  my $query = $dbi->create_query($template);
757
-  $dbi->execute($query);
758
-
759
-=head1 CLASS-OBJECT ACCESSORS
760
-
761
-=head2 user
762
-
763
-    # Set and get database user name
764
-    $self = $dbi->user($user);
765
-    $user = $dbi->user;
766
-    
767
-    # Sample
768
-    $dbi->user('taro');
769
-
770
-=head2 password
771
-
772
-    # Set and get database password
773
-    $self     = $dbi->password($password);
774
-    $password = $dbi->password;
775
-    
776
-    # Sample
777
-    $dbi->password('lkj&le`@s');
778
-
779
-=head2 data_source
780
-
781
-    # Set and get database data source
782
-    $self        = $dbi->data_source($data_soruce);
783
-    $data_source = $dbi->data_source;
784
-    
785
-    # Sample(SQLite)
786
-    $dbi->data_source(dbi:SQLite:dbname=$database);
787
-    
788
-    # Sample(MySQL);
789
-    $dbi->data_source("dbi:mysql:dbname=$database");
790
-    
791
-    # Sample(PostgreSQL)
792
-    $dbi->data_source("dbi:Pg:dbname=$database");
793
-    
794
-=head2 database
795
-
796
-    # Set and get database name
797
-    $self     = $dbi->database($database);
798
-    $database = $dbi->database;
799
-
800
-This method will be used in subclass connect method.
801
-
802
-=head2 dbi_options
803
-
804
-    # Set and get DBI option
805
-    $self       = $dbi->dbi_options({$options => $value, ...});
806
-    $dbi_options = $dbi->dbi_options;
807
-
808
-    # Sample
809
-    $dbi->dbi_options({PrintError => 0, RaiseError => 1});
810
-
811
-dbi_options is used when you connect database by using connect.
812
-
813
-=head2 prepare
814
-
815
-    $sth = $dbi->prepare($sql);
816
-
817
-This method is same as DBI::prepare
818
-
819
-=head2 do
820
-
821
-    $dbi->do($sql, @bind_values);
822
-
823
-This method is same as DBI::do
824
-
825
-=head2 sql_template
826
-
827
-    # Set and get SQL::Template object
828
-    $self         = $dbi->sql_template($sql_template);
829
-    $sql_template = $dbi->sql_template;
830
-    
831
-    # Sample
832
-    $dbi->sql_template(DBI::Cutom::SQL::Template->new);
833
-
834
-=head2 filters
835
-
836
-    # Set and get filters
837
-    $self    = $dbi->filters($filters);
838
-    $filters = $dbi->filters;
839
-
840
-=head2 formats
841
-
842
-    # Set and get formats
843
-    $self    = $dbi->formats($formats);
844
-    $formats = $dbi->formats;
845
-    
846
-=head2 bind_filter
847
-
848
-    # Set and get binding filter
849
-    $self        = $dbi->bind_filter($bind_filter);
850
-    $bind_filter = $dbi->bind_filter
851
-
852
-    # Sample
853
-    $dbi->bind_filter($self->filters->{default_bind_filter});
854
-    
855
-
856
-you can get DBI database handle if you need.
857
-
858
-=head2 fetch_filter
859
-
860
-    # Set and get Fetch filter
861
-    $self         = $dbi->fetch_filter($fetch_filter);
862
-    $fetch_filter = $dbi->fetch_filter;
863
-
864
-    # Sample
865
-    $dbi->fetch_filter($self->filters->{default_fetch_filter});
866
-
867
-=head2 no_bind_filters
868
-
869
-    # Set and get no filter keys when binding
870
-    $self            = $dbi->no_bind_filters($no_bind_filters);
871
-    $no_bind_filters = $dbi->no_bind_filters;
872
-
873
-=head2 no_fetch_filters
874
-
875
-    # Set and get no filter keys when fetching
876
-    $self             = $dbi->no_fetch_filters($no_fetch_filters);
877
-    $no_fetch_filters = $dbi->no_fetch_filters;
878
-
879
-=head2 result_class
880
-
881
-    # Set and get resultset class
882
-    $self         = $dbi->result_class($result_class);
883
-    $result_class = $dbi->result_class;
884
-    
885
-    # Sample
886
-    $dbi->result_class('DBIx::Custom::Result');
887
-
888
-=head2 dbh
889
-
890
-    # Get database handle
891
-    $dbh = $self->dbh;
892
-
893
-=head1 METHODS
894
-
895
-=head2 connect
896
-
897
-    # Connect to database
898
-    $self = $dbi->connect;
899
-    
900
-    # Sample
901
-    $dbi = DBIx::Custom->new(user => 'taro', password => 'lji8(', 
902
-                            data_soruce => "dbi:mysql:dbname=$database");
903
-    $dbi->connect;
904
-
905
-=head2 disconnect
906
-
907
-    # Disconnect database
908
-    $dbi->disconnect;
909
-
910
-If database is already disconnected, this method do noting.
911
-
912
-=head2 reconnect
913
-
914
-    # Reconnect
915
-    $dbi->reconnect;
916
-
917
-=head2 connected
918
-
919
-    # Check connected
920
-    $dbi->connected
921
-    
922
-=head2 filter_off
923
-
924
-    # bind_filter and fitch_filter off
925
-    $self->filter_off;
926
-    
927
-This is equeal to
928
-    
929
-    $self->bind_filter(undef);
930
-    $self->fetch_filter(undef);
931
-
932
-=head2 add_filter
933
-
934
-    # Add filter (hash ref or hash can be recieve)
935
-    $self = $dbi->add_filter({$filter_name => $filter, ...});
936
-    $self = $dbi->add_filter($filetr_name => $filter, ...);
937
-    
938
-    # Sample
939
-    $dbi->add_filter(
940
-        decode_utf8 => sub {
941
-            my ($key, $value, $table, $column) = @_;
942
-            return Encode::decode('UTF-8', $value);
943
-        },
944
-        datetime_to_string => sub {
945
-            my ($key, $value, $table, $column) = @_;
946
-            return $value->strftime('%Y-%m-%d %H:%M:%S')
947
-        },
948
-        default_bind_filter => sub {
949
-            my ($key, $value, $table, $column) = @_;
950
-            if (ref $value eq 'Time::Piece') {
951
-                return $dbi->filters->{datetime_to_string}->($value);
952
-            }
953
-            else {
954
-                return $dbi->filters->{decode_utf8}->($value);
955
-            }
956
-        },
957
-        
958
-        encode_utf8 => sub {
959
-            my ($key, $value) = @_;
960
-            return Encode::encode('UTF-8', $value);
961
-        },
962
-        string_to_datetime => sub {
963
-            my ($key, $value) = @_;
964
-            return DateTime::Format::MySQL->parse_datetime($value);
965
-        },
966
-        default_fetch_filter => sub {
967
-            my ($key, $value, $type, $sth, $i) = @_;
968
-            if ($type eq 'DATETIME') {
969
-                return $dbi->filters->{string_to_datetime}->($value);
970
-            }
971
-            else {
972
-                return $dbi->filters->{encode_utf8}->($value);
973
-            }
974
-        }
975
-    );
976
-
977
-add_filter add filter to filters
978
-
979
-=head2 add_format
980
-
981
-    $dbi->add_format(date => '%Y:%m:%d');
982
-
983
-=head2 create_query
984
-    
985
-    # Create Query object from SQL template
986
-    my $query = $dbi->create_query($template);
987
-    
988
-=head2 execute
989
-
990
-    # Parse SQL template and execute SQL
991
-    $result = $dbi->query($query, $params);
992
-    $result = $dbi->query($template, $params); # Shorcut
993
-    
994
-    # Sample
995
-    $result = $dbi->query("select * from authors where {= name} and {= age}", 
996
-                          {author => 'taro', age => 19});
997
-    
998
-    while (my @row = $result->fetch) {
999
-        # do something
1000
-    }
1001
-
1002
-See also L<DBIx::Custom::SQL::Template>
1003
-
1004
-=head2 run_transaction
1005
-
1006
-    # Run transaction
1007
-    $dbi->run_transaction(sub {
1008
-        # do something
1009
-    });
1010
-
1011
-If transaction is success, commit is execute. 
1012
-If tranzation is died, rollback is execute.
1013
-
1014
-=head2 insert
1015
-
1016
-    # Insert
1017
-    $dbi->insert($table, $insert_values);
1018
-    
1019
-    # Sample
1020
-    $dbi->insert('books', {title => 'Perl', author => 'Taro'});
1021
-
1022
-=head2 update
1023
-
1024
-    # Update
1025
-    $dbi->update($table, $update_values, $where);
1026
-    
1027
-    # Sample
1028
-    $dbi->update('books', {title => 'Perl', author => 'Taro'}, {id => 5});
1029
-
1030
-=head2 update_all
1031
-
1032
-    # Update all rows
1033
-    $dbi->update($table, $updat_values);
1034
-
1035
-=head2 delete
1036
-
1037
-    # Delete
1038
-    $dbi->delete($table, $where);
1039
-    
1040
-    # Sample
1041
-    $dbi->delete('Books', {id => 5});
1042
-
1043
-=head2 delete_all
1044
-
1045
-    # Delete all rows
1046
-    $dbi->delete_all($table);
1047
-
1048
-=head2 last_insert_id
1049
-
1050
-    # Get last insert id
1051
-    $last_insert_id = $dbi->last_insert_id;
1052
-    
1053
-This method is same as DBI last_insert_id;
1054
-
1055
-=head2 select
1056
-    
1057
-    # Select
1058
-    $dbi->select(
1059
-        $table,                # must be string or array;
1060
-        [@$columns],           # must be array reference. this is optional
1061
-        {%$where_params},      # must be hash reference.  this is optional
1062
-        $append_statement,     # must be string.          this is optional
1063
-        $query_edit_callback   # must be code reference.  this is optional
1064
-    );
1065
-    
1066
-    # Sample
1067
-    $dbi->select(
1068
-        'Books',
1069
-        ['title', 'author'],
1070
-        {id => 1},
1071
-        "for update",
1072
-        sub {
1073
-            my $query = shift;
1074
-            $query->bind_filter(sub {
1075
-                # ...
1076
-            });
1077
-        }
1078
-    );
1079
-    
1080
-    # The way to join multi tables
1081
-    $dbi->select(
1082
-        ['table1', 'table2'],
1083
-        ['table1.id as table1_id', 'title'],
1084
-        {table1.id => 1},
1085
-        "where table1.id = table2.id",
1086
-    );
1087
-
1088
-=head1 Class Accessors
1089
-
1090
-=head2 query_cache_max
1091
-
1092
-    # Max query cache count
1093
-    $class           = $class->query_cache_max($query_cache_max);
1094
-    $query_cache_max = $class->query_cache_max;
1095
-    
1096
-    # Sample
1097
-    DBIx::Custom->query_cache_max(50);
1098
-
1099
-=head1 CAUTION
1100
-
1101
-DBIx::Custom have DIB object internal.
1102
-This module is work well in the following DBI condition.
1103
-
1104
-    1. AutoCommit is true
1105
-    2. RaiseError is true
1106
-
1107
-By default, Both AutoCommit and RaiseError is true.
1108
-You must not change these mode not to damage your data.
1109
-
1110
-If you change these mode, 
1111
-you cannot get correct error message, 
1112
-or run_transaction may fail.
1113
-
1114
-=head1 AUTHOR
1115
-
1116
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
1117
-
1118
-Github L<http://github.com/yuki-kimoto>
1119
-
1120
-=head1 COPYRIGHT & LICENSE
1121
-
1122
-Copyright 2009 Yuki Kimoto, all rights reserved.
1123
-
1124
-This program is free software; you can redistribute it and/or modify it
1125
-under the same terms as Perl itself.
1126
-
1127
-=cut
-117
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/Basic.pm
... ...
@@ -1,117 +0,0 @@
1
-package DBIx::Custom::Basic;
2
-use 5.008001;
3
-use base 'DBIx::Custom';
4
-use Encode qw/decode encode/;
5
-
6
-use warnings;
7
-use strict;
8
-
9
-my $class = __PACKAGE__;
10
-
11
-$class->add_filter(
12
-    encode_utf8 => sub {
13
-        my $value = shift;
14
-        utf8::upgrade($value) unless Encode::is_utf8($value);
15
-        return encode('UTF-8', $value);
16
-    },
17
-    decode_utf8 => sub { decode('UTF-8', shift) }
18
-);
19
-
20
-$class->add_format(
21
-    'SQL99_date'        => '%Y-%m-%d',
22
-    'SQL99_datetime'    => '%Y-%m-%d %H:%M:%S',
23
-    'SQL99_time'        => '%H:%M:%S',
24
-    'ISO-8601_date'     => '%Y-%m-%d',
25
-    'ISO-8601_datetime' => '%Y-%m-%dT%H:%M:%S',
26
-    'ISO-8601_time'     => '%H:%M:%S',
27
-);
28
-
29
-# Methods
30
-sub utf8_filter_on {
31
-    my $self = shift;
32
-    $self->bind_filter($self->filters->{encode_utf8});
33
-    $self->fetch_filter($self->filters->{decode_utf8});
34
-}
35
-
36
-1;
37
-
38
-=head1 NAME
39
-
40
-DBIx::Custom::Basic - DBIx::Custom basic implementation
41
-
42
-=head1 Version
43
-
44
-Version 0.0201
45
-
46
-=head1 See DBIx::Custom documentation
47
-
48
-This class is L<DBIx::Custom> subclass.
49
-
50
-You can use all methods of L<DBIx::Custom>
51
-
52
-Please see L<DBIx::Custom> documentation
53
-
54
-=head1 Filters
55
-
56
-=head2 encode_utf8
57
-
58
-    # Encode to UTF-8 byte stream (utf8::upgrade is done if need)
59
-    $dbi->filters->{encode_utf8}->($value);
60
-    
61
-This filter is generally used as bind filter
62
-
63
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
64
-
65
-=head2 decode_utf8
66
-
67
-    # Decode to perl internal string
68
-    $dbi->filters->{decode_utf8}->($value);
69
-    
70
-This filter is generally used as fetch filter
71
-
72
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
73
-
74
-=head2 Formats
75
-    
76
-strptime formats is available
77
-    
78
-    # format name        format
79
-    'SQL99_date'         '%Y-%m-%d',
80
-    'SQL99_datetime'     '%Y-%m-%d %H:%M:%S',
81
-    'SQL99_time'         '%H:%M:%S',
82
-    'ISO-8601_date'      '%Y-%m-%d',
83
-    'ISO-8601_datetime'  '%Y-%m-%dT%H:%M:%S',
84
-    'ISO-8601_time'      '%H:%M:%S',
85
-
86
-You get format as the following
87
-
88
-    my $format = $dbi->formats->{$format_name};
89
-
90
-=head1 Methods
91
-
92
-=head2 utf8_filter_on
93
-
94
-    # Encode and decode utf8 filter on
95
-    $dbi->utf8_filter_on;
96
-
97
-This equel to
98
-
99
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
100
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
101
-
102
-=head1 AUTHOR
103
-
104
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
105
-
106
-Github L<http://github.com/yuki-kimoto>
107
-
108
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
109
-
110
-=head1 COPYRIGHT & LICENSE
111
-
112
-Copyright 2009 Yuki Kimoto, all rights reserved.
113
-
114
-This program is free software; you can redistribute it and/or modify it
115
-under the same terms as Perl itself.
116
-
117
-=cut
-101
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/Query.pm
... ...
@@ -1,101 +0,0 @@
1
-package DBIx::Custom::Query;
2
-use Object::Simple;
3
-
4
-sub sql             : Attr {}
5
-sub key_infos       : Attr {}
6
-sub bind_filter     : Attr {}
7
-sub fetch_filter     : Attr {}
8
-sub sth             : Attr {}
9
-
10
-sub no_bind_filters      : Attr { type => 'array', trigger => sub {
11
-    my $self = shift;
12
-    my $no_bind_filters = $self->no_bind_filters || [];
13
-    my %no_bind_filters_map = map {$_ => 1} @{$no_bind_filters};
14
-    $self->_no_bind_filters_map(\%no_bind_filters_map);
15
-}}
16
-sub _no_bind_filters_map : Attr {default => sub { {} }}
17
-
18
-sub no_fetch_filters     : Attr { type => 'array', default => sub { [] } }
19
-
20
-Object::Simple->build_class;
21
-
22
-=head1 NAME
23
-
24
-DBIx::Custom::Query - Query object for DBIx::Custom
25
-
26
-=head1 VERSION
27
-
28
-Version 0.0101
29
-
30
-=head1 SYNOPSIS
31
-
32
-    # Create query
33
-    my $dbi = DBIx::Custom->new;
34
-    my $query = $dbi->create_query($template);
35
-    
36
-    # Set query attributes
37
-    $query->bind_filter($dbi->filters->{default_bind_filter});
38
-    $query->no_bind_filters('title', 'author');
39
-    
40
-    $query->fetch_filter($dbi->filters->{default_fetch_filter});
41
-    $query->no_fetch_filters('title', 'author');
42
-    
43
-    # Execute query
44
-    $dbi->execute($query, $params);
45
-
46
-=head1 OBJECT ACCESSORS
47
-
48
-=head2 sth
49
-
50
-    # Set and get statement handle
51
-    $self = $query->sth($sql);
52
-    $sth  = $query->sth;
53
-
54
-=head2 sql
55
-
56
-    # Set and get SQL
57
-    $self = $query->sql($sql);
58
-    $sql  = $query->sql;
59
-
60
-=head2 bind_filter
61
-
62
-    # Set and get bind filter
63
-    $self        = $query->bind_filter($bind_filter);
64
-    $bind_filter = $query->bind_filter;
65
-
66
-=head2 no_bind_filters
67
-
68
-    # Set and get keys of no filtering
69
-    $self            = $query->no_bind_filters($no_filters);
70
-    $no_bind_filters = $query->no_bind_filters;
71
-
72
-=head2 fetch_filter
73
-
74
-    # Set and get fetch filter
75
-    $self        = $query->fetch_filter($fetch_filter);
76
-    $fetch_filter = $query->fetch_filter;
77
-
78
-=head2 no_fetch_filters
79
-
80
-    # Set and get keys of no filtering
81
-    $self            = $query->no_fetch_filters($no_filters);
82
-    $no_fetch_filters = $query->no_fetch_filters;
83
-
84
-=head2 key_infos
85
-
86
-    # Set and get key informations
87
-    $self      = $query->key_infos($key_infos);
88
-    $key_infos = $query->key_infos;
89
-
90
-=head1 AUTHOR
91
-
92
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
93
-
94
-Github L<http://github.com/yuki-kimoto>
95
-
96
-=head1 COPYRIGHT & LICENSE
97
-
98
-Copyright 2009 Yuki Kimoto, all rights reserved.
99
-
100
-This program is free software; you can redistribute it and/or modify it
101
-under the same terms as Perl itself.
-384
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/Result.pm
... ...
@@ -1,384 +0,0 @@
1
-package DBIx::Custom::Result;
2
-use Object::Simple;
3
-use strict;
4
-use warnings;
5
-use Carp 'croak';
6
-
7
-# Attributes
8
-sub sth              : Attr {}
9
-sub fetch_filter     : Attr {}
10
-sub no_fetch_filters      : Attr { type => 'array', trigger => sub {
11
-    my $self = shift;
12
-    my $no_fetch_filters = $self->no_fetch_filters || [];
13
-    my %no_fetch_filters_map = map {$_ => 1} @{$no_fetch_filters};
14
-    $self->_no_fetch_filters_map(\%no_fetch_filters_map);
15
-}}
16
-sub _no_fetch_filters_map : Attr {default => sub { {} }}
17
-
18
-# Fetch (array)
19
-sub fetch {
20
-    my ($self, $type) = @_;
21
-    my $sth = $self->sth;
22
-    my $fetch_filter = $self->fetch_filter;
23
-    
24
-    # Fetch
25
-    my $row = $sth->fetchrow_arrayref;
26
-    
27
-    # Cannot fetch
28
-    return unless $row;
29
-    
30
-    # Filter
31
-    if ($fetch_filter) {
32
-        my $keys  = $sth->{NAME_lc};
33
-        my $types = $sth->{TYPE};
34
-        for (my $i = 0; $i < @$keys; $i++) {
35
-            next if $self->_no_fetch_filters_map->{$keys->[$i]};
36
-            $row->[$i]= $fetch_filter->($row->[$i], $keys->[$i], $types->[$i],
37
-                                        $sth, $i);
38
-        }
39
-    }
40
-    return wantarray ? @$row : $row;
41
-}
42
-
43
-# Fetch (hash)
44
-sub fetch_hash {
45
-    my $self = shift;
46
-    my $sth = $self->sth;
47
-    my $fetch_filter = $self->fetch_filter;
48
-    
49
-    # Fetch
50
-    my $row = $sth->fetchrow_arrayref;
51
-    
52
-    # Cannot fetch
53
-    return unless $row;
54
-    
55
-    # Keys
56
-    my $keys  = $sth->{NAME_lc};
57
-    
58
-    # Filter
59
-    my $row_hash = {};
60
-    if ($fetch_filter) {
61
-        my $types = $sth->{TYPE};
62
-        for (my $i = 0; $i < @$keys; $i++) {
63
-            if ($self->_no_fetch_filters_map->{$keys->[$i]}) {
64
-                $row_hash->{$keys->[$i]} = $row->[$i];
65
-            }
66
-            else {
67
-                $row_hash->{$keys->[$i]}
68
-                  = $fetch_filter->($row->[$i], $keys->[$i],
69
-                                    $types->[$i], $sth, $i);
70
-            }
71
-        }
72
-    }
73
-    
74
-    # No filter
75
-    else {
76
-        for (my $i = 0; $i < @$keys; $i++) {
77
-            $row_hash->{$keys->[$i]} = $row->[$i];
78
-        }
79
-    }
80
-    return wantarray ? %$row_hash : $row_hash;
81
-}
82
-
83
-# Fetch only first (array)
84
-sub fetch_first {
85
-    my $self = shift;
86
-    
87
-    # Fetch
88
-    my $row = $self->fetch;
89
-    
90
-    # Not exist
91
-    return unless $row;
92
-    
93
-    # Finish statement handle
94
-    $self->finish;
95
-    
96
-    return wantarray ? @$row : $row;
97
-}
98
-
99
-# Fetch only first (hash)
100
-sub fetch_hash_first {
101
-    my $self = shift;
102
-    
103
-    # Fetch hash
104
-    my $row = $self->fetch_hash;
105
-    
106
-    # Not exist
107
-    return unless $row;
108
-    
109
-    # Finish statement handle
110
-    $self->finish;
111
-    
112
-    return wantarray ? %$row : $row;
113
-}
114
-
115
-# Fetch multi rows (array)
116
-sub fetch_rows {
117
-    my ($self, $count) = @_;
118
-    
119
-    # Not specified Row count
120
-    croak("Row count must be specified")
121
-      unless $count;
122
-    
123
-    # Fetch multi rows
124
-    my $rows = [];
125
-    for (my $i = 0; $i < $count; $i++) {
126
-        my @row = $self->fetch;
127
-        
128
-        last unless @row;
129
-        
130
-        push @$rows, \@row;
131
-    }
132
-    
133
-    return unless @$rows;
134
-    return wantarray ? @$rows : $rows;
135
-}
136
-
137
-# Fetch multi rows (hash)
138
-sub fetch_hash_rows {
139
-    my ($self, $count) = @_;
140
-    
141
-    # Not specified Row count
142
-    croak("Row count must be specified")
143
-      unless $count;
144
-    
145
-    # Fetch multi rows
146
-    my $rows = [];
147
-    for (my $i = 0; $i < $count; $i++) {
148
-        my %row = $self->fetch_hash;
149
-        
150
-        last unless %row;
151
-        
152
-        push @$rows, \%row;
153
-    }
154
-    
155
-    return unless @$rows;
156
-    return wantarray ? @$rows : $rows;
157
-}
158
-
159
-
160
-# Fetch all (array)
161
-sub fetch_all {
162
-    my $self = shift;
163
-    
164
-    my $rows = [];
165
-    while(my @row = $self->fetch) {
166
-        push @$rows, [@row];
167
-    }
168
-    return wantarray ? @$rows : $rows;
169
-}
170
-
171
-# Fetch all (hash)
172
-sub fetch_hash_all {
173
-    my $self = shift;
174
-    
175
-    my $rows = [];
176
-    while(my %row = $self->fetch_hash) {
177
-        push @$rows, {%row};
178
-    }
179
-    return wantarray ? @$rows : $rows;
180
-}
181
-
182
-# Finish
183
-sub finish { shift->sth->finish }
184
-
185
-# Error
186
-sub error { 
187
-    my $self = shift;
188
-    my $sth  = $self->sth;
189
-    return wantarray ? ($sth->errstr, $sth->err, $sth->state) : $sth->errstr;
190
-}
191
-
192
-Object::Simple->build_class;
193
-
194
-=head1 NAME
195
-
196
-DBIx::Custom::Result - Resultset for DBIx::Custom
197
-
198
-=head1 VERSION
199
-
200
-Version 0.0301
201
-
202
-=head1 SYNOPSIS
203
-
204
-    # $result is DBIx::Custom::Result object
205
-    my $dbi = DBIx::Custom->new;
206
-    my $result = $dbi->query($sql_template, $param);
207
-    
208
-    while (my ($val1, $val2) = $result->fetch) {
209
-        # do something
210
-    }
211
-
212
-=head1 OBJECT ACCESSORS
213
-
214
-=head2 sth
215
-
216
-    # Set and Get statement handle
217
-    $self = $result->sth($sth);
218
-    $sth  = $reuslt->sth
219
-
220
-Statement handle is automatically set by DBIx::Custom.
221
-so you do not set statement handle.
222
-
223
-If you need statement handle, you can get statement handle by using this method.
224
-
225
-=head2 fetch_filter
226
-
227
-    # Set and Get fetch filter
228
-    $self         = $result->fetch_filter($sth);
229
-    $fetch_filter = $result->fech_filter;
230
-
231
-Statement handle is automatically set by DBIx::Custom.
232
-If you want to set your fetch filter, you set it.
233
-
234
-=head2 no_fetch_filters
235
-
236
-    # Set and Get no filter keys when fetching
237
-    $self             = $result->no_fetch_filters($no_fetch_filters);
238
-    $no_fetch_filters = $result->no_fetch_filters;
239
-
240
-=head1 METHODS
241
-
242
-=head2 fetch
243
-
244
-    # Fetch row as array reference (Scalar context)
245
-    $row = $result->fetch;
246
-    
247
-    # Fetch row as array (List context)
248
-    @row = $result->fecth
249
-
250
-    # Sample
251
-    while (my $row = $result->fetch) {
252
-        # do something
253
-        my $val1 = $row->[0];
254
-        my $val2 = $row->[1];
255
-    }
256
-
257
-fetch method is fetch resultset and get row as array or array reference.
258
-
259
-=head2 fetch_hash
260
-
261
-    # Fetch row as hash reference (Scalar context)
262
-    $row = $result->fetch_hash;
263
-    
264
-    # Fetch row as hash (List context)
265
-    %row = $result->fecth_hash
266
-
267
-    # Sample
268
-    while (my $row = $result->fetch_hash) {
269
-        # do something
270
-        my $val1 = $row->{key1};
271
-        my $val2 = $row->{key2};
272
-    }
273
-
274
-fetch_hash method is fetch resultset and get row as hash or hash reference.
275
-
276
-=head2 fetch_first
277
-
278
-    # Fetch only first (Scalar context)
279
-    $row = $result->fetch_first;
280
-    
281
-    # Fetch only first (List context)
282
-    @row = $result->fetch_first;
283
-    
284
-This method fetch only first and finish statement handle
285
-
286
-=head2 fetch_hash_first
287
-    
288
-    # Fetch only first as hash (Scalar context)
289
-    $row = $result->fetch_hash_first;
290
-    
291
-    # Fetch only first as hash (Scalar context)
292
-    @row = $result->fetch_hash_first;
293
-    
294
-This method fetch only first and finish statement handle
295
-
296
-=head2 fetch_rows
297
-
298
-    # Fetch multi rows (Scalar context)
299
-    $rows = $result->fetch_rows($row_count);
300
-    
301
-    # Fetch multi rows (List context)
302
-    @rows = $result->fetch_rows($row_count);
303
-    
304
-    # Sapmle 
305
-    $rows = $result->fetch_rows(10);
306
-
307
-=head2 fetch_hash_rows
308
-
309
-    # Fetch multi rows as hash (Scalar context)
310
-    $rows = $result->fetch_hash_rows($row_count);
311
-    
312
-    # Fetch multi rows as hash (List context)
313
-    @rows = $result->fetch_hash_rows($row_count);
314
-    
315
-    # Sapmle 
316
-    $rows = $result->fetch_hash_rows(10);
317
-
318
-=head2 fetch_all
319
-
320
-    # Fetch all row as array ref of array ref (Scalar context)
321
-    $rows = $result->fetch_all;
322
-    
323
-    # Fetch all row as array of array ref (List context)
324
-    @rows = $result->fecth_all;
325
-
326
-    # Sample
327
-    my $rows = $result->fetch_all;
328
-    my $val0_0 = $rows->[0][0];
329
-    my $val1_1 = $rows->[1][1];
330
-
331
-fetch_all method is fetch resultset and get all rows as array or array reference.
332
-
333
-=head2 fetch_hash_all
334
-
335
-    # Fetch all row as array ref of hash ref (Scalar context)
336
-    $rows = $result->fetch_hash_all;
337
-    
338
-    # Fetch all row as array of hash ref (List context)
339
-    @rows = $result->fecth_all_hash;
340
-
341
-    # Sample
342
-    my $rows = $result->fetch_hash_all;
343
-    my $val0_key1 = $rows->[0]{key1};
344
-    my $val1_key2 = $rows->[1]{key2};
345
-
346
-=head2 error
347
-
348
-    # Get error infomation
349
-    $error_messege = $result->error;
350
-    ($error_message, $error_number, $error_state) = $result->error;
351
-
352
-You can get get information. This is crenspond to the following.
353
-
354
-    $error_message : $result->sth->errstr
355
-    $error_number  : $result->sth->err
356
-    $error_state   : $result->sth->state
357
-
358
-=head2 finish
359
-
360
-    # Finish statement handle
361
-    $result->finish
362
-    
363
-    # Sample
364
-    my $row = $reuslt->fetch; # fetch only one row
365
-    $result->finish
366
-
367
-You can finish statement handle.This is equel to
368
-
369
-    $result->sth->finish;
370
-
371
-=head1 AUTHOR
372
-
373
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
374
-
375
-Github L<http://github.com/yuki-kimoto>
376
-
377
-=head1 COPYRIGHT & LICENSE
378
-
379
-Copyright 2009 Yuki Kimoto, all rights reserved.
380
-
381
-This program is free software; you can redistribute it and/or modify it
382
-under the same terms as Perl itself.
383
-
384
-=cut
-694
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/SQL/Template.pm
... ...
@@ -1,694 +0,0 @@
1
-package DBIx::Custom::SQL::Template;
2
-use Object::Simple;
3
-
4
-use Carp 'croak';
5
-
6
-# Accessor is created by Object::Simple. Please read Object::Simple document
7
-
8
-### Class-Object accessors
9
-
10
-# Tag start
11
-sub tag_start   : ClassObjectAttr {
12
-    initialize => {default => '{', clone => 'scalar'}
13
-}
14
-
15
-# Tag end
16
-sub tag_end     : ClassObjectAttr {
17
-    initialize => {default => '}', clone => 'scalar'}
18
-}
19
-
20
-# Tag syntax
21
-sub tag_syntax  : ClassObjectAttr {
22
-    initialize => {default => <<'EOS', clone => 'scalar'}}
23
-[tag]                     [expand]
24
-{? name}                  ?
25
-{= name}                  name = ?
26
-{<> name}                 name <> ?
27
-
28
-{< name}                  name < ?
29
-{> name}                  name > ?
30
-{>= name}                 name >= ?
31
-{<= name}                 name <= ?
32
-
33
-{like name}               name like ?
34
-{in name number}          name in [?, ?, ..]
35
-
36
-{insert key1 key2} (key1, key2) values (?, ?)
37
-{update key1 key2}    set key1 = ?, key2 = ?
38
-EOS
39
-
40
-# Tag processors
41
-sub tag_processors : ClassObjectAttr {
42
-    type => 'hash',
43
-    deref => 1,
44
-    initialize => {
45
-        clone => 'hash', 
46
-        default => sub {{
47
-            '?'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
48
-            '='             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
49
-            '<>'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
50
-            '>'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
51
-            '<'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
52
-            '>='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
53
-            '<='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
54
-            'like'          => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
55
-            'in'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_in_tag,
56
-            'insert'        => \&DBIx::Custom::SQL::Template::TagProcessor::expand_insert_tag,
57
-            'update'    => \&DBIx::Custom::SQL::Template::TagProcessor::expand_update_tag
58
-        }}
59
-    }
60
-}
61
-
62
-# Add Tag processor
63
-sub add_tag_processor {
64
-    my $invocant = shift;
65
-    my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
66
-    $invocant->tag_processors(%{$invocant->tag_processors}, %{$tag_processors});
67
-    return $invocant;
68
-}
69
-
70
-# Clone
71
-sub clone {
72
-    my $self = shift;
73
-    my $new = $self->new;
74
-    
75
-    $new->tag_start($self->tag_start);
76
-    $new->tag_end($self->tag_end);
77
-    $new->tag_syntax($self->tag_syntax);
78
-    $new->tag_processors({%{$self->tag_processors || {}}});
79
-    
80
-    return $new;
81
-}
82
-
83
-
84
-### Object Methods
85
-
86
-# Create Query
87
-sub create_query {
88
-    my ($self, $template)  = @_;
89
-    
90
-    # Parse template
91
-    my $tree = $self->_parse_template($template);
92
-    
93
-    # Build query
94
-    my $query = $self->_build_query($tree);
95
-    
96
-    return $query;
97
-}
98
-
99
-# Parse template
100
-sub _parse_template {
101
-    my ($self, $template) = @_;
102
-    $template ||= '';
103
-    
104
-    my $tree = [];
105
-    
106
-    # Tags
107
-    my $tag_start = quotemeta $self->tag_start;
108
-    my $tag_end   = quotemeta $self->tag_end;
109
-    
110
-    # Tokenize
111
-    my $state = 'text';
112
-    
113
-    # Save original template
114
-    my $original_template = $template;
115
-    
116
-    # Parse template
117
-    while ($template =~ s/([^$tag_start]*?)$tag_start([^$tag_end].*?)$tag_end//sm) {
118
-        my $text = $1;
119
-        my $tag  = $2;
120
-        
121
-        # Parse tree
122
-        push @$tree, {type => 'text', tag_args => [$text]} if $text;
123
-        
124
-        if ($tag) {
125
-            # Get tag name and arguments
126
-            my ($tag_name, @tag_args) = split /\s+/, $tag;
127
-            
128
-            # Tag processor is exist?
129
-            unless ($self->tag_processors->{$tag_name}) {
130
-                my $tag_syntax = $self->tag_syntax;
131
-                croak("Tag '{$tag}' in SQL template is not exist.\n\n" .
132
-                      "<SQL template tag syntax>\n" .
133
-                      "$tag_syntax\n" .
134
-                      "<Your SQL template>\n" .
135
-                      "$original_template\n\n");
136
-            }
137
-            
138
-            # Check tag arguments
139
-            foreach my $tag_arg (@tag_args) {
140
-                # Cannot cantain placehosder '?'
141
-                croak("Tag '{t }' arguments cannot contain '?'")
142
-                  if $tag_arg =~ /\?/;
143
-            }
144
-            
145
-            # Add tag to parsing tree
146
-            push @$tree, {type => 'tag', tag_name => $tag_name, tag_args => [@tag_args]};
147
-        }
148
-    }
149
-    
150
-    # Add text to parsing tree 
151
-    push @$tree, {type => 'text', tag_args => [$template]} if $template;
152
-    
153
-    return $tree;
154
-}
155
-
156
-# Build SQL from parsing tree
157
-sub _build_query {
158
-    my ($self, $tree) = @_;
159
-    
160
-    # SQL
161
-    my $sql = '';
162
-    
163
-    # All parameter key infomation
164
-    my $all_key_infos = [];
165
-    
166
-    # Build SQL 
167
-    foreach my $node (@$tree) {
168
-        
169
-        # Get type, tag name, and arguments
170
-        my $type     = $node->{type};
171
-        my $tag_name = $node->{tag_name};
172
-        my $tag_args = $node->{tag_args};
173
-        
174
-        # Text
175
-        if ($type eq 'text') {
176
-            # Join text
177
-            $sql .= $tag_args->[0];
178
-        }
179
-        
180
-        # Tag
181
-        elsif ($type eq 'tag') {
182
-            
183
-            # Get tag processor
184
-            my $tag_processor = $self->tag_processors->{$tag_name};
185
-            
186
-            # Tag processor is code ref?
187
-            croak("Tag processor '$tag_name' must be code reference")
188
-              unless ref $tag_processor eq 'CODE';
189
-            
190
-            # Expand tag using tag processor
191
-            my ($expand, $key_infos)
192
-              = $tag_processor->($tag_name, $tag_args);
193
-            
194
-            # Check tag processor return value
195
-            croak("Tag processor '$tag_name' must return (\$expand, \$key_infos)")
196
-              if !defined $expand || ref $key_infos ne 'ARRAY';
197
-            
198
-            # Check placeholder count
199
-            croak("Placeholder count in SQL created by tag processor '$tag_name' " .
200
-                  "must be same as key informations count")
201
-              unless $self->_placeholder_count($expand) eq @$key_infos;
202
-            
203
-            # Add key information
204
-            push @$all_key_infos, @$key_infos;
205
-            
206
-            # Join expand tag to SQL
207
-            $sql .= $expand;
208
-        }
209
-    }
210
-    
211
-    # Add semicolon
212
-    $sql .= ';' unless $sql =~ /;$/;
213
-    
214
-    # Query
215
-    my $query = {sql => $sql, key_infos => $all_key_infos};
216
-    
217
-    return $query;
218
-}
219
-
220
-# Get placeholder count
221
-sub _placeholder_count {
222
-    my ($self, $expand) = @_;
223
-    $expand ||= '';
224
-    
225
-    my $count = 0;
226
-    my $pos   = -1;
227
-    while (($pos = index($expand, '?', $pos + 1)) != -1) {
228
-        $count++;
229
-    }
230
-    return $count;
231
-}
232
-
233
-Object::Simple->build_class;
234
-
235
-
236
-package DBIx::Custom::SQL::Template::TagProcessor;
237
-use strict;
238
-use warnings;
239
-use Carp 'croak';
240
-
241
-# Expand tag '?', '=', '<>', '>', '<', '>=', '<=', 'like'
242
-sub expand_basic_tag {
243
-    my ($tag_name, $tag_args) = @_;
244
-    my $original_key = $tag_args->[0];
245
-    
246
-    # Key is not exist
247
-    croak("You must be pass key as argument to tag '{$tag_name }'")
248
-      if !$original_key;
249
-    
250
-    # Expanded tag
251
-    my $expand = $tag_name eq '?'
252
-               ? '?'
253
-               : "$original_key $tag_name ?";
254
-    
255
-    # Get table and clumn name
256
-    my ($table, $column) = get_table_and_column($original_key);
257
-    
258
-    # Parameter key infomation
259
-    my $key_info = {};
260
-    
261
-    # Original key
262
-    $key_info->{original_key} = $original_key;
263
-    
264
-    # Table
265
-    $key_info->{table}  = $table;
266
-    
267
-    # Column name
268
-    $key_info->{column} = $column;
269
-    
270
-    # Access keys
271
-    my $access_keys = [];
272
-    push @$access_keys, [$original_key];
273
-    push @$access_keys, [$table, $column] if $table && $column;
274
-    $key_info->{access_keys} = $access_keys;
275
-    
276
-    # Add parameter key information
277
-    my $key_infos = [];
278
-    push @$key_infos, $key_info;
279
-    
280
-    return ($expand, $key_infos);
281
-}
282
-
283
-# Expand tag 'in'
284
-sub expand_in_tag {
285
-    my ($tag_name, $tag_args) = @_;
286
-    my ($original_key, $placeholder_count) = @$tag_args;
287
-    
288
-    # Key must be specified
289
-    croak("You must be pass key as first argument of tag '{$tag_name }'\n" . 
290
-          "Usage: {$tag_name \$key \$placeholder_count}")
291
-      unless $original_key;
292
-      
293
-    
294
-    # Place holder count must be specified
295
-    croak("You must be pass placeholder count as second argument of tag '{$tag_name }'\n" . 
296
-          "Usage: {$tag_name \$key \$placeholder_count}")
297
-      if !$placeholder_count || $placeholder_count =~ /\D/;
298
-
299
-    # Expand tag
300
-    my $expand = "$original_key $tag_name (";
301
-    for (my $i = 0; $i < $placeholder_count; $i++) {
302
-        $expand .= '?, ';
303
-    }
304
-    
305
-    $expand =~ s/, $//;
306
-    $expand .= ')';
307
-    
308
-    # Get table and clumn name
309
-    my ($table, $column) = get_table_and_column($original_key);
310
-    
311
-    # Create parameter key infomations
312
-    my $key_infos = [];
313
-    for (my $i = 0; $i < $placeholder_count; $i++) {
314
-        # Parameter key infomation
315
-        my $key_info = {};
316
-        
317
-        # Original key
318
-        $key_info->{original_key} = $original_key;
319
-        
320
-        # Table
321
-        $key_info->{table}   = $table;
322
-        
323
-        # Column name
324
-        $key_info->{column}  = $column;
325
-        
326
-        # Access keys
327
-        my $access_keys = [];
328
-        push @$access_keys, [$original_key, [$i]];
329
-        push @$access_keys, [$table, $column, [$i]] if $table && $column;
330
-        $key_info->{access_keys} = $access_keys;
331
-        
332
-        # Add parameter key infos
333
-        push @$key_infos, $key_info;
334
-    }
335
-    
336
-    return ($expand, $key_infos);
337
-}
338
-
339
-# Get table and column
340
-sub get_table_and_column {
341
-    my $key = shift;
342
-    $key ||= '';
343
-    
344
-    return ('', $key) unless $key =~ /\./;
345
-    
346
-    my ($table, $column) = split /\./, $key;
347
-    
348
-    return ($table, $column);
349
-}
350
-
351
-# Expand tag 'insert'
352
-sub expand_insert_tag {
353
-    my ($tag_name, $tag_args) = @_;
354
-    my $original_keys = $tag_args;
355
-    
356
-    # Insert key (k1, k2, k3, ..)
357
-    my $insert_keys = '(';
358
-    
359
-    # placeholder (?, ?, ?, ..)
360
-    my $place_holders = '(';
361
-    
362
-    foreach my $original_key (@$original_keys) {
363
-        # Get table and column
364
-        my ($table, $column) = get_table_and_column($original_key);
365
-        
366
-        # Join insert column
367
-        $insert_keys   .= "$column, ";
368
-        
369
-        # Join place holder
370
-        $place_holders .= "?, ";
371
-    }
372
-    
373
-    # Delete last ', '
374
-    $insert_keys =~ s/, $//;
375
-    
376
-    # Close 
377
-    $insert_keys .= ')';
378
-    $place_holders =~ s/, $//;
379
-    $place_holders .= ')';
380
-    
381
-    # Expand tag
382
-    my $expand = "$insert_keys values $place_holders";
383
-    
384
-    # Create parameter key infomations
385
-    my $key_infos = [];
386
-    foreach my $original_key (@$original_keys) {
387
-        # Get table and clumn name
388
-        my ($table, $column) = get_table_and_column($original_key);
389
-        
390
-        # Parameter key infomation
391
-        my $key_info = {};
392
-        
393
-        # Original key
394
-        $key_info->{original_key} = $original_key;
395
-        
396
-        # Table
397
-        $key_info->{table}   = $table;
398
-        
399
-        # Column name
400
-        $key_info->{column}  = $column;
401
-        
402
-        # Access keys
403
-        my $access_keys = [];
404
-        push @$access_keys, ['#insert', $original_key];
405
-        push @$access_keys, ['#insert', $table, $column] if $table && $column;
406
-        push @$access_keys, [$original_key];
407
-        push @$access_keys, [$table, $column] if $table && $column;
408
-        $key_info->{access_keys} = $access_keys;
409
-        
410
-        # Add parameter key infos
411
-        push @$key_infos, $key_info;
412
-    }
413
-    
414
-    return ($expand, $key_infos);
415
-}
416
-
417
-# Expand tag 'update'
418
-sub expand_update_tag {
419
-    my ($tag_name, $tag_args) = @_;
420
-    my $original_keys = $tag_args;
421
-    
422
-    # Expanded tag
423
-    my $expand = 'set ';
424
-    
425
-    # 
426
-    foreach my $original_key (@$original_keys) {
427
-        # Get table and clumn name
428
-        my ($table, $column) = get_table_and_column($original_key);
429
-
430
-        # Join key and placeholder
431
-        $expand .= "$column = ?, ";
432
-    }
433
-    
434
-    # Delete last ', '
435
-    $expand =~ s/, $//;
436
-    
437
-    # Create parameter key infomations
438
-    my $key_infos = [];
439
-    foreach my $original_key (@$original_keys) {
440
-        # Get table and clumn name
441
-        my ($table, $column) = get_table_and_column($original_key);
442
-        
443
-        # Parameter key infomation
444
-        my $key_info = {};
445
-        
446
-        # Original key
447
-        $key_info->{original_key} = $original_key;
448
-        
449
-        # Table
450
-        $key_info->{table}  = $table;
451
-        
452
-        # Column name
453
-        $key_info->{column} = $column;
454
-        
455
-        # Access keys
456
-        my $access_keys = [];
457
-        push @$access_keys, ['#update', $original_key];
458
-        push @$access_keys, ['#update', $table, $column] if $table && $column;
459
-        push @$access_keys, [$original_key];
460
-        push @$access_keys, [$table, $column] if $table && $column;
461
-        $key_info->{access_keys} = $access_keys;
462
-        
463
-        # Add parameter key infos
464
-        push @$key_infos, $key_info;
465
-    }
466
-    
467
-    return ($expand, $key_infos);
468
-}
469
-
470
-1;
471
-
472
-=head1 NAME
473
-
474
-DBIx::Custom::SQL::Template - Custamizable SQL Template for DBIx::Custom
475
-
476
-=head1 VERSION
477
-
478
-Version 0.0101
479
-
480
-=cut
481
-
482
-=head1 SYNOPSIS
483
-    
484
-    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
485
-    
486
-    my $tmpl   = "select from table {= k1} && {<> k2} || {like k3}";
487
-    my $param = {k1 => 1, k2 => 2, k3 => 3};
488
-    
489
-    my $query = $sql_template->create_query($tmpl);
490
-    
491
-    
492
-    # Using query from DBIx::Custom
493
-    use DBIx::Custom;
494
-    my $dbi = DBI->new(
495
-       data_source => $data_source,
496
-       user        => $user,
497
-       password    => $password, 
498
-       dbi_options => {PrintError => 0, RaiseError => 1}
499
-    );
500
-    
501
-    $query = $dbi->create_query($tmpl); # This is SQL::Template create_query
502
-    $dbi->query($query, $param);
503
-
504
-=head1 CLASS-OBJECT ACCESSORS
505
-
506
-Class-Object accessor is used from both object and class
507
-
508
-    $class->$accessor # call from class
509
-    $self->$accessor  # call form object
510
-
511
-=head2 tag_processors
512
-
513
-    # Set and get
514
-    $self           = $sql_tmpl->tag_processors($tag_processors);
515
-    $tag_processors = $sql_tmpl->tag_processors;
516
-    
517
-    # Sample
518
-    $sql_tmpl->tag_processors(
519
-        '?' => \&expand_question,
520
-        '=' => \&expand_equel
521
-    );
522
-
523
-You can use add_tag_processor to add tag processor
524
-
525
-=head2 tag_start
526
-
527
-    # Set and get
528
-    $self      = $sql_tmpl->tag_start($tag_start);
529
-    $tag_start = $sql_tmpl->tag_start;
530
-    
531
-    # Sample
532
-    $sql_tmpl->tag_start('{');
533
-
534
-Default is '{'
535
-
536
-=head2 tag_end
537
-
538
-    # Set and get
539
-    $self    = $sql_tmpl->tag_start($tag_end);
540
-    $tag_end = $sql_tmpl->tag_start;
541
-    
542
-    # Sample
543
-    $sql_tmpl->tag_start('}');
544
-
545
-Default is '}'
546
-    
547
-=head2 tag_syntax
548
-    
549
-    # Set and get
550
-    $self       = $sql_tmpl->tag_syntax($tag_syntax);
551
-    $tag_syntax = $sql_tmpl->tag_syntax;
552
-    
553
-    # Sample
554
-    $sql_tmpl->tag_syntax(
555
-        "[Tag]            [Expand]\n" .
556
-        "{? name}         ?\n" .
557
-        "{= name}         name = ?\n" .
558
-        "{<> name}        name <> ?\n"
559
-    );
560
-
561
-=head1 METHODS
562
-
563
-=head2 create_query
564
-    
565
-    # Create SQL form SQL template
566
-    $query = $sql_tmpl->create_query($tmpl);
567
-    
568
-    # Sample
569
-    $query = $sql_tmpl->create_sql(
570
-         "select * from table where {= title} && {like author} || {<= price}")
571
-    
572
-    # Result
573
-    $qeury->{sql} : "select * from table where title = ? && author like ? price <= ?;"
574
-    $query->{key_infos} : [['title'], ['author'], ['price']]
575
-    
576
-    # Sample2 (with table name)
577
-    ($sql, @bind_values) = $sql_tmpl->create_sql(
578
-            "select * from table where {= table.title} && {like table.author}",
579
-            {table => {title => 'Perl', author => '%Taro%'}}
580
-        )
581
-    
582
-    # Result2
583
-    $query->{sql} : "select * from table where table.title = ? && table.title like ?;"
584
-    $query->{key_infos} :[ [['table.title'],['table', 'title']],
585
-                           [['table.author'],['table', 'author']] ]
586
-
587
-This method create query using by DBIx::Custom.
588
-query is two infomation
589
-
590
-    1.sql       : SQL
591
-    2.key_infos : Parameter access key information
592
-
593
-=head2 add_tag_processor
594
-
595
-Add tag processor
596
-  
597
-    # Add
598
-    $self = $sql_tmpl->add_tag_processor($tag_processor);
599
-    
600
-    # Sample
601
-    $sql_tmpl->add_tag_processor(
602
-        '?' => sub {
603
-            my ($tag_name, $tag_args) = @_;
604
-            
605
-            my $key1 = $tag_args->[0];
606
-            my $key2 = $tag_args->[1];
607
-            
608
-            my $key_infos = [];
609
-            
610
-            # Expand tag and create key informations
611
-            
612
-            # Return expand tags and key informations
613
-            return ($expand, $key_infos);
614
-        }
615
-    );
616
-
617
-Tag processor recieve 2 argument
618
-
619
-    1. Tag name            (?, =, <>, or etc)
620
-    2. Tag arguments       (arg1 and arg2 in {tag_name arg1 arg2})
621
-
622
-Tag processor return 2 value
623
-
624
-    1. Expanded Tag (For exsample, '{= title}' is expanded to 'title = ?')
625
-    2. Key infomations
626
-    
627
-You must be return expanded tag and key infomations.
628
-
629
-Key information is a little complex. so I will explan this in future.
630
-
631
-If you want to know more, Please see DBIx::Custom::SQL::Template source code.
632
-
633
-=head2 clone
634
-
635
-    # Clone DBIx::Custom::SQL::Template object
636
-    $clone = $self->clone;
637
-    
638
-=head1 Available Tags
639
-    
640
-    # Available Tags
641
-    [tag]            [expand]
642
-    {? name}         ?
643
-    {= name}         name = ?
644
-    {<> name}        name <> ?
645
-    
646
-    {< name}         name < ?
647
-    {> name}         name > ?
648
-    {>= name}        name >= ?
649
-    {<= name}        name <= ?
650
-    
651
-    {like name}      name like ?
652
-    {in name}        name in [?, ?, ..]
653
-    
654
-    {insert}  (key1, key2, key3) values (?, ?, ?)
655
-    {update}     set key1 = ?, key2 = ?, key3 = ?
656
-    
657
-    # Sample1
658
-    $query = $sql_tmpl->create_sql(
659
-        "insert into table {insert key1 key2}"
660
-    );
661
-    # Result1
662
-    $sql : "insert into table (key1, key2) values (?, ?)"
663
-    
664
-    
665
-    # Sample2
666
-    $query = $sql_tmpl->create_sql(
667
-        "update table {update key1 key2} where {= key3}"
668
-    );
669
-    
670
-    # Result2
671
-    $query->{sql} : "update table set key1 = ?, key2 = ? where key3 = ?;"
672
-    
673
-=head1 AUTHOR
674
-
675
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
676
-
677
-Github 
678
-L<http://github.com/yuki-kimoto>
679
-L<http://github.com/yuki-kimoto/DBIx-Custom-SQL-Template>
680
-
681
-Please let know me bag if you find
682
-Please request me if you want to do something
683
-
684
-=head1 COPYRIGHT & LICENSE
685
-
686
-Copyright 2009 Yuki Kimoto, all rights reserved.
687
-
688
-This program is free software; you can redistribute it and/or modify it
689
-under the same terms as Perl itself.
690
-
691
-
692
-=cut
693
-
694
-1; # End of DBIx::Custom::SQL::Template
-136
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/SQLite.pm
... ...
@@ -1,136 +0,0 @@
1
-package DBIx::Custom::SQLite;
2
-use base 'DBIx::Custom::Basic';
3
-
4
-use warnings;
5
-use strict;
6
-use Carp 'croak';
7
-
8
-my $class = __PACKAGE__;
9
-
10
-$class->add_format(
11
-    datetime => $class->formats->{SQL99_datetime},
12
-    date     => $class->formats->{SQL99_date},
13
-    time     => $class->formats->{SQL99_time},
14
-);
15
-
16
-sub connect {
17
-    my $self = shift;
18
-    
19
-    if (!$self->data_source && (my $database = $self->database)) {
20
-        $self->data_source("dbi:SQLite:dbname=$database");
21
-    }
22
-    
23
-    return $self->SUPER::connect;
24
-}
25
-
26
-sub connect_memory {
27
-    my $self = shift;
28
-    
29
-    # Data source for memory database
30
-    $self->data_source('dbi:SQLite:dbname=:memory:');
31
-    
32
-    # Already connected
33
-    croak("Already connected") if $self->connected;
34
-    
35
-    # Connect
36
-    $self->connect;
37
-    
38
-    return $self;
39
-}
40
-
41
-sub reconnect_memory {
42
-    my $self = shift;
43
-
44
-    # Data source for memory database
45
-    $self->data_source('dbi:SQLite:dbname=:memory:');
46
-    
47
-    # Reconnect
48
-    $self->reconnect;
49
-    
50
-    return $self;
51
-}
52
-
53
-
54
-=head1 NAME
55
-
56
-DBIx::Custom::SQLite - DBIx::Custom SQLite implementation
57
-
58
-=head1 Version
59
-
60
-Version 0.0201
61
-
62
-=head1 Synopsys
63
-
64
-    use DBIx::Custom::SQLite;
65
-    
66
-    # New
67
-    my $dbi = DBIx::Custom::SQLite->new(user => 'taro', $password => 'kliej&@K',
68
-                                       database => 'sample.db');
69
-    
70
-    # Insert 
71
-    $dbi->insert('books', {title => 'perl', author => 'taro'});
72
-    
73
-    # Update 
74
-    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
75
-    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
76
-    
77
-    # Delete
78
-    $dbi->delete('books', {author => 'taro'});
79
-    
80
-    # select * from books;
81
-    $dbi->select('books');
82
-    
83
-    # select * from books where ahthor = 'taro'; 
84
-    $dbi->select('books', {author => 'taro'}); 
85
-    
86
-    # select author, title from books where author = 'taro'
87
-    $dbi->select('books', [qw/author title/], {author => 'taro'});
88
-    
89
-    # select author, title from books where author = 'taro' order by id limit 1;
90
-    $dbi->select('books', [qw/author title/], {author => 'taro'},
91
-                 'order by id limit 1');
92
-
93
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation
94
-
95
-This class is L<DBIx::Custom::Basic> subclass.
96
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass
97
-
98
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom>
99
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation
100
-
101
-=head1 Object methods
102
-
103
-=head2 connect
104
-
105
-This override L<DBIx::Custom> connect.
106
-
107
-    # Connect to database
108
-    $dbi->connect;
109
-
110
-If database attribute is set, automatically data source is created and connect
111
-
112
-=head2 connect_memory
113
-
114
-    # Connect memory database
115
-    $self = $dbi->connect_memory;
116
-
117
-=head2 reconnect_memory
118
-
119
-    # Reconnect memory database
120
-    $self = $dbi->reconnect_memory;
121
-
122
-=head1 Author
123
-
124
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
125
-
126
-Github L<http://github.com/yuki-kimoto>
127
-
128
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
129
-
130
-=head1 Copyright & lisence
131
-
132
-Copyright 2009 Yuki Kimoto, all rights reserved.
133
-
134
-This program is free software; you can redistribute it and/or modify it
135
-under the same terms as Perl itself.
136
-
-599
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom.3pm
... ...
@@ -1,599 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom 3"
132
-.TH DBIx::Custom 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom \- Customizable simple DBI
135
-.SH "VERSION"
136
-.IX Header "VERSION"
137
-Version 0.0501
138
-.SH "CAUTION"
139
-.IX Header "CAUTION"
140
-This module is now experimental stage.
141
-.PP
142
-I want you to try this module
143
-because I want this module stable, and not to damage your \s-1DB\s0 data by this module bug.
144
-.PP
145
-Please tell me bug if you find
146
-.SH "SYNOPSIS"
147
-.IX Header "SYNOPSIS"
148
-.Vb 1
149
-\&  my $dbi = DBIx::Custom->new;
150
-.Ve
151
-.PP
152
-.Vb 2
153
-\&  my $query = $dbi->create_query($template);
154
-\&  $dbi->execute($query);
155
-.Ve
156
-.SH "CLASS-OBJECT ACCESSORS"
157
-.IX Header "CLASS-OBJECT ACCESSORS"
158
-.Sh "user"
159
-.IX Subsection "user"
160
-.Vb 3
161
-\&    # Set and get database user name
162
-\&    $self = $dbi->user($user);
163
-\&    $user = $dbi->user;
164
-.Ve
165
-.PP
166
-.Vb 2
167
-\&    # Sample
168
-\&    $dbi->user('taro');
169
-.Ve
170
-.Sh "password"
171
-.IX Subsection "password"
172
-.Vb 3
173
-\&    # Set and get database password
174
-\&    $self     = $dbi->password($password);
175
-\&    $password = $dbi->password;
176
-.Ve
177
-.PP
178
-.Vb 2
179
-\&    # Sample
180
-\&    $dbi->password('lkj&le`@s');
181
-.Ve
182
-.Sh "data_source"
183
-.IX Subsection "data_source"
184
-.Vb 3
185
-\&    # Set and get database data source
186
-\&    $self        = $dbi->data_source($data_soruce);
187
-\&    $data_source = $dbi->data_source;
188
-.Ve
189
-.PP
190
-.Vb 2
191
-\&    # Sample(SQLite)
192
-\&    $dbi->data_source(dbi:SQLite:dbname=$database);
193
-.Ve
194
-.PP
195
-.Vb 2
196
-\&    # Sample(MySQL);
197
-\&    $dbi->data_source("dbi:mysql:dbname=$database");
198
-.Ve
199
-.PP
200
-.Vb 2
201
-\&    # Sample(PostgreSQL)
202
-\&    $dbi->data_source("dbi:Pg:dbname=$database");
203
-.Ve
204
-.Sh "database"
205
-.IX Subsection "database"
206
-.Vb 3
207
-\&    # Set and get database name
208
-\&    $self     = $dbi->database($database);
209
-\&    $database = $dbi->database;
210
-.Ve
211
-.PP
212
-This method will be used in subclass connect method.
213
-.Sh "dbi_options"
214
-.IX Subsection "dbi_options"
215
-.Vb 3
216
-\&    # Set and get DBI option
217
-\&    $self       = $dbi->dbi_options({$options => $value, ...});
218
-\&    $dbi_options = $dbi->dbi_options;
219
-.Ve
220
-.PP
221
-.Vb 2
222
-\&    # Sample
223
-\&    $dbi->dbi_options({PrintError => 0, RaiseError => 1});
224
-.Ve
225
-.PP
226
-dbi_options is used when you connect database by using connect.
227
-.Sh "prepare"
228
-.IX Subsection "prepare"
229
-.Vb 1
230
-\&    $sth = $dbi->prepare($sql);
231
-.Ve
232
-.PP
233
-This method is same as DBI::prepare
234
-.Sh "do"
235
-.IX Subsection "do"
236
-.Vb 1
237
-\&    $dbi->do($sql, @bind_values);
238
-.Ve
239
-.PP
240
-This method is same as DBI::do
241
-.Sh "sql_template"
242
-.IX Subsection "sql_template"
243
-.Vb 3
244
-\&    # Set and get SQL::Template object
245
-\&    $self         = $dbi->sql_template($sql_template);
246
-\&    $sql_template = $dbi->sql_template;
247
-.Ve
248
-.PP
249
-.Vb 2
250
-\&    # Sample
251
-\&    $dbi->sql_template(DBI::Cutom::SQL::Template->new);
252
-.Ve
253
-.Sh "filters"
254
-.IX Subsection "filters"
255
-.Vb 3
256
-\&    # Set and get filters
257
-\&    $self    = $dbi->filters($filters);
258
-\&    $filters = $dbi->filters;
259
-.Ve
260
-.Sh "formats"
261
-.IX Subsection "formats"
262
-.Vb 3
263
-\&    # Set and get formats
264
-\&    $self    = $dbi->formats($formats);
265
-\&    $formats = $dbi->formats;
266
-.Ve
267
-.Sh "bind_filter"
268
-.IX Subsection "bind_filter"
269
-.Vb 3
270
-\&    # Set and get binding filter
271
-\&    $self        = $dbi->bind_filter($bind_filter);
272
-\&    $bind_filter = $dbi->bind_filter
273
-.Ve
274
-.PP
275
-.Vb 2
276
-\&    # Sample
277
-\&    $dbi->bind_filter($self->filters->{default_bind_filter});
278
-.Ve
279
-.PP
280
-you can get \s-1DBI\s0 database handle if you need.
281
-.Sh "fetch_filter"
282
-.IX Subsection "fetch_filter"
283
-.Vb 3
284
-\&    # Set and get Fetch filter
285
-\&    $self         = $dbi->fetch_filter($fetch_filter);
286
-\&    $fetch_filter = $dbi->fetch_filter;
287
-.Ve
288
-.PP
289
-.Vb 2
290
-\&    # Sample
291
-\&    $dbi->fetch_filter($self->filters->{default_fetch_filter});
292
-.Ve
293
-.Sh "no_bind_filters"
294
-.IX Subsection "no_bind_filters"
295
-.Vb 3
296
-\&    # Set and get no filter keys when binding
297
-\&    $self            = $dbi->no_bind_filters($no_bind_filters);
298
-\&    $no_bind_filters = $dbi->no_bind_filters;
299
-.Ve
300
-.Sh "no_fetch_filters"
301
-.IX Subsection "no_fetch_filters"
302
-.Vb 3
303
-\&    # Set and get no filter keys when fetching
304
-\&    $self             = $dbi->no_fetch_filters($no_fetch_filters);
305
-\&    $no_fetch_filters = $dbi->no_fetch_filters;
306
-.Ve
307
-.Sh "result_class"
308
-.IX Subsection "result_class"
309
-.Vb 3
310
-\&    # Set and get resultset class
311
-\&    $self         = $dbi->result_class($result_class);
312
-\&    $result_class = $dbi->result_class;
313
-.Ve
314
-.PP
315
-.Vb 2
316
-\&    # Sample
317
-\&    $dbi->result_class('DBIx::Custom::Result');
318
-.Ve
319
-.Sh "dbh"
320
-.IX Subsection "dbh"
321
-.Vb 2
322
-\&    # Get database handle
323
-\&    $dbh = $self->dbh;
324
-.Ve
325
-.SH "METHODS"
326
-.IX Header "METHODS"
327
-.Sh "connect"
328
-.IX Subsection "connect"
329
-.Vb 2
330
-\&    # Connect to database
331
-\&    $self = $dbi->connect;
332
-.Ve
333
-.PP
334
-.Vb 4
335
-\&    # Sample
336
-\&    $dbi = DBIx::Custom->new(user => 'taro', password => 'lji8(', 
337
-\&                            data_soruce => "dbi:mysql:dbname=$database");
338
-\&    $dbi->connect;
339
-.Ve
340
-.Sh "disconnect"
341
-.IX Subsection "disconnect"
342
-.Vb 2
343
-\&    # Disconnect database
344
-\&    $dbi->disconnect;
345
-.Ve
346
-.PP
347
-If database is already disconnected, this method do noting.
348
-.Sh "reconnect"
349
-.IX Subsection "reconnect"
350
-.Vb 2
351
-\&    # Reconnect
352
-\&    $dbi->reconnect;
353
-.Ve
354
-.Sh "connected"
355
-.IX Subsection "connected"
356
-.Vb 2
357
-\&    # Check connected
358
-\&    $dbi->connected
359
-.Ve
360
-.Sh "filter_off"
361
-.IX Subsection "filter_off"
362
-.Vb 2
363
-\&    # bind_filter and fitch_filter off
364
-\&    $self->filter_off;
365
-.Ve
366
-.PP
367
-This is equeal to
368
-.PP
369
-.Vb 2
370
-\&    $self->bind_filter(undef);
371
-\&    $self->fetch_filter(undef);
372
-.Ve
373
-.Sh "add_filter"
374
-.IX Subsection "add_filter"
375
-.Vb 3
376
-\&    # Add filter (hash ref or hash can be recieve)
377
-\&    $self = $dbi->add_filter({$filter_name => $filter, ...});
378
-\&    $self = $dbi->add_filter($filetr_name => $filter, ...);
379
-.Ve
380
-.PP
381
-.Vb 19
382
-\&    # Sample
383
-\&    $dbi->add_filter(
384
-\&        decode_utf8 => sub {
385
-\&            my ($key, $value, $table, $column) = @_;
386
-\&            return Encode::decode('UTF-8', $value);
387
-\&        },
388
-\&        datetime_to_string => sub {
389
-\&            my ($key, $value, $table, $column) = @_;
390
-\&            return $value->strftime('%Y-%m-%d %H:%M:%S')
391
-\&        },
392
-\&        default_bind_filter => sub {
393
-\&            my ($key, $value, $table, $column) = @_;
394
-\&            if (ref $value eq 'Time::Piece') {
395
-\&                return $dbi->filters->{datetime_to_string}->($value);
396
-\&            }
397
-\&            else {
398
-\&                return $dbi->filters->{decode_utf8}->($value);
399
-\&            }
400
-\&        },
401
-.Ve
402
-.PP
403
-.Vb 18
404
-\&        encode_utf8 => sub {
405
-\&            my ($key, $value) = @_;
406
-\&            return Encode::encode('UTF-8', $value);
407
-\&        },
408
-\&        string_to_datetime => sub {
409
-\&            my ($key, $value) = @_;
410
-\&            return DateTime::Format::MySQL->parse_datetime($value);
411
-\&        },
412
-\&        default_fetch_filter => sub {
413
-\&            my ($key, $value, $type, $sth, $i) = @_;
414
-\&            if ($type eq 'DATETIME') {
415
-\&                return $dbi->filters->{string_to_datetime}->($value);
416
-\&            }
417
-\&            else {
418
-\&                return $dbi->filters->{encode_utf8}->($value);
419
-\&            }
420
-\&        }
421
-\&    );
422
-.Ve
423
-.PP
424
-add_filter add filter to filters
425
-.Sh "add_format"
426
-.IX Subsection "add_format"
427
-.Vb 1
428
-\&    $dbi->add_format(date => '%Y:%m:%d');
429
-.Ve
430
-.Sh "create_query"
431
-.IX Subsection "create_query"
432
-.Vb 2
433
-\&    # Create Query object from SQL template
434
-\&    my $query = $dbi->create_query($template);
435
-.Ve
436
-.Sh "execute"
437
-.IX Subsection "execute"
438
-.Vb 3
439
-\&    # Parse SQL template and execute SQL
440
-\&    $result = $dbi->query($query, $params);
441
-\&    $result = $dbi->query($template, $params); # Shorcut
442
-.Ve
443
-.PP
444
-.Vb 3
445
-\&    # Sample
446
-\&    $result = $dbi->query("select * from authors where {= name} and {= age}", 
447
-\&                          {author => 'taro', age => 19});
448
-.Ve
449
-.PP
450
-.Vb 3
451
-\&    while (my @row = $result->fetch) {
452
-\&        # do something
453
-\&    }
454
-.Ve
455
-.PP
456
-See also DBIx::Custom::SQL::Template
457
-.Sh "run_transaction"
458
-.IX Subsection "run_transaction"
459
-.Vb 4
460
-\&    # Run transaction
461
-\&    $dbi->run_transaction(sub {
462
-\&        # do something
463
-\&    });
464
-.Ve
465
-.PP
466
-If transaction is success, commit is execute. 
467
-If tranzation is died, rollback is execute.
468
-.Sh "insert"
469
-.IX Subsection "insert"
470
-.Vb 2
471
-\&    # Insert
472
-\&    $dbi->insert($table, $insert_values);
473
-.Ve
474
-.PP
475
-.Vb 2
476
-\&    # Sample
477
-\&    $dbi->insert('books', {title => 'Perl', author => 'Taro'});
478
-.Ve
479
-.Sh "update"
480
-.IX Subsection "update"
481
-.Vb 2
482
-\&    # Update
483
-\&    $dbi->update($table, $update_values, $where);
484
-.Ve
485
-.PP
486
-.Vb 2
487
-\&    # Sample
488
-\&    $dbi->update('books', {title => 'Perl', author => 'Taro'}, {id => 5});
489
-.Ve
490
-.Sh "update_all"
491
-.IX Subsection "update_all"
492
-.Vb 2
493
-\&    # Update all rows
494
-\&    $dbi->update($table, $updat_values);
495
-.Ve
496
-.Sh "delete"
497
-.IX Subsection "delete"
498
-.Vb 2
499
-\&    # Delete
500
-\&    $dbi->delete($table, $where);
501
-.Ve
502
-.PP
503
-.Vb 2
504
-\&    # Sample
505
-\&    $dbi->delete('Books', {id => 5});
506
-.Ve
507
-.Sh "delete_all"
508
-.IX Subsection "delete_all"
509
-.Vb 2
510
-\&    # Delete all rows
511
-\&    $dbi->delete_all($table);
512
-.Ve
513
-.Sh "last_insert_id"
514
-.IX Subsection "last_insert_id"
515
-.Vb 2
516
-\&    # Get last insert id
517
-\&    $last_insert_id = $dbi->last_insert_id;
518
-.Ve
519
-.PP
520
-This method is same as \s-1DBI\s0 last_insert_id;
521
-.Sh "select"
522
-.IX Subsection "select"
523
-.Vb 8
524
-\&    # Select
525
-\&    $dbi->select(
526
-\&        $table,                # must be string or array;
527
-\&        [@$columns],           # must be array reference. this is optional
528
-\&        {%$where_params},      # must be hash reference.  this is optional
529
-\&        $append_statement,     # must be string.          this is optional
530
-\&        $query_edit_callback   # must be code reference.  this is optional
531
-\&    );
532
-.Ve
533
-.PP
534
-.Vb 13
535
-\&    # Sample
536
-\&    $dbi->select(
537
-\&        'Books',
538
-\&        ['title', 'author'],
539
-\&        {id => 1},
540
-\&        "for update",
541
-\&        sub {
542
-\&            my $query = shift;
543
-\&            $query->bind_filter(sub {
544
-\&                # ...
545
-\&            });
546
-\&        }
547
-\&    );
548
-.Ve
549
-.PP
550
-.Vb 7
551
-\&    # The way to join multi tables
552
-\&    $dbi->select(
553
-\&        ['table1', 'table2'],
554
-\&        ['table1.id as table1_id', 'title'],
555
-\&        {table1.id => 1},
556
-\&        "where table1.id = table2.id",
557
-\&    );
558
-.Ve
559
-.SH "Class Accessors"
560
-.IX Header "Class Accessors"
561
-.Sh "query_cache_max"
562
-.IX Subsection "query_cache_max"
563
-.Vb 3
564
-\&    # Max query cache count
565
-\&    $class           = $class->query_cache_max($query_cache_max);
566
-\&    $query_cache_max = $class->query_cache_max;
567
-.Ve
568
-.PP
569
-.Vb 2
570
-\&    # Sample
571
-\&    DBIx::Custom->query_cache_max(50);
572
-.Ve
573
-.SH "CAUTION"
574
-.IX Header "CAUTION"
575
-DBIx::Custom have \s-1DIB\s0 object internal.
576
-This module is work well in the following \s-1DBI\s0 condition.
577
-.PP
578
-.Vb 2
579
-\&    1. AutoCommit is true
580
-\&    2. RaiseError is true
581
-.Ve
582
-.PP
583
-By default, Both AutoCommit and RaiseError is true.
584
-You must not change these mode not to damage your data.
585
-.PP
586
-If you change these mode, 
587
-you cannot get correct error message, 
588
-or run_transaction may fail.
589
-.SH "AUTHOR"
590
-.IX Header "AUTHOR"
591
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
592
-.PP
593
-Github <http://github.com/yuki\-kimoto>
594
-.SH "COPYRIGHT & LICENSE"
595
-.IX Header "COPYRIGHT & LICENSE"
596
-Copyright 2009 Yuki Kimoto, all rights reserved.
597
-.PP
598
-This program is free software; you can redistribute it and/or modify it
599
-under the same terms as Perl itself.
-217
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::Basic.3pm
... ...
@@ -1,217 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::Basic 3"
132
-.TH DBIx::Custom::Basic 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::Basic \- DBIx::Custom basic implementation
135
-.SH "Version"
136
-.IX Header "Version"
137
-Version 0.0201
138
-.SH "See DBIx::Custom documentation"
139
-.IX Header "See DBIx::Custom documentation"
140
-This class is DBIx::Custom subclass.
141
-.PP
142
-You can use all methods of DBIx::Custom
143
-.PP
144
-Please see DBIx::Custom documentation
145
-.SH "Filters"
146
-.IX Header "Filters"
147
-.Sh "encode_utf8"
148
-.IX Subsection "encode_utf8"
149
-.Vb 2
150
-\&    # Encode to UTF-8 byte stream (utf8::upgrade is done if need)
151
-\&    $dbi->filters->{encode_utf8}->($value);
152
-.Ve
153
-.PP
154
-This filter is generally used as bind filter
155
-.PP
156
-.Vb 1
157
-\&    $dbi->bind_filter($dbi->filters->{encode_utf8});
158
-.Ve
159
-.Sh "decode_utf8"
160
-.IX Subsection "decode_utf8"
161
-.Vb 2
162
-\&    # Decode to perl internal string
163
-\&    $dbi->filters->{decode_utf8}->($value);
164
-.Ve
165
-.PP
166
-This filter is generally used as fetch filter
167
-.PP
168
-.Vb 1
169
-\&    $dbi->fetch_filter($dbi->filters->{decode_utf8});
170
-.Ve
171
-.Sh "Formats"
172
-.IX Subsection "Formats"
173
-strptime formats is available
174
-.PP
175
-.Vb 7
176
-\&    # format name        format
177
-\&    'SQL99_date'         '%Y-%m-%d',
178
-\&    'SQL99_datetime'     '%Y-%m-%d %H:%M:%S',
179
-\&    'SQL99_time'         '%H:%M:%S',
180
-\&    'ISO-8601_date'      '%Y-%m-%d',
181
-\&    'ISO-8601_datetime'  '%Y-%m-%dT%H:%M:%S',
182
-\&    'ISO-8601_time'      '%H:%M:%S',
183
-.Ve
184
-.PP
185
-You get format as the following
186
-.PP
187
-.Vb 1
188
-\&    my $format = $dbi->formats->{$format_name};
189
-.Ve
190
-.SH "Methods"
191
-.IX Header "Methods"
192
-.Sh "utf8_filter_on"
193
-.IX Subsection "utf8_filter_on"
194
-.Vb 2
195
-\&    # Encode and decode utf8 filter on
196
-\&    $dbi->utf8_filter_on;
197
-.Ve
198
-.PP
199
-This equel to
200
-.PP
201
-.Vb 2
202
-\&    $dbi->bind_filter($dbi->filters->{encode_utf8});
203
-\&    $dbi->fetch_filter($dbi->filters->{decode_utf8});
204
-.Ve
205
-.SH "AUTHOR"
206
-.IX Header "AUTHOR"
207
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
208
-.PP
209
-Github <http://github.com/yuki\-kimoto>
210
-.PP
211
-I develope this module <http://github.com/yuki\-kimoto/DBIx\-Custom>
212
-.SH "COPYRIGHT & LICENSE"
213
-.IX Header "COPYRIGHT & LICENSE"
214
-Copyright 2009 Yuki Kimoto, all rights reserved.
215
-.PP
216
-This program is free software; you can redistribute it and/or modify it
217
-under the same terms as Perl itself.
-198
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::MySQL.3pm
... ...
@@ -1,198 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::MySQL 3"
132
-.TH DBIx::Custom::MySQL 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::MySQL \- DBIx::Custom MySQL implementation
135
-.SH "Version"
136
-.IX Header "Version"
137
-Version 0.0102
138
-.SH "Synopsys"
139
-.IX Header "Synopsys"
140
-.Vb 5
141
-\&    # New
142
-\&    my $dbi = DBIx::Custom::MySQL->new(user => 'taro', $password => 'kliej&@K',
143
-\&                                      database => 'sample_db');
144
-\&    # Insert 
145
-\&    $dbi->insert('books', {title => 'perl', author => 'taro'});
146
-.Ve
147
-.PP
148
-.Vb 3
149
-\&    # Update 
150
-\&    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
151
-\&    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
152
-.Ve
153
-.PP
154
-.Vb 2
155
-\&    # Delete
156
-\&    $dbi->delete('books', {author => 'taro'});
157
-.Ve
158
-.PP
159
-.Vb 2
160
-\&    # select * from books;
161
-\&    $dbi->select('books');
162
-.Ve
163
-.PP
164
-.Vb 2
165
-\&    # select * from books where ahthor = 'taro'; 
166
-\&    $dbi->select('books', {author => 'taro'});
167
-.Ve
168
-.SH "See DBIx::Custom and DBI::Custom::Basic documentation"
169
-.IX Header "See DBIx::Custom and DBI::Custom::Basic documentation"
170
-This class is DBIx::Custom::Basic subclass,
171
-and DBIx::Custom::Basic is DBIx::Custom subclass.
172
-.PP
173
-You can use all methods of DBIx::Custom::Basic and <DBIx::Custom>
174
-Please see DBIx::Custom::Basic and <DBIx::Custom> documentation.
175
-.SH "Object methods"
176
-.IX Header "Object methods"
177
-.Sh "connect"
178
-.IX Subsection "connect"
179
-.Vb 1
180
-\&    This method override DBIx::Custom::connect
181
-.Ve
182
-.PP
183
-.Vb 1
184
-\&    If database attribute is set, automatically data source is created and connect
185
-.Ve
186
-.SH "Author"
187
-.IX Header "Author"
188
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
189
-.PP
190
-Github <http://github.com/yuki\-kimoto>
191
-.PP
192
-I develope this module <http://github.com/yuki\-kimoto/DBIx\-Custom>
193
-.SH "Copyright & license"
194
-.IX Header "Copyright & license"
195
-Copyright 2009 Yuki Kimoto, all rights reserved.
196
-.PP
197
-This program is free software; you can redistribute it and/or modify it
198
-under the same terms as Perl itself.
-222
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::Query.3pm
... ...
@@ -1,222 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::Query 3"
132
-.TH DBIx::Custom::Query 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::Query \- Query object for DBIx::Custom
135
-.SH "VERSION"
136
-.IX Header "VERSION"
137
-Version 0.0101
138
-.SH "SYNOPSIS"
139
-.IX Header "SYNOPSIS"
140
-.Vb 3
141
-\&    # Create query
142
-\&    my $dbi = DBIx::Custom->new;
143
-\&    my $query = $dbi->create_query($template);
144
-.Ve
145
-.PP
146
-.Vb 3
147
-\&    # Set query attributes
148
-\&    $query->bind_filter($dbi->filters->{default_bind_filter});
149
-\&    $query->no_bind_filters('title', 'author');
150
-.Ve
151
-.PP
152
-.Vb 2
153
-\&    $query->fetch_filter($dbi->filters->{default_fetch_filter});
154
-\&    $query->no_fetch_filters('title', 'author');
155
-.Ve
156
-.PP
157
-.Vb 2
158
-\&    # Execute query
159
-\&    $dbi->execute($query, $params);
160
-.Ve
161
-.SH "OBJECT ACCESSORS"
162
-.IX Header "OBJECT ACCESSORS"
163
-.Sh "sth"
164
-.IX Subsection "sth"
165
-.Vb 3
166
-\&    # Set and get statement handle
167
-\&    $self = $query->sth($sql);
168
-\&    $sth  = $query->sth;
169
-.Ve
170
-.Sh "sql"
171
-.IX Subsection "sql"
172
-.Vb 3
173
-\&    # Set and get SQL
174
-\&    $self = $query->sql($sql);
175
-\&    $sql  = $query->sql;
176
-.Ve
177
-.Sh "bind_filter"
178
-.IX Subsection "bind_filter"
179
-.Vb 3
180
-\&    # Set and get bind filter
181
-\&    $self        = $query->bind_filter($bind_filter);
182
-\&    $bind_filter = $query->bind_filter;
183
-.Ve
184
-.Sh "no_bind_filters"
185
-.IX Subsection "no_bind_filters"
186
-.Vb 3
187
-\&    # Set and get keys of no filtering
188
-\&    $self            = $query->no_bind_filters($no_filters);
189
-\&    $no_bind_filters = $query->no_bind_filters;
190
-.Ve
191
-.Sh "fetch_filter"
192
-.IX Subsection "fetch_filter"
193
-.Vb 3
194
-\&    # Set and get fetch filter
195
-\&    $self        = $query->fetch_filter($fetch_filter);
196
-\&    $fetch_filter = $query->fetch_filter;
197
-.Ve
198
-.Sh "no_fetch_filters"
199
-.IX Subsection "no_fetch_filters"
200
-.Vb 3
201
-\&    # Set and get keys of no filtering
202
-\&    $self            = $query->no_fetch_filters($no_filters);
203
-\&    $no_fetch_filters = $query->no_fetch_filters;
204
-.Ve
205
-.Sh "key_infos"
206
-.IX Subsection "key_infos"
207
-.Vb 3
208
-\&    # Set and get key informations
209
-\&    $self      = $query->key_infos($key_infos);
210
-\&    $key_infos = $query->key_infos;
211
-.Ve
212
-.SH "AUTHOR"
213
-.IX Header "AUTHOR"
214
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
215
-.PP
216
-Github <http://github.com/yuki\-kimoto>
217
-.SH "COPYRIGHT & LICENSE"
218
-.IX Header "COPYRIGHT & LICENSE"
219
-Copyright 2009 Yuki Kimoto, all rights reserved.
220
-.PP
221
-This program is free software; you can redistribute it and/or modify it
222
-under the same terms as Perl itself.
-367
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::Result.3pm
... ...
@@ -1,367 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::Result 3"
132
-.TH DBIx::Custom::Result 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::Result \- Resultset for DBIx::Custom
135
-.SH "VERSION"
136
-.IX Header "VERSION"
137
-Version 0.0301
138
-.SH "SYNOPSIS"
139
-.IX Header "SYNOPSIS"
140
-.Vb 3
141
-\&    # $result is DBIx::Custom::Result object
142
-\&    my $dbi = DBIx::Custom->new;
143
-\&    my $result = $dbi->query($sql_template, $param);
144
-.Ve
145
-.PP
146
-.Vb 3
147
-\&    while (my ($val1, $val2) = $result->fetch) {
148
-\&        # do something
149
-\&    }
150
-.Ve
151
-.SH "OBJECT ACCESSORS"
152
-.IX Header "OBJECT ACCESSORS"
153
-.Sh "sth"
154
-.IX Subsection "sth"
155
-.Vb 3
156
-\&    # Set and Get statement handle
157
-\&    $self = $result->sth($sth);
158
-\&    $sth  = $reuslt->sth
159
-.Ve
160
-.PP
161
-Statement handle is automatically set by DBIx::Custom.
162
-so you do not set statement handle.
163
-.PP
164
-If you need statement handle, you can get statement handle by using this method.
165
-.Sh "fetch_filter"
166
-.IX Subsection "fetch_filter"
167
-.Vb 3
168
-\&    # Set and Get fetch filter
169
-\&    $self         = $result->fetch_filter($sth);
170
-\&    $fetch_filter = $result->fech_filter;
171
-.Ve
172
-.PP
173
-Statement handle is automatically set by DBIx::Custom.
174
-If you want to set your fetch filter, you set it.
175
-.Sh "no_fetch_filters"
176
-.IX Subsection "no_fetch_filters"
177
-.Vb 3
178
-\&    # Set and Get no filter keys when fetching
179
-\&    $self             = $result->no_fetch_filters($no_fetch_filters);
180
-\&    $no_fetch_filters = $result->no_fetch_filters;
181
-.Ve
182
-.SH "METHODS"
183
-.IX Header "METHODS"
184
-.Sh "fetch"
185
-.IX Subsection "fetch"
186
-.Vb 2
187
-\&    # Fetch row as array reference (Scalar context)
188
-\&    $row = $result->fetch;
189
-.Ve
190
-.PP
191
-.Vb 2
192
-\&    # Fetch row as array (List context)
193
-\&    @row = $result->fecth
194
-.Ve
195
-.PP
196
-.Vb 6
197
-\&    # Sample
198
-\&    while (my $row = $result->fetch) {
199
-\&        # do something
200
-\&        my $val1 = $row->[0];
201
-\&        my $val2 = $row->[1];
202
-\&    }
203
-.Ve
204
-.PP
205
-fetch method is fetch resultset and get row as array or array reference.
206
-.Sh "fetch_hash"
207
-.IX Subsection "fetch_hash"
208
-.Vb 2
209
-\&    # Fetch row as hash reference (Scalar context)
210
-\&    $row = $result->fetch_hash;
211
-.Ve
212
-.PP
213
-.Vb 2
214
-\&    # Fetch row as hash (List context)
215
-\&    %row = $result->fecth_hash
216
-.Ve
217
-.PP
218
-.Vb 6
219
-\&    # Sample
220
-\&    while (my $row = $result->fetch_hash) {
221
-\&        # do something
222
-\&        my $val1 = $row->{key1};
223
-\&        my $val2 = $row->{key2};
224
-\&    }
225
-.Ve
226
-.PP
227
-fetch_hash method is fetch resultset and get row as hash or hash reference.
228
-.Sh "fetch_first"
229
-.IX Subsection "fetch_first"
230
-.Vb 2
231
-\&    # Fetch only first (Scalar context)
232
-\&    $row = $result->fetch_first;
233
-.Ve
234
-.PP
235
-.Vb 2
236
-\&    # Fetch only first (List context)
237
-\&    @row = $result->fetch_first;
238
-.Ve
239
-.PP
240
-This method fetch only first and finish statement handle
241
-.Sh "fetch_hash_first"
242
-.IX Subsection "fetch_hash_first"
243
-.Vb 2
244
-\&    # Fetch only first as hash (Scalar context)
245
-\&    $row = $result->fetch_hash_first;
246
-.Ve
247
-.PP
248
-.Vb 2
249
-\&    # Fetch only first as hash (Scalar context)
250
-\&    @row = $result->fetch_hash_first;
251
-.Ve
252
-.PP
253
-This method fetch only first and finish statement handle
254
-.Sh "fetch_rows"
255
-.IX Subsection "fetch_rows"
256
-.Vb 2
257
-\&    # Fetch multi rows (Scalar context)
258
-\&    $rows = $result->fetch_rows($row_count);
259
-.Ve
260
-.PP
261
-.Vb 2
262
-\&    # Fetch multi rows (List context)
263
-\&    @rows = $result->fetch_rows($row_count);
264
-.Ve
265
-.PP
266
-.Vb 2
267
-\&    # Sapmle 
268
-\&    $rows = $result->fetch_rows(10);
269
-.Ve
270
-.Sh "fetch_hash_rows"
271
-.IX Subsection "fetch_hash_rows"
272
-.Vb 2
273
-\&    # Fetch multi rows as hash (Scalar context)
274
-\&    $rows = $result->fetch_hash_rows($row_count);
275
-.Ve
276
-.PP
277
-.Vb 2
278
-\&    # Fetch multi rows as hash (List context)
279
-\&    @rows = $result->fetch_hash_rows($row_count);
280
-.Ve
281
-.PP
282
-.Vb 2
283
-\&    # Sapmle 
284
-\&    $rows = $result->fetch_hash_rows(10);
285
-.Ve
286
-.Sh "fetch_all"
287
-.IX Subsection "fetch_all"
288
-.Vb 2
289
-\&    # Fetch all row as array ref of array ref (Scalar context)
290
-\&    $rows = $result->fetch_all;
291
-.Ve
292
-.PP
293
-.Vb 2
294
-\&    # Fetch all row as array of array ref (List context)
295
-\&    @rows = $result->fecth_all;
296
-.Ve
297
-.PP
298
-.Vb 4
299
-\&    # Sample
300
-\&    my $rows = $result->fetch_all;
301
-\&    my $val0_0 = $rows->[0][0];
302
-\&    my $val1_1 = $rows->[1][1];
303
-.Ve
304
-.PP
305
-fetch_all method is fetch resultset and get all rows as array or array reference.
306
-.Sh "fetch_hash_all"
307
-.IX Subsection "fetch_hash_all"
308
-.Vb 2
309
-\&    # Fetch all row as array ref of hash ref (Scalar context)
310
-\&    $rows = $result->fetch_hash_all;
311
-.Ve
312
-.PP
313
-.Vb 2
314
-\&    # Fetch all row as array of hash ref (List context)
315
-\&    @rows = $result->fecth_all_hash;
316
-.Ve
317
-.PP
318
-.Vb 4
319
-\&    # Sample
320
-\&    my $rows = $result->fetch_hash_all;
321
-\&    my $val0_key1 = $rows->[0]{key1};
322
-\&    my $val1_key2 = $rows->[1]{key2};
323
-.Ve
324
-.Sh "error"
325
-.IX Subsection "error"
326
-.Vb 3
327
-\&    # Get error infomation
328
-\&    $error_messege = $result->error;
329
-\&    ($error_message, $error_number, $error_state) = $result->error;
330
-.Ve
331
-.PP
332
-You can get get information. This is crenspond to the following.
333
-.PP
334
-.Vb 3
335
-\&    $error_message : $result->sth->errstr
336
-\&    $error_number  : $result->sth->err
337
-\&    $error_state   : $result->sth->state
338
-.Ve
339
-.Sh "finish"
340
-.IX Subsection "finish"
341
-.Vb 2
342
-\&    # Finish statement handle
343
-\&    $result->finish
344
-.Ve
345
-.PP
346
-.Vb 3
347
-\&    # Sample
348
-\&    my $row = $reuslt->fetch; # fetch only one row
349
-\&    $result->finish
350
-.Ve
351
-.PP
352
-You can finish statement handle.This is equel to
353
-.PP
354
-.Vb 1
355
-\&    $result->sth->finish;
356
-.Ve
357
-.SH "AUTHOR"
358
-.IX Header "AUTHOR"
359
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
360
-.PP
361
-Github <http://github.com/yuki\-kimoto>
362
-.SH "COPYRIGHT & LICENSE"
363
-.IX Header "COPYRIGHT & LICENSE"
364
-Copyright 2009 Yuki Kimoto, all rights reserved.
365
-.PP
366
-This program is free software; you can redistribute it and/or modify it
367
-under the same terms as Perl itself.
-404
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::SQL::Template.3pm
... ...
@@ -1,404 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::SQL::Template 3"
132
-.TH DBIx::Custom::SQL::Template 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::SQL::Template \- Custamizable SQL Template for DBIx::Custom
135
-.SH "VERSION"
136
-.IX Header "VERSION"
137
-Version 0.0101
138
-.SH "SYNOPSIS"
139
-.IX Header "SYNOPSIS"
140
-.Vb 1
141
-\&    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
142
-.Ve
143
-.PP
144
-.Vb 2
145
-\&    my $tmpl   = "select from table {= k1} && {<> k2} || {like k3}";
146
-\&    my $param = {k1 => 1, k2 => 2, k3 => 3};
147
-.Ve
148
-.PP
149
-.Vb 1
150
-\&    my $query = $sql_template->create_query($tmpl);
151
-.Ve
152
-.PP
153
-.Vb 8
154
-\&    # Using query from DBIx::Custom
155
-\&    use DBIx::Custom;
156
-\&    my $dbi = DBI->new(
157
-\&       data_source => $data_source,
158
-\&       user        => $user,
159
-\&       password    => $password, 
160
-\&       dbi_options => {PrintError => 0, RaiseError => 1}
161
-\&    );
162
-.Ve
163
-.PP
164
-.Vb 2
165
-\&    $query = $dbi->create_query($tmpl); # This is SQL::Template create_query
166
-\&    $dbi->query($query, $param);
167
-.Ve
168
-.SH "CLASS-OBJECT ACCESSORS"
169
-.IX Header "CLASS-OBJECT ACCESSORS"
170
-Class-Object accessor is used from both object and class
171
-.PP
172
-.Vb 2
173
-\&    $class->$accessor # call from class
174
-\&    $self->$accessor  # call form object
175
-.Ve
176
-.Sh "tag_processors"
177
-.IX Subsection "tag_processors"
178
-.Vb 3
179
-\&    # Set and get
180
-\&    $self           = $sql_tmpl->tag_processors($tag_processors);
181
-\&    $tag_processors = $sql_tmpl->tag_processors;
182
-.Ve
183
-.PP
184
-.Vb 5
185
-\&    # Sample
186
-\&    $sql_tmpl->tag_processors(
187
-\&        '?' => \e&expand_question,
188
-\&        '=' => \e&expand_equel
189
-\&    );
190
-.Ve
191
-.PP
192
-You can use add_tag_processor to add tag processor
193
-.Sh "tag_start"
194
-.IX Subsection "tag_start"
195
-.Vb 3
196
-\&    # Set and get
197
-\&    $self      = $sql_tmpl->tag_start($tag_start);
198
-\&    $tag_start = $sql_tmpl->tag_start;
199
-.Ve
200
-.PP
201
-.Vb 2
202
-\&    # Sample
203
-\&    $sql_tmpl->tag_start('{');
204
-.Ve
205
-.PP
206
-Default is '{'
207
-.Sh "tag_end"
208
-.IX Subsection "tag_end"
209
-.Vb 3
210
-\&    # Set and get
211
-\&    $self    = $sql_tmpl->tag_start($tag_end);
212
-\&    $tag_end = $sql_tmpl->tag_start;
213
-.Ve
214
-.PP
215
-.Vb 2
216
-\&    # Sample
217
-\&    $sql_tmpl->tag_start('}');
218
-.Ve
219
-.PP
220
-Default is '}'
221
-.Sh "tag_syntax"
222
-.IX Subsection "tag_syntax"
223
-.Vb 3
224
-\&    # Set and get
225
-\&    $self       = $sql_tmpl->tag_syntax($tag_syntax);
226
-\&    $tag_syntax = $sql_tmpl->tag_syntax;
227
-.Ve
228
-.PP
229
-.Vb 7
230
-\&    # Sample
231
-\&    $sql_tmpl->tag_syntax(
232
-\&        "[Tag]            [Expand]\en" .
233
-\&        "{? name}         ?\en" .
234
-\&        "{= name}         name = ?\en" .
235
-\&        "{<> name}        name <> ?\en"
236
-\&    );
237
-.Ve
238
-.SH "METHODS"
239
-.IX Header "METHODS"
240
-.Sh "create_query"
241
-.IX Subsection "create_query"
242
-.Vb 2
243
-\&    # Create SQL form SQL template
244
-\&    $query = $sql_tmpl->create_query($tmpl);
245
-.Ve
246
-.PP
247
-.Vb 3
248
-\&    # Sample
249
-\&    $query = $sql_tmpl->create_sql(
250
-\&         "select * from table where {= title} && {like author} || {<= price}")
251
-.Ve
252
-.PP
253
-.Vb 3
254
-\&    # Result
255
-\&    $qeury->{sql} : "select * from table where title = ? && author like ? price <= ?;"
256
-\&    $query->{key_infos} : [['title'], ['author'], ['price']]
257
-.Ve
258
-.PP
259
-.Vb 5
260
-\&    # Sample2 (with table name)
261
-\&    ($sql, @bind_values) = $sql_tmpl->create_sql(
262
-\&            "select * from table where {= table.title} && {like table.author}",
263
-\&            {table => {title => 'Perl', author => '%Taro%'}}
264
-\&        )
265
-.Ve
266
-.PP
267
-.Vb 4
268
-\&    # Result2
269
-\&    $query->{sql} : "select * from table where table.title = ? && table.title like ?;"
270
-\&    $query->{key_infos} :[ [['table.title'],['table', 'title']],
271
-\&                           [['table.author'],['table', 'author']] ]
272
-.Ve
273
-.PP
274
-This method create query using by DBIx::Custom.
275
-query is two infomation
276
-.PP
277
-.Vb 2
278
-\&    1.sql       : SQL
279
-\&    2.key_infos : Parameter access key information
280
-.Ve
281
-.Sh "add_tag_processor"
282
-.IX Subsection "add_tag_processor"
283
-Add tag processor
284
-.PP
285
-.Vb 2
286
-\&    # Add
287
-\&    $self = $sql_tmpl->add_tag_processor($tag_processor);
288
-.Ve
289
-.PP
290
-.Vb 4
291
-\&    # Sample
292
-\&    $sql_tmpl->add_tag_processor(
293
-\&        '?' => sub {
294
-\&            my ($tag_name, $tag_args) = @_;
295
-.Ve
296
-.PP
297
-.Vb 2
298
-\&            my $key1 = $tag_args->[0];
299
-\&            my $key2 = $tag_args->[1];
300
-.Ve
301
-.PP
302
-.Vb 1
303
-\&            my $key_infos = [];
304
-.Ve
305
-.PP
306
-.Vb 1
307
-\&            # Expand tag and create key informations
308
-.Ve
309
-.PP
310
-.Vb 4
311
-\&            # Return expand tags and key informations
312
-\&            return ($expand, $key_infos);
313
-\&        }
314
-\&    );
315
-.Ve
316
-.PP
317
-Tag processor recieve 2 argument
318
-.PP
319
-.Vb 2
320
-\&    1. Tag name            (?, =, <>, or etc)
321
-\&    2. Tag arguments       (arg1 and arg2 in {tag_name arg1 arg2})
322
-.Ve
323
-.PP
324
-Tag processor return 2 value
325
-.PP
326
-.Vb 2
327
-\&    1. Expanded Tag (For exsample, '{= title}' is expanded to 'title = ?')
328
-\&    2. Key infomations
329
-.Ve
330
-.PP
331
-You must be return expanded tag and key infomations.
332
-.PP
333
-Key information is a little complex. so I will explan this in future.
334
-.PP
335
-If you want to know more, Please see DBIx::Custom::SQL::Template source code.
336
-.Sh "clone"
337
-.IX Subsection "clone"
338
-.Vb 2
339
-\&    # Clone DBIx::Custom::SQL::Template object
340
-\&    $clone = $self->clone;
341
-.Ve
342
-.SH "Available Tags"
343
-.IX Header "Available Tags"
344
-.Vb 5
345
-\&    # Available Tags
346
-\&    [tag]            [expand]
347
-\&    {? name}         ?
348
-\&    {= name}         name = ?
349
-\&    {<> name}        name <> ?
350
-.Ve
351
-.PP
352
-.Vb 4
353
-\&    {< name}         name < ?
354
-\&    {> name}         name > ?
355
-\&    {>= name}        name >= ?
356
-\&    {<= name}        name <= ?
357
-.Ve
358
-.PP
359
-.Vb 2
360
-\&    {like name}      name like ?
361
-\&    {in name}        name in [?, ?, ..]
362
-.Ve
363
-.PP
364
-.Vb 2
365
-\&    {insert}  (key1, key2, key3) values (?, ?, ?)
366
-\&    {update}     set key1 = ?, key2 = ?, key3 = ?
367
-.Ve
368
-.PP
369
-.Vb 6
370
-\&    # Sample1
371
-\&    $query = $sql_tmpl->create_sql(
372
-\&        "insert into table {insert key1 key2}"
373
-\&    );
374
-\&    # Result1
375
-\&    $sql : "insert into table (key1, key2) values (?, ?)"
376
-.Ve
377
-.PP
378
-.Vb 4
379
-\&    # Sample2
380
-\&    $query = $sql_tmpl->create_sql(
381
-\&        "update table {update key1 key2} where {= key3}"
382
-\&    );
383
-.Ve
384
-.PP
385
-.Vb 2
386
-\&    # Result2
387
-\&    $query->{sql} : "update table set key1 = ?, key2 = ? where key3 = ?;"
388
-.Ve
389
-.SH "AUTHOR"
390
-.IX Header "AUTHOR"
391
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
392
-.PP
393
-Github 
394
-<http://github.com/yuki\-kimoto>
395
-<http://github.com/yuki\-kimoto/DBIx\-Custom\-SQL\-Template>
396
-.PP
397
-Please let know me bag if you find
398
-Please request me if you want to do something
399
-.SH "COPYRIGHT & LICENSE"
400
-.IX Header "COPYRIGHT & LICENSE"
401
-Copyright 2009 Yuki Kimoto, all rights reserved.
402
-.PP
403
-This program is free software; you can redistribute it and/or modify it
404
-under the same terms as Perl itself.
-229
DBIx-Custom-0.0501/blib/libdoc/DBIx::Custom::SQLite.3pm
... ...
@@ -1,229 +0,0 @@
1
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
2
-.\"
3
-.\" Standard preamble:
4
-.\" ========================================================================
5
-.de Sh \" Subsection heading
6
-.br
7
-.if t .Sp
8
-.ne 5
9
-.PP
10
-\fB\\$1\fR
11
-.PP
12
-..
13
-.de Sp \" Vertical space (when we can't use .PP)
14
-.if t .sp .5v
15
-.if n .sp
16
-..
17
-.de Vb \" Begin verbatim text
18
-.ft CW
19
-.nf
20
-.ne \\$1
21
-..
22
-.de Ve \" End verbatim text
23
-.ft R
24
-.fi
25
-..
26
-.\" Set up some character translations and predefined strings.  \*(-- will
27
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28
-.\" double quote, and \*(R" will give a right double quote.  | will give a
29
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
32
-.tr \(*W-|\(bv\*(Tr
33
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34
-.ie n \{\
35
-.    ds -- \(*W-
36
-.    ds PI pi
37
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39
-.    ds L" ""
40
-.    ds R" ""
41
-.    ds C` ""
42
-.    ds C' ""
43
-'br\}
44
-.el\{\
45
-.    ds -- \|\(em\|
46
-.    ds PI \(*p
47
-.    ds L" ``
48
-.    ds R" ''
49
-'br\}
50
-.\"
51
-.\" If the F register is turned on, we'll generate index entries on stderr for
52
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
54
-.\" output yourself in some meaningful fashion.
55
-.if \nF \{\
56
-.    de IX
57
-.    tm Index:\\$1\t\\n%\t"\\$2"
58
-..
59
-.    nr % 0
60
-.    rr F
61
-.\}
62
-.\"
63
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64
-.\" way too many mistakes in technical documents.
65
-.hy 0
66
-.if n .na
67
-.\"
68
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70
-.    \" fudge factors for nroff and troff
71
-.if n \{\
72
-.    ds #H 0
73
-.    ds #V .8m
74
-.    ds #F .3m
75
-.    ds #[ \f1
76
-.    ds #] \fP
77
-.\}
78
-.if t \{\
79
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80
-.    ds #V .6m
81
-.    ds #F 0
82
-.    ds #[ \&
83
-.    ds #] \&
84
-.\}
85
-.    \" simple accents for nroff and troff
86
-.if n \{\
87
-.    ds ' \&
88
-.    ds ` \&
89
-.    ds ^ \&
90
-.    ds , \&
91
-.    ds ~ ~
92
-.    ds /
93
-.\}
94
-.if t \{\
95
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101
-.\}
102
-.    \" troff and (daisy-wheel) nroff accents
103
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110
-.ds ae a\h'-(\w'a'u*4/10)'e
111
-.ds Ae A\h'-(\w'A'u*4/10)'E
112
-.    \" corrections for vroff
113
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115
-.    \" for low resolution devices (crt and lpr)
116
-.if \n(.H>23 .if \n(.V>19 \
117
-\{\
118
-.    ds : e
119
-.    ds 8 ss
120
-.    ds o a
121
-.    ds d- d\h'-1'\(ga
122
-.    ds D- D\h'-1'\(hy
123
-.    ds th \o'bp'
124
-.    ds Th \o'LP'
125
-.    ds ae ae
126
-.    ds Ae AE
127
-.\}
128
-.rm #[ #] #H #V #F C
129
-.\" ========================================================================
130
-.\"
131
-.IX Title "DBIx::Custom::SQLite 3"
132
-.TH DBIx::Custom::SQLite 3 "2009-11-16" "perl v5.8.8" "User Contributed Perl Documentation"
133
-.SH "NAME"
134
-DBIx::Custom::SQLite \- DBIx::Custom SQLite implementation
135
-.SH "Version"
136
-.IX Header "Version"
137
-Version 0.0201
138
-.SH "Synopsys"
139
-.IX Header "Synopsys"
140
-.Vb 1
141
-\&    use DBIx::Custom::SQLite;
142
-.Ve
143
-.PP
144
-.Vb 3
145
-\&    # New
146
-\&    my $dbi = DBIx::Custom::SQLite->new(user => 'taro', $password => 'kliej&@K',
147
-\&                                       database => 'sample.db');
148
-.Ve
149
-.PP
150
-.Vb 2
151
-\&    # Insert 
152
-\&    $dbi->insert('books', {title => 'perl', author => 'taro'});
153
-.Ve
154
-.PP
155
-.Vb 3
156
-\&    # Update 
157
-\&    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
158
-\&    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
159
-.Ve
160
-.PP
161
-.Vb 2
162
-\&    # Delete
163
-\&    $dbi->delete('books', {author => 'taro'});
164
-.Ve
165
-.PP
166
-.Vb 2
167
-\&    # select * from books;
168
-\&    $dbi->select('books');
169
-.Ve
170
-.PP
171
-.Vb 2
172
-\&    # select * from books where ahthor = 'taro'; 
173
-\&    $dbi->select('books', {author => 'taro'});
174
-.Ve
175
-.PP
176
-.Vb 2
177
-\&    # select author, title from books where author = 'taro'
178
-\&    $dbi->select('books', [qw/author title/], {author => 'taro'});
179
-.Ve
180
-.PP
181
-.Vb 3
182
-\&    # select author, title from books where author = 'taro' order by id limit 1;
183
-\&    $dbi->select('books', [qw/author title/], {author => 'taro'},
184
-\&                 'order by id limit 1');
185
-.Ve
186
-.SH "See DBIx::Custom and DBI::Custom::Basic documentation"
187
-.IX Header "See DBIx::Custom and DBI::Custom::Basic documentation"
188
-This class is DBIx::Custom::Basic subclass.
189
-and DBIx::Custom::Basic is DBIx::Custom subclass
190
-.PP
191
-You can use all methods of DBIx::Custom::Basic and <DBIx::Custom>
192
-Please see DBIx::Custom::Basic and <DBIx::Custom> documentation
193
-.SH "Object methods"
194
-.IX Header "Object methods"
195
-.Sh "connect"
196
-.IX Subsection "connect"
197
-This override DBIx::Custom connect.
198
-.PP
199
-.Vb 2
200
-\&    # Connect to database
201
-\&    $dbi->connect;
202
-.Ve
203
-.PP
204
-If database attribute is set, automatically data source is created and connect
205
-.Sh "connect_memory"
206
-.IX Subsection "connect_memory"
207
-.Vb 2
208
-\&    # Connect memory database
209
-\&    $self = $dbi->connect_memory;
210
-.Ve
211
-.Sh "reconnect_memory"
212
-.IX Subsection "reconnect_memory"
213
-.Vb 2
214
-\&    # Reconnect memory database
215
-\&    $self = $dbi->reconnect_memory;
216
-.Ve
217
-.SH "Author"
218
-.IX Header "Author"
219
-Yuki Kimoto, \f(CW\*(C`<kimoto.yuki at gmail.com>\*(C'\fR
220
-.PP
221
-Github <http://github.com/yuki\-kimoto>
222
-.PP
223
-I develope this module <http://github.com/yuki\-kimoto/DBIx\-Custom>
224
-.SH "Copyright & lisence"
225
-.IX Header "Copyright & lisence"
226
-Copyright 2009 Yuki Kimoto, all rights reserved.
227
-.PP
228
-This program is free software; you can redistribute it and/or modify it
229
-under the same terms as Perl itself.
-1127
DBIx-Custom-0.0501/lib/DBIx/Custom.pm
... ...
@@ -1,1127 +0,0 @@
1
-use 5.008001;
2
-
3
-package DBIx::Custom;
4
-use Object::Simple;
5
-
6
-our $VERSION = '0.0501';
7
-
8
-use Carp 'croak';
9
-use DBI;
10
-use DBIx::Custom::Query;
11
-use DBIx::Custom::Result;
12
-use DBIx::Custom::SQL::Template;
13
-
14
-
15
-### Class-Object Accessors
16
-sub user        : ClassObjectAttr { initialize => {clone => 'scalar'} }
17
-sub password    : ClassObjectAttr { initialize => {clone => 'scalar'} }
18
-sub data_source : ClassObjectAttr { initialize => {clone => 'scalar'} }
19
-sub dbi_options : ClassObjectAttr { initialize => {clone => 'hash', 
20
-                                                   default => sub { {} } } }
21
-sub database    : ClassObjectAttr { initialize => {clone => 'scalar'} }
22
-
23
-sub bind_filter  : ClassObjectAttr { initialize => {clone => 'scalar'} }
24
-sub fetch_filter : ClassObjectAttr { initialize => {clone => 'scalar'} }
25
-
26
-sub no_bind_filters   : ClassObjectAttr { initialize => {clone => 'array'} }
27
-sub no_fetch_filters  : ClassObjectAttr { initialize => {clone => 'array'} }
28
-
29
-sub filters : ClassObjectAttr {
30
-    type => 'hash',
31
-    deref => 1,
32
-    initialize => {
33
-        clone   => 'hash',
34
-        default => sub { {} }
35
-    }
36
-}
37
-
38
-sub formats : ClassObjectAttr {
39
-    type => 'hash',
40
-    deref => 1,
41
-    initialize => {
42
-        clone   => 'hash',
43
-        default => sub { {} }
44
-    }
45
-}
46
-
47
-sub result_class : ClassObjectAttr {
48
-    initialize => {
49
-        clone   => 'scalar',
50
-        default => 'DBIx::Custom::Result'
51
-    }
52
-}
53
-
54
-sub sql_template : ClassObjectAttr {
55
-    initialize => {
56
-        clone   => sub {$_[0] ? $_[0]->clone : undef},
57
-        default => sub {DBIx::Custom::SQL::Template->new}
58
-    }
59
-}
60
-
61
-### Object Accessor
62
-sub dbh          : Attr {}
63
-
64
-
65
-### Methods
66
-
67
-# Add filter
68
-sub add_filter {
69
-    my $invocant = shift;
70
-    
71
-    my %old_filters = $invocant->filters;
72
-    my %new_filters = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
73
-    $invocant->filters(%old_filters, %new_filters);
74
-    return $invocant;
75
-}
76
-
77
-# Add format
78
-sub add_format{
79
-    my $invocant = shift;
80
-    
81
-    my %old_formats = $invocant->formats;
82
-    my %new_formats = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
83
-    $invocant->formats(%old_formats, %new_formats);
84
-    return $invocant;
85
-}
86
-
87
-# Auto commit
88
-sub _auto_commit {
89
-    my $self = shift;
90
-    
91
-    croak("Not yet connect to database") unless $self->dbh;
92
-    
93
-    if (@_) {
94
-        $self->dbh->{AutoCommit} = $_[0];
95
-        return $self;
96
-    }
97
-    return $self->dbh->{AutoCommit};
98
-}
99
-
100
-# Connect
101
-sub connect {
102
-    my $self = shift;
103
-    my $data_source = $self->data_source;
104
-    my $user        = $self->user;
105
-    my $password    = $self->password;
106
-    my $dbi_options  = $self->dbi_options;
107
-    
108
-    my $dbh = eval{DBI->connect(
109
-        $data_source,
110
-        $user,
111
-        $password,
112
-        {
113
-            RaiseError => 1,
114
-            PrintError => 0,
115
-            AutoCommit => 1,
116
-            %{$dbi_options || {} }
117
-        }
118
-    )};
119
-    
120
-    croak $@ if $@;
121
-    
122
-    $self->dbh($dbh);
123
-    return $self;
124
-}
125
-
126
-# DESTROY
127
-sub DESTROY {
128
-    my $self = shift;
129
-    $self->disconnect if $self->connected;
130
-}
131
-
132
-# Is connected?
133
-sub connected {
134
-    my $self = shift;
135
-    return ref $self->{dbh} eq 'DBI::db';
136
-}
137
-
138
-# Disconnect
139
-sub disconnect {
140
-    my $self = shift;
141
-    if ($self->connected) {
142
-        $self->dbh->disconnect;
143
-        delete $self->{dbh};
144
-    }
145
-}
146
-
147
-# Reconnect
148
-sub reconnect {
149
-    my $self = shift;
150
-    $self->disconnect if $self->connected;
151
-    $self->connect;
152
-}
153
-
154
-# Prepare statement handle
155
-sub prepare {
156
-    my ($self, $sql) = @_;
157
-    
158
-    # Connect if not
159
-    $self->connect unless $self->connected;
160
-    
161
-    # Prepare
162
-    my $sth = eval{$self->dbh->prepare($sql)};
163
-    
164
-    # Error
165
-    croak("$@<Your SQL>\n$sql") if $@;
166
-    
167
-    return $sth;
168
-}
169
-
170
-# Execute SQL directly
171
-sub do{
172
-    my ($self, $sql, @bind_values) = @_;
173
-    
174
-    # Connect if not
175
-    $self->connect unless $self->connected;
176
-    
177
-    # Do
178
-    my $ret_val = eval{$self->dbh->do($sql, @bind_values)};
179
-    
180
-    # Error
181
-    if ($@) {
182
-        my $error = $@;
183
-        require Data::Dumper;
184
-        
185
-        my $bind_value_dump
186
-          = Data::Dumper->Dump([\@bind_values], ['*bind_valuds']);
187
-        
188
-        croak("$error<Your SQL>\n$sql\n<Your bind values>\n$bind_value_dump\n");
189
-    }
190
-}
191
-
192
-# Create query
193
-sub create_query {
194
-    my ($self, $template) = @_;
195
-    my $class = ref $self;
196
-    
197
-    # Create query from SQL template
198
-    my $sql_template = $self->sql_template;
199
-    
200
-    # Try to get cached query
201
-    my $query = $class->_query_caches->{$template};
202
-    
203
-    # Create query
204
-    unless ($query) {
205
-        $query = eval{$sql_template->create_query($template)};
206
-        croak($@) if $@;
207
-        
208
-        $query = DBIx::Custom::Query->new($query);
209
-        
210
-        $class->_add_query_cache($template, $query);
211
-    }
212
-    
213
-    # Connect if not
214
-    $self->connect unless $self->connected;
215
-    
216
-    # Prepare statement handle
217
-    my $sth = $self->prepare($query->{sql});
218
-    
219
-    # Set statement handle
220
-    $query->sth($sth);
221
-    
222
-    # Set bind filter
223
-    $query->bind_filter($self->bind_filter);
224
-    
225
-    # Set no filter keys when binding
226
-    $query->no_bind_filters($self->no_bind_filters);
227
-    
228
-    # Set fetch filter
229
-    $query->fetch_filter($self->fetch_filter);
230
-    
231
-    # Set no filter keys when fetching
232
-    $query->no_fetch_filters($self->no_fetch_filters);
233
-    
234
-    return $query;
235
-}
236
-
237
-# Execute query
238
-sub execute {
239
-    my ($self, $query, $params)  = @_;
240
-    $params ||= {};
241
-    
242
-    # First argument is SQL template
243
-    if (!ref $query) {
244
-        my $template = $query;
245
-        $query = $self->create_query($template);
246
-        my $query_edit_cb = $_[3];
247
-        $query_edit_cb->($query) if ref $query_edit_cb eq 'CODE';
248
-    }
249
-    
250
-    # Create bind value
251
-    my $bind_values = $self->_build_bind_values($query, $params);
252
-    
253
-    # Execute
254
-    my $sth = $query->sth;
255
-    my $ret_val = eval{$sth->execute(@$bind_values)};
256
-    
257
-    # Execute error
258
-    if (my $execute_error = $@) {
259
-        require Data::Dumper;
260
-        my $sql              = $query->{sql} || '';
261
-        my $key_infos_dump   = Data::Dumper->Dump([$query->key_infos], ['*key_infos']);
262
-        my $params_dump      = Data::Dumper->Dump([$params], ['*params']);
263
-        
264
-        croak("$execute_error" . 
265
-              "<Your SQL>\n$sql\n" . 
266
-              "<Your parameters>\n$params_dump");
267
-    }
268
-    
269
-    # Return resultset if select statement is executed
270
-    if ($sth->{NUM_OF_FIELDS}) {
271
-        
272
-        # Get result class
273
-        my $result_class = $self->result_class;
274
-        
275
-        # Create result
276
-        my $result = $result_class->new({
277
-            sth              => $sth,
278
-            fetch_filter     => $query->fetch_filter,
279
-            no_fetch_filters => $query->no_fetch_filters
280
-        });
281
-        return $result;
282
-    }
283
-    return $ret_val;
284
-}
285
-
286
-# Build binding values
287
-sub _build_bind_values {
288
-    my ($self, $query, $params) = @_;
289
-    my $key_infos           = $query->key_infos;
290
-    my $bind_filter         = $query->bind_filter;
291
-    my $no_bind_filters_map = $query->_no_bind_filters_map || {};
292
-    
293
-    # binding values
294
-    my @bind_values;
295
-    
296
-    # Create bind values
297
-    KEY_INFOS :
298
-    foreach my $key_info (@$key_infos) {
299
-        # Set variable
300
-        my $access_keys  = $key_info->{access_keys};
301
-        my $original_key = $key_info->{original_key} || '';
302
-        my $table        = $key_info->{table}        || '';
303
-        my $column       = $key_info->{column}       || '';
304
-        
305
-        # Key is found?
306
-        my $found;
307
-        
308
-        # Build bind values
309
-        ACCESS_KEYS :
310
-        foreach my $access_key (@$access_keys) {
311
-            # Root parameter
312
-            my $root_params = $params;
313
-            
314
-            # Search corresponding value
315
-            for (my $i = 0; $i < @$access_key; $i++) {
316
-                # Current key
317
-                my $current_key = $access_key->[$i];
318
-                
319
-                # Last key
320
-                if ($i == @$access_key - 1) {
321
-                    # Key is array reference
322
-                    if (ref $current_key eq 'ARRAY') {
323
-                        # Filtering 
324
-                        if ($bind_filter &&
325
-                            !$no_bind_filters_map->{$original_key})
326
-                        {
327
-                            push @bind_values, 
328
-                                 $bind_filter->($root_params->[$current_key->[0]], 
329
-                                                $original_key,
330
-                                                $table, $column);
331
-                        }
332
-                        # Not filtering
333
-                        else {
334
-                            push @bind_values,
335
-                                 scalar $root_params->[$current_key->[0]];
336
-                        }
337
-                    }
338
-                    # Key is string
339
-                    else {
340
-                        # Key is not found
341
-                        next ACCESS_KEYS
342
-                          unless exists $root_params->{$current_key};
343
-                        
344
-                        # Filtering
345
-                        if ($bind_filter &&
346
-                            !$no_bind_filters_map->{$original_key}) 
347
-                        {
348
-                            push @bind_values,
349
-                                 $bind_filter->($root_params->{$current_key},
350
-                                                $original_key,
351
-                                                $table, $column);
352
-                        }
353
-                        # Not filtering
354
-                        else {
355
-                            push @bind_values,
356
-                                 scalar $root_params->{$current_key};
357
-                        }
358
-                    }
359
-                    
360
-                    # Key is found
361
-                    $found = 1;
362
-                    next KEY_INFOS;
363
-                }
364
-                # First or middle key
365
-                else {
366
-                    # Key is array reference
367
-                    if (ref $current_key eq 'ARRAY') {
368
-                        # Go next key
369
-                        $root_params = $root_params->[$current_key->[0]];
370
-                    }
371
-                    # Key is string
372
-                    else {
373
-                        # Not found
374
-                        next ACCESS_KEYS
375
-                          unless exists $root_params->{$current_key};
376
-                        
377
-                        # Go next key
378
-                        $root_params = $root_params->{$current_key};
379
-                    }
380
-                }
381
-            }
382
-        }
383
-        
384
-        # Key is not found
385
-        unless ($found) {
386
-            require Data::Dumper;
387
-            my $key_info_dump  = Data::Dumper->Dump([$key_info], ['*key_info']);
388
-            my $params_dump    = Data::Dumper->Dump([$params], ['*params']);
389
-            croak("Corresponding key is not found in your parameters\n" . 
390
-                  "<Key information>\n$key_info_dump\n\n" .
391
-                  "<Your parameters>\n$params_dump\n");
392
-        }
393
-    }
394
-    return \@bind_values;
395
-}
396
-
397
-# Run transaction
398
-sub run_transaction {
399
-    my ($self, $transaction) = @_;
400
-    
401
-    # Check auto commit
402
-    croak("AutoCommit must be true before transaction start")
403
-      unless $self->_auto_commit;
404
-    
405
-    # Auto commit off
406
-    $self->_auto_commit(0);
407
-    
408
-    # Run transaction
409
-    eval {$transaction->()};
410
-    
411
-    # Tranzaction error
412
-    my $transaction_error = $@;
413
-    
414
-    # Tranzaction is failed.
415
-    if ($transaction_error) {
416
-        # Rollback
417
-        eval{$self->dbh->rollback};
418
-        
419
-        # Rollback error
420
-        my $rollback_error = $@;
421
-        
422
-        # Auto commit on
423
-        $self->_auto_commit(1);
424
-        
425
-        if ($rollback_error) {
426
-            # Rollback is failed
427
-            croak("${transaction_error}Rollback is failed : $rollback_error");
428
-        }
429
-        else {
430
-            # Rollback is success
431
-            croak("${transaction_error}Rollback is success");
432
-        }
433
-    }
434
-    # Tranzaction is success
435
-    else {
436
-        # Commit
437
-        eval{$self->dbh->commit};
438
-        my $commit_error = $@;
439
-        
440
-        # Auto commit on
441
-        $self->_auto_commit(1);
442
-        
443
-        # Commit is failed
444
-        croak($commit_error) if $commit_error;
445
-    }
446
-}
447
-
448
-# Get last insert id
449
-sub last_insert_id {
450
-    my $self = shift;
451
-    
452
-    # Not connected
453
-    croak("Not yet connect to database")
454
-      unless $self->connected;
455
-    
456
-    return $self->dbh->last_insert_id(@_);
457
-}
458
-
459
-# Insert
460
-sub insert {
461
-    my ($self, $table, $insert_params, $query_edit_cb) = @_;
462
-    $table         ||= '';
463
-    $insert_params ||= {};
464
-    
465
-    # Insert keys
466
-    my @insert_keys = keys %$insert_params;
467
-    
468
-    # Not exists insert keys
469
-    croak("Key-value pairs for insert must be specified to 'insert' second argument")
470
-      unless @insert_keys;
471
-    
472
-    # Templte for insert
473
-    my $template = "insert into $table {insert " . join(' ', @insert_keys) . '}';
474
-    
475
-    # Create query
476
-    my $query = $self->create_query($template);
477
-    
478
-    # Query edit callback must be code reference
479
-    croak("Query edit callback must be code reference")
480
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
481
-    
482
-    # Query edit if need
483
-    $query_edit_cb->($query) if $query_edit_cb;
484
-    
485
-    # Execute query
486
-    my $ret_val = $self->execute($query, $insert_params);
487
-    
488
-    return $ret_val;
489
-}
490
-
491
-# Update
492
-sub update {
493
-    my ($self, $table, $update_params,
494
-        $where_params, $query_edit_cb, $options) = @_;
495
-    
496
-    $table         ||= '';
497
-    $update_params ||= {};
498
-    $where_params  ||= {};
499
-    
500
-    # Update keys
501
-    my @update_keys = keys %$update_params;
502
-    
503
-    # Not exists update kyes
504
-    croak("Key-value pairs for update must be specified to 'update' second argument")
505
-      unless @update_keys;
506
-    
507
-    # Where keys
508
-    my @where_keys = keys %$where_params;
509
-    
510
-    # Not exists where keys
511
-    croak("Key-value pairs for where clause must be specified to 'update' third argument")
512
-      if !@where_keys && !$options->{allow_update_all};
513
-    
514
-    # Update clause
515
-    my $update_clause = '{update ' . join(' ', @update_keys) . '}';
516
-    
517
-    # Where clause
518
-    my $where_clause = '';
519
-    if (@where_keys) {
520
-        $where_clause = 'where ';
521
-        foreach my $where_key (@where_keys) {
522
-            $where_clause .= "{= $where_key} and ";
523
-        }
524
-        $where_clause =~ s/ and $//;
525
-    }
526
-    
527
-    # Template for update
528
-    my $template = "update $table $update_clause $where_clause";
529
-    
530
-    # Create query
531
-    my $query = $self->create_query($template);
532
-    
533
-    # Query edit callback must be code reference
534
-    croak("Query edit callback must be code reference")
535
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
536
-    
537
-    # Query edit if need
538
-    $query_edit_cb->($query) if $query_edit_cb;
539
-    
540
-    # Rearrange parammeters
541
-    my $params = {'#update' => $update_params, %$where_params};
542
-    
543
-    # Execute query
544
-    my $ret_val = $self->execute($query, $params);
545
-    
546
-    return $ret_val;
547
-}
548
-
549
-# Update all rows
550
-sub update_all {
551
-    my ($self, $table, $update_params, $query_edit_cb) = @_;
552
-    
553
-    return $self->update($table, $update_params, {}, $query_edit_cb,
554
-                         {allow_update_all => 1});
555
-}
556
-
557
-# Delete
558
-sub delete {
559
-    my ($self, $table, $where_params, $query_edit_cb, $options) = @_;
560
-    $table        ||= '';
561
-    $where_params ||= {};
562
-    
563
-    # Where keys
564
-    my @where_keys = keys %$where_params;
565
-    
566
-    # Not exists where keys
567
-    croak("Key-value pairs for where clause must be specified to 'delete' second argument")
568
-      if !@where_keys && !$options->{allow_delete_all};
569
-    
570
-    # Where clause
571
-    my $where_clause = '';
572
-    if (@where_keys) {
573
-        $where_clause = 'where ';
574
-        foreach my $where_key (@where_keys) {
575
-            $where_clause .= "{= $where_key} and ";
576
-        }
577
-        $where_clause =~ s/ and $//;
578
-    }
579
-    
580
-    # Template for delete
581
-    my $template = "delete from $table $where_clause";
582
-    
583
-    # Create query
584
-    my $query = $self->create_query($template);
585
-    
586
-    # Query edit callback must be code reference
587
-    croak("Query edit callback must be code reference")
588
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
589
-    
590
-    # Query edit if need
591
-    $query_edit_cb->($query) if $query_edit_cb;
592
-    
593
-    # Execute query
594
-    my $ret_val = $self->execute($query, $where_params);
595
-    
596
-    return $ret_val;
597
-}
598
-
599
-# Delete all rows
600
-sub delete_all {
601
-    my ($self, $table) = @_;
602
-    return $self->delete($table, {}, undef, {allow_delete_all => 1});
603
-}
604
-
605
-sub _select_usage { return << 'EOS' }
606
-Your select arguments is wrong.
607
-select usage:
608
-$dbi->select(
609
-    $table,                # must be string or array ref
610
-    [@$columns],           # must be array reference. this is optional
611
-    {%$where_params},      # must be hash reference.  this is optional
612
-    $append_statement,     # must be string.          this is optional
613
-    $query_edit_callback   # must be code reference.  this is optional
614
-);
615
-EOS
616
-
617
-sub select {
618
-    my $self = shift;
619
-    
620
-    # Check argument
621
-    croak($self->_select_usage) unless @_;
622
-    
623
-    # Arguments
624
-    my $tables = shift || '';
625
-    $tables    = [$tables] unless ref $tables;
626
-    
627
-    my $columns          = ref $_[0] eq 'ARRAY' ? shift : [];
628
-    my $where_params     = ref $_[0] eq 'HASH'  ? shift : {};
629
-    my $append_statement = $_[0] && !ref $_[0]  ? shift : '';
630
-    my $query_edit_cb    = shift if ref $_[0] eq 'CODE';
631
-    
632
-    # Check rest argument
633
-    croak($self->_select_usage) if @_;
634
-    
635
-    # SQL template for select statement
636
-    my $template = 'select ';
637
-    
638
-    # Join column clause
639
-    if (@$columns) {
640
-        foreach my $column (@$columns) {
641
-            $template .= "$column, ";
642
-        }
643
-        $template =~ s/, $/ /;
644
-    }
645
-    else {
646
-        $template .= '* ';
647
-    }
648
-    
649
-    # Join table
650
-    $template .= 'from ';
651
-    foreach my $table (@$tables) {
652
-        $template .= "$table, ";
653
-    }
654
-    $template =~ s/, $/ /;
655
-    
656
-    # Where clause keys
657
-    my @where_keys = keys %$where_params;
658
-    
659
-    # Join where clause
660
-    if (@where_keys) {
661
-        $template .= 'where ';
662
-        foreach my $where_key (@where_keys) {
663
-            $template .= "{= $where_key} and ";
664
-        }
665
-    }
666
-    $template =~ s/ and $//;
667
-    
668
-    # Append something to last of statement
669
-    if ($append_statement =~ s/^where //) {
670
-        if (@where_keys) {
671
-            $template .= " and $append_statement";
672
-        }
673
-        else {
674
-            $template .= " where $append_statement";
675
-        }
676
-    }
677
-    else {
678
-        $template .= " $append_statement";
679
-    }
680
-    
681
-    # Create query
682
-    my $query = $self->create_query($template);
683
-    
684
-    # Query edit
685
-    $query_edit_cb->($query) if $query_edit_cb;
686
-    
687
-    # Execute query
688
-    my $result = $self->execute($query, $where_params);
689
-    
690
-    return $result;
691
-}
692
-
693
-sub _query_caches     : ClassAttr { type => 'hash',
694
-                                    auto_build => sub {shift->_query_caches({}) } }
695
-                                    
696
-sub _query_cache_keys : ClassAttr { type => 'array',
697
-                                    auto_build => sub {shift->_query_cache_keys([])} }
698
-                                    
699
-sub query_cache_max   : ClassAttr { auto_build => sub {shift->query_cache_max(50)} }
700
-
701
-# Add query cahce
702
-sub _add_query_cache {
703
-    my ($class, $template, $query) = @_;
704
-    my $query_cache_keys = $class->_query_cache_keys;
705
-    my $query_caches     = $class->_query_caches;
706
-    
707
-    return $class if $query_caches->{$template};
708
-    
709
-    $query_caches->{$template} = $query;
710
-    push @$query_cache_keys, $template;
711
-    
712
-    my $overflow = @$query_cache_keys - $class->query_cache_max;
713
-    
714
-    for (my $i = 0; $i < $overflow; $i++) {
715
-        my $template = shift @$query_cache_keys;
716
-        delete $query_caches->{$template};
717
-    }
718
-    
719
-    return $class;
720
-}
721
-
722
-# Both bind_filter and fetch_filter off
723
-sub filter_off {
724
-    my $self = shift;
725
-    
726
-    # filter off
727
-    $self->bind_filter(undef);
728
-    $self->fetch_filter(undef);
729
-    
730
-    return $self;
731
-}
732
-
733
-Object::Simple->build_class;
734
-
735
-=head1 NAME
736
-
737
-DBIx::Custom - Customizable simple DBI
738
-
739
-=head1 VERSION
740
-
741
-Version 0.0501
742
-
743
-=head1 CAUTION
744
-
745
-This module is now experimental stage.
746
-
747
-I want you to try this module
748
-because I want this module stable, and not to damage your DB data by this module bug.
749
-
750
-Please tell me bug if you find
751
-
752
-=head1 SYNOPSIS
753
-
754
-  my $dbi = DBIx::Custom->new;
755
-  
756
-  my $query = $dbi->create_query($template);
757
-  $dbi->execute($query);
758
-
759
-=head1 CLASS-OBJECT ACCESSORS
760
-
761
-=head2 user
762
-
763
-    # Set and get database user name
764
-    $self = $dbi->user($user);
765
-    $user = $dbi->user;
766
-    
767
-    # Sample
768
-    $dbi->user('taro');
769
-
770
-=head2 password
771
-
772
-    # Set and get database password
773
-    $self     = $dbi->password($password);
774
-    $password = $dbi->password;
775
-    
776
-    # Sample
777
-    $dbi->password('lkj&le`@s');
778
-
779
-=head2 data_source
780
-
781
-    # Set and get database data source
782
-    $self        = $dbi->data_source($data_soruce);
783
-    $data_source = $dbi->data_source;
784
-    
785
-    # Sample(SQLite)
786
-    $dbi->data_source(dbi:SQLite:dbname=$database);
787
-    
788
-    # Sample(MySQL);
789
-    $dbi->data_source("dbi:mysql:dbname=$database");
790
-    
791
-    # Sample(PostgreSQL)
792
-    $dbi->data_source("dbi:Pg:dbname=$database");
793
-    
794
-=head2 database
795
-
796
-    # Set and get database name
797
-    $self     = $dbi->database($database);
798
-    $database = $dbi->database;
799
-
800
-This method will be used in subclass connect method.
801
-
802
-=head2 dbi_options
803
-
804
-    # Set and get DBI option
805
-    $self       = $dbi->dbi_options({$options => $value, ...});
806
-    $dbi_options = $dbi->dbi_options;
807
-
808
-    # Sample
809
-    $dbi->dbi_options({PrintError => 0, RaiseError => 1});
810
-
811
-dbi_options is used when you connect database by using connect.
812
-
813
-=head2 prepare
814
-
815
-    $sth = $dbi->prepare($sql);
816
-
817
-This method is same as DBI::prepare
818
-
819
-=head2 do
820
-
821
-    $dbi->do($sql, @bind_values);
822
-
823
-This method is same as DBI::do
824
-
825
-=head2 sql_template
826
-
827
-    # Set and get SQL::Template object
828
-    $self         = $dbi->sql_template($sql_template);
829
-    $sql_template = $dbi->sql_template;
830
-    
831
-    # Sample
832
-    $dbi->sql_template(DBI::Cutom::SQL::Template->new);
833
-
834
-=head2 filters
835
-
836
-    # Set and get filters
837
-    $self    = $dbi->filters($filters);
838
-    $filters = $dbi->filters;
839
-
840
-=head2 formats
841
-
842
-    # Set and get formats
843
-    $self    = $dbi->formats($formats);
844
-    $formats = $dbi->formats;
845
-    
846
-=head2 bind_filter
847
-
848
-    # Set and get binding filter
849
-    $self        = $dbi->bind_filter($bind_filter);
850
-    $bind_filter = $dbi->bind_filter
851
-
852
-    # Sample
853
-    $dbi->bind_filter($self->filters->{default_bind_filter});
854
-    
855
-
856
-you can get DBI database handle if you need.
857
-
858
-=head2 fetch_filter
859
-
860
-    # Set and get Fetch filter
861
-    $self         = $dbi->fetch_filter($fetch_filter);
862
-    $fetch_filter = $dbi->fetch_filter;
863
-
864
-    # Sample
865
-    $dbi->fetch_filter($self->filters->{default_fetch_filter});
866
-
867
-=head2 no_bind_filters
868
-
869
-    # Set and get no filter keys when binding
870
-    $self            = $dbi->no_bind_filters($no_bind_filters);
871
-    $no_bind_filters = $dbi->no_bind_filters;
872
-
873
-=head2 no_fetch_filters
874
-
875
-    # Set and get no filter keys when fetching
876
-    $self             = $dbi->no_fetch_filters($no_fetch_filters);
877
-    $no_fetch_filters = $dbi->no_fetch_filters;
878
-
879
-=head2 result_class
880
-
881
-    # Set and get resultset class
882
-    $self         = $dbi->result_class($result_class);
883
-    $result_class = $dbi->result_class;
884
-    
885
-    # Sample
886
-    $dbi->result_class('DBIx::Custom::Result');
887
-
888
-=head2 dbh
889
-
890
-    # Get database handle
891
-    $dbh = $self->dbh;
892
-
893
-=head1 METHODS
894
-
895
-=head2 connect
896
-
897
-    # Connect to database
898
-    $self = $dbi->connect;
899
-    
900
-    # Sample
901
-    $dbi = DBIx::Custom->new(user => 'taro', password => 'lji8(', 
902
-                            data_soruce => "dbi:mysql:dbname=$database");
903
-    $dbi->connect;
904
-
905
-=head2 disconnect
906
-
907
-    # Disconnect database
908
-    $dbi->disconnect;
909
-
910
-If database is already disconnected, this method do noting.
911
-
912
-=head2 reconnect
913
-
914
-    # Reconnect
915
-    $dbi->reconnect;
916
-
917
-=head2 connected
918
-
919
-    # Check connected
920
-    $dbi->connected
921
-    
922
-=head2 filter_off
923
-
924
-    # bind_filter and fitch_filter off
925
-    $self->filter_off;
926
-    
927
-This is equeal to
928
-    
929
-    $self->bind_filter(undef);
930
-    $self->fetch_filter(undef);
931
-
932
-=head2 add_filter
933
-
934
-    # Add filter (hash ref or hash can be recieve)
935
-    $self = $dbi->add_filter({$filter_name => $filter, ...});
936
-    $self = $dbi->add_filter($filetr_name => $filter, ...);
937
-    
938
-    # Sample
939
-    $dbi->add_filter(
940
-        decode_utf8 => sub {
941
-            my ($key, $value, $table, $column) = @_;
942
-            return Encode::decode('UTF-8', $value);
943
-        },
944
-        datetime_to_string => sub {
945
-            my ($key, $value, $table, $column) = @_;
946
-            return $value->strftime('%Y-%m-%d %H:%M:%S')
947
-        },
948
-        default_bind_filter => sub {
949
-            my ($key, $value, $table, $column) = @_;
950
-            if (ref $value eq 'Time::Piece') {
951
-                return $dbi->filters->{datetime_to_string}->($value);
952
-            }
953
-            else {
954
-                return $dbi->filters->{decode_utf8}->($value);
955
-            }
956
-        },
957
-        
958
-        encode_utf8 => sub {
959
-            my ($key, $value) = @_;
960
-            return Encode::encode('UTF-8', $value);
961
-        },
962
-        string_to_datetime => sub {
963
-            my ($key, $value) = @_;
964
-            return DateTime::Format::MySQL->parse_datetime($value);
965
-        },
966
-        default_fetch_filter => sub {
967
-            my ($key, $value, $type, $sth, $i) = @_;
968
-            if ($type eq 'DATETIME') {
969
-                return $dbi->filters->{string_to_datetime}->($value);
970
-            }
971
-            else {
972
-                return $dbi->filters->{encode_utf8}->($value);
973
-            }
974
-        }
975
-    );
976
-
977
-add_filter add filter to filters
978
-
979
-=head2 add_format
980
-
981
-    $dbi->add_format(date => '%Y:%m:%d');
982
-
983
-=head2 create_query
984
-    
985
-    # Create Query object from SQL template
986
-    my $query = $dbi->create_query($template);
987
-    
988
-=head2 execute
989
-
990
-    # Parse SQL template and execute SQL
991
-    $result = $dbi->query($query, $params);
992
-    $result = $dbi->query($template, $params); # Shorcut
993
-    
994
-    # Sample
995
-    $result = $dbi->query("select * from authors where {= name} and {= age}", 
996
-                          {author => 'taro', age => 19});
997
-    
998
-    while (my @row = $result->fetch) {
999
-        # do something
1000
-    }
1001
-
1002
-See also L<DBIx::Custom::SQL::Template>
1003
-
1004
-=head2 run_transaction
1005
-
1006
-    # Run transaction
1007
-    $dbi->run_transaction(sub {
1008
-        # do something
1009
-    });
1010
-
1011
-If transaction is success, commit is execute. 
1012
-If tranzation is died, rollback is execute.
1013
-
1014
-=head2 insert
1015
-
1016
-    # Insert
1017
-    $dbi->insert($table, $insert_values);
1018
-    
1019
-    # Sample
1020
-    $dbi->insert('books', {title => 'Perl', author => 'Taro'});
1021
-
1022
-=head2 update
1023
-
1024
-    # Update
1025
-    $dbi->update($table, $update_values, $where);
1026
-    
1027
-    # Sample
1028
-    $dbi->update('books', {title => 'Perl', author => 'Taro'}, {id => 5});
1029
-
1030
-=head2 update_all
1031
-
1032
-    # Update all rows
1033
-    $dbi->update($table, $updat_values);
1034
-
1035
-=head2 delete
1036
-
1037
-    # Delete
1038
-    $dbi->delete($table, $where);
1039
-    
1040
-    # Sample
1041
-    $dbi->delete('Books', {id => 5});
1042
-
1043
-=head2 delete_all
1044
-
1045
-    # Delete all rows
1046
-    $dbi->delete_all($table);
1047
-
1048
-=head2 last_insert_id
1049
-
1050
-    # Get last insert id
1051
-    $last_insert_id = $dbi->last_insert_id;
1052
-    
1053
-This method is same as DBI last_insert_id;
1054
-
1055
-=head2 select
1056
-    
1057
-    # Select
1058
-    $dbi->select(
1059
-        $table,                # must be string or array;
1060
-        [@$columns],           # must be array reference. this is optional
1061
-        {%$where_params},      # must be hash reference.  this is optional
1062
-        $append_statement,     # must be string.          this is optional
1063
-        $query_edit_callback   # must be code reference.  this is optional
1064
-    );
1065
-    
1066
-    # Sample
1067
-    $dbi->select(
1068
-        'Books',
1069
-        ['title', 'author'],
1070
-        {id => 1},
1071
-        "for update",
1072
-        sub {
1073
-            my $query = shift;
1074
-            $query->bind_filter(sub {
1075
-                # ...
1076
-            });
1077
-        }
1078
-    );
1079
-    
1080
-    # The way to join multi tables
1081
-    $dbi->select(
1082
-        ['table1', 'table2'],
1083
-        ['table1.id as table1_id', 'title'],
1084
-        {table1.id => 1},
1085
-        "where table1.id = table2.id",
1086
-    );
1087
-
1088
-=head1 Class Accessors
1089
-
1090
-=head2 query_cache_max
1091
-
1092
-    # Max query cache count
1093
-    $class           = $class->query_cache_max($query_cache_max);
1094
-    $query_cache_max = $class->query_cache_max;
1095
-    
1096
-    # Sample
1097
-    DBIx::Custom->query_cache_max(50);
1098
-
1099
-=head1 CAUTION
1100
-
1101
-DBIx::Custom have DIB object internal.
1102
-This module is work well in the following DBI condition.
1103
-
1104
-    1. AutoCommit is true
1105
-    2. RaiseError is true
1106
-
1107
-By default, Both AutoCommit and RaiseError is true.
1108
-You must not change these mode not to damage your data.
1109
-
1110
-If you change these mode, 
1111
-you cannot get correct error message, 
1112
-or run_transaction may fail.
1113
-
1114
-=head1 AUTHOR
1115
-
1116
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
1117
-
1118
-Github L<http://github.com/yuki-kimoto>
1119
-
1120
-=head1 COPYRIGHT & LICENSE
1121
-
1122
-Copyright 2009 Yuki Kimoto, all rights reserved.
1123
-
1124
-This program is free software; you can redistribute it and/or modify it
1125
-under the same terms as Perl itself.
1126
-
1127
-=cut
-117
DBIx-Custom-0.0501/lib/DBIx/Custom/Basic.pm
... ...
@@ -1,117 +0,0 @@
1
-package DBIx::Custom::Basic;
2
-use 5.008001;
3
-use base 'DBIx::Custom';
4
-use Encode qw/decode encode/;
5
-
6
-use warnings;
7
-use strict;
8
-
9
-my $class = __PACKAGE__;
10
-
11
-$class->add_filter(
12
-    encode_utf8 => sub {
13
-        my $value = shift;
14
-        utf8::upgrade($value) unless Encode::is_utf8($value);
15
-        return encode('UTF-8', $value);
16
-    },
17
-    decode_utf8 => sub { decode('UTF-8', shift) }
18
-);
19
-
20
-$class->add_format(
21
-    'SQL99_date'        => '%Y-%m-%d',
22
-    'SQL99_datetime'    => '%Y-%m-%d %H:%M:%S',
23
-    'SQL99_time'        => '%H:%M:%S',
24
-    'ISO-8601_date'     => '%Y-%m-%d',
25
-    'ISO-8601_datetime' => '%Y-%m-%dT%H:%M:%S',
26
-    'ISO-8601_time'     => '%H:%M:%S',
27
-);
28
-
29
-# Methods
30
-sub utf8_filter_on {
31
-    my $self = shift;
32
-    $self->bind_filter($self->filters->{encode_utf8});
33
-    $self->fetch_filter($self->filters->{decode_utf8});
34
-}
35
-
36
-1;
37
-
38
-=head1 NAME
39
-
40
-DBIx::Custom::Basic - DBIx::Custom basic implementation
41
-
42
-=head1 Version
43
-
44
-Version 0.0201
45
-
46
-=head1 See DBIx::Custom documentation
47
-
48
-This class is L<DBIx::Custom> subclass.
49
-
50
-You can use all methods of L<DBIx::Custom>
51
-
52
-Please see L<DBIx::Custom> documentation
53
-
54
-=head1 Filters
55
-
56
-=head2 encode_utf8
57
-
58
-    # Encode to UTF-8 byte stream (utf8::upgrade is done if need)
59
-    $dbi->filters->{encode_utf8}->($value);
60
-    
61
-This filter is generally used as bind filter
62
-
63
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
64
-
65
-=head2 decode_utf8
66
-
67
-    # Decode to perl internal string
68
-    $dbi->filters->{decode_utf8}->($value);
69
-    
70
-This filter is generally used as fetch filter
71
-
72
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
73
-
74
-=head2 Formats
75
-    
76
-strptime formats is available
77
-    
78
-    # format name        format
79
-    'SQL99_date'         '%Y-%m-%d',
80
-    'SQL99_datetime'     '%Y-%m-%d %H:%M:%S',
81
-    'SQL99_time'         '%H:%M:%S',
82
-    'ISO-8601_date'      '%Y-%m-%d',
83
-    'ISO-8601_datetime'  '%Y-%m-%dT%H:%M:%S',
84
-    'ISO-8601_time'      '%H:%M:%S',
85
-
86
-You get format as the following
87
-
88
-    my $format = $dbi->formats->{$format_name};
89
-
90
-=head1 Methods
91
-
92
-=head2 utf8_filter_on
93
-
94
-    # Encode and decode utf8 filter on
95
-    $dbi->utf8_filter_on;
96
-
97
-This equel to
98
-
99
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
100
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
101
-
102
-=head1 AUTHOR
103
-
104
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
105
-
106
-Github L<http://github.com/yuki-kimoto>
107
-
108
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
109
-
110
-=head1 COPYRIGHT & LICENSE
111
-
112
-Copyright 2009 Yuki Kimoto, all rights reserved.
113
-
114
-This program is free software; you can redistribute it and/or modify it
115
-under the same terms as Perl itself.
116
-
117
-=cut
-101
DBIx-Custom-0.0501/lib/DBIx/Custom/Query.pm
... ...
@@ -1,101 +0,0 @@
1
-package DBIx::Custom::Query;
2
-use Object::Simple;
3
-
4
-sub sql             : Attr {}
5
-sub key_infos       : Attr {}
6
-sub bind_filter     : Attr {}
7
-sub fetch_filter     : Attr {}
8
-sub sth             : Attr {}
9
-
10
-sub no_bind_filters      : Attr { type => 'array', trigger => sub {
11
-    my $self = shift;
12
-    my $no_bind_filters = $self->no_bind_filters || [];
13
-    my %no_bind_filters_map = map {$_ => 1} @{$no_bind_filters};
14
-    $self->_no_bind_filters_map(\%no_bind_filters_map);
15
-}}
16
-sub _no_bind_filters_map : Attr {default => sub { {} }}
17
-
18
-sub no_fetch_filters     : Attr { type => 'array', default => sub { [] } }
19
-
20
-Object::Simple->build_class;
21
-
22
-=head1 NAME
23
-
24
-DBIx::Custom::Query - Query object for DBIx::Custom
25
-
26
-=head1 VERSION
27
-
28
-Version 0.0101
29
-
30
-=head1 SYNOPSIS
31
-
32
-    # Create query
33
-    my $dbi = DBIx::Custom->new;
34
-    my $query = $dbi->create_query($template);
35
-    
36
-    # Set query attributes
37
-    $query->bind_filter($dbi->filters->{default_bind_filter});
38
-    $query->no_bind_filters('title', 'author');
39
-    
40
-    $query->fetch_filter($dbi->filters->{default_fetch_filter});
41
-    $query->no_fetch_filters('title', 'author');
42
-    
43
-    # Execute query
44
-    $dbi->execute($query, $params);
45
-
46
-=head1 OBJECT ACCESSORS
47
-
48
-=head2 sth
49
-
50
-    # Set and get statement handle
51
-    $self = $query->sth($sql);
52
-    $sth  = $query->sth;
53
-
54
-=head2 sql
55
-
56
-    # Set and get SQL
57
-    $self = $query->sql($sql);
58
-    $sql  = $query->sql;
59
-
60
-=head2 bind_filter
61
-
62
-    # Set and get bind filter
63
-    $self        = $query->bind_filter($bind_filter);
64
-    $bind_filter = $query->bind_filter;
65
-
66
-=head2 no_bind_filters
67
-
68
-    # Set and get keys of no filtering
69
-    $self            = $query->no_bind_filters($no_filters);
70
-    $no_bind_filters = $query->no_bind_filters;
71
-
72
-=head2 fetch_filter
73
-
74
-    # Set and get fetch filter
75
-    $self        = $query->fetch_filter($fetch_filter);
76
-    $fetch_filter = $query->fetch_filter;
77
-
78
-=head2 no_fetch_filters
79
-
80
-    # Set and get keys of no filtering
81
-    $self            = $query->no_fetch_filters($no_filters);
82
-    $no_fetch_filters = $query->no_fetch_filters;
83
-
84
-=head2 key_infos
85
-
86
-    # Set and get key informations
87
-    $self      = $query->key_infos($key_infos);
88
-    $key_infos = $query->key_infos;
89
-
90
-=head1 AUTHOR
91
-
92
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
93
-
94
-Github L<http://github.com/yuki-kimoto>
95
-
96
-=head1 COPYRIGHT & LICENSE
97
-
98
-Copyright 2009 Yuki Kimoto, all rights reserved.
99
-
100
-This program is free software; you can redistribute it and/or modify it
101
-under the same terms as Perl itself.
-384
DBIx-Custom-0.0501/lib/DBIx/Custom/Result.pm
... ...
@@ -1,384 +0,0 @@
1
-package DBIx::Custom::Result;
2
-use Object::Simple;
3
-use strict;
4
-use warnings;
5
-use Carp 'croak';
6
-
7
-# Attributes
8
-sub sth              : Attr {}
9
-sub fetch_filter     : Attr {}
10
-sub no_fetch_filters      : Attr { type => 'array', trigger => sub {
11
-    my $self = shift;
12
-    my $no_fetch_filters = $self->no_fetch_filters || [];
13
-    my %no_fetch_filters_map = map {$_ => 1} @{$no_fetch_filters};
14
-    $self->_no_fetch_filters_map(\%no_fetch_filters_map);
15
-}}
16
-sub _no_fetch_filters_map : Attr {default => sub { {} }}
17
-
18
-# Fetch (array)
19
-sub fetch {
20
-    my ($self, $type) = @_;
21
-    my $sth = $self->sth;
22
-    my $fetch_filter = $self->fetch_filter;
23
-    
24
-    # Fetch
25
-    my $row = $sth->fetchrow_arrayref;
26
-    
27
-    # Cannot fetch
28
-    return unless $row;
29
-    
30
-    # Filter
31
-    if ($fetch_filter) {
32
-        my $keys  = $sth->{NAME_lc};
33
-        my $types = $sth->{TYPE};
34
-        for (my $i = 0; $i < @$keys; $i++) {
35
-            next if $self->_no_fetch_filters_map->{$keys->[$i]};
36
-            $row->[$i]= $fetch_filter->($row->[$i], $keys->[$i], $types->[$i],
37
-                                        $sth, $i);
38
-        }
39
-    }
40
-    return wantarray ? @$row : $row;
41
-}
42
-
43
-# Fetch (hash)
44
-sub fetch_hash {
45
-    my $self = shift;
46
-    my $sth = $self->sth;
47
-    my $fetch_filter = $self->fetch_filter;
48
-    
49
-    # Fetch
50
-    my $row = $sth->fetchrow_arrayref;
51
-    
52
-    # Cannot fetch
53
-    return unless $row;
54
-    
55
-    # Keys
56
-    my $keys  = $sth->{NAME_lc};
57
-    
58
-    # Filter
59
-    my $row_hash = {};
60
-    if ($fetch_filter) {
61
-        my $types = $sth->{TYPE};
62
-        for (my $i = 0; $i < @$keys; $i++) {
63
-            if ($self->_no_fetch_filters_map->{$keys->[$i]}) {
64
-                $row_hash->{$keys->[$i]} = $row->[$i];
65
-            }
66
-            else {
67
-                $row_hash->{$keys->[$i]}
68
-                  = $fetch_filter->($row->[$i], $keys->[$i],
69
-                                    $types->[$i], $sth, $i);
70
-            }
71
-        }
72
-    }
73
-    
74
-    # No filter
75
-    else {
76
-        for (my $i = 0; $i < @$keys; $i++) {
77
-            $row_hash->{$keys->[$i]} = $row->[$i];
78
-        }
79
-    }
80
-    return wantarray ? %$row_hash : $row_hash;
81
-}
82
-
83
-# Fetch only first (array)
84
-sub fetch_first {
85
-    my $self = shift;
86
-    
87
-    # Fetch
88
-    my $row = $self->fetch;
89
-    
90
-    # Not exist
91
-    return unless $row;
92
-    
93
-    # Finish statement handle
94
-    $self->finish;
95
-    
96
-    return wantarray ? @$row : $row;
97
-}
98
-
99
-# Fetch only first (hash)
100
-sub fetch_hash_first {
101
-    my $self = shift;
102
-    
103
-    # Fetch hash
104
-    my $row = $self->fetch_hash;
105
-    
106
-    # Not exist
107
-    return unless $row;
108
-    
109
-    # Finish statement handle
110
-    $self->finish;
111
-    
112
-    return wantarray ? %$row : $row;
113
-}
114
-
115
-# Fetch multi rows (array)
116
-sub fetch_rows {
117
-    my ($self, $count) = @_;
118
-    
119
-    # Not specified Row count
120
-    croak("Row count must be specified")
121
-      unless $count;
122
-    
123
-    # Fetch multi rows
124
-    my $rows = [];
125
-    for (my $i = 0; $i < $count; $i++) {
126
-        my @row = $self->fetch;
127
-        
128
-        last unless @row;
129
-        
130
-        push @$rows, \@row;
131
-    }
132
-    
133
-    return unless @$rows;
134
-    return wantarray ? @$rows : $rows;
135
-}
136
-
137
-# Fetch multi rows (hash)
138
-sub fetch_hash_rows {
139
-    my ($self, $count) = @_;
140
-    
141
-    # Not specified Row count
142
-    croak("Row count must be specified")
143
-      unless $count;
144
-    
145
-    # Fetch multi rows
146
-    my $rows = [];
147
-    for (my $i = 0; $i < $count; $i++) {
148
-        my %row = $self->fetch_hash;
149
-        
150
-        last unless %row;
151
-        
152
-        push @$rows, \%row;
153
-    }
154
-    
155
-    return unless @$rows;
156
-    return wantarray ? @$rows : $rows;
157
-}
158
-
159
-
160
-# Fetch all (array)
161
-sub fetch_all {
162
-    my $self = shift;
163
-    
164
-    my $rows = [];
165
-    while(my @row = $self->fetch) {
166
-        push @$rows, [@row];
167
-    }
168
-    return wantarray ? @$rows : $rows;
169
-}
170
-
171
-# Fetch all (hash)
172
-sub fetch_hash_all {
173
-    my $self = shift;
174
-    
175
-    my $rows = [];
176
-    while(my %row = $self->fetch_hash) {
177
-        push @$rows, {%row};
178
-    }
179
-    return wantarray ? @$rows : $rows;
180
-}
181
-
182
-# Finish
183
-sub finish { shift->sth->finish }
184
-
185
-# Error
186
-sub error { 
187
-    my $self = shift;
188
-    my $sth  = $self->sth;
189
-    return wantarray ? ($sth->errstr, $sth->err, $sth->state) : $sth->errstr;
190
-}
191
-
192
-Object::Simple->build_class;
193
-
194
-=head1 NAME
195
-
196
-DBIx::Custom::Result - Resultset for DBIx::Custom
197
-
198
-=head1 VERSION
199
-
200
-Version 0.0301
201
-
202
-=head1 SYNOPSIS
203
-
204
-    # $result is DBIx::Custom::Result object
205
-    my $dbi = DBIx::Custom->new;
206
-    my $result = $dbi->query($sql_template, $param);
207
-    
208
-    while (my ($val1, $val2) = $result->fetch) {
209
-        # do something
210
-    }
211
-
212
-=head1 OBJECT ACCESSORS
213
-
214
-=head2 sth
215
-
216
-    # Set and Get statement handle
217
-    $self = $result->sth($sth);
218
-    $sth  = $reuslt->sth
219
-
220
-Statement handle is automatically set by DBIx::Custom.
221
-so you do not set statement handle.
222
-
223
-If you need statement handle, you can get statement handle by using this method.
224
-
225
-=head2 fetch_filter
226
-
227
-    # Set and Get fetch filter
228
-    $self         = $result->fetch_filter($sth);
229
-    $fetch_filter = $result->fech_filter;
230
-
231
-Statement handle is automatically set by DBIx::Custom.
232
-If you want to set your fetch filter, you set it.
233
-
234
-=head2 no_fetch_filters
235
-
236
-    # Set and Get no filter keys when fetching
237
-    $self             = $result->no_fetch_filters($no_fetch_filters);
238
-    $no_fetch_filters = $result->no_fetch_filters;
239
-
240
-=head1 METHODS
241
-
242
-=head2 fetch
243
-
244
-    # Fetch row as array reference (Scalar context)
245
-    $row = $result->fetch;
246
-    
247
-    # Fetch row as array (List context)
248
-    @row = $result->fecth
249
-
250
-    # Sample
251
-    while (my $row = $result->fetch) {
252
-        # do something
253
-        my $val1 = $row->[0];
254
-        my $val2 = $row->[1];
255
-    }
256
-
257
-fetch method is fetch resultset and get row as array or array reference.
258
-
259
-=head2 fetch_hash
260
-
261
-    # Fetch row as hash reference (Scalar context)
262
-    $row = $result->fetch_hash;
263
-    
264
-    # Fetch row as hash (List context)
265
-    %row = $result->fecth_hash
266
-
267
-    # Sample
268
-    while (my $row = $result->fetch_hash) {
269
-        # do something
270
-        my $val1 = $row->{key1};
271
-        my $val2 = $row->{key2};
272
-    }
273
-
274
-fetch_hash method is fetch resultset and get row as hash or hash reference.
275
-
276
-=head2 fetch_first
277
-
278
-    # Fetch only first (Scalar context)
279
-    $row = $result->fetch_first;
280
-    
281
-    # Fetch only first (List context)
282
-    @row = $result->fetch_first;
283
-    
284
-This method fetch only first and finish statement handle
285
-
286
-=head2 fetch_hash_first
287
-    
288
-    # Fetch only first as hash (Scalar context)
289
-    $row = $result->fetch_hash_first;
290
-    
291
-    # Fetch only first as hash (Scalar context)
292
-    @row = $result->fetch_hash_first;
293
-    
294
-This method fetch only first and finish statement handle
295
-
296
-=head2 fetch_rows
297
-
298
-    # Fetch multi rows (Scalar context)
299
-    $rows = $result->fetch_rows($row_count);
300
-    
301
-    # Fetch multi rows (List context)
302
-    @rows = $result->fetch_rows($row_count);
303
-    
304
-    # Sapmle 
305
-    $rows = $result->fetch_rows(10);
306
-
307
-=head2 fetch_hash_rows
308
-
309
-    # Fetch multi rows as hash (Scalar context)
310
-    $rows = $result->fetch_hash_rows($row_count);
311
-    
312
-    # Fetch multi rows as hash (List context)
313
-    @rows = $result->fetch_hash_rows($row_count);
314
-    
315
-    # Sapmle 
316
-    $rows = $result->fetch_hash_rows(10);
317
-
318
-=head2 fetch_all
319
-
320
-    # Fetch all row as array ref of array ref (Scalar context)
321
-    $rows = $result->fetch_all;
322
-    
323
-    # Fetch all row as array of array ref (List context)
324
-    @rows = $result->fecth_all;
325
-
326
-    # Sample
327
-    my $rows = $result->fetch_all;
328
-    my $val0_0 = $rows->[0][0];
329
-    my $val1_1 = $rows->[1][1];
330
-
331
-fetch_all method is fetch resultset and get all rows as array or array reference.
332
-
333
-=head2 fetch_hash_all
334
-
335
-    # Fetch all row as array ref of hash ref (Scalar context)
336
-    $rows = $result->fetch_hash_all;
337
-    
338
-    # Fetch all row as array of hash ref (List context)
339
-    @rows = $result->fecth_all_hash;
340
-
341
-    # Sample
342
-    my $rows = $result->fetch_hash_all;
343
-    my $val0_key1 = $rows->[0]{key1};
344
-    my $val1_key2 = $rows->[1]{key2};
345
-
346
-=head2 error
347
-
348
-    # Get error infomation
349
-    $error_messege = $result->error;
350
-    ($error_message, $error_number, $error_state) = $result->error;
351
-
352
-You can get get information. This is crenspond to the following.
353
-
354
-    $error_message : $result->sth->errstr
355
-    $error_number  : $result->sth->err
356
-    $error_state   : $result->sth->state
357
-
358
-=head2 finish
359
-
360
-    # Finish statement handle
361
-    $result->finish
362
-    
363
-    # Sample
364
-    my $row = $reuslt->fetch; # fetch only one row
365
-    $result->finish
366
-
367
-You can finish statement handle.This is equel to
368
-
369
-    $result->sth->finish;
370
-
371
-=head1 AUTHOR
372
-
373
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
374
-
375
-Github L<http://github.com/yuki-kimoto>
376
-
377
-=head1 COPYRIGHT & LICENSE
378
-
379
-Copyright 2009 Yuki Kimoto, all rights reserved.
380
-
381
-This program is free software; you can redistribute it and/or modify it
382
-under the same terms as Perl itself.
383
-
384
-=cut
-694
DBIx-Custom-0.0501/lib/DBIx/Custom/SQL/Template.pm
... ...
@@ -1,694 +0,0 @@
1
-package DBIx::Custom::SQL::Template;
2
-use Object::Simple;
3
-
4
-use Carp 'croak';
5
-
6
-# Accessor is created by Object::Simple. Please read Object::Simple document
7
-
8
-### Class-Object accessors
9
-
10
-# Tag start
11
-sub tag_start   : ClassObjectAttr {
12
-    initialize => {default => '{', clone => 'scalar'}
13
-}
14
-
15
-# Tag end
16
-sub tag_end     : ClassObjectAttr {
17
-    initialize => {default => '}', clone => 'scalar'}
18
-}
19
-
20
-# Tag syntax
21
-sub tag_syntax  : ClassObjectAttr {
22
-    initialize => {default => <<'EOS', clone => 'scalar'}}
23
-[tag]                     [expand]
24
-{? name}                  ?
25
-{= name}                  name = ?
26
-{<> name}                 name <> ?
27
-
28
-{< name}                  name < ?
29
-{> name}                  name > ?
30
-{>= name}                 name >= ?
31
-{<= name}                 name <= ?
32
-
33
-{like name}               name like ?
34
-{in name number}          name in [?, ?, ..]
35
-
36
-{insert key1 key2} (key1, key2) values (?, ?)
37
-{update key1 key2}    set key1 = ?, key2 = ?
38
-EOS
39
-
40
-# Tag processors
41
-sub tag_processors : ClassObjectAttr {
42
-    type => 'hash',
43
-    deref => 1,
44
-    initialize => {
45
-        clone => 'hash', 
46
-        default => sub {{
47
-            '?'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
48
-            '='             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
49
-            '<>'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
50
-            '>'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
51
-            '<'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
52
-            '>='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
53
-            '<='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
54
-            'like'          => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
55
-            'in'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_in_tag,
56
-            'insert'        => \&DBIx::Custom::SQL::Template::TagProcessor::expand_insert_tag,
57
-            'update'    => \&DBIx::Custom::SQL::Template::TagProcessor::expand_update_tag
58
-        }}
59
-    }
60
-}
61
-
62
-# Add Tag processor
63
-sub add_tag_processor {
64
-    my $invocant = shift;
65
-    my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
66
-    $invocant->tag_processors(%{$invocant->tag_processors}, %{$tag_processors});
67
-    return $invocant;
68
-}
69
-
70
-# Clone
71
-sub clone {
72
-    my $self = shift;
73
-    my $new = $self->new;
74
-    
75
-    $new->tag_start($self->tag_start);
76
-    $new->tag_end($self->tag_end);
77
-    $new->tag_syntax($self->tag_syntax);
78
-    $new->tag_processors({%{$self->tag_processors || {}}});
79
-    
80
-    return $new;
81
-}
82
-
83
-
84
-### Object Methods
85
-
86
-# Create Query
87
-sub create_query {
88
-    my ($self, $template)  = @_;
89
-    
90
-    # Parse template
91
-    my $tree = $self->_parse_template($template);
92
-    
93
-    # Build query
94
-    my $query = $self->_build_query($tree);
95
-    
96
-    return $query;
97
-}
98
-
99
-# Parse template
100
-sub _parse_template {
101
-    my ($self, $template) = @_;
102
-    $template ||= '';
103
-    
104
-    my $tree = [];
105
-    
106
-    # Tags
107
-    my $tag_start = quotemeta $self->tag_start;
108
-    my $tag_end   = quotemeta $self->tag_end;
109
-    
110
-    # Tokenize
111
-    my $state = 'text';
112
-    
113
-    # Save original template
114
-    my $original_template = $template;
115
-    
116
-    # Parse template
117
-    while ($template =~ s/([^$tag_start]*?)$tag_start([^$tag_end].*?)$tag_end//sm) {
118
-        my $text = $1;
119
-        my $tag  = $2;
120
-        
121
-        # Parse tree
122
-        push @$tree, {type => 'text', tag_args => [$text]} if $text;
123
-        
124
-        if ($tag) {
125
-            # Get tag name and arguments
126
-            my ($tag_name, @tag_args) = split /\s+/, $tag;
127
-            
128
-            # Tag processor is exist?
129
-            unless ($self->tag_processors->{$tag_name}) {
130
-                my $tag_syntax = $self->tag_syntax;
131
-                croak("Tag '{$tag}' in SQL template is not exist.\n\n" .
132
-                      "<SQL template tag syntax>\n" .
133
-                      "$tag_syntax\n" .
134
-                      "<Your SQL template>\n" .
135
-                      "$original_template\n\n");
136
-            }
137
-            
138
-            # Check tag arguments
139
-            foreach my $tag_arg (@tag_args) {
140
-                # Cannot cantain placehosder '?'
141
-                croak("Tag '{t }' arguments cannot contain '?'")
142
-                  if $tag_arg =~ /\?/;
143
-            }
144
-            
145
-            # Add tag to parsing tree
146
-            push @$tree, {type => 'tag', tag_name => $tag_name, tag_args => [@tag_args]};
147
-        }
148
-    }
149
-    
150
-    # Add text to parsing tree 
151
-    push @$tree, {type => 'text', tag_args => [$template]} if $template;
152
-    
153
-    return $tree;
154
-}
155
-
156
-# Build SQL from parsing tree
157
-sub _build_query {
158
-    my ($self, $tree) = @_;
159
-    
160
-    # SQL
161
-    my $sql = '';
162
-    
163
-    # All parameter key infomation
164
-    my $all_key_infos = [];
165
-    
166
-    # Build SQL 
167
-    foreach my $node (@$tree) {
168
-        
169
-        # Get type, tag name, and arguments
170
-        my $type     = $node->{type};
171
-        my $tag_name = $node->{tag_name};
172
-        my $tag_args = $node->{tag_args};
173
-        
174
-        # Text
175
-        if ($type eq 'text') {
176
-            # Join text
177
-            $sql .= $tag_args->[0];
178
-        }
179
-        
180
-        # Tag
181
-        elsif ($type eq 'tag') {
182
-            
183
-            # Get tag processor
184
-            my $tag_processor = $self->tag_processors->{$tag_name};
185
-            
186
-            # Tag processor is code ref?
187
-            croak("Tag processor '$tag_name' must be code reference")
188
-              unless ref $tag_processor eq 'CODE';
189
-            
190
-            # Expand tag using tag processor
191
-            my ($expand, $key_infos)
192
-              = $tag_processor->($tag_name, $tag_args);
193
-            
194
-            # Check tag processor return value
195
-            croak("Tag processor '$tag_name' must return (\$expand, \$key_infos)")
196
-              if !defined $expand || ref $key_infos ne 'ARRAY';
197
-            
198
-            # Check placeholder count
199
-            croak("Placeholder count in SQL created by tag processor '$tag_name' " .
200
-                  "must be same as key informations count")
201
-              unless $self->_placeholder_count($expand) eq @$key_infos;
202
-            
203
-            # Add key information
204
-            push @$all_key_infos, @$key_infos;
205
-            
206
-            # Join expand tag to SQL
207
-            $sql .= $expand;
208
-        }
209
-    }
210
-    
211
-    # Add semicolon
212
-    $sql .= ';' unless $sql =~ /;$/;
213
-    
214
-    # Query
215
-    my $query = {sql => $sql, key_infos => $all_key_infos};
216
-    
217
-    return $query;
218
-}
219
-
220
-# Get placeholder count
221
-sub _placeholder_count {
222
-    my ($self, $expand) = @_;
223
-    $expand ||= '';
224
-    
225
-    my $count = 0;
226
-    my $pos   = -1;
227
-    while (($pos = index($expand, '?', $pos + 1)) != -1) {
228
-        $count++;
229
-    }
230
-    return $count;
231
-}
232
-
233
-Object::Simple->build_class;
234
-
235
-
236
-package DBIx::Custom::SQL::Template::TagProcessor;
237
-use strict;
238
-use warnings;
239
-use Carp 'croak';
240
-
241
-# Expand tag '?', '=', '<>', '>', '<', '>=', '<=', 'like'
242
-sub expand_basic_tag {
243
-    my ($tag_name, $tag_args) = @_;
244
-    my $original_key = $tag_args->[0];
245
-    
246
-    # Key is not exist
247
-    croak("You must be pass key as argument to tag '{$tag_name }'")
248
-      if !$original_key;
249
-    
250
-    # Expanded tag
251
-    my $expand = $tag_name eq '?'
252
-               ? '?'
253
-               : "$original_key $tag_name ?";
254
-    
255
-    # Get table and clumn name
256
-    my ($table, $column) = get_table_and_column($original_key);
257
-    
258
-    # Parameter key infomation
259
-    my $key_info = {};
260
-    
261
-    # Original key
262
-    $key_info->{original_key} = $original_key;
263
-    
264
-    # Table
265
-    $key_info->{table}  = $table;
266
-    
267
-    # Column name
268
-    $key_info->{column} = $column;
269
-    
270
-    # Access keys
271
-    my $access_keys = [];
272
-    push @$access_keys, [$original_key];
273
-    push @$access_keys, [$table, $column] if $table && $column;
274
-    $key_info->{access_keys} = $access_keys;
275
-    
276
-    # Add parameter key information
277
-    my $key_infos = [];
278
-    push @$key_infos, $key_info;
279
-    
280
-    return ($expand, $key_infos);
281
-}
282
-
283
-# Expand tag 'in'
284
-sub expand_in_tag {
285
-    my ($tag_name, $tag_args) = @_;
286
-    my ($original_key, $placeholder_count) = @$tag_args;
287
-    
288
-    # Key must be specified
289
-    croak("You must be pass key as first argument of tag '{$tag_name }'\n" . 
290
-          "Usage: {$tag_name \$key \$placeholder_count}")
291
-      unless $original_key;
292
-      
293
-    
294
-    # Place holder count must be specified
295
-    croak("You must be pass placeholder count as second argument of tag '{$tag_name }'\n" . 
296
-          "Usage: {$tag_name \$key \$placeholder_count}")
297
-      if !$placeholder_count || $placeholder_count =~ /\D/;
298
-
299
-    # Expand tag
300
-    my $expand = "$original_key $tag_name (";
301
-    for (my $i = 0; $i < $placeholder_count; $i++) {
302
-        $expand .= '?, ';
303
-    }
304
-    
305
-    $expand =~ s/, $//;
306
-    $expand .= ')';
307
-    
308
-    # Get table and clumn name
309
-    my ($table, $column) = get_table_and_column($original_key);
310
-    
311
-    # Create parameter key infomations
312
-    my $key_infos = [];
313
-    for (my $i = 0; $i < $placeholder_count; $i++) {
314
-        # Parameter key infomation
315
-        my $key_info = {};
316
-        
317
-        # Original key
318
-        $key_info->{original_key} = $original_key;
319
-        
320
-        # Table
321
-        $key_info->{table}   = $table;
322
-        
323
-        # Column name
324
-        $key_info->{column}  = $column;
325
-        
326
-        # Access keys
327
-        my $access_keys = [];
328
-        push @$access_keys, [$original_key, [$i]];
329
-        push @$access_keys, [$table, $column, [$i]] if $table && $column;
330
-        $key_info->{access_keys} = $access_keys;
331
-        
332
-        # Add parameter key infos
333
-        push @$key_infos, $key_info;
334
-    }
335
-    
336
-    return ($expand, $key_infos);
337
-}
338
-
339
-# Get table and column
340
-sub get_table_and_column {
341
-    my $key = shift;
342
-    $key ||= '';
343
-    
344
-    return ('', $key) unless $key =~ /\./;
345
-    
346
-    my ($table, $column) = split /\./, $key;
347
-    
348
-    return ($table, $column);
349
-}
350
-
351
-# Expand tag 'insert'
352
-sub expand_insert_tag {
353
-    my ($tag_name, $tag_args) = @_;
354
-    my $original_keys = $tag_args;
355
-    
356
-    # Insert key (k1, k2, k3, ..)
357
-    my $insert_keys = '(';
358
-    
359
-    # placeholder (?, ?, ?, ..)
360
-    my $place_holders = '(';
361
-    
362
-    foreach my $original_key (@$original_keys) {
363
-        # Get table and column
364
-        my ($table, $column) = get_table_and_column($original_key);
365
-        
366
-        # Join insert column
367
-        $insert_keys   .= "$column, ";
368
-        
369
-        # Join place holder
370
-        $place_holders .= "?, ";
371
-    }
372
-    
373
-    # Delete last ', '
374
-    $insert_keys =~ s/, $//;
375
-    
376
-    # Close 
377
-    $insert_keys .= ')';
378
-    $place_holders =~ s/, $//;
379
-    $place_holders .= ')';
380
-    
381
-    # Expand tag
382
-    my $expand = "$insert_keys values $place_holders";
383
-    
384
-    # Create parameter key infomations
385
-    my $key_infos = [];
386
-    foreach my $original_key (@$original_keys) {
387
-        # Get table and clumn name
388
-        my ($table, $column) = get_table_and_column($original_key);
389
-        
390
-        # Parameter key infomation
391
-        my $key_info = {};
392
-        
393
-        # Original key
394
-        $key_info->{original_key} = $original_key;
395
-        
396
-        # Table
397
-        $key_info->{table}   = $table;
398
-        
399
-        # Column name
400
-        $key_info->{column}  = $column;
401
-        
402
-        # Access keys
403
-        my $access_keys = [];
404
-        push @$access_keys, ['#insert', $original_key];
405
-        push @$access_keys, ['#insert', $table, $column] if $table && $column;
406
-        push @$access_keys, [$original_key];
407
-        push @$access_keys, [$table, $column] if $table && $column;
408
-        $key_info->{access_keys} = $access_keys;
409
-        
410
-        # Add parameter key infos
411
-        push @$key_infos, $key_info;
412
-    }
413
-    
414
-    return ($expand, $key_infos);
415
-}
416
-
417
-# Expand tag 'update'
418
-sub expand_update_tag {
419
-    my ($tag_name, $tag_args) = @_;
420
-    my $original_keys = $tag_args;
421
-    
422
-    # Expanded tag
423
-    my $expand = 'set ';
424
-    
425
-    # 
426
-    foreach my $original_key (@$original_keys) {
427
-        # Get table and clumn name
428
-        my ($table, $column) = get_table_and_column($original_key);
429
-
430
-        # Join key and placeholder
431
-        $expand .= "$column = ?, ";
432
-    }
433
-    
434
-    # Delete last ', '
435
-    $expand =~ s/, $//;
436
-    
437
-    # Create parameter key infomations
438
-    my $key_infos = [];
439
-    foreach my $original_key (@$original_keys) {
440
-        # Get table and clumn name
441
-        my ($table, $column) = get_table_and_column($original_key);
442
-        
443
-        # Parameter key infomation
444
-        my $key_info = {};
445
-        
446
-        # Original key
447
-        $key_info->{original_key} = $original_key;
448
-        
449
-        # Table
450
-        $key_info->{table}  = $table;
451
-        
452
-        # Column name
453
-        $key_info->{column} = $column;
454
-        
455
-        # Access keys
456
-        my $access_keys = [];
457
-        push @$access_keys, ['#update', $original_key];
458
-        push @$access_keys, ['#update', $table, $column] if $table && $column;
459
-        push @$access_keys, [$original_key];
460
-        push @$access_keys, [$table, $column] if $table && $column;
461
-        $key_info->{access_keys} = $access_keys;
462
-        
463
-        # Add parameter key infos
464
-        push @$key_infos, $key_info;
465
-    }
466
-    
467
-    return ($expand, $key_infos);
468
-}
469
-
470
-1;
471
-
472
-=head1 NAME
473
-
474
-DBIx::Custom::SQL::Template - Custamizable SQL Template for DBIx::Custom
475
-
476
-=head1 VERSION
477
-
478
-Version 0.0101
479
-
480
-=cut
481
-
482
-=head1 SYNOPSIS
483
-    
484
-    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
485
-    
486
-    my $tmpl   = "select from table {= k1} && {<> k2} || {like k3}";
487
-    my $param = {k1 => 1, k2 => 2, k3 => 3};
488
-    
489
-    my $query = $sql_template->create_query($tmpl);
490
-    
491
-    
492
-    # Using query from DBIx::Custom
493
-    use DBIx::Custom;
494
-    my $dbi = DBI->new(
495
-       data_source => $data_source,
496
-       user        => $user,
497
-       password    => $password, 
498
-       dbi_options => {PrintError => 0, RaiseError => 1}
499
-    );
500
-    
501
-    $query = $dbi->create_query($tmpl); # This is SQL::Template create_query
502
-    $dbi->query($query, $param);
503
-
504
-=head1 CLASS-OBJECT ACCESSORS
505
-
506
-Class-Object accessor is used from both object and class
507
-
508
-    $class->$accessor # call from class
509
-    $self->$accessor  # call form object
510
-
511
-=head2 tag_processors
512
-
513
-    # Set and get
514
-    $self           = $sql_tmpl->tag_processors($tag_processors);
515
-    $tag_processors = $sql_tmpl->tag_processors;
516
-    
517
-    # Sample
518
-    $sql_tmpl->tag_processors(
519
-        '?' => \&expand_question,
520
-        '=' => \&expand_equel
521
-    );
522
-
523
-You can use add_tag_processor to add tag processor
524
-
525
-=head2 tag_start
526
-
527
-    # Set and get
528
-    $self      = $sql_tmpl->tag_start($tag_start);
529
-    $tag_start = $sql_tmpl->tag_start;
530
-    
531
-    # Sample
532
-    $sql_tmpl->tag_start('{');
533
-
534
-Default is '{'
535
-
536
-=head2 tag_end
537
-
538
-    # Set and get
539
-    $self    = $sql_tmpl->tag_start($tag_end);
540
-    $tag_end = $sql_tmpl->tag_start;
541
-    
542
-    # Sample
543
-    $sql_tmpl->tag_start('}');
544
-
545
-Default is '}'
546
-    
547
-=head2 tag_syntax
548
-    
549
-    # Set and get
550
-    $self       = $sql_tmpl->tag_syntax($tag_syntax);
551
-    $tag_syntax = $sql_tmpl->tag_syntax;
552
-    
553
-    # Sample
554
-    $sql_tmpl->tag_syntax(
555
-        "[Tag]            [Expand]\n" .
556
-        "{? name}         ?\n" .
557
-        "{= name}         name = ?\n" .
558
-        "{<> name}        name <> ?\n"
559
-    );
560
-
561
-=head1 METHODS
562
-
563
-=head2 create_query
564
-    
565
-    # Create SQL form SQL template
566
-    $query = $sql_tmpl->create_query($tmpl);
567
-    
568
-    # Sample
569
-    $query = $sql_tmpl->create_sql(
570
-         "select * from table where {= title} && {like author} || {<= price}")
571
-    
572
-    # Result
573
-    $qeury->{sql} : "select * from table where title = ? && author like ? price <= ?;"
574
-    $query->{key_infos} : [['title'], ['author'], ['price']]
575
-    
576
-    # Sample2 (with table name)
577
-    ($sql, @bind_values) = $sql_tmpl->create_sql(
578
-            "select * from table where {= table.title} && {like table.author}",
579
-            {table => {title => 'Perl', author => '%Taro%'}}
580
-        )
581
-    
582
-    # Result2
583
-    $query->{sql} : "select * from table where table.title = ? && table.title like ?;"
584
-    $query->{key_infos} :[ [['table.title'],['table', 'title']],
585
-                           [['table.author'],['table', 'author']] ]
586
-
587
-This method create query using by DBIx::Custom.
588
-query is two infomation
589
-
590
-    1.sql       : SQL
591
-    2.key_infos : Parameter access key information
592
-
593
-=head2 add_tag_processor
594
-
595
-Add tag processor
596
-  
597
-    # Add
598
-    $self = $sql_tmpl->add_tag_processor($tag_processor);
599
-    
600
-    # Sample
601
-    $sql_tmpl->add_tag_processor(
602
-        '?' => sub {
603
-            my ($tag_name, $tag_args) = @_;
604
-            
605
-            my $key1 = $tag_args->[0];
606
-            my $key2 = $tag_args->[1];
607
-            
608
-            my $key_infos = [];
609
-            
610
-            # Expand tag and create key informations
611
-            
612
-            # Return expand tags and key informations
613
-            return ($expand, $key_infos);
614
-        }
615
-    );
616
-
617
-Tag processor recieve 2 argument
618
-
619
-    1. Tag name            (?, =, <>, or etc)
620
-    2. Tag arguments       (arg1 and arg2 in {tag_name arg1 arg2})
621
-
622
-Tag processor return 2 value
623
-
624
-    1. Expanded Tag (For exsample, '{= title}' is expanded to 'title = ?')
625
-    2. Key infomations
626
-    
627
-You must be return expanded tag and key infomations.
628
-
629
-Key information is a little complex. so I will explan this in future.
630
-
631
-If you want to know more, Please see DBIx::Custom::SQL::Template source code.
632
-
633
-=head2 clone
634
-
635
-    # Clone DBIx::Custom::SQL::Template object
636
-    $clone = $self->clone;
637
-    
638
-=head1 Available Tags
639
-    
640
-    # Available Tags
641
-    [tag]            [expand]
642
-    {? name}         ?
643
-    {= name}         name = ?
644
-    {<> name}        name <> ?
645
-    
646
-    {< name}         name < ?
647
-    {> name}         name > ?
648
-    {>= name}        name >= ?
649
-    {<= name}        name <= ?
650
-    
651
-    {like name}      name like ?
652
-    {in name}        name in [?, ?, ..]
653
-    
654
-    {insert}  (key1, key2, key3) values (?, ?, ?)
655
-    {update}     set key1 = ?, key2 = ?, key3 = ?
656
-    
657
-    # Sample1
658
-    $query = $sql_tmpl->create_sql(
659
-        "insert into table {insert key1 key2}"
660
-    );
661
-    # Result1
662
-    $sql : "insert into table (key1, key2) values (?, ?)"
663
-    
664
-    
665
-    # Sample2
666
-    $query = $sql_tmpl->create_sql(
667
-        "update table {update key1 key2} where {= key3}"
668
-    );
669
-    
670
-    # Result2
671
-    $query->{sql} : "update table set key1 = ?, key2 = ? where key3 = ?;"
672
-    
673
-=head1 AUTHOR
674
-
675
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
676
-
677
-Github 
678
-L<http://github.com/yuki-kimoto>
679
-L<http://github.com/yuki-kimoto/DBIx-Custom-SQL-Template>
680
-
681
-Please let know me bag if you find
682
-Please request me if you want to do something
683
-
684
-=head1 COPYRIGHT & LICENSE
685
-
686
-Copyright 2009 Yuki Kimoto, all rights reserved.
687
-
688
-This program is free software; you can redistribute it and/or modify it
689
-under the same terms as Perl itself.
690
-
691
-
692
-=cut
693
-
694
-1; # End of DBIx::Custom::SQL::Template
-136
DBIx-Custom-0.0501/lib/DBIx/Custom/SQLite.pm
... ...
@@ -1,136 +0,0 @@
1
-package DBIx::Custom::SQLite;
2
-use base 'DBIx::Custom::Basic';
3
-
4
-use warnings;
5
-use strict;
6
-use Carp 'croak';
7
-
8
-my $class = __PACKAGE__;
9
-
10
-$class->add_format(
11
-    datetime => $class->formats->{SQL99_datetime},
12
-    date     => $class->formats->{SQL99_date},
13
-    time     => $class->formats->{SQL99_time},
14
-);
15
-
16
-sub connect {
17
-    my $self = shift;
18
-    
19
-    if (!$self->data_source && (my $database = $self->database)) {
20
-        $self->data_source("dbi:SQLite:dbname=$database");
21
-    }
22
-    
23
-    return $self->SUPER::connect;
24
-}
25
-
26
-sub connect_memory {
27
-    my $self = shift;
28
-    
29
-    # Data source for memory database
30
-    $self->data_source('dbi:SQLite:dbname=:memory:');
31
-    
32
-    # Already connected
33
-    croak("Already connected") if $self->connected;
34
-    
35
-    # Connect
36
-    $self->connect;
37
-    
38
-    return $self;
39
-}
40
-
41
-sub reconnect_memory {
42
-    my $self = shift;
43
-
44
-    # Data source for memory database
45
-    $self->data_source('dbi:SQLite:dbname=:memory:');
46
-    
47
-    # Reconnect
48
-    $self->reconnect;
49
-    
50
-    return $self;
51
-}
52
-
53
-
54
-=head1 NAME
55
-
56
-DBIx::Custom::SQLite - DBIx::Custom SQLite implementation
57
-
58
-=head1 Version
59
-
60
-Version 0.0201
61
-
62
-=head1 Synopsys
63
-
64
-    use DBIx::Custom::SQLite;
65
-    
66
-    # New
67
-    my $dbi = DBIx::Custom::SQLite->new(user => 'taro', $password => 'kliej&@K',
68
-                                       database => 'sample.db');
69
-    
70
-    # Insert 
71
-    $dbi->insert('books', {title => 'perl', author => 'taro'});
72
-    
73
-    # Update 
74
-    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
75
-    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
76
-    
77
-    # Delete
78
-    $dbi->delete('books', {author => 'taro'});
79
-    
80
-    # select * from books;
81
-    $dbi->select('books');
82
-    
83
-    # select * from books where ahthor = 'taro'; 
84
-    $dbi->select('books', {author => 'taro'}); 
85
-    
86
-    # select author, title from books where author = 'taro'
87
-    $dbi->select('books', [qw/author title/], {author => 'taro'});
88
-    
89
-    # select author, title from books where author = 'taro' order by id limit 1;
90
-    $dbi->select('books', [qw/author title/], {author => 'taro'},
91
-                 'order by id limit 1');
92
-
93
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation
94
-
95
-This class is L<DBIx::Custom::Basic> subclass.
96
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass
97
-
98
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom>
99
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation
100
-
101
-=head1 Object methods
102
-
103
-=head2 connect
104
-
105
-This override L<DBIx::Custom> connect.
106
-
107
-    # Connect to database
108
-    $dbi->connect;
109
-
110
-If database attribute is set, automatically data source is created and connect
111
-
112
-=head2 connect_memory
113
-
114
-    # Connect memory database
115
-    $self = $dbi->connect_memory;
116
-
117
-=head2 reconnect_memory
118
-
119
-    # Reconnect memory database
120
-    $self = $dbi->reconnect_memory;
121
-
122
-=head1 Author
123
-
124
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
125
-
126
-Github L<http://github.com/yuki-kimoto>
127
-
128
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
129
-
130
-=head1 Copyright & lisence
131
-
132
-Copyright 2009 Yuki Kimoto, all rights reserved.
133
-
134
-This program is free software; you can redistribute it and/or modify it
135
-under the same terms as Perl itself.
136
-
-15
DBIx-Custom-0.0501/t/00-load.t
... ...
@@ -1,15 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 7;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom' );
7
-	use_ok( 'DBIx::Custom::Basic' );
8
-	use_ok( 'DBIx::Custom::MySQL' );
9
-	use_ok( 'DBIx::Custom::Query' );
10
-	use_ok( 'DBIx::Custom::Result' );
11
-	use_ok( 'DBIx::Custom::SQL::Template' );
12
-	use_ok( 'DBIx::Custom::SQLite' );
13
-}
14
-
15
-diag( "Testing DBIx::Custom $DBIx::Custom::VERSION, Perl $], $^X" );
-51
DBIx-Custom-0.0501/t/boilerplate.t
... ...
@@ -1,51 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-
40
-  not_in_file_ok(README =>
41
-    "The README is used..."       => qr/The README is used/,
42
-    "'version information here'"  => qr/to provide version information/,
43
-  );
44
-
45
-  not_in_file_ok(Changes =>
46
-    "placeholder date/time"       => qr(Date/time)
47
-  );
48
-
49
-  module_boilerplate_ok('lib/DBIx/Custom.pm');
50
-
51
-
-67
DBIx-Custom-0.0501/t/dbi-custom-basic-sqlite.t
... ...
@@ -1,67 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-use utf8;
5
-use Encode qw/decode encode/;
6
-
7
-BEGIN {
8
-    eval { require DBD::SQLite; 1 }
9
-        or plan skip_all => 'DBD::SQLite required';
10
-    eval { DBD::SQLite->VERSION >= 1 }
11
-        or plan skip_all => 'DBD::SQLite >= 1.00 required';
12
-
13
-    plan 'no_plan';
14
-    use_ok('DBIx::Custom');
15
-}
16
-
17
-# Function for test name
18
-my $test;
19
-sub test {
20
-    $test = shift;
21
-}
22
-
23
-# Constant varialbes for test
24
-my $CREATE_TABLE = {
25
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
26
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
27
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
28
-};
29
-
30
-my $SELECT_TMPL = {
31
-    0 => 'select * from table1;'
32
-};
33
-
34
-my $DROP_TABLE = {
35
-    0 => 'drop table table1'
36
-};
37
-
38
-my $NEW_ARGS = {
39
-    0 => {data_source => 'dbi:SQLite:dbname=:memory:'}
40
-};
41
-
42
-# Variables for test
43
-my $dbi;
44
-my $decoded_str;
45
-my $encoded_str;
46
-my $array;
47
-
48
-use DBIx::Custom::Basic;
49
-
50
-test 'Filter';
51
-$dbi = DBIx::Custom::Basic->new($NEW_ARGS->{0});
52
-ok($dbi->filters->{encode_utf8}, "$test : exists default_bind_filter");
53
-ok($dbi->filters->{decode_utf8}, "$test : exists default_fetch_filter");
54
-
55
-$dbi->utf8_filter_on;
56
-is($dbi->bind_filter, $dbi->filters->{encode_utf8}, 'default bind filter');
57
-is($dbi->fetch_filter, $dbi->filters->{decode_utf8}, 'default fetch filter');
58
-
59
-$decoded_str = 'あ';
60
-$encoded_str = $dbi->bind_filter->($decoded_str);
61
-is($encoded_str, encode('UTF-8', $decoded_str), "$test : encode utf8");
62
-is($decoded_str, $dbi->fetch_filter->($encoded_str), "$test : fetch_filter");
63
-
64
-$decoded_str = 'a';
65
-$encoded_str = $dbi->bind_filter->($decoded_str);
66
-is($encoded_str, encode('UTF-8', $decoded_str), "$test : upgrade and encode utf8");
67
-is($decoded_str, $dbi->fetch_filter->($encoded_str), "$test : fetch_filter");
-36
DBIx-Custom-0.0501/t/dbi-custom-core-mysql-private.t
... ...
@@ -1,36 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-# user password database
6
-our ($USER, $PASSWORD, $DATABASE) = connect_info();
7
-
8
-plan skip_all => 'private MySQL test' unless $USER;
9
-
10
-plan 'no_plan';
11
-
12
-use DBIx::Custom;
13
-use Scalar::Util 'blessed';
14
-{
15
-    my $dbi = DBIx::Custom->new(
16
-        user => $USER,
17
-        password => $PASSWORD,
18
-        data_source => "dbi:mysql:dbname=$DATABASE"
19
-    );
20
-    $dbi->connect;
21
-    
22
-    ok(blessed $dbi->dbh);
23
-    can_ok($dbi->dbh, qw/prepare/);
24
-}
25
-
26
-sub connect_info {
27
-    my $file = 'password.tmp';
28
-    open my $fh, '<', $file
29
-      or return;
30
-    
31
-    my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);
32
-    
33
-    close $fh;
34
-    
35
-    return ($user, $password, $database);
36
-}
-716
DBIx-Custom-0.0501/t/dbi-custom-core-sqlite.t
... ...
@@ -1,716 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require DBD::SQLite; 1 }
7
-        or plan skip_all => 'DBD::SQLite required';
8
-    eval { DBD::SQLite->VERSION >= 1.25 }
9
-        or plan skip_all => 'DBD::SQLite >= 1.25 required';
10
-
11
-    plan 'no_plan';
12
-    use_ok('DBIx::Custom');
13
-}
14
-
15
-# Function for test name
16
-my $test;
17
-sub test {
18
-    $test = shift;
19
-}
20
-
21
-# Constant varialbes for test
22
-my $CREATE_TABLE = {
23
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
24
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
25
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
26
-};
27
-
28
-my $SELECT_TMPL = {
29
-    0 => 'select * from table1;'
30
-};
31
-
32
-my $DROP_TABLE = {
33
-    0 => 'drop table table1'
34
-};
35
-
36
-my $NEW_ARGS = {
37
-    0 => {data_source => 'dbi:SQLite:dbname=:memory:'}
38
-};
39
-
40
-# Variables for test
41
-my $dbi;
42
-my $sth;
43
-my $tmpl;
44
-my @tmpls;
45
-my $select_tmpl;
46
-my $insert_tmpl;
47
-my $update_tmpl;
48
-my $params;
49
-my $sql;
50
-my $result;
51
-my @rows;
52
-my $rows;
53
-my $query;
54
-my @queries;
55
-my $select_query;
56
-my $insert_query;
57
-my $update_query;
58
-my $ret_val;
59
-
60
-
61
-test 'disconnect';
62
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
63
-$dbi->connect;
64
-$dbi->disconnect;
65
-ok(!$dbi->dbh, $test);
66
-
67
-
68
-test 'connected';
69
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
70
-ok(!$dbi->connected, "$test : not connected");
71
-$dbi->connect;
72
-ok($dbi->connected, "$test : connected");
73
-
74
-
75
-test 'preapare';
76
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
77
-$sth = $dbi->prepare($CREATE_TABLE->{0});
78
-ok($sth, "$test : auto connect");
79
-$sth->execute;
80
-$sth = $dbi->prepare($DROP_TABLE->{0});
81
-ok($sth, "$test : basic");
82
-
83
-
84
-test 'do';
85
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
86
-$ret_val = $dbi->do($CREATE_TABLE->{0});
87
-ok(defined $ret_val, "$test : auto connect");
88
-$ret_val = $dbi->do($DROP_TABLE->{0});
89
-ok(defined $ret_val, "$test : basic");
90
-
91
-
92
-# Prepare table
93
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
94
-$dbi->connect;
95
-$dbi->do($CREATE_TABLE->{0});
96
-$sth = $dbi->prepare("insert into table1 (key1, key2) values (?, ?);");
97
-$sth->execute(1, 2);
98
-$sth->execute(3, 4);
99
-
100
-
101
-test 'DBIx::Custom::Result test';
102
-$tmpl = "select key1, key2 from table1";
103
-$query = $dbi->create_query($tmpl);
104
-$result = $dbi->execute($query);
105
-
106
-@rows = ();
107
-while (my $row = $result->fetch) {
108
-    push @rows, [@$row];
109
-}
110
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch scalar context");
111
-
112
-$result = $dbi->execute($query);
113
-@rows = ();
114
-while (my @row = $result->fetch) {
115
-    push @rows, [@row];
116
-}
117
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch list context");
118
-
119
-$result = $dbi->execute($query);
120
-@rows = ();
121
-while (my $row = $result->fetch_hash) {
122
-    push @rows, {%$row};
123
-}
124
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : fetch_hash scalar context");
125
-
126
-$result = $dbi->execute($query);
127
-@rows = ();
128
-while (my %row = $result->fetch_hash) {
129
-    push @rows, {%row};
130
-}
131
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : fetch hash list context");
132
-
133
-$result = $dbi->execute($query);
134
-$rows = $result->fetch_all;
135
-is_deeply($rows, [[1, 2], [3, 4]], "$test : fetch_all scalar context");
136
-
137
-$result = $dbi->execute($query);
138
-@rows = $result->fetch_all;
139
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch_all list context");
140
-
141
-$result = $dbi->execute($query);
142
-@rows = $result->fetch_hash_all;
143
-is_deeply($rows, [[1, 2], [3, 4]], "$test : fetch_hash_all scalar context");
144
-
145
-$result = $dbi->execute($query);
146
-@rows = $result->fetch_all;
147
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch_hash_all list context");
148
-
149
-
150
-test 'Insert query return value';
151
-$dbi->do($DROP_TABLE->{0});
152
-$dbi->do($CREATE_TABLE->{0});
153
-$tmpl = "insert into table1 {insert key1 key2}";
154
-$query = $dbi->create_query($tmpl);
155
-$ret_val = $dbi->execute($query, {key1 => 1, key2 => 2});
156
-ok($ret_val, $test);
157
-
158
-
159
-test 'Direct execute';
160
-$dbi->do($DROP_TABLE->{0});
161
-$dbi->do($CREATE_TABLE->{0});
162
-$insert_tmpl = "insert into table1 {insert key1 key2}";
163
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2}, sub {
164
-    my $query = shift;
165
-    $query->bind_filter(sub {
166
-        my ($value, $key) = @_;
167
-        if ($key eq 'key2') {
168
-            return $value + 1;
169
-        }
170
-        return $value;
171
-    });
172
-});
173
-$result = $dbi->execute($SELECT_TMPL->{0});
174
-$rows = $result->fetch_hash_all;
175
-is_deeply($rows, [{key1 => 1, key2 => 3}], $test);
176
-
177
-
178
-test 'Filter basic';
179
-$dbi->do($DROP_TABLE->{0});
180
-$dbi->do($CREATE_TABLE->{0});
181
-
182
-$insert_tmpl  = "insert into table1 {insert key1 key2};";
183
-$insert_query = $dbi->create_query($insert_tmpl);
184
-$insert_query->bind_filter(sub {
185
-    my ($value, $key, $table, $column) = @_;
186
-    if ($key eq 'key1' && $table eq '' && $column eq 'key1') {
187
-        return $value * 2;
188
-    }
189
-    return $value;
190
-});
191
-$dbi->execute($insert_query, {key1 => 1, key2 => 2});
192
-$select_query = $dbi->create_query($SELECT_TMPL->{0});
193
-$select_query->fetch_filter(sub {
194
-    my ($value, $key, $type, $sth, $i) = @_;
195
-    if ($key eq 'key2' && $type =~ /char/ && $sth->can('execute') && $i == 1) {
196
-        return $value * 3;
197
-    }
198
-    return $value;
199
-});
200
-$result = $dbi->execute($select_query);
201
-$rows = $result->fetch_hash_all;
202
-is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : bind_filter fetch_filter");
203
-
204
-$dbi->do("delete from table1;");
205
-$insert_query->no_bind_filters('key1');
206
-$select_query->no_fetch_filters('key2');
207
-$dbi->execute($insert_query, {key1 => 1, key2 => 2});
208
-$result = $dbi->execute($select_query);
209
-$rows = $result->fetch_hash_all;
210
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : no_fetch_filters no_bind_filters");
211
-
212
-$dbi->do($DROP_TABLE->{0});
213
-$dbi->do($CREATE_TABLE->{0});
214
-$insert_tmpl  = "insert into table1 {insert table1.key1 table1.key2}";
215
-$insert_query = $dbi->create_query($insert_tmpl);
216
-$insert_query->bind_filter(sub {
217
-    my ($value, $key, $table, $column) = @_;
218
-    if ($key eq 'table1.key1' && $table eq 'table1' && $column eq 'key1') {
219
-        return $value * 3;
220
-    }
221
-    return $value;
222
-});
223
-$dbi->execute($insert_query, {table1 => {key1 => 1, key2 => 2}});
224
-$select_query = $dbi->create_query($SELECT_TMPL->{0});
225
-$result       = $dbi->execute($select_query);
226
-$rows = $result->fetch_hash_all;
227
-is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : insert with table name");
228
-
229
-test 'Filter in';
230
-$insert_tmpl  = "insert into table1 {insert key1 key2};";
231
-$insert_query = $dbi->create_query($insert_tmpl);
232
-$dbi->execute($insert_query, {key1 => 2, key2 => 4});
233
-$select_tmpl = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}";
234
-$select_query = $dbi->create_query($select_tmpl);
235
-$select_query->bind_filter(sub {
236
-    my ($value, $key, $table, $column) = @_;
237
-    if ($key eq 'table1.key1' && $table eq 'table1' && $column eq 'key1' || $key eq 'table1.key2') {
238
-        return $value * 2;
239
-    }
240
-    return $value;
241
-});
242
-$result = $dbi->execute($select_query, {table1 => {key1 => [1,5], key2 => [2,5]}});
243
-$rows = $result->fetch_hash_all;
244
-is_deeply($rows, [{key1 => 2, key2 => 4}], "$test : bind_filter");
245
-
246
-
247
-test 'DBIx::Custom::SQL::Template basic tag';
248
-$dbi->do($DROP_TABLE->{0});
249
-$dbi->do($CREATE_TABLE->{1});
250
-$sth = $dbi->prepare("insert into table1 (key1, key2, key3, key4, key5) values (?, ?, ?, ?, ?);");
251
-$sth->execute(1, 2, 3, 4, 5);
252
-$sth->execute(6, 7, 8, 9, 10);
253
-
254
-$tmpl = "select * from table1 where {= key1} and {<> key2} and {< key3} and {> key4} and {>= key5};";
255
-$query = $dbi->create_query($tmpl);
256
-$result = $dbi->execute($query, {key1 => 1, key2 => 3, key3 => 4, key4 => 3, key5 => 5});
257
-$rows = $result->fetch_hash_all;
258
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1");
259
-
260
-$tmpl = "select * from table1 where {= table1.key1} and {<> table1.key2} and {< table1.key3} and {> table1.key4} and {>= table1.key5};";
261
-$query = $dbi->create_query($tmpl);
262
-$result = $dbi->execute($query, {table1 => {key1 => 1, key2 => 3, key3 => 4, key4 => 3, key5 => 5}});
263
-$rows = $result->fetch_hash_all;
264
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1 with table");
265
-
266
-$tmpl = "select * from table1 where {= table1.key1} and {<> table1.key2} and {< table1.key3} and {> table1.key4} and {>= table1.key5};";
267
-$query = $dbi->create_query($tmpl);
268
-$result = $dbi->execute($query, {'table1.key1' => 1, 'table1.key2' => 3, 'table1.key3' => 4, 'table1.key4' => 3, 'table1.key5' => 5});
269
-$rows = $result->fetch_hash_all;
270
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1 with table dot");
271
-
272
-$tmpl = "select * from table1 where {<= key1} and {like key2};";
273
-$query = $dbi->create_query($tmpl);
274
-$result = $dbi->execute($query, {key1 => 1, key2 => '%2%'});
275
-$rows = $result->fetch_hash_all;
276
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2");
277
-
278
-$tmpl = "select * from table1 where {<= table1.key1} and {like table1.key2};";
279
-$query = $dbi->create_query($tmpl);
280
-$result = $dbi->execute($query, {table1 => {key1 => 1, key2 => '%2%'}});
281
-$rows = $result->fetch_hash_all;
282
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2 with table");
283
-
284
-$tmpl = "select * from table1 where {<= table1.key1} and {like table1.key2};";
285
-$query = $dbi->create_query($tmpl);
286
-$result = $dbi->execute($query, {'table1.key1' => 1, 'table1.key2' => '%2%'});
287
-$rows = $result->fetch_hash_all;
288
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2 with table dot");
289
-
290
-
291
-test 'DIB::Custom::SQL::Template in tag';
292
-$dbi->do($DROP_TABLE->{0});
293
-$dbi->do($CREATE_TABLE->{1});
294
-$sth = $dbi->prepare("insert into table1 (key1, key2, key3, key4, key5) values (?, ?, ?, ?, ?);");
295
-$sth->execute(1, 2, 3, 4, 5);
296
-$sth->execute(6, 7, 8, 9, 10);
297
-
298
-$tmpl = "select * from table1 where {in key1 2};";
299
-$query = $dbi->create_query($tmpl);
300
-$result = $dbi->execute($query, {key1 => [9, 1]});
301
-$rows = $result->fetch_hash_all;
302
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic");
303
-
304
-$tmpl = "select * from table1 where {in table1.key1 2};";
305
-$query = $dbi->create_query($tmpl);
306
-$result = $dbi->execute($query, {table1 => {key1 => [9, 1]}});
307
-$rows = $result->fetch_hash_all;
308
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table");
309
-
310
-$tmpl = "select * from table1 where {in table1.key1 2};";
311
-$query = $dbi->create_query($tmpl);
312
-$result = $dbi->execute($query, {'table1.key1' => [9, 1]});
313
-$rows = $result->fetch_hash_all;
314
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table dot");
315
-
316
-
317
-test 'DBIx::Custom::SQL::Template insert tag';
318
-$dbi->do("delete from table1");
319
-$insert_tmpl = 'insert into table1 {insert key1 key2 key3 key4 key5}';
320
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
321
-
322
-$result = $dbi->execute($SELECT_TMPL->{0});
323
-$rows = $result->fetch_hash_all;
324
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic");
325
-
326
-$dbi->do("delete from table1");
327
-$dbi->execute($insert_tmpl, {'#insert' => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}});
328
-$result = $dbi->execute($SELECT_TMPL->{0});
329
-$rows = $result->fetch_hash_all;
330
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert");
331
-
332
-$dbi->do("delete from table1");
333
-$insert_tmpl = 'insert into table1 {insert table1.key1 table1.key2 table1.key3 table1.key4 table1.key5}';
334
-$dbi->execute($insert_tmpl, {table1 => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}});
335
-$result = $dbi->execute($SELECT_TMPL->{0});
336
-$rows = $result->fetch_hash_all;
337
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table name");
338
-
339
-$dbi->do("delete from table1");
340
-$insert_tmpl = 'insert into table1 {insert table1.key1 table1.key2 table1.key3 table1.key4 table1.key5}';
341
-$dbi->execute($insert_tmpl, {'table1.key1' => 1, 'table1.key2' => 2, 'table1.key3' => 3, 'table1.key4' => 4, 'table1.key5' => 5});
342
-$result = $dbi->execute($SELECT_TMPL->{0});
343
-$rows = $result->fetch_hash_all;
344
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table name dot");
345
-
346
-$dbi->do("delete from table1");
347
-$dbi->execute($insert_tmpl, {'#insert' => {table1 => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}}});
348
-$result = $dbi->execute($SELECT_TMPL->{0});
349
-$rows = $result->fetch_hash_all;
350
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert with table name");
351
-
352
-$dbi->do("delete from table1");
353
-$dbi->execute($insert_tmpl, {'#insert' => {'table1.key1' => 1, 'table1.key2' => 2, 'table1.key3' => 3, 'table1.key4' => 4, 'table1.key5' => 5}});
354
-$result = $dbi->execute($SELECT_TMPL->{0});
355
-$rows = $result->fetch_hash_all;
356
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert with table name dot");
357
-
358
-
359
-test 'DBIx::Custom::SQL::Template update tag';
360
-$dbi->do("delete from table1");
361
-$insert_tmpl = "insert into table1 {insert key1 key2 key3 key4 key5}";
362
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
363
-$dbi->execute($insert_tmpl, {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
364
-
365
-$update_tmpl = 'update table1 {update key1 key2 key3 key4} where {= key5}';
366
-$dbi->execute($update_tmpl, {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5});
367
-
368
-$result = $dbi->execute($SELECT_TMPL->{0});
369
-$rows = $result->fetch_hash_all;
370
-is_deeply($rows, [{key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5},
371
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : basic");
372
-
373
-$dbi->execute($update_tmpl, {'#update' => {key1 => 2, key2 => 2, key3 => 2, key4 => 2}, key5 => 5});
374
-$result = $dbi->execute($SELECT_TMPL->{0});
375
-$rows = $result->fetch_hash_all;
376
-is_deeply($rows, [{key1 => 2, key2 => 2, key3 => 2, key4 => 2, key5 => 5},
377
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : #update");
378
-
379
-$update_tmpl = 'update table1 {update table1.key1 table1.key2 table1.key3 table1.key4} where {= table1.key5}';
380
-$dbi->execute($update_tmpl, {table1 => {key1 => 3, key2 => 3, key3 => 3, key4 => 3, key5 => 5}});
381
-$result = $dbi->execute($SELECT_TMPL->{0});
382
-$rows = $result->fetch_hash_all;
383
-is_deeply($rows, [{key1 => 3, key2 => 3, key3 => 3, key4 => 3, key5 => 5},
384
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : with table name");
385
-
386
-$update_tmpl = 'update table1 {update table1.key1 table1.key2 table1.key3 table1.key4} where {= table1.key5}';
387
-$dbi->execute($update_tmpl, {'table1.key1' => 4, 'table1.key2' => 4, 'table1.key3' => 4, 'table1.key4' => 4, 'table1.key5' => 5});
388
-$result = $dbi->execute($SELECT_TMPL->{0});
389
-$rows = $result->fetch_hash_all;
390
-is_deeply($rows, [{key1 => 4, key2 => 4, key3 => 4, key4 => 4, key5 => 5},
391
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : with table name dot");
392
-
393
-$dbi->execute($update_tmpl, {'#update' => {table1 => {key1 => 5, key2 => 5, key3 => 5, key4 => 5}}, table1 => {key5 => 5}});
394
-$result = $dbi->execute($SELECT_TMPL->{0});
395
-$rows = $result->fetch_hash_all;
396
-is_deeply($rows, [{key1 => 5, key2 => 5, key3 => 5, key4 => 5, key5 => 5},
397
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : update tag #update with table name");
398
-
399
-$dbi->execute($update_tmpl, {'#update' => {'table1.key1' => 6, 'table1.key2' => 6, 'table1.key3' => 6, 'table1.key4' => 6}, 'table1.key5' => 5});
400
-$result = $dbi->execute($SELECT_TMPL->{0});
401
-$rows = $result->fetch_hash_all;
402
-is_deeply($rows, [{key1 => 6, key2 => 6, key3 => 6, key4 => 6, key5 => 5},
403
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : update tag #update with table name dot");
404
-
405
-
406
-test 'run_tansaction';
407
-$dbi->do($DROP_TABLE->{0});
408
-$dbi->do($CREATE_TABLE->{0});
409
-$dbi->run_transaction(sub {
410
-    $insert_tmpl = 'insert into table1 {insert key1 key2}';
411
-    $dbi->execute($insert_tmpl, {key1 => 1, key2 => 2});
412
-    $dbi->execute($insert_tmpl, {key1 => 3, key2 => 4});
413
-});
414
-$result = $dbi->execute($SELECT_TMPL->{0});
415
-$rows   = $result->fetch_hash_all;
416
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : commit");
417
-
418
-$dbi->do($DROP_TABLE->{0});
419
-$dbi->do($CREATE_TABLE->{0});
420
-$dbi->dbh->{RaiseError} = 0;
421
-eval{
422
-    $dbi->run_transaction(sub {
423
-        $insert_tmpl = 'insert into table1 {insert key1 key2}';
424
-        $dbi->execute($insert_tmpl, {key1 => 1, key2 => 2});
425
-        die "Fatal Error";
426
-        $dbi->execute($insert_tmpl, {key1 => 3, key2 => 4});
427
-    })
428
-};
429
-like($@, qr/Fatal Error.*Rollback is success/ms, "$test : Rollback success message");
430
-ok(!$dbi->dbh->{RaiseError}, "$test : restore RaiseError value");
431
-$result = $dbi->execute($SELECT_TMPL->{0});
432
-$rows   = $result->fetch_hash_all;
433
-is_deeply($rows, [], "$test : rollback");
434
-
435
-
436
-test 'Error case';
437
-$dbi = DBIx::Custom->new;
438
-eval{$dbi->run_transaction};
439
-like($@, qr/Not yet connect to database/, "$test : Yet Connected");
440
-
441
-$dbi = DBIx::Custom->new(data_source => 'dbi:SQLit');
442
-eval{$dbi->connect;};
443
-ok($@, "$test : connect error");
444
-
445
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
446
-$dbi->connect;
447
-$dbi->dbh->{AutoCommit} = 0;
448
-eval{$dbi->run_transaction()};
449
-like($@, qr/AutoCommit must be true before transaction start/,
450
-         "$test : run_transaction auto commit is false");
451
-
452
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
453
-$sql = 'laksjdf';
454
-eval{$dbi->prepare($sql)};
455
-like($@, qr/$sql/, "$test : prepare fail");
456
-
457
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
458
-$sql = 'laksjdf';
459
-eval{$dbi->do($sql, qw/1 2 3/)};
460
-like($@, qr/$sql/, "$test : do fail");
461
-
462
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
463
-eval{$dbi->create_query("{p }")};
464
-ok($@, "$test : create_query invalid SQL template");
465
-
466
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
467
-$dbi->do($CREATE_TABLE->{0});
468
-$query = $dbi->create_query("select * from table1 where {= key1}");
469
-eval{$dbi->execute($query, {key2 => 1})};
470
-like($@, qr/Corresponding key is not found in your parameters/, 
471
-        "$test : execute corresponding key not found");
472
-
473
-
474
-test 'insert';
475
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
476
-$dbi->do($CREATE_TABLE->{0});
477
-$dbi->insert('table1', {key1 => 1, key2 => 2});
478
-$dbi->insert('table1', {key1 => 3, key2 => 4});
479
-$result = $dbi->execute($SELECT_TMPL->{0});
480
-$rows   = $result->fetch_hash_all;
481
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : basic");
482
-
483
-$dbi->do('delete from table1');
484
-$dbi->insert('table1', {key1 => 1, key2 => 2}, sub {
485
-    my $query = shift;
486
-    $query->bind_filter(sub {
487
-        my ($value, $key) = @_;
488
-        if ($key eq 'key1') {
489
-            return $value * 3;
490
-        }
491
-        return $value;
492
-    });
493
-});
494
-$result = $dbi->execute($SELECT_TMPL->{0});
495
-$rows   = $result->fetch_hash_all;
496
-is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : edit_query_callback");
497
-
498
-
499
-test 'insert error';
500
-eval{$dbi->insert('table1')};
501
-like($@, qr/Key-value pairs for insert must be specified to 'insert' second argument/, "$test : insert key-value not specifed");
502
-
503
-eval{$dbi->insert('table1', {key1 => 1, key2 => 2}, 'aaa')};
504
-like($@, qr/Query edit callback must be code reference/, "$test : query edit callback not code ref");
505
-
506
-
507
-test 'update';
508
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
509
-$dbi->do($CREATE_TABLE->{1});
510
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
511
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
512
-$dbi->update('table1', {key2 => 11}, {key1 => 1});
513
-$result = $dbi->execute($SELECT_TMPL->{0});
514
-$rows   = $result->fetch_hash_all;
515
-is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5},
516
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
517
-                  "$test : basic");
518
-                  
519
-$dbi->do("delete from table1");
520
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
521
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
522
-$dbi->update('table1', {key2 => 12}, {key2 => 2, key3 => 3});
523
-$result = $dbi->execute($SELECT_TMPL->{0});
524
-$rows   = $result->fetch_hash_all;
525
-is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5},
526
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
527
-                  "$test : update key same as search key");
528
-
529
-$dbi->do("delete from table1");
530
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
531
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
532
-$dbi->update('table1', {key2 => 11}, {key1 => 1}, sub {
533
-    my $query = shift;
534
-    $query->bind_filter(sub {
535
-        my ($value, $key) = @_;
536
-        if ($key eq 'key2') {
537
-            return $value * 2;
538
-        }
539
-        return $value;
540
-    });
541
-});
542
-$result = $dbi->execute($SELECT_TMPL->{0});
543
-$rows   = $result->fetch_hash_all;
544
-is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5},
545
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
546
-                  "$test : query edit callback");
547
-
548
-
549
-test 'update error';
550
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
551
-$dbi->do($CREATE_TABLE->{1});
552
-eval{$dbi->update('table1')};
553
-like($@, qr/Key-value pairs for update must be specified to 'update' second argument/,
554
-         "$test : update key-value pairs not specified");
555
-
556
-eval{$dbi->update('table1', {key2 => 1})};
557
-like($@, qr/Key-value pairs for where clause must be specified to 'update' third argument/,
558
-         "$test : where key-value pairs not specified");
559
-
560
-eval{$dbi->update('table1', {key2 => 1}, {key2 => 3}, 'aaa')};
561
-like($@, qr/Query edit callback must be code reference/, 
562
-         "$test : query edit callback not code reference");
563
-
564
-
565
-test 'update_all';
566
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
567
-$dbi->do($CREATE_TABLE->{1});
568
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
569
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
570
-$dbi->update_all('table1', {key2 => 10}, sub {
571
-    my $query = shift;
572
-    $query->bind_filter(sub {
573
-        my ($value, $key) = @_;
574
-        return $value * 2;
575
-    })
576
-});
577
-$result = $dbi->execute($SELECT_TMPL->{0});
578
-$rows   = $result->fetch_hash_all;
579
-is_deeply($rows, [{key1 => 1, key2 => 20, key3 => 3, key4 => 4, key5 => 5},
580
-                  {key1 => 6, key2 => 20, key3 => 8, key4 => 9, key5 => 10}],
581
-                  "$test : query edit callback");
582
-
583
-
584
-test 'delete';
585
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
586
-$dbi->do($CREATE_TABLE->{0});
587
-$dbi->insert('table1', {key1 => 1, key2 => 2});
588
-$dbi->insert('table1', {key1 => 3, key2 => 4});
589
-$dbi->delete('table1', {key1 => 1});
590
-$result = $dbi->execute($SELECT_TMPL->{0});
591
-$rows   = $result->fetch_hash_all;
592
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : basic");
593
-
594
-$dbi->do("delete from table1;");
595
-$dbi->insert('table1', {key1 => 1, key2 => 2});
596
-$dbi->insert('table1', {key1 => 3, key2 => 4});
597
-$dbi->delete('table1', {key2 => 1}, sub {
598
-    my $query = shift;
599
-    $query->bind_filter(sub {
600
-        my ($value, $key) = @_;
601
-        return $value * 2;
602
-    });
603
-});
604
-$result = $dbi->execute($SELECT_TMPL->{0});
605
-$rows   = $result->fetch_hash_all;
606
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : query edit callback");
607
-
608
-$dbi->delete_all('table1');
609
-$dbi->insert('table1', {key1 => 1, key2 => 2});
610
-$dbi->insert('table1', {key1 => 3, key2 => 4});
611
-$dbi->delete('table1', {key1 => 1, key2 => 2});
612
-$rows = $dbi->select('table1')->fetch_hash_all;
613
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : delete multi key");
614
-
615
-
616
-test 'delete error';
617
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
618
-$dbi->do($CREATE_TABLE->{0});
619
-eval{$dbi->delete('table1')};
620
-like($@, qr/Key-value pairs for where clause must be specified to 'delete' second argument/,
621
-         "$test : where key-value pairs not specified");
622
-
623
-eval{$dbi->delete('table1', {key1 => 1}, 'aaa')};
624
-like($@, qr/Query edit callback must be code reference/, 
625
-         "$test : query edit callback not code ref");
626
-
627
-
628
-test 'delete_all';
629
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
630
-$dbi->do($CREATE_TABLE->{0});
631
-$dbi->insert('table1', {key1 => 1, key2 => 2});
632
-$dbi->insert('table1', {key1 => 3, key2 => 4});
633
-$dbi->delete_all('table1');
634
-$result = $dbi->execute($SELECT_TMPL->{0});
635
-$rows   = $result->fetch_hash_all;
636
-is_deeply($rows, [], "$test : basic");
637
-
638
-
639
-test 'select';
640
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
641
-$dbi->do($CREATE_TABLE->{0});
642
-$dbi->insert('table1', {key1 => 1, key2 => 2});
643
-$dbi->insert('table1', {key1 => 3, key2 => 4});
644
-$rows = $dbi->select('table1')->fetch_hash_all;
645
-is_deeply($rows, [{key1 => 1, key2 => 2},
646
-                  {key1 => 3, key2 => 4}], "$test : table");
647
-
648
-$rows = $dbi->select('table1', ['key1'])->fetch_hash_all;
649
-is_deeply($rows, [{key1 => 1}, {key1 => 3}], "$test : table and columns and where key");
650
-
651
-$rows = $dbi->select('table1', {key1 => 1})->fetch_hash_all;
652
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : table and columns and where key");
653
-
654
-$rows = $dbi->select('table1', ['key1'], {key1 => 3})->fetch_hash_all;
655
-is_deeply($rows, [{key1 => 3}], "$test : table and columns and where key");
656
-
657
-$rows = $dbi->select('table1', "order by key1 desc limit 1")->fetch_hash_all;
658
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : append statement");
659
-
660
-$rows = $dbi->select('table1', {key1 => 2}, sub {
661
-    my $query = shift;
662
-    $query->bind_filter(sub {
663
-        my ($value, $key) = @_;
664
-        if ($key eq 'key1') {
665
-            return $value - 1;
666
-        }
667
-        return $value;
668
-    });
669
-})->fetch_hash_all;
670
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : query edit call back");
671
-
672
-$dbi->do($CREATE_TABLE->{2});
673
-$dbi->insert('table2', {key1 => 1, key3 => 5});
674
-$rows = $dbi->select([qw/table1 table2/],
675
-                     ['table1.key1 as table1_key1', 'table2.key1 as table2_key1', 'key2', 'key3'],
676
-                     {'table1.key2' => 2},
677
-                     "where table1.key1 = table2.key1")->fetch_hash_all;
678
-is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], "$test : join");
679
-
680
-test 'Cache';
681
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
682
-DBIx::Custom->query_cache_max(2);
683
-$dbi->do($CREATE_TABLE->{0});
684
-DBIx::Custom->delete_class_attr('_query_caches');
685
-DBIx::Custom->delete_class_attr('_query_cache_keys');
686
-$tmpls[0] = "insert into table1 {insert key1 key2}";
687
-$queries[0] = $dbi->create_query($tmpls[0]);
688
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{sql}, $queries[0]->sql, "$test : sql first");
689
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{key_infos}, $queries[0]->key_infos, "$test : key_infos first");
690
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls], "$test : cache key first");
691
-
692
-$tmpls[1] = "select * from table1";
693
-$queries[1] = $dbi->create_query($tmpls[1]);
694
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{sql}, $queries[0]->sql, "$test : sql first");
695
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{key_infos}, $queries[0]->key_infos, "$test : key_infos first");
696
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql second");
697
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos second");
698
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls], "$test : cache key second");
699
-
700
-$tmpls[2] = "select key1, key2 from table1";
701
-$queries[2] = $dbi->create_query($tmpls[2]);
702
-ok(!exists DBIx::Custom->_query_caches->{$tmpls[0]}, "$test : cache overflow deleted key");
703
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql cache overflow deleted key");
704
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos cache overflow deleted key");
705
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{sql}, $queries[2]->sql, "$test : sql cache overflow deleted key");
706
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{key_infos}, $queries[2]->key_infos, "$test : key_infos cache overflow deleted key");
707
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls[1, 2]], "$test : cache key third");
708
-
709
-$queries[1] = $dbi->create_query($tmpls[1]);
710
-ok(!exists DBIx::Custom->_query_caches->{$tmpls[0]}, "$test : cache overflow deleted key");
711
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql cache overflow deleted key");
712
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos cache overflow deleted key");
713
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{sql}, $queries[2]->sql, "$test : sql cache overflow deleted key");
714
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{key_infos}, $queries[2]->key_infos, "$test : key_infos cache overflow deleted key");
715
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls[1, 2]], "$test : cache key third");
716
-
-220
DBIx-Custom-0.0501/t/dbi-custom-core.t
... ...
@@ -1,220 +0,0 @@
1
-use Test::More 'no_plan';
2
-use strict;
3
-use warnings;
4
-
5
-use DBIx::Custom;
6
-use DBIx::Custom::SQL::Template;
7
-
8
-# Function for test name
9
-my $test;
10
-sub test {
11
-    $test = shift;
12
-}
13
-
14
-# Variables for test
15
-our $SQL_TMPL = {
16
-    0 => DBIx::Custom::SQL::Template->new->tag_start(0),
17
-    1 => DBIx::Custom::SQL::Template->new->tag_start(1),
18
-    2 => DBIx::Custom::SQL::Template->new->tag_start(2)
19
-};
20
-my $dbi;
21
-
22
-
23
-test 'Constructor';
24
-$dbi = DBIx::Custom->new(
25
-    user => 'a',
26
-    database => 'a',
27
-    password => 'b',
28
-    data_source => 'c',
29
-    dbi_options => {d => 1, e => 2},
30
-    filters => {
31
-        f => 3,
32
-    },
33
-    bind_filter => 'f',
34
-    fetch_filter => 'g',
35
-    result_class => 'g',
36
-    sql_template => $SQL_TMPL->{0},
37
-);
38
-is_deeply($dbi,{user => 'a', database => 'a', password => 'b', data_source => 'c', 
39
-                dbi_options => {d => 1, e => 2}, filters => {f => 3}, bind_filter => 'f',
40
-                fetch_filter => 'g', result_class => 'g',
41
-                sql_template => $SQL_TMPL->{0}}, $test);
42
-isa_ok($dbi, 'DBIx::Custom');
43
-
44
-
45
-test 'Sub class constructor';
46
-{
47
-    package DBIx::Custom::T1;
48
-    use base 'DBIx::Custom';
49
-    
50
-    __PACKAGE__
51
-      ->user('a')
52
-      ->database('a')
53
-      ->password('b')
54
-      ->data_source('c')
55
-      ->dbi_options({d => 1, e => 2})
56
-      ->filters(
57
-          f => 3
58
-      )
59
-      ->formats(
60
-          f => 3
61
-      )
62
-      ->bind_filter('f')
63
-      ->fetch_filter('g')
64
-      ->result_class('DBIx::Custom::Result')
65
-      ->sql_template($SQL_TMPL->{0})
66
-    ;
67
-}
68
-$dbi = DBIx::Custom::T1->new(
69
-    user => 'ao',
70
-    database => 'ao',
71
-    password => 'bo',
72
-    data_source => 'co',
73
-    dbi_options => {do => 10, eo => 20},
74
-    filters => {
75
-        fo => 30,
76
-    },
77
-    formats => {
78
-        fo => 30,
79
-    },
80
-    bind_filter => 'fo',
81
-    fetch_filter => 'go',
82
-    result_class => 'ho',
83
-    sql_template => $SQL_TMPL->{0},
84
-);
85
-is($dbi->user, 'ao', "$test : user");
86
-is($dbi->database, 'ao', "$test : database");
87
-is($dbi->password, 'bo', "$test : passowr");
88
-is($dbi->data_source, 'co', "$test : data_source");
89
-is_deeply($dbi->dbi_options, {do => 10, eo => 20}, "$test : dbi_options");
90
-is_deeply(scalar $dbi->filters, {fo => 30}, "$test : filters");
91
-is_deeply(scalar $dbi->formats, {fo => 30}, "$test : formats");
92
-is($dbi->bind_filter, 'fo', "$test : bind_filter");
93
-is($dbi->fetch_filter, 'go', "$test : fetch_filter");
94
-is($dbi->result_class, 'ho', "$test : result_class");
95
-is($dbi->sql_template->tag_start, 0, "$test : sql_template");
96
-isa_ok($dbi, 'DBIx::Custom::T1');
97
-
98
-test 'Sub class constructor default';
99
-$dbi = DBIx::Custom::T1->new;
100
-is($dbi->user, 'a', "$test : user");
101
-is($dbi->database, 'a', "$test : database");
102
-is($dbi->password, 'b', "$test : password");
103
-is($dbi->data_source, 'c', "$test : data_source");
104
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
105
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters");
106
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats");
107
-is($dbi->bind_filter, 'f', "$test : bind_filter");
108
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
109
-is($dbi->result_class, 'DBIx::Custom::Result', "$test : result_class");
110
-is($dbi->sql_template->tag_start, 0, "$test : sql_template");
111
-isa_ok($dbi, 'DBIx::Custom::T1');
112
-
113
-
114
-test 'Sub sub class constructor default';
115
-{
116
-    package DBIx::Custom::T1_2;
117
-    use base 'DBIx::Custom::T1';
118
-}
119
-$dbi = DBIx::Custom::T1_2->new;
120
-is($dbi->user, 'a', "$test : user");
121
-is($dbi->database, 'a', "$test : database");
122
-is($dbi->password, 'b', "$test : passowrd");
123
-is($dbi->data_source, 'c', "$test : data_source");
124
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
125
-is_deeply(scalar $dbi->filters, {f => 3}, "$test : filters");
126
-is_deeply(scalar $dbi->formats, {f => 3}, "$test : formats");
127
-is($dbi->bind_filter, 'f', "$test : bind_filter");
128
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
129
-is($dbi->result_class, 'DBIx::Custom::Result', "$test : result_class");
130
-is($dbi->sql_template->tag_start, 0, "$test sql_template");
131
-isa_ok($dbi, 'DBIx::Custom::T1_2');
132
-
133
-
134
-test 'Customized sub class constructor default';
135
-{
136
-    package DBIx::Custom::T1_3;
137
-    use base 'DBIx::Custom::T1';
138
-    
139
-    __PACKAGE__
140
-      ->user('ao')
141
-      ->database('ao')
142
-      ->password('bo')
143
-      ->data_source('co')
144
-      ->dbi_options({do => 10, eo => 20})
145
-      ->filters(
146
-        fo => 30
147
-      )
148
-      ->formats(
149
-        fo => 30
150
-      )
151
-      ->bind_filter('fo')
152
-      ->fetch_filter('go')
153
-      ->result_class('ho')
154
-      ->sql_template($SQL_TMPL->{1})
155
-    ;
156
-}
157
-$dbi = DBIx::Custom::T1_3->new;
158
-is($dbi->user, 'ao', "$test : user");
159
-is($dbi->database, 'ao', "$test : database");
160
-is($dbi->password, 'bo', "$test : password");
161
-is($dbi->data_source, 'co', "$test : data_source");
162
-is_deeply($dbi->dbi_options, {do => 10, eo => 20}, "$test : dbi_options");
163
-is_deeply(scalar $dbi->filters, {fo => 30}, "$test : filters");
164
-is_deeply(scalar $dbi->formats, {fo => 30}, "$test : formats");
165
-is($dbi->bind_filter, 'fo', "$test : bind_filter");
166
-is($dbi->fetch_filter, 'go', "$test : fetch_filter");
167
-is($dbi->result_class, 'ho', "$test : result_class");
168
-is($dbi->sql_template->tag_start, 1, "$test : sql_template");
169
-isa_ok($dbi, 'DBIx::Custom::T1_3');
170
-
171
-
172
-test 'Customized sub class constructor';
173
-$dbi = DBIx::Custom::T1_3->new(
174
-    user => 'a',
175
-    database => 'a',
176
-    password => 'b',
177
-    data_source => 'c',
178
-    dbi_options => {d => 1, e => 2},
179
-    filters => {
180
-        f => 3,
181
-    },
182
-    formats => {
183
-        f => 3,
184
-    },
185
-    bind_filter => 'f',
186
-    fetch_filter => 'g',
187
-    result_class => 'h',
188
-    sql_template => $SQL_TMPL->{2},
189
-);
190
-is($dbi->user, 'a', "$test : user");
191
-is($dbi->database, 'a', "$test : database");
192
-is($dbi->password, 'b', "$test : password");
193
-is($dbi->data_source, 'c', "$test : data_source");
194
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
195
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters");
196
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats");
197
-is($dbi->bind_filter, 'f', "$test : bind_filter");
198
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
199
-is($dbi->result_class, 'h', "$test : result_class");
200
-is($dbi->sql_template->tag_start, 2, "$test : sql_template");
201
-isa_ok($dbi, 'DBIx::Custom');
202
-
203
-
204
-test 'add_filters';
205
-$dbi = DBIx::Custom->new;
206
-$dbi->add_filter(a => sub {1});
207
-is($dbi->filters->{a}->(), 1, $test);
208
-
209
-test 'add_formats';
210
-$dbi = DBIx::Custom->new;
211
-$dbi->add_format(a => sub {1});
212
-is($dbi->formats->{a}->(), 1, $test);
213
-
214
-test 'filter_off';
215
-$dbi = DBIx::Custom->new;
216
-$dbi->bind_filter('a');
217
-$dbi->fetch_filter('b');
218
-$dbi->filter_off;
219
-ok(!$dbi->bind_filter,  "$test : bind_filter  off");
220
-ok(!$dbi->fetch_filter, "$test : fetch_filter off");
-47
DBIx-Custom-0.0501/t/dbi-custom-mysql-private.t
... ...
@@ -1,47 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-# user password database
6
-our ($USER, $PASSWORD, $DATABASE) = connect_info();
7
-
8
-plan skip_all => 'private MySQL test' unless $USER;
9
-
10
-plan 'no_plan';
11
-
12
-# Function for test name
13
-my $test;
14
-sub test {
15
-    $test = shift;
16
-}
17
-
18
-
19
-# Functions for tests
20
-sub connect_info {
21
-    my $file = 'password.tmp';
22
-    open my $fh, '<', $file
23
-      or return;
24
-    
25
-    my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);
26
-    
27
-    close $fh;
28
-    
29
-    return ($user, $password, $database);
30
-}
31
-
32
-
33
-# Constat variables for tests
34
-my $CLASS = 'DBIx::Custom::MySQL';
35
-
36
-# Varialbes for tests
37
-my $dbi;
38
-
39
-use DBIx::Custom::MySQL;
40
-
41
-test 'connect';
42
-$dbi = $CLASS->new(user => $USER, password => $PASSWORD,
43
-                    database => $DATABASE);
44
-$dbi->connect;
45
-is(ref $dbi->dbh, 'DBI::db', $test);
46
-
47
-
-85
DBIx-Custom-0.0501/t/dbi-custom-mysql-timeformat.t
... ...
@@ -1,85 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    eval { Time::Piece->VERSION >= 1.15 }
10
-        or plan skip_all => 'Time::Piece >= 1.15 requred';
11
-        
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom');
14
-}
15
-
16
-# Function for test name
17
-my $test;
18
-sub test {
19
-    $test = shift;
20
-}
21
-
22
-# Varialbe for tests
23
-
24
-my $format;
25
-my $data;
26
-my $timepiece;
27
-my $dbi;
28
-
29
-use DBIx::Custom::MySQL;
30
-
31
-
32
-test 'SQL99 format';
33
-$dbi = DBIx::Custom::MySQL->new;
34
-$data   = '2009-01-02 03:04:05';
35
-$format = $dbi->formats->{'SQL99_datetime'};
36
-$timepiece = Time::Piece->strptime($data, $format);
37
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
38
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
39
-
40
-$data   = '2009-01-02';
41
-$format = $dbi->formats->{'SQL99_date'};
42
-$timepiece = Time::Piece->strptime($data, $format);
43
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
44
-
45
-$data   = '03:04:05';
46
-$format = $dbi->formats->{'SQL99_time'};
47
-$timepiece = Time::Piece->strptime($data, $format);
48
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
49
-
50
-
51
-test 'ISO-8601 format';
52
-$data   = '2009-01-02T03:04:05';
53
-$format = $dbi->formats->{'ISO-8601_datetime'};
54
-$timepiece = Time::Piece->strptime($data, $format);
55
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
56
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
57
-
58
-$data   = '2009-01-02';
59
-$format = $dbi->formats->{'ISO-8601_date'};
60
-$timepiece = Time::Piece->strptime($data, $format);
61
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
62
-
63
-$data   = '03:04:05';
64
-$format = $dbi->formats->{'ISO-8601_time'};
65
-$timepiece = Time::Piece->strptime($data, $format);
66
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
67
-
68
-
69
-test 'default format';
70
-$data   = '2009-01-02 03:04:05';
71
-$format = $dbi->formats->{'datetime'};
72
-$timepiece = Time::Piece->strptime($data, $format);
73
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
74
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
75
-
76
-$data   = '2009-01-02';
77
-$format = $dbi->formats->{'date'};
78
-$timepiece = Time::Piece->strptime($data, $format);
79
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
80
-
81
-$data   = '03:04:05';
82
-$format = $dbi->formats->{'time'};
83
-$timepiece = Time::Piece->strptime($data, $format);
84
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
85
-
-37
DBIx-Custom-0.0501/t/dbi-custom-query.t
... ...
@@ -1,37 +0,0 @@
1
-use Test::More 'no_plan';
2
-
3
-use strict;
4
-use warnings;
5
-use DBIx::Custom::Query;
6
-
7
-# Function for test name
8
-my $test;
9
-sub test{
10
-    $test = shift;
11
-}
12
-
13
-# Variables for test
14
-my $query;
15
-
16
-test 'Accessors';
17
-$query = DBIx::Custom::Query->new(
18
-    sql              => 'a',
19
-    key_infos        => 'b',
20
-    bind_filter      => 'c',
21
-    no_bind_filters  => [qw/d e/],
22
-    sth              => 'e',
23
-    fetch_filter     => 'f',
24
-    no_fetch_filters => [qw/g h/],
25
-);
26
-
27
-is($query->sql, 'a', "$test : sql");
28
-is($query->key_infos, 'b', "$test : key_infos ");
29
-is($query->bind_filter, 'c', "$test : bind_filter");
30
-is_deeply(scalar $query->no_bind_filters, [qw/d e/], "$test : no_bind_filters");
31
-is_deeply(scalar $query->_no_bind_filters_map, {d => 1, e => 1}, "$test : _no_bind_filters_map");
32
-is_deeply(scalar $query->no_fetch_filters, [qw/g h/], "$test : no_fetch_filters");
33
-is($query->sth, 'e', "$test : sth");
34
-
35
-$query->no_bind_filters(undef);
36
-is_deeply(scalar $query->_no_bind_filters_map, {}, "$test _no_bind_filters_map undef value");
37
-
-257
DBIx-Custom-0.0501/t/dbi-custom-result-sqlite.t
... ...
@@ -1,257 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-use DBI;
5
-
6
-BEGIN {
7
-    eval { require DBD::SQLite; 1 }
8
-        or plan skip_all => 'DBD::SQLite required';
9
-    eval { DBD::SQLite->VERSION >= 1 }
10
-        or plan skip_all => 'DBD::SQLite >= 1.00 required';
11
-
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom::Result');
14
-}
15
-
16
-my $test;
17
-sub test {
18
-    $test = shift;
19
-}
20
-
21
-sub query {
22
-    my ($dbh, $sql) = @_;
23
-    my $sth = $dbh->prepare($sql);
24
-    $sth->execute;
25
-    return DBIx::Custom::Result->new(sth => $sth);
26
-}
27
-
28
-my $dbh;
29
-my $sql;
30
-my $sth;
31
-my @row;
32
-my $row;
33
-my @rows;
34
-my $rows;
35
-my $result;
36
-my $fetch_filter;
37
-my @error;
38
-my $error;
39
-
40
-$dbh = DBI->connect('dbi:SQLite:dbname=:memory:', undef, undef, {PrintError => 0, RaiseError => 1});
41
-$dbh->do("create table table1 (key1 char(255), key2 char(255));");
42
-$dbh->do("insert into table1 (key1, key2) values ('1', '2');");
43
-$dbh->do("insert into table1 (key1, key2) values ('3', '4');");
44
-
45
-$sql = "select key1, key2 from table1";
46
-
47
-test 'fetch scalar context';
48
-$result = query($dbh, $sql);
49
-@rows = ();
50
-while (my $row = $result->fetch) {
51
-    push @rows, [@$row];
52
-}
53
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
54
-
55
-
56
-test 'fetch list context';
57
-$result = query($dbh, $sql);
58
-@rows = ();
59
-while (my @row = $result->fetch) {
60
-    push @rows, [@row];
61
-}
62
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
63
-
64
-test 'fetch_hash scalar context';
65
-$result = query($dbh, $sql);
66
-@rows = ();
67
-while (my $row = $result->fetch_hash) {
68
-    push @rows, {%$row};
69
-}
70
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], $test);
71
-
72
-
73
-test 'fetch hash list context';
74
-$result = query($dbh, $sql);
75
-@rows = ();
76
-while (my %row = $result->fetch_hash) {
77
-    push @rows, {%row};
78
-}
79
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], $test);
80
-
81
-
82
-test 'fetch_first';
83
-$result = query($dbh, $sql);
84
-$row = $result->fetch_first;
85
-is_deeply($row, [1, 2], "$test : row");
86
-$row = $result->fetch;
87
-ok(!$row, "$test : finished");
88
-
89
-
90
-test 'fetch_first list context';
91
-$result = query($dbh, $sql);
92
-@row = $result->fetch_first;
93
-is_deeply([@row], [1, 2], "$test : row");
94
-@row = $result->fetch;
95
-ok(!@row, "$test : finished");
96
-
97
-
98
-test 'fetch_hash_first';
99
-$result = query($dbh, $sql);
100
-$row = $result->fetch_hash_first;
101
-is_deeply($row, {key1 => 1, key2 => 2}, "$test : row");
102
-$row = $result->fetch_hash;
103
-ok(!$row, "$test : finished");
104
-
105
-
106
-test 'fetch_hash_first list context';
107
-$result = query($dbh, $sql);
108
-@row = $result->fetch_hash_first;
109
-is_deeply({@row}, {key1 => 1, key2 => 2}, "$test : row");
110
-@row = $result->fetch_hash;
111
-ok(!@row, "$test : finished");
112
-
113
-
114
-test 'fetch_rows';
115
-$dbh->do("insert into table1 (key1, key2) values ('5', '6');");
116
-$dbh->do("insert into table1 (key1, key2) values ('7', '8');");
117
-$dbh->do("insert into table1 (key1, key2) values ('9', '10');");
118
-$result = query($dbh, $sql);
119
-$rows = $result->fetch_rows(2);
120
-is_deeply($rows, [[1, 2],
121
-                  [3, 4]], "$test : fetch_rows first");
122
-$rows = $result->fetch_rows(2);
123
-is_deeply($rows, [[5, 6],
124
-                  [7, 8]], "$test : fetch_rows secound");
125
-$rows = $result->fetch_rows(2);
126
-is_deeply($rows, [[9, 10]], "$test : fetch_rows third");
127
-$rows = $result->fetch_rows(2);
128
-ok(!$rows);
129
-
130
-
131
-test 'fetch_rows list context';
132
-$result = query($dbh, $sql);
133
-@rows = $result->fetch_rows(2);
134
-is_deeply([@rows], [[1, 2],
135
-                  [3, 4]], "$test : fetch_rows first");
136
-@rows = $result->fetch_rows(2);
137
-is_deeply([@rows], [[5, 6],
138
-                  [7, 8]], "$test : fetch_rows secound");
139
-@rows = $result->fetch_rows(2);
140
-is_deeply([@rows], [[9, 10]], "$test : fetch_rows third");
141
-@rows = $result->fetch_rows(2);
142
-ok(!@rows);
143
-
144
-
145
-test 'fetch_rows error';
146
-$result = query($dbh, $sql);
147
-eval {$result->fetch_rows};
148
-like($@, qr/Row count must be specified/, "$test : Not specified row count");
149
-
150
-
151
-test 'fetch_hash_rows';
152
-$result = query($dbh, $sql);
153
-$rows = $result->fetch_hash_rows(2);
154
-is_deeply($rows, [{key1 => 1, key2 => 2},
155
-                  {key1 => 3, key2 => 4}], "$test : fetch_rows first");
156
-$rows = $result->fetch_hash_rows(2);
157
-is_deeply($rows, [{key1 => 5, key2 => 6},
158
-                  {key1 => 7, key2 => 8}], "$test : fetch_rows secound");
159
-$rows = $result->fetch_hash_rows(2);
160
-is_deeply($rows, [{key1 => 9, key2 => 10}], "$test : fetch_rows third");
161
-$rows = $result->fetch_hash_rows(2);
162
-ok(!$rows);
163
-
164
-
165
-test 'fetch_rows list context';
166
-$result = query($dbh, $sql);
167
-@rows = $result->fetch_hash_rows(2);
168
-is_deeply([@rows], [{key1 => 1, key2 => 2},
169
-                    {key1 => 3, key2 => 4}], "$test : fetch_rows first");
170
-@rows = $result->fetch_hash_rows(2);
171
-is_deeply([@rows], [{key1 => 5, key2 => 6},
172
-                    {key1 => 7, key2 => 8}], "$test : fetch_rows secound");
173
-@rows = $result->fetch_hash_rows(2);
174
-is_deeply([@rows], [{key1 => 9, key2 => 10}], "$test : fetch_rows third");
175
-@rows = $result->fetch_hash_rows(2);
176
-ok(!@rows);
177
-$dbh->do("delete from table1 where key1 = 5 or key1 = 7 or key1 = 9");
178
-
179
-
180
-test 'fetch_rows error';
181
-$result = query($dbh, $sql);
182
-eval {$result->fetch_hash_rows};
183
-like($@, qr/Row count must be specified/, "$test : Not specified row count");
184
-
185
-
186
-test 'fetch_all';
187
-$result = query($dbh, $sql);
188
-$rows = $result->fetch_all;
189
-is_deeply($rows, [[1, 2], [3, 4]], $test);
190
-
191
-test 'fetch_all list context';
192
-$result = query($dbh, $sql);
193
-@rows = $result->fetch_all;
194
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
195
-
196
-
197
-test 'fetch_hash_all';
198
-$result = query($dbh, $sql);
199
-@rows = $result->fetch_hash_all;
200
-is_deeply($rows, [[1, 2], [3, 4]], $test);
201
-
202
-
203
-test 'fetch_hash_all list context';
204
-$result = query($dbh, $sql);
205
-@rows = $result->fetch_all;
206
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
207
-
208
-
209
-test 'fetch filter';
210
-$fetch_filter = sub {
211
-    my ($value, $key, $type, $sth, $i) = @_;
212
-    if ($key eq 'key1' && $value == 1 && $type =~ /char/i && $i == 0 && $sth->{TYPE}->[$i] eq $type) {
213
-        return $value * 3;
214
-    }
215
-    return $value;
216
-};
217
-
218
-$result = query($dbh, $sql);
219
-$result->fetch_filter($fetch_filter);
220
-$rows = $result->fetch_all;
221
-is_deeply($rows, [[3, 2], [3, 4]], "$test array");
222
-
223
-$result = query($dbh, $sql);
224
-$result->fetch_filter($fetch_filter);
225
-$rows = $result->fetch_hash_all;
226
-is_deeply($rows, [{key1 => 3, key2 => 2}, {key1 => 3, key2 => 4}], "$test hash");
227
-
228
-$result = query($dbh, $sql);
229
-$result->no_fetch_filters(['key1']);
230
-$rows = $result->fetch_all;
231
-is_deeply($rows, [[1, 2], [3, 4]], "$test array no filter keys");
232
-
233
-$result = query($dbh, $sql);
234
-$result->no_fetch_filters(['key1']);
235
-$rows = $result->fetch_hash_all;
236
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test hash no filter keys");
237
-
238
-
239
-test 'finish';
240
-$result = query($dbh, $sql);
241
-$result->fetch;
242
-$result->finish;
243
-ok(!$result->fetch, $test);
244
-
245
-test 'error'; # Cannot real test
246
-$result = query($dbh, $sql);
247
-$sth = $result->sth;
248
-
249
-@error = $result->error;
250
-is(scalar @error, 3, "$test list context count");
251
-is($error[0], $sth->errstr, "$test list context errstr");
252
-is($error[1], $sth->err, "$test list context err");
253
-is($error[2], $sth->state, "$test list context state");
254
-
255
-$error = $result->error;
256
-is($error, $sth->errstr, "$test scalar context");
257
-
-236
DBIx-Custom-0.0501/t/dbi-custom-sql-template.t
... ...
@@ -1,236 +0,0 @@
1
-use strict;
2
-use warnings;
3
-
4
-use Test::More 'no_plan';
5
-
6
-use DBIx::Custom::SQL::Template;
7
-
8
-# Function for test name
9
-my $test;
10
-sub test{
11
-    $test = shift;
12
-}
13
-
14
-# Variable for test
15
-my $datas;
16
-my $sql_tmpl;
17
-my $query;
18
-my $ret_val;
19
-my $clone;
20
-
21
-test "Various template pattern";
22
-$datas = [
23
-    # Basic tests
24
-    {   name            => 'placeholder basic',
25
-        tmpl            => "a {?  k1} b {=  k2} {<> k3} {>  k4} {<  k5} {>= k6} {<= k7} {like k8}", ,
26
-        sql_expected    => "a ? b k2 = ? k3 <> ? k4 > ? k5 < ? k6 >= ? k7 <= ? k8 like ?;",
27
-        key_infos_expected   => [
28
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1']]},
29
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['k2']]},
30
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['k3']]},
31
-            {original_key => 'k4', table => '', column => 'k4', access_keys => [['k4']]},
32
-            {original_key => 'k5', table => '', column => 'k5', access_keys => [['k5']]},
33
-            {original_key => 'k6', table => '', column => 'k6', access_keys => [['k6']]},
34
-            {original_key => 'k7', table => '', column => 'k7', access_keys => [['k7']]},
35
-            {original_key => 'k8', table => '', column => 'k8', access_keys => [['k8']]},
36
-        ],
37
-    },
38
-    {
39
-        name            => 'placeholder in',
40
-        tmpl            => "{in k1 3};",
41
-        sql_expected    => "k1 in (?, ?, ?);",
42
-        key_infos_expected   => [
43
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [0]]]},
44
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [1]]]},
45
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [2]]]},
46
-        ],
47
-    },
48
-    {
49
-        name            => 'insert',
50
-        tmpl            => "{insert k1 k2 k3}",
51
-        sql_expected    => "(k1, k2, k3) values (?, ?, ?);",
52
-        key_infos_expected   => [
53
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['#insert', 'k1'], ['k1']]},
54
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['#insert', 'k2'], ['k2']]},
55
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['#insert', 'k3'], ['k3']]},
56
-        ],
57
-    },
58
-    {
59
-        name            => 'update',
60
-        tmpl            => "{update k1 k2 k3}",
61
-        sql_expected    => "set k1 = ?, k2 = ?, k3 = ?;",
62
-        key_infos_expected   => [
63
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['#update', 'k1'], ['k1']]},
64
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['#update', 'k2'], ['k2']]},
65
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['#update', 'k3'], ['k3']]},
66
-        ],
67
-    },
68
-    
69
-    # Table name
70
-    {
71
-        name            => 'placeholder with table name',
72
-        tmpl            => "{= a.k1} {= a.k2}",
73
-        sql_expected    => "a.k1 = ? a.k2 = ?;",
74
-        key_infos_expected  => [
75
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1'], ['a', 'k1']]},
76
-            {original_key => 'a.k2', table => 'a', column => 'k2', access_keys => [['a.k2'], ['a', 'k2']]},
77
-        ],
78
-    },
79
-    {   
80
-        name            => 'placeholder in with table name',
81
-        tmpl            => "{in a.k1 2} {in b.k2 2}",
82
-        sql_expected    => "a.k1 in (?, ?) b.k2 in (?, ?);",
83
-        key_infos_expected  => [
84
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1', [0]], ['a', 'k1', [0]]]},
85
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1', [1]], ['a', 'k1', [1]]]},
86
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['b.k2', [0]], ['b', 'k2', [0]]]},
87
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['b.k2', [1]], ['b', 'k2', [1]]]},
88
-        ],
89
-    },
90
-    {
91
-        name            => 'insert with table name',
92
-        tmpl            => "{insert a.k1 b.k2}",
93
-        sql_expected    => "(k1, k2) values (?, ?);",
94
-        key_infos_expected  => [
95
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['#insert', 'a.k1'], ['#insert', 'a', 'k1'], ['a.k1'], ['a', 'k1']]},
96
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['#insert', 'b.k2'], ['#insert', 'b', 'k2'], ['b.k2'], ['b', 'k2']]},
97
-        ],
98
-    },
99
-    {
100
-        name            => 'update with table name',
101
-        tmpl            => "{update a.k1 b.k2}",
102
-        sql_expected    => "set k1 = ?, k2 = ?;",
103
-        key_infos_expected  => [
104
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['#update', 'a.k1'], ['#update', 'a', 'k1'], ['a.k1'], ['a', 'k1']]},
105
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['#update', 'b.k2'], ['#update', 'b', 'k2'], ['b.k2'], ['b', 'k2']]},
106
-        ],
107
-    },
108
-    {
109
-        name            => 'not contain tag',
110
-        tmpl            => "aaa",
111
-        sql_expected    => "aaa;",
112
-        key_infos_expected  => [],
113
-    }
114
-];
115
-
116
-for (my $i = 0; $i < @$datas; $i++) {
117
-    my $data = $datas->[$i];
118
-    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
119
-    my $query = $sql_tmpl->create_query($data->{tmpl});
120
-    is($query->{sql}, $data->{sql_expected}, "$test : $data->{name} : sql");
121
-    is_deeply($query->{key_infos}, $data->{key_infos_expected}, "$test : $data->{name} : key_infos");
122
-}
123
-
124
-
125
-test 'Original tag processor';
126
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
127
-
128
-$ret_val = $sql_tmpl->add_tag_processor(
129
-    p => sub {
130
-        my ($tag_name, $args) = @_;
131
-        
132
-        my $expand    = "$tag_name ? $args->[0] $args->[1]";
133
-        my $key_infos = [2];
134
-        return ($expand, $key_infos);
135
-    }
136
-);
137
-
138
-$query = $sql_tmpl->create_query("{p a b}");
139
-is($query->{sql}, "p ? a b;", "$test : add_tag_processor sql");
140
-is_deeply($query->{key_infos}, [2], "$test : add_tag_processor key_infos");
141
-isa_ok($ret_val, 'DBIx::Custom::SQL::Template');
142
-
143
-
144
-test "Tag processor error case";
145
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
146
-
147
-
148
-eval{$sql_tmpl->create_query("{a }")};
149
-like($@, qr/Tag '{a }' in SQL template is not exist/, "$test : tag_processor not exist");
150
-
151
-$sql_tmpl->add_tag_processor({
152
-    q => 'string'
153
-});
154
-
155
-eval{$sql_tmpl->create_query("{q}", {})};
156
-like($@, qr/Tag processor 'q' must be code reference/, "$test : tag_processor not code ref");
157
-
158
-$sql_tmpl->add_tag_processor({
159
-   r => sub {} 
160
-});
161
-
162
-eval{$sql_tmpl->create_query("{r}")};
163
-like($@, qr/\QTag processor 'r' must return (\E\$expand\Q, \E\$key_infos\Q)/, "$test : tag processor return noting");
164
-
165
-$sql_tmpl->add_tag_processor({
166
-   s => sub { return ("a", "")} 
167
-});
168
-
169
-eval{$sql_tmpl->create_query("{s}")};
170
-like($@, qr/\QTag processor 's' must return (\E\$expand\Q, \E\$key_infos\Q)/, "$test : tag processor return not array key_infos");
171
-
172
-$sql_tmpl->add_tag_processor(
173
-    t => sub {return ("a", [])}
174
-);
175
-
176
-eval{$sql_tmpl->create_query("{t ???}")};
177
-like($@, qr/Tag '{t }' arguments cannot contain '?'/, "$test : cannot contain '?' in tag argument");
178
-
179
-
180
-test 'General error case';
181
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
182
-$sql_tmpl->add_tag_processor(
183
-    a => sub {
184
-        return ("? ? ?", [[],[]]);
185
-    }
186
-);
187
-eval{$sql_tmpl->create_query("{a}")};
188
-like($@, qr/Placeholder count in SQL created by tag processor 'a' must be same as key informations count/, "$test placeholder count is invalid");
189
-
190
-
191
-test 'Default tag processor Error case';
192
-eval{$sql_tmpl->create_query("{= }")};
193
-like($@, qr/You must be pass key as argument to tag '{= }'/, "$test : basic '=' : key not exist");
194
-
195
-eval{$sql_tmpl->create_query("{in }")};
196
-like($@, qr/You must be pass key as first argument of tag '{in }'/, "$test : in : key not exist");
197
-
198
-eval{$sql_tmpl->create_query("{in a}")};
199
-like($@, qr/\QYou must be pass placeholder count as second argument of tag '{in }'\E\n\QUsage: {in \E\$key\Q \E\$placeholder_count\Q}/,
200
-     "$test : in : key not exist");
201
-
202
-eval{$sql_tmpl->create_query("{in a r}")};
203
-like($@, qr/\QYou must be pass placeholder count as second argument of tag '{in }'\E\n\QUsage: {in \E\$key\Q \E\$placeholder_count\Q}/,
204
-     "$test : in : key not exist");
205
-
206
-
207
-test 'Clone';
208
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
209
-$sql_tmpl
210
-  ->tag_start('[')
211
-  ->tag_end(']')
212
-  ->tag_syntax('syntax')
213
-  ->tag_processors({a => 1, b => 2});
214
-
215
-$clone = $sql_tmpl->clone;
216
-is($clone->tag_start, $sql_tmpl->tag_start, "$test : tag_start");
217
-is($clone->tag_end, $sql_tmpl->tag_end, "$test : tag_end");
218
-is($clone->tag_syntax, $sql_tmpl->tag_syntax, "$test : tag_syntax");
219
-
220
-is_deeply( scalar $clone->tag_processors, scalar $sql_tmpl->tag_processors,
221
-          "$test : tag_processors deep clone");
222
-
223
-isnt($clone->tag_processors, $sql_tmpl->tag_processors, 
224
-     "$test : tag_processors reference not copy");
225
-
226
-$sql_tmpl->tag_processors(undef);
227
-
228
-$clone = $sql_tmpl->clone;
229
-is_deeply(scalar $clone->tag_processors, {}, "$test tag_processor undef copy");
230
-
231
-
232
-
233
-__END__
234
-
235
-
236
-
-85
DBIx-Custom-0.0501/t/dbi-custom-sqlite-timeformat.t
... ...
@@ -1,85 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    eval { Time::Piece->VERSION >= 1.15 }
10
-        or plan skip_all => 'Time::Piece >= 1.15 requred';
11
-        
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom');
14
-}
15
-
16
-# Function for test name
17
-my $test;
18
-sub test {
19
-    $test = shift;
20
-}
21
-
22
-# Varialbe for tests
23
-
24
-my $format;
25
-my $data;
26
-my $timepiece;
27
-my $dbi;
28
-
29
-use DBIx::Custom::SQLite;
30
-
31
-
32
-test 'SQL99 format';
33
-$dbi = DBIx::Custom::SQLite->new;
34
-$data   = '2009-01-02 03:04:05';
35
-$format = $dbi->formats->{'SQL99_datetime'};
36
-$timepiece = Time::Piece->strptime($data, $format);
37
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
38
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
39
-
40
-$data   = '2009-01-02';
41
-$format = $dbi->formats->{'SQL99_date'};
42
-$timepiece = Time::Piece->strptime($data, $format);
43
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
44
-
45
-$data   = '03:04:05';
46
-$format = $dbi->formats->{'SQL99_time'};
47
-$timepiece = Time::Piece->strptime($data, $format);
48
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
49
-
50
-
51
-test 'ISO-8601 format';
52
-$data   = '2009-01-02T03:04:05';
53
-$format = $dbi->formats->{'ISO-8601_datetime'};
54
-$timepiece = Time::Piece->strptime($data, $format);
55
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
56
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
57
-
58
-$data   = '2009-01-02';
59
-$format = $dbi->formats->{'ISO-8601_date'};
60
-$timepiece = Time::Piece->strptime($data, $format);
61
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
62
-
63
-$data   = '03:04:05';
64
-$format = $dbi->formats->{'ISO-8601_time'};
65
-$timepiece = Time::Piece->strptime($data, $format);
66
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
67
-
68
-
69
-test 'default format';
70
-$data   = '2009-01-02 03:04:05';
71
-$format = $dbi->formats->{'datetime'};
72
-$timepiece = Time::Piece->strptime($data, $format);
73
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
74
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
75
-
76
-$data   = '2009-01-02';
77
-$format = $dbi->formats->{'date'};
78
-$timepiece = Time::Piece->strptime($data, $format);
79
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
80
-
81
-$data   = '03:04:05';
82
-$format = $dbi->formats->{'time'};
83
-$timepiece = Time::Piece->strptime($data, $format);
84
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
85
-
-69
DBIx-Custom-0.0501/t/dbi-custom-sqlite.t
... ...
@@ -1,69 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-use utf8;
5
-
6
-BEGIN {
7
-    eval { require DBD::SQLite; 1 }
8
-        or plan skip_all => 'DBD::SQLite required';
9
-    eval { DBD::SQLite->VERSION >= 1.25 }
10
-        or plan skip_all => 'DBD::SQLite >= 1.25 required';
11
-
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom::SQLite');
14
-}
15
-
16
-# Function for test name
17
-my $test;
18
-sub test {
19
-    $test = shift;
20
-}
21
-
22
-# Constant varialbes for test
23
-my $CREATE_TABLE = {
24
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
25
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
26
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
27
-};
28
-
29
-
30
-# Variables for tests
31
-my $dbi;
32
-my $ret_val;
33
-my $rows;
34
-my $db_file;
35
-
36
-test 'connect_memory';
37
-$dbi = DBIx::Custom::SQLite->new;
38
-$dbi->connect_memory;
39
-$ret_val = $dbi->do($CREATE_TABLE->{0});
40
-ok(defined $ret_val, $test);
41
-$dbi->utf8_filter_on;
42
-$dbi->insert('table1', {key1 => 'あ', key2 => 2});
43
-$rows = $dbi->select('table1', {key1 => 'あ'})->fetch_hash_all;
44
-is_deeply($rows, [{key1 => 'あ', key2 => 2}], "$test : select rows");
45
-
46
-test 'connect_memory error';
47
-eval{$dbi->connect_memory};
48
-like($@, qr/Already connected/, "$test : already connected");
49
-
50
-test 'reconnect_memory';
51
-$dbi = DBIx::Custom::SQLite->new;
52
-$dbi->reconnect_memory;
53
-$ret_val = $dbi->do($CREATE_TABLE->{0});
54
-ok(defined $ret_val, "$test : connect first");
55
-$dbi->reconnect_memory;
56
-$ret_val = $dbi->do($CREATE_TABLE->{2});
57
-ok(defined $ret_val, "$test : connect first");
58
-
59
-test 'connect';
60
-$db_file  = 't/test.db';
61
-unlink $db_file if -f $db_file;
62
-$dbi = DBIx::Custom::SQLite->new(database => $db_file);
63
-$dbi->connect;
64
-ok(-f $db_file, "$test : database file");
65
-$ret_val = $dbi->do($CREATE_TABLE->{0});
66
-ok(defined $ret_val, "$test : database");
67
-$dbi->disconnect;
68
-unlink $db_file if -f $db_file;
69
-
-67
DBIx-Custom-0.0501/t/dib-custom-basic-timeformat.t
... ...
@@ -1,67 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    eval { Time::Piece->VERSION >= 1.15 }
10
-        or plan skip_all => 'Time::Piece >= 1.15 requred';
11
-        
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom');
14
-}
15
-
16
-# Function for test name
17
-my $test;
18
-sub test {
19
-    $test = shift;
20
-}
21
-
22
-# Varialbe for tests
23
-
24
-my $format;
25
-my $data;
26
-my $timepiece;
27
-my $dbi;
28
-
29
-use DBIx::Custom::Basic;
30
-
31
-
32
-test 'SQL99 format';
33
-$dbi = DBIx::Custom::Basic->new;
34
-$data   = '2009-01-02 03:04:05';
35
-$format = $dbi->formats->{'SQL99_datetime'};
36
-$timepiece = Time::Piece->strptime($data, $format);
37
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
38
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
39
-
40
-$data   = '2009-01-02';
41
-$format = $dbi->formats->{'SQL99_date'};
42
-$timepiece = Time::Piece->strptime($data, $format);
43
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
44
-
45
-$data   = '03:04:05';
46
-$format = $dbi->formats->{'SQL99_time'};
47
-$timepiece = Time::Piece->strptime($data, $format);
48
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
49
-
50
-
51
-test 'ISO-8601 format';
52
-$data   = '2009-01-02T03:04:05';
53
-$format = $dbi->formats->{'ISO-8601_datetime'};
54
-$timepiece = Time::Piece->strptime($data, $format);
55
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
56
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
57
-
58
-$data   = '2009-01-02';
59
-$format = $dbi->formats->{'ISO-8601_date'};
60
-$timepiece = Time::Piece->strptime($data, $format);
61
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
62
-
63
-$data   = '03:04:05';
64
-$format = $dbi->formats->{'ISO-8601_time'};
65
-$timepiece = Time::Piece->strptime($data, $format);
66
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
67
-
-18
DBIx-Custom-0.0501/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-0.0501/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-11
DBIx-Custom-Basic/.gitignore
... ...
@@ -1,11 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
11
-*.tmp
-24
DBIx-Custom-Basic/Build.PL
... ...
@@ -1,24 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::Basic',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/Basic.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    requires => {
14
-        'Encode'       => 0,
15
-        'DBIx::Custom' => 0.0101
16
-    },
17
-    recommends => {
18
-        'Time::Piece' => 1.15
19
-    },
20
-    add_to_cleanup      => [ 'DBIx-Custom-Basic-*' ],
21
-    create_makefile_pl => 'traditional',
22
-);
23
-
24
-$builder->create_build_script();
-8
DBIx-Custom-Basic/Changes
... ...
@@ -1,8 +0,0 @@
1
-0.0201
2
-  delete default_bind_filter
3
-  delete default_fetch_filter
4
-  add filter encode_utf8
5
-  add filter decode_utf8
6
-  add method utf8_filter_on
7
-0.0101
8
-  First release
-15
DBIx-Custom-Basic/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom-Basic/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom-Basic
2
-
3
-DBIx::Custom basic implementation
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom::Basic
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-119
DBIx-Custom-Basic/lib/DBIx/Custom/Basic.pm
... ...
@@ -1,119 +0,0 @@
1
-package DBIx::Custom::Basic;
2
-use 5.008001;
3
-use base 'DBIx::Custom';
4
-use Encode qw/decode encode/;
5
-
6
-use warnings;
7
-use strict;
8
-
9
-our $VERSION = '0.0201';
10
-
11
-my $class = __PACKAGE__;
12
-
13
-$class->add_filter(
14
-    encode_utf8 => sub {
15
-        my $value = shift;
16
-        utf8::upgrade($value) unless Encode::is_utf8($value);
17
-        return encode('UTF-8', $value);
18
-    },
19
-    decode_utf8 => sub { decode('UTF-8', shift) }
20
-);
21
-
22
-$class->add_format(
23
-    'SQL99_date'        => '%Y-%m-%d',
24
-    'SQL99_datetime'    => '%Y-%m-%d %H:%M:%S',
25
-    'SQL99_time'        => '%H:%M:%S',
26
-    'ISO-8601_date'     => '%Y-%m-%d',
27
-    'ISO-8601_datetime' => '%Y-%m-%dT%H:%M:%S',
28
-    'ISO-8601_time'     => '%H:%M:%S',
29
-);
30
-
31
-# Methods
32
-sub utf8_filter_on {
33
-    my $self = shift;
34
-    $self->bind_filter($self->filters->{encode_utf8});
35
-    $self->fetch_filter($self->filters->{decode_utf8});
36
-}
37
-
38
-1;
39
-
40
-=head1 NAME
41
-
42
-DBIx::Custom::Basic - DBIx::Custom basic implementation
43
-
44
-=head1 Version
45
-
46
-Version 0.0201
47
-
48
-=head1 See DBIx::Custom documentation
49
-
50
-This class is L<DBIx::Custom> subclass.
51
-
52
-You can use all methods of L<DBIx::Custom>
53
-
54
-Please see L<DBIx::Custom> documentation
55
-
56
-=head1 Filters
57
-
58
-=head2 encode_utf8
59
-
60
-    # Encode to UTF-8 byte stream (utf8::upgrade is done if need)
61
-    $dbi->filters->{encode_utf8}->($value);
62
-    
63
-This filter is generally used as bind filter
64
-
65
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
66
-
67
-=head2 decode_utf8
68
-
69
-    # Decode to perl internal string
70
-    $dbi->filters->{decode_utf8}->($value);
71
-    
72
-This filter is generally used as fetch filter
73
-
74
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
75
-
76
-=head2 Formats
77
-    
78
-strptime formats is available
79
-    
80
-    # format name        format
81
-    'SQL99_date'         '%Y-%m-%d',
82
-    'SQL99_datetime'     '%Y-%m-%d %H:%M:%S',
83
-    'SQL99_time'         '%H:%M:%S',
84
-    'ISO-8601_date'      '%Y-%m-%d',
85
-    'ISO-8601_datetime'  '%Y-%m-%dT%H:%M:%S',
86
-    'ISO-8601_time'      '%H:%M:%S',
87
-
88
-You get format as the following
89
-
90
-    my $format = $dbi->formats->{$format_name};
91
-
92
-=head1 Methods
93
-
94
-=head2 utf8_filter_on
95
-
96
-    # Encode and decode utf8 filter on
97
-    $dbi->utf8_filter_on;
98
-
99
-This equel to
100
-
101
-    $dbi->bind_filter($dbi->filters->{encode_utf8});
102
-    $dbi->fetch_filter($dbi->filters->{decode_utf8});
103
-
104
-=head1 AUTHOR
105
-
106
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
107
-
108
-Github L<http://github.com/yuki-kimoto>
109
-
110
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
111
-
112
-=head1 COPYRIGHT & LICENSE
113
-
114
-Copyright 2009 Yuki Kimoto, all rights reserved.
115
-
116
-This program is free software; you can redistribute it and/or modify it
117
-under the same terms as Perl itself.
118
-
119
-=cut
-9
DBIx-Custom-Basic/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::Basic' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::Basic $DBIx::Custom::Basic::VERSION, Perl $], $^X" );
-67
DBIx-Custom-Basic/t/01-sqlite.t
... ...
@@ -1,67 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-use utf8;
5
-use Encode qw/decode encode/;
6
-
7
-BEGIN {
8
-    eval { require DBD::SQLite; 1 }
9
-        or plan skip_all => 'DBD::SQLite required';
10
-    eval { DBD::SQLite->VERSION >= 1 }
11
-        or plan skip_all => 'DBD::SQLite >= 1.00 required';
12
-
13
-    plan 'no_plan';
14
-    use_ok('DBIx::Custom');
15
-}
16
-
17
-# Function for test name
18
-my $test;
19
-sub test {
20
-    $test = shift;
21
-}
22
-
23
-# Constant varialbes for test
24
-my $CREATE_TABLE = {
25
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
26
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
27
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
28
-};
29
-
30
-my $SELECT_TMPL = {
31
-    0 => 'select * from table1;'
32
-};
33
-
34
-my $DROP_TABLE = {
35
-    0 => 'drop table table1'
36
-};
37
-
38
-my $NEW_ARGS = {
39
-    0 => {data_source => 'dbi:SQLite:dbname=:memory:'}
40
-};
41
-
42
-# Variables for test
43
-my $dbi;
44
-my $decoded_str;
45
-my $encoded_str;
46
-my $array;
47
-
48
-use DBIx::Custom::Basic;
49
-
50
-test 'Filter';
51
-$dbi = DBIx::Custom::Basic->new($NEW_ARGS->{0});
52
-ok($dbi->filters->{encode_utf8}, "$test : exists default_bind_filter");
53
-ok($dbi->filters->{decode_utf8}, "$test : exists default_fetch_filter");
54
-
55
-$dbi->utf8_filter_on;
56
-is($dbi->bind_filter, $dbi->filters->{encode_utf8}, 'default bind filter');
57
-is($dbi->fetch_filter, $dbi->filters->{decode_utf8}, 'default fetch filter');
58
-
59
-$decoded_str = 'あ';
60
-$encoded_str = $dbi->bind_filter->($decoded_str);
61
-is($encoded_str, encode('UTF-8', $decoded_str), "$test : encode utf8");
62
-is($decoded_str, $dbi->fetch_filter->($encoded_str), "$test : fetch_filter");
63
-
64
-$decoded_str = 'a';
65
-$encoded_str = $dbi->bind_filter->($decoded_str);
66
-is($encoded_str, encode('UTF-8', $decoded_str), "$test : upgrade and encode utf8");
67
-is($decoded_str, $dbi->fetch_filter->($encoded_str), "$test : fetch_filter");
-64
DBIx-Custom-Basic/t/02-time_format.t
... ...
@@ -1,64 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    plan 'no_plan';
10
-    use_ok('DBIx::Custom');
11
-}
12
-
13
-# Function for test name
14
-my $test;
15
-sub test {
16
-    $test = shift;
17
-}
18
-
19
-# Varialbe for tests
20
-
21
-my $format;
22
-my $data;
23
-my $timepiece;
24
-my $dbi;
25
-
26
-use DBIx::Custom::Basic;
27
-
28
-
29
-test 'SQL99 format';
30
-$dbi = DBIx::Custom::Basic->new;
31
-$data   = '2009-01-02 03:04:05';
32
-$format = $dbi->formats->{'SQL99_datetime'};
33
-$timepiece = Time::Piece->strptime($data, $format);
34
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
35
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
36
-
37
-$data   = '2009-01-02';
38
-$format = $dbi->formats->{'SQL99_date'};
39
-$timepiece = Time::Piece->strptime($data, $format);
40
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
41
-
42
-$data   = '03:04:05';
43
-$format = $dbi->formats->{'SQL99_time'};
44
-$timepiece = Time::Piece->strptime($data, $format);
45
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
46
-
47
-
48
-test 'ISO-8601 format';
49
-$data   = '2009-01-02T03:04:05';
50
-$format = $dbi->formats->{'ISO-8601_datetime'};
51
-$timepiece = Time::Piece->strptime($data, $format);
52
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
53
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
54
-
55
-$data   = '2009-01-02';
56
-$format = $dbi->formats->{'ISO-8601_date'};
57
-$timepiece = Time::Piece->strptime($data, $format);
58
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
59
-
60
-$data   = '03:04:05';
61
-$format = $dbi->formats->{'ISO-8601_time'};
62
-$timepiece = Time::Piece->strptime($data, $format);
63
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
64
-
-49
DBIx-Custom-Basic/t/boilerplate.t
... ...
@@ -1,49 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-  not_in_file_ok(README =>
40
-    "The README is used..."       => qr/The README is used/,
41
-    "'version information here'"  => qr/to provide version information/,
42
-  );
43
-
44
-  not_in_file_ok(Changes =>
45
-    "placeholder date/time"       => qr(Date/time)
46
-  );
47
-
48
-  module_boilerplate_ok('lib/DBIx/Custom/Basic.pm');
49
-
-18
DBIx-Custom-Basic/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-Basic/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-11
DBIx-Custom-MySQL/.gitignore
... ...
@@ -1,11 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
11
-*.tmp
-21
DBIx-Custom-MySQL/Build.PL
... ...
@@ -1,21 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::MySQL',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/MySQL.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    requires => {
14
-        'DBIx::Custom::Basic' => 0.0101,
15
-        'DBD::mysql' => 4.010
16
-    },
17
-    add_to_cleanup      => [ 'DBIx-Custom-MySQL-*' ],
18
-    create_makefile_pl => 'traditional',
19
-);
20
-
21
-$builder->create_build_script();
-4
DBIx-Custom-MySQL/Changes
... ...
@@ -1,4 +0,0 @@
1
-0.0102
2
-  Update document
3
-0.0101
4
-  First release
-15
DBIx-Custom-MySQL/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom-MySQL/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom-MySQL
2
-
3
-DBIx::Custom MySQL implementation
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom::MySQL
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-9
DBIx-Custom-MySQL/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::MySQL' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::MySQL $DBIx::Custom::MySQL::VERSION, Perl $], $^X" );
-82
DBIx-Custom-MySQL/t/02-time_format.t
... ...
@@ -1,82 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    plan 'no_plan';
10
-    use_ok('DBIx::Custom');
11
-}
12
-
13
-# Function for test name
14
-my $test;
15
-sub test {
16
-    $test = shift;
17
-}
18
-
19
-# Varialbe for tests
20
-
21
-my $format;
22
-my $data;
23
-my $timepiece;
24
-my $dbi;
25
-
26
-use DBIx::Custom::MySQL;
27
-
28
-
29
-test 'SQL99 format';
30
-$dbi = DBIx::Custom::MySQL->new;
31
-$data   = '2009-01-02 03:04:05';
32
-$format = $dbi->formats->{'SQL99_datetime'};
33
-$timepiece = Time::Piece->strptime($data, $format);
34
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
35
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
36
-
37
-$data   = '2009-01-02';
38
-$format = $dbi->formats->{'SQL99_date'};
39
-$timepiece = Time::Piece->strptime($data, $format);
40
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
41
-
42
-$data   = '03:04:05';
43
-$format = $dbi->formats->{'SQL99_time'};
44
-$timepiece = Time::Piece->strptime($data, $format);
45
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
46
-
47
-
48
-test 'ISO-8601 format';
49
-$data   = '2009-01-02T03:04:05';
50
-$format = $dbi->formats->{'ISO-8601_datetime'};
51
-$timepiece = Time::Piece->strptime($data, $format);
52
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
53
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
54
-
55
-$data   = '2009-01-02';
56
-$format = $dbi->formats->{'ISO-8601_date'};
57
-$timepiece = Time::Piece->strptime($data, $format);
58
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
59
-
60
-$data   = '03:04:05';
61
-$format = $dbi->formats->{'ISO-8601_time'};
62
-$timepiece = Time::Piece->strptime($data, $format);
63
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
64
-
65
-
66
-test 'default format';
67
-$data   = '2009-01-02 03:04:05';
68
-$format = $dbi->formats->{'datetime'};
69
-$timepiece = Time::Piece->strptime($data, $format);
70
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
71
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
72
-
73
-$data   = '2009-01-02';
74
-$format = $dbi->formats->{'date'};
75
-$timepiece = Time::Piece->strptime($data, $format);
76
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
77
-
78
-$data   = '03:04:05';
79
-$format = $dbi->formats->{'time'};
80
-$timepiece = Time::Piece->strptime($data, $format);
81
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
82
-
-47
DBIx-Custom-MySQL/t/101-mysql_private.t
... ...
@@ -1,47 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-# user password database
6
-our ($USER, $PASSWORD, $DATABASE) = connect_info();
7
-
8
-plan skip_all => 'private MySQL test' unless $USER;
9
-
10
-plan 'no_plan';
11
-
12
-# Function for test name
13
-my $test;
14
-sub test {
15
-    $test = shift;
16
-}
17
-
18
-
19
-# Functions for tests
20
-sub connect_info {
21
-    my $file = 'password.tmp';
22
-    open my $fh, '<', $file
23
-      or return;
24
-    
25
-    my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);
26
-    
27
-    close $fh;
28
-    
29
-    return ($user, $password, $database);
30
-}
31
-
32
-
33
-# Constat variables for tests
34
-my $CLASS = 'DBIx::Custom::MySQL';
35
-
36
-# Varialbes for tests
37
-my $dbi;
38
-
39
-use DBIx::Custom::MySQL;
40
-
41
-test 'connect';
42
-$dbi = $CLASS->new(user => $USER, password => $PASSWORD,
43
-                    database => $DATABASE);
44
-$dbi->connect;
45
-is(ref $dbi->dbh, 'DBI::db', $test);
46
-
47
-
-51
DBIx-Custom-MySQL/t/boilerplate.t
... ...
@@ -1,51 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-
40
-  not_in_file_ok(README =>
41
-    "The README is used..."       => qr/The README is used/,
42
-    "'version information here'"  => qr/to provide version information/,
43
-  );
44
-
45
-  not_in_file_ok(Changes =>
46
-    "placeholder date/time"       => qr(Date/time)
47
-  );
48
-
49
-  module_boilerplate_ok('lib/DBIx/Custom/MySQL.pm');
50
-
51
-
-18
DBIx-Custom-MySQL/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-MySQL/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-11
DBIx-Custom-Query/.gitignore
... ...
@@ -1,11 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
11
-*.tmp
-20
DBIx-Custom-Query/Build.PL
... ...
@@ -1,20 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::Query',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/Query.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    requires => {
14
-        'Object::Simple' => 2.0702,
15
-    },
16
-    add_to_cleanup      => [ 'DBIx-Custom-Query-*' ],
17
-    create_makefile_pl => 'traditional',
18
-);
19
-
20
-$builder->create_build_script();
-2
DBIx-Custom-Query/Changes
... ...
@@ -1,2 +0,0 @@
1
-0.0101
2
-  First release
-15
DBIx-Custom-Query/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-14
DBIx-Custom-Query/README
... ...
@@ -1,14 +0,0 @@
1
-DBIx-Custom-Query
2
-
3
-Query object for DBIx::Custom
4
-
5
-INSTLLATION
6
-
7
-cpan DBIx::Custom::Query
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
-103
DBIx-Custom-Query/lib/DBIx/Custom/Query.pm
... ...
@@ -1,103 +0,0 @@
1
-package DBIx::Custom::Query;
2
-use Object::Simple;
3
-
4
-our $VERSION = '0.0101';
5
-
6
-sub sql             : Attr {}
7
-sub key_infos       : Attr {}
8
-sub bind_filter     : Attr {}
9
-sub fetch_filter     : Attr {}
10
-sub sth             : Attr {}
11
-
12
-sub no_bind_filters      : Attr { type => 'array', trigger => sub {
13
-    my $self = shift;
14
-    my $no_bind_filters = $self->no_bind_filters || [];
15
-    my %no_bind_filters_map = map {$_ => 1} @{$no_bind_filters};
16
-    $self->_no_bind_filters_map(\%no_bind_filters_map);
17
-}}
18
-sub _no_bind_filters_map : Attr {default => sub { {} }}
19
-
20
-sub no_fetch_filters     : Attr { type => 'array', default => sub { [] } }
21
-
22
-Object::Simple->build_class;
23
-
24
-=head1 NAME
25
-
26
-DBIx::Custom::Query - Query object for DBIx::Custom
27
-
28
-=head1 VERSION
29
-
30
-Version 0.0101
31
-
32
-=head1 SYNOPSIS
33
-
34
-    # Create query
35
-    my $dbi = DBIx::Custom->new;
36
-    my $query = $dbi->create_query($template);
37
-    
38
-    # Set query attributes
39
-    $query->bind_filter($dbi->filters->{default_bind_filter});
40
-    $query->no_bind_filters('title', 'author');
41
-    
42
-    $query->fetch_filter($dbi->filters->{default_fetch_filter});
43
-    $query->no_fetch_filters('title', 'author');
44
-    
45
-    # Execute query
46
-    $dbi->execute($query, $params);
47
-
48
-=head1 OBJECT ACCESSORS
49
-
50
-=head2 sth
51
-
52
-    # Set and get statement handle
53
-    $self = $query->sth($sql);
54
-    $sth  = $query->sth;
55
-
56
-=head2 sql
57
-
58
-    # Set and get SQL
59
-    $self = $query->sql($sql);
60
-    $sql  = $query->sql;
61
-
62
-=head2 bind_filter
63
-
64
-    # Set and get bind filter
65
-    $self        = $query->bind_filter($bind_filter);
66
-    $bind_filter = $query->bind_filter;
67
-
68
-=head2 no_bind_filters
69
-
70
-    # Set and get keys of no filtering
71
-    $self            = $query->no_bind_filters($no_filters);
72
-    $no_bind_filters = $query->no_bind_filters;
73
-
74
-=head2 fetch_filter
75
-
76
-    # Set and get fetch filter
77
-    $self        = $query->fetch_filter($fetch_filter);
78
-    $fetch_filter = $query->fetch_filter;
79
-
80
-=head2 no_fetch_filters
81
-
82
-    # Set and get keys of no filtering
83
-    $self            = $query->no_fetch_filters($no_filters);
84
-    $no_fetch_filters = $query->no_fetch_filters;
85
-
86
-=head2 key_infos
87
-
88
-    # Set and get key informations
89
-    $self      = $query->key_infos($key_infos);
90
-    $key_infos = $query->key_infos;
91
-
92
-=head1 AUTHOR
93
-
94
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
95
-
96
-Github L<http://github.com/yuki-kimoto>
97
-
98
-=head1 COPYRIGHT & LICENSE
99
-
100
-Copyright 2009 Yuki Kimoto, all rights reserved.
101
-
102
-This program is free software; you can redistribute it and/or modify it
103
-under the same terms as Perl itself.
-9
DBIx-Custom-Query/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::Query' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::Query $DBIx::Custom::Query::VERSION, Perl $], $^X" );
-37
DBIx-Custom-Query/t/01-core.t
... ...
@@ -1,37 +0,0 @@
1
-use Test::More 'no_plan';
2
-
3
-use strict;
4
-use warnings;
5
-use DBIx::Custom::Query;
6
-
7
-# Function for test name
8
-my $test;
9
-sub test{
10
-    $test = shift;
11
-}
12
-
13
-# Variables for test
14
-my $query;
15
-
16
-test 'Accessors';
17
-$query = DBIx::Custom::Query->new(
18
-    sql              => 'a',
19
-    key_infos        => 'b',
20
-    bind_filter      => 'c',
21
-    no_bind_filters  => [qw/d e/],
22
-    sth              => 'e',
23
-    fetch_filter     => 'f',
24
-    no_fetch_filters => [qw/g h/],
25
-);
26
-
27
-is($query->sql, 'a', "$test : sql");
28
-is($query->key_infos, 'b', "$test : key_infos ");
29
-is($query->bind_filter, 'c', "$test : bind_filter");
30
-is_deeply(scalar $query->no_bind_filters, [qw/d e/], "$test : no_bind_filters");
31
-is_deeply(scalar $query->_no_bind_filters_map, {d => 1, e => 1}, "$test : _no_bind_filters_map");
32
-is_deeply(scalar $query->no_fetch_filters, [qw/g h/], "$test : no_fetch_filters");
33
-is($query->sth, 'e', "$test : sth");
34
-
35
-$query->no_bind_filters(undef);
36
-is_deeply(scalar $query->_no_bind_filters_map, {}, "$test _no_bind_filters_map undef value");
37
-
-51
DBIx-Custom-Query/t/boilerplate.t
... ...
@@ -1,51 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-
40
-  not_in_file_ok(README =>
41
-    "The README is used..."       => qr/The README is used/,
42
-    "'version information here'"  => qr/to provide version information/,
43
-  );
44
-
45
-  not_in_file_ok(Changes =>
46
-    "placeholder date/time"       => qr(Date/time)
47
-  );
48
-
49
-  module_boilerplate_ok('lib/DBIx/Custom/Query.pm');
50
-
51
-
-18
DBIx-Custom-Query/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-Query/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-10
DBIx-Custom-Result/.gitignore
... ...
@@ -1,10 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
-21
DBIx-Custom-Result/Build.PL
... ...
@@ -1,21 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::Result',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/Result.pm',
10
-    build_requires => {
11
-        'Test::More'  => 0,
12
-    },
13
-    requires => {
14
-        'Object::Simple' => 2.0702,
15
-        'DBI'            => 1.605,
16
-    },
17
-    add_to_cleanup      => [ 'DBIx-Custom-Result-*' ],
18
-    create_makefile_pl => 'traditional',
19
-);
20
-
21
-$builder->create_build_script();
-10
DBIx-Custom-Result/Changes
... ...
@@ -1,10 +0,0 @@
1
-0.0301
2
-  rename fetch_all_hash to fetch_hash_all (not backword compatible)
3
-  rename fetch_rows_hash to fetch_hash_rows (not backword compatible)
4
-  rename fetch_first_hash to fetch_hash_first (not backword compatible)
5
-0.0202
6
-  add build requires 'DBI'
7
-0.0201
8
-  Exchange filter argument 'key', 'value' (not backword compatible)
9
-0.0101
10
-  First release
-15
DBIx-Custom-Result/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom-Result/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom-Result
2
-
3
-Resultset for DBIx::Custom
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom::Result
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-386
DBIx-Custom-Result/lib/DBIx/Custom/Result.pm
... ...
@@ -1,386 +0,0 @@
1
-package DBIx::Custom::Result;
2
-use Object::Simple;
3
-use strict;
4
-use warnings;
5
-use Carp 'croak';
6
-
7
-our $VERSION = '0.0301';
8
-
9
-# Attributes
10
-sub sth              : Attr {}
11
-sub fetch_filter     : Attr {}
12
-sub no_fetch_filters      : Attr { type => 'array', trigger => sub {
13
-    my $self = shift;
14
-    my $no_fetch_filters = $self->no_fetch_filters || [];
15
-    my %no_fetch_filters_map = map {$_ => 1} @{$no_fetch_filters};
16
-    $self->_no_fetch_filters_map(\%no_fetch_filters_map);
17
-}}
18
-sub _no_fetch_filters_map : Attr {default => sub { {} }}
19
-
20
-# Fetch (array)
21
-sub fetch {
22
-    my ($self, $type) = @_;
23
-    my $sth = $self->sth;
24
-    my $fetch_filter = $self->fetch_filter;
25
-    
26
-    # Fetch
27
-    my $row = $sth->fetchrow_arrayref;
28
-    
29
-    # Cannot fetch
30
-    return unless $row;
31
-    
32
-    # Filter
33
-    if ($fetch_filter) {
34
-        my $keys  = $sth->{NAME_lc};
35
-        my $types = $sth->{TYPE};
36
-        for (my $i = 0; $i < @$keys; $i++) {
37
-            next if $self->_no_fetch_filters_map->{$keys->[$i]};
38
-            $row->[$i]= $fetch_filter->($row->[$i], $keys->[$i], $types->[$i],
39
-                                        $sth, $i);
40
-        }
41
-    }
42
-    return wantarray ? @$row : $row;
43
-}
44
-
45
-# Fetch (hash)
46
-sub fetch_hash {
47
-    my $self = shift;
48
-    my $sth = $self->sth;
49
-    my $fetch_filter = $self->fetch_filter;
50
-    
51
-    # Fetch
52
-    my $row = $sth->fetchrow_arrayref;
53
-    
54
-    # Cannot fetch
55
-    return unless $row;
56
-    
57
-    # Keys
58
-    my $keys  = $sth->{NAME_lc};
59
-    
60
-    # Filter
61
-    my $row_hash = {};
62
-    if ($fetch_filter) {
63
-        my $types = $sth->{TYPE};
64
-        for (my $i = 0; $i < @$keys; $i++) {
65
-            if ($self->_no_fetch_filters_map->{$keys->[$i]}) {
66
-                $row_hash->{$keys->[$i]} = $row->[$i];
67
-            }
68
-            else {
69
-                $row_hash->{$keys->[$i]}
70
-                  = $fetch_filter->($row->[$i], $keys->[$i],
71
-                                    $types->[$i], $sth, $i);
72
-            }
73
-        }
74
-    }
75
-    
76
-    # No filter
77
-    else {
78
-        for (my $i = 0; $i < @$keys; $i++) {
79
-            $row_hash->{$keys->[$i]} = $row->[$i];
80
-        }
81
-    }
82
-    return wantarray ? %$row_hash : $row_hash;
83
-}
84
-
85
-# Fetch only first (array)
86
-sub fetch_first {
87
-    my $self = shift;
88
-    
89
-    # Fetch
90
-    my $row = $self->fetch;
91
-    
92
-    # Not exist
93
-    return unless $row;
94
-    
95
-    # Finish statement handle
96
-    $self->finish;
97
-    
98
-    return wantarray ? @$row : $row;
99
-}
100
-
101
-# Fetch only first (hash)
102
-sub fetch_hash_first {
103
-    my $self = shift;
104
-    
105
-    # Fetch hash
106
-    my $row = $self->fetch_hash;
107
-    
108
-    # Not exist
109
-    return unless $row;
110
-    
111
-    # Finish statement handle
112
-    $self->finish;
113
-    
114
-    return wantarray ? %$row : $row;
115
-}
116
-
117
-# Fetch multi rows (array)
118
-sub fetch_rows {
119
-    my ($self, $count) = @_;
120
-    
121
-    # Not specified Row count
122
-    croak("Row count must be specified")
123
-      unless $count;
124
-    
125
-    # Fetch multi rows
126
-    my $rows = [];
127
-    for (my $i = 0; $i < $count; $i++) {
128
-        my @row = $self->fetch;
129
-        
130
-        last unless @row;
131
-        
132
-        push @$rows, \@row;
133
-    }
134
-    
135
-    return unless @$rows;
136
-    return wantarray ? @$rows : $rows;
137
-}
138
-
139
-# Fetch multi rows (hash)
140
-sub fetch_hash_rows {
141
-    my ($self, $count) = @_;
142
-    
143
-    # Not specified Row count
144
-    croak("Row count must be specified")
145
-      unless $count;
146
-    
147
-    # Fetch multi rows
148
-    my $rows = [];
149
-    for (my $i = 0; $i < $count; $i++) {
150
-        my %row = $self->fetch_hash;
151
-        
152
-        last unless %row;
153
-        
154
-        push @$rows, \%row;
155
-    }
156
-    
157
-    return unless @$rows;
158
-    return wantarray ? @$rows : $rows;
159
-}
160
-
161
-
162
-# Fetch all (array)
163
-sub fetch_all {
164
-    my $self = shift;
165
-    
166
-    my $rows = [];
167
-    while(my @row = $self->fetch) {
168
-        push @$rows, [@row];
169
-    }
170
-    return wantarray ? @$rows : $rows;
171
-}
172
-
173
-# Fetch all (hash)
174
-sub fetch_hash_all {
175
-    my $self = shift;
176
-    
177
-    my $rows = [];
178
-    while(my %row = $self->fetch_hash) {
179
-        push @$rows, {%row};
180
-    }
181
-    return wantarray ? @$rows : $rows;
182
-}
183
-
184
-# Finish
185
-sub finish { shift->sth->finish }
186
-
187
-# Error
188
-sub error { 
189
-    my $self = shift;
190
-    my $sth  = $self->sth;
191
-    return wantarray ? ($sth->errstr, $sth->err, $sth->state) : $sth->errstr;
192
-}
193
-
194
-Object::Simple->build_class;
195
-
196
-=head1 NAME
197
-
198
-DBIx::Custom::Result - Resultset for DBIx::Custom
199
-
200
-=head1 VERSION
201
-
202
-Version 0.0301
203
-
204
-=head1 SYNOPSIS
205
-
206
-    # $result is DBIx::Custom::Result object
207
-    my $dbi = DBIx::Custom->new;
208
-    my $result = $dbi->query($sql_template, $param);
209
-    
210
-    while (my ($val1, $val2) = $result->fetch) {
211
-        # do something
212
-    }
213
-
214
-=head1 OBJECT ACCESSORS
215
-
216
-=head2 sth
217
-
218
-    # Set and Get statement handle
219
-    $self = $result->sth($sth);
220
-    $sth  = $reuslt->sth
221
-
222
-Statement handle is automatically set by DBIx::Custom.
223
-so you do not set statement handle.
224
-
225
-If you need statement handle, you can get statement handle by using this method.
226
-
227
-=head2 fetch_filter
228
-
229
-    # Set and Get fetch filter
230
-    $self         = $result->fetch_filter($sth);
231
-    $fetch_filter = $result->fech_filter;
232
-
233
-Statement handle is automatically set by DBIx::Custom.
234
-If you want to set your fetch filter, you set it.
235
-
236
-=head2 no_fetch_filters
237
-
238
-    # Set and Get no filter keys when fetching
239
-    $self             = $result->no_fetch_filters($no_fetch_filters);
240
-    $no_fetch_filters = $result->no_fetch_filters;
241
-
242
-=head1 METHODS
243
-
244
-=head2 fetch
245
-
246
-    # Fetch row as array reference (Scalar context)
247
-    $row = $result->fetch;
248
-    
249
-    # Fetch row as array (List context)
250
-    @row = $result->fecth
251
-
252
-    # Sample
253
-    while (my $row = $result->fetch) {
254
-        # do something
255
-        my $val1 = $row->[0];
256
-        my $val2 = $row->[1];
257
-    }
258
-
259
-fetch method is fetch resultset and get row as array or array reference.
260
-
261
-=head2 fetch_hash
262
-
263
-    # Fetch row as hash reference (Scalar context)
264
-    $row = $result->fetch_hash;
265
-    
266
-    # Fetch row as hash (List context)
267
-    %row = $result->fecth_hash
268
-
269
-    # Sample
270
-    while (my $row = $result->fetch_hash) {
271
-        # do something
272
-        my $val1 = $row->{key1};
273
-        my $val2 = $row->{key2};
274
-    }
275
-
276
-fetch_hash method is fetch resultset and get row as hash or hash reference.
277
-
278
-=head2 fetch_first
279
-
280
-    # Fetch only first (Scalar context)
281
-    $row = $result->fetch_first;
282
-    
283
-    # Fetch only first (List context)
284
-    @row = $result->fetch_first;
285
-    
286
-This method fetch only first and finish statement handle
287
-
288
-=head2 fetch_hash_first
289
-    
290
-    # Fetch only first as hash (Scalar context)
291
-    $row = $result->fetch_hash_first;
292
-    
293
-    # Fetch only first as hash (Scalar context)
294
-    @row = $result->fetch_hash_first;
295
-    
296
-This method fetch only first and finish statement handle
297
-
298
-=head2 fetch_rows
299
-
300
-    # Fetch multi rows (Scalar context)
301
-    $rows = $result->fetch_rows($row_count);
302
-    
303
-    # Fetch multi rows (List context)
304
-    @rows = $result->fetch_rows($row_count);
305
-    
306
-    # Sapmle 
307
-    $rows = $result->fetch_rows(10);
308
-
309
-=head2 fetch_hash_rows
310
-
311
-    # Fetch multi rows as hash (Scalar context)
312
-    $rows = $result->fetch_hash_rows($row_count);
313
-    
314
-    # Fetch multi rows as hash (List context)
315
-    @rows = $result->fetch_hash_rows($row_count);
316
-    
317
-    # Sapmle 
318
-    $rows = $result->fetch_hash_rows(10);
319
-
320
-=head2 fetch_all
321
-
322
-    # Fetch all row as array ref of array ref (Scalar context)
323
-    $rows = $result->fetch_all;
324
-    
325
-    # Fetch all row as array of array ref (List context)
326
-    @rows = $result->fecth_all;
327
-
328
-    # Sample
329
-    my $rows = $result->fetch_all;
330
-    my $val0_0 = $rows->[0][0];
331
-    my $val1_1 = $rows->[1][1];
332
-
333
-fetch_all method is fetch resultset and get all rows as array or array reference.
334
-
335
-=head2 fetch_hash_all
336
-
337
-    # Fetch all row as array ref of hash ref (Scalar context)
338
-    $rows = $result->fetch_hash_all;
339
-    
340
-    # Fetch all row as array of hash ref (List context)
341
-    @rows = $result->fecth_all_hash;
342
-
343
-    # Sample
344
-    my $rows = $result->fetch_hash_all;
345
-    my $val0_key1 = $rows->[0]{key1};
346
-    my $val1_key2 = $rows->[1]{key2};
347
-
348
-=head2 error
349
-
350
-    # Get error infomation
351
-    $error_messege = $result->error;
352
-    ($error_message, $error_number, $error_state) = $result->error;
353
-
354
-You can get get information. This is crenspond to the following.
355
-
356
-    $error_message : $result->sth->errstr
357
-    $error_number  : $result->sth->err
358
-    $error_state   : $result->sth->state
359
-
360
-=head2 finish
361
-
362
-    # Finish statement handle
363
-    $result->finish
364
-    
365
-    # Sample
366
-    my $row = $reuslt->fetch; # fetch only one row
367
-    $result->finish
368
-
369
-You can finish statement handle.This is equel to
370
-
371
-    $result->sth->finish;
372
-
373
-=head1 AUTHOR
374
-
375
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
376
-
377
-Github L<http://github.com/yuki-kimoto>
378
-
379
-=head1 COPYRIGHT & LICENSE
380
-
381
-Copyright 2009 Yuki Kimoto, all rights reserved.
382
-
383
-This program is free software; you can redistribute it and/or modify it
384
-under the same terms as Perl itself.
385
-
386
-=cut
-9
DBIx-Custom-Result/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::Result' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::Result $DBIx::Custom::Result::VERSION, Perl $], $^X" );
-257
DBIx-Custom-Result/t/01-sqlite.t
... ...
@@ -1,257 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-use DBI;
5
-
6
-BEGIN {
7
-    eval { require DBD::SQLite; 1 }
8
-        or plan skip_all => 'DBD::SQLite required';
9
-    eval { DBD::SQLite->VERSION >= 1 }
10
-        or plan skip_all => 'DBD::SQLite >= 1.00 required';
11
-
12
-    plan 'no_plan';
13
-    use_ok('DBIx::Custom::Result');
14
-}
15
-
16
-my $test;
17
-sub test {
18
-    $test = shift;
19
-}
20
-
21
-sub query {
22
-    my ($dbh, $sql) = @_;
23
-    my $sth = $dbh->prepare($sql);
24
-    $sth->execute;
25
-    return DBIx::Custom::Result->new(sth => $sth);
26
-}
27
-
28
-my $dbh;
29
-my $sql;
30
-my $sth;
31
-my @row;
32
-my $row;
33
-my @rows;
34
-my $rows;
35
-my $result;
36
-my $fetch_filter;
37
-my @error;
38
-my $error;
39
-
40
-$dbh = DBI->connect('dbi:SQLite:dbname=:memory:', undef, undef, {PrintError => 0, RaiseError => 1});
41
-$dbh->do("create table table1 (key1 char(255), key2 char(255));");
42
-$dbh->do("insert into table1 (key1, key2) values ('1', '2');");
43
-$dbh->do("insert into table1 (key1, key2) values ('3', '4');");
44
-
45
-$sql = "select key1, key2 from table1";
46
-
47
-test 'fetch scalar context';
48
-$result = query($dbh, $sql);
49
-@rows = ();
50
-while (my $row = $result->fetch) {
51
-    push @rows, [@$row];
52
-}
53
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
54
-
55
-
56
-test 'fetch list context';
57
-$result = query($dbh, $sql);
58
-@rows = ();
59
-while (my @row = $result->fetch) {
60
-    push @rows, [@row];
61
-}
62
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
63
-
64
-test 'fetch_hash scalar context';
65
-$result = query($dbh, $sql);
66
-@rows = ();
67
-while (my $row = $result->fetch_hash) {
68
-    push @rows, {%$row};
69
-}
70
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], $test);
71
-
72
-
73
-test 'fetch hash list context';
74
-$result = query($dbh, $sql);
75
-@rows = ();
76
-while (my %row = $result->fetch_hash) {
77
-    push @rows, {%row};
78
-}
79
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], $test);
80
-
81
-
82
-test 'fetch_first';
83
-$result = query($dbh, $sql);
84
-$row = $result->fetch_first;
85
-is_deeply($row, [1, 2], "$test : row");
86
-$row = $result->fetch;
87
-ok(!$row, "$test : finished");
88
-
89
-
90
-test 'fetch_first list context';
91
-$result = query($dbh, $sql);
92
-@row = $result->fetch_first;
93
-is_deeply([@row], [1, 2], "$test : row");
94
-@row = $result->fetch;
95
-ok(!@row, "$test : finished");
96
-
97
-
98
-test 'fetch_hash_first';
99
-$result = query($dbh, $sql);
100
-$row = $result->fetch_hash_first;
101
-is_deeply($row, {key1 => 1, key2 => 2}, "$test : row");
102
-$row = $result->fetch_hash;
103
-ok(!$row, "$test : finished");
104
-
105
-
106
-test 'fetch_hash_first list context';
107
-$result = query($dbh, $sql);
108
-@row = $result->fetch_hash_first;
109
-is_deeply({@row}, {key1 => 1, key2 => 2}, "$test : row");
110
-@row = $result->fetch_hash;
111
-ok(!@row, "$test : finished");
112
-
113
-
114
-test 'fetch_rows';
115
-$dbh->do("insert into table1 (key1, key2) values ('5', '6');");
116
-$dbh->do("insert into table1 (key1, key2) values ('7', '8');");
117
-$dbh->do("insert into table1 (key1, key2) values ('9', '10');");
118
-$result = query($dbh, $sql);
119
-$rows = $result->fetch_rows(2);
120
-is_deeply($rows, [[1, 2],
121
-                  [3, 4]], "$test : fetch_rows first");
122
-$rows = $result->fetch_rows(2);
123
-is_deeply($rows, [[5, 6],
124
-                  [7, 8]], "$test : fetch_rows secound");
125
-$rows = $result->fetch_rows(2);
126
-is_deeply($rows, [[9, 10]], "$test : fetch_rows third");
127
-$rows = $result->fetch_rows(2);
128
-ok(!$rows);
129
-
130
-
131
-test 'fetch_rows list context';
132
-$result = query($dbh, $sql);
133
-@rows = $result->fetch_rows(2);
134
-is_deeply([@rows], [[1, 2],
135
-                  [3, 4]], "$test : fetch_rows first");
136
-@rows = $result->fetch_rows(2);
137
-is_deeply([@rows], [[5, 6],
138
-                  [7, 8]], "$test : fetch_rows secound");
139
-@rows = $result->fetch_rows(2);
140
-is_deeply([@rows], [[9, 10]], "$test : fetch_rows third");
141
-@rows = $result->fetch_rows(2);
142
-ok(!@rows);
143
-
144
-
145
-test 'fetch_rows error';
146
-$result = query($dbh, $sql);
147
-eval {$result->fetch_rows};
148
-like($@, qr/Row count must be specified/, "$test : Not specified row count");
149
-
150
-
151
-test 'fetch_hash_rows';
152
-$result = query($dbh, $sql);
153
-$rows = $result->fetch_hash_rows(2);
154
-is_deeply($rows, [{key1 => 1, key2 => 2},
155
-                  {key1 => 3, key2 => 4}], "$test : fetch_rows first");
156
-$rows = $result->fetch_hash_rows(2);
157
-is_deeply($rows, [{key1 => 5, key2 => 6},
158
-                  {key1 => 7, key2 => 8}], "$test : fetch_rows secound");
159
-$rows = $result->fetch_hash_rows(2);
160
-is_deeply($rows, [{key1 => 9, key2 => 10}], "$test : fetch_rows third");
161
-$rows = $result->fetch_hash_rows(2);
162
-ok(!$rows);
163
-
164
-
165
-test 'fetch_rows list context';
166
-$result = query($dbh, $sql);
167
-@rows = $result->fetch_hash_rows(2);
168
-is_deeply([@rows], [{key1 => 1, key2 => 2},
169
-                    {key1 => 3, key2 => 4}], "$test : fetch_rows first");
170
-@rows = $result->fetch_hash_rows(2);
171
-is_deeply([@rows], [{key1 => 5, key2 => 6},
172
-                    {key1 => 7, key2 => 8}], "$test : fetch_rows secound");
173
-@rows = $result->fetch_hash_rows(2);
174
-is_deeply([@rows], [{key1 => 9, key2 => 10}], "$test : fetch_rows third");
175
-@rows = $result->fetch_hash_rows(2);
176
-ok(!@rows);
177
-$dbh->do("delete from table1 where key1 = 5 or key1 = 7 or key1 = 9");
178
-
179
-
180
-test 'fetch_rows error';
181
-$result = query($dbh, $sql);
182
-eval {$result->fetch_hash_rows};
183
-like($@, qr/Row count must be specified/, "$test : Not specified row count");
184
-
185
-
186
-test 'fetch_all';
187
-$result = query($dbh, $sql);
188
-$rows = $result->fetch_all;
189
-is_deeply($rows, [[1, 2], [3, 4]], $test);
190
-
191
-test 'fetch_all list context';
192
-$result = query($dbh, $sql);
193
-@rows = $result->fetch_all;
194
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
195
-
196
-
197
-test 'fetch_hash_all';
198
-$result = query($dbh, $sql);
199
-@rows = $result->fetch_hash_all;
200
-is_deeply($rows, [[1, 2], [3, 4]], $test);
201
-
202
-
203
-test 'fetch_hash_all list context';
204
-$result = query($dbh, $sql);
205
-@rows = $result->fetch_all;
206
-is_deeply(\@rows, [[1, 2], [3, 4]], $test);
207
-
208
-
209
-test 'fetch filter';
210
-$fetch_filter = sub {
211
-    my ($value, $key, $type, $sth, $i) = @_;
212
-    if ($key eq 'key1' && $value == 1 && $type =~ /char/i && $i == 0 && $sth->{TYPE}->[$i] eq $type) {
213
-        return $value * 3;
214
-    }
215
-    return $value;
216
-};
217
-
218
-$result = query($dbh, $sql);
219
-$result->fetch_filter($fetch_filter);
220
-$rows = $result->fetch_all;
221
-is_deeply($rows, [[3, 2], [3, 4]], "$test array");
222
-
223
-$result = query($dbh, $sql);
224
-$result->fetch_filter($fetch_filter);
225
-$rows = $result->fetch_hash_all;
226
-is_deeply($rows, [{key1 => 3, key2 => 2}, {key1 => 3, key2 => 4}], "$test hash");
227
-
228
-$result = query($dbh, $sql);
229
-$result->no_fetch_filters(['key1']);
230
-$rows = $result->fetch_all;
231
-is_deeply($rows, [[1, 2], [3, 4]], "$test array no filter keys");
232
-
233
-$result = query($dbh, $sql);
234
-$result->no_fetch_filters(['key1']);
235
-$rows = $result->fetch_hash_all;
236
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test hash no filter keys");
237
-
238
-
239
-test 'finish';
240
-$result = query($dbh, $sql);
241
-$result->fetch;
242
-$result->finish;
243
-ok(!$result->fetch, $test);
244
-
245
-test 'error'; # Cannot real test
246
-$result = query($dbh, $sql);
247
-$sth = $result->sth;
248
-
249
-@error = $result->error;
250
-is(scalar @error, 3, "$test list context count");
251
-is($error[0], $sth->errstr, "$test list context errstr");
252
-is($error[1], $sth->err, "$test list context err");
253
-is($error[2], $sth->state, "$test list context state");
254
-
255
-$error = $result->error;
256
-is($error, $sth->errstr, "$test scalar context");
257
-
-50
DBIx-Custom-Result/t/boilerplate.t
... ...
@@ -1,50 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-  not_in_file_ok(README =>
40
-    "The README is used..."       => qr/The README is used/,
41
-    "'version information here'"  => qr/to provide version information/,
42
-  );
43
-
44
-  not_in_file_ok(Changes =>
45
-    "placeholder date/time"       => qr(Date/time)
46
-  );
47
-
48
-  module_boilerplate_ok('lib/DBIx/Custom/Result.pm');
49
-
50
-
-18
DBIx-Custom-Result/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-Result/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-10
DBIx-Custom-SQL-Template/.gitignore
... ...
@@ -1,10 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
-20
DBIx-Custom-SQL-Template/Build.PL
... ...
@@ -1,20 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::SQL::Template',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/SQL/Template.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    requires => {
14
-        'Object::Simple' => 2.0702,
15
-    },
16
-    add_to_cleanup      => [ 'DBIx-Custom-SQL-Template-*' ],
17
-    create_makefile_pl => 'traditional',
18
-);
19
-
20
-$builder->create_build_script();
-2
DBIx-Custom-SQL-Template/Changes
... ...
@@ -1,2 +0,0 @@
1
-0.0101
2
-  First release
-15
DBIx-Custom-SQL-Template/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom-SQL-Template/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom-SQL-Template
2
-
3
-SQL Template for DBIx::Custom
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom::SQL::Template
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-696
DBIx-Custom-SQL-Template/lib/DBIx/Custom/SQL/Template.pm
... ...
@@ -1,696 +0,0 @@
1
-package DBIx::Custom::SQL::Template;
2
-use Object::Simple;
3
-
4
-our $VERSION = '0.0101';
5
-
6
-use Carp 'croak';
7
-
8
-# Accessor is created by Object::Simple. Please read Object::Simple document
9
-
10
-### Class-Object accessors
11
-
12
-# Tag start
13
-sub tag_start   : ClassObjectAttr {
14
-    initialize => {default => '{', clone => 'scalar'}
15
-}
16
-
17
-# Tag end
18
-sub tag_end     : ClassObjectAttr {
19
-    initialize => {default => '}', clone => 'scalar'}
20
-}
21
-
22
-# Tag syntax
23
-sub tag_syntax  : ClassObjectAttr {
24
-    initialize => {default => <<'EOS', clone => 'scalar'}}
25
-[tag]                     [expand]
26
-{? name}                  ?
27
-{= name}                  name = ?
28
-{<> name}                 name <> ?
29
-
30
-{< name}                  name < ?
31
-{> name}                  name > ?
32
-{>= name}                 name >= ?
33
-{<= name}                 name <= ?
34
-
35
-{like name}               name like ?
36
-{in name number}          name in [?, ?, ..]
37
-
38
-{insert key1 key2} (key1, key2) values (?, ?)
39
-{update key1 key2}    set key1 = ?, key2 = ?
40
-EOS
41
-
42
-# Tag processors
43
-sub tag_processors : ClassObjectAttr {
44
-    type => 'hash',
45
-    deref => 1,
46
-    initialize => {
47
-        clone => 'hash', 
48
-        default => sub {{
49
-            '?'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
50
-            '='             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
51
-            '<>'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
52
-            '>'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
53
-            '<'             => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
54
-            '>='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
55
-            '<='            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
56
-            'like'          => \&DBIx::Custom::SQL::Template::TagProcessor::expand_basic_tag,
57
-            'in'            => \&DBIx::Custom::SQL::Template::TagProcessor::expand_in_tag,
58
-            'insert'        => \&DBIx::Custom::SQL::Template::TagProcessor::expand_insert_tag,
59
-            'update'    => \&DBIx::Custom::SQL::Template::TagProcessor::expand_update_tag
60
-        }}
61
-    }
62
-}
63
-
64
-# Add Tag processor
65
-sub add_tag_processor {
66
-    my $invocant = shift;
67
-    my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
68
-    $invocant->tag_processors(%{$invocant->tag_processors}, %{$tag_processors});
69
-    return $invocant;
70
-}
71
-
72
-# Clone
73
-sub clone {
74
-    my $self = shift;
75
-    my $new = $self->new;
76
-    
77
-    $new->tag_start($self->tag_start);
78
-    $new->tag_end($self->tag_end);
79
-    $new->tag_syntax($self->tag_syntax);
80
-    $new->tag_processors({%{$self->tag_processors || {}}});
81
-    
82
-    return $new;
83
-}
84
-
85
-
86
-### Object Methods
87
-
88
-# Create Query
89
-sub create_query {
90
-    my ($self, $template)  = @_;
91
-    
92
-    # Parse template
93
-    my $tree = $self->_parse_template($template);
94
-    
95
-    # Build query
96
-    my $query = $self->_build_query($tree);
97
-    
98
-    return $query;
99
-}
100
-
101
-# Parse template
102
-sub _parse_template {
103
-    my ($self, $template) = @_;
104
-    $template ||= '';
105
-    
106
-    my $tree = [];
107
-    
108
-    # Tags
109
-    my $tag_start = quotemeta $self->tag_start;
110
-    my $tag_end   = quotemeta $self->tag_end;
111
-    
112
-    # Tokenize
113
-    my $state = 'text';
114
-    
115
-    # Save original template
116
-    my $original_template = $template;
117
-    
118
-    # Parse template
119
-    while ($template =~ s/([^$tag_start]*?)$tag_start([^$tag_end].*?)$tag_end//sm) {
120
-        my $text = $1;
121
-        my $tag  = $2;
122
-        
123
-        # Parse tree
124
-        push @$tree, {type => 'text', tag_args => [$text]} if $text;
125
-        
126
-        if ($tag) {
127
-            # Get tag name and arguments
128
-            my ($tag_name, @tag_args) = split /\s+/, $tag;
129
-            
130
-            # Tag processor is exist?
131
-            unless ($self->tag_processors->{$tag_name}) {
132
-                my $tag_syntax = $self->tag_syntax;
133
-                croak("Tag '{$tag}' in SQL template is not exist.\n\n" .
134
-                      "<SQL template tag syntax>\n" .
135
-                      "$tag_syntax\n" .
136
-                      "<Your SQL template>\n" .
137
-                      "$original_template\n\n");
138
-            }
139
-            
140
-            # Check tag arguments
141
-            foreach my $tag_arg (@tag_args) {
142
-                # Cannot cantain placehosder '?'
143
-                croak("Tag '{t }' arguments cannot contain '?'")
144
-                  if $tag_arg =~ /\?/;
145
-            }
146
-            
147
-            # Add tag to parsing tree
148
-            push @$tree, {type => 'tag', tag_name => $tag_name, tag_args => [@tag_args]};
149
-        }
150
-    }
151
-    
152
-    # Add text to parsing tree 
153
-    push @$tree, {type => 'text', tag_args => [$template]} if $template;
154
-    
155
-    return $tree;
156
-}
157
-
158
-# Build SQL from parsing tree
159
-sub _build_query {
160
-    my ($self, $tree) = @_;
161
-    
162
-    # SQL
163
-    my $sql = '';
164
-    
165
-    # All parameter key infomation
166
-    my $all_key_infos = [];
167
-    
168
-    # Build SQL 
169
-    foreach my $node (@$tree) {
170
-        
171
-        # Get type, tag name, and arguments
172
-        my $type     = $node->{type};
173
-        my $tag_name = $node->{tag_name};
174
-        my $tag_args = $node->{tag_args};
175
-        
176
-        # Text
177
-        if ($type eq 'text') {
178
-            # Join text
179
-            $sql .= $tag_args->[0];
180
-        }
181
-        
182
-        # Tag
183
-        elsif ($type eq 'tag') {
184
-            
185
-            # Get tag processor
186
-            my $tag_processor = $self->tag_processors->{$tag_name};
187
-            
188
-            # Tag processor is code ref?
189
-            croak("Tag processor '$tag_name' must be code reference")
190
-              unless ref $tag_processor eq 'CODE';
191
-            
192
-            # Expand tag using tag processor
193
-            my ($expand, $key_infos)
194
-              = $tag_processor->($tag_name, $tag_args);
195
-            
196
-            # Check tag processor return value
197
-            croak("Tag processor '$tag_name' must return (\$expand, \$key_infos)")
198
-              if !defined $expand || ref $key_infos ne 'ARRAY';
199
-            
200
-            # Check placeholder count
201
-            croak("Placeholder count in SQL created by tag processor '$tag_name' " .
202
-                  "must be same as key informations count")
203
-              unless $self->_placeholder_count($expand) eq @$key_infos;
204
-            
205
-            # Add key information
206
-            push @$all_key_infos, @$key_infos;
207
-            
208
-            # Join expand tag to SQL
209
-            $sql .= $expand;
210
-        }
211
-    }
212
-    
213
-    # Add semicolon
214
-    $sql .= ';' unless $sql =~ /;$/;
215
-    
216
-    # Query
217
-    my $query = {sql => $sql, key_infos => $all_key_infos};
218
-    
219
-    return $query;
220
-}
221
-
222
-# Get placeholder count
223
-sub _placeholder_count {
224
-    my ($self, $expand) = @_;
225
-    $expand ||= '';
226
-    
227
-    my $count = 0;
228
-    my $pos   = -1;
229
-    while (($pos = index($expand, '?', $pos + 1)) != -1) {
230
-        $count++;
231
-    }
232
-    return $count;
233
-}
234
-
235
-Object::Simple->build_class;
236
-
237
-
238
-package DBIx::Custom::SQL::Template::TagProcessor;
239
-use strict;
240
-use warnings;
241
-use Carp 'croak';
242
-
243
-# Expand tag '?', '=', '<>', '>', '<', '>=', '<=', 'like'
244
-sub expand_basic_tag {
245
-    my ($tag_name, $tag_args) = @_;
246
-    my $original_key = $tag_args->[0];
247
-    
248
-    # Key is not exist
249
-    croak("You must be pass key as argument to tag '{$tag_name }'")
250
-      if !$original_key;
251
-    
252
-    # Expanded tag
253
-    my $expand = $tag_name eq '?'
254
-               ? '?'
255
-               : "$original_key $tag_name ?";
256
-    
257
-    # Get table and clumn name
258
-    my ($table, $column) = get_table_and_column($original_key);
259
-    
260
-    # Parameter key infomation
261
-    my $key_info = {};
262
-    
263
-    # Original key
264
-    $key_info->{original_key} = $original_key;
265
-    
266
-    # Table
267
-    $key_info->{table}  = $table;
268
-    
269
-    # Column name
270
-    $key_info->{column} = $column;
271
-    
272
-    # Access keys
273
-    my $access_keys = [];
274
-    push @$access_keys, [$original_key];
275
-    push @$access_keys, [$table, $column] if $table && $column;
276
-    $key_info->{access_keys} = $access_keys;
277
-    
278
-    # Add parameter key information
279
-    my $key_infos = [];
280
-    push @$key_infos, $key_info;
281
-    
282
-    return ($expand, $key_infos);
283
-}
284
-
285
-# Expand tag 'in'
286
-sub expand_in_tag {
287
-    my ($tag_name, $tag_args) = @_;
288
-    my ($original_key, $placeholder_count) = @$tag_args;
289
-    
290
-    # Key must be specified
291
-    croak("You must be pass key as first argument of tag '{$tag_name }'\n" . 
292
-          "Usage: {$tag_name \$key \$placeholder_count}")
293
-      unless $original_key;
294
-      
295
-    
296
-    # Place holder count must be specified
297
-    croak("You must be pass placeholder count as second argument of tag '{$tag_name }'\n" . 
298
-          "Usage: {$tag_name \$key \$placeholder_count}")
299
-      if !$placeholder_count || $placeholder_count =~ /\D/;
300
-
301
-    # Expand tag
302
-    my $expand = "$original_key $tag_name (";
303
-    for (my $i = 0; $i < $placeholder_count; $i++) {
304
-        $expand .= '?, ';
305
-    }
306
-    
307
-    $expand =~ s/, $//;
308
-    $expand .= ')';
309
-    
310
-    # Get table and clumn name
311
-    my ($table, $column) = get_table_and_column($original_key);
312
-    
313
-    # Create parameter key infomations
314
-    my $key_infos = [];
315
-    for (my $i = 0; $i < $placeholder_count; $i++) {
316
-        # Parameter key infomation
317
-        my $key_info = {};
318
-        
319
-        # Original key
320
-        $key_info->{original_key} = $original_key;
321
-        
322
-        # Table
323
-        $key_info->{table}   = $table;
324
-        
325
-        # Column name
326
-        $key_info->{column}  = $column;
327
-        
328
-        # Access keys
329
-        my $access_keys = [];
330
-        push @$access_keys, [$original_key, [$i]];
331
-        push @$access_keys, [$table, $column, [$i]] if $table && $column;
332
-        $key_info->{access_keys} = $access_keys;
333
-        
334
-        # Add parameter key infos
335
-        push @$key_infos, $key_info;
336
-    }
337
-    
338
-    return ($expand, $key_infos);
339
-}
340
-
341
-# Get table and column
342
-sub get_table_and_column {
343
-    my $key = shift;
344
-    $key ||= '';
345
-    
346
-    return ('', $key) unless $key =~ /\./;
347
-    
348
-    my ($table, $column) = split /\./, $key;
349
-    
350
-    return ($table, $column);
351
-}
352
-
353
-# Expand tag 'insert'
354
-sub expand_insert_tag {
355
-    my ($tag_name, $tag_args) = @_;
356
-    my $original_keys = $tag_args;
357
-    
358
-    # Insert key (k1, k2, k3, ..)
359
-    my $insert_keys = '(';
360
-    
361
-    # placeholder (?, ?, ?, ..)
362
-    my $place_holders = '(';
363
-    
364
-    foreach my $original_key (@$original_keys) {
365
-        # Get table and column
366
-        my ($table, $column) = get_table_and_column($original_key);
367
-        
368
-        # Join insert column
369
-        $insert_keys   .= "$column, ";
370
-        
371
-        # Join place holder
372
-        $place_holders .= "?, ";
373
-    }
374
-    
375
-    # Delete last ', '
376
-    $insert_keys =~ s/, $//;
377
-    
378
-    # Close 
379
-    $insert_keys .= ')';
380
-    $place_holders =~ s/, $//;
381
-    $place_holders .= ')';
382
-    
383
-    # Expand tag
384
-    my $expand = "$insert_keys values $place_holders";
385
-    
386
-    # Create parameter key infomations
387
-    my $key_infos = [];
388
-    foreach my $original_key (@$original_keys) {
389
-        # Get table and clumn name
390
-        my ($table, $column) = get_table_and_column($original_key);
391
-        
392
-        # Parameter key infomation
393
-        my $key_info = {};
394
-        
395
-        # Original key
396
-        $key_info->{original_key} = $original_key;
397
-        
398
-        # Table
399
-        $key_info->{table}   = $table;
400
-        
401
-        # Column name
402
-        $key_info->{column}  = $column;
403
-        
404
-        # Access keys
405
-        my $access_keys = [];
406
-        push @$access_keys, ['#insert', $original_key];
407
-        push @$access_keys, ['#insert', $table, $column] if $table && $column;
408
-        push @$access_keys, [$original_key];
409
-        push @$access_keys, [$table, $column] if $table && $column;
410
-        $key_info->{access_keys} = $access_keys;
411
-        
412
-        # Add parameter key infos
413
-        push @$key_infos, $key_info;
414
-    }
415
-    
416
-    return ($expand, $key_infos);
417
-}
418
-
419
-# Expand tag 'update'
420
-sub expand_update_tag {
421
-    my ($tag_name, $tag_args) = @_;
422
-    my $original_keys = $tag_args;
423
-    
424
-    # Expanded tag
425
-    my $expand = 'set ';
426
-    
427
-    # 
428
-    foreach my $original_key (@$original_keys) {
429
-        # Get table and clumn name
430
-        my ($table, $column) = get_table_and_column($original_key);
431
-
432
-        # Join key and placeholder
433
-        $expand .= "$column = ?, ";
434
-    }
435
-    
436
-    # Delete last ', '
437
-    $expand =~ s/, $//;
438
-    
439
-    # Create parameter key infomations
440
-    my $key_infos = [];
441
-    foreach my $original_key (@$original_keys) {
442
-        # Get table and clumn name
443
-        my ($table, $column) = get_table_and_column($original_key);
444
-        
445
-        # Parameter key infomation
446
-        my $key_info = {};
447
-        
448
-        # Original key
449
-        $key_info->{original_key} = $original_key;
450
-        
451
-        # Table
452
-        $key_info->{table}  = $table;
453
-        
454
-        # Column name
455
-        $key_info->{column} = $column;
456
-        
457
-        # Access keys
458
-        my $access_keys = [];
459
-        push @$access_keys, ['#update', $original_key];
460
-        push @$access_keys, ['#update', $table, $column] if $table && $column;
461
-        push @$access_keys, [$original_key];
462
-        push @$access_keys, [$table, $column] if $table && $column;
463
-        $key_info->{access_keys} = $access_keys;
464
-        
465
-        # Add parameter key infos
466
-        push @$key_infos, $key_info;
467
-    }
468
-    
469
-    return ($expand, $key_infos);
470
-}
471
-
472
-1;
473
-
474
-=head1 NAME
475
-
476
-DBIx::Custom::SQL::Template - Custamizable SQL Template for DBIx::Custom
477
-
478
-=head1 VERSION
479
-
480
-Version 0.0101
481
-
482
-=cut
483
-
484
-=head1 SYNOPSIS
485
-    
486
-    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
487
-    
488
-    my $tmpl   = "select from table {= k1} && {<> k2} || {like k3}";
489
-    my $param = {k1 => 1, k2 => 2, k3 => 3};
490
-    
491
-    my $query = $sql_template->create_query($tmpl);
492
-    
493
-    
494
-    # Using query from DBIx::Custom
495
-    use DBIx::Custom;
496
-    my $dbi = DBI->new(
497
-       data_source => $data_source,
498
-       user        => $user,
499
-       password    => $password, 
500
-       dbi_options => {PrintError => 0, RaiseError => 1}
501
-    );
502
-    
503
-    $query = $dbi->create_query($tmpl); # This is SQL::Template create_query
504
-    $dbi->query($query, $param);
505
-
506
-=head1 CLASS-OBJECT ACCESSORS
507
-
508
-Class-Object accessor is used from both object and class
509
-
510
-    $class->$accessor # call from class
511
-    $self->$accessor  # call form object
512
-
513
-=head2 tag_processors
514
-
515
-    # Set and get
516
-    $self           = $sql_tmpl->tag_processors($tag_processors);
517
-    $tag_processors = $sql_tmpl->tag_processors;
518
-    
519
-    # Sample
520
-    $sql_tmpl->tag_processors(
521
-        '?' => \&expand_question,
522
-        '=' => \&expand_equel
523
-    );
524
-
525
-You can use add_tag_processor to add tag processor
526
-
527
-=head2 tag_start
528
-
529
-    # Set and get
530
-    $self      = $sql_tmpl->tag_start($tag_start);
531
-    $tag_start = $sql_tmpl->tag_start;
532
-    
533
-    # Sample
534
-    $sql_tmpl->tag_start('{');
535
-
536
-Default is '{'
537
-
538
-=head2 tag_end
539
-
540
-    # Set and get
541
-    $self    = $sql_tmpl->tag_start($tag_end);
542
-    $tag_end = $sql_tmpl->tag_start;
543
-    
544
-    # Sample
545
-    $sql_tmpl->tag_start('}');
546
-
547
-Default is '}'
548
-    
549
-=head2 tag_syntax
550
-    
551
-    # Set and get
552
-    $self       = $sql_tmpl->tag_syntax($tag_syntax);
553
-    $tag_syntax = $sql_tmpl->tag_syntax;
554
-    
555
-    # Sample
556
-    $sql_tmpl->tag_syntax(
557
-        "[Tag]            [Expand]\n" .
558
-        "{? name}         ?\n" .
559
-        "{= name}         name = ?\n" .
560
-        "{<> name}        name <> ?\n"
561
-    );
562
-
563
-=head1 METHODS
564
-
565
-=head2 create_query
566
-    
567
-    # Create SQL form SQL template
568
-    $query = $sql_tmpl->create_query($tmpl);
569
-    
570
-    # Sample
571
-    $query = $sql_tmpl->create_sql(
572
-         "select * from table where {= title} && {like author} || {<= price}")
573
-    
574
-    # Result
575
-    $qeury->{sql} : "select * from table where title = ? && author like ? price <= ?;"
576
-    $query->{key_infos} : [['title'], ['author'], ['price']]
577
-    
578
-    # Sample2 (with table name)
579
-    ($sql, @bind_values) = $sql_tmpl->create_sql(
580
-            "select * from table where {= table.title} && {like table.author}",
581
-            {table => {title => 'Perl', author => '%Taro%'}}
582
-        )
583
-    
584
-    # Result2
585
-    $query->{sql} : "select * from table where table.title = ? && table.title like ?;"
586
-    $query->{key_infos} :[ [['table.title'],['table', 'title']],
587
-                           [['table.author'],['table', 'author']] ]
588
-
589
-This method create query using by DBIx::Custom.
590
-query is two infomation
591
-
592
-    1.sql       : SQL
593
-    2.key_infos : Parameter access key information
594
-
595
-=head2 add_tag_processor
596
-
597
-Add tag processor
598
-  
599
-    # Add
600
-    $self = $sql_tmpl->add_tag_processor($tag_processor);
601
-    
602
-    # Sample
603
-    $sql_tmpl->add_tag_processor(
604
-        '?' => sub {
605
-            my ($tag_name, $tag_args) = @_;
606
-            
607
-            my $key1 = $tag_args->[0];
608
-            my $key2 = $tag_args->[1];
609
-            
610
-            my $key_infos = [];
611
-            
612
-            # Expand tag and create key informations
613
-            
614
-            # Return expand tags and key informations
615
-            return ($expand, $key_infos);
616
-        }
617
-    );
618
-
619
-Tag processor recieve 2 argument
620
-
621
-    1. Tag name            (?, =, <>, or etc)
622
-    2. Tag arguments       (arg1 and arg2 in {tag_name arg1 arg2})
623
-
624
-Tag processor return 2 value
625
-
626
-    1. Expanded Tag (For exsample, '{= title}' is expanded to 'title = ?')
627
-    2. Key infomations
628
-    
629
-You must be return expanded tag and key infomations.
630
-
631
-Key information is a little complex. so I will explan this in future.
632
-
633
-If you want to know more, Please see DBIx::Custom::SQL::Template source code.
634
-
635
-=head2 clone
636
-
637
-    # Clone DBIx::Custom::SQL::Template object
638
-    $clone = $self->clone;
639
-    
640
-=head1 Available Tags
641
-    
642
-    # Available Tags
643
-    [tag]            [expand]
644
-    {? name}         ?
645
-    {= name}         name = ?
646
-    {<> name}        name <> ?
647
-    
648
-    {< name}         name < ?
649
-    {> name}         name > ?
650
-    {>= name}        name >= ?
651
-    {<= name}        name <= ?
652
-    
653
-    {like name}      name like ?
654
-    {in name}        name in [?, ?, ..]
655
-    
656
-    {insert}  (key1, key2, key3) values (?, ?, ?)
657
-    {update}     set key1 = ?, key2 = ?, key3 = ?
658
-    
659
-    # Sample1
660
-    $query = $sql_tmpl->create_sql(
661
-        "insert into table {insert key1 key2}"
662
-    );
663
-    # Result1
664
-    $sql : "insert into table (key1, key2) values (?, ?)"
665
-    
666
-    
667
-    # Sample2
668
-    $query = $sql_tmpl->create_sql(
669
-        "update table {update key1 key2} where {= key3}"
670
-    );
671
-    
672
-    # Result2
673
-    $query->{sql} : "update table set key1 = ?, key2 = ? where key3 = ?;"
674
-    
675
-=head1 AUTHOR
676
-
677
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
678
-
679
-Github 
680
-L<http://github.com/yuki-kimoto>
681
-L<http://github.com/yuki-kimoto/DBIx-Custom-SQL-Template>
682
-
683
-Please let know me bag if you find
684
-Please request me if you want to do something
685
-
686
-=head1 COPYRIGHT & LICENSE
687
-
688
-Copyright 2009 Yuki Kimoto, all rights reserved.
689
-
690
-This program is free software; you can redistribute it and/or modify it
691
-under the same terms as Perl itself.
692
-
693
-
694
-=cut
695
-
696
-1; # End of DBIx::Custom::SQL::Template
-9
DBIx-Custom-SQL-Template/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::SQL::Template' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::SQL::Template $DBIx::Custom::SQL::Template::VERSION, Perl $], $^X" );
-236
DBIx-Custom-SQL-Template/t/01-core.t
... ...
@@ -1,236 +0,0 @@
1
-use strict;
2
-use warnings;
3
-
4
-use Test::More 'no_plan';
5
-
6
-use DBIx::Custom::SQL::Template;
7
-
8
-# Function for test name
9
-my $test;
10
-sub test{
11
-    $test = shift;
12
-}
13
-
14
-# Variable for test
15
-my $datas;
16
-my $sql_tmpl;
17
-my $query;
18
-my $ret_val;
19
-my $clone;
20
-
21
-test "Various template pattern";
22
-$datas = [
23
-    # Basic tests
24
-    {   name            => 'placeholder basic',
25
-        tmpl            => "a {?  k1} b {=  k2} {<> k3} {>  k4} {<  k5} {>= k6} {<= k7} {like k8}", ,
26
-        sql_expected    => "a ? b k2 = ? k3 <> ? k4 > ? k5 < ? k6 >= ? k7 <= ? k8 like ?;",
27
-        key_infos_expected   => [
28
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1']]},
29
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['k2']]},
30
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['k3']]},
31
-            {original_key => 'k4', table => '', column => 'k4', access_keys => [['k4']]},
32
-            {original_key => 'k5', table => '', column => 'k5', access_keys => [['k5']]},
33
-            {original_key => 'k6', table => '', column => 'k6', access_keys => [['k6']]},
34
-            {original_key => 'k7', table => '', column => 'k7', access_keys => [['k7']]},
35
-            {original_key => 'k8', table => '', column => 'k8', access_keys => [['k8']]},
36
-        ],
37
-    },
38
-    {
39
-        name            => 'placeholder in',
40
-        tmpl            => "{in k1 3};",
41
-        sql_expected    => "k1 in (?, ?, ?);",
42
-        key_infos_expected   => [
43
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [0]]]},
44
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [1]]]},
45
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['k1', [2]]]},
46
-        ],
47
-    },
48
-    {
49
-        name            => 'insert',
50
-        tmpl            => "{insert k1 k2 k3}",
51
-        sql_expected    => "(k1, k2, k3) values (?, ?, ?);",
52
-        key_infos_expected   => [
53
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['#insert', 'k1'], ['k1']]},
54
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['#insert', 'k2'], ['k2']]},
55
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['#insert', 'k3'], ['k3']]},
56
-        ],
57
-    },
58
-    {
59
-        name            => 'update',
60
-        tmpl            => "{update k1 k2 k3}",
61
-        sql_expected    => "set k1 = ?, k2 = ?, k3 = ?;",
62
-        key_infos_expected   => [
63
-            {original_key => 'k1', table => '', column => 'k1', access_keys => [['#update', 'k1'], ['k1']]},
64
-            {original_key => 'k2', table => '', column => 'k2', access_keys => [['#update', 'k2'], ['k2']]},
65
-            {original_key => 'k3', table => '', column => 'k3', access_keys => [['#update', 'k3'], ['k3']]},
66
-        ],
67
-    },
68
-    
69
-    # Table name
70
-    {
71
-        name            => 'placeholder with table name',
72
-        tmpl            => "{= a.k1} {= a.k2}",
73
-        sql_expected    => "a.k1 = ? a.k2 = ?;",
74
-        key_infos_expected  => [
75
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1'], ['a', 'k1']]},
76
-            {original_key => 'a.k2', table => 'a', column => 'k2', access_keys => [['a.k2'], ['a', 'k2']]},
77
-        ],
78
-    },
79
-    {   
80
-        name            => 'placeholder in with table name',
81
-        tmpl            => "{in a.k1 2} {in b.k2 2}",
82
-        sql_expected    => "a.k1 in (?, ?) b.k2 in (?, ?);",
83
-        key_infos_expected  => [
84
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1', [0]], ['a', 'k1', [0]]]},
85
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['a.k1', [1]], ['a', 'k1', [1]]]},
86
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['b.k2', [0]], ['b', 'k2', [0]]]},
87
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['b.k2', [1]], ['b', 'k2', [1]]]},
88
-        ],
89
-    },
90
-    {
91
-        name            => 'insert with table name',
92
-        tmpl            => "{insert a.k1 b.k2}",
93
-        sql_expected    => "(k1, k2) values (?, ?);",
94
-        key_infos_expected  => [
95
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['#insert', 'a.k1'], ['#insert', 'a', 'k1'], ['a.k1'], ['a', 'k1']]},
96
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['#insert', 'b.k2'], ['#insert', 'b', 'k2'], ['b.k2'], ['b', 'k2']]},
97
-        ],
98
-    },
99
-    {
100
-        name            => 'update with table name',
101
-        tmpl            => "{update a.k1 b.k2}",
102
-        sql_expected    => "set k1 = ?, k2 = ?;",
103
-        key_infos_expected  => [
104
-            {original_key => 'a.k1', table => 'a', column => 'k1', access_keys => [['#update', 'a.k1'], ['#update', 'a', 'k1'], ['a.k1'], ['a', 'k1']]},
105
-            {original_key => 'b.k2', table => 'b', column => 'k2', access_keys => [['#update', 'b.k2'], ['#update', 'b', 'k2'], ['b.k2'], ['b', 'k2']]},
106
-        ],
107
-    },
108
-    {
109
-        name            => 'not contain tag',
110
-        tmpl            => "aaa",
111
-        sql_expected    => "aaa;",
112
-        key_infos_expected  => [],
113
-    }
114
-];
115
-
116
-for (my $i = 0; $i < @$datas; $i++) {
117
-    my $data = $datas->[$i];
118
-    my $sql_tmpl = DBIx::Custom::SQL::Template->new;
119
-    my $query = $sql_tmpl->create_query($data->{tmpl});
120
-    is($query->{sql}, $data->{sql_expected}, "$test : $data->{name} : sql");
121
-    is_deeply($query->{key_infos}, $data->{key_infos_expected}, "$test : $data->{name} : key_infos");
122
-}
123
-
124
-
125
-test 'Original tag processor';
126
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
127
-
128
-$ret_val = $sql_tmpl->add_tag_processor(
129
-    p => sub {
130
-        my ($tag_name, $args) = @_;
131
-        
132
-        my $expand    = "$tag_name ? $args->[0] $args->[1]";
133
-        my $key_infos = [2];
134
-        return ($expand, $key_infos);
135
-    }
136
-);
137
-
138
-$query = $sql_tmpl->create_query("{p a b}");
139
-is($query->{sql}, "p ? a b;", "$test : add_tag_processor sql");
140
-is_deeply($query->{key_infos}, [2], "$test : add_tag_processor key_infos");
141
-isa_ok($ret_val, 'DBIx::Custom::SQL::Template');
142
-
143
-
144
-test "Tag processor error case";
145
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
146
-
147
-
148
-eval{$sql_tmpl->create_query("{a }")};
149
-like($@, qr/Tag '{a }' in SQL template is not exist/, "$test : tag_processor not exist");
150
-
151
-$sql_tmpl->add_tag_processor({
152
-    q => 'string'
153
-});
154
-
155
-eval{$sql_tmpl->create_query("{q}", {})};
156
-like($@, qr/Tag processor 'q' must be code reference/, "$test : tag_processor not code ref");
157
-
158
-$sql_tmpl->add_tag_processor({
159
-   r => sub {} 
160
-});
161
-
162
-eval{$sql_tmpl->create_query("{r}")};
163
-like($@, qr/\QTag processor 'r' must return (\E\$expand\Q, \E\$key_infos\Q)/, "$test : tag processor return noting");
164
-
165
-$sql_tmpl->add_tag_processor({
166
-   s => sub { return ("a", "")} 
167
-});
168
-
169
-eval{$sql_tmpl->create_query("{s}")};
170
-like($@, qr/\QTag processor 's' must return (\E\$expand\Q, \E\$key_infos\Q)/, "$test : tag processor return not array key_infos");
171
-
172
-$sql_tmpl->add_tag_processor(
173
-    t => sub {return ("a", [])}
174
-);
175
-
176
-eval{$sql_tmpl->create_query("{t ???}")};
177
-like($@, qr/Tag '{t }' arguments cannot contain '?'/, "$test : cannot contain '?' in tag argument");
178
-
179
-
180
-test 'General error case';
181
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
182
-$sql_tmpl->add_tag_processor(
183
-    a => sub {
184
-        return ("? ? ?", [[],[]]);
185
-    }
186
-);
187
-eval{$sql_tmpl->create_query("{a}")};
188
-like($@, qr/Placeholder count in SQL created by tag processor 'a' must be same as key informations count/, "$test placeholder count is invalid");
189
-
190
-
191
-test 'Default tag processor Error case';
192
-eval{$sql_tmpl->create_query("{= }")};
193
-like($@, qr/You must be pass key as argument to tag '{= }'/, "$test : basic '=' : key not exist");
194
-
195
-eval{$sql_tmpl->create_query("{in }")};
196
-like($@, qr/You must be pass key as first argument of tag '{in }'/, "$test : in : key not exist");
197
-
198
-eval{$sql_tmpl->create_query("{in a}")};
199
-like($@, qr/\QYou must be pass placeholder count as second argument of tag '{in }'\E\n\QUsage: {in \E\$key\Q \E\$placeholder_count\Q}/,
200
-     "$test : in : key not exist");
201
-
202
-eval{$sql_tmpl->create_query("{in a r}")};
203
-like($@, qr/\QYou must be pass placeholder count as second argument of tag '{in }'\E\n\QUsage: {in \E\$key\Q \E\$placeholder_count\Q}/,
204
-     "$test : in : key not exist");
205
-
206
-
207
-test 'Clone';
208
-$sql_tmpl = DBIx::Custom::SQL::Template->new;
209
-$sql_tmpl
210
-  ->tag_start('[')
211
-  ->tag_end(']')
212
-  ->tag_syntax('syntax')
213
-  ->tag_processors({a => 1, b => 2});
214
-
215
-$clone = $sql_tmpl->clone;
216
-is($clone->tag_start, $sql_tmpl->tag_start, "$test : tag_start");
217
-is($clone->tag_end, $sql_tmpl->tag_end, "$test : tag_end");
218
-is($clone->tag_syntax, $sql_tmpl->tag_syntax, "$test : tag_syntax");
219
-
220
-is_deeply( scalar $clone->tag_processors, scalar $sql_tmpl->tag_processors,
221
-          "$test : tag_processors deep clone");
222
-
223
-isnt($clone->tag_processors, $sql_tmpl->tag_processors, 
224
-     "$test : tag_processors reference not copy");
225
-
226
-$sql_tmpl->tag_processors(undef);
227
-
228
-$clone = $sql_tmpl->clone;
229
-is_deeply(scalar $clone->tag_processors, {}, "$test tag_processor undef copy");
230
-
231
-
232
-
233
-__END__
234
-
235
-
236
-
-51
DBIx-Custom-SQL-Template/t/boilerplate.t
... ...
@@ -1,51 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-
40
-  not_in_file_ok(README =>
41
-    "The README is used..."       => qr/The README is used/,
42
-    "'version information here'"  => qr/to provide version information/,
43
-  );
44
-
45
-  not_in_file_ok(Changes =>
46
-    "placeholder date/time"       => qr(Date/time)
47
-  );
48
-
49
-  module_boilerplate_ok('lib/DBIx/Custom/SQL/Template.pm');
50
-
51
-
-18
DBIx-Custom-SQL-Template/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok(also_private => [qw//]);
-12
DBIx-Custom-SQL-Template/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-10
DBIx-Custom-SQLite/.cvsignore
... ...
@@ -1,10 +0,0 @@
1
-blib*
2
-Makefile
3
-Makefile.old
4
-Build
5
-_build*
6
-pm_to_blib*
7
-*.tar.gz
8
-.lwpcookies
9
-DBIx-Custom-SQLite-*
10
-cover_db
-11
DBIx-Custom-SQLite/.gitignore
... ...
@@ -1,11 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
11
-*.tmp
-21
DBIx-Custom-SQLite/Build.PL
... ...
@@ -1,21 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom::SQLite',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom/SQLite.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    requires => {
14
-        'DBIx::Custom::Basic' => 0.0101,
15
-        'DBD::SQLite' => 1.25
16
-    },
17
-    add_to_cleanup      => [ 'DBIx-Custom-SQLite-*' ],
18
-    create_makefile_pl => 'traditional',
19
-);
20
-
21
-$builder->create_build_script();
-6
DBIx-Custom-SQLite/Changes
... ...
@@ -1,6 +0,0 @@
1
-0.0201
2
-  catch up DBIx::Custom::Result version up
3
-0.0102
4
-  update document
5
-0.0101
6
-  First release
-15
DBIx-Custom-SQLite/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom-SQLite/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom-SQLite
2
-
3
-DBIx::Custom SQLite implementation
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom::SQLite
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-138
DBIx-Custom-SQLite/lib/DBIx/Custom/SQLite.pm
... ...
@@ -1,138 +0,0 @@
1
-package DBIx::Custom::SQLite;
2
-use base 'DBIx::Custom::Basic';
3
-
4
-use warnings;
5
-use strict;
6
-use Carp 'croak';
7
-
8
-our $VERSION = '0.0201';
9
-
10
-my $class = __PACKAGE__;
11
-
12
-$class->add_format(
13
-    datetime => $class->formats->{SQL99_datetime},
14
-    date     => $class->formats->{SQL99_date},
15
-    time     => $class->formats->{SQL99_time},
16
-);
17
-
18
-sub connect {
19
-    my $self = shift;
20
-    
21
-    if (!$self->data_source && (my $database = $self->database)) {
22
-        $self->data_source("dbi:SQLite:dbname=$database");
23
-    }
24
-    
25
-    return $self->SUPER::connect;
26
-}
27
-
28
-sub connect_memory {
29
-    my $self = shift;
30
-    
31
-    # Data source for memory database
32
-    $self->data_source('dbi:SQLite:dbname=:memory:');
33
-    
34
-    # Already connected
35
-    croak("Already connected") if $self->connected;
36
-    
37
-    # Connect
38
-    $self->connect;
39
-    
40
-    return $self;
41
-}
42
-
43
-sub reconnect_memory {
44
-    my $self = shift;
45
-
46
-    # Data source for memory database
47
-    $self->data_source('dbi:SQLite:dbname=:memory:');
48
-    
49
-    # Reconnect
50
-    $self->reconnect;
51
-    
52
-    return $self;
53
-}
54
-
55
-
56
-=head1 NAME
57
-
58
-DBIx::Custom::SQLite - DBIx::Custom SQLite implementation
59
-
60
-=head1 Version
61
-
62
-Version 0.0201
63
-
64
-=head1 Synopsys
65
-
66
-    use DBIx::Custom::SQLite;
67
-    
68
-    # New
69
-    my $dbi = DBIx::Custom::SQLite->new(user => 'taro', $password => 'kliej&@K',
70
-                                       database => 'sample.db');
71
-    
72
-    # Insert 
73
-    $dbi->insert('books', {title => 'perl', author => 'taro'});
74
-    
75
-    # Update 
76
-    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
77
-    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
78
-    
79
-    # Delete
80
-    $dbi->delete('books', {author => 'taro'});
81
-    
82
-    # select * from books;
83
-    $dbi->select('books');
84
-    
85
-    # select * from books where ahthor = 'taro'; 
86
-    $dbi->select('books', {author => 'taro'}); 
87
-    
88
-    # select author, title from books where author = 'taro'
89
-    $dbi->select('books', [qw/author title/], {author => 'taro'});
90
-    
91
-    # select author, title from books where author = 'taro' order by id limit 1;
92
-    $dbi->select('books', [qw/author title/], {author => 'taro'},
93
-                 'order by id limit 1');
94
-
95
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation
96
-
97
-This class is L<DBIx::Custom::Basic> subclass.
98
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass
99
-
100
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom>
101
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation
102
-
103
-=head1 Object methods
104
-
105
-=head2 connect
106
-
107
-This override L<DBIx::Custom> connect.
108
-
109
-    # Connect to database
110
-    $dbi->connect;
111
-
112
-If database attribute is set, automatically data source is created and connect
113
-
114
-=head2 connect_memory
115
-
116
-    # Connect memory database
117
-    $self = $dbi->connect_memory;
118
-
119
-=head2 reconnect_memory
120
-
121
-    # Reconnect memory database
122
-    $self = $dbi->reconnect_memory;
123
-
124
-=head1 Author
125
-
126
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
127
-
128
-Github L<http://github.com/yuki-kimoto>
129
-
130
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
131
-
132
-=head1 Copyright & lisence
133
-
134
-Copyright 2009 Yuki Kimoto, all rights reserved.
135
-
136
-This program is free software; you can redistribute it and/or modify it
137
-under the same terms as Perl itself.
138
-
-9
DBIx-Custom-SQLite/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom::SQLite' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom::SQLite $DBIx::Custom::SQLite::VERSION, Perl $], $^X" );
-61
DBIx-Custom-SQLite/t/01-core.t
... ...
@@ -1,61 +0,0 @@
1
-use Test::More 'no_plan';
2
-use strict;
3
-use warnings;
4
-use utf8;
5
-
6
-use DBIx::Custom::SQLite;
7
-
8
-# Function for test name
9
-my $test;
10
-sub test {
11
-    $test = shift;
12
-}
13
-
14
-# Constant varialbes for test
15
-my $CREATE_TABLE = {
16
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
17
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
18
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
19
-};
20
-
21
-
22
-# Variables for tests
23
-my $dbi;
24
-my $ret_val;
25
-my $rows;
26
-my $db_file;
27
-
28
-test 'connect_memory';
29
-$dbi = DBIx::Custom::SQLite->new;
30
-$dbi->connect_memory;
31
-$ret_val = $dbi->do($CREATE_TABLE->{0});
32
-ok(defined $ret_val, $test);
33
-$dbi->utf8_filter_on;
34
-$dbi->insert('table1', {key1 => 'あ', key2 => 2});
35
-$rows = $dbi->select('table1', {key1 => 'あ'})->fetch_hash_all;
36
-is_deeply($rows, [{key1 => 'あ', key2 => 2}], "$test : select rows");
37
-
38
-test 'connect_memory error';
39
-eval{$dbi->connect_memory};
40
-like($@, qr/Already connected/, "$test : already connected");
41
-
42
-test 'reconnect_memory';
43
-$dbi = DBIx::Custom::SQLite->new;
44
-$dbi->reconnect_memory;
45
-$ret_val = $dbi->do($CREATE_TABLE->{0});
46
-ok(defined $ret_val, "$test : connect first");
47
-$dbi->reconnect_memory;
48
-$ret_val = $dbi->do($CREATE_TABLE->{2});
49
-ok(defined $ret_val, "$test : connect first");
50
-
51
-test 'connect';
52
-$db_file  = 't/test.db';
53
-unlink $db_file if -f $db_file;
54
-$dbi = DBIx::Custom::SQLite->new(database => $db_file);
55
-$dbi->connect;
56
-ok(-f $db_file, "$test : database file");
57
-$ret_val = $dbi->do($CREATE_TABLE->{0});
58
-ok(defined $ret_val, "$test : database");
59
-$dbi->disconnect;
60
-unlink $db_file if -f $db_file;
61
-
-82
DBIx-Custom-SQLite/t/02-time_format.t
... ...
@@ -1,82 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require Time::Piece; 1 }
7
-        or plan skip_all => 'Time::Piece required';
8
-    
9
-    plan 'no_plan';
10
-    use_ok('DBIx::Custom');
11
-}
12
-
13
-# Function for test name
14
-my $test;
15
-sub test {
16
-    $test = shift;
17
-}
18
-
19
-# Varialbe for tests
20
-
21
-my $format;
22
-my $data;
23
-my $timepiece;
24
-my $dbi;
25
-
26
-use DBIx::Custom::SQLite;
27
-
28
-
29
-test 'SQL99 format';
30
-$dbi = DBIx::Custom::SQLite->new;
31
-$data   = '2009-01-02 03:04:05';
32
-$format = $dbi->formats->{'SQL99_datetime'};
33
-$timepiece = Time::Piece->strptime($data, $format);
34
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
35
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
36
-
37
-$data   = '2009-01-02';
38
-$format = $dbi->formats->{'SQL99_date'};
39
-$timepiece = Time::Piece->strptime($data, $format);
40
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
41
-
42
-$data   = '03:04:05';
43
-$format = $dbi->formats->{'SQL99_time'};
44
-$timepiece = Time::Piece->strptime($data, $format);
45
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
46
-
47
-
48
-test 'ISO-8601 format';
49
-$data   = '2009-01-02T03:04:05';
50
-$format = $dbi->formats->{'ISO-8601_datetime'};
51
-$timepiece = Time::Piece->strptime($data, $format);
52
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
53
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
54
-
55
-$data   = '2009-01-02';
56
-$format = $dbi->formats->{'ISO-8601_date'};
57
-$timepiece = Time::Piece->strptime($data, $format);
58
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
59
-
60
-$data   = '03:04:05';
61
-$format = $dbi->formats->{'ISO-8601_time'};
62
-$timepiece = Time::Piece->strptime($data, $format);
63
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
64
-
65
-
66
-test 'default format';
67
-$data   = '2009-01-02 03:04:05';
68
-$format = $dbi->formats->{'datetime'};
69
-$timepiece = Time::Piece->strptime($data, $format);
70
-is($timepiece->strftime('%F'), '2009-01-02', "$test : datetime date");
71
-is($timepiece->strftime('%T'), '03:04:05',  "$test : datetime time");
72
-
73
-$data   = '2009-01-02';
74
-$format = $dbi->formats->{'date'};
75
-$timepiece = Time::Piece->strptime($data, $format);
76
-is($timepiece->strftime('%F'), '2009-01-02', "$test : date");
77
-
78
-$data   = '03:04:05';
79
-$format = $dbi->formats->{'time'};
80
-$timepiece = Time::Piece->strptime($data, $format);
81
-is($timepiece->strftime('%T'), '03:04:05',  "$test : time");
82
-
-50
DBIx-Custom-SQLite/t/boilerplate.t
... ...
@@ -1,50 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-  not_in_file_ok(README =>
40
-    "The README is used..."       => qr/The README is used/,
41
-    "'version information here'"  => qr/to provide version information/,
42
-  );
43
-
44
-  not_in_file_ok(Changes =>
45
-    "placeholder date/time"       => qr(Date/time)
46
-  );
47
-
48
-  module_boilerplate_ok('lib/DBIx/Custom/SQLite.pm');
49
-
50
-
-18
DBIx-Custom-SQLite/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom-SQLite/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-11
DBIx-Custom/.gitignore
... ...
@@ -1,11 +0,0 @@
1
-*.bak
2
-*.BAK
3
-Build
4
-MANIFEST
5
-META.yml
6
-Makefile.PL
7
-_build/*
8
-blib/*
9
-*.tar.gz
10
-cover_db/*
11
-*.tmp
-27
DBIx-Custom/Build.PL
... ...
@@ -1,27 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Module::Build;
4
-
5
-my $builder = Module::Build->new(
6
-    module_name         => 'DBIx::Custom',
7
-    license             => 'perl',
8
-    dist_author         => 'Yuki Kimoto <kimoto.yuki@gmail.com>',
9
-    dist_version_from   => 'lib/DBIx/Custom.pm',
10
-    build_requires => {
11
-        'Test::More' => 0,
12
-    },
13
-    recommends => {
14
-        'DBD::SQLite' => '1.25'
15
-    },
16
-    requires => {
17
-        'Object::Simple' => 2.0702,
18
-        'DBI'            => 1.605,
19
-        'DBIx::Custom::Query' => 0.0101,
20
-        'DBIx::Custom::Result' => 0.0101,
21
-        'DBIx::Custom::SQL::Template' => 0.0101
22
-    },
23
-    add_to_cleanup      => [ 'DBIx-Custom-*' ],
24
-    create_makefile_pl => 'traditional',
25
-);
26
-
27
-$builder->create_build_script();
-9
DBIx-Custom/Changes
... ...
@@ -1,9 +0,0 @@
1
-0.0401
2
-  catch up with DBIx::Custom::Result version up
3
-0.0301
4
-  exchange filter argument 'key', 'value' (not backword compatible)
5
-0.0201
6
-  rename tranzaction to transaction
7
-  add filter_off
8
-0.0101
9
-  First release
-15
DBIx-Custom/MANIFEST.SKIP
... ...
@@ -1,15 +0,0 @@
1
-\bRCS\b
2
-\bCVS\b
3
-^MANIFEST\.
4
-^Makefile$
5
-^Build$
6
-^Build.bat$
7
-^_build/
8
-\.(bak|tdy|old|tmp)$
9
-~$
10
-^blib/
11
-^pm_to_blib
12
-\.cvsignore
13
-\.gz$
14
-^\.git
15
-^cover_db/
-15
DBIx-Custom/README
... ...
@@ -1,15 +0,0 @@
1
-DBIx-Custom
2
-
3
-Custamizable DBI
4
-
5
-INSTALLATION
6
-
7
-cpan DBIx::Custom
8
-
9
-COPYRIGHT AND LICENCE
10
-
11
-Copyright (C) 2009 Yuki Kimoto
12
-
13
-This program is free software; you can redistribute it and/or modify it
14
-under the same terms as Perl itself.
15
-
-1125
DBIx-Custom/lib/DBIx/Custom.pm
... ...
@@ -1,1125 +0,0 @@
1
-package DBIx::Custom;
2
-use Object::Simple;
3
-
4
-our $VERSION = '0.0401';
5
-
6
-use Carp 'croak';
7
-use DBI;
8
-use DBIx::Custom::Query;
9
-use DBIx::Custom::Result;
10
-use DBIx::Custom::SQL::Template;
11
-
12
-
13
-### Class-Object Accessors
14
-sub user        : ClassObjectAttr { initialize => {clone => 'scalar'} }
15
-sub password    : ClassObjectAttr { initialize => {clone => 'scalar'} }
16
-sub data_source : ClassObjectAttr { initialize => {clone => 'scalar'} }
17
-sub dbi_options : ClassObjectAttr { initialize => {clone => 'hash', 
18
-                                                   default => sub { {} } } }
19
-sub database    : ClassObjectAttr { initialize => {clone => 'scalar'} }
20
-
21
-sub bind_filter  : ClassObjectAttr { initialize => {clone => 'scalar'} }
22
-sub fetch_filter : ClassObjectAttr { initialize => {clone => 'scalar'} }
23
-
24
-sub no_bind_filters   : ClassObjectAttr { initialize => {clone => 'array'} }
25
-sub no_fetch_filters  : ClassObjectAttr { initialize => {clone => 'array'} }
26
-
27
-sub filters : ClassObjectAttr {
28
-    type => 'hash',
29
-    deref => 1,
30
-    initialize => {
31
-        clone   => 'hash',
32
-        default => sub { {} }
33
-    }
34
-}
35
-
36
-sub formats : ClassObjectAttr {
37
-    type => 'hash',
38
-    deref => 1,
39
-    initialize => {
40
-        clone   => 'hash',
41
-        default => sub { {} }
42
-    }
43
-}
44
-
45
-sub result_class : ClassObjectAttr {
46
-    initialize => {
47
-        clone   => 'scalar',
48
-        default => 'DBIx::Custom::Result'
49
-    }
50
-}
51
-
52
-sub sql_template : ClassObjectAttr {
53
-    initialize => {
54
-        clone   => sub {$_[0] ? $_[0]->clone : undef},
55
-        default => sub {DBIx::Custom::SQL::Template->new}
56
-    }
57
-}
58
-
59
-### Object Accessor
60
-sub dbh          : Attr {}
61
-
62
-
63
-### Methods
64
-
65
-# Add filter
66
-sub add_filter {
67
-    my $invocant = shift;
68
-    
69
-    my %old_filters = $invocant->filters;
70
-    my %new_filters = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
71
-    $invocant->filters(%old_filters, %new_filters);
72
-    return $invocant;
73
-}
74
-
75
-# Add format
76
-sub add_format{
77
-    my $invocant = shift;
78
-    
79
-    my %old_formats = $invocant->formats;
80
-    my %new_formats = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
81
-    $invocant->formats(%old_formats, %new_formats);
82
-    return $invocant;
83
-}
84
-
85
-# Auto commit
86
-sub _auto_commit {
87
-    my $self = shift;
88
-    
89
-    croak("Not yet connect to database") unless $self->dbh;
90
-    
91
-    if (@_) {
92
-        $self->dbh->{AutoCommit} = $_[0];
93
-        return $self;
94
-    }
95
-    return $self->dbh->{AutoCommit};
96
-}
97
-
98
-# Connect
99
-sub connect {
100
-    my $self = shift;
101
-    my $data_source = $self->data_source;
102
-    my $user        = $self->user;
103
-    my $password    = $self->password;
104
-    my $dbi_options  = $self->dbi_options;
105
-    
106
-    my $dbh = eval{DBI->connect(
107
-        $data_source,
108
-        $user,
109
-        $password,
110
-        {
111
-            RaiseError => 1,
112
-            PrintError => 0,
113
-            AutoCommit => 1,
114
-            %{$dbi_options || {} }
115
-        }
116
-    )};
117
-    
118
-    croak $@ if $@;
119
-    
120
-    $self->dbh($dbh);
121
-    return $self;
122
-}
123
-
124
-# DESTROY
125
-sub DESTROY {
126
-    my $self = shift;
127
-    $self->disconnect if $self->connected;
128
-}
129
-
130
-# Is connected?
131
-sub connected {
132
-    my $self = shift;
133
-    return ref $self->{dbh} eq 'DBI::db';
134
-}
135
-
136
-# Disconnect
137
-sub disconnect {
138
-    my $self = shift;
139
-    if ($self->connected) {
140
-        $self->dbh->disconnect;
141
-        delete $self->{dbh};
142
-    }
143
-}
144
-
145
-# Reconnect
146
-sub reconnect {
147
-    my $self = shift;
148
-    $self->disconnect if $self->connected;
149
-    $self->connect;
150
-}
151
-
152
-# Prepare statement handle
153
-sub prepare {
154
-    my ($self, $sql) = @_;
155
-    
156
-    # Connect if not
157
-    $self->connect unless $self->connected;
158
-    
159
-    # Prepare
160
-    my $sth = eval{$self->dbh->prepare($sql)};
161
-    
162
-    # Error
163
-    croak("$@<Your SQL>\n$sql") if $@;
164
-    
165
-    return $sth;
166
-}
167
-
168
-# Execute SQL directly
169
-sub do{
170
-    my ($self, $sql, @bind_values) = @_;
171
-    
172
-    # Connect if not
173
-    $self->connect unless $self->connected;
174
-    
175
-    # Do
176
-    my $ret_val = eval{$self->dbh->do($sql, @bind_values)};
177
-    
178
-    # Error
179
-    if ($@) {
180
-        my $error = $@;
181
-        require Data::Dumper;
182
-        
183
-        my $bind_value_dump
184
-          = Data::Dumper->Dump([\@bind_values], ['*bind_valuds']);
185
-        
186
-        croak("$error<Your SQL>\n$sql\n<Your bind values>\n$bind_value_dump\n");
187
-    }
188
-}
189
-
190
-# Create query
191
-sub create_query {
192
-    my ($self, $template) = @_;
193
-    my $class = ref $self;
194
-    
195
-    # Create query from SQL template
196
-    my $sql_template = $self->sql_template;
197
-    
198
-    # Try to get cached query
199
-    my $query = $class->_query_caches->{$template};
200
-    
201
-    # Create query
202
-    unless ($query) {
203
-        $query = eval{$sql_template->create_query($template)};
204
-        croak($@) if $@;
205
-        
206
-        $query = DBIx::Custom::Query->new($query);
207
-        
208
-        $class->_add_query_cache($template, $query);
209
-    }
210
-    
211
-    # Connect if not
212
-    $self->connect unless $self->connected;
213
-    
214
-    # Prepare statement handle
215
-    my $sth = $self->prepare($query->{sql});
216
-    
217
-    # Set statement handle
218
-    $query->sth($sth);
219
-    
220
-    # Set bind filter
221
-    $query->bind_filter($self->bind_filter);
222
-    
223
-    # Set no filter keys when binding
224
-    $query->no_bind_filters($self->no_bind_filters);
225
-    
226
-    # Set fetch filter
227
-    $query->fetch_filter($self->fetch_filter);
228
-    
229
-    # Set no filter keys when fetching
230
-    $query->no_fetch_filters($self->no_fetch_filters);
231
-    
232
-    return $query;
233
-}
234
-
235
-# Execute query
236
-sub execute {
237
-    my ($self, $query, $params)  = @_;
238
-    $params ||= {};
239
-    
240
-    # First argument is SQL template
241
-    if (!ref $query) {
242
-        my $template = $query;
243
-        $query = $self->create_query($template);
244
-        my $query_edit_cb = $_[3];
245
-        $query_edit_cb->($query) if ref $query_edit_cb eq 'CODE';
246
-    }
247
-    
248
-    # Create bind value
249
-    my $bind_values = $self->_build_bind_values($query, $params);
250
-    
251
-    # Execute
252
-    my $sth = $query->sth;
253
-    my $ret_val = eval{$sth->execute(@$bind_values)};
254
-    
255
-    # Execute error
256
-    if (my $execute_error = $@) {
257
-        require Data::Dumper;
258
-        my $sql              = $query->{sql} || '';
259
-        my $key_infos_dump   = Data::Dumper->Dump([$query->key_infos], ['*key_infos']);
260
-        my $params_dump      = Data::Dumper->Dump([$params], ['*params']);
261
-        
262
-        croak("$execute_error" . 
263
-              "<Your SQL>\n$sql\n" . 
264
-              "<Your parameters>\n$params_dump");
265
-    }
266
-    
267
-    # Return resultset if select statement is executed
268
-    if ($sth->{NUM_OF_FIELDS}) {
269
-        
270
-        # Get result class
271
-        my $result_class = $self->result_class;
272
-        
273
-        # Create result
274
-        my $result = $result_class->new({
275
-            sth              => $sth,
276
-            fetch_filter     => $query->fetch_filter,
277
-            no_fetch_filters => $query->no_fetch_filters
278
-        });
279
-        return $result;
280
-    }
281
-    return $ret_val;
282
-}
283
-
284
-# Build binding values
285
-sub _build_bind_values {
286
-    my ($self, $query, $params) = @_;
287
-    my $key_infos           = $query->key_infos;
288
-    my $bind_filter         = $query->bind_filter;
289
-    my $no_bind_filters_map = $query->_no_bind_filters_map || {};
290
-    
291
-    # binding values
292
-    my @bind_values;
293
-    
294
-    # Create bind values
295
-    KEY_INFOS :
296
-    foreach my $key_info (@$key_infos) {
297
-        # Set variable
298
-        my $access_keys  = $key_info->{access_keys};
299
-        my $original_key = $key_info->{original_key} || '';
300
-        my $table        = $key_info->{table}        || '';
301
-        my $column       = $key_info->{column}       || '';
302
-        
303
-        # Key is found?
304
-        my $found;
305
-        
306
-        # Build bind values
307
-        ACCESS_KEYS :
308
-        foreach my $access_key (@$access_keys) {
309
-            # Root parameter
310
-            my $root_params = $params;
311
-            
312
-            # Search corresponding value
313
-            for (my $i = 0; $i < @$access_key; $i++) {
314
-                # Current key
315
-                my $current_key = $access_key->[$i];
316
-                
317
-                # Last key
318
-                if ($i == @$access_key - 1) {
319
-                    # Key is array reference
320
-                    if (ref $current_key eq 'ARRAY') {
321
-                        # Filtering 
322
-                        if ($bind_filter &&
323
-                            !$no_bind_filters_map->{$original_key})
324
-                        {
325
-                            push @bind_values, 
326
-                                 $bind_filter->($root_params->[$current_key->[0]], 
327
-                                                $original_key,
328
-                                                $table, $column);
329
-                        }
330
-                        # Not filtering
331
-                        else {
332
-                            push @bind_values,
333
-                                 scalar $root_params->[$current_key->[0]];
334
-                        }
335
-                    }
336
-                    # Key is string
337
-                    else {
338
-                        # Key is not found
339
-                        next ACCESS_KEYS
340
-                          unless exists $root_params->{$current_key};
341
-                        
342
-                        # Filtering
343
-                        if ($bind_filter &&
344
-                            !$no_bind_filters_map->{$original_key}) 
345
-                        {
346
-                            push @bind_values,
347
-                                 $bind_filter->($root_params->{$current_key},
348
-                                                $original_key,
349
-                                                $table, $column);
350
-                        }
351
-                        # Not filtering
352
-                        else {
353
-                            push @bind_values,
354
-                                 scalar $root_params->{$current_key};
355
-                        }
356
-                    }
357
-                    
358
-                    # Key is found
359
-                    $found = 1;
360
-                    next KEY_INFOS;
361
-                }
362
-                # First or middle key
363
-                else {
364
-                    # Key is array reference
365
-                    if (ref $current_key eq 'ARRAY') {
366
-                        # Go next key
367
-                        $root_params = $root_params->[$current_key->[0]];
368
-                    }
369
-                    # Key is string
370
-                    else {
371
-                        # Not found
372
-                        next ACCESS_KEYS
373
-                          unless exists $root_params->{$current_key};
374
-                        
375
-                        # Go next key
376
-                        $root_params = $root_params->{$current_key};
377
-                    }
378
-                }
379
-            }
380
-        }
381
-        
382
-        # Key is not found
383
-        unless ($found) {
384
-            require Data::Dumper;
385
-            my $key_info_dump  = Data::Dumper->Dump([$key_info], ['*key_info']);
386
-            my $params_dump    = Data::Dumper->Dump([$params], ['*params']);
387
-            croak("Corresponding key is not found in your parameters\n" . 
388
-                  "<Key information>\n$key_info_dump\n\n" .
389
-                  "<Your parameters>\n$params_dump\n");
390
-        }
391
-    }
392
-    return \@bind_values;
393
-}
394
-
395
-# Run transaction
396
-sub run_transaction {
397
-    my ($self, $transaction) = @_;
398
-    
399
-    # Check auto commit
400
-    croak("AutoCommit must be true before transaction start")
401
-      unless $self->_auto_commit;
402
-    
403
-    # Auto commit off
404
-    $self->_auto_commit(0);
405
-    
406
-    # Run transaction
407
-    eval {$transaction->()};
408
-    
409
-    # Tranzaction error
410
-    my $transaction_error = $@;
411
-    
412
-    # Tranzaction is failed.
413
-    if ($transaction_error) {
414
-        # Rollback
415
-        eval{$self->dbh->rollback};
416
-        
417
-        # Rollback error
418
-        my $rollback_error = $@;
419
-        
420
-        # Auto commit on
421
-        $self->_auto_commit(1);
422
-        
423
-        if ($rollback_error) {
424
-            # Rollback is failed
425
-            croak("${transaction_error}Rollback is failed : $rollback_error");
426
-        }
427
-        else {
428
-            # Rollback is success
429
-            croak("${transaction_error}Rollback is success");
430
-        }
431
-    }
432
-    # Tranzaction is success
433
-    else {
434
-        # Commit
435
-        eval{$self->dbh->commit};
436
-        my $commit_error = $@;
437
-        
438
-        # Auto commit on
439
-        $self->_auto_commit(1);
440
-        
441
-        # Commit is failed
442
-        croak($commit_error) if $commit_error;
443
-    }
444
-}
445
-
446
-# Get last insert id
447
-sub last_insert_id {
448
-    my $self = shift;
449
-    
450
-    # Not connected
451
-    croak("Not yet connect to database")
452
-      unless $self->connected;
453
-    
454
-    return $self->dbh->last_insert_id(@_);
455
-}
456
-
457
-# Insert
458
-sub insert {
459
-    my ($self, $table, $insert_params, $query_edit_cb) = @_;
460
-    $table         ||= '';
461
-    $insert_params ||= {};
462
-    
463
-    # Insert keys
464
-    my @insert_keys = keys %$insert_params;
465
-    
466
-    # Not exists insert keys
467
-    croak("Key-value pairs for insert must be specified to 'insert' second argument")
468
-      unless @insert_keys;
469
-    
470
-    # Templte for insert
471
-    my $template = "insert into $table {insert " . join(' ', @insert_keys) . '}';
472
-    
473
-    # Create query
474
-    my $query = $self->create_query($template);
475
-    
476
-    # Query edit callback must be code reference
477
-    croak("Query edit callback must be code reference")
478
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
479
-    
480
-    # Query edit if need
481
-    $query_edit_cb->($query) if $query_edit_cb;
482
-    
483
-    # Execute query
484
-    my $ret_val = $self->execute($query, $insert_params);
485
-    
486
-    return $ret_val;
487
-}
488
-
489
-# Update
490
-sub update {
491
-    my ($self, $table, $update_params,
492
-        $where_params, $query_edit_cb, $options) = @_;
493
-    
494
-    $table         ||= '';
495
-    $update_params ||= {};
496
-    $where_params  ||= {};
497
-    
498
-    # Update keys
499
-    my @update_keys = keys %$update_params;
500
-    
501
-    # Not exists update kyes
502
-    croak("Key-value pairs for update must be specified to 'update' second argument")
503
-      unless @update_keys;
504
-    
505
-    # Where keys
506
-    my @where_keys = keys %$where_params;
507
-    
508
-    # Not exists where keys
509
-    croak("Key-value pairs for where clause must be specified to 'update' third argument")
510
-      if !@where_keys && !$options->{allow_update_all};
511
-    
512
-    # Update clause
513
-    my $update_clause = '{update ' . join(' ', @update_keys) . '}';
514
-    
515
-    # Where clause
516
-    my $where_clause = '';
517
-    if (@where_keys) {
518
-        $where_clause = 'where ';
519
-        foreach my $where_key (@where_keys) {
520
-            $where_clause .= "{= $where_key} and ";
521
-        }
522
-        $where_clause =~ s/ and $//;
523
-    }
524
-    
525
-    # Template for update
526
-    my $template = "update $table $update_clause $where_clause";
527
-    
528
-    # Create query
529
-    my $query = $self->create_query($template);
530
-    
531
-    # Query edit callback must be code reference
532
-    croak("Query edit callback must be code reference")
533
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
534
-    
535
-    # Query edit if need
536
-    $query_edit_cb->($query) if $query_edit_cb;
537
-    
538
-    # Rearrange parammeters
539
-    my $params = {'#update' => $update_params, %$where_params};
540
-    
541
-    # Execute query
542
-    my $ret_val = $self->execute($query, $params);
543
-    
544
-    return $ret_val;
545
-}
546
-
547
-# Update all rows
548
-sub update_all {
549
-    my ($self, $table, $update_params, $query_edit_cb) = @_;
550
-    
551
-    return $self->update($table, $update_params, {}, $query_edit_cb,
552
-                         {allow_update_all => 1});
553
-}
554
-
555
-# Delete
556
-sub delete {
557
-    my ($self, $table, $where_params, $query_edit_cb, $options) = @_;
558
-    $table        ||= '';
559
-    $where_params ||= {};
560
-    
561
-    # Where keys
562
-    my @where_keys = keys %$where_params;
563
-    
564
-    # Not exists where keys
565
-    croak("Key-value pairs for where clause must be specified to 'delete' second argument")
566
-      if !@where_keys && !$options->{allow_delete_all};
567
-    
568
-    # Where clause
569
-    my $where_clause = '';
570
-    if (@where_keys) {
571
-        $where_clause = 'where ';
572
-        foreach my $where_key (@where_keys) {
573
-            $where_clause .= "{= $where_key} and ";
574
-        }
575
-        $where_clause =~ s/ and $//;
576
-    }
577
-    
578
-    # Template for delete
579
-    my $template = "delete from $table $where_clause";
580
-    
581
-    # Create query
582
-    my $query = $self->create_query($template);
583
-    
584
-    # Query edit callback must be code reference
585
-    croak("Query edit callback must be code reference")
586
-      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
587
-    
588
-    # Query edit if need
589
-    $query_edit_cb->($query) if $query_edit_cb;
590
-    
591
-    # Execute query
592
-    my $ret_val = $self->execute($query, $where_params);
593
-    
594
-    return $ret_val;
595
-}
596
-
597
-# Delete all rows
598
-sub delete_all {
599
-    my ($self, $table) = @_;
600
-    return $self->delete($table, {}, undef, {allow_delete_all => 1});
601
-}
602
-
603
-sub _select_usage { return << 'EOS' }
604
-Your select arguments is wrong.
605
-select usage:
606
-$dbi->select(
607
-    $table,                # must be string or array ref
608
-    [@$columns],           # must be array reference. this is optional
609
-    {%$where_params},      # must be hash reference.  this is optional
610
-    $append_statement,     # must be string.          this is optional
611
-    $query_edit_callback   # must be code reference.  this is optional
612
-);
613
-EOS
614
-
615
-sub select {
616
-    my $self = shift;
617
-    
618
-    # Check argument
619
-    croak($self->_select_usage) unless @_;
620
-    
621
-    # Arguments
622
-    my $tables = shift || '';
623
-    $tables    = [$tables] unless ref $tables;
624
-    
625
-    my $columns          = ref $_[0] eq 'ARRAY' ? shift : [];
626
-    my $where_params     = ref $_[0] eq 'HASH'  ? shift : {};
627
-    my $append_statement = $_[0] && !ref $_[0]  ? shift : '';
628
-    my $query_edit_cb    = shift if ref $_[0] eq 'CODE';
629
-    
630
-    # Check rest argument
631
-    croak($self->_select_usage) if @_;
632
-    
633
-    # SQL template for select statement
634
-    my $template = 'select ';
635
-    
636
-    # Join column clause
637
-    if (@$columns) {
638
-        foreach my $column (@$columns) {
639
-            $template .= "$column, ";
640
-        }
641
-        $template =~ s/, $/ /;
642
-    }
643
-    else {
644
-        $template .= '* ';
645
-    }
646
-    
647
-    # Join table
648
-    $template .= 'from ';
649
-    foreach my $table (@$tables) {
650
-        $template .= "$table, ";
651
-    }
652
-    $template =~ s/, $/ /;
653
-    
654
-    # Where clause keys
655
-    my @where_keys = keys %$where_params;
656
-    
657
-    # Join where clause
658
-    if (@where_keys) {
659
-        $template .= 'where ';
660
-        foreach my $where_key (@where_keys) {
661
-            $template .= "{= $where_key} and ";
662
-        }
663
-    }
664
-    $template =~ s/ and $//;
665
-    
666
-    # Append something to last of statement
667
-    if ($append_statement =~ s/^where //) {
668
-        if (@where_keys) {
669
-            $template .= " and $append_statement";
670
-        }
671
-        else {
672
-            $template .= " where $append_statement";
673
-        }
674
-    }
675
-    else {
676
-        $template .= " $append_statement";
677
-    }
678
-    
679
-    # Create query
680
-    my $query = $self->create_query($template);
681
-    
682
-    # Query edit
683
-    $query_edit_cb->($query) if $query_edit_cb;
684
-    
685
-    # Execute query
686
-    my $result = $self->execute($query, $where_params);
687
-    
688
-    return $result;
689
-}
690
-
691
-sub _query_caches     : ClassAttr { type => 'hash',
692
-                                    auto_build => sub {shift->_query_caches({}) } }
693
-                                    
694
-sub _query_cache_keys : ClassAttr { type => 'array',
695
-                                    auto_build => sub {shift->_query_cache_keys([])} }
696
-                                    
697
-sub query_cache_max   : ClassAttr { auto_build => sub {shift->query_cache_max(50)} }
698
-
699
-# Add query cahce
700
-sub _add_query_cache {
701
-    my ($class, $template, $query) = @_;
702
-    my $query_cache_keys = $class->_query_cache_keys;
703
-    my $query_caches     = $class->_query_caches;
704
-    
705
-    return $class if $query_caches->{$template};
706
-    
707
-    $query_caches->{$template} = $query;
708
-    push @$query_cache_keys, $template;
709
-    
710
-    my $overflow = @$query_cache_keys - $class->query_cache_max;
711
-    
712
-    for (my $i = 0; $i < $overflow; $i++) {
713
-        my $template = shift @$query_cache_keys;
714
-        delete $query_caches->{$template};
715
-    }
716
-    
717
-    return $class;
718
-}
719
-
720
-# Both bind_filter and fetch_filter off
721
-sub filter_off {
722
-    my $self = shift;
723
-    
724
-    # filter off
725
-    $self->bind_filter(undef);
726
-    $self->fetch_filter(undef);
727
-    
728
-    return $self;
729
-}
730
-
731
-Object::Simple->build_class;
732
-
733
-=head1 NAME
734
-
735
-DBIx::Custom - Customizable simple DBI
736
-
737
-=head1 VERSION
738
-
739
-Version 0.0401
740
-
741
-=head1 CAUTION
742
-
743
-This module is now experimental stage.
744
-
745
-I want you to try this module
746
-because I want this module stable, and not to damage your DB data by this module bug.
747
-
748
-Please tell me bug if you find
749
-
750
-=head1 SYNOPSIS
751
-
752
-  my $dbi = DBIx::Custom->new;
753
-  
754
-  my $query = $dbi->create_query($template);
755
-  $dbi->execute($query);
756
-
757
-=head1 CLASS-OBJECT ACCESSORS
758
-
759
-=head2 user
760
-
761
-    # Set and get database user name
762
-    $self = $dbi->user($user);
763
-    $user = $dbi->user;
764
-    
765
-    # Sample
766
-    $dbi->user('taro');
767
-
768
-=head2 password
769
-
770
-    # Set and get database password
771
-    $self     = $dbi->password($password);
772
-    $password = $dbi->password;
773
-    
774
-    # Sample
775
-    $dbi->password('lkj&le`@s');
776
-
777
-=head2 data_source
778
-
779
-    # Set and get database data source
780
-    $self        = $dbi->data_source($data_soruce);
781
-    $data_source = $dbi->data_source;
782
-    
783
-    # Sample(SQLite)
784
-    $dbi->data_source(dbi:SQLite:dbname=$database);
785
-    
786
-    # Sample(MySQL);
787
-    $dbi->data_source("dbi:mysql:dbname=$database");
788
-    
789
-    # Sample(PostgreSQL)
790
-    $dbi->data_source("dbi:Pg:dbname=$database");
791
-    
792
-=head2 database
793
-
794
-    # Set and get database name
795
-    $self     = $dbi->database($database);
796
-    $database = $dbi->database;
797
-
798
-This method will be used in subclass connect method.
799
-
800
-=head2 dbi_options
801
-
802
-    # Set and get DBI option
803
-    $self       = $dbi->dbi_options({$options => $value, ...});
804
-    $dbi_options = $dbi->dbi_options;
805
-
806
-    # Sample
807
-    $dbi->dbi_options({PrintError => 0, RaiseError => 1});
808
-
809
-dbi_options is used when you connect database by using connect.
810
-
811
-=head2 prepare
812
-
813
-    $sth = $dbi->prepare($sql);
814
-
815
-This method is same as DBI::prepare
816
-
817
-=head2 do
818
-
819
-    $dbi->do($sql, @bind_values);
820
-
821
-This method is same as DBI::do
822
-
823
-=head2 sql_template
824
-
825
-    # Set and get SQL::Template object
826
-    $self         = $dbi->sql_template($sql_template);
827
-    $sql_template = $dbi->sql_template;
828
-    
829
-    # Sample
830
-    $dbi->sql_template(DBI::Cutom::SQL::Template->new);
831
-
832
-=head2 filters
833
-
834
-    # Set and get filters
835
-    $self    = $dbi->filters($filters);
836
-    $filters = $dbi->filters;
837
-
838
-=head2 formats
839
-
840
-    # Set and get formats
841
-    $self    = $dbi->formats($formats);
842
-    $formats = $dbi->formats;
843
-    
844
-=head2 bind_filter
845
-
846
-    # Set and get binding filter
847
-    $self        = $dbi->bind_filter($bind_filter);
848
-    $bind_filter = $dbi->bind_filter
849
-
850
-    # Sample
851
-    $dbi->bind_filter($self->filters->{default_bind_filter});
852
-    
853
-
854
-you can get DBI database handle if you need.
855
-
856
-=head2 fetch_filter
857
-
858
-    # Set and get Fetch filter
859
-    $self         = $dbi->fetch_filter($fetch_filter);
860
-    $fetch_filter = $dbi->fetch_filter;
861
-
862
-    # Sample
863
-    $dbi->fetch_filter($self->filters->{default_fetch_filter});
864
-
865
-=head2 no_bind_filters
866
-
867
-    # Set and get no filter keys when binding
868
-    $self            = $dbi->no_bind_filters($no_bind_filters);
869
-    $no_bind_filters = $dbi->no_bind_filters;
870
-
871
-=head2 no_fetch_filters
872
-
873
-    # Set and get no filter keys when fetching
874
-    $self             = $dbi->no_fetch_filters($no_fetch_filters);
875
-    $no_fetch_filters = $dbi->no_fetch_filters;
876
-
877
-=head2 result_class
878
-
879
-    # Set and get resultset class
880
-    $self         = $dbi->result_class($result_class);
881
-    $result_class = $dbi->result_class;
882
-    
883
-    # Sample
884
-    $dbi->result_class('DBIx::Custom::Result');
885
-
886
-=head2 dbh
887
-
888
-    # Get database handle
889
-    $dbh = $self->dbh;
890
-
891
-=head1 METHODS
892
-
893
-=head2 connect
894
-
895
-    # Connect to database
896
-    $self = $dbi->connect;
897
-    
898
-    # Sample
899
-    $dbi = DBIx::Custom->new(user => 'taro', password => 'lji8(', 
900
-                            data_soruce => "dbi:mysql:dbname=$database");
901
-    $dbi->connect;
902
-
903
-=head2 disconnect
904
-
905
-    # Disconnect database
906
-    $dbi->disconnect;
907
-
908
-If database is already disconnected, this method do noting.
909
-
910
-=head2 reconnect
911
-
912
-    # Reconnect
913
-    $dbi->reconnect;
914
-
915
-=head2 connected
916
-
917
-    # Check connected
918
-    $dbi->connected
919
-    
920
-=head2 filter_off
921
-
922
-    # bind_filter and fitch_filter off
923
-    $self->filter_off;
924
-    
925
-This is equeal to
926
-    
927
-    $self->bind_filter(undef);
928
-    $self->fetch_filter(undef);
929
-
930
-=head2 add_filter
931
-
932
-    # Add filter (hash ref or hash can be recieve)
933
-    $self = $dbi->add_filter({$filter_name => $filter, ...});
934
-    $self = $dbi->add_filter($filetr_name => $filter, ...);
935
-    
936
-    # Sample
937
-    $dbi->add_filter(
938
-        decode_utf8 => sub {
939
-            my ($key, $value, $table, $column) = @_;
940
-            return Encode::decode('UTF-8', $value);
941
-        },
942
-        datetime_to_string => sub {
943
-            my ($key, $value, $table, $column) = @_;
944
-            return $value->strftime('%Y-%m-%d %H:%M:%S')
945
-        },
946
-        default_bind_filter => sub {
947
-            my ($key, $value, $table, $column) = @_;
948
-            if (ref $value eq 'Time::Piece') {
949
-                return $dbi->filters->{datetime_to_string}->($value);
950
-            }
951
-            else {
952
-                return $dbi->filters->{decode_utf8}->($value);
953
-            }
954
-        },
955
-        
956
-        encode_utf8 => sub {
957
-            my ($key, $value) = @_;
958
-            return Encode::encode('UTF-8', $value);
959
-        },
960
-        string_to_datetime => sub {
961
-            my ($key, $value) = @_;
962
-            return DateTime::Format::MySQL->parse_datetime($value);
963
-        },
964
-        default_fetch_filter => sub {
965
-            my ($key, $value, $type, $sth, $i) = @_;
966
-            if ($type eq 'DATETIME') {
967
-                return $dbi->filters->{string_to_datetime}->($value);
968
-            }
969
-            else {
970
-                return $dbi->filters->{encode_utf8}->($value);
971
-            }
972
-        }
973
-    );
974
-
975
-add_filter add filter to filters
976
-
977
-=head2 add_format
978
-
979
-    $dbi->add_format(date => '%Y:%m:%d');
980
-
981
-=head2 create_query
982
-    
983
-    # Create Query object from SQL template
984
-    my $query = $dbi->create_query($template);
985
-    
986
-=head2 execute
987
-
988
-    # Parse SQL template and execute SQL
989
-    $result = $dbi->query($query, $params);
990
-    $result = $dbi->query($template, $params); # Shorcut
991
-    
992
-    # Sample
993
-    $result = $dbi->query("select * from authors where {= name} and {= age}", 
994
-                          {author => 'taro', age => 19});
995
-    
996
-    while (my @row = $result->fetch) {
997
-        # do something
998
-    }
999
-
1000
-See also L<DBIx::Custom::SQL::Template>
1001
-
1002
-=head2 run_transaction
1003
-
1004
-    # Run transaction
1005
-    $dbi->run_transaction(sub {
1006
-        # do something
1007
-    });
1008
-
1009
-If transaction is success, commit is execute. 
1010
-If tranzation is died, rollback is execute.
1011
-
1012
-=head2 insert
1013
-
1014
-    # Insert
1015
-    $dbi->insert($table, $insert_values);
1016
-    
1017
-    # Sample
1018
-    $dbi->insert('books', {title => 'Perl', author => 'Taro'});
1019
-
1020
-=head2 update
1021
-
1022
-    # Update
1023
-    $dbi->update($table, $update_values, $where);
1024
-    
1025
-    # Sample
1026
-    $dbi->update('books', {title => 'Perl', author => 'Taro'}, {id => 5});
1027
-
1028
-=head2 update_all
1029
-
1030
-    # Update all rows
1031
-    $dbi->update($table, $updat_values);
1032
-
1033
-=head2 delete
1034
-
1035
-    # Delete
1036
-    $dbi->delete($table, $where);
1037
-    
1038
-    # Sample
1039
-    $dbi->delete('Books', {id => 5});
1040
-
1041
-=head2 delete_all
1042
-
1043
-    # Delete all rows
1044
-    $dbi->delete_all($table);
1045
-
1046
-=head2 last_insert_id
1047
-
1048
-    # Get last insert id
1049
-    $last_insert_id = $dbi->last_insert_id;
1050
-    
1051
-This method is same as DBI last_insert_id;
1052
-
1053
-=head2 select
1054
-    
1055
-    # Select
1056
-    $dbi->select(
1057
-        $table,                # must be string or array;
1058
-        [@$columns],           # must be array reference. this is optional
1059
-        {%$where_params},      # must be hash reference.  this is optional
1060
-        $append_statement,     # must be string.          this is optional
1061
-        $query_edit_callback   # must be code reference.  this is optional
1062
-    );
1063
-    
1064
-    # Sample
1065
-    $dbi->select(
1066
-        'Books',
1067
-        ['title', 'author'],
1068
-        {id => 1},
1069
-        "for update",
1070
-        sub {
1071
-            my $query = shift;
1072
-            $query->bind_filter(sub {
1073
-                # ...
1074
-            });
1075
-        }
1076
-    );
1077
-    
1078
-    # The way to join multi tables
1079
-    $dbi->select(
1080
-        ['table1', 'table2'],
1081
-        ['table1.id as table1_id', 'title'],
1082
-        {table1.id => 1},
1083
-        "where table1.id = table2.id",
1084
-    );
1085
-
1086
-=head1 Class Accessors
1087
-
1088
-=head2 query_cache_max
1089
-
1090
-    # Max query cache count
1091
-    $class           = $class->query_cache_max($query_cache_max);
1092
-    $query_cache_max = $class->query_cache_max;
1093
-    
1094
-    # Sample
1095
-    DBIx::Custom->query_cache_max(50);
1096
-
1097
-=head1 CAUTION
1098
-
1099
-DBIx::Custom have DIB object internal.
1100
-This module is work well in the following DBI condition.
1101
-
1102
-    1. AutoCommit is true
1103
-    2. RaiseError is true
1104
-
1105
-By default, Both AutoCommit and RaiseError is true.
1106
-You must not change these mode not to damage your data.
1107
-
1108
-If you change these mode, 
1109
-you cannot get correct error message, 
1110
-or run_transaction may fail.
1111
-
1112
-=head1 AUTHOR
1113
-
1114
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
1115
-
1116
-Github L<http://github.com/yuki-kimoto>
1117
-
1118
-=head1 COPYRIGHT & LICENSE
1119
-
1120
-Copyright 2009 Yuki Kimoto, all rights reserved.
1121
-
1122
-This program is free software; you can redistribute it and/or modify it
1123
-under the same terms as Perl itself.
1124
-
1125
-=cut
-9
DBIx-Custom/t/00-load.t
... ...
@@ -1,9 +0,0 @@
1
-#!perl -T
2
-
3
-use Test::More tests => 1;
4
-
5
-BEGIN {
6
-	use_ok( 'DBIx::Custom' );
7
-}
8
-
9
-diag( "Testing DBIx::Custom $DBIx::Custom::VERSION, Perl $], $^X" );
-220
DBIx-Custom/t/01-core.t
... ...
@@ -1,220 +0,0 @@
1
-use Test::More 'no_plan';
2
-use strict;
3
-use warnings;
4
-
5
-use DBIx::Custom;
6
-use DBIx::Custom::SQL::Template;
7
-
8
-# Function for test name
9
-my $test;
10
-sub test {
11
-    $test = shift;
12
-}
13
-
14
-# Variables for test
15
-our $SQL_TMPL = {
16
-    0 => DBIx::Custom::SQL::Template->new->tag_start(0),
17
-    1 => DBIx::Custom::SQL::Template->new->tag_start(1),
18
-    2 => DBIx::Custom::SQL::Template->new->tag_start(2)
19
-};
20
-my $dbi;
21
-
22
-
23
-test 'Constructor';
24
-$dbi = DBIx::Custom->new(
25
-    user => 'a',
26
-    database => 'a',
27
-    password => 'b',
28
-    data_source => 'c',
29
-    dbi_options => {d => 1, e => 2},
30
-    filters => {
31
-        f => 3,
32
-    },
33
-    bind_filter => 'f',
34
-    fetch_filter => 'g',
35
-    result_class => 'g',
36
-    sql_template => $SQL_TMPL->{0},
37
-);
38
-is_deeply($dbi,{user => 'a', database => 'a', password => 'b', data_source => 'c', 
39
-                dbi_options => {d => 1, e => 2}, filters => {f => 3}, bind_filter => 'f',
40
-                fetch_filter => 'g', result_class => 'g',
41
-                sql_template => $SQL_TMPL->{0}}, $test);
42
-isa_ok($dbi, 'DBIx::Custom');
43
-
44
-
45
-test 'Sub class constructor';
46
-{
47
-    package DBIx::Custom::T1;
48
-    use base 'DBIx::Custom';
49
-    
50
-    __PACKAGE__
51
-      ->user('a')
52
-      ->database('a')
53
-      ->password('b')
54
-      ->data_source('c')
55
-      ->dbi_options({d => 1, e => 2})
56
-      ->filters(
57
-          f => 3
58
-      )
59
-      ->formats(
60
-          f => 3
61
-      )
62
-      ->bind_filter('f')
63
-      ->fetch_filter('g')
64
-      ->result_class('DBIx::Custom::Result')
65
-      ->sql_template($SQL_TMPL->{0})
66
-    ;
67
-}
68
-$dbi = DBIx::Custom::T1->new(
69
-    user => 'ao',
70
-    database => 'ao',
71
-    password => 'bo',
72
-    data_source => 'co',
73
-    dbi_options => {do => 10, eo => 20},
74
-    filters => {
75
-        fo => 30,
76
-    },
77
-    formats => {
78
-        fo => 30,
79
-    },
80
-    bind_filter => 'fo',
81
-    fetch_filter => 'go',
82
-    result_class => 'ho',
83
-    sql_template => $SQL_TMPL->{0},
84
-);
85
-is($dbi->user, 'ao', "$test : user");
86
-is($dbi->database, 'ao', "$test : database");
87
-is($dbi->password, 'bo', "$test : passowr");
88
-is($dbi->data_source, 'co', "$test : data_source");
89
-is_deeply($dbi->dbi_options, {do => 10, eo => 20}, "$test : dbi_options");
90
-is_deeply(scalar $dbi->filters, {fo => 30}, "$test : filters");
91
-is_deeply(scalar $dbi->formats, {fo => 30}, "$test : formats");
92
-is($dbi->bind_filter, 'fo', "$test : bind_filter");
93
-is($dbi->fetch_filter, 'go', "$test : fetch_filter");
94
-is($dbi->result_class, 'ho', "$test : result_class");
95
-is($dbi->sql_template->tag_start, 0, "$test : sql_template");
96
-isa_ok($dbi, 'DBIx::Custom::T1');
97
-
98
-test 'Sub class constructor default';
99
-$dbi = DBIx::Custom::T1->new;
100
-is($dbi->user, 'a', "$test : user");
101
-is($dbi->database, 'a', "$test : database");
102
-is($dbi->password, 'b', "$test : password");
103
-is($dbi->data_source, 'c', "$test : data_source");
104
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
105
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters");
106
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats");
107
-is($dbi->bind_filter, 'f', "$test : bind_filter");
108
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
109
-is($dbi->result_class, 'DBIx::Custom::Result', "$test : result_class");
110
-is($dbi->sql_template->tag_start, 0, "$test : sql_template");
111
-isa_ok($dbi, 'DBIx::Custom::T1');
112
-
113
-
114
-test 'Sub sub class constructor default';
115
-{
116
-    package DBIx::Custom::T1_2;
117
-    use base 'DBIx::Custom::T1';
118
-}
119
-$dbi = DBIx::Custom::T1_2->new;
120
-is($dbi->user, 'a', "$test : user");
121
-is($dbi->database, 'a', "$test : database");
122
-is($dbi->password, 'b', "$test : passowrd");
123
-is($dbi->data_source, 'c', "$test : data_source");
124
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
125
-is_deeply(scalar $dbi->filters, {f => 3}, "$test : filters");
126
-is_deeply(scalar $dbi->formats, {f => 3}, "$test : formats");
127
-is($dbi->bind_filter, 'f', "$test : bind_filter");
128
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
129
-is($dbi->result_class, 'DBIx::Custom::Result', "$test : result_class");
130
-is($dbi->sql_template->tag_start, 0, "$test sql_template");
131
-isa_ok($dbi, 'DBIx::Custom::T1_2');
132
-
133
-
134
-test 'Customized sub class constructor default';
135
-{
136
-    package DBIx::Custom::T1_3;
137
-    use base 'DBIx::Custom::T1';
138
-    
139
-    __PACKAGE__
140
-      ->user('ao')
141
-      ->database('ao')
142
-      ->password('bo')
143
-      ->data_source('co')
144
-      ->dbi_options({do => 10, eo => 20})
145
-      ->filters(
146
-        fo => 30
147
-      )
148
-      ->formats(
149
-        fo => 30
150
-      )
151
-      ->bind_filter('fo')
152
-      ->fetch_filter('go')
153
-      ->result_class('ho')
154
-      ->sql_template($SQL_TMPL->{1})
155
-    ;
156
-}
157
-$dbi = DBIx::Custom::T1_3->new;
158
-is($dbi->user, 'ao', "$test : user");
159
-is($dbi->database, 'ao', "$test : database");
160
-is($dbi->password, 'bo', "$test : password");
161
-is($dbi->data_source, 'co', "$test : data_source");
162
-is_deeply($dbi->dbi_options, {do => 10, eo => 20}, "$test : dbi_options");
163
-is_deeply(scalar $dbi->filters, {fo => 30}, "$test : filters");
164
-is_deeply(scalar $dbi->formats, {fo => 30}, "$test : formats");
165
-is($dbi->bind_filter, 'fo', "$test : bind_filter");
166
-is($dbi->fetch_filter, 'go', "$test : fetch_filter");
167
-is($dbi->result_class, 'ho', "$test : result_class");
168
-is($dbi->sql_template->tag_start, 1, "$test : sql_template");
169
-isa_ok($dbi, 'DBIx::Custom::T1_3');
170
-
171
-
172
-test 'Customized sub class constructor';
173
-$dbi = DBIx::Custom::T1_3->new(
174
-    user => 'a',
175
-    database => 'a',
176
-    password => 'b',
177
-    data_source => 'c',
178
-    dbi_options => {d => 1, e => 2},
179
-    filters => {
180
-        f => 3,
181
-    },
182
-    formats => {
183
-        f => 3,
184
-    },
185
-    bind_filter => 'f',
186
-    fetch_filter => 'g',
187
-    result_class => 'h',
188
-    sql_template => $SQL_TMPL->{2},
189
-);
190
-is($dbi->user, 'a', "$test : user");
191
-is($dbi->database, 'a', "$test : database");
192
-is($dbi->password, 'b', "$test : password");
193
-is($dbi->data_source, 'c', "$test : data_source");
194
-is_deeply($dbi->dbi_options, {d => 1, e => 2}, "$test : dbi_options");
195
-is_deeply({$dbi->filters}, {f => 3}, "$test : filters");
196
-is_deeply({$dbi->formats}, {f => 3}, "$test : formats");
197
-is($dbi->bind_filter, 'f', "$test : bind_filter");
198
-is($dbi->fetch_filter, 'g', "$test : fetch_filter");
199
-is($dbi->result_class, 'h', "$test : result_class");
200
-is($dbi->sql_template->tag_start, 2, "$test : sql_template");
201
-isa_ok($dbi, 'DBIx::Custom');
202
-
203
-
204
-test 'add_filters';
205
-$dbi = DBIx::Custom->new;
206
-$dbi->add_filter(a => sub {1});
207
-is($dbi->filters->{a}->(), 1, $test);
208
-
209
-test 'add_formats';
210
-$dbi = DBIx::Custom->new;
211
-$dbi->add_format(a => sub {1});
212
-is($dbi->formats->{a}->(), 1, $test);
213
-
214
-test 'filter_off';
215
-$dbi = DBIx::Custom->new;
216
-$dbi->bind_filter('a');
217
-$dbi->fetch_filter('b');
218
-$dbi->filter_off;
219
-ok(!$dbi->bind_filter,  "$test : bind_filter  off");
220
-ok(!$dbi->fetch_filter, "$test : fetch_filter off");
-716
DBIx-Custom/t/02-sqlite.t
... ...
@@ -1,716 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-BEGIN {
6
-    eval { require DBD::SQLite; 1 }
7
-        or plan skip_all => 'DBD::SQLite required';
8
-    eval { DBD::SQLite->VERSION >= 1 }
9
-        or plan skip_all => 'DBD::SQLite >= 1.00 required';
10
-
11
-    plan 'no_plan';
12
-    use_ok('DBIx::Custom');
13
-}
14
-
15
-# Function for test name
16
-my $test;
17
-sub test {
18
-    $test = shift;
19
-}
20
-
21
-# Constant varialbes for test
22
-my $CREATE_TABLE = {
23
-    0 => 'create table table1 (key1 char(255), key2 char(255));',
24
-    1 => 'create table table1 (key1 char(255), key2 char(255), key3 char(255), key4 char(255), key5 char(255));',
25
-    2 => 'create table table2 (key1 char(255), key3 char(255));'
26
-};
27
-
28
-my $SELECT_TMPL = {
29
-    0 => 'select * from table1;'
30
-};
31
-
32
-my $DROP_TABLE = {
33
-    0 => 'drop table table1'
34
-};
35
-
36
-my $NEW_ARGS = {
37
-    0 => {data_source => 'dbi:SQLite:dbname=:memory:'}
38
-};
39
-
40
-# Variables for test
41
-my $dbi;
42
-my $sth;
43
-my $tmpl;
44
-my @tmpls;
45
-my $select_tmpl;
46
-my $insert_tmpl;
47
-my $update_tmpl;
48
-my $params;
49
-my $sql;
50
-my $result;
51
-my @rows;
52
-my $rows;
53
-my $query;
54
-my @queries;
55
-my $select_query;
56
-my $insert_query;
57
-my $update_query;
58
-my $ret_val;
59
-
60
-
61
-test 'disconnect';
62
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
63
-$dbi->connect;
64
-$dbi->disconnect;
65
-ok(!$dbi->dbh, $test);
66
-
67
-
68
-test 'connected';
69
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
70
-ok(!$dbi->connected, "$test : not connected");
71
-$dbi->connect;
72
-ok($dbi->connected, "$test : connected");
73
-
74
-
75
-test 'preapare';
76
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
77
-$sth = $dbi->prepare($CREATE_TABLE->{0});
78
-ok($sth, "$test : auto connect");
79
-$sth->execute;
80
-$sth = $dbi->prepare($DROP_TABLE->{0});
81
-ok($sth, "$test : basic");
82
-
83
-
84
-test 'do';
85
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
86
-$ret_val = $dbi->do($CREATE_TABLE->{0});
87
-ok(defined $ret_val, "$test : auto connect");
88
-$ret_val = $dbi->do($DROP_TABLE->{0});
89
-ok(defined $ret_val, "$test : basic");
90
-
91
-
92
-# Prepare table
93
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
94
-$dbi->connect;
95
-$dbi->do($CREATE_TABLE->{0});
96
-$sth = $dbi->prepare("insert into table1 (key1, key2) values (?, ?);");
97
-$sth->execute(1, 2);
98
-$sth->execute(3, 4);
99
-
100
-
101
-test 'DBIx::Custom::Result test';
102
-$tmpl = "select key1, key2 from table1";
103
-$query = $dbi->create_query($tmpl);
104
-$result = $dbi->execute($query);
105
-
106
-@rows = ();
107
-while (my $row = $result->fetch) {
108
-    push @rows, [@$row];
109
-}
110
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch scalar context");
111
-
112
-$result = $dbi->execute($query);
113
-@rows = ();
114
-while (my @row = $result->fetch) {
115
-    push @rows, [@row];
116
-}
117
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch list context");
118
-
119
-$result = $dbi->execute($query);
120
-@rows = ();
121
-while (my $row = $result->fetch_hash) {
122
-    push @rows, {%$row};
123
-}
124
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : fetch_hash scalar context");
125
-
126
-$result = $dbi->execute($query);
127
-@rows = ();
128
-while (my %row = $result->fetch_hash) {
129
-    push @rows, {%row};
130
-}
131
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : fetch hash list context");
132
-
133
-$result = $dbi->execute($query);
134
-$rows = $result->fetch_all;
135
-is_deeply($rows, [[1, 2], [3, 4]], "$test : fetch_all scalar context");
136
-
137
-$result = $dbi->execute($query);
138
-@rows = $result->fetch_all;
139
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch_all list context");
140
-
141
-$result = $dbi->execute($query);
142
-@rows = $result->fetch_hash_all;
143
-is_deeply($rows, [[1, 2], [3, 4]], "$test : fetch_hash_all scalar context");
144
-
145
-$result = $dbi->execute($query);
146
-@rows = $result->fetch_all;
147
-is_deeply(\@rows, [[1, 2], [3, 4]], "$test : fetch_hash_all list context");
148
-
149
-
150
-test 'Insert query return value';
151
-$dbi->do($DROP_TABLE->{0});
152
-$dbi->do($CREATE_TABLE->{0});
153
-$tmpl = "insert into table1 {insert key1 key2}";
154
-$query = $dbi->create_query($tmpl);
155
-$ret_val = $dbi->execute($query, {key1 => 1, key2 => 2});
156
-ok($ret_val, $test);
157
-
158
-
159
-test 'Direct execute';
160
-$dbi->do($DROP_TABLE->{0});
161
-$dbi->do($CREATE_TABLE->{0});
162
-$insert_tmpl = "insert into table1 {insert key1 key2}";
163
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2}, sub {
164
-    my $query = shift;
165
-    $query->bind_filter(sub {
166
-        my ($value, $key) = @_;
167
-        if ($key eq 'key2') {
168
-            return $value + 1;
169
-        }
170
-        return $value;
171
-    });
172
-});
173
-$result = $dbi->execute($SELECT_TMPL->{0});
174
-$rows = $result->fetch_hash_all;
175
-is_deeply($rows, [{key1 => 1, key2 => 3}], $test);
176
-
177
-
178
-test 'Filter basic';
179
-$dbi->do($DROP_TABLE->{0});
180
-$dbi->do($CREATE_TABLE->{0});
181
-
182
-$insert_tmpl  = "insert into table1 {insert key1 key2};";
183
-$insert_query = $dbi->create_query($insert_tmpl);
184
-$insert_query->bind_filter(sub {
185
-    my ($value, $key, $table, $column) = @_;
186
-    if ($key eq 'key1' && $table eq '' && $column eq 'key1') {
187
-        return $value * 2;
188
-    }
189
-    return $value;
190
-});
191
-$dbi->execute($insert_query, {key1 => 1, key2 => 2});
192
-$select_query = $dbi->create_query($SELECT_TMPL->{0});
193
-$select_query->fetch_filter(sub {
194
-    my ($value, $key, $type, $sth, $i) = @_;
195
-    if ($key eq 'key2' && $type =~ /char/ && $sth->can('execute') && $i == 1) {
196
-        return $value * 3;
197
-    }
198
-    return $value;
199
-});
200
-$result = $dbi->execute($select_query);
201
-$rows = $result->fetch_hash_all;
202
-is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : bind_filter fetch_filter");
203
-
204
-$dbi->do("delete from table1;");
205
-$insert_query->no_bind_filters('key1');
206
-$select_query->no_fetch_filters('key2');
207
-$dbi->execute($insert_query, {key1 => 1, key2 => 2});
208
-$result = $dbi->execute($select_query);
209
-$rows = $result->fetch_hash_all;
210
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : no_fetch_filters no_bind_filters");
211
-
212
-$dbi->do($DROP_TABLE->{0});
213
-$dbi->do($CREATE_TABLE->{0});
214
-$insert_tmpl  = "insert into table1 {insert table1.key1 table1.key2}";
215
-$insert_query = $dbi->create_query($insert_tmpl);
216
-$insert_query->bind_filter(sub {
217
-    my ($value, $key, $table, $column) = @_;
218
-    if ($key eq 'table1.key1' && $table eq 'table1' && $column eq 'key1') {
219
-        return $value * 3;
220
-    }
221
-    return $value;
222
-});
223
-$dbi->execute($insert_query, {table1 => {key1 => 1, key2 => 2}});
224
-$select_query = $dbi->create_query($SELECT_TMPL->{0});
225
-$result       = $dbi->execute($select_query);
226
-$rows = $result->fetch_hash_all;
227
-is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : insert with table name");
228
-
229
-test 'Filter in';
230
-$insert_tmpl  = "insert into table1 {insert key1 key2};";
231
-$insert_query = $dbi->create_query($insert_tmpl);
232
-$dbi->execute($insert_query, {key1 => 2, key2 => 4});
233
-$select_tmpl = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}";
234
-$select_query = $dbi->create_query($select_tmpl);
235
-$select_query->bind_filter(sub {
236
-    my ($value, $key, $table, $column) = @_;
237
-    if ($key eq 'table1.key1' && $table eq 'table1' && $column eq 'key1' || $key eq 'table1.key2') {
238
-        return $value * 2;
239
-    }
240
-    return $value;
241
-});
242
-$result = $dbi->execute($select_query, {table1 => {key1 => [1,5], key2 => [2,5]}});
243
-$rows = $result->fetch_hash_all;
244
-is_deeply($rows, [{key1 => 2, key2 => 4}], "$test : bind_filter");
245
-
246
-
247
-test 'DBIx::Custom::SQL::Template basic tag';
248
-$dbi->do($DROP_TABLE->{0});
249
-$dbi->do($CREATE_TABLE->{1});
250
-$sth = $dbi->prepare("insert into table1 (key1, key2, key3, key4, key5) values (?, ?, ?, ?, ?);");
251
-$sth->execute(1, 2, 3, 4, 5);
252
-$sth->execute(6, 7, 8, 9, 10);
253
-
254
-$tmpl = "select * from table1 where {= key1} and {<> key2} and {< key3} and {> key4} and {>= key5};";
255
-$query = $dbi->create_query($tmpl);
256
-$result = $dbi->execute($query, {key1 => 1, key2 => 3, key3 => 4, key4 => 3, key5 => 5});
257
-$rows = $result->fetch_hash_all;
258
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1");
259
-
260
-$tmpl = "select * from table1 where {= table1.key1} and {<> table1.key2} and {< table1.key3} and {> table1.key4} and {>= table1.key5};";
261
-$query = $dbi->create_query($tmpl);
262
-$result = $dbi->execute($query, {table1 => {key1 => 1, key2 => 3, key3 => 4, key4 => 3, key5 => 5}});
263
-$rows = $result->fetch_hash_all;
264
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1 with table");
265
-
266
-$tmpl = "select * from table1 where {= table1.key1} and {<> table1.key2} and {< table1.key3} and {> table1.key4} and {>= table1.key5};";
267
-$query = $dbi->create_query($tmpl);
268
-$result = $dbi->execute($query, {'table1.key1' => 1, 'table1.key2' => 3, 'table1.key3' => 4, 'table1.key4' => 3, 'table1.key5' => 5});
269
-$rows = $result->fetch_hash_all;
270
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag1 with table dot");
271
-
272
-$tmpl = "select * from table1 where {<= key1} and {like key2};";
273
-$query = $dbi->create_query($tmpl);
274
-$result = $dbi->execute($query, {key1 => 1, key2 => '%2%'});
275
-$rows = $result->fetch_hash_all;
276
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2");
277
-
278
-$tmpl = "select * from table1 where {<= table1.key1} and {like table1.key2};";
279
-$query = $dbi->create_query($tmpl);
280
-$result = $dbi->execute($query, {table1 => {key1 => 1, key2 => '%2%'}});
281
-$rows = $result->fetch_hash_all;
282
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2 with table");
283
-
284
-$tmpl = "select * from table1 where {<= table1.key1} and {like table1.key2};";
285
-$query = $dbi->create_query($tmpl);
286
-$result = $dbi->execute($query, {'table1.key1' => 1, 'table1.key2' => '%2%'});
287
-$rows = $result->fetch_hash_all;
288
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic tag2 with table dot");
289
-
290
-
291
-test 'DIB::Custom::SQL::Template in tag';
292
-$dbi->do($DROP_TABLE->{0});
293
-$dbi->do($CREATE_TABLE->{1});
294
-$sth = $dbi->prepare("insert into table1 (key1, key2, key3, key4, key5) values (?, ?, ?, ?, ?);");
295
-$sth->execute(1, 2, 3, 4, 5);
296
-$sth->execute(6, 7, 8, 9, 10);
297
-
298
-$tmpl = "select * from table1 where {in key1 2};";
299
-$query = $dbi->create_query($tmpl);
300
-$result = $dbi->execute($query, {key1 => [9, 1]});
301
-$rows = $result->fetch_hash_all;
302
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic");
303
-
304
-$tmpl = "select * from table1 where {in table1.key1 2};";
305
-$query = $dbi->create_query($tmpl);
306
-$result = $dbi->execute($query, {table1 => {key1 => [9, 1]}});
307
-$rows = $result->fetch_hash_all;
308
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table");
309
-
310
-$tmpl = "select * from table1 where {in table1.key1 2};";
311
-$query = $dbi->create_query($tmpl);
312
-$result = $dbi->execute($query, {'table1.key1' => [9, 1]});
313
-$rows = $result->fetch_hash_all;
314
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table dot");
315
-
316
-
317
-test 'DBIx::Custom::SQL::Template insert tag';
318
-$dbi->do("delete from table1");
319
-$insert_tmpl = 'insert into table1 {insert key1 key2 key3 key4 key5}';
320
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
321
-
322
-$result = $dbi->execute($SELECT_TMPL->{0});
323
-$rows = $result->fetch_hash_all;
324
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic");
325
-
326
-$dbi->do("delete from table1");
327
-$dbi->execute($insert_tmpl, {'#insert' => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}});
328
-$result = $dbi->execute($SELECT_TMPL->{0});
329
-$rows = $result->fetch_hash_all;
330
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert");
331
-
332
-$dbi->do("delete from table1");
333
-$insert_tmpl = 'insert into table1 {insert table1.key1 table1.key2 table1.key3 table1.key4 table1.key5}';
334
-$dbi->execute($insert_tmpl, {table1 => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}});
335
-$result = $dbi->execute($SELECT_TMPL->{0});
336
-$rows = $result->fetch_hash_all;
337
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table name");
338
-
339
-$dbi->do("delete from table1");
340
-$insert_tmpl = 'insert into table1 {insert table1.key1 table1.key2 table1.key3 table1.key4 table1.key5}';
341
-$dbi->execute($insert_tmpl, {'table1.key1' => 1, 'table1.key2' => 2, 'table1.key3' => 3, 'table1.key4' => 4, 'table1.key5' => 5});
342
-$result = $dbi->execute($SELECT_TMPL->{0});
343
-$rows = $result->fetch_hash_all;
344
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : with table name dot");
345
-
346
-$dbi->do("delete from table1");
347
-$dbi->execute($insert_tmpl, {'#insert' => {table1 => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}}});
348
-$result = $dbi->execute($SELECT_TMPL->{0});
349
-$rows = $result->fetch_hash_all;
350
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert with table name");
351
-
352
-$dbi->do("delete from table1");
353
-$dbi->execute($insert_tmpl, {'#insert' => {'table1.key1' => 1, 'table1.key2' => 2, 'table1.key3' => 3, 'table1.key4' => 4, 'table1.key5' => 5}});
354
-$result = $dbi->execute($SELECT_TMPL->{0});
355
-$rows = $result->fetch_hash_all;
356
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : #insert with table name dot");
357
-
358
-
359
-test 'DBIx::Custom::SQL::Template update tag';
360
-$dbi->do("delete from table1");
361
-$insert_tmpl = "insert into table1 {insert key1 key2 key3 key4 key5}";
362
-$dbi->execute($insert_tmpl, {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
363
-$dbi->execute($insert_tmpl, {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
364
-
365
-$update_tmpl = 'update table1 {update key1 key2 key3 key4} where {= key5}';
366
-$dbi->execute($update_tmpl, {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5});
367
-
368
-$result = $dbi->execute($SELECT_TMPL->{0});
369
-$rows = $result->fetch_hash_all;
370
-is_deeply($rows, [{key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5},
371
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : basic");
372
-
373
-$dbi->execute($update_tmpl, {'#update' => {key1 => 2, key2 => 2, key3 => 2, key4 => 2}, key5 => 5});
374
-$result = $dbi->execute($SELECT_TMPL->{0});
375
-$rows = $result->fetch_hash_all;
376
-is_deeply($rows, [{key1 => 2, key2 => 2, key3 => 2, key4 => 2, key5 => 5},
377
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : #update");
378
-
379
-$update_tmpl = 'update table1 {update table1.key1 table1.key2 table1.key3 table1.key4} where {= table1.key5}';
380
-$dbi->execute($update_tmpl, {table1 => {key1 => 3, key2 => 3, key3 => 3, key4 => 3, key5 => 5}});
381
-$result = $dbi->execute($SELECT_TMPL->{0});
382
-$rows = $result->fetch_hash_all;
383
-is_deeply($rows, [{key1 => 3, key2 => 3, key3 => 3, key4 => 3, key5 => 5},
384
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : with table name");
385
-
386
-$update_tmpl = 'update table1 {update table1.key1 table1.key2 table1.key3 table1.key4} where {= table1.key5}';
387
-$dbi->execute($update_tmpl, {'table1.key1' => 4, 'table1.key2' => 4, 'table1.key3' => 4, 'table1.key4' => 4, 'table1.key5' => 5});
388
-$result = $dbi->execute($SELECT_TMPL->{0});
389
-$rows = $result->fetch_hash_all;
390
-is_deeply($rows, [{key1 => 4, key2 => 4, key3 => 4, key4 => 4, key5 => 5},
391
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : with table name dot");
392
-
393
-$dbi->execute($update_tmpl, {'#update' => {table1 => {key1 => 5, key2 => 5, key3 => 5, key4 => 5}}, table1 => {key5 => 5}});
394
-$result = $dbi->execute($SELECT_TMPL->{0});
395
-$rows = $result->fetch_hash_all;
396
-is_deeply($rows, [{key1 => 5, key2 => 5, key3 => 5, key4 => 5, key5 => 5},
397
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : update tag #update with table name");
398
-
399
-$dbi->execute($update_tmpl, {'#update' => {'table1.key1' => 6, 'table1.key2' => 6, 'table1.key3' => 6, 'table1.key4' => 6}, 'table1.key5' => 5});
400
-$result = $dbi->execute($SELECT_TMPL->{0});
401
-$rows = $result->fetch_hash_all;
402
-is_deeply($rows, [{key1 => 6, key2 => 6, key3 => 6, key4 => 6, key5 => 5},
403
-                  {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : update tag #update with table name dot");
404
-
405
-
406
-test 'run_tansaction';
407
-$dbi->do($DROP_TABLE->{0});
408
-$dbi->do($CREATE_TABLE->{0});
409
-$dbi->run_transaction(sub {
410
-    $insert_tmpl = 'insert into table1 {insert key1 key2}';
411
-    $dbi->execute($insert_tmpl, {key1 => 1, key2 => 2});
412
-    $dbi->execute($insert_tmpl, {key1 => 3, key2 => 4});
413
-});
414
-$result = $dbi->execute($SELECT_TMPL->{0});
415
-$rows   = $result->fetch_hash_all;
416
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : commit");
417
-
418
-$dbi->do($DROP_TABLE->{0});
419
-$dbi->do($CREATE_TABLE->{0});
420
-$dbi->dbh->{RaiseError} = 0;
421
-eval{
422
-    $dbi->run_transaction(sub {
423
-        $insert_tmpl = 'insert into table1 {insert key1 key2}';
424
-        $dbi->execute($insert_tmpl, {key1 => 1, key2 => 2});
425
-        die "Fatal Error";
426
-        $dbi->execute($insert_tmpl, {key1 => 3, key2 => 4});
427
-    })
428
-};
429
-like($@, qr/Fatal Error.*Rollback is success/ms, "$test : Rollback success message");
430
-ok(!$dbi->dbh->{RaiseError}, "$test : restore RaiseError value");
431
-$result = $dbi->execute($SELECT_TMPL->{0});
432
-$rows   = $result->fetch_hash_all;
433
-is_deeply($rows, [], "$test : rollback");
434
-
435
-
436
-test 'Error case';
437
-$dbi = DBIx::Custom->new;
438
-eval{$dbi->run_transaction};
439
-like($@, qr/Not yet connect to database/, "$test : Yet Connected");
440
-
441
-$dbi = DBIx::Custom->new(data_source => 'dbi:SQLit');
442
-eval{$dbi->connect;};
443
-ok($@, "$test : connect error");
444
-
445
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
446
-$dbi->connect;
447
-$dbi->dbh->{AutoCommit} = 0;
448
-eval{$dbi->run_transaction()};
449
-like($@, qr/AutoCommit must be true before transaction start/,
450
-         "$test : run_transaction auto commit is false");
451
-
452
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
453
-$sql = 'laksjdf';
454
-eval{$dbi->prepare($sql)};
455
-like($@, qr/$sql/, "$test : prepare fail");
456
-
457
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
458
-$sql = 'laksjdf';
459
-eval{$dbi->do($sql, qw/1 2 3/)};
460
-like($@, qr/$sql/, "$test : do fail");
461
-
462
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
463
-eval{$dbi->create_query("{p }")};
464
-ok($@, "$test : create_query invalid SQL template");
465
-
466
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
467
-$dbi->do($CREATE_TABLE->{0});
468
-$query = $dbi->create_query("select * from table1 where {= key1}");
469
-eval{$dbi->execute($query, {key2 => 1})};
470
-like($@, qr/Corresponding key is not found in your parameters/, 
471
-        "$test : execute corresponding key not found");
472
-
473
-
474
-test 'insert';
475
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
476
-$dbi->do($CREATE_TABLE->{0});
477
-$dbi->insert('table1', {key1 => 1, key2 => 2});
478
-$dbi->insert('table1', {key1 => 3, key2 => 4});
479
-$result = $dbi->execute($SELECT_TMPL->{0});
480
-$rows   = $result->fetch_hash_all;
481
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : basic");
482
-
483
-$dbi->do('delete from table1');
484
-$dbi->insert('table1', {key1 => 1, key2 => 2}, sub {
485
-    my $query = shift;
486
-    $query->bind_filter(sub {
487
-        my ($value, $key) = @_;
488
-        if ($key eq 'key1') {
489
-            return $value * 3;
490
-        }
491
-        return $value;
492
-    });
493
-});
494
-$result = $dbi->execute($SELECT_TMPL->{0});
495
-$rows   = $result->fetch_hash_all;
496
-is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : edit_query_callback");
497
-
498
-
499
-test 'insert error';
500
-eval{$dbi->insert('table1')};
501
-like($@, qr/Key-value pairs for insert must be specified to 'insert' second argument/, "$test : insert key-value not specifed");
502
-
503
-eval{$dbi->insert('table1', {key1 => 1, key2 => 2}, 'aaa')};
504
-like($@, qr/Query edit callback must be code reference/, "$test : query edit callback not code ref");
505
-
506
-
507
-test 'update';
508
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
509
-$dbi->do($CREATE_TABLE->{1});
510
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
511
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
512
-$dbi->update('table1', {key2 => 11}, {key1 => 1});
513
-$result = $dbi->execute($SELECT_TMPL->{0});
514
-$rows   = $result->fetch_hash_all;
515
-is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5},
516
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
517
-                  "$test : basic");
518
-                  
519
-$dbi->do("delete from table1");
520
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
521
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
522
-$dbi->update('table1', {key2 => 12}, {key2 => 2, key3 => 3});
523
-$result = $dbi->execute($SELECT_TMPL->{0});
524
-$rows   = $result->fetch_hash_all;
525
-is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5},
526
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
527
-                  "$test : update key same as search key");
528
-
529
-$dbi->do("delete from table1");
530
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
531
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
532
-$dbi->update('table1', {key2 => 11}, {key1 => 1}, sub {
533
-    my $query = shift;
534
-    $query->bind_filter(sub {
535
-        my ($value, $key) = @_;
536
-        if ($key eq 'key2') {
537
-            return $value * 2;
538
-        }
539
-        return $value;
540
-    });
541
-});
542
-$result = $dbi->execute($SELECT_TMPL->{0});
543
-$rows   = $result->fetch_hash_all;
544
-is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5},
545
-                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
546
-                  "$test : query edit callback");
547
-
548
-
549
-test 'update error';
550
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
551
-$dbi->do($CREATE_TABLE->{1});
552
-eval{$dbi->update('table1')};
553
-like($@, qr/Key-value pairs for update must be specified to 'update' second argument/,
554
-         "$test : update key-value pairs not specified");
555
-
556
-eval{$dbi->update('table1', {key2 => 1})};
557
-like($@, qr/Key-value pairs for where clause must be specified to 'update' third argument/,
558
-         "$test : where key-value pairs not specified");
559
-
560
-eval{$dbi->update('table1', {key2 => 1}, {key2 => 3}, 'aaa')};
561
-like($@, qr/Query edit callback must be code reference/, 
562
-         "$test : query edit callback not code reference");
563
-
564
-
565
-test 'update_all';
566
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
567
-$dbi->do($CREATE_TABLE->{1});
568
-$dbi->insert('table1', {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
569
-$dbi->insert('table1', {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
570
-$dbi->update_all('table1', {key2 => 10}, sub {
571
-    my $query = shift;
572
-    $query->bind_filter(sub {
573
-        my ($value, $key) = @_;
574
-        return $value * 2;
575
-    })
576
-});
577
-$result = $dbi->execute($SELECT_TMPL->{0});
578
-$rows   = $result->fetch_hash_all;
579
-is_deeply($rows, [{key1 => 1, key2 => 20, key3 => 3, key4 => 4, key5 => 5},
580
-                  {key1 => 6, key2 => 20, key3 => 8, key4 => 9, key5 => 10}],
581
-                  "$test : query edit callback");
582
-
583
-
584
-test 'delete';
585
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
586
-$dbi->do($CREATE_TABLE->{0});
587
-$dbi->insert('table1', {key1 => 1, key2 => 2});
588
-$dbi->insert('table1', {key1 => 3, key2 => 4});
589
-$dbi->delete('table1', {key1 => 1});
590
-$result = $dbi->execute($SELECT_TMPL->{0});
591
-$rows   = $result->fetch_hash_all;
592
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : basic");
593
-
594
-$dbi->do("delete from table1;");
595
-$dbi->insert('table1', {key1 => 1, key2 => 2});
596
-$dbi->insert('table1', {key1 => 3, key2 => 4});
597
-$dbi->delete('table1', {key2 => 1}, sub {
598
-    my $query = shift;
599
-    $query->bind_filter(sub {
600
-        my ($value, $key) = @_;
601
-        return $value * 2;
602
-    });
603
-});
604
-$result = $dbi->execute($SELECT_TMPL->{0});
605
-$rows   = $result->fetch_hash_all;
606
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : query edit callback");
607
-
608
-$dbi->delete_all('table1');
609
-$dbi->insert('table1', {key1 => 1, key2 => 2});
610
-$dbi->insert('table1', {key1 => 3, key2 => 4});
611
-$dbi->delete('table1', {key1 => 1, key2 => 2});
612
-$rows = $dbi->select('table1')->fetch_hash_all;
613
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : delete multi key");
614
-
615
-
616
-test 'delete error';
617
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
618
-$dbi->do($CREATE_TABLE->{0});
619
-eval{$dbi->delete('table1')};
620
-like($@, qr/Key-value pairs for where clause must be specified to 'delete' second argument/,
621
-         "$test : where key-value pairs not specified");
622
-
623
-eval{$dbi->delete('table1', {key1 => 1}, 'aaa')};
624
-like($@, qr/Query edit callback must be code reference/, 
625
-         "$test : query edit callback not code ref");
626
-
627
-
628
-test 'delete_all';
629
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
630
-$dbi->do($CREATE_TABLE->{0});
631
-$dbi->insert('table1', {key1 => 1, key2 => 2});
632
-$dbi->insert('table1', {key1 => 3, key2 => 4});
633
-$dbi->delete_all('table1');
634
-$result = $dbi->execute($SELECT_TMPL->{0});
635
-$rows   = $result->fetch_hash_all;
636
-is_deeply($rows, [], "$test : basic");
637
-
638
-
639
-test 'select';
640
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
641
-$dbi->do($CREATE_TABLE->{0});
642
-$dbi->insert('table1', {key1 => 1, key2 => 2});
643
-$dbi->insert('table1', {key1 => 3, key2 => 4});
644
-$rows = $dbi->select('table1')->fetch_hash_all;
645
-is_deeply($rows, [{key1 => 1, key2 => 2},
646
-                  {key1 => 3, key2 => 4}], "$test : table");
647
-
648
-$rows = $dbi->select('table1', ['key1'])->fetch_hash_all;
649
-is_deeply($rows, [{key1 => 1}, {key1 => 3}], "$test : table and columns and where key");
650
-
651
-$rows = $dbi->select('table1', {key1 => 1})->fetch_hash_all;
652
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : table and columns and where key");
653
-
654
-$rows = $dbi->select('table1', ['key1'], {key1 => 3})->fetch_hash_all;
655
-is_deeply($rows, [{key1 => 3}], "$test : table and columns and where key");
656
-
657
-$rows = $dbi->select('table1', "order by key1 desc limit 1")->fetch_hash_all;
658
-is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : append statement");
659
-
660
-$rows = $dbi->select('table1', {key1 => 2}, sub {
661
-    my $query = shift;
662
-    $query->bind_filter(sub {
663
-        my ($value, $key) = @_;
664
-        if ($key eq 'key1') {
665
-            return $value - 1;
666
-        }
667
-        return $value;
668
-    });
669
-})->fetch_hash_all;
670
-is_deeply($rows, [{key1 => 1, key2 => 2}], "$test : query edit call back");
671
-
672
-$dbi->do($CREATE_TABLE->{2});
673
-$dbi->insert('table2', {key1 => 1, key3 => 5});
674
-$rows = $dbi->select([qw/table1 table2/],
675
-                     ['table1.key1 as table1_key1', 'table2.key1 as table2_key1', 'key2', 'key3'],
676
-                     {'table1.key2' => 2},
677
-                     "where table1.key1 = table2.key1")->fetch_hash_all;
678
-is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], "$test : join");
679
-
680
-test 'Cache';
681
-$dbi = DBIx::Custom->new($NEW_ARGS->{0});
682
-DBIx::Custom->query_cache_max(2);
683
-$dbi->do($CREATE_TABLE->{0});
684
-DBIx::Custom->delete_class_attr('_query_caches');
685
-DBIx::Custom->delete_class_attr('_query_cache_keys');
686
-$tmpls[0] = "insert into table1 {insert key1 key2}";
687
-$queries[0] = $dbi->create_query($tmpls[0]);
688
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{sql}, $queries[0]->sql, "$test : sql first");
689
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{key_infos}, $queries[0]->key_infos, "$test : key_infos first");
690
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls], "$test : cache key first");
691
-
692
-$tmpls[1] = "select * from table1";
693
-$queries[1] = $dbi->create_query($tmpls[1]);
694
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{sql}, $queries[0]->sql, "$test : sql first");
695
-is(DBIx::Custom->_query_caches->{$tmpls[0]}{key_infos}, $queries[0]->key_infos, "$test : key_infos first");
696
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql second");
697
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos second");
698
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls], "$test : cache key second");
699
-
700
-$tmpls[2] = "select key1, key2 from table1";
701
-$queries[2] = $dbi->create_query($tmpls[2]);
702
-ok(!exists DBIx::Custom->_query_caches->{$tmpls[0]}, "$test : cache overflow deleted key");
703
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql cache overflow deleted key");
704
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos cache overflow deleted key");
705
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{sql}, $queries[2]->sql, "$test : sql cache overflow deleted key");
706
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{key_infos}, $queries[2]->key_infos, "$test : key_infos cache overflow deleted key");
707
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls[1, 2]], "$test : cache key third");
708
-
709
-$queries[1] = $dbi->create_query($tmpls[1]);
710
-ok(!exists DBIx::Custom->_query_caches->{$tmpls[0]}, "$test : cache overflow deleted key");
711
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{sql}, $queries[1]->sql, "$test : sql cache overflow deleted key");
712
-is(DBIx::Custom->_query_caches->{$tmpls[1]}{key_infos}, $queries[1]->key_infos, "$test : key_infos cache overflow deleted key");
713
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{sql}, $queries[2]->sql, "$test : sql cache overflow deleted key");
714
-is(DBIx::Custom->_query_caches->{$tmpls[2]}{key_infos}, $queries[2]->key_infos, "$test : key_infos cache overflow deleted key");
715
-is_deeply(DBIx::Custom->_query_cache_keys, [@tmpls[1, 2]], "$test : cache key third");
716
-
-36
DBIx-Custom/t/101-mysql_private.t
... ...
@@ -1,36 +0,0 @@
1
-use Test::More;
2
-use strict;
3
-use warnings;
4
-
5
-# user password database
6
-our ($USER, $PASSWORD, $DATABASE) = connect_info();
7
-
8
-plan skip_all => 'private MySQL test' unless $USER;
9
-
10
-plan 'no_plan';
11
-
12
-use DBIx::Custom;
13
-use Scalar::Util 'blessed';
14
-{
15
-    my $dbi = DBIx::Custom->new(
16
-        user => $USER,
17
-        password => $PASSWORD,
18
-        data_source => "dbi:mysql:dbname=$DATABASE"
19
-    );
20
-    $dbi->connect;
21
-    
22
-    ok(blessed $dbi->dbh);
23
-    can_ok($dbi->dbh, qw/prepare/);
24
-}
25
-
26
-sub connect_info {
27
-    my $file = 'password.tmp';
28
-    open my $fh, '<', $file
29
-      or return;
30
-    
31
-    my ($user, $password, $database) = split(/\s/, (<$fh>)[0]);
32
-    
33
-    close $fh;
34
-    
35
-    return ($user, $password, $database);
36
-}
-51
DBIx-Custom/t/boilerplate.t
... ...
@@ -1,51 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More tests => 3;
6
-
7
-sub not_in_file_ok {
8
-    my ($filename, %regex) = @_;
9
-    open( my $fh, '<', $filename )
10
-        or die "couldn't open $filename for reading: $!";
11
-
12
-    my %violated;
13
-
14
-    while (my $line = <$fh>) {
15
-        while (my ($desc, $regex) = each %regex) {
16
-            if ($line =~ $regex) {
17
-                push @{$violated{$desc}||=[]}, $.;
18
-            }
19
-        }
20
-    }
21
-
22
-    if (%violated) {
23
-        fail("$filename contains boilerplate text");
24
-        diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
25
-    } else {
26
-        pass("$filename contains no boilerplate text");
27
-    }
28
-}
29
-
30
-sub module_boilerplate_ok {
31
-    my ($module) = @_;
32
-    not_in_file_ok($module =>
33
-        'the great new $MODULENAME'   => qr/ - The great new /,
34
-        'boilerplate description'     => qr/Quick summary of what the module/,
35
-        'stub function definition'    => qr/function[12]/,
36
-    );
37
-}
38
-
39
-
40
-  not_in_file_ok(README =>
41
-    "The README is used..."       => qr/The README is used/,
42
-    "'version information here'"  => qr/to provide version information/,
43
-  );
44
-
45
-  not_in_file_ok(Changes =>
46
-    "placeholder date/time"       => qr(Date/time)
47
-  );
48
-
49
-  module_boilerplate_ok('lib/DBIx/Custom.pm');
50
-
51
-
-18
DBIx-Custom/t/pod-coverage.t
... ...
@@ -1,18 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use Test::More;
4
-
5
-# Ensure a recent version of Test::Pod::Coverage
6
-my $min_tpc = 1.08;
7
-eval "use Test::Pod::Coverage $min_tpc";
8
-plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
9
-    if $@;
10
-
11
-# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
12
-# but older versions don't recognize some common documentation styles
13
-my $min_pc = 0.18;
14
-eval "use Pod::Coverage $min_pc";
15
-plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
16
-    if $@;
17
-
18
-all_pod_coverage_ok();
-12
DBIx-Custom/t/pod.t
... ...
@@ -1,12 +0,0 @@
1
-#!perl -T
2
-
3
-use strict;
4
-use warnings;
5
-use Test::More;
6
-
7
-# Ensure a recent version of Test::Pod
8
-my $min_tp = 1.22;
9
-eval "use Test::Pod $min_tp";
10
-plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
11
-
12
-all_pod_files_ok();
-24
dist.pl
... ...
@@ -1,24 +0,0 @@
1
-use strict;
2
-use warnings;
3
-use File::Spec;
4
-
5
-my @modules = qw/DBIx-Custom DBIx-Custom-Basic DBIx-Custom-MySQL
6
-                 DBIx-Custom-Query DBIx-Custom-Result
7
-                 DBIx-Custom-Result DBIx-Custom-SQLite
8
-                 DBIx-Custom-SQL-Template/;
9
-
10
-foreach my $module (@modules) {
11
-    chdir $module
12
-      or die "Cannot change directory '$module': $!";
13
-    
14
-    system('perl Build realclean');
15
-    system('perl Build.PL');
16
-    system('perl Build');
17
-    system('perl Build test');
18
-    system('perl Build install');
19
-    system('perl Build disttest');
20
-    system('perl Build dist');
21
-    
22
-    chdir File::Spec->updir
23
-      or die "Cannot change up directory: $!";
24
-}
+2 -6
lib/DBIx/Custom.pm
... ...
@@ -448,12 +448,8 @@ sub run_transaction {
448 448
 # Get last insert id
449 449
 sub last_insert_id {
450 450
     my $self = shift;
451
-    
452
-    # Not connected
453
-    croak("Not yet connect to database")
454
-      unless $self->connected;
455
-    
456
-    return $self->dbh->last_insert_id(@_);
451
+    my $class = ref $self;
452
+    croak "'$class' do not suppert 'last_insert_id'";
457 453
 }
458 454
 
459 455
 # Insert
-4
lib/DBIx/Custom/Basic.pm
... ...
@@ -39,10 +39,6 @@ sub utf8_filter_on {
39 39
 
40 40
 DBIx::Custom::Basic - DBIx::Custom basic implementation
41 41
 
42
-=head1 Version
43
-
44
-Version 0.0201
45
-
46 42
 =head1 See DBIx::Custom documentation
47 43
 
48 44
 This class is L<DBIx::Custom> subclass.
+4 -4
DBIx-Custom-0.0501/lib/DBIx/Custom/MySQL.pm → lib/DBIx/Custom/DB2.pm
... ...
@@ -1,4 +1,4 @@
1
-package DBIx::Custom::MySQL;
1
+package DBIx::Custom::DB2;
2 2
 use base 'DBIx::Custom::Basic';
3 3
 
4 4
 use warnings;
... ...
@@ -17,7 +17,7 @@ sub connect {
17 17
     my $self = shift;
18 18
     
19 19
     if (!$self->data_source && (my $database = $self->database)) {
20
-        $self->data_source("dbi:mysql:dbname=$database");
20
+        $self->data_source("dbi:DB2:dbname=$database");
21 21
     }
22 22
     
23 23
     return $self->SUPER::connect;
... ...
@@ -25,7 +25,7 @@ sub connect {
25 25
 
26 26
 =head1 NAME
27 27
 
28
-DBIx::Custom::MySQL - DBIx::Custom MySQL implementation
28
+DBIx::Custom::DB2 - DBIx::Custom DB2 implementation
29 29
 
30 30
 =head1 Version
31 31
 
... ...
@@ -34,7 +34,7 @@ Version 0.0102
34 34
 =head1 Synopsys
35 35
 
36 36
     # New
37
-    my $dbi = DBIx::Custom::MySQL->new(user => 'taro', $password => 'kliej&@K',
37
+    my $dbi = DBIx::Custom::DB2->new(user => 'taro', $password => 'kliej&@K',
38 38
                                       database => 'sample_db');
39 39
     # Insert 
40 40
     $dbi->insert('books', {title => 'perl', author => 'taro'});
+20 -4
lib/DBIx/Custom/MySQL.pm
... ...
@@ -3,6 +3,7 @@ use base 'DBIx::Custom::Basic';
3 3
 
4 4
 use warnings;
5 5
 use strict;
6
+use Carp 'croak';
6 7
 
7 8
 my $class = __PACKAGE__;
8 9
 
... ...
@@ -23,14 +24,20 @@ sub connect {
23 24
     return $self->SUPER::connect;
24 25
 }
25 26
 
27
+sub last_insert_id {
28
+    my $self = shift;
29
+    
30
+    croak "Not yet connected" unless $self->connected;
31
+    
32
+    my $last_insert_id = $self->dbh->{mysql_insertid};
33
+    
34
+    return $last_insert_id;
35
+}
36
+
26 37
 =head1 NAME
27 38
 
28 39
 DBIx::Custom::MySQL - DBIx::Custom MySQL implementation
29 40
 
30
-=head1 Version
31
-
32
-Version 0.0102
33
-
34 41
 =head1 Synopsys
35 42
 
36 43
     # New
... ...
@@ -68,6 +75,15 @@ Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation.
68 75
     
69 76
     If database attribute is set, automatically data source is created and connect
70 77
 
78
+=head2 last_insert_id
79
+
80
+    # Get last insert id
81
+    $last_insert_id = $self->last_insert_id;
82
+
83
+This is equal to MySQL function
84
+
85
+    last_insert_id()
86
+    
71 87
 =head1 Author
72 88
 
73 89
 Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
+3 -30
DBIx-Custom-MySQL/lib/DBIx/Custom/MySQL.pm → lib/DBIx/Custom/ODBC.pm
... ...
@@ -1,24 +1,16 @@
1
-package DBIx::Custom::MySQL;
1
+package DBIx::Custom::ODBC;
2 2
 use base 'DBIx::Custom::Basic';
3 3
 
4 4
 use warnings;
5 5
 use strict;
6
-our $VERSION = '0.0102';
7 6
 
8 7
 my $class = __PACKAGE__;
9 8
 
10
-$class->add_format(
11
-    datetime => $class->formats->{SQL99_datetime},
12
-    date     => $class->formats->{SQL99_date},
13
-    time     => $class->formats->{SQL99_time},
14
-);
15
-
16
-
17 9
 sub connect {
18 10
     my $self = shift;
19 11
     
20 12
     if (!$self->data_source && (my $database = $self->database)) {
21
-        $self->data_source("dbi:mysql:dbname=$database");
13
+        $self->data_source("dbi:ODBC:dbname=$database");
22 14
     }
23 15
     
24 16
     return $self->SUPER::connect;
... ...
@@ -26,7 +18,7 @@ sub connect {
26 18
 
27 19
 =head1 NAME
28 20
 
29
-DBIx::Custom::MySQL - DBIx::Custom MySQL implementation
21
+DBIx::Custom::ODBC - DBIx::Custom ODBC implementation
30 22
 
31 23
 =head1 Version
32 24
 
... ...
@@ -34,25 +26,6 @@ Version 0.0102
34 26
 
35 27
 =head1 Synopsys
36 28
 
37
-    # New
38
-    my $dbi = DBIx::Custom::MySQL->new(user => 'taro', $password => 'kliej&@K',
39
-                                      database => 'sample_db');
40
-    # Insert 
41
-    $dbi->insert('books', {title => 'perl', author => 'taro'});
42
-    
43
-    # Update 
44
-    # same as 'update books set (title = 'aaa', author = 'ken') where id = 5;
45
-    $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5});
46
-    
47
-    # Delete
48
-    $dbi->delete('books', {author => 'taro'});
49
-    
50
-    # select * from books;
51
-    $dbi->select('books');
52
-    
53
-    # select * from books where ahthor = 'taro'; 
54
-    $dbi->select('books', {author => 'taro'});
55
-
56 29
 =head1 See DBIx::Custom and DBI::Custom::Basic documentation
57 30
 
58 31
 This class is L<DBIx::Custom::Basic> subclass,
+5 -16
DBIx-Custom-0.0501/blib/lib/DBIx/Custom/MySQL.pm → lib/DBIx/Custom/Oracle.pm
... ...
@@ -1,4 +1,4 @@
1
-package DBIx::Custom::MySQL;
1
+package DBIx::Custom::Oracle;
2 2
 use base 'DBIx::Custom::Basic';
3 3
 
4 4
 use warnings;
... ...
@@ -6,18 +6,11 @@ use strict;
6 6
 
7 7
 my $class = __PACKAGE__;
8 8
 
9
-$class->add_format(
10
-    datetime => $class->formats->{SQL99_datetime},
11
-    date     => $class->formats->{SQL99_date},
12
-    time     => $class->formats->{SQL99_time},
13
-);
14
-
15
-
16 9
 sub connect {
17 10
     my $self = shift;
18 11
     
19 12
     if (!$self->data_source && (my $database = $self->database)) {
20
-        $self->data_source("dbi:mysql:dbname=$database");
13
+        $self->data_source("dbi:Oracle:dbname=$database");
21 14
     }
22 15
     
23 16
     return $self->SUPER::connect;
... ...
@@ -25,17 +18,13 @@ sub connect {
25 18
 
26 19
 =head1 NAME
27 20
 
28
-DBIx::Custom::MySQL - DBIx::Custom MySQL implementation
29
-
30
-=head1 Version
31
-
32
-Version 0.0102
21
+DBIx::Custom::Oracle - DBIx::Custom Oracle implementation
33 22
 
34 23
 =head1 Synopsys
35 24
 
36 25
     # New
37
-    my $dbi = DBIx::Custom::MySQL->new(user => 'taro', $password => 'kliej&@K',
38
-                                      database => 'sample_db');
26
+    my $dbi = DBIx::Custom::Oracle->new(user => 'taro', $password => 'kliej&@K',
27
+                                        database => 'sample_db');
39 28
     # Insert 
40 29
     $dbi->insert('books', {title => 'perl', author => 'taro'});
41 30
     
+59
lib/DBIx/Custom/Pg.pm
... ...
@@ -0,0 +1,59 @@
1
+package DBIx::Custom::Pg;
2
+use base 'DBIx::Custom::Basic';
3
+
4
+use warnings;
5
+use strict;
6
+
7
+my $class = __PACKAGE__;
8
+
9
+
10
+sub connect {
11
+    my $self = shift;
12
+    
13
+    if (!$self->data_source && (my $database = $self->database)) {
14
+        $self->data_source("dbi:Pg:dbname=$database");
15
+    }
16
+    
17
+    return $self->SUPER::connect;
18
+}
19
+
20
+=head1 NAME
21
+
22
+DBIx::Custom::Pg - DBIx::Custom PostgreSQL implementation
23
+
24
+=head1 Synopsys
25
+
26
+=head1 See DBIx::Custom and DBI::Custom::Basic documentation
27
+
28
+This class is L<DBIx::Custom::Basic> subclass,
29
+and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass.
30
+
31
+You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom>
32
+Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation.
33
+
34
+=head1 Object methods
35
+
36
+=head2 connect
37
+
38
+    This method override DBIx::Custom::connect
39
+    
40
+    If database attribute is set, automatically data source is created and connect
41
+
42
+=head2 last_insert_id
43
+
44
+=head1 Author
45
+
46
+Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
47
+
48
+Github L<http://github.com/yuki-kimoto>
49
+
50
+I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
51
+
52
+=head1 Copyright & license
53
+
54
+Copyright 2009 Yuki Kimoto, all rights reserved.
55
+
56
+This program is free software; you can redistribute it and/or modify it
57
+under the same terms as Perl itself.
58
+
59
+
+18
lib/DBIx/Custom/SQLite.pm
... ...
@@ -50,6 +50,15 @@ sub reconnect_memory {
50 50
     return $self;
51 51
 }
52 52
 
53
+sub last_insert_id {
54
+    my $self = shift;
55
+    
56
+    croak "Not yet connected" unless $self->connected;
57
+    
58
+    my $last_insert_id = $self->dbh->func('last_insert_rowid');
59
+    
60
+    return $last_insert_id;
61
+}
53 62
 
54 63
 =head1 NAME
55 64
 
... ...
@@ -119,6 +128,15 @@ If database attribute is set, automatically data source is created and connect
119 128
     # Reconnect memory database
120 129
     $self = $dbi->reconnect_memory;
121 130
 
131
+=head2 last_insert_id
132
+
133
+    # Get last insert id
134
+    $last_insert_id = $self->last_insert_id;
135
+
136
+This is equal to SQLite function
137
+
138
+    last_insert_rowid()
139
+
122 140
 =head1 Author
123 141
 
124 142
 Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>