DBIx-Custom / lib / DBIx / Custom.pm /
Newer Older
1240 lines | 29.395kb
cleanup
yuki-kimoto authored on 2009-12-22
1
package DBIx::Custom;
2

            
3
use strict;
4
use warnings;
5

            
remove run_transaction().
yuki-kimoto authored on 2010-01-30
6
use base 'Object::Simple';
many change
yuki-kimoto authored on 2010-02-11
7

            
packaging one directory
yuki-kimoto authored on 2009-11-16
8
use Carp 'croak';
9
use DBI;
10
use DBIx::Custom::Result;
11
use DBIx::Custom::SQL::Template;
cleanup
yuki-kimoto authored on 2010-02-11
12
use DBIx::Custom::Query;
many change
yuki-kimoto authored on 2010-02-11
13
use DBIx::Custom::KeyInfo;
packaging one directory
yuki-kimoto authored on 2009-11-16
14

            
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-18
15
__PACKAGE__->attr('dbh');
version 0.0901
yuki-kimoto authored on 2009-12-17
16

            
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-18
17
__PACKAGE__->class_attr(_query_caches     => sub { {} });
18
__PACKAGE__->class_attr(_query_cache_keys => sub { [] });
packaging one directory
yuki-kimoto authored on 2009-11-16
19

            
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-22
20
__PACKAGE__->class_attr('query_cache_max', default => 50,
21
                                           inherit => 'scalar_copy');
22

            
cleanup
yuki-kimoto authored on 2010-04-28
23
__PACKAGE__->attr([qw/user password data_source/]);
24
__PACKAGE__->attr([qw/database host port/]);
cleanup
yuki-kimoto authored on 2010-04-28
25
__PACKAGE__->attr([qw/default_bind_filter default_fetch_filter options/]);
packaging one directory
yuki-kimoto authored on 2009-11-16
26

            
cleanup
yuki-kimoto authored on 2010-04-28
27
__PACKAGE__->dual_attr([qw/ filters formats/],
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-22
28
                       default => sub { {} }, inherit => 'hash_copy');
