DBIx-Custom / lib / DBIx / Custom.pm /
Newer Older
3788 lines | 92.744kb
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
1
use 5.008007;
cleanup
yuki-kimoto authored on 2009-12-22
2
package DBIx::Custom;
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
3
use Object::Simple -base;
cleanup
yuki-kimoto authored on 2009-12-22
4

            
cleanup
Yuki Kimoto authored on 2012-02-28
5
our $VERSION = '0.22';
cleanup
yuki-kimoto authored on 2009-12-22
6

            
packaging one directory
yuki-kimoto authored on 2009-11-16
7
use Carp 'croak';
8
use DBI;
9
use DBIx::Custom::Result;
cleanup
yuki-kimoto authored on 2010-02-11
10
use DBIx::Custom::Query;
cleanup
yuki-kimoto authored on 2010-08-05
11
use DBIx::Custom::QueryBuilder;
added experimental DBIx::Cus...
Yuki Kimoto authored on 2011-01-18
12
use DBIx::Custom::Where;
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
13
use DBIx::Custom::Model;
cleanup
Yuki Kimoto authored on 2011-01-25
14
use DBIx::Custom::Tag;
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
15
use DBIx::Custom::Order;
cleanup
Yuki Kimoto authored on 2011-04-25
16
use DBIx::Custom::Util qw/_array_to_hash _subname/;
added tests
Yuki Kimoto authored on 2011-08-26
17
use DBIx::Custom::Mapper;
- added EXPERIMENTAL pass at...
Yuki Kimoto authored on 2011-09-02
18
use DBIx::Custom::NotExists;
improved debug message
Yuki Kimoto authored on 2011-05-23
19
use Encode qw/encode encode_utf8 decode_utf8/;
cleanup
Yuki Kimoto authored on 2011-08-13
20
use Scalar::Util qw/weaken/;
added experimental use_next_...
Yuki Kimoto authored on 2011-11-16
21

            
packaging one directory
yuki-kimoto authored on 2009-11-16
22

            
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
23
has [qw/connector dsn password quote user exclude_table user_table_info
cleanup
Yuki Kimoto authored on 2012-01-20
24
     user_column_info safety_character/],
added EXPERIMETNAL aysnc_con...
Yuki Kimoto authored on 2012-02-10
25
  async_conf => sub { {} },
cleanup
Yuki Kimoto authored on 2012-01-20
26
  cache => 0,
27
  cache_method => sub {
28
    sub {
29
      my $self = shift;
30
      $self->{_cached} ||= {};
31
      if (@_ > 1) { $self->{_cached}{$_[0]} = $_[1] }
32
      else { return $self->{_cached}{$_[0]} }
33
    }
34
  },
35
  option => sub { {} },
36
  default_option => sub {
37
    {
38
      RaiseError => 1,
39
      PrintError => 0,
40
      AutoCommit => 1
41
    }
42
  },
43
  filters => sub {
44
    {
45
      encode_utf8 => sub { encode_utf8($_[0]) },
46
      decode_utf8 => sub { decode_utf8($_[0]) }
47
    }
48
  },
49
  last_sql => '',
50
  models => sub { {} },
51
  now => sub {
52
    sub {
53
      my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
54
      $mon++;
55
      $year += 1900;
56
      my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d",
57
        $year, $mon, $mday, $hour, $min, $sec);
58
      return $now;
59
    }
60
  },
61
  query_builder => sub {
62
    my $self = shift;
63
    my $builder = DBIx::Custom::QueryBuilder->new(dbi => $self);
64
    weaken $builder->{dbi};
65
    return $builder;
66
  },
67
  result_class  => 'DBIx::Custom::Result',
68
  separator => '.',
69
  stash => sub { {} };
