| ... | ... |
@@ -1,3 +1,17 @@ |
| 1 |
+0.1699 |
|
| 2 |
+ - added EXPERIMENTAL order method |
|
| 3 |
+ - added EXPERIMENTAL DBIx::Custom::Order module |
|
| 4 |
+ - changed backword compatible policy |
|
| 5 |
+ ------------------------------------------------------------------------ |
|
| 6 |
+ If a functionality is DEPRECATED, you can know it by DEPRECATED warnings |
|
| 7 |
+ except for attribute method. |
|
| 8 |
+ You can check all DEPRECATED functionalities by document. |
|
| 9 |
+ DEPRECATED functionality is removed after five years, |
|
| 10 |
+ but if at least one person use the functionality and tell me that thing |
|
| 11 |
+ I extend one year each time you tell me it. |
|
| 12 |
+ |
|
| 13 |
+ EXPERIMENTAL functionality will be changed without warnings. |
|
| 14 |
+ ------------------------------------------------------------------------ |
|
| 1 | 15 |
0.1698 |
| 2 | 16 |
- fixed DBIx::Custom::Where to_string method small bug |
| 3 | 17 |
- added EXPERIMENTAL execute method table_alias option |
| ... | ... |
@@ -12,6 +12,7 @@ use DBIx::Custom::QueryBuilder; |
| 12 | 12 |
use DBIx::Custom::Where; |
| 13 | 13 |
use DBIx::Custom::Model; |
| 14 | 14 |
use DBIx::Custom::Tag; |
| 15 |
+use DBIx::Custom::Order; |
|
| 15 | 16 |
use DBIx::Custom::Util qw/_array_to_hash _subname/; |
| 16 | 17 |
use Encode qw/encode encode_utf8 decode_utf8/; |
| 17 | 18 |
|
| ... | ... |
@@ -732,6 +733,11 @@ sub new {
|
| 732 | 733 |
|
| 733 | 734 |
sub not_exists { bless {}, 'DBIx::Custom::NotExists' }
|
| 734 | 735 |
|
| 736 |
+sub order {
|
|
| 737 |
+ my $self = shift; |
|
| 738 |
+ return DBIx::Custom::Order->new(@_); |
|
| 739 |
+} |
|
| 740 |
+ |
|
| 735 | 741 |
sub register_filter {
|
| 736 | 742 |
my $self = shift; |
| 737 | 743 |
|
| ... | ... |
@@ -760,10 +766,10 @@ sub select {
|
| 760 | 766 |
croak qq{"join" must be array reference } . _subname
|
| 761 | 767 |
unless ref $join eq 'ARRAY'; |
| 762 | 768 |
my $relation = delete $args{relation};
|
| 763 |
- warn "select() relation option is DEPRECATED! use join option instead" |
|
| 769 |
+ warn "select() relation option is DEPRECATED!" |
|
| 764 | 770 |
if $relation; |
| 765 | 771 |
my $param = delete $args{param} || {}; # DEPRECATED!
|
| 766 |
- warn "select() param option is DEPRECATED! use where_param option instead" |
|
| 772 |
+ warn "select() param option is DEPRECATED!" |
|
| 767 | 773 |
if keys %$param; |
| 768 | 774 |
my $where_param = delete $args{where_param} || $param || {};
|
| 769 | 775 |
my $wrap = delete $args{wrap};
|
| ... | ... |
@@ -1244,7 +1250,7 @@ sub _connect {
|
| 1244 | 1250 |
|
| 1245 | 1251 |
# Attributes |
| 1246 | 1252 |
my $dsn = $self->data_source; |
| 1247 |
- warn "data_source is DEPRECATED! use dsn instead\n" |
|
| 1253 |
+ warn "data_source is DEPRECATED!\n" |
|
| 1248 | 1254 |
if $dsn; |
| 1249 | 1255 |
$dsn ||= $self->dsn; |
| 1250 | 1256 |
croak qq{"dsn" must be specified } . _subname
|
| ... | ... |
@@ -1420,7 +1426,6 @@ sub _where_to_obj {
|
| 1420 | 1426 |
return $obj; |
| 1421 | 1427 |
} |
| 1422 | 1428 |
|
| 1423 |
-# DEPRECATED! |
|
| 1424 | 1429 |
sub _apply_filter {
|
| 1425 | 1430 |
my ($self, $table, @cinfos) = @_; |
| 1426 | 1431 |
|
| ... | ... |
@@ -1500,10 +1505,7 @@ sub create_query {
|
| 1500 | 1505 |
sub apply_filter {
|
| 1501 | 1506 |
my $self = shift; |
| 1502 | 1507 |
|
| 1503 |
- warn "apply_filter is DEPRECATED! " . |
|
| 1504 |
- "use type_rule method and DBIx::Custom::Result filter method, " . |
|
| 1505 |
- "instead"; |
|
| 1506 |
- |
|
| 1508 |
+ warn "apply_filter is DEPRECATED!"; |
|
| 1507 | 1509 |
return $self->_apply_filter(@_); |
| 1508 | 1510 |
} |
| 1509 | 1511 |
|
| ... | ... |
@@ -1740,7 +1742,7 @@ sub _add_relation_table {
|
| 1740 | 1742 |
|
| 1741 | 1743 |
=head1 NAME |
| 1742 | 1744 |
|
| 1743 |
-DBIx::Custom - Useful database access, respecting SQL! |
|
| 1745 |
+DBIx::Custom - Execute insert, update, delete, and select statement easily |
|
| 1744 | 1746 |
|
| 1745 | 1747 |
=head1 SYNOPSYS |
| 1746 | 1748 |
|
| ... | ... |
@@ -2503,6 +2505,12 @@ Create a new L<DBIx::Custom> object. |
| 2503 | 2505 |
DBIx::Custom::NotExists object, indicating the column is not exists. |
| 2504 | 2506 |
This is used by C<clause> of L<DBIx::Custom::Where> . |
| 2505 | 2507 |
|
| 2508 |
+=head2 C<order> EXPERIMENTAL |
|
| 2509 |
+ |
|
| 2510 |
+ my $order = $dbi->order; |
|
| 2511 |
+ |
|
| 2512 |
+Create a new L<DBIx::Custom::Order> object. |
|
| 2513 |
+ |
|
| 2506 | 2514 |
=head2 C<register_filter> |
| 2507 | 2515 |
|
| 2508 | 2516 |
$dbi->register_filter( |
| ... | ... |
@@ -2931,10 +2939,91 @@ executed SQL and bind values are printed to STDERR. |
| 2931 | 2939 |
|
| 2932 | 2940 |
DEBUG output encoding. Default to UTF-8. |
| 2933 | 2941 |
|
| 2934 |
-=head1 STABILITY |
|
| 2942 |
+=head1 DEPRECATED FUNCTIONALITIES |
|
| 2943 |
+ |
|
| 2944 |
+L<DBIx::Custom> |
|
| 2945 |
+ |
|
| 2946 |
+ # Attribute methods |
|
| 2947 |
+ data_source # Removed at 2017/1/1 |
|
| 2948 |
+ dbi_options # Removed at 2017/1/1 |
|
| 2949 |
+ filter_check # Removed at 2017/1/1 |
|
| 2950 |
+ reserved_word_quote # Removed at 2017/1/1 |
|
| 2951 |
+ |
|
| 2952 |
+ # Methods |
|
| 2953 |
+ create_query # Removed at 2017/1/1 |
|
| 2954 |
+ apply_filter # Removed at 2017/1/1 |
|
| 2955 |
+ select_at # Removed at 2017/1/1 |
|
| 2956 |
+ delete_at # Removed at 2017/1/1 |
|
| 2957 |
+ update_at # Removed at 2017/1/1 |
|
| 2958 |
+ insert_at # Removed at 2017/1/1 |
|
| 2959 |
+ register_tag # Removed at 2017/1/1 |
|
| 2960 |
+ default_bind_filter # Removed at 2017/1/1 |
|
| 2961 |
+ default_fetch_filter # Removed at 2017/1/1 |
|
| 2962 |
+ insert_param_tag # Removed at 2017/1/1 |
|
| 2963 |
+ register_tag_processor # Removed at 2017/1/1 |
|
| 2964 |
+ update_param_tag # Removed at 2017/1/1 |
|
| 2965 |
+ |
|
| 2966 |
+ # Options |
|
| 2967 |
+ select method relation option # Removed at 2017/1/1 |
|
| 2968 |
+ select method param option # Removed at 2017/1/1 |
|
| 2969 |
+ |
|
| 2970 |
+ # Others |
|
| 2971 |
+ execute("select * from {= title}"); # execute tag parsing functionality
|
|
| 2972 |
+ # Removed at 2017/1/1 |
|
| 2973 |
+ |
|
| 2974 |
+L<DBIx::Custom::Model> |
|
| 2975 |
+ |
|
| 2976 |
+ # Attribute method |
|
| 2977 |
+ filter # Removed at 2017/1/1 |
|
| 2978 |
+ name # Removed at 2017/1/1 |
|
| 2979 |
+ type # Removed at 2017/1/1 |
|
| 2980 |
+ |
|
| 2981 |
+L<DBIx::Custom::Query> |
|
| 2982 |
+ |
|
| 2983 |
+ # Attribute method |
|
| 2984 |
+ default_filter # Removed at 2017/1/1 |
|
| 2985 |
+ |
|
| 2986 |
+L<DBIx::Custom::QueryBuilder> |
|
| 2987 |
+ |
|
| 2988 |
+ # Attribute method |
|
| 2989 |
+ tags # Removed at 2017/1/1 |
|
| 2990 |
+ tag_processors # Removed at 2017/1/1 |
|
| 2991 |
+ |
|
| 2992 |
+ # Method |
|
| 2993 |
+ register_tag # Removed at 2017/1/1 |
|
| 2994 |
+ register_tag_processor # Removed at 2017/1/1 |
|
| 2995 |
+ |
|
| 2996 |
+ # Others |
|
| 2997 |
+ build_query("select * from {= title}"); # tag parsing functionality
|
|
| 2998 |
+ # Removed at 2017/1/1 |
|
| 2999 |
+ |
|
| 3000 |
+L<DBIx::Custom::Result> |
|
| 3001 |
+ |
|
| 3002 |
+ # Attribute method |
|
| 3003 |
+ filter_check # Removed at 2017/1/1 |
|
| 3004 |
+ |
|
| 3005 |
+ # Methods |
|
| 3006 |
+ end_filter # Removed at 2017/1/1 |
|
| 3007 |
+ remove_end_filter # Removed at 2017/1/1 |
|
| 3008 |
+ remove_filter # Removed at 2017/1/1 |
|
| 3009 |
+ default_filter # Removed at 2017/1/1 |
|
| 3010 |
+ |
|
| 3011 |
+L<DBIx::Custom::Tag> |
|
| 3012 |
+ |
|
| 3013 |
+ This module is DEPRECATED! # Removed at 2017/1/1 |
|
| 3014 |
+ |
|
| 3015 |
+=head1 BACKWORD COMPATIBLE POLICY |
|
| 3016 |
+ |
|
| 3017 |
+If a functionality is DEPRECATED, you can know it by DEPRECATED warnings |
|
| 3018 |
+except for attribute method. |
|
| 3019 |
+You can check all DEPRECATED functionalities by document. |
|
| 3020 |
+DEPRECATED functionality is removed after five years, |
|
| 3021 |
+but if at least one person use the functionality and tell me that thing |
|
| 3022 |
+I extend one year each time you tell me it. |
|
| 3023 |
+ |
|
| 3024 |
+EXPERIMENTAL functionality will be changed without warnings. |
|
| 2935 | 3025 |
|
| 2936 |
-L<DBIx::Custom> is stable. APIs keep backword compatible |
|
| 2937 |
-except EXPERIMENTAL one in the feature. |
|
| 3026 |
+This policy is changed at 2011/6/28 |
|
| 2938 | 3027 |
|
| 2939 | 3028 |
=head1 BUGS |
| 2940 | 3029 |
|
| ... | ... |
@@ -0,0 +1,74 @@ |
| 1 |
+package DBIx::Custom::Order; |
|
| 2 |
+use Object::Simple -base; |
|
| 3 |
+use overload |
|
| 4 |
+ 'bool' => sub {1},
|
|
| 5 |
+ '""' => sub { shift->to_string },
|
|
| 6 |
+ fallback => 1; |
|
| 7 |
+ |
|
| 8 |
+has orders => sub { [] };
|
|
| 9 |
+ |
|
| 10 |
+sub prepend { unshift @{shift->orders}, @_ }
|
|
| 11 |
+ |
|
| 12 |
+sub to_string {
|
|
| 13 |
+ my $self = shift; |
|
| 14 |
+ |
|
| 15 |
+ my $exists = {};
|
|
| 16 |
+ my @orders; |
|
| 17 |
+ foreach my $order (@{$self->orders}) {
|
|
| 18 |
+ next unless defined $order; |
|
| 19 |
+ $order =~ s/^\s+//; |
|
| 20 |
+ $order =~ s/\s+$//; |
|
| 21 |
+ my ($column, $direction) = split /\s+/, $order; |
|
| 22 |
+ push @orders, $order unless $exists->{$column};
|
|
| 23 |
+ $exists->{$column} = 1;
|
|
| 24 |
+ } |
|
| 25 |
+ |
|
| 26 |
+ return '' unless @orders; |
|
| 27 |
+ return 'order by ' . join(', ', @orders);
|
|
| 28 |
+} |
|
| 29 |
+ |
|
| 30 |
+1; |
|
| 31 |
+ |
|
| 32 |
+=head1 NAME |
|
| 33 |
+ |
|
| 34 |
+DBIx::Custom::Order - Order by EXPERIMENTAL |
|
| 35 |
+ |
|
| 36 |
+=head1 SYNOPSIS |
|
| 37 |
+ |
|
| 38 |
+ # Result |
|
| 39 |
+ my $order = DBIx::Custom::Order->new; |
|
| 40 |
+ $order->prepend('title', 'author desc');
|
|
| 41 |
+ my $order_by = "$order"; |
|
| 42 |
+ |
|
| 43 |
+ |
|
| 44 |
+=head1 ATTRIBUTES |
|
| 45 |
+ |
|
| 46 |
+=head2 C<orders> |
|
| 47 |
+ |
|
| 48 |
+ my $orders = $result->orders; |
|
| 49 |
+ $result = $result->orders(\%orders); |
|
| 50 |
+ |
|
| 51 |
+Parts of order by clause |
|
| 52 |
+ |
|
| 53 |
+=head1 METHODS |
|
| 54 |
+ |
|
| 55 |
+L<DBIx::Custom::Result> inherits all methods from L<Object::Simple> |
|
| 56 |
+and implements the following new ones. |
|
| 57 |
+ |
|
| 58 |
+=head2 C<prepend> |
|
| 59 |
+ |
|
| 60 |
+ $order->prepend('title', 'author desc');
|
|
| 61 |
+ |
|
| 62 |
+Prepend order parts to C<orders>. |
|
| 63 |
+ |
|
| 64 |
+=head2 C<to_string> |
|
| 65 |
+ |
|
| 66 |
+ my $order_by = $order->to_string; |
|
| 67 |
+ |
|
| 68 |
+Create order by clause. If column name is duplicated, First one is used. |
|
| 69 |
+C<to_string> override stringification. so you can write the follwoing way. |
|
| 70 |
+ |
|
| 71 |
+ my $order_by = "$order"; |
|
| 72 |
+ |
|
| 73 |
+=cut |
|
| 74 |
+ |
| ... | ... |
@@ -284,7 +284,7 @@ has tag_processors => sub { {} };
|
| 284 | 284 |
# DEPRECATED! |
| 285 | 285 |
sub register_tag_processor {
|
| 286 | 286 |
my $self = shift; |
| 287 |
- warn "register_tag_processor is DEPRECATED! use register_tag instead"; |
|
| 287 |
+ warn "register_tag_processor is DEPRECATED!"; |
|
| 288 | 288 |
# Merge tag |
| 289 | 289 |
my $tag_processors = ref $_[0] eq 'HASH' ? $_[0] : {@_};
|
| 290 | 290 |
$self->tag_processors({%{$self->tag_processors}, %{$tag_processors}});
|
| ... | ... |
@@ -284,6 +284,7 @@ sub type_rule2_on {
|
| 284 | 284 |
|
| 285 | 285 |
# DEPRECATED! |
| 286 | 286 |
sub end_filter {
|
| 287 |
+ warn "end_filter method is DEPRECATED!"; |
|
| 287 | 288 |
my $self = shift; |
| 288 | 289 |
if (@_) {
|
| 289 | 290 |
my $end_filter = {};
|
| ... | ... |
@@ -309,27 +310,24 @@ sub end_filter {
|
| 309 | 310 |
} |
| 310 | 311 |
return $self->{end_filter} ||= {};
|
| 311 | 312 |
} |
| 312 |
- |
|
| 313 | 313 |
# DEPRECATED! |
| 314 | 314 |
sub remove_end_filter {
|
| 315 |
+ warn "remove_end_filter is DEPRECATED!"; |
|
| 315 | 316 |
my $self = shift; |
| 316 |
- warn "remove_end_filter is DEPRECATED! use filter_off attribute instead"; |
|
| 317 | 317 |
$self->{end_filter} = {};
|
| 318 | 318 |
return $self; |
| 319 | 319 |
} |
| 320 |
- |
|
| 321 | 320 |
# DEPRECATED! |
| 322 | 321 |
sub remove_filter {
|
| 322 |
+ warn "remove_filter is DEPRECATED!"; |
|
| 323 | 323 |
my $self = shift; |
| 324 |
- warn "remove_filter is DEPRECATED! use filter_off attribute instead"; |
|
| 325 | 324 |
$self->{filter} = {};
|
| 326 | 325 |
return $self; |
| 327 | 326 |
} |
| 328 |
- |
|
| 329 | 327 |
# DEPRECATED! |
| 330 | 328 |
sub default_filter {
|
| 331 |
- my $self = shift; |
|
| 332 | 329 |
warn "default_filter is DEPRECATED!"; |
| 330 |
+ my $self = shift; |
|
| 333 | 331 |
if (@_) {
|
| 334 | 332 |
my $fname = $_[0]; |
| 335 | 333 |
if (@_ && !$fname) {
|
| ... | ... |
@@ -344,7 +342,6 @@ sub default_filter {
|
| 344 | 342 |
} |
| 345 | 343 |
return $self->{default_filter};
|
| 346 | 344 |
} |
| 347 |
- |
|
| 348 | 345 |
# DEPRECATED! |
| 349 | 346 |
has 'filter_check'; |
| 350 | 347 |
|
| ... | ... |
@@ -3286,4 +3286,25 @@ $dbi->execute("insert into table1 (key1) values (:table2.key1)", {'table2.key1'
|
| 3286 | 3286 |
$result = $dbi->select(table => 'table1'); |
| 3287 | 3287 |
is($result->one->{key1}, 'A');
|
| 3288 | 3288 |
|
| 3289 |
+ |
|
| 3290 |
+test 'order'; |
|
| 3291 |
+$dbi = DBIx::Custom->connect(dsn => 'dbi:SQLite:dbname=:memory:'); |
|
| 3292 |
+{
|
|
| 3293 |
+ $dbi->execute("create table table1 (key1, key2)");
|
|
| 3294 |
+ $dbi->insert({key1 => 1, key2 => 1}, table => 'table1');
|
|
| 3295 |
+ $dbi->insert({key1 => 1, key2 => 3}, table => 'table1');
|
|
| 3296 |
+ $dbi->insert({key1 => 2, key2 => 2}, table => 'table1');
|
|
| 3297 |
+ $dbi->insert({key1 => 2, key2 => 4}, table => 'table1');
|
|
| 3298 |
+ my $order = $dbi->order; |
|
| 3299 |
+ $order->prepend('key1', 'key2 desc');
|
|
| 3300 |
+ $result = $dbi->select(table => 'table1', append => "$order"); |
|
| 3301 |
+ is_deeply($result->all, [{key1 => 1, key2 => 3}, {key1 => 1, key2 => 1},
|
|
| 3302 |
+ {key1 => 2, key2 => 4}, {key1 => 2, key2 => 2}]);
|
|
| 3303 |
+ $order->prepend('key1 desc');
|
|
| 3304 |
+ $result = $dbi->select(table => 'table1', append => "$order"); |
|
| 3305 |
+ is_deeply($result->all, [{key1 => 2, key2 => 4}, {key1 => 2, key2 => 2},
|
|
| 3306 |
+ {key1 => 1, key2 => 3}, {key1 => 1, key2 => 1}]);
|
|
| 3307 |
+} |
|
| 3308 |
+ |
|
| 3309 |
+ |
|
| 3289 | 3310 |
=cut |
| ... | ... |
@@ -3,6 +3,8 @@ use strict; |
| 3 | 3 |
use warnings; |
| 4 | 4 |
use DBI; |
| 5 | 5 |
|
| 6 |
+$SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /DEPRECATED/};
|
|
| 7 |
+ |
|
| 6 | 8 |
BEGIN {
|
| 7 | 9 |
eval { require DBD::SQLite; 1 }
|
| 8 | 10 |
or plan skip_all => 'DBD::SQLite required'; |