packaging one directory
yuki-kimoto authored on 2009-11-16
29

            
cleanup
yuki-kimoto authored on 2010-04-28
30
__PACKAGE__->attr(result_class => 'DBIx::Custom::Result');
31
__PACKAGE__->attr(sql_tmpl => sub { DBIx::Custom::SQL::Template->new });
packaging one directory
yuki-kimoto authored on 2009-11-16
32

            
33
sub add_filter {
34
    my $invocant = shift;
35
    
update document
yuki-kimoto authored on 2010-01-30
36
    # Add filter
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-18
37
    my $filters = ref $_[0] eq 'HASH' ? $_[0] : {@_};
38
    $invocant->filters({%{$invocant->filters}, %$filters});
39
    
packaging one directory
yuki-kimoto authored on 2009-11-16
40
    return $invocant;
41
}
42

            
43
sub add_format{
44
    my $invocant = shift;
45
    
update document
yuki-kimoto authored on 2010-01-30
46
    # Add format
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-18
47
    my $formats = ref $_[0] eq 'HASH' ? $_[0] : {@_};
48
    $invocant->formats({%{$invocant->formats}, %$formats});
49

            
packaging one directory
yuki-kimoto authored on 2009-11-16
50
    return $invocant;
51
}
52

            
53
sub _auto_commit {
54
    my $self = shift;
55
    
update document
yuki-kimoto authored on 2010-01-30
56
    # Not connected
packaging one directory
yuki-kimoto authored on 2009-11-16
57
    croak("Not yet connect to database") unless $self->dbh;
58
    
59
    if (@_) {
update document
yuki-kimoto authored on 2010-01-30
60
        
61
        # Set AutoCommit
packaging one directory
yuki-kimoto authored on 2009-11-16
62
        $self->dbh->{AutoCommit} = $_[0];
update document
yuki-kimoto authored on 2010-01-30
63
        
packaging one directory
yuki-kimoto authored on 2009-11-16
64
        return $self;
65
    }
66
    return $self->dbh->{AutoCommit};
67
}
68

            
69
sub connect {
70
    my $self = shift;
update document
yuki-kimoto authored on 2010-01-30
71
    
72
    # Information
packaging one directory
yuki-kimoto authored on 2009-11-16
73
    my $data_source = $self->data_source;
74
    my $user        = $self->user;
75
    my $password    = $self->password;
version 0.0901
yuki-kimoto authored on 2009-12-17
76
    my $options     = $self->options;
packaging one directory
yuki-kimoto authored on 2009-11-16
77
    
update document
yuki-kimoto authored on 2010-01-30
78
    # Connect
packaging one directory
yuki-kimoto authored on 2009-11-16
79
    my $dbh = eval{DBI->connect(
80
        $data_source,
81
        $user,
82
        $password,
83
        {
84
            RaiseError => 1,
85
            PrintError => 0,
86
            AutoCommit => 1,
version 0.0901
yuki-kimoto authored on 2009-12-17
87
            %{$options || {} }
packaging one directory
yuki-kimoto authored on 2009-11-16
88
        }
89
    )};
90
    
update document
yuki-kimoto authored on 2010-01-30
91
    # Connect error
packaging one directory
yuki-kimoto authored on 2009-11-16
92
    croak $@ if $@;
93
    
update document
yuki-kimoto authored on 2010-01-30
94
    # Database handle
packaging one directory
yuki-kimoto authored on 2009-11-16
95
    $self->dbh($dbh);
update document
yuki-kimoto authored on 2010-01-30
96
    
packaging one directory
yuki-kimoto authored on 2009-11-16
97
    return $self;
98
}
99

            
100
sub DESTROY {
101
    my $self = shift;
update document
yuki-kimoto authored on 2010-01-30
102
    
103
    # Disconnect
packaging one directory
yuki-kimoto authored on 2009-11-16
104
    $self->disconnect if $self->connected;
105
}
106

            
update document
yuki-kimoto authored on 2010-01-30
107
sub connected { ref shift->{dbh} eq 'DBI::db' }
packaging one directory
yuki-kimoto authored on 2009-11-16
108

            
109
sub disconnect {
110
    my $self = shift;
update document
yuki-kimoto authored on 2010-01-30
111
    
packaging one directory
yuki-kimoto authored on 2009-11-16
112
    if ($self->connected) {
update document
yuki-kimoto authored on 2010-01-30
113
        
114
        # Disconnect
packaging one directory
yuki-kimoto authored on 2009-11-16
115
        $self->dbh->disconnect;
116
        delete $self->{dbh};
117
    }
update document
yuki-kimoto authored on 2010-01-30
118
    
119
    return $self;
packaging one directory
yuki-kimoto authored on 2009-11-16
120
}
121

            
122
sub reconnect {
123
    my $self = shift;
update document
yuki-kimoto authored on 2010-01-30
124
    
125
    # Reconnect
packaging one directory
yuki-kimoto authored on 2009-11-16
126
    $self->disconnect if $self->connected;
127
    $self->connect;
update document
yuki-kimoto authored on 2010-01-30
128
    
129
    return $self;
packaging one directory
yuki-kimoto authored on 2009-11-16
130
}
131

            
132
sub prepare {
133
    my ($self, $sql) = @_;
134
    
135
    # Connect if not
136
    $self->connect unless $self->connected;
137
    
138
    # Prepare
139
    my $sth = eval{$self->dbh->prepare($sql)};
140
    
141
    # Error
142
    croak("$@<Your SQL>\n$sql") if $@;
143
    
144
    return $sth;
145
}
146

            
147
sub do{
148
    my ($self, $sql, @bind_values) = @_;
149
    
150
    # Connect if not
151
    $self->connect unless $self->connected;
152
    
153
    # Do
version 0.0901
yuki-kimoto authored on 2009-12-17
154
    my $affected = eval{$self->dbh->do($sql, @bind_values)};
packaging one directory
yuki-kimoto authored on 2009-11-16
155
    
156
    # Error
157
    if ($@) {
158
        my $error = $@;
159
        require Data::Dumper;
160
        
161
        my $bind_value_dump
162
          = Data::Dumper->Dump([\@bind_values], ['*bind_valuds']);
163
        
164
        croak("$error<Your SQL>\n$sql\n<Your bind values>\n$bind_value_dump\n");
165
    }
version 0.0901
yuki-kimoto authored on 2009-12-17
166
    
167
    return $affected;
packaging one directory
yuki-kimoto authored on 2009-11-16
168
}
169

            
170
sub create_query {
171
    my ($self, $template) = @_;
cleanup
yuki-kimoto authored on 2010-02-11
172
    
packaging one directory
yuki-kimoto authored on 2009-11-16
173
    my $class = ref $self;
174
    
cleanup
yuki-kimoto authored on 2010-02-11
175
    my $table = '';
176
    if (ref $template eq 'ARRAY') {
Simplify key search
yuki-kimoto authored on 2010-02-11
177
        $table    = $template->[0] if $template->[0];
cleanup
yuki-kimoto authored on 2010-02-11
178
        $template = $template->[1];
179
    }
180
    
packaging one directory
yuki-kimoto authored on 2009-11-16
181
    # Create query from SQL template
version 0.0901
yuki-kimoto authored on 2009-12-17
182
    my $sql_tmpl = $self->sql_tmpl;
packaging one directory
yuki-kimoto authored on 2009-11-16
183
    
184
    # Try to get cached query
cleanup
yuki-kimoto authored on 2010-02-11
185
    my $cached_query = $class->_query_caches->{"$table$template"};
packaging one directory
yuki-kimoto authored on 2009-11-16
186
    
187
    # Create query
fix timeformat tests
yuki-kimoto authored on 2009-11-23
188
    my $query;
cleanup
yuki-kimoto authored on 2010-02-11
189
    if ($cached_query) {
190
        $query = DBIx::Custom::Query->new(
191
            sql       => $cached_query->sql,
192
            key_infos => $cached_query->key_infos
193
        );
fix timeformat tests
yuki-kimoto authored on 2009-11-23
194
    }
195
    else {
Simplify key search
yuki-kimoto authored on 2010-02-11
196
        $sql_tmpl->table($table);
197
        $query = eval{$sql_tmpl->create_query($template)};
packaging one directory
yuki-kimoto authored on 2009-11-16
198
        croak($@) if $@;
199
        
Simplify key search
yuki-kimoto authored on 2010-02-11
200
        $class->_add_query_cache("$table$template", $query);
packaging one directory
yuki-kimoto authored on 2009-11-16
201
    }
202
    
203
    # Connect if not
204
    $self->connect unless $self->connected;
205
    
206
    # Prepare statement handle
207
    my $sth = $self->prepare($query->{sql});
208
    
209
    # Set statement handle
210
    $query->sth($sth);
211
    
212
    # Set bind filter
cleanup
yuki-kimoto authored on 2010-04-28
213
    $query->bind_filter($self->default_bind_filter);
packaging one directory
yuki-kimoto authored on 2009-11-16
214
    
215
    # Set fetch filter
cleanup
yuki-kimoto authored on 2010-04-28
216
    $query->fetch_filter($self->default_fetch_filter);
packaging one directory
yuki-kimoto authored on 2009-11-16
217
    
218
    return $query;
219
}
220

            
version 0.0901
yuki-kimoto authored on 2009-12-17
221
sub query{
Simplify key search
yuki-kimoto authored on 2010-02-11
222
    my ($self, $query, $params, $query_edit_cb)  = @_;
packaging one directory
yuki-kimoto authored on 2009-11-16
223
    $params ||= {};
224
    
225
    # First argument is SQL template
Simplify key search
yuki-kimoto authored on 2010-02-11
226
    unless (ref $query eq 'DBIx::Custom::Query') {
227
        my $table;
228
        my $template;
229
        
230
        if (ref $query eq 'ARRAY') {
231
            $table    = $query->[0];
232
            $template = $query->[1];
233
        }
234
        else { $template = $query }
235
        
236
        $query = $self->create_query([$table, $template]);
packaging one directory
yuki-kimoto authored on 2009-11-16
237
        $query_edit_cb->($query) if ref $query_edit_cb eq 'CODE';
238
    }
239
    
240
    # Create bind value
241
    my $bind_values = $self->_build_bind_values($query, $params);
242
    
243
    # Execute
version 0.0901
yuki-kimoto authored on 2009-12-17
244
    my $sth      = $query->sth;
245
    my $affected = eval{$sth->execute(@$bind_values)};
packaging one directory
yuki-kimoto authored on 2009-11-16
246
    
247
    # Execute error
248
    if (my $execute_error = $@) {
249
        require Data::Dumper;
250
        my $sql              = $query->{sql} || '';
251
        my $key_infos_dump   = Data::Dumper->Dump([$query->key_infos], ['*key_infos']);
252
        my $params_dump      = Data::Dumper->Dump([$params], ['*params']);
253
        
254
        croak("$execute_error" . 
255
              "<Your SQL>\n$sql\n" . 
256
              "<Your parameters>\n$params_dump");
257
    }
258
    
259
    # Return resultset if select statement is executed
260
    if ($sth->{NUM_OF_FIELDS}) {
261
        
262
        # Get result class
263
        my $result_class = $self->result_class;
264
        
265
        # Create result
266
        my $result = $result_class->new({
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
267
            _dbi             => $self,
packaging one directory
yuki-kimoto authored on 2009-11-16
268
            sth              => $sth,
269
            fetch_filter     => $query->fetch_filter,
270
        });
271
        return $result;
272
    }
version 0.0901
yuki-kimoto authored on 2009-12-17
273
    return $affected;
packaging one directory
yuki-kimoto authored on 2009-11-16
274
}
275

            
276
sub _build_bind_values {
277
    my ($self, $query, $params) = @_;
Simplify key search
yuki-kimoto authored on 2010-02-11
278
    my $key_infos  = $query->key_infos;
279
    my $filter     = $query->bind_filter;
packaging one directory
yuki-kimoto authored on 2009-11-16
280
    
281
    # binding values
282
    my @bind_values;
283
    
Simplify key search
yuki-kimoto authored on 2010-02-11
284
    # Build bind values
packaging one directory
yuki-kimoto authored on 2009-11-16
285
    foreach my $key_info (@$key_infos) {
Simplify key search
yuki-kimoto authored on 2010-02-11
286
        my $table        = $key_info->table;
287
        my $column       = $key_info->column;
288
        my $id           = $key_info->id;
289
        my $pos          = $key_info->pos;
packaging one directory
yuki-kimoto authored on 2009-11-16
290
        
Simplify key search
yuki-kimoto authored on 2010-02-11
291
        # Value
many change
yuki-kimoto authored on 2010-02-11
292
        my $value = $id && defined $pos ? $params->{$id}->{$column}->[$pos]
293
                  : $id                 ? $params->{$id}->{$column}
294
                  : defined $pos        ? $params->{$column}->[$pos]
Simplify key search
yuki-kimoto authored on 2010-02-11
295
                  : $params->{$column};
packaging one directory
yuki-kimoto authored on 2009-11-16
296
        
Simplify key search
yuki-kimoto authored on 2010-02-11
297
        # Filter
298
        push @bind_values, 
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
299
             $filter ? $filter->($value, $table, $column, $self)
Simplify key search
yuki-kimoto authored on 2010-02-11
300
                     : $value;
cleanup
yuki-kimoto authored on 2010-02-11
301
    }
302
    
Simplify key search
yuki-kimoto authored on 2010-02-11
303
    return \@bind_values;
cleanup
yuki-kimoto authored on 2010-02-11
304
}
305

            
remove run_transaction().
yuki-kimoto authored on 2010-01-30
306
sub transaction { DBIx::Custom::Transaction->new(dbi => shift) }
packaging one directory
yuki-kimoto authored on 2009-11-16
307

            
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
308
sub run_transaction {
309
    my ($self, $transaction) = @_;
310
    
311
    # Shorcut
many change
yuki-kimoto authored on 2010-02-11
312
    return unless $self;
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
313
    
314
    # Check auto commit
315
    croak("AutoCommit must be true before transaction start")
many change
yuki-kimoto authored on 2010-02-11
316
      unless $self->_auto_commit;
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
317
    
318
    # Auto commit off
many change
yuki-kimoto authored on 2010-02-11
319
    $self->_auto_commit(0);
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
320
    
321
    # Run transaction
322
    eval {$transaction->()};
323
    
324
    # Tranzaction error
325
    my $transaction_error = $@;
326
    
327
    # Tranzaction is failed.
328
    if ($transaction_error) {
329
        # Rollback
many change
yuki-kimoto authored on 2010-02-11
330
        eval{$self->dbh->rollback};
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
331
        
332
        # Rollback error
333
        my $rollback_error = $@;
334
        
335
        # Auto commit on
many change
yuki-kimoto authored on 2010-02-11
336
        $self->_auto_commit(1);
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
337
        
338
        if ($rollback_error) {
339
            # Rollback is failed
340
            croak("${transaction_error}Rollback is failed : $rollback_error");
341
        }
342
        else {
343
            # Rollback is success
344
            croak("${transaction_error}Rollback is success");
345
        }
346
    }
347
    # Tranzaction is success
348
    else {
349
        # Commit
many change
yuki-kimoto authored on 2010-02-11
350
        eval{$self->dbh->commit};
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
351
        my $commit_error = $@;
352
        
353
        # Auto commit on
many change
yuki-kimoto authored on 2010-02-11
354
        $self->_auto_commit(1);
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
355
        
356
        # Commit is failed
357
        croak($commit_error) if $commit_error;
358
    }
359
}
360

            
version 0.0901
yuki-kimoto authored on 2009-12-17
361
sub create_table {
362
    my ($self, $table, @column_definitions) = @_;
363
    
364
    # Create table
rename fetch_first to fetch_...
yuki-kimoto authored on 2010-01-29
365
    my $sql = "create table $table (";
version 0.0901
yuki-kimoto authored on 2009-12-17
366
    
367
    # Column definitions
368
    foreach my $column_definition (@column_definitions) {
rename fetch_first to fetch_...
yuki-kimoto authored on 2010-01-29
369
        $sql .= "$column_definition,";
version 0.0901
yuki-kimoto authored on 2009-12-17
370
    }
rename fetch_first to fetch_...
yuki-kimoto authored on 2010-01-29
371
    $sql =~ s/,$//;
version 0.0901
yuki-kimoto authored on 2009-12-17
372
    
373
    # End
rename fetch_first to fetch_...
yuki-kimoto authored on 2010-01-29
374
    $sql .= ");";
version 0.0901
yuki-kimoto authored on 2009-12-17
375
    
376
    # Do query
377
    return $self->do($sql);
378
}
379

            
380
sub drop_table {
381
    my ($self, $table) = @_;
382
    
383
    # Drop table
384
    my $sql = "drop table $table;";
385

            
386
    # Do query
387
    return $self->do($sql);
388
}
389

            
cleanup insert
yuki-kimoto authored on 2010-04-28
390
our %VALID_INSERT_ARGS = map { $_ => 1 } qw/append query_edit_cb/;
391

            
packaging one directory
yuki-kimoto authored on 2009-11-16
392
sub insert {
cleanup insert
yuki-kimoto authored on 2010-04-28
393
    my ($self, $table, $insert_params, $args) = @_;
394
    
395
    # Table
396
    $table ||= '';
397
    
398
    # Insert params
399
    $insert_params ||= {};
400
    
401
    # Arguments
402
    $args ||= {};
403
    
404
    # Check arguments
405
    foreach my $name (keys %$args) {
406
        croak "\"$name\" is invalid name"
407
          unless $VALID_INSERT_ARGS{$name};
408
    }
409
    
410
    my $append_statement = $args->{append} || '';
411
    my $query_edit_cb    = $args->{query_edit_cb};
packaging one directory
yuki-kimoto authored on 2009-11-16
412
    
413
    # Insert keys
414
    my @insert_keys = keys %$insert_params;
415
    
416
    # Not exists insert keys
417
    croak("Key-value pairs for insert must be specified to 'insert' second argument")
418
      unless @insert_keys;
419
    
420
    # Templte for insert
421
    my $template = "insert into $table {insert " . join(' ', @insert_keys) . '}';
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
422
    $template .= " $append_statement" if $append_statement;
packaging one directory
yuki-kimoto authored on 2009-11-16
423
    # Create query
Simplify key search
yuki-kimoto authored on 2010-02-11
424
    my $query = $self->create_query([$table, $template]);
packaging one directory
yuki-kimoto authored on 2009-11-16
425
    
426
    # Query edit callback must be code reference
427
    croak("Query edit callback must be code reference")
428
      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
429
    
430
    # Query edit if need
431
    $query_edit_cb->($query) if $query_edit_cb;
432
    
433
    # Execute query
version 0.0901
yuki-kimoto authored on 2009-12-17
434
    my $ret_val = $self->query($query, $insert_params);
packaging one directory
yuki-kimoto authored on 2009-11-16
435
    
436
    return $ret_val;
437
}
438

            
cleanup update and update_al...
yuki-kimoto authored on 2010-04-28
439
our %VALID_UPDATE_ARGS
440
  = map { $_ => 1 } qw/where append query_edit_cb allow_update_all/;