cleanup
yuki-kimoto authored on 2010-10-17
70

            
added EXPERIMENTAL system_ta...
Yuki Kimoto authored on 2011-08-10
71
sub available_datatype {
cleanup
Yuki Kimoto authored on 2012-01-20
72
  my $self = shift;
73
  
74
  my $data_types = '';
75
  for my $i (-1000 .. 1000) {
76
     my $type_info = $self->dbh->type_info($i);
77
     my $data_type = $type_info->{DATA_TYPE};
78
     my $type_name = $type_info->{TYPE_NAME};
79
     $data_types .= "$data_type ($type_name)\n"
80
       if defined $data_type;
81
  }
82
  return "Data Type maybe equal to Type Name" unless $data_types;
83
  $data_types = "Data Type (Type name)\n" . $data_types;
84
  return $data_types;
added EXPERIMENTAL system_ta...
Yuki Kimoto authored on 2011-08-10
85
}
86

            
87
sub available_typename {
cleanup
Yuki Kimoto authored on 2012-01-20
88
  my $self = shift;
89
  
90
  # Type Names
91
  my $type_names = {};
92
  $self->each_column(sub {
93
    my ($self, $table, $column, $column_info) = @_;
94
    $type_names->{$column_info->{TYPE_NAME}} = 1
95
      if $column_info->{TYPE_NAME};
96
  });
97
  my @output = sort keys %$type_names;
98
  unshift @output, "Type Name";
99
  return join "\n", @output;
test cleanup
Yuki Kimoto authored on 2011-08-10
100
}
101

            
added helper method
yuki-kimoto authored on 2010-10-17
102
our $AUTOLOAD;
103
sub AUTOLOAD {
cleanup
Yuki Kimoto authored on 2012-01-20
104
  my $self = shift;
added helper method
yuki-kimoto authored on 2010-10-17
105

            
cleanup
Yuki Kimoto authored on 2012-01-20
106
  # Method name
107
  my ($package, $mname) = $AUTOLOAD =~ /^([\w\:]+)\:\:(\w+)$/;
added helper method
yuki-kimoto authored on 2010-10-17
108

            
cleanup
Yuki Kimoto authored on 2012-01-20
109
  # Call method
110
  $self->{_methods} ||= {};
111
  if (my $method = $self->{_methods}->{$mname}) {
112
    return $self->$method(@_)
113
  }
114
  elsif ($self->{dbh} && (my $dbh_method = $self->dbh->can($mname))) {
115
    $self->dbh->$dbh_method(@_);
116
  }
117
  else {
118
    croak qq{Can't locate object method "$mname" via "$package" }
119
      . _subname;
120
  }
added helper method
yuki-kimoto authored on 2010-10-17
121
}
122

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
123
sub assign_clause {
cleanup
Yuki Kimoto authored on 2012-01-20
124
  my ($self, $param, $opts) = @_;
125
  
126
  my $wrap = $opts->{wrap} || {};
127
  my ($q, $p) = split //, $self->q('');
128
  
129
  # Assign clause (performance is important)
130
  join(
131
    ', ',
132
    map {
133
      ref $param->{$_} eq 'SCALAR' ? "$q$_$p = " . ${$param->{$_}}
134
      : $wrap->{$_} ? "$q$_$p = " . $wrap->{$_}->(":$_")
135
      : "$q$_$p = :$_";
136
    } sort keys %$param
137
  );
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
138
}
139

            
cleanup
Yuki Kimoto authored on 2011-03-21
140
sub column {
cleanup
Yuki Kimoto authored on 2012-01-20
141
  my $self = shift;
142
  my $option = pop if ref $_[-1] eq 'HASH';
143
  my $real_table = shift;
144
  my $columns = shift;
145
  my $table = $option->{alias} || $real_table;
146
  
147
  # Columns
148
  unless (defined $columns) {
149
    $columns ||= $self->model($real_table)->columns;
150
  }
151
  
152
  # Separator
153
  my $separator = $self->separator;
154
  
155
  # Column clause
156
  my @column;
157
  $columns ||= [];
158
  push @column, $self->q($table) . "." . $self->q($_) .
159
    " as " . $self->q("${table}${separator}$_")
160
    for @$columns;
161
  
162
  return join (', ', @column);
added helper method
yuki-kimoto authored on 2010-10-17
163
}
164

            
packaging one directory
yuki-kimoto authored on 2009-11-16
165
sub connect {
cleanup
Yuki Kimoto authored on 2012-01-20
166
  my $self = ref $_[0] ? shift : shift->new(@_);
167
  
168
  my $connector = $self->connector;
169
  
170
  if (!ref $connector && $connector) {
171
    require DBIx::Connector;
172
    
173
    my $dsn = $self->dsn;
174
    my $user = $self->user;
175
    my $password = $self->password;
176
    my $option = $self->_option;
177
    my $connector = DBIx::Connector->new($dsn, $user, $password,
178
      {%{$self->default_option} , %$option});
179
    $self->connector($connector);
180
  }
181
  
182
  # Connect
183
  $self->dbh;
184
  
185
  return $self;
packaging one directory
yuki-kimoto authored on 2009-11-16
186
}
187

            
- renamed DBIx::Custom::Resu...
Yuki Kimoto authored on 2012-01-20
188
sub count { shift->select(column => 'count(*)', @_)->fetch_one->[0] }
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-08-20
189

            
update pod
Yuki Kimoto authored on 2011-03-13
190
sub dbh {
cleanup
Yuki Kimoto authored on 2012-01-20
191
  my $self = shift;
192
  
193
  # Set
194
  if (@_) {
195
    $self->{dbh} = $_[0];
cleanup
Yuki Kimoto authored on 2011-04-02
196
    
cleanup
Yuki Kimoto authored on 2012-01-20
197
    return $self;
198
  }
199
  
200
  # Get
201
  else {
202
    # From Connction manager
203
    if (my $connector = $self->connector) {
204
      croak "connector must have dbh() method " . _subname
205
        unless ref $connector && $connector->can('dbh');
fixed dbh() method bug:wq
Yuki Kimoto authored on 2011-04-05
206
        
cleanup
Yuki Kimoto authored on 2012-01-20
207
      $self->{dbh} = $connector->dbh;
fixed dbh() method bug:wq
Yuki Kimoto authored on 2011-04-05
208
    }
209
    
cleanup
Yuki Kimoto authored on 2012-01-20
210
    # Connect
211
    $self->{dbh} ||= $self->_connect;
212
    
213
    # Quote
214
    if (!defined $self->reserved_word_quote && !defined $self->quote) {
215
      my $driver = $self->_driver;
216
      my $quote =  $driver eq 'odbc' ? '[]'
217
        : $driver eq 'ado' ? '[]'
218
        : $driver eq 'mysql' ? '`'
219
        : '"';
220
      $self->quote($quote);
update pod
Yuki Kimoto authored on 2011-03-13
221
    }
cleanup
Yuki Kimoto authored on 2012-01-20
222
    
223
    return $self->{dbh};
224
  }
update pod
Yuki Kimoto authored on 2011-03-13
225
}
226

            
cleanup
Yuki Kimoto authored on 2011-10-21
227
sub delete {
cleanup
Yuki Kimoto authored on 2012-01-20
228
  my ($self, %opt) = @_;
229
  warn "delete method where_param option is DEPRECATED!"
230
    if $opt{where_param};
231
  
232
  # Don't allow delete all rows
233
  croak qq{delete method where or id option must be specified } . _subname
234
    if !$opt{where} && !defined $opt{id} && !$opt{allow_delete_all};
235
  
236
  # Where
237
  my $w = $self->_where_clause_and_param($opt{where}, $opt{where_param},
238
    delete $opt{id}, $opt{primary_key}, $opt{table});
239

            
240
  # Delete statement
241
  my $sql = "delete ";
242
  $sql .= "$opt{prefix} " if defined $opt{prefix};
243
  $sql .= "from " . $self->q($opt{table}) . " $w->{clause} ";
244
  
245
  # Execute query
246
  $opt{statement} = 'delete';
247
  $self->execute($sql, $w->{param}, %opt);
packaging one directory
yuki-kimoto authored on 2009-11-16
248
}
249

            
cleanup
Yuki Kimoto authored on 2011-11-01
250
sub delete_all { shift->delete(@_, allow_delete_all => 1) }
packaging one directory
yuki-kimoto authored on 2009-11-16
251

            
added memory leak check test
Yuki Kimoto authored on 2011-08-15
252
sub DESTROY {}
added helper method
yuki-kimoto authored on 2010-10-17
253

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
254
sub create_model {
cleanup
Yuki Kimoto authored on 2012-01-20
255
  my $self = shift;
256
  
257
  # Options
258
  my $opt = ref $_[0] eq 'HASH' ? $_[0] : {@_};
259
  $opt->{dbi} = $self;
260
  my $model_class = delete $opt->{model_class} || 'DBIx::Custom::Model';
261
  my $model_name  = delete $opt->{name};
262
  my $model_table = delete $opt->{table};
263
  $model_name ||= $model_table;
264
  
265
  # Create model
266
  my $model = $model_class->new($opt);
267
  weaken $model->{dbi};
268
  $model->name($model_name) unless $model->name;
269
  $model->table($model_table) unless $model->table;
270
  
271
  # Apply filter(DEPRECATED logic)
272
  if ($model->{filter}) {
273
    my $filter = ref $model->filter eq 'HASH'
274
      ? [%{$model->filter}]
275
      : $model->filter;
276
    $filter ||= [];
277
    warn "DBIx::Custom::Model filter method is DEPRECATED!"
278
      if @$filter;
279
    $self->_apply_filter($model->table, @$filter);
280
  }
281
  
282
  # Set model
283
  $self->model($model->name, $model);
284
  
285
  return $self->model($model->name);
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
286
}
287

            
288
sub each_column {
cleanup
Yuki Kimoto authored on 2012-01-20
289
  my ($self, $cb, %options) = @_;
290

            
291
  my $user_column_info = $self->user_column_info;
292
  
293
  if ($user_column_info) {
294
    $self->$cb($_->{table}, $_->{column}, $_->{info}) for @$user_column_info;
295
  }
296
  else {
297
    my $re = $self->exclude_table || $options{exclude_table};
298
    # Tables
299
    my %tables;
300
    $self->each_table(sub { $tables{$_[1]}++ });
added EXPERIMENTAL system_ta...
Yuki Kimoto authored on 2011-08-10
301

            
cleanup
Yuki Kimoto authored on 2012-01-20
302
    # Iterate all tables
303
    my @tables = sort keys %tables;
304
    for (my $i = 0; $i < @tables; $i++) {
305
      my $table = $tables[$i];
306
      
307
      # Iterate all columns
308
      my $sth_columns;
309
      eval {$sth_columns = $self->dbh->column_info(undef, undef, $table, '%')};
310
      next if $@;
311
      while (my $column_info = $sth_columns->fetchrow_hashref) {
312
        my $column = $column_info->{COLUMN_NAME};
313
        $self->$cb($table, $column, $column_info);
314
      }
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
315
    }
cleanup
Yuki Kimoto authored on 2012-01-20
316
  }
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
317
}
318

            
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
319
sub each_table {
cleanup
Yuki Kimoto authored on 2012-01-20
320
  my ($self, $cb, %option) = @_;
321
  
322
  my $user_table_infos = $self->user_table_info;
323
  
324
  # Iterate tables
325
  if ($user_table_infos) {
326
      $self->$cb($_->{table}, $_->{info}) for @$user_table_infos;
327
  }
328
  else {
329
    my $re = $self->exclude_table || $option{exclude};
330
    my $sth_tables = $self->dbh->table_info;
331
    while (my $table_info = $sth_tables->fetchrow_hashref) {
332
      # Table
333
      my $table = $table_info->{TABLE_NAME};
334
      next if defined $re && $table =~ /$re/;
335
      $self->$cb($table, $table_info);
336
    }
337
  }
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
338
}
339

            
cleanup
Yuki Kimoto authored on 2011-04-02
340
sub execute {
cleanup
Yuki Kimoto authored on 2012-01-20
341
  my $self = shift;
342
  my $sql = shift;
343

            
344
  # Options
345
  my $params;
346
  $params = shift if @_ % 2;
347
  my %opt = @_;
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
348
  
349
  # Async query
added EXPERIMETNAL aysnc_con...
Yuki Kimoto authored on 2012-02-10
350
  $opt{prepare_attr} = $self->async_conf->{prepare_attr} if $opt{async};
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
351
  if ($opt{async} && !$self->{_new_connection}) {
352
    my $dsn = $self->dsn;
353
    croak qq/Data source must be specified when "async" option is used/
354
      unless defined $dsn;
355
    
356
    my $user = $self->user;
357
    my $password = $self->password;
358
    my $option = $self->_option;
359
    
360
    my $new_dbi = bless {%$self}, ref $self;
361
    $new_dbi->connector(undef);
362
    $new_dbi->{dbh} = DBI->connect($dsn, $user, $password,
363
      {%{$new_dbi->default_option}, %$option});
364
    
365
    $new_dbi->{_new_connection} = 1;
366
    return $new_dbi->execute($sql, defined $params ? ($params) : (), %opt);
367
  }
368
  
369
  # Options
cleanup
Yuki Kimoto authored on 2012-01-20
370
  warn "sqlfilter option is DEPRECATED" if $opt{sqlfilter};
371
  $params ||= $opt{param} || {};
372
  my $tables = $opt{table} || [];
373
  $tables = [$tables] unless ref $tables eq 'ARRAY';
374
  my $filter = ref $opt{filter} eq 'ARRAY' ?
375
    _array_to_hash($opt{filter}) : $opt{filter};
376
  
377
  # Merge second parameter
378
  my @cleanup;
379
  my $saved_param;
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
380
  $opt{statement} ||= '';
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
381
  $opt{statement} = 'select' if $opt{select};
cleanup
Yuki Kimoto authored on 2012-01-20
382
  if (($opt{statement} || '') ne 'insert' && ref $params eq 'ARRAY') {
383
    my $params2 = $params->[1];
384
    $params = $params->[0];
385
    for my $column (keys %$params2) {
386
      if (!exists $params->{$column}) {
387
        $params->{$column} = $params2->{$column};
388
        push @cleanup, $column;
389
      }
390
      else {
391
        delete $params->{$_} for @cleanup;
392
        @cleanup = ();
393
        $saved_param  = $params;
394
        $params = $self->merge_param($params, $params2);
395
        delete $saved_param->{$_} for (@{$opt{cleanup} || []});
396
        last;
397
      }
398
    }
399
  }
400
  $params = [$params] unless ref $params eq 'ARRAY';
401
  
402
  # Append
403
  $sql .= $opt{append} if defined $opt{append} && !ref $sql;
404
  
405
  # Query
406
  my $query;
407
  if (ref $sql) {
408
    $query = $sql;
409
    warn "execute method receiving query object as first parameter is DEPRECATED!" .
410
      "because this is very buggy.";
411
  }
412
  else {
413
    $query = $opt{reuse}->{$sql} if $opt{reuse};
414
    unless ($query) {
415
      my $c = $self->{safety_character};
416
      # Check unsafety keys
417
      unless ((join('', keys %{$params->[0]}) || '') =~ /^[$c\.]+$/) {
418
        for my $column (keys %{$params->[0]}) {
419
          croak qq{"$column" is not safety column name } . _subname
420
            unless $column =~ /^[$c\.]+$/;
micro optimization
Yuki Kimoto authored on 2011-11-16
421
        }
cleanup
Yuki Kimoto authored on 2012-01-20
422
      }
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
423
      $query = $self->_create_query($sql,
424
        $opt{after_build_sql} || $opt{sqlfilter}, $opt{prepare_attr});
cleanup
Yuki Kimoto authored on 2012-01-20
425
    }
426
    $query->{statement} = $opt{statement} || '';
427
    $opt{reuse}->{$sql} = $query if $opt{reuse};
428
  }
429
      
430
  # Save query
431
  $self->{last_sql} = $query->{sql};
432

            
433
  # Return query
434
  if ($opt{query}) {
435
    for my $column (@cleanup, @{$opt{cleanup} || []}) {
436
      delete $_->{$column} for @$params;
added EXPERIMENTAL reuse_que...
Yuki Kimoto authored on 2011-10-22
437
    }
cleanup
Yuki Kimoto authored on 2012-01-20
438
    return $query;
439
  };
440
  
441
  # Merge query filter(DEPRECATED!)
442
  $filter ||= $query->{filter} || {};
443
  
444
  # Tables
445
  unshift @$tables, @{$query->{tables} || []};
446
  my $main_table = @{$tables}[-1];
447

            
448
  # Merge id to parameter
449
  if (defined $opt{id}) {
450
    my $statement = $query->{statement};
451
    warn "execute method id option is DEPRECATED!" unless $statement;
452
    croak "execute id option must be specified with primary_key option"
453
      unless $opt{primary_key};
454
    $opt{primary_key} = [$opt{primary_key}] unless ref $opt{primary_key};
455
    $opt{id} = [$opt{id}] unless ref $opt{id};
456
    for (my $i = 0; $i < @{$opt{id}}; $i++) {
457
      my $key = $opt{primary_key}->[$i];
458
      $key = "$main_table.$key" if $statement eq 'update' ||
459
        $statement eq 'delete' || $statement eq 'select';
460
      next if exists $params->[0]->{$key};
461
      $params->[0]->{$key} = $opt{id}->[$i];
462
      push @cleanup, $key;1
463
    }
464
  }
465
  
466
  # Cleanup tables(DEPRECATED!)
467
  $tables = $self->_remove_duplicate_table($tables, $main_table)
468
    if @$tables > 1;
469
  
470
  # Type rule
471
  my $type_filters = {};
472
  my $type_rule_off = !$self->{_type_rule_is_called} || $opt{type_rule_off};
473
  unless ($type_rule_off) {
474
    my $type_rule_off_parts = {
475
      1 => $opt{type_rule1_off},
476
      2 => $opt{type_rule2_off}
cleanup
Yuki Kimoto authored on 2011-11-16
477
    };
cleanup
Yuki Kimoto authored on 2012-01-20
478
    for my $i (1, 2) {
479
      unless ($type_rule_off_parts->{$i}) {
480
        $type_filters->{$i} = {};
481
        my $table_alias = $opt{table_alias} || {};
482
        for my $alias (keys %$table_alias) {
483
          my $table = $table_alias->{$alias};
484
          
485
          for my $column (keys %{$self->{"_into$i"}{key}{$table} || {}}) {
486
            $type_filters->{$i}->{"$alias.$column"} = $self->{"_into$i"}{key}{$table}{$column};
487
          }
- insert method id value is ...
Yuki Kimoto authored on 2011-10-25
488
        }
cleanup
Yuki Kimoto authored on 2012-01-20
489
        $type_filters->{$i} = {%{$type_filters->{$i}}, %{$self->{"_into$i"}{key}{$main_table} || {}}}
490
          if $main_table;
491
      }
492
    }
493
  }
494
  
495
  # Applied filter(DEPRECATED!)
496
  if ($self->{filter}{on}) {
497
    my $applied_filter = {};
498
    for my $table (@$tables) {
499
      $applied_filter = {
500
        %$applied_filter,
501
        %{$self->{filter}{out}->{$table} || {}}
502
      }
503
    }
504
    $filter = {%$applied_filter, %$filter};
505
  }
506
  
507
  # Replace filter name to code
508
  for my $column (keys %$filter) {
509
    my $name = $filter->{$column};
510
    if (!defined $name) {
511
      $filter->{$column} = undef;
512
    }
513
    elsif (ref $name ne 'CODE') {
514
      croak qq{Filter "$name" is not registered" } . _subname
515
        unless exists $self->filters->{$name};
516
      $filter->{$column} = $self->filters->{$name};
517
    }
518
  }
519

            
520
  # Execute
521
  my $sth = $query->{sth};
522
  my $affected;
523
  if ((!$query->{duplicate} || $opt{bulk_insert}) && $type_rule_off
524
    && !keys %$filter && !$self->{default_out_filter}
525
    && !$opt{bind_type} && !$opt{type} && !$ENV{DBIX_CUSTOM_DEBUG})
526
  {
527
    eval {
528
      if ($opt{bulk_insert}) {
529
        my %count;
530
        my $param = $params->[0];
531
        $affected = $sth->execute(map { $param->{$_}->[++$count{$_} - 1] }
532
          @{$query->{columns}});
533
      }
534
      else {
- insert method can receive ...
Yuki Kimoto authored on 2011-11-25
535
        for my $param (@$params) {
cleanup
Yuki Kimoto authored on 2012-01-20
536
          $affected = $sth->execute(map { $param->{$_} }
537
            @{$query->{columns}});
- insert method can receive ...
Yuki Kimoto authored on 2011-11-25
538
        }
cleanup
Yuki Kimoto authored on 2012-01-20
539
      }
540
    };
541
  }
542
  else {
543
    for my $param (@$params) {
544
      # Create bind values
545
      my ($bind, $bind_types) = $self->_create_bind_values($param, $query->{columns},
546
        $filter, $type_filters, $opt{bind_type} || $opt{type} || {});
547

            
548
      # Execute
549
      eval {
550
        if ($opt{bind_type} || $opt{type}) {
551
          $sth->bind_param($_ + 1, $bind->[$_],
552
              $bind_types->[$_] ? $bind_types->[$_] : ())
553
            for (0 .. @$bind - 1);
554
          $affected = $sth->execute;
cleanup
Yuki Kimoto authored on 2011-01-12
555
        }
cleanup
Yuki Kimoto authored on 2012-01-20
556
        else { $affected = $sth->execute(@$bind) }
557

            
558
        # DEBUG message
559
        if ($ENV{DBIX_CUSTOM_DEBUG}) {
560
          warn "SQL:\n" . $query->{sql} . "\n";
561
          my @output;
562
          for my $value (@$bind) {
563
            $value = 'undef' unless defined $value;
564
            $value = encode($ENV{DBIX_CUSTOM_DEBUG_ENCODING} || 'UTF-8', $value)
565
              if utf8::is_utf8($value);
566
            push @output, $value;
567
          }
568
          warn "Bind values: " . join(', ', @output) . "\n\n";
569
        }
570
      };
571
    }
572
  }
573
  
574
  $self->_croak($@, qq{. Following SQL is executed.\n}
575
    . qq{$query->{sql}\n} . _subname) if $@;
576

            
577
  # Remove id from parameter
578
  for my $column (@cleanup, @{$opt{cleanup} || []}) {
579
    delete $_->{$column} for @$params;
580
  }
581
  
582
  # Not select statement
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
583
  return $affected if !$sth->{NUM_OF_FIELDS} && $opt{statement} ne 'select';
cleanup
Yuki Kimoto authored on 2012-01-20
584

            
585
  # Filter(DEPRECATED!)
586
  my $infilter = {};
587
  if ($self->{filter}{on}) {
588
    $infilter->{in}  = {};
589
    $infilter->{end} = {};
590
    push @$tables, $main_table if $main_table;
591
    for my $table (@$tables) {
592
      for my $way (qw/in end/) {
593
        $infilter->{$way} = {%{$infilter->{$way}},
594
          %{$self->{filter}{$way}{$table} || {}}};
595
      }
596
    }
597
  }
598
  
599
  # Result
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
600
  my $result = $self->result_class->new(
cleanup
Yuki Kimoto authored on 2012-01-20
601
    sth => $sth,
602
    dbi => $self,
603
    default_filter => $self->{default_in_filter},
604
    filter => $infilter->{in} || {},
605
    end_filter => $infilter->{end} || {},
606
    type_rule => {
607
      from1 => $self->type_rule->{from1},
608
      from2 => $self->type_rule->{from2}
609
    },
610
  );
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
611
  
612
  if (my $cb = $opt{async}) {
613
    require AnyEvent;
614
    my $watcher;
615
    weaken $self;
616
    $watcher = AnyEvent->io(
added EXPERIMETNAL aysnc_con...
Yuki Kimoto authored on 2012-02-10
617
      fh => $self->async_conf->{fh}->($self),
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
618
      poll => 'r',
619
      cb   => sub {
620
        $cb->($self, $result);
select method can be called ...
Yuki Kimoto authored on 2012-02-07
621
        undef $watcher;
622
        undef $result;
623
        undef $cb;
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
624
      },
625
    );
626
  }
627
  else { $result }
cleanup
yuki-kimoto authored on 2010-10-17
628
}
629

            
added test
Yuki Kimoto authored on 2011-08-16
630
sub get_table_info {
cleanup
Yuki Kimoto authored on 2012-01-20
631
  my ($self, %opt) = @_;
632
  
633
  my $exclude = delete $opt{exclude};
634
  croak qq/"$_" is wrong option/ for keys %opt;
635
  
636
  my $table_info = [];
637
  $self->each_table(
638
    sub { push @$table_info, {table => $_[1], info => $_[2] } },
639
    exclude => $exclude
640
  );
641
  
642
  return [sort {$a->{table} cmp $b->{table} } @$table_info];
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
643
}
644

            
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
645
sub get_column_info {
cleanup
Yuki Kimoto authored on 2012-01-20
646
  my ($self, %opt) = @_;
647
  
648
  my $exclude_table = delete $opt{exclude_table};
649
  croak qq/"$_" is wrong option/ for keys %opt;
650
  
651
  my $column_info = [];
652
  $self->each_column(
653
    sub { push @$column_info, {table => $_[1], column => $_[2], info => $_[3] } },
654
    exclude_table => $exclude_table
655
  );
656
  
657
  return [
658
    sort {$a->{table} cmp $b->{table} || $a->{column} cmp $b->{column} }
659
      @$column_info];
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
660
}
661

            
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
662
sub helper {
cleanup
Yuki Kimoto authored on 2012-01-20
663
  my $self = shift;
664
  
665
  # Register method
666
  my $methods = ref $_[0] eq 'HASH' ? $_[0] : {@_};
667
  $self->{_methods} = {%{$self->{_methods} || {}}, %$methods};
668
  
669
  return $self;
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
670
}
671

            
cleanup
yuki-kimoto authored on 2010-10-17
672
sub insert {
cleanup
Yuki Kimoto authored on 2012-01-20
673
  my $self = shift;
674
  
675
  # Options
676
  my $params = @_ % 2 ? shift : undef;
677
  my %opt = @_;
678
  warn "insert method param option is DEPRECATED!" if $opt{param};
679
  $params ||= delete $opt{param} || {};
680
  
681
  my $multi;
682
  if (ref $params eq 'ARRAY') { $multi = 1 }
683
  else { $params = [$params] }
684
  
685
  # Timestamp(DEPRECATED!)
686
  if (!$multi && $opt{timestamp} && (my $insert_timestamp = $self->insert_timestamp)) {
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
687
    warn "insert timestamp option is DEPRECATED! use ctime option";
cleanup
Yuki Kimoto authored on 2012-01-20
688
    my $columns = $insert_timestamp->[0];
689
    $columns = [$columns] unless ref $columns eq 'ARRAY';
690
    my $value = $insert_timestamp->[1];
691
    $value = $value->() if ref $value eq 'CODE';
692
    $params->[0]->{$_} = $value for @$columns;
693
  }
694

            
695
  # Created time and updated time
696
  my @timestamp_cleanup;
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
697
  warn "insert method created_at option is DEPRECATED! "
698
      . "use ctime option instead. " . _subname
699
    if $opt{created_at};
700
  warn "insert method updated_at option is DEPRECATED! "
701
      . "use mtime option instead. " . _subname
702
    if $opt{updated_at};
703
  $opt{ctime} ||= $opt{created_at};
704
  $opt{mtime} ||= $opt{updated_at};
705
  if (defined $opt{ctime} || defined $opt{mtime}) {
cleanup
Yuki Kimoto authored on 2012-01-20
706
    my $now = $self->now;
707
    $now = $now->() if ref $now eq 'CODE';
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
708
    if (defined $opt{ctime}) {
709
      $_->{$opt{ctime}} = $now for @$params;
710
      push @timestamp_cleanup, $opt{ctime};
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
711
    }
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
712
    if (defined $opt{mtime}) {
713
      $_->{$opt{mtime}} = $now for @$params;
714
      push @timestamp_cleanup, $opt{mtime};
cleanup
Yuki Kimoto authored on 2012-01-20
715
    }
716
  }
717
  
718
  # Merge id to parameter
719
  my @cleanup;
720
  my $id_param = {};
721
  if (defined $opt{id} && !$multi) {
722
    croak "insert id option must be specified with primary_key option"
723
      unless $opt{primary_key};
724
    $opt{primary_key} = [$opt{primary_key}] unless ref $opt{primary_key};
725
    $opt{id} = [$opt{id}] unless ref $opt{id};
726
    for (my $i = 0; $i < @{$opt{primary_key}}; $i++) {
727
      my $key = $opt{primary_key}->[$i];
728
      next if exists $params->[0]->{$key};
729
      $params->[0]->{$key} = $opt{id}->[$i];
730
      push @cleanup, $key;
731
    }
732
  }
733
  
734
  # Insert statement
735
  my $sql = "insert ";
736
  $sql .= "$opt{prefix} " if defined $opt{prefix};
737
  $sql .= "into " . $self->q($opt{table}) . " ";
738
  if ($opt{bulk_insert}) {
739
    $sql .= $self->_multi_values_clause($params, {wrap => $opt{wrap}}) . " ";
740
    my $new_param = {};
741
    $new_param->{$_} = [] for keys %{$params->[0]};
742
    for my $param (@$params) {
743
      push @{$new_param->{$_}}, $param->{$_} for keys %$param;
744
    }
745
    $params = [$new_param];
746
  }
747
  else {
748
    $sql .= $self->values_clause($params->[0], {wrap => $opt{wrap}}) . " ";
749
  }
750

            
751
  # Remove id from parameter
752
  delete $params->[0]->{$_} for @cleanup;
753
  
754
  # Execute query
755
  $opt{statement} = 'insert';
756
  $opt{cleanup} = \@timestamp_cleanup;
757
  $self->execute($sql, $params, %opt);
packaging one directory
yuki-kimoto authored on 2009-11-16
758
}
759

            
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
760
sub insert_timestamp {
cleanup
Yuki Kimoto authored on 2012-01-20
761
  my $self = shift;
762
  
763
  warn "insert_timestamp method is DEPRECATED! use now attribute";
764
  
765
  if (@_) {
766
    $self->{insert_timestamp} = [@_];
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
767
    
cleanup
Yuki Kimoto authored on 2012-01-20
768
    return $self;
769
  }
770
  return $self->{insert_timestamp};
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
771
}
772

            
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-15
773
sub include_model {
cleanup
Yuki Kimoto authored on 2012-01-20
774
  my ($self, $name_space, $model_infos) = @_;
775
  
776
  # Name space
777
  $name_space ||= '';
778
  
779
  # Get Model infomations
780
  unless ($model_infos) {
781

            
782
    # Load name space module
783
    croak qq{"$name_space" is invalid class name } . _subname
784
      if $name_space =~ /[^\w:]/;
785
    eval "use $name_space";
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
786
    croak qq{Name space module "$name_space.pm" is needed. $@ } . _subname
cleanup
Yuki Kimoto authored on 2012-01-20
787
      if $@;
788
    
789
    # Search model modules
790
    my $path = $INC{"$name_space.pm"};
791
    $path =~ s/\.pm$//;
792
    opendir my $dh, $path
793
      or croak qq{Can't open directory "$path": $! } . _subname
794
    $model_infos = [];
795
    while (my $module = readdir $dh) {
796
      push @$model_infos, $module
797
        if $module =~ s/\.pm$//;
798
    }
799
    close $dh;
800
  }
801
  
802
  # Include models
803
  for my $model_info (@$model_infos) {
804
    
805
    # Load model
806
    my $model_class;
807
    my $model_name;
808
    my $model_table;
809
    if (ref $model_info eq 'HASH') {
810
      $model_class = $model_info->{class};
811
      $model_name  = $model_info->{name};
812
      $model_table = $model_info->{table};
813
      
814
      $model_name  ||= $model_class;
815
      $model_table ||= $model_name;
816
    }
817
    else { $model_class = $model_name = $model_table = $model_info }
818
    my $mclass = "${name_space}::$model_class";
819
    croak qq{"$mclass" is invalid class name } . _subname
820
      if $mclass =~ /[^\w:]/;
821
    unless ($mclass->can('isa')) {
822
      eval "use $mclass";
823
      croak "$@ " . _subname if $@;
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-15
824
    }
825
    
cleanup
Yuki Kimoto authored on 2012-01-20
826
    # Create model
827
    my $opt = {};
828
    $opt->{model_class} = $mclass if $mclass;
829
    $opt->{name}        = $model_name if $model_name;
830
    $opt->{table}       = $model_table if $model_table;
831
    $self->create_model($opt);
832
  }
833
  
834
  return $self;
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-15
835
}
836

            
added EXPERIMENTAL like_valu...
Yuki Kimoto authored on 2011-09-16
837
sub like_value { sub { "%$_[0]%" } }
838

            
added DBIx::Custom::Mapper
Yuki Kimoto authored on 2011-08-26
839
sub mapper {
cleanup
Yuki Kimoto authored on 2012-01-20
840
  my $self = shift;
841
  return DBIx::Custom::Mapper->new(@_);
added DBIx::Custom::Mapper
Yuki Kimoto authored on 2011-08-26
842
}
843

            
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
844
sub merge_param {
cleanup
Yuki Kimoto authored on 2012-01-20
845
  my ($self, @params) = @_;
846
  
847
  # Merge parameters
848
  my $merge = {};
849
  for my $param (@params) {
850
    for my $column (keys %$param) {
851
      my $param_is_array = ref $param->{$column} eq 'ARRAY' ? 1 : 0;
852
      
853
      if (exists $merge->{$column}) {
854
        $merge->{$column} = [$merge->{$column}]
855
          unless ref $merge->{$column} eq 'ARRAY';
856
        push @{$merge->{$column}},
857
          ref $param->{$column} ? @{$param->{$column}} : $param->{$column};
858
      }
859
      else { $merge->{$column} = $param->{$column} }
860
    }
861
  }
862
  
863
  return $merge;
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
864
}
865

            
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-15
866
sub model {
cleanup
Yuki Kimoto authored on 2012-01-20
867
  my ($self, $name, $model) = @_;
868
  
869
  # Set model
870
  if ($model) {
871
    $self->models->{$name} = $model;
872
    return $self;
873
  }
874
  
875
  # Check model existance
876
  croak qq{Model "$name" is not included } . _subname
877
    unless $self->models->{$name};
878
  
879
  # Get model
880
  return $self->models->{$name};
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-15
881
}
882

            
cleanup
Yuki Kimoto authored on 2011-03-21
883
sub mycolumn {
cleanup
Yuki Kimoto authored on 2012-01-20
884
  my ($self, $table, $columns) = @_;
885
  
886
  # Create column clause
887
  my @column;
888
  $columns ||= [];
889
  push @column, $self->q($table) . "." . $self->q($_) . " as " . $self->q($_)
890
    for @$columns;
891
  
892
  return join (', ', @column);
cleanup
Yuki Kimoto authored on 2011-03-21
893
}
894

            
added dbi_options attribute
kimoto authored on 2010-12-20
895
sub new {
cleanup
Yuki Kimoto authored on 2012-01-20
896
  my $self = shift->SUPER::new(@_);
897
  
898
  # Check attributes
899
  my @attrs = keys %$self;
900
  for my $attr (@attrs) {
901
    croak qq{Invalid attribute: "$attr" } . _subname
902
      unless $self->can($attr);
903
  }
904
  
905
  $self->{safety_character} = 'a-zA-Z0-9_'
906
    unless exists $self->{safety_character};
907

            
908
  # DEPRECATED
909
  $self->{_tags} = {
910
    '?'     => \&DBIx::Custom::Tag::placeholder,
911
    '='     => \&DBIx::Custom::Tag::equal,
912
    '<>'    => \&DBIx::Custom::Tag::not_equal,
913
    '>'     => \&DBIx::Custom::Tag::greater_than,
914
    '<'     => \&DBIx::Custom::Tag::lower_than,
915
    '>='    => \&DBIx::Custom::Tag::greater_than_equal,
916
    '<='    => \&DBIx::Custom::Tag::lower_than_equal,
917
    'like'  => \&DBIx::Custom::Tag::like,
918
    'in'    => \&DBIx::Custom::Tag::in,
919
    'insert_param' => \&DBIx::Custom::Tag::insert_param,
920
    'update_param' => \&DBIx::Custom::Tag::update_param
921
  };
922
  $self->{tag_parse} = 1 unless exists $self->{tag_parse};
923
  $self->{cache} = 0 unless exists $self->{cache};
924
  
925
  return $self;
cleanup
Yuki Kimoto authored on 2011-08-13
926
}
927

            
- added EXPERIMENTAL pass at...
Yuki Kimoto authored on 2011-09-02
928
sub not_exists { DBIx::Custom::NotExists->singleton }
cleanup
Yuki Kimoto authored on 2011-08-13
929

            
930
sub order {
cleanup
Yuki Kimoto authored on 2012-01-20
931
  my $self = shift;
932
  return DBIx::Custom::Order->new(dbi => $self, @_);
added EXPERIMENTAL system_ta...
Yuki Kimoto authored on 2011-08-10
933
}
934

            
added EXPERIMENTAL q method
Yuki Kimoto authored on 2011-10-27
935
sub q {
cleanup
Yuki Kimoto authored on 2012-01-20
936
  my ($self, $value, $quotemeta) = @_;
937
  
938
  my $quote = $self->{reserved_word_quote}
939
    || $self->{quote} || $self->quote || '';
940
  return "$quote$value$quote"
941
    if !$quotemeta && ($quote eq '`' || $quote eq '"');
942
  
943
  my $q = substr($quote, 0, 1) || '';
944
  my $p;
945
  if (defined $quote && length $quote > 1) {
946
    $p = substr($quote, 1, 1);
947
  }
948
  else { $p = $q }
949
  
950
  if ($quotemeta) {
951
    $q = quotemeta($q);
952
    $p = quotemeta($p);
953
  }
954
  
955
  return "$q$value$p";
added EXPERIMENTAL q method
Yuki Kimoto authored on 2011-10-27
956
}
957

            
cleanup
yuki-kimoto authored on 2010-10-17
958
sub register_filter {
cleanup
Yuki Kimoto authored on 2012-01-20
959
  my $self = shift;
960
  
961
  # Register filter
962
  my $filters = ref $_[0] eq 'HASH' ? $_[0] : {@_};
963
  $self->filters({%{$self->filters}, %$filters});
964
  
965
  return $self;
cleanup
yuki-kimoto authored on 2010-10-17
966
}
packaging one directory
yuki-kimoto authored on 2009-11-16
967

            
968
sub select {
cleanup
Yuki Kimoto authored on 2012-01-20
969
  my $self = shift;
970
  my $column = shift if @_ % 2;
971
  my %opt = @_;
select method can be called ...
Yuki Kimoto authored on 2012-02-07
972
  $opt{statement} = 'select';
cleanup
Yuki Kimoto authored on 2012-01-20
973
  $opt{column} = $column if defined $column;
974

            
975
  # Options
select method can be called ...
Yuki Kimoto authored on 2012-02-07
976
  my $table_is_empty;
cleanup
Yuki Kimoto authored on 2012-01-20
977
  my $tables = ref $opt{table} eq 'ARRAY' ? $opt{table}
978
    : defined $opt{table} ? [$opt{table}]
979
    : [];
980
  $opt{table} = $tables;
select method can be called ...
Yuki Kimoto authored on 2012-02-07
981
  $table_is_empty = 1 unless @$tables;
cleanup
Yuki Kimoto authored on 2012-01-20
982
  my $where_param = $opt{where_param} || delete $opt{param} || {};
983
  warn "select method where_param option is DEPRECATED!"
984
    if $opt{where_param};
985
  
986
  # Add relation tables(DEPRECATED!);
987
  if ($opt{relation}) {
988
    warn "select() relation option is DEPRECATED!";
989
    $self->_add_relation_table($tables, $opt{relation});
990
  }
991
  
992
  # Select statement
993
  my $sql = 'select ';
994
  
995
  # Prefix
996
  $sql .= "$opt{prefix} " if defined $opt{prefix};
997
  
998
  # Column
999
  if (defined $opt{column}) {
1000
    my $columns
1001
      = ref $opt{column} eq 'ARRAY' ? $opt{column} : [$opt{column}];
1002
    for my $column (@$columns) {
1003
      if (ref $column eq 'HASH') {
1004
        $column = $self->column(%$column) if ref $column eq 'HASH';
1005
      }
1006
      elsif (ref $column eq 'ARRAY') {
1007
        warn "select column option [COLUMN => ALIAS] syntax is DEPRECATED!" .
1008
          "use q method to quote the value";
1009
        if (@$column == 3 && $column->[1] eq 'as') {
1010
          warn "[COLUMN, as => ALIAS] is DEPRECATED! use [COLUMN => ALIAS]";
1011
          splice @$column, 1, 1;
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-03-14
1012
        }
cleanup
Yuki Kimoto authored on 2012-01-20
1013
        
1014
        $column = join(' ', $column->[0], 'as', $self->q($column->[1]));
1015
      }
select method can be called ...
Yuki Kimoto authored on 2012-02-07
1016
      unshift @$tables, @{$self->_search_tables($column)}
1017
        unless $table_is_empty;
cleanup
Yuki Kimoto authored on 2012-01-20
1018
      $sql .= "$column, ";
packaging one directory
yuki-kimoto authored on 2009-11-16
1019
    }
micro optimization
Yuki Kimoto authored on 2011-09-30
1020
    $sql =~ s/, $/ /;
cleanup
Yuki Kimoto authored on 2012-01-20
1021
  }
1022
  else { $sql .= '* ' }
select method can be called ...
Yuki Kimoto authored on 2012-02-07
1023

            
1024
  # Execute query without table
1025
  return $self->execute($sql, {}, %opt) if $table_is_empty;
1026

            
cleanup
Yuki Kimoto authored on 2012-01-20
1027
  # Table
1028
  $sql .= 'from ';
1029
  if ($opt{relation}) {
1030
    my $found = {};
1031
    for my $table (@$tables) {
1032
      $sql .= $self->q($table) . ', ' unless $found->{$table};
1033
      $found->{$table} = 1;
1034
    }
1035
  }
1036
  else { $sql .= $self->q($tables->[-1] || '') . ' ' }
1037
  $sql =~ s/, $/ /;
1038

            
1039
  # Add tables in parameter
1040
  unshift @$tables,
1041
    @{$self->_search_tables(join(' ', keys %$where_param) || '')};
1042
  
1043
  # Where
1044
  my $w = $self->_where_clause_and_param($opt{where}, $where_param,
select method can be called ...
Yuki Kimoto authored on 2012-02-07
1045
    delete $opt{id}, $opt{primary_key}, @$tables ? $tables->[-1] : undef);
cleanup
Yuki Kimoto authored on 2012-01-20
1046
  
1047
  # Add table names in where clause
1048
  unshift @$tables, @{$self->_search_tables($w->{clause})};
1049
  
1050
  # Join statement
1051
  $self->_push_join(\$sql, $opt{join}, $tables) if defined $opt{join};
1052
  
1053
  # Add where clause
1054
  $sql .= "$w->{clause} ";
1055
  
1056
  # Relation(DEPRECATED!);
1057
  $self->_push_relation(\$sql, $tables, $opt{relation}, $w->{clause} eq '' ? 1 : 0)
1058
    if $opt{relation};
1059
  
1060
  # Execute query
select method can be called ...
Yuki Kimoto authored on 2012-02-07
1061
  return $self->execute($sql, $w->{param}, %opt);
packaging one directory
yuki-kimoto authored on 2009-11-16
1062
}
1063

            
add experimental setup_model...
Yuki Kimoto authored on 2011-02-21
1064
sub setup_model {
cleanup
Yuki Kimoto authored on 2012-01-20
1065
  my $self = shift;
1066
  
1067
  # Setup model
1068
  $self->each_column(
1069
    sub {
1070
      my ($self, $table, $column, $column_info) = @_;
1071
      if (my $model = $self->models->{$table}) {
1072
        push @{$model->columns}, $column;
1073
      }
1074
    }
1075
  );
1076
  return $self;
add experimental setup_model...
Yuki Kimoto authored on 2011-02-21
1077
}
1078

            
update pod
Yuki Kimoto authored on 2011-08-10
1079
sub show_datatype {
cleanup
Yuki Kimoto authored on 2012-01-20
1080
  my ($self, $table) = @_;
1081
  croak "Table name must be specified" unless defined $table;
1082
  print "$table\n";
1083
  
1084
  my $result = $self->select(table => $table, where => "'0' <> '0'");
1085
  my $sth = $result->sth;
1086

            
1087
  my $columns = $sth->{NAME};
1088
  my $data_types = $sth->{TYPE};
1089
  
1090
  for (my $i = 0; $i < @$columns; $i++) {
1091
    my $column = $columns->[$i];
1092
    my $data_type = lc $data_types->[$i];
1093
    print "$column: $data_type\n";
1094
  }
update pod
Yuki Kimoto authored on 2011-08-10
1095
}
1096

            
1097
sub show_typename {
cleanup
Yuki Kimoto authored on 2012-01-20
1098
  my ($self, $t) = @_;
1099
  croak "Table name must be specified" unless defined $t;
1100
  print "$t\n";
1101
  
1102
  $self->each_column(sub {
1103
    my ($self, $table, $column, $infos) = @_;
1104
    return unless $table eq $t;
1105
    my $typename = lc $infos->{TYPE_NAME};
1106
    print "$column: $typename\n";
1107
  });
1108
  
1109
  return $self;
update pod
Yuki Kimoto authored on 2011-08-10
1110
}
1111

            
test cleanup
Yuki Kimoto authored on 2011-08-15
1112
sub show_tables {
cleanup
Yuki Kimoto authored on 2012-01-20
1113
  my $self = shift;
1114
  
1115
  my %tables;
1116
  $self->each_table(sub { $tables{$_[1]}++ });
1117
  print join("\n", sort keys %tables) . "\n";
1118
  return $self;
test cleanup
Yuki Kimoto authored on 2011-08-15
1119
}
1120

            
added type_rule method and f...
Yuki Kimoto authored on 2011-06-09
1121
sub type_rule {
cleanup
Yuki Kimoto authored on 2012-01-20
1122
  my $self = shift;
1123

            
1124
  $self->{_type_rule_is_called} = 1;
1125
  
1126
  if (@_) {
1127
    my $type_rule = ref $_[0] eq 'HASH' ? $_[0] : {@_};
1128
    
1129
    # Into
1130
    for my $i (1 .. 2) {
1131
      my $into = "into$i";
1132
      my $exists_into = exists $type_rule->{$into};
1133
      $type_rule->{$into} = _array_to_hash($type_rule->{$into});
1134
      $self->{type_rule} = $type_rule;
1135
      $self->{"_$into"} = {};
1136
      for my $type_name (keys %{$type_rule->{$into} || {}}) {
1137
        croak qq{type name of $into section must be lower case}
1138
          if $type_name =~ /[A-Z]/;
1139
      }
1140
      
1141
      $self->each_column(sub {
1142
        my ($dbi, $table, $column, $column_info) = @_;
fixed bug that type_rule fro...
Yuki Kimoto authored on 2011-06-13
1143
        
cleanup
Yuki Kimoto authored on 2012-01-20
1144
        my $type_name = lc $column_info->{TYPE_NAME};
1145
        if ($type_rule->{$into} &&
1146
            (my $filter = $type_rule->{$into}->{$type_name}))
1147
        {
1148
          return unless exists $type_rule->{$into}->{$type_name};
1149
          if (defined $filter && ref $filter ne 'CODE') 
1150
          {
1151
            my $fname = $filter;
1152
            croak qq{Filter "$fname" is not registered" } . _subname
1153
              unless exists $self->filters->{$fname};
cleanup
Yuki Kimoto authored on 2011-08-16
1154
            
cleanup
Yuki Kimoto authored on 2012-01-20
1155
            $filter = $self->filters->{$fname};
1156
          }
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
1157

            
cleanup
Yuki Kimoto authored on 2012-01-20
1158
          $self->{"_$into"}{key}{$table}{$column} = $filter;
1159
          $self->{"_$into"}{dot}{"$table.$column"} = $filter;
fixed bug that type_rule fro...
Yuki Kimoto authored on 2011-06-13
1160
        }
cleanup
Yuki Kimoto authored on 2012-01-20
1161
      });
1162
    }
1163

            
1164
    # From
1165
    for my $i (1 .. 2) {
1166
      $type_rule->{"from$i"} = _array_to_hash($type_rule->{"from$i"});
1167
      for my $data_type (keys %{$type_rule->{"from$i"} || {}}) {
1168
        croak qq{data type of from$i section must be lower case or number}
1169
          if $data_type =~ /[A-Z]/;
1170
        my $fname = $type_rule->{"from$i"}{$data_type};
1171
        if (defined $fname && ref $fname ne 'CODE') {
1172
          croak qq{Filter "$fname" is not registered" } . _subname
1173
            unless exists $self->filters->{$fname};
1174
          
1175
          $type_rule->{"from$i"}{$data_type} = $self->filters->{$fname};
1176
        }
1177
      }
added type_rule method and f...
Yuki Kimoto authored on 2011-06-09
1178
    }
1179
    
cleanup
Yuki Kimoto authored on 2012-01-20
1180
    return $self;
1181
  }
1182
  
1183
  return $self->{type_rule} || {};
added type_rule method and f...
Yuki Kimoto authored on 2011-06-09
1184
}
1185

            
cleanup
yuki-kimoto authored on 2010-10-17
1186
sub update {
cleanup
Yuki Kimoto authored on 2012-01-20
1187
  my $self = shift;
1188

            
1189
  # Options
1190
  my $param = @_ % 2 ? shift : undef;
1191
  my %opt = @_;
1192
  warn "update param option is DEPRECATED!" if $opt{param};
1193
  warn "update method where_param option is DEPRECATED!"
1194
    if $opt{where_param};
1195
  $param ||= $opt{param} || {};
1196
  
1197
  # Don't allow update all rows
1198
  croak qq{update method where option must be specified } . _subname
1199
    if !$opt{where} && !defined $opt{id} && !$opt{allow_update_all};
1200
  
1201
  # Timestamp(DEPRECATED!)
1202
  if ($opt{timestamp} && (my $update_timestamp = $self->update_timestamp)) {
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
1203
    warn "update timestamp option is DEPRECATED! use mtime";
cleanup
Yuki Kimoto authored on 2012-01-20
1204
    my $columns = $update_timestamp->[0];
1205
    $columns = [$columns] unless ref $columns eq 'ARRAY';
1206
    my $value = $update_timestamp->[1];
1207
    $value = $value->() if ref $value eq 'CODE';
1208
    $param->{$_} = $value for @$columns;
1209
  }
1210

            
1211
  # Created time and updated time
1212
  my @timestamp_cleanup;
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
1213
  warn "update method update_at option is DEPRECATED! "
1214
      . "use mtime option instead " . _subname
1215
    if $opt{updated_at};
1216
  $opt{mtime} ||= $opt{updated_at};
1217
  if (defined $opt{mtime}) {
cleanup
Yuki Kimoto authored on 2012-01-20
1218
    my $now = $self->now;
1219
    $now = $now->() if ref $now eq 'CODE';
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
1220
    $param->{$opt{mtime}} = $self->now->();
1221
    push @timestamp_cleanup, $opt{mtime};
cleanup
Yuki Kimoto authored on 2012-01-20
1222
  }
1223

            
1224
  # Assign clause
1225
  my $assign_clause = $self->assign_clause($param, {wrap => $opt{wrap}});
1226
  
1227
  # Where
1228
  my $w = $self->_where_clause_and_param($opt{where}, $opt{where_param},
1229
    delete $opt{id}, $opt{primary_key}, $opt{table});
1230
  
1231
  # Update statement
1232
  my $sql = "update ";
1233
  $sql .= "$opt{prefix} " if defined $opt{prefix};
1234
  $sql .= $self->q($opt{table}) . " set $assign_clause $w->{clause} ";
1235
  
1236
  # Execute query
1237
  $opt{statement} = 'update';
1238
  $opt{cleanup} = \@timestamp_cleanup;
1239
  $self->execute($sql, [$param, $w->{param}], %opt);
removed reconnect method
yuki-kimoto authored on 2010-05-28
1240
}
1241

            
cleanup
Yuki Kimoto authored on 2011-11-01
1242
sub update_all { shift->update(@_, allow_update_all => 1) };
cleanup
yuki-kimoto authored on 2010-10-17
1243

            
cleanup
Yuki Kimoto authored on 2011-10-21
1244
sub update_or_insert {
cleanup
Yuki Kimoto authored on 2012-01-20
1245
  my ($self, $param, %opt) = @_;
1246
  croak "update_or_insert method need primary_key and id option "
1247
    unless defined $opt{id} && defined $opt{primary_key};
1248
  my $statement_opt = $opt{option} || {};
1249

            
1250
  my $rows = $self->select(%opt, %{$statement_opt->{select} || {}})->all;
1251
  if (@$rows == 0) {
1252
    return $self->insert($param, %opt, %{$statement_opt->{insert} || {}});
1253
  }
1254
  elsif (@$rows == 1) {
1255
    return 0 unless keys %$param;
1256
    return $self->update($param, %opt, %{$statement_opt->{update} || {}});
1257
  }
1258
  else { croak "selected row must be one " . _subname }
cleanup
Yuki Kimoto authored on 2011-10-21
1259
}
1260

            
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
1261
sub update_timestamp {
cleanup
Yuki Kimoto authored on 2012-01-20
1262
  my $self = shift;
1263
  
1264
  warn "update_timestamp method is DEPRECATED! use now method";
1265
  
1266
  if (@_) {
1267
    $self->{update_timestamp} = [@_];
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
1268
    
cleanup
Yuki Kimoto authored on 2012-01-20
1269
    return $self;
1270
  }
1271
  return $self->{update_timestamp};
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
1272
}
1273

            
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
1274
sub values_clause {
cleanup
Yuki Kimoto authored on 2012-01-20
1275
  my ($self, $param, $opts) = @_;
1276
  
1277
  my $wrap = $opts->{wrap} || {};
1278
  
1279
  # Create insert parameter tag
1280
  my ($q, $p) = split //, $self->q('');
1281
  
1282
  # values clause(performance is important)
1283
  '(' .
1284
  join(
1285
    ', ',
1286
    map { "$q$_$p" } sort keys %$param
1287
  ) .
1288
  ') values (' .
1289
  join(
1290
    ', ',
1291
    map {
1292
      ref $param->{$_} eq 'SCALAR' ? ${$param->{$_}} :
1293
      $wrap->{$_} ? $wrap->{$_}->(":$_") :
1294
      ":$_";
1295
    } sort keys %$param
1296
  ) .
1297
  ')'
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
1298
}
1299

            
added EXPERIMENTAL bulk_inse...
Yuki Kimoto authored on 2011-11-27
1300
sub _multi_values_clause {
cleanup
Yuki Kimoto authored on 2012-01-20
1301
  my ($self, $params, $opts) = @_;
1302
  
1303
  my $wrap = $opts->{wrap} || {};
1304
  
1305
  # Create insert parameter tag
1306
  my ($q, $p) = split //, $self->q('');
1307
  
1308
  # Multi values clause
1309
  my $clause = '(' . join(', ', map { "$q$_$p" } sort keys %{$params->[0]}) . ') values ';
1310
  
1311
  for (1 .. @$params) {
1312
    $clause .= '(' . join(', ', 
1313
      map {
1314
        ref $params->[0]->{$_} eq 'SCALAR' ? ${$params->[0]->{$_}} :
1315
        $wrap->{$_} ? $wrap->{$_}->(":$_") :
1316
        ":$_";
1317
      } sort keys %{$params->[0]}
1318
    ) . '), '
1319
  }
1320
  $clause =~ s/, $//;
1321
  return $clause;
added EXPERIMENTAL bulk_inse...
Yuki Kimoto authored on 2011-11-27
1322
}
1323

            
sub module use DBIx::Custom ...
Yuki Kimoto authored on 2011-08-02
1324
sub where { DBIx::Custom::Where->new(dbi => shift, @_) }
added experimental DBIx::Cus...
Yuki Kimoto authored on 2011-01-18
1325

            
updated pod
Yuki Kimoto authored on 2011-06-21
1326
sub _create_query {
cleanup
Yuki Kimoto authored on 2012-01-20
1327
  
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
1328
  my ($self, $source, $after_build_sql, $prepare_attr) = @_;
1329
  
1330
  $prepare_attr ||= {};
cleanup
Yuki Kimoto authored on 2012-01-20
1331
  
1332
  # Cache
1333
  my $cache = $self->{cache};
1334
  
1335
  # Query
1336
  my $query;
1337
  
1338
  # Get cached query
1339
  if ($cache) {
1340
    
1341
    # Get query
1342
    my $q = $self->cache_method->($self, $source);
updated pod
Yuki Kimoto authored on 2011-06-21
1343
    
1344
    # Create query
cleanup
Yuki Kimoto authored on 2012-01-20
1345
    if ($q) {
1346
      $query = DBIx::Custom::Query->new($q);
1347
      $query->{filters} = $self->filters;
cleanup
Yuki Kimoto authored on 2011-06-13
1348
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1349
  }
1350
  
1351
  # Create query
1352
  unless ($query) {
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
1353

            
cleanup
Yuki Kimoto authored on 2012-01-20
1354
    # Create query
1355
    my $tag_parse = exists $ENV{DBIX_CUSTOM_TAG_PARSE}
1356
      ? $ENV{DBIX_CUSTOM_TAG_PARSE} : $self->{tag_parse};
1357

            
1358
    my $sql = " " . $source || '';
1359
    if ($tag_parse && ($sql =~ /\s\{/)) {
1360
      $query = $self->query_builder->build_query($sql);
updated pod
Yuki Kimoto authored on 2011-06-21
1361
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1362
    else {
1363
      my @columns;
1364
      my $c = $self->{safety_character};
1365
      my $re = $c eq 'a-zA-Z0-9_'
1366
        ? qr/(.*?[^\\]):([$c\.]+)(?:\{(.*?)\})?(.*)/so
1367
        : qr/(.*?[^\\]):([$c\.]+)(?:\{(.*?)\})?(.*)/s;
1368
      my %duplicate;
1369
      my $duplicate;
1370
      # Parameter regex
1371
      $sql =~ s/([0-9]):/$1\\:/g;
1372
      my $new_sql = '';
1373
      while ($sql =~ /$re/) {
1374
        push @columns, $2;
1375
        $duplicate = 1 if ++$duplicate{$columns[-1]} > 1;
1376
        ($new_sql, $sql) = defined $3 ?
1377
          ($new_sql . "$1$2 $3 ?", " $4") : ($new_sql . "$1?", " $4");
1378
      }
1379
      $new_sql .= $sql;
1380
      $new_sql =~ s/\\:/:/g if index($new_sql, "\\:") != -1;
1381

            
1382
      # Create query
1383
      $query = {sql => $new_sql, columns => \@columns, duplicate => $duplicate};
1384
    }
1385
    
1386
    # Save query to cache
1387
    $self->cache_method->(
1388
      $self, $source,
1389
      {
1390
        sql     => $query->{sql}, 
1391
        columns => $query->{columns},
1392
        tables  => $query->{tables} || []
1393
      }
1394
    ) if $cache;
1395
  }
1396

            
1397
  # Filter SQL
1398
  $query->{sql} = $after_build_sql->($query->{sql}) if $after_build_sql;
1399
  
1400
  # Save sql
1401
  $self->{last_sql} = $query->{sql};
1402
  
1403
  # Prepare statement handle
1404
  my $sth;
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
1405
  eval { $sth = $self->dbh->prepare($query->{sql}, $prepare_attr) };
cleanup
Yuki Kimoto authored on 2012-01-20
1406
  
1407
  if ($@) {
1408
    $self->_croak($@, qq{. Following SQL is executed.\n}
1409
                    . qq{$query->{sql}\n} . _subname);
1410
  }
1411
  
1412
  # Set statement handle
1413
  $query->{sth} = $sth;
1414
  
1415
  # Set filters
1416
  $query->{filters} = $self->{filters} || $self->filters;
1417
  
1418
  return $query;
cleanup
Yuki Kimoto authored on 2011-06-13
1419
}
1420

            
cleanup
Yuki Kimoto authored on 2012-01-20
1421
sub _create_bind_values {
1422
  my ($self, $params, $columns, $filter, $type_filters, $bind_type) = @_;
1423
  
1424
  $bind_type = _array_to_hash($bind_type) if ref $bind_type eq 'ARRAY';
1425
  
1426
  # Create bind values
1427
  my @bind;
1428
  my @types;
1429
  my %count;
1430
  my %not_exists;
1431
  for my $column (@$columns) {
1432
    
1433
    # Bind value
1434
    if(ref $params->{$column} eq 'ARRAY') {
1435
      my $i = $count{$column} || 0;
1436
      $i += $not_exists{$column} || 0;
1437
      my $found;
1438
      for (my $k = $i; $i < @{$params->{$column}}; $k++) {
1439
        if (ref $params->{$column}->[$k] eq 'DBIx::Custom::NotExists') {
1440
            $not_exists{$column}++;
micro optimization
Yuki Kimoto authored on 2011-10-23
1441
        }
cleanup
Yuki Kimoto authored on 2012-01-20
1442
        else  {
1443
          push @bind, $params->{$column}->[$k];
1444
          $found = 1;
1445
          last
micro optimization
Yuki Kimoto authored on 2011-10-23
1446
        }
cleanup
Yuki Kimoto authored on 2012-01-20
1447
      }
1448
      next unless $found;
removed reconnect method
yuki-kimoto authored on 2010-05-28
1449
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1450
    else { push @bind, $params->{$column} }
removed reconnect method
yuki-kimoto authored on 2010-05-28
1451
    
cleanup
Yuki Kimoto authored on 2012-01-20
1452
    # Filter
1453
    if (my $f = $filter->{$column} || $self->{default_out_filter} || '') {
1454
      $bind[-1] = $f->($bind[-1]);
1455
    }
improved error messages
Yuki Kimoto authored on 2011-04-18
1456
    
cleanup
Yuki Kimoto authored on 2012-01-20
1457
    # Type rule
1458
    if ($self->{_type_rule_is_called}) {
1459
      my $tf1 = $self->{"_into1"}->{dot}->{$column}
1460
        || $type_filters->{1}->{$column};
1461
      $bind[-1] = $tf1->($bind[-1]) if $tf1;
1462
      my $tf2 = $self->{"_into2"}->{dot}->{$column}
1463
        || $type_filters->{2}->{$column};
1464
      $bind[-1] = $tf2->($bind[-1]) if $tf2;
improved error messages
Yuki Kimoto authored on 2011-04-18
1465
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1466
   
1467
    # Bind types
1468
    push @types, $bind_type->{$column};
improved error messages
Yuki Kimoto authored on 2011-04-18
1469
    
cleanup
Yuki Kimoto authored on 2012-01-20
1470
    # Count up 
1471
    $count{$column}++;
1472
  }
1473
  
1474
  return (\@bind, \@types);
1475
}
1476

            
1477
sub _id_to_param {
1478
  my ($self, $id, $primary_keys, $table) = @_;
1479
  
1480
  # Check primary key
1481
  croak "primary_key option " .
1482
        "must be specified when id option is used" . _subname
1483
    unless defined $primary_keys;
1484
  $primary_keys = [$primary_keys] unless ref $primary_keys eq 'ARRAY';
1485
  
1486
  # Create parameter
1487
  my $param = {};
1488
  if (defined $id) {
1489
    $id = [$id] unless ref $id;
1490
    for(my $i = 0; $i < @$id; $i++) {
1491
      my $key = $primary_keys->[$i];
1492
      $key = "$table." . $key if $table;
1493
      $param->{$key} = $id->[$i];
1494
    }
1495
  }
1496
  
1497
  return $param;
improved error messages
Yuki Kimoto authored on 2011-04-18
1498
}
1499

            
EXPERIMETAL fork safety impl...
Yuki Kimoto authored on 2011-03-12
1500
sub _connect {
cleanup
Yuki Kimoto authored on 2012-01-20
1501
  my $self = shift;
1502
  
1503
  # Attributes
1504
  my $dsn = $self->data_source;
1505
  warn "data_source is DEPRECATED!\n"
1506
    if $dsn;
1507
  $dsn ||= $self->dsn;
1508
  croak qq{"dsn" must be specified } . _subname
1509
    unless $dsn;
1510
  my $user        = $self->user;
1511
  my $password    = $self->password;
1512
  my $option = $self->_option;
1513
  $option = {%{$self->default_option}, %$option};
1514
  
1515
  # Connect
1516
  my $dbh;
1517
  eval { $dbh = DBI->connect($dsn, $user, $password, $option) };
1518
  
1519
  # Connect error
1520
  croak "$@ " . _subname if $@;
1521
  
1522
  return $dbh;
EXPERIMETAL fork safety impl...
Yuki Kimoto authored on 2011-03-12
1523
}
1524

            
cleanup
yuki-kimoto authored on 2010-10-17
1525
sub _croak {
cleanup
Yuki Kimoto authored on 2012-01-20
1526
  my ($self, $error, $append) = @_;
1527
  
1528
  # Append
1529
  $append ||= "";
1530
  
1531
  # Verbose
1532
  if ($Carp::Verbose) { croak $error }
1533
  
1534
  # Not verbose
1535
  else {
1536
    # Remove line and module infromation
1537
    my $at_pos = rindex($error, ' at ');
1538
    $error = substr($error, 0, $at_pos);
1539
    $error =~ s/\s+$//;
1540
    croak "$error$append";
1541
  }
cleanup
yuki-kimoto authored on 2010-10-17
1542
}
1543

            
prepare oracle test
Yuki Kimoto authored on 2011-08-15
1544
sub _driver { lc shift->{dbh}->{Driver}->{Name} }
1545

            
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
1546
sub _need_tables {
cleanup
Yuki Kimoto authored on 2012-01-20
1547
  my ($self, $tree, $need_tables, $tables) = @_;
1548
  
1549
  # Get needed tables
1550
  for my $table (@$tables) {
1551
    if ($tree->{$table}) {
1552
      $need_tables->{$table} = 1;
1553
      $self->_need_tables($tree, $need_tables, [$tree->{$table}{parent}])
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
1554
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1555
  }
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
1556
}
1557

            
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
1558
sub _option {
cleanup
Yuki Kimoto authored on 2012-01-20
1559
  my $self = shift;
1560
  my $option = {%{$self->dbi_options}, %{$self->dbi_option}, %{$self->option}};
1561
  warn "dbi_options is DEPRECATED! use option instead\n"
1562
    if keys %{$self->dbi_options};
1563
  warn "dbi_option is DEPRECATED! use option instead\n"
1564
    if keys %{$self->dbi_option};
1565
  return $option;
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
1566
}
1567

            
fixed some select() join opi...
Yuki Kimoto authored on 2011-03-09
1568
sub _push_join {
cleanup
Yuki Kimoto authored on 2012-01-20
1569
  my ($self, $sql, $join, $join_tables) = @_;
1570
  
1571
  $join = [$join] unless ref $join eq 'ARRAY';
1572
  
1573
  # No join
1574
  return unless @$join;
1575
  
1576
  # Push join clause
1577
  my $tree = {};
1578
  for (my $i = 0; $i < @$join; $i++) {
1579
    
1580
    # Arrange
1581
    my $join_clause;;
1582
    my $option;
1583
    if (ref $join->[$i] eq 'HASH') {
1584
      $join_clause = $join->[$i]->{clause};
1585
      $option = {table => $join->[$i]->{table}};
fixed some select() join opi...
Yuki Kimoto authored on 2011-03-09
1586
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1587
    else {
1588
      $join_clause = $join->[$i];
1589
      $option = {};
1590
    };
1591

            
1592
    # Find tables in join clause
1593
    my $table1;
1594
    my $table2;
1595
    if (my $table = $option->{table}) {
1596
      $table1 = $table->[0];
1597
      $table2 = $table->[1];
1598
    }
1599
    else {
1600
      my $q = $self->_quote;
1601
      my $j_clause = (split /\s+on\s+/, $join_clause)[-1];
1602
      $j_clause =~ s/'.+?'//g;
1603
      my $q_re = quotemeta($q);
1604
      $j_clause =~ s/[$q_re]//g;
1605
      
1606
      my @j_clauses = reverse split /\s(and|on)\s/, $j_clause;
1607
      my $c = $self->{safety_character};
1608
      my $join_re = qr/([$c]+)\.[$c]+[^$c].*?([$c]+)\.[$c]+/sm;
1609
      for my $clause (@j_clauses) {
1610
        if ($clause =~ $join_re) {
1611
          $table1 = $1;
1612
          $table2 = $2;
1613
          last;
1614
        }                
1615
      }
1616
    }
1617
    croak qq{join clause must have two table name after "on" keyword. } .
1618
        qq{"$join_clause" is passed }  . _subname
1619
      unless defined $table1 && defined $table2;
1620
    croak qq{right side table of "$join_clause" must be unique } . _subname
1621
      if exists $tree->{$table2};
1622
    croak qq{Same table "$table1" is specified} . _subname
1623
      if $table1 eq $table2;
1624
    $tree->{$table2}
1625
      = {position => $i, parent => $table1, join => $join_clause};
1626
  }
1627
  
1628
  # Search need tables
1629
  my $need_tables = {};
1630
  $self->_need_tables($tree, $need_tables, $join_tables);
1631
  my @need_tables = sort { $tree->{$a}{position} <=> $tree->{$b}{position} }
1632
    keys %$need_tables;
1633
  
1634
  # Add join clause
1635
  $$sql .= $tree->{$_}{join} . ' ' for @need_tables;
fixed some select() join opi...
Yuki Kimoto authored on 2011-03-09
1636
}
cleanup
Yuki Kimoto authored on 2011-03-08
1637

            
reserved_word_quote is DEPRE...
Yuki Kimoto authored on 2011-06-17
1638
sub _quote {
cleanup
Yuki Kimoto authored on 2012-01-20
1639
  my $self = shift;
1640
  return $self->{reserved_word_quote} || $self->quote || '';
reserved_word_quote is DEPRE...
Yuki Kimoto authored on 2011-06-17
1641
}
1642

            
cleanup
Yuki Kimoto authored on 2011-04-02
1643
sub _remove_duplicate_table {
cleanup
Yuki Kimoto authored on 2012-01-20
1644
  my ($self, $tables, $main_table) = @_;
1645
  
1646
  # Remove duplicate table
1647
  my %tables = map {defined $_ ? ($_ => 1) : ()} @$tables;
1648
  delete $tables{$main_table} if $main_table;
1649
  
1650
  my $new_tables = [keys %tables, $main_table ? $main_table : ()];
1651
  if (my $q = $self->_quote) {
1652
    $q = quotemeta($q);
1653
    $_ =~ s/[$q]//g for @$new_tables;
1654
  }
micro optimization
Yuki Kimoto authored on 2011-07-30
1655

            
cleanup
Yuki Kimoto authored on 2012-01-20
1656
  return $new_tables;
cleanup
Yuki Kimoto authored on 2011-04-02
1657
}
1658

            
cleanup
Yuki Kimoto authored on 2011-04-02
1659
sub _search_tables {
cleanup
Yuki Kimoto authored on 2012-01-20
1660
  my ($self, $source) = @_;
1661
  
1662
  # Search tables
1663
  my $tables = [];
1664
  my $safety_character = $self->{safety_character};
1665
  my $q = $self->_quote;
1666
  my $quoted_safety_character_re = $self->q("?([$safety_character]+)", 1);
1667
  my $table_re = $q ? qr/(?:^|[^$safety_character])${quoted_safety_character_re}?\./
1668
    : qr/(?:^|[^$safety_character])([$safety_character]+)\./;
1669
  while ($source =~ /$table_re/g) { push @$tables, $1 }
1670
  return $tables;
cleanup
Yuki Kimoto authored on 2011-04-02
1671
}
1672

            
cleanup
Yuki Kimoto authored on 2011-10-21
1673
sub _where_clause_and_param {
cleanup
Yuki Kimoto authored on 2012-01-20
1674
  my ($self, $where, $where_param, $id, $primary_key, $table) = @_;
1675

            
1676
  $where ||= {};
1677
  $where = $self->_id_to_param($id, $primary_key, $table) if defined $id;
1678
  $where_param ||= {};
1679
  my $w = {};
1680

            
cleanup
Yuki Kimoto authored on 2012-02-28
1681
  if (ref $where eq 'HASH') {
1682
    my $clause = [];
1683
    my $column_join = '';
1684
    for my $column (keys %$where) {
1685
      $column_join .= $column;
1686
      my $table;
1687
      my $c;
1688
      if ($column =~ /(?:(.*?)\.)?(.*)/) {
1689
        $table = $1;
1690
        $c = $2;
cleanup
Yuki Kimoto authored on 2012-01-20
1691
      }
cleanup
Yuki Kimoto authored on 2012-02-28
1692
      
1693
      my $table_quote;
1694
      $table_quote = $self->q($table) if defined $table;
1695
      my $column_quote = $self->q($c);
1696
      $column_quote = $table_quote . '.' . $column_quote
1697
        if defined $table_quote;
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
1698
      if (ref $where->{$column} eq 'ARRAY') {
1699
        my $c = join(', ', (":$column") x @{$where->{$column}});
1700
        push @$clause, "$column_quote in ( $c )";
1701
      }
1702
      else { push @$clause, "$column_quote = :$column" }
cleanup
Yuki Kimoto authored on 2012-02-28
1703
    }
1704
    
1705
    $w->{clause} = @$clause ? "where ( " . join(' and ', @$clause) . " ) " : '' ;
1706
    $w->{param} = $where;
1707
    $w->{param} = keys %$where_param
1708
      ? $self->merge_param($where_param, $where)
1709
      : $where;
1710
  }  
1711
  elsif (ref $where) {
1712
    my $obj;
1713

            
1714
    if (ref $where eq 'DBIx::Custom::Where') { $obj = $where }
cleanup
Yuki Kimoto authored on 2012-01-20
1715
    elsif (ref $where eq 'ARRAY') {
1716
      $obj = $self->where(clause => $where->[0], param => $where->[1]);
1717
    }
1718
    
1719
    # Check where argument
1720
    croak qq{"where" must be hash reference or DBIx::Custom::Where object}
1721
        . qq{or array reference, which contains where clause and parameter}
1722
        . _subname
1723
      unless ref $obj eq 'DBIx::Custom::Where';
1724

            
cleanup
Yuki Kimoto authored on 2012-02-28
1725
    $w->{clause} = $obj->to_string;
cleanup
Yuki Kimoto authored on 2012-01-20
1726
    $w->{param} = keys %$where_param
1727
      ? $self->merge_param($where_param, $obj->param)
1728
      : $obj->param;
1729
  }
1730
  elsif ($where) {
1731
    $w->{clause} = "where $where";
1732
    $w->{param} = $where_param;
1733
  }
1734
  
1735
  return $w;
cleanup
Yuki Kimoto authored on 2011-10-21
1736
}
1737

            
updated pod
Yuki Kimoto authored on 2011-06-21
1738
sub _apply_filter {
cleanup
Yuki Kimoto authored on 2012-01-20
1739
  my ($self, $table, @cinfos) = @_;
1740

            
1741
  # Initialize filters
1742
  $self->{filter} ||= {};
1743
  $self->{filter}{on} = 1;
1744
  $self->{filter}{out} ||= {};
1745
  $self->{filter}{in} ||= {};
1746
  $self->{filter}{end} ||= {};
1747
  
1748
  # Usage
1749
  my $usage = "Usage: \$dbi->apply_filter(" .
1750
    "TABLE, COLUMN1, {in => INFILTER1, out => OUTFILTER1, end => ENDFILTER1}, " .
1751
    "COLUMN2, {in => INFILTER2, out => OUTFILTER2, end => ENDFILTER2}, ...)";
1752
  
1753
  # Apply filter
1754
  for (my $i = 0; $i < @cinfos; $i += 2) {
updated pod
Yuki Kimoto authored on 2011-06-21
1755
    
cleanup
Yuki Kimoto authored on 2012-01-20
1756
    # Column
1757
    my $column = $cinfos[$i];
1758
    if (ref $column eq 'ARRAY') {
1759
      for my $c (@$column) { push @cinfos, $c, $cinfos[$i + 1] }
1760
      next;
1761
    }
updated pod
Yuki Kimoto authored on 2011-06-21
1762
    
cleanup
Yuki Kimoto authored on 2012-01-20
1763
    # Filter infomation
1764
    my $finfo = $cinfos[$i + 1] || {};
1765
    croak "$usage (table: $table) " . _subname
1766
      unless  ref $finfo eq 'HASH';
1767
    for my $ftype (keys %$finfo) {
1768
      croak "$usage (table: $table) " . _subname
1769
        unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end'; 
updated pod
Yuki Kimoto authored on 2011-06-21
1770
    }
1771
    
cleanup
Yuki Kimoto authored on 2012-01-20
1772
    # Set filters
1773
    for my $way (qw/in out end/) {
1774
  
1775
      # Filter
1776
      my $filter = $finfo->{$way};
1777
      
1778
      # Filter state
1779
      my $state = !exists $finfo->{$way} ? 'not_exists'
1780
        : !defined $filter        ? 'not_defined'
1781
        : ref $filter eq 'CODE'   ? 'code'
1782
        : 'name';
1783
      
1784
      # Filter is not exists
1785
      next if $state eq 'not_exists';
1786
      
1787
      # Check filter name
1788
      croak qq{Filter "$filter" is not registered } . _subname
1789
        if  $state eq 'name' && ! exists $self->filters->{$filter};
1790
      
1791
      # Set filter
1792
      my $f = $state eq 'not_defined' ? undef
1793
        : $state eq 'code' ? $filter
1794
        : $self->filters->{$filter};
1795
      $self->{filter}{$way}{$table}{$column} = $f;
1796
      $self->{filter}{$way}{$table}{"$table.$column"} = $f;
1797
      $self->{filter}{$way}{$table}{"${table}__$column"} = $f;
1798
      $self->{filter}{$way}{$table}{"${table}-$column"} = $f;
1799
    }
1800
  }
1801
  
1802
  return $self;
updated pod
Yuki Kimoto authored on 2011-06-21
1803
}
1804

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
1805
# DEPRECATED!
1806
has 'data_source';
1807
has dbi_options => sub { {} };
1808
has filter_check  => 1;
1809
has 'reserved_word_quote';
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
1810
has dbi_option => sub { {} };
1811
has default_dbi_option => sub {
cleanup
Yuki Kimoto authored on 2012-01-20
1812
  warn "default_dbi_option is DEPRECATED! use default_option instead";
1813
  return shift->default_option;
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
1814
};
1815

            
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
1816
# DEPRECATED
1817
sub tag_parse {
cleanup
Yuki Kimoto authored on 2012-01-20
1818
 my $self = shift;
1819
 warn "tag_parse is DEPRECATED! use \$ENV{DBIX_CUSTOM_TAG_PARSE} " .
1820
   "environment variable";
1821
  if (@_) {
1822
    $self->{tag_parse} = $_[0];
1823
    return $self;
1824
  }
1825
  return $self->{tag_parse};
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
1826
}
1827

            
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
1828
# DEPRECATED!
1829
sub method {
cleanup
Yuki Kimoto authored on 2012-01-20
1830
  warn "method is DEPRECATED! use helper instead";
1831
  return shift->helper(@_);
- method method of DBIx::Cus...
Yuki Kimoto authored on 2011-10-10
1832
}
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
1833

            
1834
# DEPRECATED!
1835
sub assign_param {
cleanup
Yuki Kimoto authored on 2012-01-20
1836
  my $self = shift;
1837
  warn "assing_param is DEPRECATED! use assign_clause instead";
1838
  return $self->assign_clause(@_);
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
1839
}
1840

            
1841
# DEPRECATED
1842
sub update_param {
cleanup
Yuki Kimoto authored on 2012-01-20
1843
  my ($self, $param, $opts) = @_;
1844
  
1845
  warn "update_param is DEPRECATED! use assign_clause instead.";
1846
  
1847
  # Create update parameter tag
1848
  my $tag = $self->assign_clause($param, $opts);
1849
  $tag = "set $tag" unless $opts->{no_set};
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
1850

            
cleanup
Yuki Kimoto authored on 2012-01-20
1851
  return $tag;
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
1852
}
1853

            
updated pod
Yuki Kimoto authored on 2011-06-21
1854
# DEPRECATED!
1855
sub create_query {
cleanup
Yuki Kimoto authored on 2012-01-20
1856
  warn "create_query is DEPRECATED! use query option of each method";
1857
  shift->_create_query(@_);
updated pod
Yuki Kimoto authored on 2011-06-21
1858
}
1859

            
cleanup
Yuki Kimoto authored on 2011-06-13
1860
# DEPRECATED!
1861
sub apply_filter {
cleanup
Yuki Kimoto authored on 2012-01-20
1862
  my $self = shift;
1863
  
1864
  warn "apply_filter is DEPRECATED!";
1865
  return $self->_apply_filter(@_);
cleanup
Yuki Kimoto authored on 2011-06-13
1866
}
1867

            
select_at is DEPRECATED! use...
Yuki Kimoto authored on 2011-06-08
1868
# DEPRECATED!
1869
sub select_at {
cleanup
Yuki Kimoto authored on 2012-01-20
1870
  my ($self, %opt) = @_;
1871

            
1872
  warn "select_at is DEPRECATED! use select method id option instead";
1873

            
1874
  # Options
1875
  my $primary_keys = delete $opt{primary_key};
1876
  my $where = delete $opt{where};
1877
  my $param = delete $opt{param};
1878
  
1879
  # Table
1880
  croak qq{"table" option must be specified } . _subname
1881
    unless $opt{table};
1882
  my $table = ref $opt{table} ? $opt{table}->[-1] : $opt{table};
1883
  
1884
  # Create where parameter
1885
  my $where_param = $self->_id_to_param($where, $primary_keys);
1886
  
1887
  return $self->select(where => $where_param, %opt);
select_at is DEPRECATED! use...
Yuki Kimoto authored on 2011-06-08
1888
}
1889

            
delete_at is DEPRECATED! use...
Yuki Kimoto authored on 2011-06-08
1890
# DEPRECATED!
1891
sub delete_at {
cleanup
Yuki Kimoto authored on 2012-01-20
1892
  my ($self, %opt) = @_;
updated pod
Yuki Kimoto authored on 2011-06-08
1893

            
cleanup
Yuki Kimoto authored on 2012-01-20
1894
  warn "delete_at is DEPRECATED! use delete method id option instead";
1895
  
1896
  # Options
1897
  my $primary_keys = delete $opt{primary_key};
1898
  my $where = delete $opt{where};
1899
  
1900
  # Create where parameter
1901
  my $where_param = $self->_id_to_param($where, $primary_keys);
1902
  
1903
  return $self->delete(where => $where_param, %opt);
delete_at is DEPRECATED! use...
Yuki Kimoto authored on 2011-06-08
1904
}
1905

            
cleanup
Yuki Kimoto authored on 2011-06-08
1906
# DEPRECATED!
1907
sub update_at {
cleanup
Yuki Kimoto authored on 2012-01-20
1908
  my $self = shift;
1909

            
1910
  warn "update_at is DEPRECATED! use update method id option instead";
1911
  
1912
  # Options
1913
  my $param;
1914
  $param = shift if @_ % 2;
1915
  my %opt = @_;
1916
  my $primary_keys = delete $opt{primary_key};
1917
  my $where = delete $opt{where};
1918
  my $p = delete $opt{param} || {};
1919
  $param  ||= $p;
1920
  
1921
  # Create where parameter
1922
  my $where_param = $self->_id_to_param($where, $primary_keys);
1923
  
1924
  return $self->update(where => $where_param, param => $param, %opt);
cleanup
Yuki Kimoto authored on 2011-06-08
1925
}
1926

            
insert_at is DEPRECATED! add...
Yuki Kimoto authored on 2011-06-08
1927
# DEPRECATED!
1928
sub insert_at {
cleanup
Yuki Kimoto authored on 2012-01-20
1929
  my $self = shift;
1930
  
1931
  warn "insert_at is DEPRECATED! use insert method id option instead";
1932
  
1933
  # Options
1934
  my $param;
1935
  $param = shift if @_ % 2;
1936
  my %opt = @_;
1937
  my $primary_key = delete $opt{primary_key};
1938
  $primary_key = [$primary_key] unless ref $primary_key;
1939
  my $where = delete $opt{where};
1940
  my $p = delete $opt{param} || {};
1941
  $param  ||= $p;
1942
  
1943
  # Create where parameter
1944
  my $where_param = $self->_id_to_param($where, $primary_key);
1945
  $param = $self->merge_param($where_param, $param);
1946
  
1947
  return $self->insert(param => $param, %opt);
insert_at is DEPRECATED! add...
Yuki Kimoto authored on 2011-06-08
1948
}
1949

            
added warnings
Yuki Kimoto authored on 2011-06-07
1950
# DEPRECATED!
1951
sub register_tag {
cleanup
Yuki Kimoto authored on 2012-01-20
1952
  my $self = shift;
1953
  
1954
  warn "register_tag is DEPRECATED!";
1955
  
1956
  # Merge tag
1957
  my $tags = ref $_[0] eq 'HASH' ? $_[0] : {@_};
1958
  $self->{_tags} = {%{$self->{_tags} || {}}, %$tags};
1959
  
1960
  return $self;
test cleanup
Yuki Kimoto authored on 2011-08-10
1961
}
1962

            
1963
# DEPRECATED!
1964
sub register_tag_processor {
cleanup
Yuki Kimoto authored on 2012-01-20
1965
  my $self = shift;
1966
  warn "register_tag_processor is DEPRECATED!";
1967
  # Merge tag
1968
  my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
1969
  $self->{_tags} = {%{$self->{_tags} || {}}, %{$tag_processors}};
1970
  return $self;
added warnings
Yuki Kimoto authored on 2011-06-07
1971
}
1972

            
cleanup
Yuki Kimoto authored on 2011-01-25
1973
# DEPRECATED!
cleanup
Yuki Kimoto authored on 2011-01-12
1974
sub default_bind_filter {
cleanup
Yuki Kimoto authored on 2012-01-20
1975
  my $self = shift;
1976
  
1977
  warn "default_bind_filter is DEPRECATED!";
1978
  
1979
  if (@_) {
1980
    my $fname = $_[0];
added warnings
Yuki Kimoto authored on 2011-06-07
1981
    
cleanup
Yuki Kimoto authored on 2012-01-20
1982
    if (@_ && !$fname) {
1983
      $self->{default_out_filter} = undef;
cleanup
Yuki Kimoto authored on 2011-01-12
1984
    }
cleanup
Yuki Kimoto authored on 2012-01-20
1985
    else {
1986
      croak qq{Filter "$fname" is not registered}
1987
        unless exists $self->filters->{$fname};
1988
  
1989
      $self->{default_out_filter} = $self->filters->{$fname};
1990
    }
1991
    return $self;
1992
  }
1993
  
1994
  return $self->{default_out_filter};
cleanup
Yuki Kimoto authored on 2011-01-12
1995
}
1996

            
cleanup
Yuki Kimoto authored on 2011-01-25
1997
# DEPRECATED!
cleanup
Yuki Kimoto authored on 2011-01-12
1998
sub default_fetch_filter {
cleanup
Yuki Kimoto authored on 2012-01-20
1999
  my $self = shift;
added warnings
Yuki Kimoto authored on 2011-06-07
2000

            
cleanup
Yuki Kimoto authored on 2012-01-20
2001
  warn "default_fetch_filter is DEPRECATED!";
2002
  
2003
  if (@_) {
2004
    my $fname = $_[0];
many changed
Yuki Kimoto authored on 2011-01-23
2005

            
cleanup
Yuki Kimoto authored on 2012-01-20
2006
    if (@_ && !$fname) {
2007
      $self->{default_in_filter} = undef;
2008
    }
2009
    else {
2010
      croak qq{Filter "$fname" is not registered}
2011
        unless exists $self->filters->{$fname};
2012
  
2013
      $self->{default_in_filter} = $self->filters->{$fname};
cleanup
Yuki Kimoto authored on 2011-01-12
2014
    }
2015
    
cleanup
Yuki Kimoto authored on 2012-01-20
2016
    return $self;
2017
  }
2018
  
2019
  return $self->{default_in_filter};
cleanup
Yuki Kimoto authored on 2011-01-12
2020
}
2021

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
2022
# DEPRECATED!
2023
sub insert_param {
cleanup
Yuki Kimoto authored on 2012-01-20
2024
  my $self = shift;
2025
  warn "insert_param is DEPRECATED! use values_clause instead";
2026
  return $self->values_clause(@_);
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
2027
}
2028

            
- renamed update_param to up...
Yuki Kimoto authored on 2011-03-30
2029
# DEPRECATED!
- update_param_tag is DEPREC...
Yuki Kimoto authored on 2011-06-07
2030
sub insert_param_tag {
cleanup
Yuki Kimoto authored on 2012-01-20
2031
  warn "insert_param_tag is DEPRECATED! " .
2032
    "use insert_param instead!";
2033
  return shift->insert_param(@_);
- renamed update_param to up...
Yuki Kimoto authored on 2011-03-30
2034
}
2035

            
2036
# DEPRECATED!
- update_param_tag is DEPREC...
Yuki Kimoto authored on 2011-06-07
2037
sub update_param_tag {
cleanup
Yuki Kimoto authored on 2012-01-20
2038
  warn "update_param_tag is DEPRECATED! " .
2039
    "use update_param instead";
2040
  return shift->update_param(@_);
- renamed update_param to up...
Yuki Kimoto authored on 2011-03-30
2041
}
cleanup
Yuki Kimoto authored on 2011-03-08
2042
# DEPRECATED!
2043
sub _push_relation {
cleanup
Yuki Kimoto authored on 2012-01-20
2044
  my ($self, $sql, $tables, $relation, $need_where) = @_;
2045
  
2046
  if (keys %{$relation || {}}) {
2047
    $$sql .= $need_where ? 'where ' : 'and ';
2048
    for my $rcolumn (keys %$relation) {
2049
      my $table1 = (split (/\./, $rcolumn))[0];
2050
      my $table2 = (split (/\./, $relation->{$rcolumn}))[0];
2051
      push @$tables, ($table1, $table2);
2052
      $$sql .= "$rcolumn = " . $relation->{$rcolumn} .  'and ';
cleanup
Yuki Kimoto authored on 2011-03-08
2053
    }
cleanup
Yuki Kimoto authored on 2012-01-20
2054
  }
2055
  $$sql =~ s/and $/ /;
cleanup
Yuki Kimoto authored on 2011-03-08
2056
}
2057

            
2058
# DEPRECATED!
2059
sub _add_relation_table {
cleanup
Yuki Kimoto authored on 2012-01-20
2060
  my ($self, $tables, $relation) = @_;
2061
  
2062
  if (keys %{$relation || {}}) {
2063
    for my $rcolumn (keys %$relation) {
2064
      my $table1 = (split (/\./, $rcolumn))[0];
2065
      my $table2 = (split (/\./, $relation->{$rcolumn}))[0];
2066
      my $table1_exists;
2067
      my $table2_exists;
2068
      for my $table (@$tables) {
2069
        $table1_exists = 1 if $table eq $table1;
2070
        $table2_exists = 1 if $table eq $table2;
2071
      }
2072
      unshift @$tables, $table1 unless $table1_exists;
2073
      unshift @$tables, $table2 unless $table2_exists;
2074
    }
2075
  }
cleanup
Yuki Kimoto authored on 2011-03-08
2076
}
2077

            
fixed DBIx::Custom::QueryBui...
yuki-kimoto authored on 2010-08-15
2078
1;
2079

            
removed reconnect method
yuki-kimoto authored on 2010-05-28
2080
=head1 NAME
2081

            
moved DBIx::Custom::Guide to...
Yuki Kimoto authored on 2011-10-22
2082
DBIx::Custom - DBI extension to execute insert, update, delete, and select easily
removed reconnect method
yuki-kimoto authored on 2010-05-28
2083

            
fix heading typos
Terrence Brannon authored on 2011-08-17
2084
=head1 SYNOPSIS
cleanup
yuki-kimoto authored on 2010-08-05
2085

            
cleanup
Yuki Kimoto authored on 2012-01-20
2086
  use DBIx::Custom;
2087
  
2088
  # Connect
2089
  my $dbi = DBIx::Custom->connect(
2090
    dsn => "dbi:mysql:database=dbname",
2091
    user => 'ken',
2092
    password => '!LFKD%$&',
2093
    option => {mysql_enable_utf8 => 1}
2094
  );
2095

            
2096
  # Insert 
2097
  $dbi->insert({title => 'Perl', author => 'Ken'}, table  => 'book');
2098
  
2099
  # Update 
2100
  $dbi->update({title => 'Perl', author => 'Ken'}, table  => 'book',
2101
    where  => {id => 5});
2102
  
2103
  # Delete
2104
  $dbi->delete(table  => 'book', where => {author => 'Ken'});
2105

            
2106
  # Select
2107
  my $result = $dbi->select(table  => 'book',
2108
    column => ['title', 'author'], where  => {author => 'Ken'});
2109

            
2110
  # Select, more complex
2111
  my $result = $dbi->select(
2112
    table  => 'book',
2113
    column => [
2114
      {book => [qw/title author/]},
2115
      {company => ['name']}
2116
    ],
2117
    where  => {'book.author' => 'Ken'},
2118
    join => ['left outer join company on book.company_id = company.id'],
2119
    append => 'order by id limit 5'
2120
  );
2121
  
2122
  # Fetch
2123
  while (my $row = $result->fetch) {
2124
      
2125
  }
2126
  
2127
  # Fetch as hash
2128
  while (my $row = $result->fetch_hash) {
2129
      
2130
  }
2131
  
2132
  # Execute SQL with parameter.
2133
  $dbi->execute(
2134
    "select id from book where author = :author and title like :title",
2135
    {author => 'ken', title => '%Perl%'}
2136
  );
2137
  
fix heading typos
Terrence Brannon authored on 2011-08-17
2138
=head1 DESCRIPTION
removed reconnect method
yuki-kimoto authored on 2010-05-28
2139

            
cleanup
Yuki Kimoto authored on 2011-07-29
2140
L<DBIx::Custom> is L<DBI> wrapper module to execute SQL easily.
updated pod
Yuki Kimoto authored on 2011-06-21
2141
This module have the following features.
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2142

            
updated pod
Yuki Kimoto authored on 2011-06-21
2143
=over 4
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2144

            
cleanup
Yuki Kimoto authored on 2011-07-29
2145
=item *
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2146

            
cleanup
Yuki Kimoto authored on 2011-07-29
2147
Execute C<insert>, C<update>, C<delete>, or C<select> statement easily
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2148

            
cleanup
Yuki Kimoto authored on 2011-07-29
2149
=item *
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2150

            
cleanup
Yuki Kimoto authored on 2011-07-29
2151
Create C<where> clause flexibly
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2152

            
cleanup
Yuki Kimoto authored on 2011-07-29
2153
=item *
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2154

            
micro optimization
Yuki Kimoto authored on 2011-07-30
2155
Named place holder support
2156

            
2157
=item *
2158

            
cleanup
Yuki Kimoto authored on 2011-07-29
2159
Model support
2160

            
2161
=item *
2162

            
2163
Connection manager support
2164

            
2165
=item *
pod fix
Yuki Kimoto authored on 2011-01-21
2166

            
cleanup
Yuki Kimoto authored on 2011-07-30
2167
Choice your favorite relational database management system,
cleanup
Yuki Kimoto authored on 2011-07-29
2168
C<MySQL>, C<SQLite>, C<PostgreSQL>, C<Oracle>,
2169
C<Microsoft SQL Server>, C<Microsoft Access>, C<DB2> or anything, 
2170

            
2171
=item *
2172

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2173
Filtering by data type or column name
cleanup
Yuki Kimoto authored on 2011-07-29
2174

            
2175
=item *
2176

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2177
Create C<order by> clause flexibly
cleanup
Yuki Kimoto authored on 2011-07-29
2178

            
2179
=back
pod fix
Yuki Kimoto authored on 2011-01-21
2180

            
fix heading typos
Terrence Brannon authored on 2011-08-17
2181
=head1 DOCUMENTATION
pod fix
Yuki Kimoto authored on 2011-01-21
2182

            
cleanup
Yuki Kimoto authored on 2011-07-29
2183
L<DBIx::Custom::Guide> - How to use L<DBIx::Custom>
pod fix
Yuki Kimoto authored on 2011-01-21
2184

            
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2185
L<DBIx::Custom Wiki|https://github.com/yuki-kimoto/DBIx-Custom/wiki>
cleanup
Yuki Kimoto authored on 2011-07-29
2186
- Theare are various examples.
2187

            
micro optimization
Yuki Kimoto authored on 2011-07-30
2188
Module documentations - 
cleanup
Yuki Kimoto authored on 2011-07-29
2189
L<DBIx::Custom::Result>,
2190
L<DBIx::Custom::Query>,
2191
L<DBIx::Custom::Where>,
2192
L<DBIx::Custom::Model>,
2193
L<DBIx::Custom::Order>
updated document
yuki-kimoto authored on 2010-08-08
2194

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

            
added EXPERIMETNAL aysnc_con...
Yuki Kimoto authored on 2012-02-10
2197
=head2 C<async_conf> EXPERIMENTAL
2198

            
2199
  my $async_conf = $dbi->async_conf;
2200
  $dbi = $dbi->async_conf($conf);
2201

            
2202
Setting when C<async> option is used.
2203

            
2204
  # MySQL
2205
  $dbi->async_conf({
2206
    prepare_attr => {async => 1},
2207
    fh => sub { shift->dbh->mysql_fd }
2208
  })
2209

            
2210
C<prepare_attr> is DBI's C<prepare> method second argument,
2211
C<fh> is callback that return file handle to watch.
2212

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
2213
=head2 C<connector>
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2214

            
cleanup
Yuki Kimoto authored on 2012-01-20
2215
  my $connector = $dbi->connector;
2216
  $dbi = $dbi->connector($connector);
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2217

            
micro optimization
Yuki Kimoto authored on 2011-07-30
2218
Connection manager object. if C<connector> is set, you can get C<dbh>
2219
through connection manager. Conection manager object must have C<dbh> mehtod.
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2220

            
2221
This is L<DBIx::Connector> example. Please pass
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
2222
C<default_option> to L<DBIx::Connector> C<new> method.
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2223

            
cleanup
Yuki Kimoto authored on 2012-01-20
2224
  my $connector = DBIx::Connector->new(
2225
    "dbi:mysql:database=$database",
2226
    $user,
2227
    $password,
2228
    DBIx::Custom->new->default_option
2229
  );
2230
  
2231
  my $dbi = DBIx::Custom->connect(connector => $connector);
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2232

            
cleanup
Yuki Kimoto authored on 2011-08-16
2233
If C<connector> is set to 1 when connect method is called,
2234
L<DBIx::Connector> is automatically set to C<connector>
2235

            
cleanup
Yuki Kimoto authored on 2012-01-20
2236
  my $dbi = DBIx::Custom->connect(
2237
    dsn => $dsn, user => $user, password => $password, connector => 1);
2238
  
2239
  my $connector = $dbi->connector; # DBIx::Connector
cleanup
Yuki Kimoto authored on 2011-08-16
2240

            
2241
Note that L<DBIx::Connector> must be installed.
2242

            
data_source is DEPRECATED! I...
Yuki Kimoto authored on 2011-06-06
2243
=head2 C<dsn>
2244

            
cleanup
Yuki Kimoto authored on 2012-01-20
2245
  my $dsn = $dbi->dsn;
2246
  $dbi = $dbi->dsn("DBI:mysql:database=dbname");
packaging one directory
yuki-kimoto authored on 2009-11-16
2247

            
updated pod
Yuki Kimoto authored on 2011-06-21
2248
Data source name, used when C<connect> method is executed.
removed DESTROY method(not b...
yuki-kimoto authored on 2010-07-18
2249

            
- dbi_option attribute is re...
Yuki Kimoto authored on 2011-10-05
2250
=head2 C<default_option>
add default_dbi_option()
Yuki Kimoto authored on 2011-02-19
2251

            
cleanup
Yuki Kimoto authored on 2012-01-20
2252
  my $default_option = $dbi->default_option;
2253
  $dbi = $dbi->default_option($default_option);
add default_dbi_option()
Yuki Kimoto authored on 2011-02-19
2254

            
updated pod
Yuki Kimoto authored on 2011-06-21
2255
L<DBI> default option, used when C<connect> method is executed,
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2256
default to the following values.
add default_dbi_option()
Yuki Kimoto authored on 2011-02-19
2257

            
cleanup
Yuki Kimoto authored on 2012-01-20
2258
  {
2259
    RaiseError => 1,
2260
    PrintError => 0,
2261
    AutoCommit => 1,
2262
  }
packaging one directory
yuki-kimoto authored on 2009-11-16
2263

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2264
=head2 C<exclude_table>
2265

            
cleanup
Yuki Kimoto authored on 2012-01-20
2266
  my $exclude_table = $dbi->exclude_table;
2267
  $dbi = $dbi->exclude_table(qr/pg_/);
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2268

            
2269
Excluded table regex.
2270
C<each_column>, C<each_table>, C<type_rule>,
2271
and C<setup_model> methods ignore matching tables.
2272

            
cleanup
yuki-kimoto authored on 2010-10-17
2273
=head2 C<filters>
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
2274

            
cleanup
Yuki Kimoto authored on 2012-01-20
2275
  my $filters = $dbi->filters;
2276
  $dbi = $dbi->filters(\%filters);
packaging one directory
yuki-kimoto authored on 2009-11-16
2277

            
updated pod
Yuki Kimoto authored on 2011-06-21
2278
Filters, registered by C<register_filter> method.
add models() attribute
Yuki Kimoto authored on 2011-02-21
2279

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
2280
=head2 C<last_sql>
added EXPERIMENTAL last_sql ...
Yuki Kimoto authored on 2011-07-11
2281

            
cleanup
Yuki Kimoto authored on 2012-01-20
2282
  my $last_sql = $dbi->last_sql;
2283
  $dbi = $dbi->last_sql($last_sql);
added EXPERIMENTAL last_sql ...
Yuki Kimoto authored on 2011-07-11
2284

            
2285
Get last successed SQL executed by C<execute> method.
2286

            
- id option work if id count...
Yuki Kimoto authored on 2011-11-03
2287
=head2 C<now>
- insert timestamp option is...
Yuki Kimoto authored on 2011-10-25
2288

            
cleanup
Yuki Kimoto authored on 2012-01-20
2289
  my $now = $dbi->now;
2290
  $dbi = $dbi->now($now);
- insert timestamp option is...
Yuki Kimoto authored on 2011-10-25
2291

            
- id option work if id count...
Yuki Kimoto authored on 2011-11-03
2292
Code reference which return current time, default to the following code reference.
- insert timestamp option is...
Yuki Kimoto authored on 2011-10-25
2293

            
cleanup
Yuki Kimoto authored on 2012-01-20
2294
  sub {
2295
    my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
2296
    $mon++;
2297
    $year += 1900;
2298
    return sprintf("%04d-%02d-%02d %02d:%02d:%02d");
2299
  }
- insert timestamp option is...
Yuki Kimoto authored on 2011-10-25
2300

            
- id option work if id count...
Yuki Kimoto authored on 2011-11-03
2301
This return the time like C<2011-10-14 05:05:27>.
2302

            
2303
This is used by C<insert> method's C<created_at> option and C<updated_at> option,
2304
and C<update> method's C<updated_at> option.
- insert timestamp option is...
Yuki Kimoto authored on 2011-10-25
2305

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
2306
=head2 C<models>
add models() attribute
Yuki Kimoto authored on 2011-02-21
2307

            
cleanup
Yuki Kimoto authored on 2012-01-20
2308
  my $models = $dbi->models;
2309
  $dbi = $dbi->models(\%models);
add models() attribute
Yuki Kimoto authored on 2011-02-21
2310

            
updated pod
Yuki Kimoto authored on 2011-06-21
2311
Models, included by C<include_model> method.
add models() attribute
Yuki Kimoto authored on 2011-02-21
2312

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2313
=head2 C<option>
2314

            
cleanup
Yuki Kimoto authored on 2012-01-20
2315
  my $option = $dbi->option;
2316
  $dbi = $dbi->option($option);
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2317

            
2318
L<DBI> option, used when C<connect> method is executed.
2319
Each value in option override the value of C<default_option>.
2320

            
cleanup
yuki-kimoto authored on 2010-10-17
2321
=head2 C<password>
2322

            
cleanup
Yuki Kimoto authored on 2012-01-20
2323
  my $password = $dbi->password;
2324
  $dbi = $dbi->password('lkj&le`@s');
cleanup
yuki-kimoto authored on 2010-10-17
2325

            
updated pod
Yuki Kimoto authored on 2011-06-21
2326
Password, used when C<connect> method is executed.
update document
yuki-kimoto authored on 2010-01-30
2327

            
renamed update tag to update...
yuki-kimoto authored on 2010-08-09
2328
=head2 C<query_builder>
added commit method
yuki-kimoto authored on 2010-05-27
2329

            
cleanup
Yuki Kimoto authored on 2012-01-20
2330
  my $builder = $dbi->query_builder;
added commit method
yuki-kimoto authored on 2010-05-27
2331

            
test cleanup
Yuki Kimoto authored on 2011-08-10
2332
Creat query builder. This is L<DBIx::Custom::QueryBuilder>.
cleanup
yuki-kimoto authored on 2010-08-05
2333

            
reserved_word_quote is DEPRE...
Yuki Kimoto authored on 2011-06-17
2334
=head2 C<quote>
added EXPERIMENTAL reserved_...
Yuki Kimoto authored on 2011-03-30
2335

            
cleanup
Yuki Kimoto authored on 2012-01-20
2336
  my quote = $dbi->quote;
2337
  $dbi = $dbi->quote('"');
added EXPERIMENTAL reserved_...
Yuki Kimoto authored on 2011-03-30
2338

            
DBIx::Custom::Model type att...
Yuki Kimoto authored on 2011-06-17
2339
Reserved word quote.
2340
Default to double quote '"' except for mysql.
2341
In mysql, default to back quote '`'
added EXPERIMENTAL reserved_...
Yuki Kimoto authored on 2011-03-30
2342

            
cleanup
Yuki Kimoto authored on 2011-07-30
2343
You can set quote pair.
2344

            
cleanup
Yuki Kimoto authored on 2012-01-20
2345
  $dbi->quote('[]');
cleanup
Yuki Kimoto authored on 2011-07-30
2346

            
cleanup
yuki-kimoto authored on 2010-10-17
2347
=head2 C<result_class>
cleanup
yuki-kimoto authored on 2010-08-05
2348

            
cleanup
Yuki Kimoto authored on 2012-01-20
2349
  my $result_class = $dbi->result_class;
2350
  $dbi = $dbi->result_class('DBIx::Custom::Result');
cleanup
yuki-kimoto authored on 2010-08-05
2351

            
- remaned experimental safty...
Yuki Kimoto authored on 2011-03-10
2352
Result class, default to L<DBIx::Custom::Result>.
cleanup
yuki-kimoto authored on 2010-08-05
2353

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2354
=head2 C<safety_character>
update pod
Yuki Kimoto authored on 2011-01-27
2355

            
cleanup
Yuki Kimoto authored on 2012-01-20
2356
  my $safety_character = $dbi->safety_character;
2357
  $dbi = $dbi->safety_character($character);
update pod
Yuki Kimoto authored on 2011-01-27
2358

            
update pod
Yuki Kimoto authored on 2011-03-13
2359
Regex of safety character for table and column name, default to '\w'.
cleanup
Yuki Kimoto authored on 2011-03-10
2360
Note that you don't have to specify like '[\w]'.
update pod
Yuki Kimoto authored on 2011-01-27
2361

            
cleanup test
Yuki Kimoto authored on 2011-08-10
2362
=head2 C<separator>
2363

            
cleanup
Yuki Kimoto authored on 2012-01-20
2364
  my $separator = $dbi->separator;
2365
  $dbi = $dbi->separator('-');
improved join clause parsing
Yuki Kimoto authored on 2011-09-27
2366

            
2367
Separator which join table name and column name.
2368
This have effect to C<column> and C<mycolumn> method,
2369
and C<select> method's column option.
cleanup test
Yuki Kimoto authored on 2011-08-10
2370

            
improved join clause parsing
Yuki Kimoto authored on 2011-09-27
2371
Default to C<.>.
cleanup test
Yuki Kimoto authored on 2011-08-10
2372

            
added tag_parse attribute
Yuki Kimoto authored on 2011-06-28
2373
=head2 C<tag_parse>
2374

            
cleanup
Yuki Kimoto authored on 2012-01-20
2375
  my $tag_parse = $dbi->tag_parse(0);
2376
  $dbi = $dbi->tag_parse;
added tag_parse attribute
Yuki Kimoto authored on 2011-06-28
2377

            
2378
Enable DEPRECATED tag parsing functionality, default to 1.
2379
If you want to disable tag parsing functionality, set to 0.
2380

            
cleanup
yuki-kimoto authored on 2010-10-17
2381
=head2 C<user>
cleanup
yuki-kimoto authored on 2010-08-05
2382

            
cleanup
Yuki Kimoto authored on 2012-01-20
2383
  my $user = $dbi->user;
2384
  $dbi = $dbi->user('Ken');
cleanup
yuki-kimoto authored on 2010-08-05
2385

            
updated pod
Yuki Kimoto authored on 2011-06-21
2386
User name, used when C<connect> method is executed.
update pod
Yuki Kimoto authored on 2011-01-27
2387

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2388
=head2 C<user_column_info>
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2389

            
cleanup
Yuki Kimoto authored on 2012-01-20
2390
  my $user_column_info = $dbi->user_column_info;
2391
  $dbi = $dbi->user_column_info($user_column_info);
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2392

            
improved join clause parsing
Yuki Kimoto authored on 2011-09-30
2393
You can set the date like the following one.
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2394

            
cleanup
Yuki Kimoto authored on 2012-01-20
2395
  [
2396
    {table => 'book', column => 'title', info => {...}},
2397
    {table => 'author', column => 'name', info => {...}}
2398
  ]
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2399

            
improved join clause parsing
Yuki Kimoto authored on 2011-09-30
2400
Usually, you set return value of C<get_column_info>.
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2401

            
cleanup
Yuki Kimoto authored on 2012-01-20
2402
  my $user_column_info
2403
    = $dbi->get_column_info(exclude_table => qr/^system/);
2404
  $dbi->user_column_info($user_column_info);
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2405

            
2406
If C<user_column_info> is set, C<each_column> use C<user_column_info>
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2407
to find column info. this is very fast.
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2408

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2409
=head2 C<user_table_info>
added test
Yuki Kimoto authored on 2011-08-16
2410

            
cleanup
Yuki Kimoto authored on 2012-01-20
2411
  my $user_table_info = $dbi->user_table_info;
2412
  $dbi = $dbi->user_table_info($user_table_info);
added test
Yuki Kimoto authored on 2011-08-16
2413

            
2414
You can set the following data.
2415

            
cleanup
Yuki Kimoto authored on 2012-01-20
2416
  [
2417
    {table => 'book', info => {...}},
2418
    {table => 'author', info => {...}}
2419
  ]
added test
Yuki Kimoto authored on 2011-08-16
2420

            
2421
Usually, you can set return value of C<get_table_info>.
2422

            
cleanup
Yuki Kimoto authored on 2012-01-20
2423
  my $user_table_info = $dbi->get_table_info(exclude => qr/^system/);
2424
  $dbi->user_table_info($user_table_info);
added test
Yuki Kimoto authored on 2011-08-16
2425

            
2426
If C<user_table_info> is set, C<each_table> use C<user_table_info>
2427
to find table info.
2428

            
cleanup
yuki-kimoto authored on 2010-10-17
2429
=head1 METHODS
added commit method
yuki-kimoto authored on 2010-05-27
2430

            
cleanup
yuki-kimoto authored on 2010-10-17
2431
L<DBIx::Custom> inherits all methods from L<Object::Simple>
cleanup
Yuki Kimoto authored on 2011-03-10
2432
and use all methods of L<DBI>
cleanup
yuki-kimoto authored on 2010-10-17
2433
and implements the following new ones.
added check_filter attribute
yuki-kimoto authored on 2010-08-08
2434

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2435
=head2 C<available_datatype>
changed type_rule arguments ...
Yuki Kimoto authored on 2011-06-12
2436

            
cleanup
Yuki Kimoto authored on 2012-01-20
2437
  print $dbi->available_datatype;
changed type_rule arguments ...
Yuki Kimoto authored on 2011-06-12
2438

            
added EXPERIMENTAL available...
Yuki Kimoto authored on 2011-06-14
2439
Get available data types. You can use these data types
updated pod
Yuki Kimoto authored on 2011-06-21
2440
in C<type rule>'s C<from1> and C<from2> section.
added EXPERIMENTAL available...
Yuki Kimoto authored on 2011-06-14
2441

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2442
=head2 C<available_typename>
added EXPERIMENTAL available...
Yuki Kimoto authored on 2011-06-14
2443

            
cleanup
Yuki Kimoto authored on 2012-01-20
2444
  print $dbi->available_typename;
added EXPERIMENTAL available...
Yuki Kimoto authored on 2011-06-14
2445

            
2446
Get available type names. You can use these type names in
updated pod
Yuki Kimoto authored on 2011-06-21
2447
C<type_rule>'s C<into1> and C<into2> section.
changed type_rule arguments ...
Yuki Kimoto authored on 2011-06-12
2448

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
2449
=head2 C<assign_clause>
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
2450

            
cleanup
Yuki Kimoto authored on 2012-01-20
2451
  my $assign_clause = $dbi->assign_clause({title => 'a', age => 2});
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
2452

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
2453
Create assign clause
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
2454

            
cleanup
Yuki Kimoto authored on 2012-01-20
2455
  title = :title, author = :author
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
2456

            
- update_param is DEPRECATED...
Yuki Kimoto authored on 2011-10-04
2457
This is used to create update clause.
2458

            
cleanup
Yuki Kimoto authored on 2012-01-20
2459
  "update book set " . $dbi->assign_clause({title => 'a', age => 2});
added EXPERIMENTAL assign_ta...
Yuki Kimoto authored on 2011-04-26
2460

            
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
2461
=head2 C<async> EXPERIMENTAL
2462

            
2463
  async => sub {
2464
    my ($dbi, $result) = @_;
2465
    ...
2466
  };
2467

            
2468
Database async access. L<AnyEvent> is required.
2469

            
2470
This is C<mysql> async access example.
2471

            
2472
  use AnyEvent;
2473

            
2474
  my $cond = AnyEvent->condvar;
2475

            
2476
  my $timer = AnyEvent->timer(
2477
    interval => 1,
2478
    cb => sub { 1 }
2479
  );
2480

            
2481
  my $count = 0;
2482

            
2483
  $dbi->execute('SELECT SLEEP(1), 3', undef,
2484
    prepare_attr => {async => 1}, statement => 'select',
2485
    async => sub {
2486
      my ($dbi, $result) = @_;
2487
      my $row = $result->fetch_one;
2488
      is($row->[1], 3, 'before');
2489
      $cond->send if ++$count == 2;
2490
    }
2491
  );
2492

            
2493
  $dbi->select('key1', table => 'table1', prepare_attr => {async => 1},
2494
    async => sub {
2495
      my ($dbi, $result) = @_;
2496
      my $row = $result->fetch_one;
2497
      is($row->[0], 1, 'after1');
2498
      $dbi->select('key1', table => 'table1', prepare_attr => {async => 1},
2499
        async => sub {
2500
          my ($dbi, $result) = @_;
2501
          my $row = $result->fetch_one;
2502
          is($row->[0], 1, 'after2');
2503
          $cond->send if ++$count == 2;
2504
        }
2505
      )
2506
    }
2507
  );
2508

            
2509
  $cond->recv;
2510

            
added EXPERIMENTAL parameter...
Yuki Kimoto authored on 2011-07-29
2511
=head2 C<column>
- select() EXPERIMETNAL colu...
Yuki Kimoto authored on 2011-06-08
2512

            
cleanup
Yuki Kimoto authored on 2012-01-20
2513
  my $column = $dbi->column(book => ['author', 'title']);
- select() EXPERIMETNAL colu...
Yuki Kimoto authored on 2011-06-08
2514

            
2515
Create column clause. The follwoing column clause is created.
2516

            
cleanup
Yuki Kimoto authored on 2012-01-20
2517
  book.author as "book.author",
2518
  book.title as "book.title"
- select() EXPERIMETNAL colu...
Yuki Kimoto authored on 2011-06-08
2519

            
cleanup test
Yuki Kimoto authored on 2011-08-10
2520
You can change separator by C<separator> attribute.
- select() EXPERIMETNAL colu...
Yuki Kimoto authored on 2011-06-08
2521

            
cleanup
Yuki Kimoto authored on 2012-01-20
2522
  # Separator is hyphen
2523
  $dbi->separator('-');
2524
  
2525
  book.author as "book-author",
2526
  book.title as "book-title"
2527
  
removed DBIx::Custom commit ...
yuki-kimoto authored on 2010-07-14
2528
=head2 C<connect>
packaging one directory
yuki-kimoto authored on 2009-11-16
2529

            
cleanup
Yuki Kimoto authored on 2012-01-20
2530
  my $dbi = DBIx::Custom->connect(
2531
    dsn => "dbi:mysql:database=dbname",
2532
    user => 'ken',
2533
    password => '!LFKD%$&',
2534
    option => {mysql_enable_utf8 => 1}
2535
  );
update pod
Yuki Kimoto authored on 2011-03-13
2536

            
2537
Connect to the database and create a new L<DBIx::Custom> object.
bind_filter argument is chan...
yuki-kimoto authored on 2009-11-19
2538

            
renamed build_query to creat...
yuki-kimoto authored on 2010-08-06
2539
L<DBIx::Custom> is a wrapper of L<DBI>.
cleanup
yuki-kimoto authored on 2010-08-09
2540
C<AutoCommit> and C<RaiseError> options are true, 
update pod
Yuki Kimoto authored on 2011-03-13
2541
and C<PrintError> option is false by default.
packaging one directory
yuki-kimoto authored on 2009-11-16
2542

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2543
=head2 C<count>
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-08-20
2544

            
cleanup
Yuki Kimoto authored on 2012-01-20
2545
  my $count = $dbi->count(table => 'book');
- added EXPERIMENTAL DBIx::C...
Yuki Kimoto authored on 2011-08-20
2546

            
2547
Get rows count.
2548

            
2549
Options is same as C<select> method's ones.
2550

            
2551
=head2 C<create_model>
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2552

            
cleanup
Yuki Kimoto authored on 2012-01-20
2553
  my $model = $dbi->create_model(
2554
    table => 'book',
2555
    primary_key => 'id',
2556
    join => [
2557
      'inner join company on book.comparny_id = company.id'
2558
    ],
2559
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2560

            
2561
Create L<DBIx::Custom::Model> object and initialize model.
updated pod
Yuki Kimoto authored on 2011-06-21
2562
the module is also used from C<model> method.
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2563

            
cleanup
Yuki Kimoto authored on 2012-01-20
2564
 $dbi->model('book')->select(...);
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2565

            
EXPERIMETAL fork safety impl...
Yuki Kimoto authored on 2011-03-12
2566
=head2 C<dbh>
2567

            
cleanup
Yuki Kimoto authored on 2012-01-20
2568
  my $dbh = $dbi->dbh;
EXPERIMETAL fork safety impl...
Yuki Kimoto authored on 2011-03-12
2569

            
- removed EXPERIMENTAL Prefo...
Yuki Kimoto authored on 2011-04-04
2570
Get L<DBI> database handle. if C<connector> is set, you can get
updated pod
Yuki Kimoto authored on 2011-06-21
2571
database handle through C<connector> object.
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2572

            
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2573
=head2 C<delete>
2574

            
cleanup
Yuki Kimoto authored on 2012-01-20
2575
  $dbi->delete(table => 'book', where => {title => 'Perl'});
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2576

            
2577
Execute delete statement.
2578

            
2579
The following opitons are available.
2580

            
cleanup
Yuki Kimoto authored on 2011-10-20
2581
B<OPTIONS>
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2582

            
cleanup
Yuki Kimoto authored on 2011-10-20
2583
C<delete> method use all of C<execute> method's options,
2584
and use the following new ones.
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2585

            
cleanup
Yuki Kimoto authored on 2011-10-20
2586
=over 4
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2587

            
2588
=item C<id>
2589

            
cleanup
Yuki Kimoto authored on 2012-01-20
2590
  id => 4
2591
  id => [4, 5]
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2592

            
2593
ID corresponding to C<primary_key>.
2594
You can delete rows by C<id> and C<primary_key>.
2595

            
cleanup
Yuki Kimoto authored on 2012-01-20
2596
  $dbi->delete(
2597
    primary_key => ['id1', 'id2'],
2598
    id => [4, 5],
2599
    table => 'book',
2600
  );
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2601

            
2602
The above is same as the followin one.
2603

            
cleanup
Yuki Kimoto authored on 2012-01-20
2604
  $dbi->delete(where => {id1 => 4, id2 => 5}, table => 'book');
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2605

            
2606
=item C<prefix>
2607

            
cleanup
Yuki Kimoto authored on 2012-01-20
2608
  prefix => 'some'
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2609

            
2610
prefix before table name section.
2611

            
cleanup
Yuki Kimoto authored on 2012-01-20
2612
  delete some from book
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2613

            
2614
=item C<table>
2615

            
cleanup
Yuki Kimoto authored on 2012-01-20
2616
  table => 'book'
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2617

            
2618
Table name.
2619

            
2620
=item C<where>
2621

            
2622
Same as C<select> method's C<where> option.
2623

            
2624
=back
2625

            
2626
=head2 C<delete_all>
2627

            
cleanup
Yuki Kimoto authored on 2012-01-20
2628
  $dbi->delete_all(table => $table);
added EXPERIMENTAL find_tabl...
Yuki Kimoto authored on 2011-08-16
2629

            
2630
Execute delete statement for all rows.
2631
Options is same as C<delete>.
2632

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2633
=head2 C<each_column>
2634

            
cleanup
Yuki Kimoto authored on 2012-01-20
2635
  $dbi->each_column(
2636
    sub {
2637
      my ($dbi, $table, $column, $column_info) = @_;
2638
      
2639
      my $type = $column_info->{TYPE_NAME};
2640
      
2641
      if ($type eq 'DATE') {
2642
          # ...
2643
      }
2644
    }
2645
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
2646

            
improved pod
Yuki Kimoto authored on 2011-10-14
2647
Iterate all column informations in database.
2648
Argument is callback which is executed when one column is found.
2649
Callback receive four arguments. C<DBIx::Custom object>, C<table name>,
2650
C<column name>, and C<column information>.
2651

            
2652
If C<user_column_info> is set, C<each_column> method use C<user_column_info>
2653
infromation, you can improve the performance of C<each_column> in
2654
the following way.
2655

            
cleanup
Yuki Kimoto authored on 2012-01-20
2656
  my $column_infos = $dbi->get_column_info(exclude_table => qr/^system_/);
2657
  $dbi->user_column_info($column_info);
2658
  $dbi->each_column(sub { ... });
EXPERIMETAL fork safety impl...
Yuki Kimoto authored on 2011-03-12
2659

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
2660
=head2 C<each_table>
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
2661

            
cleanup
Yuki Kimoto authored on 2012-01-20
2662
  $dbi->each_table(
2663
    sub {
2664
      my ($dbi, $table, $table_info) = @_;
2665
      
2666
      my $table_name = $table_info->{TABLE_NAME};
2667
    }
2668
  );
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
2669

            
improved pod
Yuki Kimoto authored on 2011-10-14
2670
Iterate all table informationsfrom in database.
2671
Argument is callback which is executed when one table is found.
2672
Callback receive three arguments, C<DBIx::Custom object>, C<table name>,
2673
C<table information>.
2674

            
2675
If C<user_table_info> is set, C<each_table> method use C<user_table_info>
2676
infromation, you can improve the performance of C<each_table> in
2677
the following way.
2678

            
cleanup
Yuki Kimoto authored on 2012-01-20
2679
  my $table_infos = $dbi->get_table_info(exclude => qr/^system_/);
2680
  $dbi->user_table_info($table_info);
2681
  $dbi->each_table(sub { ... });
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
2682

            
cleanup
yuki-kimoto authored on 2010-10-17
2683
=head2 C<execute>
packaging one directory
yuki-kimoto authored on 2009-11-16
2684

            
cleanup
Yuki Kimoto authored on 2012-01-20
2685
  my $result = $dbi->execute(
2686
    "select * from book where title = :title and author like :author",
2687
    {title => 'Perl', author => '%Ken%'}
2688
  );
updated pod
Yuki Kimoto authored on 2011-06-21
2689

            
cleanup
Yuki Kimoto authored on 2012-01-20
2690
  my $result = $dbi->execute(
2691
    "select * from book where title = :book.title and author like :book.author",
2692
    {'book.title' => 'Perl', 'book.author' => '%Ken%'}
2693
  );
update pod
Yuki Kimoto authored on 2011-03-13
2694

            
updated pod
Yuki Kimoto authored on 2011-06-21
2695
Execute SQL. SQL can contain column parameter such as :author and :title.
2696
You can append table name to column name such as :book.title and :book.author.
2697
Second argunet is data, embedded into column parameter.
2698
Return value is L<DBIx::Custom::Result> object when select statement is executed,
2699
or the count of affected rows when insert, update, delete statement is executed.
update pod
Yuki Kimoto authored on 2011-03-13
2700

            
I call :title named placehol...
Yuki Kimoto authored on 2011-07-30
2701
Named placeholder such as C<:title> is replaced by placeholder C<?>.
cleanup
Yuki Kimoto authored on 2012-01-20
2702
  
2703
  # Original
2704
  select * from book where title = :title and author like :author
2705
  
2706
  # Replaced
2707
  select * from where title = ? and author like ?;
update pod
Yuki Kimoto authored on 2011-03-13
2708

            
I call :title named placehol...
Yuki Kimoto authored on 2011-07-30
2709
You can specify operator with named placeholder
fixed pod
Yuki Kimoto authored on 2011-10-20
2710
by C<name{operator}> syntax.
added EXPERIMENTAL parameter...
Yuki Kimoto authored on 2011-07-29
2711

            
cleanup
Yuki Kimoto authored on 2012-01-20
2712
  # Original
2713
  select * from book where :title{=} and :author{like}
2714
  
2715
  # Replaced
2716
  select * from where title = ? and author like ?;
update pod
Yuki Kimoto authored on 2011-03-13
2717

            
fixed named placeholder bug ...
Yuki Kimoto authored on 2011-08-01
2718
Note that colons in time format such as 12:13:15 is exeption,
2719
it is not parsed as named placeholder.
2720
If you want to use colon generally, you must escape it by C<\\>
2721

            
cleanup
Yuki Kimoto authored on 2012-01-20
2722
  select * from where title = "aa\\:bb";
fixed named placeholder bug ...
Yuki Kimoto authored on 2011-08-01
2723

            
cleanup
Yuki Kimoto authored on 2011-10-20
2724
B<OPTIONS>
2725

            
updated pod
Yuki Kimoto authored on 2011-06-09
2726
The following opitons are available.
update pod
Yuki Kimoto authored on 2011-03-13
2727

            
2728
=over 4
2729

            
added EXPERIMENTAL reuse_sth...
Yuki Kimoto authored on 2011-10-22
2730
=item C<after_build_sql> 
2731

            
2732
You can filter sql after the sql is build.
2733

            
cleanup
Yuki Kimoto authored on 2012-01-20
2734
  after_build_sql => $code_ref
added EXPERIMENTAL reuse_sth...
Yuki Kimoto authored on 2011-10-22
2735

            
2736
The following one is one example.
2737

            
cleanup
Yuki Kimoto authored on 2012-01-20
2738
  $dbi->select(
2739
    table => 'book',
2740
    column => 'distinct(name)',
2741
    after_build_sql => sub {
2742
      "select count(*) from ($_[0]) as t1"
2743
    }
2744
  );
added EXPERIMENTAL reuse_sth...
Yuki Kimoto authored on 2011-10-22
2745

            
2746
The following SQL is executed.
2747

            
cleanup
Yuki Kimoto authored on 2012-01-20
2748
  select count(*) from (select distinct(name) from book) as t1;
added EXPERIMENTAL reuse_sth...
Yuki Kimoto authored on 2011-10-22
2749

            
cleanup
Yuki Kimoto authored on 2011-10-20
2750
=item C<append>
2751

            
cleanup
Yuki Kimoto authored on 2012-01-20
2752
  append => 'order by name'
cleanup
Yuki Kimoto authored on 2011-10-20
2753

            
2754
Append some statement after SQL.
2755

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2756
=item C<prepare_attr> EXPERIMENTAL
2757

            
2758
  prepare_attr => {async => 1}
2759

            
2760
Statemend handle attributes,
2761
this is L<DBI>'s C<prepare> method second argument.
2762

            
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
2763
=item C<bind_type>
2764

            
2765
Specify database bind data type.
2766

            
cleanup
Yuki Kimoto authored on 2012-01-20
2767
  bind_type => [image => DBI::SQL_BLOB]
2768
  bind_type => [[qw/image audio/] => DBI::SQL_BLOB]
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
2769

            
2770
This is used to bind parameter by C<bind_param> of statment handle.
2771

            
cleanup
Yuki Kimoto authored on 2012-01-20
2772
  $sth->bind_param($pos, $value, DBI::SQL_BLOB);
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
2773

            
update pod
Yuki Kimoto authored on 2011-03-13
2774
=item C<filter>
cleanup
Yuki Kimoto authored on 2012-01-20
2775
  
2776
  filter => {
2777
    title  => sub { uc $_[0] }
2778
    author => sub { uc $_[0] }
2779
  }
2780

            
2781
  # Filter name
2782
  filter => {
2783
    title  => 'upper_case',
2784
    author => 'upper_case'
2785
  }
2786
      
2787
  # At once
2788
  filter => [
2789
    [qw/title author/]  => sub { uc $_[0] }
2790
  ]
updated pod
Yuki Kimoto authored on 2011-06-09
2791

            
separate DBIx::Custom type_r...
Yuki Kimoto authored on 2011-06-15
2792
Filter. You can set subroutine or filter name
updated pod
Yuki Kimoto authored on 2011-06-21
2793
registered by by C<register_filter>.
separate DBIx::Custom type_r...
Yuki Kimoto authored on 2011-06-15
2794
This filter is executed before data is saved into database.
2795
and before type rule filter is executed.
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2796

            
updated document
Yuki Kimoto authored on 2011-06-09
2797
=item C<query>
2798

            
cleanup
Yuki Kimoto authored on 2012-01-20
2799
  query => 1
updated document
Yuki Kimoto authored on 2011-06-09
2800

            
DBIx::Custom::Query is DEPRE...
Yuki Kimoto authored on 2011-11-15
2801
C<execute> method return hash reference which contain SQL and column
2802
infromation
updated pod
Yuki Kimoto authored on 2011-06-21
2803

            
cleanup
Yuki Kimoto authored on 2012-01-20
2804
  my $sql = $query->{sql};
2805
  my $columns = $query->{columns};
2806
  
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
2807
=item C<reuse>
cleanup
Yuki Kimoto authored on 2012-01-20
2808
  
2809
  reuse => $hash_ref
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
2810

            
2811
Reuse query object if the hash reference variable is set.
cleanup
Yuki Kimoto authored on 2012-01-20
2812
  
2813
  my $queries = {};
2814
  $dbi->execute($sql, $param, reuse => $queries);
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
2815

            
2816
This will improved performance when you want to execute same query repeatedly
2817
because generally creating query object is slow.
2818

            
- removed placeholder count ...
Yuki Kimoto authored on 2011-08-22
2819
=item C<primary_key>
2820

            
cleanup
Yuki Kimoto authored on 2012-01-20
2821
  primary_key => 'id'
2822
  primary_key => ['id1', 'id2']
cleanup
Yuki Kimoto authored on 2011-10-20
2823

            
execute method id option is ...
Yuki Kimoto authored on 2011-10-27
2824
Priamry key. This is used for C<id> option.
- removed placeholder count ...
Yuki Kimoto authored on 2011-08-22
2825

            
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
2826
=item C<select> EXPERIMETAL
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2827

            
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
2828
  select => 1
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2829

            
added async asccess and stat...
Yuki Kimoto authored on 2012-01-29
2830
If you set C<select> to 1, this statement become select statement
2831
and return value is always L<DBIx::Custom::Result> object.
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2832

            
updated pod
Yuki Kimoto authored on 2011-06-09
2833
=item C<table>
cleanup
Yuki Kimoto authored on 2012-01-20
2834
  
2835
  table => 'author'
updated pod
Yuki Kimoto authored on 2011-06-09
2836

            
updated pod
Yuki Kimoto authored on 2011-06-21
2837
If you want to omit table name in column name
2838
and enable C<into1> and C<into2> type filter,
2839
You must set C<table> option.
updated pod
Yuki Kimoto authored on 2011-06-09
2840

            
cleanup
Yuki Kimoto authored on 2012-01-20
2841
  $dbi->execute("select * from book where title = :title and author = :author",
2842
    {title => 'Perl', author => 'Ken', table => 'book');
updated pod
Yuki Kimoto authored on 2011-06-09
2843

            
cleanup
Yuki Kimoto authored on 2012-01-20
2844
  # Same
2845
  $dbi->execute(
2846
    "select * from book where title = :book.title and author = :book.author",
2847
    {title => 'Perl', author => 'Ken');
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2848

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2849
=item C<table_alias>
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-06-27
2850

            
cleanup
Yuki Kimoto authored on 2012-01-20
2851
  table_alias => {user => 'worker'}
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-06-27
2852

            
2853
Table alias. Key is real table name, value is alias table name.
2854
If you set C<table_alias>, you can enable C<into1> and C<into2> type rule
2855
on alias table name.
2856

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2857
=item C<type_rule_off>
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2858

            
cleanup
Yuki Kimoto authored on 2012-01-20
2859
  type_rule_off => 1
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2860

            
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
2861
Turn C<into1> and C<into2> type rule off.
2862

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2863
=item C<type_rule1_off>
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
2864

            
cleanup
Yuki Kimoto authored on 2012-01-20
2865
  type_rule1_off => 1
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
2866

            
2867
Turn C<into1> type rule off.
2868

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2869
=item C<type_rule2_off>
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
2870

            
cleanup
Yuki Kimoto authored on 2012-01-20
2871
  type_rule2_off => 1
EXPERIMENTAL type_rule argum...
Yuki Kimoto authored on 2011-06-17
2872

            
2873
Turn C<into2> type rule off.
update document
yuki-kimoto authored on 2009-11-19
2874

            
update pod
Yuki Kimoto authored on 2011-03-13
2875
=back
version 0.0901
yuki-kimoto authored on 2009-12-17
2876

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2877
=head2 C<get_column_info>
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2878

            
cleanup
Yuki Kimoto authored on 2012-01-20
2879
  my $column_infos = $dbi->get_column_info(exclude_table => qr/^system_/);
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2880

            
2881
get column infomation except for one which match C<exclude_table> pattern.
2882

            
cleanup
Yuki Kimoto authored on 2012-01-20
2883
  [
2884
    {table => 'book', column => 'title', info => {...}},
2885
    {table => 'author', column => 'name' info => {...}}
2886
  ]
- added EXPERIMENTAL get_col...
Yuki Kimoto authored on 2011-08-16
2887

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
2888
=head2 C<get_table_info>
added test
Yuki Kimoto authored on 2011-08-16
2889

            
cleanup
Yuki Kimoto authored on 2012-01-20
2890
  my $table_infos = $dbi->get_table_info(exclude => qr/^system_/);
update pod
Yuki Kimoto authored on 2011-03-13
2891

            
added test
Yuki Kimoto authored on 2011-08-16
2892
get table infomation except for one which match C<exclude> pattern.
2893

            
cleanup
Yuki Kimoto authored on 2012-01-20
2894
  [
2895
    {table => 'book', info => {...}},
2896
    {table => 'author', info => {...}}
2897
  ]
add experimental update_at()...
Yuki Kimoto authored on 2011-02-21
2898

            
added test
Yuki Kimoto authored on 2011-08-16
2899
You can set this value to C<user_table_info>.
update pod
Yuki Kimoto authored on 2011-03-13
2900

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2901
=head2 C<helper>
2902

            
cleanup
Yuki Kimoto authored on 2012-01-20
2903
  $dbi->helper(
2904
    find_or_create   => sub {
2905
      my $self = shift;
2906
      
2907
      # Process
2908
    },
2909
    ...
2910
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2911

            
2912
Register helper. These helper is called directly from L<DBIx::Custom> object.
2913

            
cleanup
Yuki Kimoto authored on 2012-01-20
2914
  $dbi->find_or_create;
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
2915

            
cleanup
yuki-kimoto authored on 2010-10-17
2916
=head2 C<insert>
2917

            
cleanup
Yuki Kimoto authored on 2012-01-20
2918
  $dbi->insert({title => 'Perl', author => 'Ken'}, table  => 'book');
update pod
Yuki Kimoto authored on 2011-03-13
2919

            
updated pod
Yuki Kimoto authored on 2011-06-21
2920
Execute insert statement. First argument is row data. Return value is
2921
affected row count.
update pod
Yuki Kimoto authored on 2011-03-13
2922

            
insert and update method's p...
Yuki Kimoto authored on 2011-07-29
2923
If you want to set constant value to row data, use scalar reference
2924
as parameter value.
2925

            
cleanup
Yuki Kimoto authored on 2012-01-20
2926
  {date => \"NOW()"}
insert and update method's p...
Yuki Kimoto authored on 2011-07-29
2927

            
updated pod
Yuki Kimoto authored on 2011-11-25
2928
You can pass multiple parameters, this is very fast.
2929

            
cleanup
Yuki Kimoto authored on 2012-01-20
2930
  $dbi->insert(
2931
    [
2932
      {title => 'Perl', author => 'Ken'},
2933
      {title => 'Ruby', author => 'Tom'}
2934
    ],
2935
    table  => 'book'
2936
  );
updated pod
Yuki Kimoto authored on 2011-11-25
2937

            
2938
In multiple insert, you can't use C<id> option.
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2939
and only first parameter is used to create sql.
updated pod
Yuki Kimoto authored on 2011-11-25
2940

            
cleanup
Yuki Kimoto authored on 2011-10-20
2941
B<options>
2942

            
cleanup
Yuki Kimoto authored on 2011-10-20
2943
C<insert> method use all of C<execute> method's options,
cleanup
Yuki Kimoto authored on 2011-10-20
2944
and use the following new ones.
update pod
Yuki Kimoto authored on 2011-03-13
2945

            
cleanup
Yuki Kimoto authored on 2011-06-09
2946
=over 4
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2012-01-24
2947

            
2948
=item C<bulk_insert>
added EXPERIMENTAL bulk_inse...
Yuki Kimoto authored on 2011-11-27
2949

            
cleanup
Yuki Kimoto authored on 2012-01-20
2950
  bulk_insert => 1
added EXPERIMENTAL bulk_inse...
Yuki Kimoto authored on 2011-11-27
2951

            
2952
bulk insert is executed if database support bulk insert and 
2953
multiple parameters is passed to C<insert>.
2954
The SQL like the following one is executed.
2955

            
cleanup
Yuki Kimoto authored on 2012-01-20
2956
  insert into book (id, title) values (?, ?), (?, ?);
added EXPERIMENTAL bulk_inse...
Yuki Kimoto authored on 2011-11-27
2957

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
2958
=item C<ctime>
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
2959

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
2960
  ctime => 'created_time'
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
2961

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
2962
Created time column name. time when row is created is set to the column.
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
2963
default time format is "YYYY-mm-dd HH:MM:SS", which can be changed by
2964
C<now> attribute.
2965

            
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2966
=item C<id>
2967

            
cleanup
Yuki Kimoto authored on 2012-01-20
2968
  id => 4
2969
  id => [4, 5]
update pod
Yuki Kimoto authored on 2011-03-13
2970

            
updated document
Yuki Kimoto authored on 2011-06-09
2971
ID corresponding to C<primary_key>.
2972
You can insert a row by C<id> and C<primary_key>.
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2973

            
cleanup
Yuki Kimoto authored on 2012-01-20
2974
  $dbi->insert(
2975
    {title => 'Perl', author => 'Ken'}
2976
    primary_key => ['id1', 'id2'],
2977
    id => [4, 5],
2978
    table => 'book'
2979
  );
added EXPERIMENTAL execute()...
Yuki Kimoto authored on 2011-06-09
2980

            
updated document
Yuki Kimoto authored on 2011-06-09
2981
The above is same as the followin one.
update pod
Yuki Kimoto authored on 2011-03-13
2982

            
cleanup
Yuki Kimoto authored on 2012-01-20
2983
  $dbi->insert(
2984
    {id1 => 4, id2 => 5, title => 'Perl', author => 'Ken'},
2985
    table => 'book'
2986
  );
update pod
Yuki Kimoto authored on 2011-03-13
2987

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
2988
=item C<prefix>
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
2989

            
cleanup
Yuki Kimoto authored on 2012-01-20
2990
  prefix => 'or replace'
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
2991

            
2992
prefix before table name section
2993

            
cleanup
Yuki Kimoto authored on 2012-01-20
2994
  insert or replace into book
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
2995

            
updated document
Yuki Kimoto authored on 2011-06-09
2996
=item C<table>
2997

            
cleanup
Yuki Kimoto authored on 2012-01-20
2998
  table => 'book'
updated document
Yuki Kimoto authored on 2011-06-09
2999

            
3000
Table name.
3001

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3002
=item C<mtime>
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
3003

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3004
This option is same as C<update> method C<mtime> option.
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
3005

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3006
=item C<wrap>
updated pod
Yuki Kimoto authored on 2011-09-02
3007

            
cleanup
Yuki Kimoto authored on 2012-01-20
3008
  wrap => {price => sub { "max($_[0])" }}
updated pod
Yuki Kimoto authored on 2011-09-02
3009

            
3010
placeholder wrapped string.
3011

            
3012
If the following statement
3013

            
cleanup
Yuki Kimoto authored on 2012-01-20
3014
  $dbi->insert({price => 100}, table => 'book',
3015
    {price => sub { "$_[0] + 5" }});
updated pod
Yuki Kimoto authored on 2011-09-02
3016

            
3017
is executed, the following SQL is executed.
3018

            
cleanup
Yuki Kimoto authored on 2012-01-20
3019
  insert into book price values ( ? + 5 );
updated pod
Yuki Kimoto authored on 2011-09-02
3020

            
update pod
Yuki Kimoto authored on 2011-03-13
3021
=back
3022

            
3023
=over 4
3024

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
3025
=head2 C<include_model>
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3026

            
cleanup
Yuki Kimoto authored on 2012-01-20
3027
  $dbi->include_model('MyModel');
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3028

            
update pod
Yuki Kimoto authored on 2011-03-13
3029
Include models from specified namespace,
3030
the following layout is needed to include models.
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3031

            
cleanup
Yuki Kimoto authored on 2012-01-20
3032
  lib / MyModel.pm
3033
      / MyModel / book.pm
3034
                / company.pm
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
3035

            
update pod
Yuki Kimoto authored on 2011-03-13
3036
Name space module, extending L<DBIx::Custom::Model>.
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
3037

            
update pod
Yuki Kimoto authored on 2011-03-13
3038
B<MyModel.pm>
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
3039

            
cleanup
Yuki Kimoto authored on 2012-01-20
3040
  package MyModel;
3041
  use DBIx::Custom::Model -base;
3042
  
3043
  1;
add feture. all model class ...
Yuki Kimoto authored on 2011-02-18
3044

            
update pod
Yuki Kimoto authored on 2011-03-13
3045
Model modules, extending name space module.
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3046

            
update pod
Yuki Kimoto authored on 2011-03-13
3047
B<MyModel/book.pm>
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3048

            
cleanup
Yuki Kimoto authored on 2012-01-20
3049
  package MyModel::book;
3050
  use MyModel -base;
3051
  
3052
  1;
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3053

            
update pod
Yuki Kimoto authored on 2011-03-13
3054
B<MyModel/company.pm>
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3055

            
cleanup
Yuki Kimoto authored on 2012-01-20
3056
  package MyModel::company;
3057
  use MyModel -base;
3058
  
3059
  1;
3060
  
updated pod
Yuki Kimoto authored on 2011-06-21
3061
MyModel::book and MyModel::company is included by C<include_model>.
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3062

            
updated pod
Yuki Kimoto authored on 2011-06-21
3063
You can get model object by C<model>.
update pod
Yuki Kimoto authored on 2011-03-13
3064

            
cleanup
Yuki Kimoto authored on 2012-01-20
3065
  my $book_model = $dbi->model('book');
3066
  my $company_model = $dbi->model('company');
removed experimental base_ta...
Yuki Kimoto authored on 2011-02-15
3067

            
update pod
Yuki Kimoto authored on 2011-03-13
3068
See L<DBIx::Custom::Model> to know model features.
3069

            
cleanup
Yuki Kimoto authored on 2011-10-20
3070
=head2 C<like_value>
added EXPERIMENTAL like_valu...
Yuki Kimoto authored on 2011-09-16
3071

            
cleanup
Yuki Kimoto authored on 2012-01-20
3072
  my $like_value = $dbi->like_value
added EXPERIMENTAL like_valu...
Yuki Kimoto authored on 2011-09-16
3073

            
cleanup
Yuki Kimoto authored on 2011-10-20
3074
Code reference which return a value for the like value.
added EXPERIMENTAL like_valu...
Yuki Kimoto authored on 2011-09-16
3075

            
cleanup
Yuki Kimoto authored on 2012-01-20
3076
  sub { "%$_[0]%" }
added EXPERIMENTAL like_valu...
Yuki Kimoto authored on 2011-09-16
3077

            
sqlfilter option is renamed ...
Yuki Kimoto authored on 2011-09-16
3078
=head2 C<mapper>
- added EXPERIMENTAL pass at...
Yuki Kimoto authored on 2011-09-02
3079

            
cleanup
Yuki Kimoto authored on 2012-01-20
3080
  my $mapper = $dbi->mapper(param => $param);
- added EXPERIMENTAL pass at...
Yuki Kimoto authored on 2011-09-02
3081

            
3082
Create a new L<DBIx::Custom::Mapper> object.
3083

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
3084
=head2 C<merge_param>
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
3085

            
cleanup
Yuki Kimoto authored on 2012-01-20
3086
  my $param = $dbi->merge_param({key1 => 1}, {key1 => 1, key2 => 2});
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
3087

            
cleanup
Yuki Kimoto authored on 2011-10-20
3088
Merge parameters. The following new parameter is created.
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
3089

            
cleanup
Yuki Kimoto authored on 2012-01-20
3090
  {key1 => [1, 1], key2 => 2}
added EXPERIMENTAL updat_par...
Yuki Kimoto authored on 2011-03-30
3091

            
cleanup
Yuki Kimoto authored on 2011-10-20
3092
If same keys contains, the value is converted to array reference.
3093

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
3094
=head2 C<model>
update pod
Yuki Kimoto authored on 2011-03-13
3095

            
cleanup
Yuki Kimoto authored on 2012-01-20
3096
  my $model = $dbi->model('book');
update pod
Yuki Kimoto authored on 2011-03-13
3097

            
cleanup
Yuki Kimoto authored on 2011-10-20
3098
Get a L<DBIx::Custom::Model> object
3099
create by C<create_model> or C<include_model>
update pod
Yuki Kimoto authored on 2011-03-13
3100

            
- removed DEPRECATED DBIx::C...
Yuki Kimoto authored on 2011-04-11
3101
=head2 C<mycolumn>
cleanup
Yuki Kimoto authored on 2011-03-21
3102

            
cleanup
Yuki Kimoto authored on 2012-01-20
3103
  my $column = $dbi->mycolumn(book => ['author', 'title']);
cleanup
Yuki Kimoto authored on 2011-03-21
3104

            
3105
Create column clause for myself. The follwoing column clause is created.
3106

            
cleanup
Yuki Kimoto authored on 2012-01-20
3107
  book.author as author,
3108
  book.title as title
cleanup
Yuki Kimoto authored on 2011-03-21
3109

            
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
3110
=head2 C<new>
3111

            
cleanup
Yuki Kimoto authored on 2012-01-20
3112
  my $dbi = DBIx::Custom->new(
3113
    dsn => "dbi:mysql:database=dbname",
3114
    user => 'ken',
3115
    password => '!LFKD%$&',
3116
    option => {mysql_enable_utf8 => 1}
3117
  );
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
3118

            
3119
Create a new L<DBIx::Custom> object.
3120

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-03-25
3121
=head2 C<not_exists>
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
3122

            
cleanup
Yuki Kimoto authored on 2012-01-20
3123
  my $not_exists = $dbi->not_exists;
added experimental not_exist...
Yuki Kimoto authored on 2011-01-26
3124

            
update pod
Yuki Kimoto authored on 2011-03-13
3125
DBIx::Custom::NotExists object, indicating the column is not exists.
cleanup
Yuki Kimoto authored on 2011-10-20
3126
This is used in C<param> of L<DBIx::Custom::Where> .
experimental extended select...
Yuki Kimoto authored on 2011-01-17
3127

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3128
=head2 C<order>
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3129

            
cleanup
Yuki Kimoto authored on 2012-01-20
3130
  my $order = $dbi->order;
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3131

            
3132
Create a new L<DBIx::Custom::Order> object.
3133

            
- id option work if id count...
Yuki Kimoto authored on 2011-11-03
3134
=head2 C<q>
added EXPERIMENTAL q method
Yuki Kimoto authored on 2011-10-27
3135

            
cleanup
Yuki Kimoto authored on 2012-01-20
3136
  my $quooted = $dbi->q("title");
added EXPERIMENTAL q method
Yuki Kimoto authored on 2011-10-27
3137

            
3138
Quote string by value of C<quote>.
3139

            
cleanup
yuki-kimoto authored on 2010-10-17
3140
=head2 C<register_filter>
3141

            
cleanup
Yuki Kimoto authored on 2012-01-20
3142
  $dbi->register_filter(
3143
    # Time::Piece object to database DATE format
3144
    tp_to_date => sub {
3145
      my $tp = shift;
3146
      return $tp->strftime('%Y-%m-%d');
3147
    },
3148
    # database DATE format to Time::Piece object
3149
    date_to_tp => sub {
3150
      my $date = shift;
3151
      return Time::Piece->strptime($date, '%Y-%m-%d');
3152
    }
3153
  );
3154
  
update pod
Yuki Kimoto authored on 2011-03-13
3155
Register filters, used by C<filter> option of many methods.
cleanup
yuki-kimoto authored on 2010-10-17
3156

            
removed DBIx::Custom commit ...
yuki-kimoto authored on 2010-07-14
3157
=head2 C<select>
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3158

            
cleanup
Yuki Kimoto authored on 2012-01-20
3159
  my $result = $dbi->select(
3160
    column => ['author', 'title'],
3161
    table  => 'book',
3162
    where  => {author => 'Ken'},
3163
  );
3164
  
updated document
Yuki Kimoto authored on 2011-06-09
3165
Execute select statement.
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3166

            
- select method can receive ...
Yuki Kimoto authored on 2011-11-18
3167
You can pass odd number arguments. first argument is C<column>.
3168

            
cleanup
Yuki Kimoto authored on 2012-01-20
3169
  my $result = $dbi->select(['author', 'title'], table => 'book');
- select method can receive ...
Yuki Kimoto authored on 2011-11-18
3170

            
cleanup
Yuki Kimoto authored on 2011-10-20
3171
B<OPTIONS>
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3172

            
cleanup
Yuki Kimoto authored on 2011-10-20
3173
C<select> method use all of C<execute> method's options,
3174
and use the following new ones.
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
3175

            
cleanup
Yuki Kimoto authored on 2011-10-20
3176
=over 4
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
3177

            
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3178
=item C<column>
cleanup
Yuki Kimoto authored on 2012-01-20
3179
  
3180
  column => 'author'
3181
  column => ['author', 'title']
updated document
Yuki Kimoto authored on 2011-06-09
3182

            
3183
Column clause.
cleanup
Yuki Kimoto authored on 2012-01-20
3184
  
updated document
Yuki Kimoto authored on 2011-06-09
3185
if C<column> is not specified, '*' is set.
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3186

            
cleanup
Yuki Kimoto authored on 2012-01-20
3187
  column => '*'
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3188

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
3189
You can specify hash of array reference.
updated pod
Yuki Kimoto authored on 2011-06-07
3190

            
cleanup
Yuki Kimoto authored on 2012-01-20
3191
  column => [
3192
    {book => [qw/author title/]},
3193
    {person => [qw/name age/]}
3194
  ]
updated pod
Yuki Kimoto authored on 2011-06-07
3195

            
updated pod
Yuki Kimoto authored on 2011-06-21
3196
This is expanded to the following one by using C<colomn> method.
- select() column option can...
Yuki Kimoto authored on 2011-06-08
3197

            
cleanup
Yuki Kimoto authored on 2012-01-20
3198
  book.author as "book.author",
3199
  book.title as "book.title",
3200
  person.name as "person.name",
3201
  person.age as "person.age"
- select() column option can...
Yuki Kimoto authored on 2011-06-08
3202

            
- select method column optio...
Yuki Kimoto authored on 2011-07-11
3203
You can specify array of array reference, first argument is
3204
column name, second argument is alias.
- select() column option can...
Yuki Kimoto authored on 2011-06-08
3205

            
cleanup
Yuki Kimoto authored on 2012-01-20
3206
  column => [
3207
    ['date(book.register_datetime)' => 'book.register_date']
3208
  ];
- select() column option can...
Yuki Kimoto authored on 2011-06-08
3209

            
- select method column optio...
Yuki Kimoto authored on 2011-07-11
3210
Alias is quoted properly and joined.
- select() column option can...
Yuki Kimoto authored on 2011-06-08
3211

            
cleanup
Yuki Kimoto authored on 2012-01-20
3212
  date(book.register_datetime) as "book.register_date"
updated pod
Yuki Kimoto authored on 2011-06-07
3213

            
updated document
Yuki Kimoto authored on 2011-06-09
3214
=item C<id>
3215

            
cleanup
Yuki Kimoto authored on 2012-01-20
3216
  id => 4
3217
  id => [4, 5]
updated document
Yuki Kimoto authored on 2011-06-09
3218

            
3219
ID corresponding to C<primary_key>.
3220
You can select rows by C<id> and C<primary_key>.
3221

            
cleanup
Yuki Kimoto authored on 2012-01-20
3222
  $dbi->select(
3223
    primary_key => ['id1', 'id2'],
3224
    id => [4, 5],
3225
    table => 'book'
3226
  );
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3227

            
updated document
Yuki Kimoto authored on 2011-06-09
3228
The above is same as the followin one.
3229

            
cleanup
Yuki Kimoto authored on 2012-01-20
3230
  $dbi->select(
3231
    where => {id1 => 4, id2 => 5},
3232
    table => 'book'
3233
  );
3234
  
cleanup
Yuki Kimoto authored on 2011-10-20
3235
=item C<param>
added select() all_column op...
Yuki Kimoto authored on 2011-03-12
3236

            
cleanup
Yuki Kimoto authored on 2012-01-20
3237
  param => {'table2.key3' => 5}
update pod
Yuki Kimoto authored on 2011-03-12
3238

            
updated document
Yuki Kimoto authored on 2011-06-09
3239
Parameter shown before where clause.
cleanup
Yuki Kimoto authored on 2012-01-20
3240
  
cleanup
Yuki Kimoto authored on 2012-02-28
3241
For example, if you want to contain named placeholder in join clause, 
updated document
Yuki Kimoto authored on 2011-06-09
3242
you can pass parameter by C<param> option.
update pod
Yuki Kimoto authored on 2011-03-12
3243

            
cleanup
Yuki Kimoto authored on 2012-01-20
3244
  join  => ['inner join (select * from table2 where table2.key3 = :table2.key3)' . 
3245
            ' as table2 on table1.key1 = table2.key1']
updated document
Yuki Kimoto authored on 2011-06-09
3246

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
3247
=itme C<prefix>
added EXPERIMENTAL select pr...
Yuki Kimoto authored on 2011-06-13
3248

            
cleanup
Yuki Kimoto authored on 2012-01-20
3249
  prefix => 'SQL_CALC_FOUND_ROWS'
added EXPERIMENTAL select pr...
Yuki Kimoto authored on 2011-06-13
3250

            
3251
Prefix of column cluase
3252

            
cleanup
Yuki Kimoto authored on 2012-01-20
3253
  select SQL_CALC_FOUND_ROWS title, author from book;
added EXPERIMENTAL select pr...
Yuki Kimoto authored on 2011-06-13
3254

            
updated document
Yuki Kimoto authored on 2011-06-09
3255
=item C<join>
3256

            
cleanup
Yuki Kimoto authored on 2012-01-20
3257
  join => [
3258
    'left outer join company on book.company_id = company_id',
3259
    'left outer join location on company.location_id = location.id'
3260
  ]
3261
      
updated document
Yuki Kimoto authored on 2011-06-09
3262
Join clause. If column cluase or where clause contain table name like "company.name",
3263
join clausees needed when SQL is created is used automatically.
update pod
Yuki Kimoto authored on 2011-03-12
3264

            
cleanup
Yuki Kimoto authored on 2012-01-20
3265
  $dbi->select(
3266
    table => 'book',
3267
    column => ['company.location_id as location_id'],
3268
    where => {'company.name' => 'Orange'},
3269
    join => [
3270
      'left outer join company on book.company_id = company.id',
3271
      'left outer join location on company.location_id = location.id'
3272
    ]
3273
  );
update pod
Yuki Kimoto authored on 2011-03-12
3274

            
updated document
Yuki Kimoto authored on 2011-06-09
3275
In above select, column and where clause contain "company" table,
3276
the following SQL is created
update pod
Yuki Kimoto authored on 2011-03-12
3277

            
cleanup
Yuki Kimoto authored on 2012-01-20
3278
  select company.location_id as location_id
3279
  from book
3280
    left outer join company on book.company_id = company.id
3281
  where company.name = ?;
update pod
Yuki Kimoto authored on 2011-03-12
3282

            
added join new syntax
Yuki Kimoto authored on 2011-07-28
3283
You can specify two table by yourself. This is useful when join parser can't parse
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3284
the join clause correctly.
added join new syntax
Yuki Kimoto authored on 2011-07-28
3285

            
cleanup
Yuki Kimoto authored on 2012-01-20
3286
  $dbi->select(
3287
    table => 'book',
3288
    column => ['company.location_id as location_id'],
3289
    where => {'company.name' => 'Orange'},
3290
    join => [
3291
      {
3292
        clause => 'left outer join location on company.location_id = location.id',
3293
        table => ['company', 'location']
3294
      }
3295
    ]
3296
  );
added join new syntax
Yuki Kimoto authored on 2011-07-28
3297

            
updated document
Yuki Kimoto authored on 2011-06-09
3298
=item C<table>
updated pod
Yuki Kimoto authored on 2011-06-08
3299

            
cleanup
Yuki Kimoto authored on 2012-01-20
3300
  table => 'book'
updated pod
Yuki Kimoto authored on 2011-06-08
3301

            
updated document
Yuki Kimoto authored on 2011-06-09
3302
Table name.
updated pod
Yuki Kimoto authored on 2011-06-08
3303

            
updated document
Yuki Kimoto authored on 2011-06-09
3304
=item C<where>
cleanup
Yuki Kimoto authored on 2012-01-20
3305
  
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3306
  # (1) Hash reference
3307
  where => {author => 'Ken', 'title' => ['Perl', 'Ruby']}
3308
  # -> where author = 'Ken' and title in ('Perl', 'Ruby')
cleanup
Yuki Kimoto authored on 2012-01-20
3309
  
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3310
  # (2) DBIx::Custom::Where object
cleanup
Yuki Kimoto authored on 2012-01-20
3311
  where => $dbi->where(
3312
    clause => ['and', ':author{=}', ':title{like}'],
3313
    param  => {author => 'Ken', title => '%Perl%'}
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3314
  )
3315
  # -> where author = 'Ken' and title like '%Perl%'
cleanup
Yuki Kimoto authored on 2012-01-20
3316
  
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3317
  # (3) Array reference[Array refenrece, Hash reference]
cleanup
Yuki Kimoto authored on 2012-01-20
3318
  where => [
3319
    ['and', ':author{=}', ':title{like}'],
3320
    {author => 'Ken', title => '%Perl%'}
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3321
  ]
3322
  # -> where author = 'Ken' and title like '%Perl%'
3323
  
3324
  # (4) Array reference[String, Hash reference]
3325
  where => [
3326
    ':author{=} and :title{like}',
3327
    {author => 'Ken', title => '%Perl%'}
3328
  ]
3329
  #  -> where author = 'Ken' and title like '%Perl%'
cleanup
Yuki Kimoto authored on 2012-01-20
3330
  
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3331
  # (5) String
cleanup
Yuki Kimoto authored on 2012-01-20
3332
  where => 'title is null'
- added where => {name => [v...
Yuki Kimoto authored on 2012-02-28
3333
  #  -> where title is null
update pod
Yuki Kimoto authored on 2011-03-12
3334

            
cleanup
Yuki Kimoto authored on 2011-10-20
3335
Where clause. See L<DBIx::Custom::Where>.
cleanup
Yuki Kimoto authored on 2012-01-20
3336
  
update pod
Yuki Kimoto authored on 2011-03-12
3337
=back
cleanup
Yuki Kimoto authored on 2011-03-08
3338

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3339
=head2 C<setup_model>
3340

            
cleanup
Yuki Kimoto authored on 2012-01-20
3341
  $dbi->setup_model;
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3342

            
3343
Setup all model objects.
3344
C<columns> of model object is automatically set, parsing database information.
3345

            
3346
=head2 C<type_rule>
3347

            
cleanup
Yuki Kimoto authored on 2012-01-20
3348
  $dbi->type_rule(
3349
    into1 => {
3350
      date => sub { ... },
3351
      datetime => sub { ... }
3352
    },
3353
    into2 => {
3354
      date => sub { ... },
3355
      datetime => sub { ... }
3356
    },
3357
    from1 => {
3358
      # DATE
3359
      9 => sub { ... },
3360
      # DATETIME or TIMESTAMP
3361
      11 => sub { ... },
3362
    }
3363
    from2 => {
3364
      # DATE
3365
      9 => sub { ... },
3366
      # DATETIME or TIMESTAMP
3367
      11 => sub { ... },
3368
    }
3369
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3370

            
3371
Filtering rule when data is send into and get from database.
3372
This has a little complex problem.
3373

            
3374
In C<into1> and C<into2> you can specify
3375
type name as same as type name defined
3376
by create table, such as C<DATETIME> or C<DATE>.
3377

            
3378
Note that type name and data type don't contain upper case.
3379
If these contain upper case charactor, you convert it to lower case.
3380

            
3381
C<into2> is executed after C<into1>.
3382

            
3383
Type rule of C<into1> and C<into2> is enabled on the following
3384
column name.
3385

            
3386
=over 4
3387

            
3388
=item 1. column name
3389

            
cleanup
Yuki Kimoto authored on 2012-01-20
3390
  issue_date
3391
  issue_datetime
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3392

            
3393
This need C<table> option in each method.
3394

            
3395
=item 2. table name and column name, separator is dot
3396

            
cleanup
Yuki Kimoto authored on 2012-01-20
3397
  book.issue_date
3398
  book.issue_datetime
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3399

            
3400
=back
3401

            
3402
You get all type name used in database by C<available_typename>.
3403

            
cleanup
Yuki Kimoto authored on 2012-01-20
3404
  print $dbi->available_typename;
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3405

            
3406
In C<from1> and C<from2> you specify data type, not type name.
3407
C<from2> is executed after C<from1>.
3408
You get all data type by C<available_datatype>.
3409

            
cleanup
Yuki Kimoto authored on 2012-01-20
3410
  print $dbi->available_datatype;
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3411

            
3412
You can also specify multiple types at once.
3413

            
cleanup
Yuki Kimoto authored on 2012-01-20
3414
  $dbi->type_rule(
3415
    into1 => [
3416
      [qw/DATE DATETIME/] => sub { ... },
3417
    ],
3418
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3419

            
cleanup
yuki-kimoto authored on 2010-10-17
3420
=head2 C<update>
removed reconnect method
yuki-kimoto authored on 2010-05-28
3421

            
cleanup
Yuki Kimoto authored on 2012-01-20
3422
  $dbi->update({title => 'Perl'}, table  => 'book', where  => {id => 4});
removed reconnect method
yuki-kimoto authored on 2010-05-28
3423

            
insert and update method's p...
Yuki Kimoto authored on 2011-07-29
3424
Execute update statement. First argument is update row data.
3425

            
3426
If you want to set constant value to row data, use scalar reference
3427
as parameter value.
3428

            
cleanup
Yuki Kimoto authored on 2012-01-20
3429
  {date => \"NOW()"}
added experimental update_pa...
Yuki Kimoto authored on 2011-03-08
3430

            
cleanup
Yuki Kimoto authored on 2011-10-20
3431
B<OPTIONS>
- insert, insert_at, update,...
Yuki Kimoto authored on 2011-06-08
3432

            
cleanup
Yuki Kimoto authored on 2011-10-20
3433
C<update> method use all of C<execute> method's options,
3434
and use the following new ones.
- insert, insert_at, update,...
Yuki Kimoto authored on 2011-06-08
3435

            
cleanup
Yuki Kimoto authored on 2011-10-20
3436
=over 4
- insert, insert_at, update,...
Yuki Kimoto authored on 2011-06-08
3437

            
updated document
Yuki Kimoto authored on 2011-06-09
3438
=item C<id>
- insert, insert_at, update,...
Yuki Kimoto authored on 2011-06-08
3439

            
cleanup
Yuki Kimoto authored on 2012-01-20
3440
  id => 4
3441
  id => [4, 5]
- insert, insert_at, update,...
Yuki Kimoto authored on 2011-06-08
3442

            
updated document
Yuki Kimoto authored on 2011-06-09
3443
ID corresponding to C<primary_key>.
3444
You can update rows by C<id> and C<primary_key>.
update pod
Yuki Kimoto authored on 2011-03-13
3445

            
cleanup
Yuki Kimoto authored on 2012-01-20
3446
  $dbi->update(
3447
    {title => 'Perl', author => 'Ken'}
3448
    primary_key => ['id1', 'id2'],
3449
    id => [4, 5],
3450
    table => 'book'
3451
  );
update pod
Yuki Kimoto authored on 2011-03-13
3452

            
updated document
Yuki Kimoto authored on 2011-06-09
3453
The above is same as the followin one.
update pod
Yuki Kimoto authored on 2011-03-13
3454

            
cleanup
Yuki Kimoto authored on 2012-01-20
3455
  $dbi->update(
3456
    {title => 'Perl', author => 'Ken'}
3457
    where => {id1 => 4, id2 => 5},
3458
    table => 'book'
3459
  );
update pod
Yuki Kimoto authored on 2011-03-13
3460

            
- removed EXPERIMENTAL statu...
Yuki Kimoto authored on 2011-07-26
3461
=item C<prefix>
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
3462

            
cleanup
Yuki Kimoto authored on 2012-01-20
3463
  prefix => 'or replace'
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
3464

            
3465
prefix before table name section
3466

            
cleanup
Yuki Kimoto authored on 2012-01-20
3467
  update or replace book
added EXPERIMENTAL insert, u...
Yuki Kimoto authored on 2011-06-21
3468

            
updated document
Yuki Kimoto authored on 2011-06-09
3469
=item C<table>
update pod
Yuki Kimoto authored on 2011-03-13
3470

            
cleanup
Yuki Kimoto authored on 2012-01-20
3471
  table => 'book'
update pod
Yuki Kimoto authored on 2011-03-13
3472

            
updated document
Yuki Kimoto authored on 2011-06-09
3473
Table name.
update pod
Yuki Kimoto authored on 2011-03-13
3474

            
added EXPERIMENTAL execute m...
Yuki Kimoto authored on 2011-08-14
3475
=item C<where>
3476

            
3477
Same as C<select> method's C<where> option.
3478

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3479
=item C<wrap>
updated pod
Yuki Kimoto authored on 2011-09-02
3480

            
cleanup
Yuki Kimoto authored on 2012-01-20
3481
  wrap => {price => sub { "max($_[0])" }}
updated pod
Yuki Kimoto authored on 2011-09-02
3482

            
3483
placeholder wrapped string.
3484

            
3485
If the following statement
3486

            
cleanup
Yuki Kimoto authored on 2012-01-20
3487
  $dbi->update({price => 100}, table => 'book',
3488
    {price => sub { "$_[0] + 5" }});
updated pod
Yuki Kimoto authored on 2011-09-02
3489

            
3490
is executed, the following SQL is executed.
3491

            
cleanup
Yuki Kimoto authored on 2012-01-20
3492
  update book set price =  ? + 5;
updated pod
Yuki Kimoto authored on 2011-09-02
3493

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3494
=item C<mtime>
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
3495

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3496
  mtime => 'modified_time'
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
3497

            
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3498
Modified time column name. time row is updated is set to the column.
added EXPERIMENTAL insert cr...
Yuki Kimoto authored on 2011-10-25
3499
default time format is C<YYYY-mm-dd HH:MM:SS>, which can be changed by
3500
C<now> attribute.
3501

            
updated pod
Yuki Kimoto authored on 2011-06-08
3502
=back
update pod
Yuki Kimoto authored on 2011-03-13
3503

            
updated pod
Yuki Kimoto authored on 2011-06-08
3504
=head2 C<update_all>
update pod
Yuki Kimoto authored on 2011-03-13
3505

            
cleanup
Yuki Kimoto authored on 2012-01-20
3506
  $dbi->update_all({title => 'Perl'}, table => 'book', );
update pod
Yuki Kimoto authored on 2011-03-13
3507

            
updated document
Yuki Kimoto authored on 2011-06-09
3508
Execute update statement for all rows.
updated pod
Yuki Kimoto authored on 2011-06-21
3509
Options is same as C<update> method.
update pod
Yuki Kimoto authored on 2011-03-13
3510

            
- id option work if id count...
Yuki Kimoto authored on 2011-11-03
3511
=head2 C<update_or_insert>
cleanup
Yuki Kimoto authored on 2012-01-20
3512
  
3513
  # ID
3514
  $dbi->update_or_insert(
3515
    {title => 'Perl'},
3516
    table => 'book',
3517
    id => 1,
3518
    primary_key => 'id',
3519
    option => {
3520
      select => {
3521
         append => 'for update'
3522
      }
3523
    }
3524
  );
- EXPERIMENTAL update_or_ins...
Yuki Kimoto authored on 2011-10-27
3525

            
- removed DEPRECATED status ...
Yuki Kimoto authored on 2011-10-11
3526
Update or insert.
3527

            
- EXPERIMENTAL update_or_ins...
Yuki Kimoto authored on 2011-10-27
3528
C<update_or_insert> method execute C<select> method first to find row.
3529
If the row is exists, C<update> is executed.
3530
If not, C<insert> is executed.
- removed DEPRECATED status ...
Yuki Kimoto authored on 2011-10-11
3531

            
- EXPERIMENTAL update_or_ins...
Yuki Kimoto authored on 2011-10-27
3532
C<OPTIONS>
3533

            
3534
C<update_or_insert> method use all common option
3535
in C<select>, C<update>, C<delete>, and has the following new ones.
3536

            
3537
=over 4
3538

            
3539
=item C<option>
3540

            
cleanup
Yuki Kimoto authored on 2012-01-20
3541
  option => {
3542
    select => {
3543
      append => '...'
3544
    },
3545
    insert => {
3546
      prefix => '...'
3547
    },
3548
    update => {
3549
      filter => {}
- EXPERIMENTAL update_or_ins...
Yuki Kimoto authored on 2011-10-27
3550
    }
cleanup
Yuki Kimoto authored on 2012-01-20
3551
  }
- removed DEPRECATED status ...
Yuki Kimoto authored on 2011-10-11
3552

            
- EXPERIMENTAL update_or_ins...
Yuki Kimoto authored on 2011-10-27
3553
If you want to pass option to each method,
3554
you can use C<option> option.
- removed DEPRECATED status ...
Yuki Kimoto authored on 2011-10-11
3555

            
3556
=over 4
3557

            
3558
=item C<select_option>
3559

            
cleanup
Yuki Kimoto authored on 2012-01-20
3560
  select_option => {append => 'for update'}
- removed DEPRECATED status ...
Yuki Kimoto authored on 2011-10-11
3561

            
3562
select method option,
3563
select method is used to check the row is already exists.
3564

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3565
=head2 C<show_datatype>
update pod
Yuki Kimoto authored on 2011-08-10
3566

            
cleanup
Yuki Kimoto authored on 2012-01-20
3567
  $dbi->show_datatype($table);
update pod
Yuki Kimoto authored on 2011-08-10
3568

            
3569
Show data type of the columns of specified table.
3570

            
cleanup
Yuki Kimoto authored on 2012-01-20
3571
  book
3572
  title: 5
3573
  issue_date: 91
update pod
Yuki Kimoto authored on 2011-08-10
3574

            
3575
This data type is used in C<type_rule>'s C<from1> and C<from2>.
3576

            
- removed EXPERIMENTAL the f...
Yuki Kimoto authored on 2011-09-12
3577
=head2 C<show_tables>
test cleanup
Yuki Kimoto authored on 2011-08-15
3578

            
cleanup
Yuki Kimoto authored on 2012-01-20
3579
  $dbi->show_tables;
test cleanup
Yuki Kimoto authored on 2011-08-15
3580

            
3581
Show tables.
3582

            
- removed EXPERIMENTAL flag ...
Yuki Kimoto authored on 2011-09-12
3583
=head2 C<show_typename>
update pod
Yuki Kimoto authored on 2011-08-10
3584

            
cleanup
Yuki Kimoto authored on 2012-01-20
3585
  $dbi->show_typename($table);
update pod
Yuki Kimoto authored on 2011-08-10
3586

            
3587
Show type name of the columns of specified table.
3588

            
cleanup
Yuki Kimoto authored on 2012-01-20
3589
  book
3590
  title: varchar
3591
  issue_date: date
update pod
Yuki Kimoto authored on 2011-08-10
3592

            
3593
This type name is used in C<type_rule>'s C<into1> and C<into2>.
3594

            
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3595
=head2 C<values_clause>
3596

            
cleanup
Yuki Kimoto authored on 2012-01-20
3597
  my $values_clause = $dbi->values_clause({title => 'a', age => 2});
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3598

            
3599
Create values clause.
3600

            
cleanup
Yuki Kimoto authored on 2012-01-20
3601
  (title, author) values (title = :title, age = :age);
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3602

            
3603
You can use this in insert statement.
3604

            
cleanup
Yuki Kimoto authored on 2012-01-20
3605
  my $insert_sql = "insert into book $values_clause";
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3606

            
3607
=head2 C<where>
3608

            
cleanup
Yuki Kimoto authored on 2012-01-20
3609
  my $where = $dbi->where(
3610
    clause => ['and', 'title = :title', 'author = :author'],
3611
    param => {title => 'Perl', author => 'Ken'}
3612
  );
removed EXPERIMETNAL flag fr...
Yuki Kimoto authored on 2011-10-19
3613

            
3614
Create a new L<DBIx::Custom::Where> object.
3615

            
- added EXPERIMENTAL update_...
Yuki Kimoto authored on 2011-09-12
3616
=head1 ENVIRONMENTAL VARIABLES
3617

            
3618
=head2 C<DBIX_CUSTOM_DEBUG>
3619

            
3620
If environment variable C<DBIX_CUSTOM_DEBUG> is set to true,
3621
executed SQL and bind values are printed to STDERR.
3622

            
improved debug message
Yuki Kimoto authored on 2011-05-23
3623
=head2 C<DBIX_CUSTOM_DEBUG_ENCODING>
3624

            
3625
DEBUG output encoding. Default to UTF-8.
added environment variable D...
Yuki Kimoto authored on 2011-04-02
3626

            
- fixed bug DBIx::Custom::Re...
Yuki Kimoto authored on 2011-11-08
3627
=head2 C<DBIX_CUSTOM_TAG_PARSE>
3628

            
3629
If you set DBIX_CUSTOM_TAG_PARSE to 0, tag parsing is off.
3630

            
3631
=head2 C<DBIX_CUSTOM_DISABLE_MODEL_EXECUTE>
3632

            
3633
If you set DBIX_CUSTOM_DISABLE_MODEL_EXECUTE to 1,
3634
L<DBIx::Custom::Model> execute method call L<DBIx::Custom> execute.
3635

            
fix heading typos
Terrence Brannon authored on 2011-08-17
3636
=head1 DEPRECATED FUNCTIONALITY
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3637

            
3638
L<DBIx::Custom>
3639

            
cleanup
Yuki Kimoto authored on 2012-01-20
3640
  # Attribute methods
3641
  tag_parse # will be removed 2017/1/1
3642
  default_dbi_option # will be removed 2017/1/1
3643
  dbi_option # will be removed 2017/1/1
3644
  data_source # will be removed at 2017/1/1
3645
  dbi_options # will be removed at 2017/1/1
3646
  filter_check # will be removed at 2017/1/1
3647
  reserved_word_quote # will be removed at 2017/1/1
3648
  cache_method # will be removed at 2017/1/1
3649
  
3650
  # Methods
3651
  update_timestamp # will be removed at 2017/1/1
3652
  insert_timestamp # will be removed at 2017/1/1
3653
  method # will be removed at 2017/1/1
3654
  assign_param # will be removed at 2017/1/1
3655
  update_param # will be removed at 2017/1/1
3656
  insert_param # will be removed at 2017/1/1
3657
  create_query # will be removed at 2017/1/1
3658
  apply_filter # will be removed at 2017/1/1
3659
  select_at # will be removed at 2017/1/1
3660
  delete_at # will be removed at 2017/1/1
3661
  update_at # will be removed at 2017/1/1
3662
  insert_at # will be removed at 2017/1/1
3663
  register_tag # will be removed at 2017/1/1
3664
  default_bind_filter # will be removed at 2017/1/1
3665
  default_fetch_filter # will be removed at 2017/1/1
3666
  insert_param_tag # will be removed at 2017/1/1
3667
  register_tag # will be removed at 2017/1/1
3668
  register_tag_processor # will be removed at 2017/1/1
3669
  update_param_tag # will be removed at 2017/1/1
3670
  
3671
  # Options
- "created_at" option is ren...
Yuki Kimoto authored on 2012-02-11
3672
  insert method created_at option # will be removed 2017/3/1
3673
  update method updated_at option # will be removed 2017/3/1
cleanup
Yuki Kimoto authored on 2012-01-20
3674
  select column option [COLUMN => ALIAS] syntax # will be removed 2017/1/1
3675
  execute method id option # will be removed 2017/1/1
3676
  update timestamp option # will be removed 2017/1/1
3677
  insert timestamp option # will be removed 2017/1/1
3678
  select method where_param option # will be removed 2017/1/1
3679
  delete method where_param option # will be removed 2017/1/1
3680
  update method where_param option # will be removed 2017/1/1
3681
  insert method param option # will be removed at 2017/1/1
3682
  insert method id option # will be removed at 2017/1/1
3683
  select method relation option # will be removed at 2017/1/1
3684
  select method column option [COLUMN, as => ALIAS] format
3685
    # will be removed at 2017/1/1
3686
  execute method's sqlfilter option # will be removed at 2017/1/1
3687
  
3688
  # Others
3689
  execute($query, ...) # execute method receiving query object.
3690
                       # this is removed at 2017/1/1
3691
  execute("select * from {= title}"); # execute method's
3692
                                      # tag parsing functionality
3693
                                      # will be removed at 2017/1/1
3694
  Query caching # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3695

            
3696
L<DBIx::Custom::Model>
3697

            
cleanup
Yuki Kimoto authored on 2012-01-20
3698
  # Attribute methods
3699
  execute # will be removed at 2017/1/1
3700
  method # will be removed at 2017/1/1
3701
  filter # will be removed at 2017/1/1
3702
  name # will be removed at 2017/1/1
3703
  type # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3704

            
3705
L<DBIx::Custom::Query>
DBIx::Custom::Query is DEPRE...
Yuki Kimoto authored on 2011-11-15
3706

            
3707
This module is DEPRECATED! # will be removed at 2017/1/1
cleanup
Yuki Kimoto authored on 2012-01-20
3708
  
3709
  # Attribute methods
3710
  default_filter # will be removed at 2017/1/1
3711
  table # will be removed at 2017/1/1
3712
  filters # will be removed at 2017/1/1
3713
  
3714
  # Methods
3715
  filter # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3716

            
3717
L<DBIx::Custom::QueryBuilder>
- DBIx::Custom::QueryBuilder...
Yuki Kimoto authored on 2011-11-04
3718

            
3719
This module is DEPRECATED! # will be removed at 2017/1/1
cleanup
Yuki Kimoto authored on 2012-01-20
3720
  
3721
  # Attribute methods
3722
  tags # will be removed at 2017/1/1
3723
  tag_processors # will be removed at 2017/1/1
3724
  
3725
  # Methods
3726
  register_tag # will be removed at 2017/1/1
3727
  register_tag_processor # will be removed at 2017/1/1
3728
  
3729
  # Others
3730
  build_query("select * from {= title}"); # tag parsing functionality
3731
                                          # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3732

            
3733
L<DBIx::Custom::Result>
cleanup
Yuki Kimoto authored on 2012-01-20
3734
  
3735
  # Attribute methods
3736
  filter_check # will be removed at 2017/1/1
3737
  
3738
  # Methods
3739
  fetch_first # will be removed at 2017/2/1
3740
  fetch_hash_first # will be removed 2017/2/1
3741
  filter_on # will be removed at 2017/1/1
3742
  filter_off # will be removed at 2017/1/1
3743
  end_filter # will be removed at 2017/1/1
3744
  remove_end_filter # will be removed at 2017/1/1
3745
  remove_filter # will be removed at 2017/1/1
3746
  default_filter # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3747

            
3748
L<DBIx::Custom::Tag>
3749

            
cleanup
Yuki Kimoto authored on 2012-01-20
3750
  This module is DEPRECATED! # will be removed at 2017/1/1
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3751

            
micro optimization
Yuki Kimoto authored on 2011-11-07
3752
L<DBIx::Custom::Order>
3753

            
cleanup
Yuki Kimoto authored on 2012-01-20
3754
  # Other
3755
  prepend method array reference receiving
3756
    $order->prepend(['book', 'desc']); # will be removed 2017/1/1
micro optimization
Yuki Kimoto authored on 2011-11-07
3757

            
fix heading typos
Terrence Brannon authored on 2011-08-17
3758
=head1 BACKWARDS COMPATIBILITY POLICY
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3759

            
3760
If a functionality is DEPRECATED, you can know it by DEPRECATED warnings
3761
except for attribute method.
3762
You can check all DEPRECATED functionalities by document.
3763
DEPRECATED functionality is removed after five years,
3764
but if at least one person use the functionality and tell me that thing
added EXPERIMENTAL each_tabl...
Yuki Kimoto authored on 2011-07-11
3765
I extend one year each time he tell me it.
- added EXPERIMENTAL order m...
Yuki Kimoto authored on 2011-06-28
3766

            
3767
EXPERIMENTAL functionality will be changed without warnings.
DBIx::Custom is now stable
yuki-kimoto authored on 2010-09-07
3768

            
removed DESTROY method(not b...
yuki-kimoto authored on 2010-07-18
3769
=head1 BUGS
3770

            
renamed build_query to creat...
yuki-kimoto authored on 2010-08-06
3771
Please tell me bugs if found.
removed DESTROY method(not b...
yuki-kimoto authored on 2010-07-18
3772

            
3773
C<< <kimoto.yuki at gmail.com> >>
3774

            
3775
L<http://github.com/yuki-kimoto/DBIx-Custom>
3776

            
removed reconnect method
yuki-kimoto authored on 2010-05-28
3777
=head1 AUTHOR
3778

            
3779
Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >>
version 0.0901
yuki-kimoto authored on 2009-12-17
3780

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

            
cleanup
Yuki Kimoto authored on 2011-01-25
3783
Copyright 2009-2011 Yuki Kimoto, all rights reserved.
packaging one directory
yuki-kimoto authored on 2009-11-16
3784

            
3785
This program is free software; you can redistribute it and/or modify it
3786
under the same terms as Perl itself.
3787

            
3788
=cut