441

            
packaging one directory
yuki-kimoto authored on 2009-11-16
442
sub update {
cleanup update and update_al...
yuki-kimoto authored on 2010-04-28
443
    my ($self, $table, $update_params, $args) = @_;
444
    
445
    # Check arguments
446
    foreach my $name (keys %$args) {
447
        croak "\"$name\" is invalid name"
448
          unless $VALID_UPDATE_ARGS{$name};
449
    }
450
    
451
    # Arguments
452
    my $where_params     = $args->{where} || {};
453
    my $append_statement = $args->{append} || '';
454
    my $query_edit_cb    = $args->{query_edit_cb};
455
    my $allow_update_all = $args->{allow_update_all};
packaging one directory
yuki-kimoto authored on 2009-11-16
456
    
457
    # Update keys
458
    my @update_keys = keys %$update_params;
459
    
460
    # Not exists update kyes
461
    croak("Key-value pairs for update must be specified to 'update' second argument")
462
      unless @update_keys;
463
    
464
    # Where keys
465
    my @where_keys = keys %$where_params;
466
    
467
    # Not exists where keys
468
    croak("Key-value pairs for where clause must be specified to 'update' third argument")
cleanup update and update_al...
yuki-kimoto authored on 2010-04-28
469
      if !@where_keys && !$allow_update_all;
packaging one directory
yuki-kimoto authored on 2009-11-16
470
    
471
    # Update clause
472
    my $update_clause = '{update ' . join(' ', @update_keys) . '}';
473
    
474
    # Where clause
475
    my $where_clause = '';
476
    if (@where_keys) {
477
        $where_clause = 'where ';
478
        foreach my $where_key (@where_keys) {
many change
yuki-kimoto authored on 2010-02-11
479
            my $key_info = DBIx::Custom::KeyInfo->new($where_key);
480
            
481
            my $table_new = $key_info->table || $table;
482
            my $column = $table_new . '.' . $key_info->column
483
                         . '#@where';
484

            
485
            $where_clause .= "{= $column} and ";
packaging one directory
yuki-kimoto authored on 2009-11-16
486
        }
487
        $where_clause =~ s/ and $//;
488
    }
489
    
490
    # Template for update
491
    my $template = "update $table $update_clause $where_clause";
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
492
    $template .= " $append_statement" if $append_statement;
packaging one directory
yuki-kimoto authored on 2009-11-16
493
    
494
    # Create query
Simplify key search
yuki-kimoto authored on 2010-02-11
495
    my $query = $self->create_query([$table, $template]);
packaging one directory
yuki-kimoto authored on 2009-11-16
496
    
497
    # Query edit callback must be code reference
498
    croak("Query edit callback must be code reference")
499
      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
500
    
501
    # Query edit if need
502
    $query_edit_cb->($query) if $query_edit_cb;
503
    
504
    # Rearrange parammeters
many change
yuki-kimoto authored on 2010-02-11
505
    my $params = {%$update_params, '@where' => $where_params};
packaging one directory
yuki-kimoto authored on 2009-11-16
506
    
507
    # Execute query
version 0.0901
yuki-kimoto authored on 2009-12-17
508
    my $ret_val = $self->query($query, $params);
packaging one directory
yuki-kimoto authored on 2009-11-16
509
    
510
    return $ret_val;
511
}
512

            
513
sub update_all {
cleanup update and update_al...
yuki-kimoto authored on 2010-04-28
514
    my ($self, $table, $update_params, $args) = @_;
515
    
516
    $args ||= {};
517
    
518
    $args->{allow_update_all} = 1;
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
519
    
update document
yuki-kimoto authored on 2010-01-30
520
    # Update all rows
cleanup update and update_al...
yuki-kimoto authored on 2010-04-28
521
    return $self->update($table, $update_params, $args);
packaging one directory
yuki-kimoto authored on 2009-11-16
522
}
523

            
524
sub delete {
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
525
    my $self             = shift;
526
    my $table            = shift || '';
527
    my $where_params     = shift || {};
528
    my $append_statement = shift unless ref $_[0];
529
    my $query_edit_cb    = shift;
530
    my $options          = shift;
packaging one directory
yuki-kimoto authored on 2009-11-16
531
    
532
    # Where keys
533
    my @where_keys = keys %$where_params;
534
    
535
    # Not exists where keys
536
    croak("Key-value pairs for where clause must be specified to 'delete' second argument")
537
      if !@where_keys && !$options->{allow_delete_all};
538
    
539
    # Where clause
540
    my $where_clause = '';
541
    if (@where_keys) {
542
        $where_clause = 'where ';
543
        foreach my $where_key (@where_keys) {
544
            $where_clause .= "{= $where_key} and ";
545
        }
546
        $where_clause =~ s/ and $//;
547
    }
548
    
549
    # Template for delete
550
    my $template = "delete from $table $where_clause";
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
551
    $template .= " $append_statement" if $append_statement;
packaging one directory
yuki-kimoto authored on 2009-11-16
552
    
553
    # Create query
Simplify key search
yuki-kimoto authored on 2010-02-11
554
    my $query = $self->create_query([$table, $template]);
packaging one directory
yuki-kimoto authored on 2009-11-16
555
    
556
    # Query edit callback must be code reference
557
    croak("Query edit callback must be code reference")
558
      if $query_edit_cb && ref $query_edit_cb ne 'CODE';
559
    
560
    # Query edit if need
561
    $query_edit_cb->($query) if $query_edit_cb;
562
    
563
    # Execute query
version 0.0901
yuki-kimoto authored on 2009-12-17
564
    my $ret_val = $self->query($query, $where_params);
packaging one directory
yuki-kimoto authored on 2009-11-16
565
    
566
    return $ret_val;
567
}
568

            
569
sub delete_all {
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
570
    my $self             = shift;
571
    my $table            = shift || '';
572
    my $append_statement = shift unless ref $_[0];
573
    my $query_edit_cb    = shift;
574
    my $options          = {allow_delete_all => 1};
575
    
update document
yuki-kimoto authored on 2010-01-30
576
    # Delete all rows
insert, update, delete appnd...
yuki-kimoto authored on 2009-11-16
577
    return $self->delete($table, {}, $append_statement, $query_edit_cb,
578
                         $options);
packaging one directory
yuki-kimoto authored on 2009-11-16
579
}
580

            
581
sub _select_usage { return << 'EOS' }
582
Your select arguments is wrong.
583
select usage:
584
$dbi->select(
cleanup
yuki-kimoto authored on 2010-02-11
585
    $table,                # String or array ref
586
    [@$columns],           # Array reference. this can be ommited
587
    {%$where_params},      # Hash reference.  this can be ommited
588
    $append_statement,     # String.          this can be ommited
589
    $query_edit_callback   # Sub reference.   this can be ommited
packaging one directory
yuki-kimoto authored on 2009-11-16
590
);
591
EOS
592

            
593
sub select {
594
    my $self = shift;
595
    
596
    # Check argument
597
    croak($self->_select_usage) unless @_;
598
    
599
    # Arguments
600
    my $tables = shift || '';
601
    $tables    = [$tables] unless ref $tables;
602
    
603
    my $columns          = ref $_[0] eq 'ARRAY' ? shift : [];
604
    my $where_params     = ref $_[0] eq 'HASH'  ? shift : {};
605
    my $append_statement = $_[0] && !ref $_[0]  ? shift : '';
606
    my $query_edit_cb    = shift if ref $_[0] eq 'CODE';
607
    
608
    # Check rest argument
609
    croak($self->_select_usage) if @_;
610
    
611
    # SQL template for select statement
612
    my $template = 'select ';
613
    
614
    # Join column clause
615
    if (@$columns) {
616
        foreach my $column (@$columns) {
617
            $template .= "$column, ";
618
        }
619
        $template =~ s/, $/ /;
620
    }
621
    else {
622
        $template .= '* ';
623
    }
624
    
625
    # Join table
626
    $template .= 'from ';
627
    foreach my $table (@$tables) {
628
        $template .= "$table, ";
629
    }
630
    $template =~ s/, $/ /;
631
    
632
    # Where clause keys
633
    my @where_keys = keys %$where_params;
634
    
many change
yuki-kimoto authored on 2010-02-11
635
    my $where_params_new = {};
636
    
packaging one directory
yuki-kimoto authored on 2009-11-16
637
    # Join where clause
638
    if (@where_keys) {
639
        $template .= 'where ';
640
        foreach my $where_key (@where_keys) {
many change
yuki-kimoto authored on 2010-02-11
641
            my $key_info = DBIx::Custom::KeyInfo->new($where_key);
642
            
643
            my $table_new = $key_info->table || $tables->[0];
644
            my $column = $table_new . '.' . $key_info->column
645
                         . '#' . $table_new;
646
                      
647
            $template .= "{= $column} and ";
648
            
649
            $where_params_new->{$table_new} ||= {};
650
            $where_params_new->{$table_new}->{$key_info->column}
651
              = $where_params->{$where_key};
packaging one directory
yuki-kimoto authored on 2009-11-16
652
        }
653
    }
654
    $template =~ s/ and $//;
655
    
656
    # Append something to last of statement
657
    if ($append_statement =~ s/^where //) {
658
        if (@where_keys) {
659
            $template .= " and $append_statement";
660
        }
661
        else {
662
            $template .= " where $append_statement";
663
        }
664
    }
665
    else {
666
        $template .= " $append_statement";
667
    }
668
    
669
    # Create query
Simplify key search
yuki-kimoto authored on 2010-02-11
670
    my $query = $self->create_query([$tables->[0], $template]);
packaging one directory
yuki-kimoto authored on 2009-11-16
671
    
672
    # Query edit
673
    $query_edit_cb->($query) if $query_edit_cb;
674
    
675
    # Execute query
many change
yuki-kimoto authored on 2010-02-11
676
    my $result = $self->query($query, $where_params_new);
packaging one directory
yuki-kimoto authored on 2009-11-16
677
    
678
    return $result;
679
}
680

            
681
sub _add_query_cache {
682
    my ($class, $template, $query) = @_;
update document
yuki-kimoto authored on 2010-01-30
683
    
684
    # Query information
packaging one directory
yuki-kimoto authored on 2009-11-16
685
    my $query_cache_keys = $class->_query_cache_keys;
686
    my $query_caches     = $class->_query_caches;
687
    
update document
yuki-kimoto authored on 2010-01-30
688
    # Already cached
packaging one directory
yuki-kimoto authored on 2009-11-16
689
    return $class if $query_caches->{$template};
690
    
update document
yuki-kimoto authored on 2010-01-30
691
    # Cache
packaging one directory
yuki-kimoto authored on 2009-11-16
692
    $query_caches->{$template} = $query;
693
    push @$query_cache_keys, $template;
694
    
update document
yuki-kimoto authored on 2010-01-30
695
    # Check cache overflow
packaging one directory
yuki-kimoto authored on 2009-11-16
696
    my $overflow = @$query_cache_keys - $class->query_cache_max;
697
    for (my $i = 0; $i < $overflow; $i++) {
698
        my $template = shift @$query_cache_keys;
699
        delete $query_caches->{$template};
700
    }
701
    
702
    return $class;
703
}
704

            
705
=head1 NAME
706

            
version 0.0901
yuki-kimoto authored on 2009-12-17
707
DBIx::Custom - Customizable DBI
packaging one directory
yuki-kimoto authored on 2009-11-16
708

            
version 0.0901
yuki-kimoto authored on 2009-12-17
709
=head1 VERSION
packaging one directory
yuki-kimoto authored on 2009-11-16
710

            
many change
yuki-kimoto authored on 2010-02-11
711
Version 0.1201
catch up with Object::Simple...
yuki-kimoto authored on 2010-01-18
712

            
713
=cut
714

            
many change
yuki-kimoto authored on 2010-02-11
715
our $VERSION = '0.1201';
packaging one directory
yuki-kimoto authored on 2009-11-16
716

            
cleanup
yuki-kimoto authored on 2010-02-11
717
=head1 STATE
718

            
719
This module is not stable. Method name and functionality will be change.
720

            
version 0.0901
yuki-kimoto authored on 2009-12-17
721
=head1 SYNOPSYS
722
    
723
    # New
724
    my $dbi = DBIx::Custom->new(data_source => "dbi:mysql:database=books"
725
                                user => 'ken', password => '!LFKD%$&');
726
    
727
    # Query
728
    $dbi->query("select title from books");
729
    
730
    # Query with parameters
731
    $dbi->query("select id from books where {= author} && {like title}",
732
                {author => 'ken', title => '%Perl%'});
733
    
734
    # Insert 
735
    $dbi->insert('books', {title => 'perl', author => 'Ken'});
736
    
737
    # Update 
738
    $dbi->update('books', {title => 'aaa', author => 'Ken'}, {id => 5});
739
    
740
    # Delete
741
    $dbi->delete('books', {author => 'Ken'});
742
    
743
    # Select
744
    $dbi->select('books');
745
    $dbi->select('books', {author => 'taro'}); 
746
    $dbi->select('books', [qw/author title/], {author => 'Ken'});
747
    $dbi->select('books', [qw/author title/], {author => 'Ken'},
748
                 'order by id limit 1');
packaging one directory
yuki-kimoto authored on 2009-11-16
749

            
update document
yuki-kimoto authored on 2010-01-30
750
=head1 ATTRIBUTES
packaging one directory
yuki-kimoto authored on 2009-11-16
751

            
752
=head2 user
753

            
update document
yuki-kimoto authored on 2010-01-30
754
Database user name
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
755
    
version 0.0901
yuki-kimoto authored on 2009-12-17
756
    $dbi  = $dbi->user('Ken');
757
    $user = $dbi->user;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
758
    
packaging one directory
yuki-kimoto authored on 2009-11-16
759
=head2 password
760

            
update document
yuki-kimoto authored on 2010-01-30
761
Database password
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
762
    
version 0.0901
yuki-kimoto authored on 2009-12-17
763
    $dbi      = $dbi->password('lkj&le`@s');
764
    $password = $dbi->password;
packaging one directory
yuki-kimoto authored on 2009-11-16
765

            
766
=head2 data_source
767

            
update document
yuki-kimoto authored on 2010-01-30
768
Database data source
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
769
    
version 0.0901
yuki-kimoto authored on 2009-12-17
770
    $dbi         = $dbi->data_source("dbi:mysql:dbname=$database");
771
    $data_source = $dbi->data_source;
packaging one directory
yuki-kimoto authored on 2009-11-16
772
    
version 0.0901
yuki-kimoto authored on 2009-12-17
773
If you know data source more, See also L<DBI>.
774

            
packaging one directory
yuki-kimoto authored on 2009-11-16
775
=head2 database
776

            
update document
yuki-kimoto authored on 2010-01-30
777
Database name
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
778

            
version 0.0901
yuki-kimoto authored on 2009-12-17
779
    $dbi      = $dbi->database('books');
780
    $database = $dbi->database;
packaging one directory
yuki-kimoto authored on 2009-11-16
781

            
add port and host method
yuki-kimoto authored on 2009-11-16
782
=head2 host
783

            
update document
yuki-kimoto authored on 2010-01-30
784
Host name
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
785

            
version 0.0901
yuki-kimoto authored on 2009-12-17
786
    $dbi  = $dbi->host('somehost.com');
787
    $host = $dbi->host;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
788

            
version 0.0901
yuki-kimoto authored on 2009-12-17
789
You can also set IP address like '127.03.45.12'.
add port and host method
yuki-kimoto authored on 2009-11-16
790

            
791
=head2 port
792

            
update document
yuki-kimoto authored on 2010-01-30
793
Port number
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
794

            
version 0.0901
yuki-kimoto authored on 2009-12-17
795
    $dbi  = $dbi->port(1198);
796
    $port = $dbi->port;
add port and host method
yuki-kimoto authored on 2009-11-16
797

            
version 0.0901
yuki-kimoto authored on 2009-12-17
798
=head2 options
packaging one directory
yuki-kimoto authored on 2009-11-16
799

            
update document
yuki-kimoto authored on 2010-01-30
800
DBI options
packaging one directory
yuki-kimoto authored on 2009-11-16
801

            
version 0.0901
yuki-kimoto authored on 2009-12-17
802
    $dbi     = $dbi->options({PrintError => 0, RaiseError => 1});
803
    $options = $dbi->options;
packaging one directory
yuki-kimoto authored on 2009-11-16
804

            
version 0.0901
yuki-kimoto authored on 2009-12-17
805
=head2 sql_tmpl
packaging one directory
yuki-kimoto authored on 2009-11-16
806

            
update document
yuki-kimoto authored on 2010-01-30
807
SQL::Template object
packaging one directory
yuki-kimoto authored on 2009-11-16
808

            
version 0.0901
yuki-kimoto authored on 2009-12-17
809
    $dbi      = $dbi->sql_tmpl(DBIx::Cutom::SQL::Template->new);
810
    $sql_tmpl = $dbi->sql_tmpl;
packaging one directory
yuki-kimoto authored on 2009-11-16
811

            
version 0.0901
yuki-kimoto authored on 2009-12-17
812
See also L<DBIx::Custom::SQL::Template>.
packaging one directory
yuki-kimoto authored on 2009-11-16
813

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
814
=head2 filters
packaging one directory
yuki-kimoto authored on 2009-11-16
815

            
update document
yuki-kimoto authored on 2010-01-30
816
Filters
packaging one directory
yuki-kimoto authored on 2009-11-16
817

            
version 0.0901
yuki-kimoto authored on 2009-12-17
818
    $dbi     = $dbi->filters({filter1 => sub { }, filter2 => sub {}});
819
    $filters = $dbi->filters;
packaging one directory
yuki-kimoto authored on 2009-11-16
820
    
version 0.0901
yuki-kimoto authored on 2009-12-17
821
This method is generally used to get a filter.
822

            
823
    $filter = $dbi->filters->{encode_utf8};
824

            
825
If you add filter, use add_filter method.
packaging one directory
yuki-kimoto authored on 2009-11-16
826

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
827
=head2 formats
packaging one directory
yuki-kimoto authored on 2009-11-16
828

            
update document
yuki-kimoto authored on 2010-01-30
829
Formats
packaging one directory
yuki-kimoto authored on 2009-11-16
830

            
version 0.0901
yuki-kimoto authored on 2009-12-17
831
    $dbi     = $dbi->formats({format1 => sub { }, format2 => sub {}});
832
    $formats = $dbi->formats;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
833

            
version 0.0901
yuki-kimoto authored on 2009-12-17
834
This method is generally used to get a format.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
835

            
version 0.0901
yuki-kimoto authored on 2009-12-17
836
    $filter = $dbi->formats->{datetime};
837

            
838
If you add format, use add_format method.
packaging one directory
yuki-kimoto authored on 2009-11-16
839

            
cleanup
yuki-kimoto authored on 2010-04-28
840
=head2 default_bind_filter
packaging one directory
yuki-kimoto authored on 2009-11-16
841

            
update document
yuki-kimoto authored on 2010-01-30
842
Binding filter
packaging one directory
yuki-kimoto authored on 2009-11-16
843

            
cleanup
yuki-kimoto authored on 2010-04-28
844
    $dbi                 = $dbi->default_bind_filter($default_bind_filter);
845
    $default_bind_filter = $dbi->default_bind_filter
packaging one directory
yuki-kimoto authored on 2009-11-16
846

            
version 0.0901
yuki-kimoto authored on 2009-12-17
847
The following is bind filter sample
cleanup
yuki-kimoto authored on 2010-04-28
848
    
849
    $dbi->add_filter(encode_utf8 => sub {
850
        my $value = shift;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
851
        
cleanup
yuki-kimoto authored on 2010-04-28
852
        require Encode 'encode_utf8';
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
853
        
cleanup
yuki-kimoto authored on 2010-04-28
854
        return encode_utf8($value);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
855
    });
cleanup
yuki-kimoto authored on 2010-04-28
856
    
857
    $dbi->default_bind_filter('encode_utf8')
packaging one directory
yuki-kimoto authored on 2009-11-16
858

            
version 0.0901
yuki-kimoto authored on 2009-12-17
859
Bind filter arguemts is
860

            
861
    1. $value : Value
862
    2. $key   : Key
863
    3. $dbi   : DBIx::Custom object
864
    4. $infos : {table => $table, column => $column}
865

            
cleanup
yuki-kimoto authored on 2010-04-28
866
=head2 default_fetch_filter
packaging one directory
yuki-kimoto authored on 2009-11-16
867

            
update document
yuki-kimoto authored on 2010-01-30
868
Fetching filter
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
869

            
cleanup
yuki-kimoto authored on 2010-04-28
870
    $dbi                  = $dbi->default_fetch_filter($default_fetch_filter);
871
    $default_fetch_filter = $dbi->default_fetch_filter;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
872

            
version 0.0901
yuki-kimoto authored on 2009-12-17
873
The following is fetch filter sample
packaging one directory
yuki-kimoto authored on 2009-11-16
874

            
cleanup
yuki-kimoto authored on 2010-04-28
875
    $dbi->add_filter(decode_utf8 => sub {
876
        my $value = shift;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
877
        
cleanup
yuki-kimoto authored on 2010-04-28
878
        require Encode 'decode_utf8';
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
879
        
cleanup
yuki-kimoto authored on 2010-04-28
880
        return decode_utf8($value);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
881
    });
packaging one directory
yuki-kimoto authored on 2009-11-16
882

            
cleanup
yuki-kimoto authored on 2010-04-28
883
    $dbi->default_fetch_filter('decode_utf8');
884

            
version 0.0901
yuki-kimoto authored on 2009-12-17
885
Bind filter arguemts is
886

            
887
    1. $value : Value
888
    2. $key   : Key
889
    3. $dbi   : DBIx::Custom object
890
    4. $infos : {type => $table, sth => $sth, index => $index}
891

            
packaging one directory
yuki-kimoto authored on 2009-11-16
892
=head2 result_class
893

            
update document
yuki-kimoto authored on 2010-01-30
894
Resultset class
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
895

            
version 0.0901
yuki-kimoto authored on 2009-12-17
896
    $dbi          = $dbi->result_class('DBIx::Custom::Result');
packaging one directory
yuki-kimoto authored on 2009-11-16
897
    $result_class = $dbi->result_class;
898

            
update document
yuki-kimoto authored on 2010-01-30
899
Default is L<DBIx::Custom::Result>
900

            
packaging one directory
yuki-kimoto authored on 2009-11-16
901
=head2 dbh
902

            
update document
yuki-kimoto authored on 2010-01-30
903
Database handle
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
904
    
version 0.0901
yuki-kimoto authored on 2009-12-17
905
    $dbi = $dbi->dbh($dbh);
906
    $dbh = $dbi->dbh;
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
907
    
908
=head2 query_cache_max
909

            
update document
yuki-kimoto authored on 2010-01-30
910
Query cache max
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
911

            
version 0.0901
yuki-kimoto authored on 2009-12-17
912
    $class           = DBIx::Custom->query_cache_max(50);
913
    $query_cache_max = DBIx::Custom->query_cache_max;
914

            
915
Default value is 50
916

            
update document
yuki-kimoto authored on 2010-01-30
917
=head1 METHODS
918

            
919
This class is L<Object::Simple> subclass.
920
You can use all methods of L<Object::Simple>
packaging one directory
yuki-kimoto authored on 2009-11-16
921

            
922
=head2 connect
923

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
924
Connect to database
925

            
packaging one directory
yuki-kimoto authored on 2009-11-16
926
    $dbi->connect;
927

            
928
=head2 disconnect
929

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
930
Disconnect database
931

            
packaging one directory
yuki-kimoto authored on 2009-11-16
932
    $dbi->disconnect;
933

            
version 0.0901
yuki-kimoto authored on 2009-12-17
934
If database is already disconnected, this method do nothing.
packaging one directory
yuki-kimoto authored on 2009-11-16
935

            
936
=head2 reconnect
937

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
938
Reconnect to database
939

            
packaging one directory
yuki-kimoto authored on 2009-11-16
940
    $dbi->reconnect;
941

            
942
=head2 connected
943

            
version 0.0901
yuki-kimoto authored on 2009-12-17
944
Check if database is connected.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
945
    
version 0.0901
yuki-kimoto authored on 2009-12-17
946
    $is_connected = $dbi->connected;
packaging one directory
yuki-kimoto authored on 2009-11-16
947
    
948
=head2 add_filter
949

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
950
Resist filter
packaging one directory
yuki-kimoto authored on 2009-11-16
951
    
version 0.0901
yuki-kimoto authored on 2009-12-17
952
    $dbi->add_filter($fname1 => $filter1, $fname => $filter2);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
953
    
version 0.0901
yuki-kimoto authored on 2009-12-17
954
The following is add_filter sample
955

            
packaging one directory
yuki-kimoto authored on 2009-11-16
956
    $dbi->add_filter(
957
        encode_utf8 => sub {
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
958
            my ($value, $key, $dbi, $infos) = @_;
959
            utf8::upgrade($value) unless Encode::is_utf8($value);
960
            return encode('UTF-8', $value);
packaging one directory
yuki-kimoto authored on 2009-11-16
961
        },
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
962
        decode_utf8 => sub {
963
            my ($value, $key, $dbi, $infos) = @_;
964
            return decode('UTF-8', $value)
packaging one directory
yuki-kimoto authored on 2009-11-16
965
        }
966
    );
967

            
968
=head2 add_format
969

            
version 0.0901
yuki-kimoto authored on 2009-12-17
970
Add format
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
971

            
version 0.0901
yuki-kimoto authored on 2009-12-17
972
    $dbi->add_format($fname1 => $format, $fname2 => $format2);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
973
    
version 0.0901
yuki-kimoto authored on 2009-12-17
974
The following is add_format sample.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
975

            
version 0.0901
yuki-kimoto authored on 2009-12-17
976
    $dbi->add_format(date => '%Y:%m:%d', datetime => '%Y-%m-%d %H:%M:%S');
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
977

            
version 0.0901
yuki-kimoto authored on 2009-12-17
978
=head2 create_query
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
979
    
version 0.0901
yuki-kimoto authored on 2009-12-17
980
Create Query object parsing SQL template
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
981

            
version 0.0901
yuki-kimoto authored on 2009-12-17
982
    my $query = $dbi->create_query("select * from authors where {= name} and {= age}");
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
983

            
version 0.0901
yuki-kimoto authored on 2009-12-17
984
$query is <DBIx::Query> object. This is executed by query method as the following
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
985

            
version 0.0901
yuki-kimoto authored on 2009-12-17
986
    $dbi->query($query, $params);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
987

            
version 0.0901
yuki-kimoto authored on 2009-12-17
988
If you know SQL template, see also L<DBIx::Custom::SQL::Template>.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
989

            
version 0.0901
yuki-kimoto authored on 2009-12-17
990
=head2 query
packaging one directory
yuki-kimoto authored on 2009-11-16
991

            
version 0.0901
yuki-kimoto authored on 2009-12-17
992
Query
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
993

            
version 0.0901
yuki-kimoto authored on 2009-12-17
994
    $result = $dbi->query($template, $params);
packaging one directory
yuki-kimoto authored on 2009-11-16
995

            
version 0.0901
yuki-kimoto authored on 2009-12-17
996
The following is query sample
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
997

            
packaging one directory
yuki-kimoto authored on 2009-11-16
998
    $result = $dbi->query("select * from authors where {= name} and {= age}", 
999
                          {author => 'taro', age => 19});
1000
    
1001
    while (my @row = $result->fetch) {
1002
        # do something
1003
    }
1004

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1005
If you now syntax of template, See also L<DBIx::Custom::SQL::Template>
1006

            
1007
Return value of query method is L<DBIx::Custom::Result> object
1008

            
1009
See also L<DBIx::Custom::Result>.
packaging one directory
yuki-kimoto authored on 2009-11-16
1010

            
remove run_transaction().
yuki-kimoto authored on 2010-01-30
1011
=head2 transaction
packaging one directory
yuki-kimoto authored on 2009-11-16
1012

            
remove run_transaction().
yuki-kimoto authored on 2010-01-30
1013
Get L<DBIx::Custom::Transaction> object, and you run a transaction.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1014

            
remove run_transaction().
yuki-kimoto authored on 2010-01-30
1015
    $dbi->transaction->run(sub {
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1016
        my $dbi = shift;
1017
        
packaging one directory
yuki-kimoto authored on 2009-11-16
1018
        # do something
1019
    });
1020

            
1021
If transaction is success, commit is execute. 
1022
If tranzation is died, rollback is execute.
1023

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1024
=head2 create_table
1025

            
1026
Create table
1027

            
1028
    $dbi->create_table(
1029
        'books',
1030
        'name char(255)',
1031
        'age  int'
1032
    );
1033

            
1034
First argument is table name. Rest arguments is column definition.
1035

            
1036
=head2 drop_table
1037

            
1038
Drop table
1039

            
1040
    $dbi->drop_table('books');
1041

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1042
=head2 insert
1043

            
update document
yuki-kimoto authored on 2009-11-19
1044
Insert row
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1045

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1046
    $affected = $dbi->insert($table, \%$insert_params);
1047
    $affected = $dbi->insert($table, \%$insert_params, $append);
update document
yuki-kimoto authored on 2009-11-19
1048

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1049
Retrun value is affected rows count
packaging one directory
yuki-kimoto authored on 2009-11-16
1050
    
version 0.0901
yuki-kimoto authored on 2009-12-17
1051
The following is insert sample.
1052

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1053
    $dbi->insert('books', {title => 'Perl', author => 'Taro'});
1054

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1055
You can add statement.
1056

            
1057
    $dbi->insert('books', {title => 'Perl', author => 'Taro'}, "some statement");
1058

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1059
=head2 update
1060

            
update document
yuki-kimoto authored on 2009-11-19
1061
Update rows
1062

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1063
    $affected = $dbi->update($table, \%update_params, \%where);
1064
    $affected = $dbi->update($table, \%update_params, \%where, $append);
1065

            
1066
Retrun value is affected rows count
update document
yuki-kimoto authored on 2009-11-19
1067

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1068
The following is update sample.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1069

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1070
    $dbi->update('books', {title => 'Perl', author => 'Taro'}, {id => 5});
1071

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1072
You can add statement.
1073

            
1074
    $dbi->update('books', {title => 'Perl', author => 'Taro'},
1075
                 {id => 5}, "some statement");
1076

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1077
=head2 update_all
1078

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1079
Update all rows
1080

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1081
    $affected = $dbi->update_all($table, \%updat_params);
update document
yuki-kimoto authored on 2009-11-19
1082

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1083
Retrun value is affected rows count
1084

            
1085
The following is update_all sample.
update document
yuki-kimoto authored on 2009-11-19
1086

            
1087
    $dbi->update_all('books', {author => 'taro'});
packaging one directory
yuki-kimoto authored on 2009-11-16
1088

            
1089
=head2 delete
1090

            
update document
yuki-kimoto authored on 2009-11-19
1091
Delete rows
1092

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1093
    $affected = $dbi->delete($table, \%where);
1094
    $affected = $dbi->delete($table, \%where, $append);
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1095

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1096
Retrun value is affected rows count
packaging one directory
yuki-kimoto authored on 2009-11-16
1097
    
version 0.0901
yuki-kimoto authored on 2009-12-17
1098
The following is delete sample.
1099

            
update document
yuki-kimoto authored on 2009-11-19
1100
    $dbi->delete('books', {id => 5});
packaging one directory
yuki-kimoto authored on 2009-11-16
1101

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1102
You can add statement.
1103

            
1104
    $dbi->delete('books', {id => 5}, "some statement");
1105

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1106
=head2 delete_all
1107

            
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1108
Delete all rows
1109

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1110
    $affected = $dbi->delete_all($table);
packaging one directory
yuki-kimoto authored on 2009-11-16
1111

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1112
Retrun value is affected rows count
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1113

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1114
The following is delete_all sample.
1115

            
1116
    $dbi->delete_all('books');
packaging one directory
yuki-kimoto authored on 2009-11-16
1117

            
1118
=head2 select
1119
    
update document
yuki-kimoto authored on 2009-11-19
1120
Select rows
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
1121

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1122
    $resut = $dbi->select(
packaging one directory
yuki-kimoto authored on 2009-11-16
1123
        $table,                # must be string or array;
version 0.0901
yuki-kimoto authored on 2009-12-17
1124
        \@$columns,            # must be array reference. this can be ommited
1125
        \%$where_params,       # must be hash reference.  this can be ommited
1126
        $append_statement,     # must be string.          this can be ommited
1127
        $query_edit_callback   # must be code reference.  this can be ommited
packaging one directory
yuki-kimoto authored on 2009-11-16
1128
    );
update document
yuki-kimoto authored on 2009-11-19
1129

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1130
$reslt is L<DBIx::Custom::Result> object
update document
yuki-kimoto authored on 2009-11-19
1131

            
1132
The following is some select samples
1133

            
1134
    # select * from books;
1135
    $result = $dbi->select('books');
packaging one directory
yuki-kimoto authored on 2009-11-16
1136
    
update document
yuki-kimoto authored on 2009-11-19
1137
    # select * from books where title = 'Perl';
1138
    $result = $dbi->select('books', {title => 1});
1139
    
1140
    # select title, author from books where id = 1 for update;
1141
    $result = $dbi->select(
1142
        'books',              # table
1143
        ['title', 'author'],  # columns
1144
        {id => 1},            # where clause
1145
        'for update',         # append statement
1146
    );
1147

            
1148
You can join multi tables
1149
    
1150
    $result = $dbi->select(
1151
        ['table1', 'table2'],                # tables
1152
        ['table1.id as table1_id', 'title'], # columns (alias is ok)
1153
        {table1.id => 1},                    # where clase
1154
        "where table1.id = table2.id",       # join clause (must start 'where')
1155
    );
1156

            
1157
You can also edit query
1158
        
packaging one directory
yuki-kimoto authored on 2009-11-16
1159
    $dbi->select(
update document
yuki-kimoto authored on 2009-11-19
1160
        'books',
1161
        # column, where clause, append statement,
packaging one directory
yuki-kimoto authored on 2009-11-16
1162
        sub {
1163
            my $query = shift;
1164
            $query->bind_filter(sub {
1165
                # ...
1166
            });
1167
        }
update document
yuki-kimoto authored on 2009-11-19
1168
    }
1169

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1170
=head2 prepare
1171

            
1172
Prepare statement handle.
1173

            
1174
    $sth = $dbi->prepare('select * from books;');
1175

            
1176
This method is same as DBI prepare method.
1177

            
1178
See also L<DBI>.
1179

            
1180
=head2 do
1181

            
1182
Execute SQL
1183

            
1184
    $affected = $dbi->do('insert into books (title, author) values (?, ?)',
1185
                        'Perl', 'taro');
1186

            
1187
Retrun value is affected rows count.
1188

            
1189
This method is same as DBI do method.
1190

            
1191
See also L<DBI>
1192

            
remove DBIx::Custom::Transac...
yuki-kimoto authored on 2010-02-11
1193
=head2 run_transaction
1194

            
1195

            
1196

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1197
=head1 DBIx::Custom default configuration
packaging one directory
yuki-kimoto authored on 2009-11-16
1198

            
update document
yuki-kimoto authored on 2009-11-19
1199
DBIx::Custom have DBI object.
packaging one directory
yuki-kimoto authored on 2009-11-16
1200
This module is work well in the following DBI condition.
1201

            
1202
    1. AutoCommit is true
1203
    2. RaiseError is true
1204

            
1205
By default, Both AutoCommit and RaiseError is true.
1206
You must not change these mode not to damage your data.
1207

            
1208
If you change these mode, 
1209
you cannot get correct error message, 
1210
or run_transaction may fail.
1211

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1212
=head1 Inheritance of DBIx::Custom
1213

            
1214
DBIx::Custom is customizable DBI.
1215
You can inherit DBIx::Custom and custumize attributes.
1216

            
1217
    package DBIx::Custom::Yours;
1218
    use base DBIx::Custom;
1219
    
1220
    my $class = __PACKAGE__;
1221
    
1222
    $class->user('your_name');
1223
    $class->password('your_password');
1224

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1225
=head1 AUTHOR
1226

            
1227
Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
1228

            
1229
Github L<http://github.com/yuki-kimoto>
1230

            
version 0.0901
yuki-kimoto authored on 2009-12-17
1231
I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom>
1232

            
packaging one directory
yuki-kimoto authored on 2009-11-16
1233
=head1 COPYRIGHT & LICENSE
1234

            
1235
Copyright 2009 Yuki Kimoto, all rights reserved.
1236

            
1237
This program is free software; you can redistribute it and/or modify it
1238
under the same terms as Perl itself.
1239

            
1240
=cut