... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
0.1678 |
2 | 2 |
- DBIx::Custom::Model filter attribute can receive hash reference |
3 |
- - DBIx::Custom::Where clause attribute can receive clause without column name. |
|
3 |
+ - DBIx::Custom::Where clause attribute can receive clause without column name |
|
4 |
+ - improved error messages |
|
4 | 5 |
0.1677 |
5 | 6 |
- improved table search in column and join clause |
6 | 7 |
- DEPRECATED table tag. use table option. |
... | ... |
@@ -78,7 +78,8 @@ sub AUTOLOAD { |
78 | 78 |
$self->dbh->$dbh_method(@_); |
79 | 79 |
} |
80 | 80 |
else { |
81 |
- croak qq/Can't locate object method "$mname" via "$package"/ |
|
81 |
+ croak qq{Can't locate object method "$mname" via "$package"} |
|
82 |
+ . qq{ (DBIx::Custom::AUTOLOAD)} |
|
82 | 83 |
} |
83 | 84 |
} |
84 | 85 |
|
... | ... |
@@ -110,10 +111,11 @@ sub apply_filter { |
110 | 111 |
|
111 | 112 |
# Filter infomation |
112 | 113 |
my $finfo = $cinfos[$i + 1] || {}; |
113 |
- croak "$usage (table: $table)" unless ref $finfo eq 'HASH'; |
|
114 |
+ croak "$usage (table: $table) (DBIx::Custom::apply_filter)" |
|
115 |
+ unless ref $finfo eq 'HASH'; |
|
114 | 116 |
foreach my $ftype (keys %$finfo) { |
115 |
- croak "$usage (table: $table 2)" unless $ftype eq 'in' || $ftype eq 'out' |
|
116 |
- || $ftype eq 'end'; |
|
117 |
+ croak "$usage (table: $table) (DBIx::Custom::apply_filter)" |
|
118 |
+ unless $ftype eq 'in' || $ftype eq 'out' || $ftype eq 'end'; |
|
117 | 119 |
} |
118 | 120 |
|
119 | 121 |
# Set filters |
... | ... |
@@ -133,6 +135,7 @@ sub apply_filter { |
133 | 135 |
|
134 | 136 |
# Check filter name |
135 | 137 |
croak qq{Filter "$filter" is not registered} |
138 |
+ . qq{ (DBIx::Custom::apply_filter)} |
|
136 | 139 |
if $state eq 'name' |
137 | 140 |
&& ! exists $self->filters->{$filter}; |
138 | 141 |
|
... | ... |
@@ -223,7 +226,11 @@ sub create_query { |
223 | 226 |
# Prepare statement handle |
224 | 227 |
my $sth; |
225 | 228 |
eval { $sth = $self->dbh->prepare($query->{sql})}; |
226 |
- $self->_croak($@, qq{. Following SQL is executed. "$query->{sql}"}) if $@; |
|
229 |
+ |
|
230 |
+ if ($@) { |
|
231 |
+ $self->_croak($@, qq{. Following SQL is executed.\n} |
|
232 |
+ . qq{$query->{sql}\n(DBIx::Custom::create_query)}); |
|
233 |
+ } |
|
227 | 234 |
|
228 | 235 |
# Set statement handle |
229 | 236 |
$query->sth($sth); |
... | ... |
@@ -249,6 +256,7 @@ sub dbh { |
249 | 256 |
# From Connction manager |
250 | 257 |
if (my $connector = $self->connector) { |
251 | 258 |
croak "connector must have dbh() method" |
259 |
+ . " (DBIx::Custom::dbh)" |
|
252 | 260 |
unless ref $connector && $connector->can('dbh'); |
253 | 261 |
|
254 | 262 |
return $self->{dbh} = $connector->dbh; |
... | ... |
@@ -266,13 +274,15 @@ sub delete { |
266 | 274 |
|
267 | 275 |
# Check arguments |
268 | 276 |
foreach my $name (keys %args) { |
269 |
- croak qq{Argument "$name" is wrong name} |
|
277 |
+ croak qq{"$name" is wrong option} |
|
278 |
+ . qq{ (DBIx::Custom::delete)} |
|
270 | 279 |
unless $DELETE_ARGS{$name}; |
271 | 280 |
} |
272 | 281 |
|
273 | 282 |
# Arguments |
274 | 283 |
my $table = $args{table} || ''; |
275 |
- croak qq{"table" option must be specified} unless $table; |
|
284 |
+ croak qq{"table" option must be specified. (DBIx::Custom::delete)} |
|
285 |
+ unless $table; |
|
276 | 286 |
my $where = delete $args{where} || {}; |
277 | 287 |
my $append = delete $args{append}; |
278 | 288 |
my $allow_delete_all = delete $args{allow_delete_all}; |
... | ... |
@@ -283,7 +293,7 @@ sub delete { |
283 | 293 |
|
284 | 294 |
# Where clause |
285 | 295 |
my $where_clause = $where->to_string; |
286 |
- croak qq{"where" must be specified} |
|
296 |
+ croak qq{"where" must be specified (DBIx::Custom::delete)} |
|
287 | 297 |
if $where_clause eq '' && !$allow_delete_all; |
288 | 298 |
|
289 | 299 |
# Delete statement |
... | ... |
@@ -320,13 +330,12 @@ sub delete_at { |
320 | 330 |
|
321 | 331 |
# Check arguments |
322 | 332 |
foreach my $name (keys %args) { |
323 |
- croak qq{Argument "$name" is wrong name} |
|
333 |
+ croak qq{"$name" is wrong option (DBIx::Custom::delete_at)} |
|
324 | 334 |
unless $DELETE_AT_ARGS{$name}; |
325 | 335 |
} |
326 | 336 |
|
327 | 337 |
# Create where parameter |
328 | 338 |
my $where_param = $self->_create_where_param($where, $primary_keys); |
329 |
- |
|
330 | 339 |
|
331 | 340 |
return $self->delete(where => $where_param, %args); |
332 | 341 |
} |
... | ... |
@@ -357,6 +366,7 @@ sub create_model { |
357 | 366 |
|
358 | 367 |
# Associate table with model |
359 | 368 |
croak "Table name is duplicated" |
369 |
+ . " (DBIx::Custom::create_model)" |
|
360 | 370 |
if exists $self->{_model_from}->{$model->table}; |
361 | 371 |
$self->{_model_from}->{$model->table} = $model->name; |
362 | 372 |
|
... | ... |
@@ -405,7 +415,7 @@ sub execute { |
405 | 415 |
|
406 | 416 |
# Check argument names |
407 | 417 |
foreach my $name (keys %args) { |
408 |
- croak qq{Argument "$name" is wrong name} |
|
418 |
+ croak qq{"$name" is wrong option (DBIx::Custom::execute)} |
|
409 | 419 |
unless $EXECUTE_ARGS{$name}; |
410 | 420 |
} |
411 | 421 |
|
... | ... |
@@ -465,6 +475,7 @@ sub execute { |
465 | 475 |
} |
466 | 476 |
elsif (ref $name ne 'CODE') { |
467 | 477 |
croak qq{Filter "$name" is not registered"} |
478 |
+ . qq{ (DBIx::Custom::execute} |
|
468 | 479 |
unless exists $self->filters->{$name}; |
469 | 480 |
$filter->{$column} = $self->filters->{$name}; |
470 | 481 |
} |
... | ... |
@@ -488,7 +499,11 @@ sub execute { |
488 | 499 |
} |
489 | 500 |
$affected = $sth->execute; |
490 | 501 |
}; |
491 |
- $self->_croak($@, qq{. Following SQL is executed. "$query->{sql}"}) if $@; |
|
502 |
+ |
|
503 |
+ if ($@) { |
|
504 |
+ $self->_croak($@, qq{. Following SQL is executed.\n} |
|
505 |
+ . qq{$query->{sql}\n}); |
|
506 |
+ } |
|
492 | 507 |
|
493 | 508 |
# Output SQL for debug |
494 | 509 |
warn $query->sql . "\n" if DEBUG; |
... | ... |
@@ -533,14 +548,15 @@ sub insert { |
533 | 548 |
|
534 | 549 |
# Arguments |
535 | 550 |
my $table = delete $args{table}; |
536 |
- croak qq{"table" option must be specified} unless $table; |
|
551 |
+ croak qq{"table" option must be specified (DBIx::Custom::insert)} |
|
552 |
+ unless $table; |
|
537 | 553 |
my $param = delete $args{param} || {}; |
538 | 554 |
my $append = delete $args{append} || ''; |
539 | 555 |
my $query_return = delete $args{query}; |
540 | 556 |
|
541 | 557 |
# Check arguments |
542 | 558 |
foreach my $name (keys %args) { |
543 |
- croak qq{Argument "$name" is wrong name} |
|
559 |
+ croak qq{"$name" is wrong option (DBIx::Custom::insert)} |
|
544 | 560 |
unless $INSERT_ARGS{$name}; |
545 | 561 |
} |
546 | 562 |
|
... | ... |
@@ -552,6 +568,7 @@ sub insert { |
552 | 568 |
my $safety = $self->safety_character; |
553 | 569 |
foreach my $column (keys %$param) { |
554 | 570 |
croak qq{"$column" is not safety column name} |
571 |
+ . qq{ (DBIx::Custom::insert)} |
|
555 | 572 |
unless $column =~ /^[$safety\.]+$/; |
556 | 573 |
$column = "$q$column$q"; |
557 | 574 |
$column =~ s/\./$q.$q/; |
... | ... |
@@ -590,7 +607,7 @@ sub insert_at { |
590 | 607 |
|
591 | 608 |
# Check arguments |
592 | 609 |
foreach my $name (keys %args) { |
593 |
- croak qq{Argument "$name" is wrong name} |
|
610 |
+ croak qq{"$name" is wrong option (DBIx::Custom::insert_at)} |
|
594 | 611 |
unless $INSERT_AT_ARGS{$name}; |
595 | 612 |
} |
596 | 613 |
|
... | ... |
@@ -611,6 +628,7 @@ sub insert_param_tag { |
611 | 628 |
my @placeholders; |
612 | 629 |
foreach my $column (keys %$param) { |
613 | 630 |
croak qq{"$column" is not safety column name} |
631 |
+ . qq{ (DBIx::Custom::insert_param_tag) } |
|
614 | 632 |
unless $column =~ /^[$safety\.]+$/; |
615 | 633 |
$column = "$q$column$q"; |
616 | 634 |
$column =~ s/\./$q.$q/; |
... | ... |
@@ -633,15 +651,19 @@ sub include_model { |
633 | 651 |
|
634 | 652 |
# Load name space module |
635 | 653 |
croak qq{"$name_space" is invalid class name} |
654 |
+ . qq{ (DBIx::Custom::include_model)} |
|
636 | 655 |
if $name_space =~ /[^\w:]/; |
637 | 656 |
eval "use $name_space"; |
638 |
- croak qq{Name space module "$name_space.pm" is needed. $@} if $@; |
|
657 |
+ croak qq{Name space module "$name_space.pm" is needed. $@} |
|
658 |
+ . qq{ (DBIx::Custom::include_model)} |
|
659 |
+ if $@; |
|
639 | 660 |
|
640 | 661 |
# Search model modules |
641 | 662 |
my $path = $INC{"$name_space.pm"}; |
642 | 663 |
$path =~ s/\.pm$//; |
643 | 664 |
opendir my $dh, $path |
644 |
- or croak qq{Can't open directory "$path": $!}; |
|
665 |
+ or croak qq{Can't open directory "$path": $!} |
|
666 |
+ . qq{ (DBIx::Custom::include_model)}; |
|
645 | 667 |
$model_infos = []; |
646 | 668 |
while (my $module = readdir $dh) { |
647 | 669 |
push @$model_infos, $module |
... | ... |
@@ -668,10 +690,11 @@ sub include_model { |
668 | 690 |
else { $model_class = $model_name = $model_table = $model_info } |
669 | 691 |
my $mclass = "${name_space}::$model_class"; |
670 | 692 |
croak qq{"$mclass" is invalid class name} |
693 |
+ . qq{ (DBIx::Custom::inculde_model)} |
|
671 | 694 |
if $mclass =~ /[^\w:]/; |
672 | 695 |
unless ($mclass->can('isa')) { |
673 | 696 |
eval "use $mclass"; |
674 |
- croak $@ if $@; |
|
697 |
+ croak "$@ (DBIx::Custom::include_model)" if $@; |
|
675 | 698 |
} |
676 | 699 |
|
677 | 700 |
# Create model |
... | ... |
@@ -726,7 +749,7 @@ sub model { |
726 | 749 |
} |
727 | 750 |
|
728 | 751 |
# Check model existance |
729 |
- croak qq{Model "$name" is not included} |
|
752 |
+ croak qq{Model "$name" is not included (DBIx::Custom::model)} |
|
730 | 753 |
unless $self->models->{$name}; |
731 | 754 |
|
732 | 755 |
# Get model |
... | ... |
@@ -751,7 +774,7 @@ sub new { |
751 | 774 |
# Check attributes |
752 | 775 |
my @attrs = keys %$self; |
753 | 776 |
foreach my $attr (@attrs) { |
754 |
- croak qq{"$attr" is wrong name} |
|
777 |
+ croak qq{"$attr" is wrong name (DBIx::Custom::new)} |
|
755 | 778 |
unless $self->can($attr); |
756 | 779 |
} |
757 | 780 |
|
... | ... |
@@ -803,6 +826,7 @@ sub select { |
803 | 826 |
my $append = delete $args{append}; |
804 | 827 |
my $join = delete $args{join} || []; |
805 | 828 |
croak qq{"join" must be array reference} |
829 |
+ . qq{ (DBIx::Custom::select)} |
|
806 | 830 |
unless ref $join eq 'ARRAY'; |
807 | 831 |
my $relation = delete $args{relation}; |
808 | 832 |
my $param = delete $args{param} || {}; |
... | ... |
@@ -810,7 +834,7 @@ sub select { |
810 | 834 |
|
811 | 835 |
# Check arguments |
812 | 836 |
foreach my $name (keys %args) { |
813 |
- croak qq{Argument "$name" is wrong name} |
|
837 |
+ croak qq{"$name" is wrong option (DBIx::Custom::select)} |
|
814 | 838 |
unless $SELECT_ARGS{$name}; |
815 | 839 |
} |
816 | 840 |
|
... | ... |
@@ -847,7 +871,8 @@ sub select { |
847 | 871 |
push @sql, "$q$main_table$q"; |
848 | 872 |
} |
849 | 873 |
pop @sql if ($sql[-1] || '') eq ','; |
850 |
- croak "Not found table name" unless $tables->[-1]; |
|
874 |
+ croak "Not found table name (DBIx::Custom::select)" |
|
875 |
+ unless $tables->[-1]; |
|
851 | 876 |
|
852 | 877 |
# Add tables in parameter |
853 | 878 |
unshift @$tables, @{$self->_search_tables(join(' ', keys %$param) || '')}; |
... | ... |
@@ -906,12 +931,13 @@ sub select_at { |
906 | 931 |
|
907 | 932 |
# Check arguments |
908 | 933 |
foreach my $name (keys %args) { |
909 |
- croak qq{Argument "$name" is wrong name} |
|
934 |
+ croak qq{"$name" is wrong option (DBIx::Custom::select_at)} |
|
910 | 935 |
unless $SELECT_AT_ARGS{$name}; |
911 | 936 |
} |
912 | 937 |
|
913 | 938 |
# Table |
914 |
- croak qq{"table" option must be specified} unless $args{table}; |
|
939 |
+ croak qq{"table" option must be specified (DBIx::Custom::select_at)} |
|
940 |
+ unless $args{table}; |
|
915 | 941 |
my $table = ref $args{table} ? $args{table}->[-1] : $args{table}; |
916 | 942 |
|
917 | 943 |
# Create where parameter |
... | ... |
@@ -943,7 +969,8 @@ sub update { |
943 | 969 |
|
944 | 970 |
# Arguments |
945 | 971 |
my $table = delete $args{table} || ''; |
946 |
- croak qq{"table" option must be specified} unless $table; |
|
972 |
+ croak qq{"table" option must be specified (DBIx::Custom::update)} |
|
973 |
+ unless $table; |
|
947 | 974 |
my $param = delete $args{param} || {}; |
948 | 975 |
my $where = delete $args{where} || {}; |
949 | 976 |
my $append = delete $args{append} || ''; |
... | ... |
@@ -951,7 +978,7 @@ sub update { |
951 | 978 |
|
952 | 979 |
# Check argument names |
953 | 980 |
foreach my $name (keys %args) { |
954 |
- croak qq{Argument "$name" is wrong name} |
|
981 |
+ croak qq{"$name" is wrong option (DBIx::Custom::update)} |
|
955 | 982 |
unless $UPDATE_ARGS{$name}; |
956 | 983 |
} |
957 | 984 |
|
... | ... |
@@ -961,6 +988,7 @@ sub update { |
961 | 988 |
my $q = $self->reserved_word_quote; |
962 | 989 |
foreach my $column (keys %$param) { |
963 | 990 |
croak qq{"$column" is not safety column name} |
991 |
+ . qq{ (DBIx::Custom::update)} |
|
964 | 992 |
unless $column =~ /^[$safety\.]+$/; |
965 | 993 |
$column = "$q$column$q"; |
966 | 994 |
$column =~ s/\./$q.$q/; |
... | ... |
@@ -973,7 +1001,7 @@ sub update { |
973 | 1001 |
# Where |
974 | 1002 |
$where = $self->_where_to_obj($where); |
975 | 1003 |
my $where_clause = $where->to_string; |
976 |
- croak qq{"where" must be specified} |
|
1004 |
+ croak qq{"where" must be specified (DBIx::Custom::update)} |
|
977 | 1005 |
if "$where_clause" eq '' && !$allow_update_all; |
978 | 1006 |
|
979 | 1007 |
# Update statement |
... | ... |
@@ -1017,7 +1045,7 @@ sub update_at { |
1017 | 1045 |
|
1018 | 1046 |
# Check arguments |
1019 | 1047 |
foreach my $name (keys %args) { |
1020 |
- croak qq{Argument "$name" is wrong name} |
|
1048 |
+ croak qq{"$name" is wrong option (DBIx::Custom::update_at)} |
|
1021 | 1049 |
unless $UPDATE_AT_ARGS{$name}; |
1022 | 1050 |
} |
1023 | 1051 |
|
... | ... |
@@ -1035,7 +1063,13 @@ sub _create_where_param { |
1035 | 1063 |
if ($where) { |
1036 | 1064 |
$where = [$where] unless ref $where; |
1037 | 1065 |
croak qq{"where" must be constant value or array reference} |
1066 |
+ . " (" . (caller 1)[3] . ")" |
|
1038 | 1067 |
unless !ref $where || ref $where eq 'ARRAY'; |
1068 |
+ |
|
1069 |
+ croak qq{"where" must contain values same count as primary key} |
|
1070 |
+ . " (" . (caller 1)[3] . ")" |
|
1071 |
+ unless @$primary_keys eq @$where; |
|
1072 |
+ |
|
1039 | 1073 |
for(my $i = 0; $i < @$primary_keys; $i ++) { |
1040 | 1074 |
$where_param->{$primary_keys->[$i]} = $where->[$i]; |
1041 | 1075 |
} |
... | ... |
@@ -40,7 +40,8 @@ sub AUTOLOAD { |
40 | 40 |
$self->dbi->dbh->$dbh_method(@_); |
41 | 41 |
} |
42 | 42 |
else { |
43 |
- croak qq/Can't locate object method "$mname" via "$package"/ |
|
43 |
+ croak qq{Can't locate object method "$mname" via "$package"} |
|
44 |
+ . qq{ (DBIx::Custom::Model::AUTOLOAD) } |
|
44 | 45 |
} |
45 | 46 |
} |
46 | 47 |
|
... | ... |
@@ -110,6 +111,7 @@ sub new { |
110 | 111 |
my @attrs = keys %$self; |
111 | 112 |
foreach my $attr (@attrs) { |
112 | 113 |
croak qq{"$attr" is invalid attribute name} |
114 |
+ . qq{ (DBIx::Custom::Model::new) } |
|
113 | 115 |
unless $self->can($attr); |
114 | 116 |
} |
115 | 117 |
|
... | ... |
@@ -44,6 +44,7 @@ sub filter { |
44 | 44 |
&& ref $fname ne 'CODE') |
45 | 45 |
{ |
46 | 46 |
croak qq{Filter "$fname" is not registered"} |
47 |
+ . qq{ (DBIx::Custom::Query::filter) } |
|
47 | 48 |
unless exists $self->filters->{$fname}; |
48 | 49 |
|
49 | 50 |
$filter->{$column} = $self->filters->{$fname}; |
... | ... |
@@ -78,10 +78,12 @@ sub _build_query { |
78 | 78 |
|
79 | 79 |
# Tag is not registered |
80 | 80 |
croak qq{Tag "$tag_name" in "{a }" is not registered} |
81 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)} |
|
81 | 82 |
unless $tag; |
82 | 83 |
|
83 | 84 |
# Tag not sub reference |
84 | 85 |
croak qq{Tag "$tag_name" must be sub reference} |
86 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)} |
|
85 | 87 |
unless ref $tag eq 'CODE'; |
86 | 88 |
|
87 | 89 |
# Execute tag |
... | ... |
@@ -89,6 +91,7 @@ sub _build_query { |
89 | 91 |
|
90 | 92 |
# Check tag return value |
91 | 93 |
croak qq{Tag "$tag_name" must return [STRING, ARRAY_REFERENCE]} |
94 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)} |
|
92 | 95 |
unless ref $r eq 'ARRAY' && defined $r->[0] && ref $r->[1] eq 'ARRAY'; |
93 | 96 |
|
94 | 97 |
# Part of SQL statement and colum names |
... | ... |
@@ -106,6 +109,7 @@ sub _build_query { |
106 | 109 |
my $placeholder_count = $self->_placeholder_count($sql); |
107 | 110 |
my $column_count = @$all_columns; |
108 | 111 |
croak qq{Placeholder count in "$sql" must be same as column count $column_count} |
112 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)} |
|
109 | 113 |
unless $placeholder_count eq @$all_columns; |
110 | 114 |
|
111 | 115 |
# Add semicolon |
... | ... |
@@ -187,8 +191,9 @@ sub _parse { |
187 | 191 |
|
188 | 192 |
# Unexpected |
189 | 193 |
else { |
190 |
- croak qq/Parsing error. unexpected "}". / . |
|
191 |
- qq/pos $pos of "$original"/; |
|
194 |
+ croak qq{Parsing error. unexpected "\}". } |
|
195 |
+ . qq{pos $pos of "$original"} |
|
196 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)}; |
|
192 | 197 |
} |
193 | 198 |
} |
194 | 199 |
|
... | ... |
@@ -210,8 +215,9 @@ sub _parse { |
210 | 215 |
|
211 | 216 |
# Unexpected |
212 | 217 |
else { |
213 |
- croak qq/Parsing error. unexpected "{". / . |
|
214 |
- qq/pos $pos of "$original"/; |
|
218 |
+ croak qq{Parsing error. unexpected "\{". } |
|
219 |
+ . qq{pos $pos of "$original"} |
|
220 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)}; |
|
215 | 221 |
} |
216 | 222 |
} |
217 | 223 |
|
... | ... |
@@ -253,6 +259,7 @@ sub _parse { |
253 | 259 |
|
254 | 260 |
# Tag not finished |
255 | 261 |
croak qq{Tag not finished. "$original"} |
262 |
+ . qq{ (DBIx::Custom::QueryBuilder::build_query)} |
|
256 | 263 |
if $state eq 'tag'; |
257 | 264 |
|
258 | 265 |
# Add rest text |
... | ... |
@@ -36,6 +36,7 @@ sub filter { |
36 | 36 |
&& ref $fname ne 'CODE') |
37 | 37 |
{ |
38 | 38 |
croak qq{Filter "$fname" is not registered"} |
39 |
+ . qq{ (DBIx::Custom::Result::filter)} |
|
39 | 40 |
unless exists $self->filters->{$fname}; |
40 | 41 |
|
41 | 42 |
$filter->{$column} = $self->filters->{$fname}; |
... | ... |
@@ -73,6 +74,7 @@ sub end_filter { |
73 | 74 |
&& ref $fname ne 'CODE') |
74 | 75 |
{ |
75 | 76 |
croak qq{Filter "$fname" is not registered"} |
77 |
+ . qq{ (DBIx::Custom::Result::end_filter)} |
|
76 | 78 |
unless exists $self->filters->{$fname}; |
77 | 79 |
|
78 | 80 |
$end_filter->{$column} = $self->filters->{$fname}; |
... | ... |
@@ -213,7 +215,7 @@ sub fetch_hash_multi { |
213 | 215 |
my ($self, $count) = @_; |
214 | 216 |
|
215 | 217 |
# Row count not specified |
216 |
- croak 'Row count must be specified' |
|
218 |
+ croak 'Row count must be specified (DBIx::Custom::Result::fetch_hash_multi)' |
|
217 | 219 |
unless $count; |
218 | 220 |
|
219 | 221 |
# Fetch multi rows |
... | ... |
@@ -232,7 +234,7 @@ sub fetch_multi { |
232 | 234 |
my ($self, $count) = @_; |
233 | 235 |
|
234 | 236 |
# Row count not specifed |
235 |
- croak 'Row count must be specified' |
|
237 |
+ croak 'Row count must be specified (DBIx::Custom::Result::fetch_multi)' |
|
236 | 238 |
unless $count; |
237 | 239 |
|
238 | 240 |
# Fetch multi rows |
... | ... |
@@ -17,6 +17,7 @@ sub in { |
17 | 17 |
|
18 | 18 |
# Check arguments |
19 | 19 |
croak qq{Column name and count of values must be specified in tag "{in }"} |
20 |
+ . qq{ (DBIx::Custom::Tag::in) } |
|
20 | 21 |
unless $column && $count && $count =~ /^\d+$/; |
21 | 22 |
|
22 | 23 |
# Part of statement |
... | ... |
@@ -60,6 +61,7 @@ sub placeholder { |
60 | 61 |
|
61 | 62 |
# Check arguments |
62 | 63 |
croak qq{Column name must be specified in tag "{? }"} |
64 |
+ . qq{ (DBIx::Custom::Tag::placeholder)} |
|
63 | 65 |
unless $column; |
64 | 66 |
|
65 | 67 |
return ['?', [$column]]; |
... | ... |
@@ -81,6 +83,7 @@ sub _basic { |
81 | 83 |
|
82 | 84 |
# Check arguments |
83 | 85 |
croak qq{Column name must be specified in tag "{$name }"} |
86 |
+ . qq{ (DBIx::Custom::Tag::_basic) } |
|
84 | 87 |
unless $column; |
85 | 88 |
|
86 | 89 |
return ["$column $name ?", [$column]]; |
... | ... |
@@ -19,6 +19,20 @@ __PACKAGE__->attr( |
19 | 19 |
reserved_word_quote => '' |
20 | 20 |
); |
21 | 21 |
|
22 |
+sub new { |
|
23 |
+ my $self = shift->SUPER::new(@_); |
|
24 |
+ |
|
25 |
+ # Check attribute names |
|
26 |
+ my @attrs = keys %$self; |
|
27 |
+ foreach my $attr (@attrs) { |
|
28 |
+ croak qq{"$attr" is invalid attribute name} |
|
29 |
+ . qq{ (DBIx::Custom::Where::new) } |
|
30 |
+ unless $self->can($attr); |
|
31 |
+ } |
|
32 |
+ |
|
33 |
+ return $self; |
|
34 |
+} |
|
35 |
+ |
|
22 | 36 |
sub to_string { |
23 | 37 |
my $self = shift; |
24 | 38 |
|
... | ... |
@@ -49,7 +63,7 @@ sub _parse { |
49 | 63 |
|
50 | 64 |
# Operation |
51 | 65 |
my $op = $clause->[0] || ''; |
52 |
- croak qq{"$op" is invalid operation} |
|
66 |
+ croak qq{"$op" is invalid operation (DBIx::Custom::Where::to_string)} |
|
53 | 67 |
unless $VALID_OPERATIONS{$op}; |
54 | 68 |
|
55 | 69 |
# Parse internal clause |
... | ... |
@@ -81,7 +95,8 @@ sub _parse { |
81 | 95 |
return $pushed; |
82 | 96 |
} |
83 | 97 |
elsif (@$columns != 1) { |
84 |
- croak qq{Each tag contains one column name: tag "$clause"} |
|
98 |
+ croak qq{Each tag contains one column name: tag "$clause" } |
|
99 |
+ . "(DBIx::Custom::Where::to_string)" |
|
85 | 100 |
} |
86 | 101 |
|
87 | 102 |
my $column = $columns->[0]; |
... | ... |
@@ -90,7 +105,7 @@ sub _parse { |
90 | 105 |
} |
91 | 106 |
|
92 | 107 |
my $safety = $self->safety_character; |
93 |
- croak qq{"$column" is not safety column name} |
|
108 |
+ croak qq{"$column" is not safety column name (DBIx::Custom::Where::to_string)} |
|
94 | 109 |
unless $column =~ /^[$safety\.]+$/; |
95 | 110 |
|
96 | 111 |
# Column count up |
... | ... |
@@ -115,8 +130,10 @@ sub _parse { |
115 | 130 |
push @$where, $clause; |
116 | 131 |
$pushed = 1; |
117 | 132 |
} |
118 |
- else { croak "Parameter must be hash reference or undfined value" } |
|
119 |
- |
|
133 |
+ else { |
|
134 |
+ croak "Parameter must be hash reference or undfined value " |
|
135 |
+ . "(DBIx::Custom::Where::to_string)" |
|
136 |
+ } |
|
120 | 137 |
return $pushed; |
121 | 138 |
} |
122 | 139 |
} |
... | ... |
@@ -599,7 +599,7 @@ $dbi->execute($CREATE_TABLE->{0}); |
599 | 599 |
} |
600 | 600 |
|
601 | 601 |
eval{$dbi->execute('select * from table1', no_exists => 1)}; |
602 |
-like($@, qr/name/, "invald SQL"); |
|
602 |
+like($@, qr/wrong/, "invald SQL"); |
|
603 | 603 |
|
604 | 604 |
$query = $dbi->create_query('select * from table1 where {= key1}'); |
605 | 605 |
$dbi->dbh->disconnect; |
... | ... |
@@ -1258,6 +1258,9 @@ $result = $dbi->select( |
1258 | 1258 |
$row = $result->fetch_hash_all; |
1259 | 1259 |
is_deeply($row, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], 'not_exists'); |
1260 | 1260 |
|
1261 |
+eval {$dbi->where(ppp => 1) }; |
|
1262 |
+like($@, qr/invalid/); |
|
1263 |
+ |
|
1261 | 1264 |
test 'dbi_option default'; |
1262 | 1265 |
$dbi = DBIx::Custom->new; |
1263 | 1266 |
is_deeply($dbi->dbi_option, {}); |
... | ... |
@@ -1660,6 +1663,15 @@ eval { |
1660 | 1663 |
}; |
1661 | 1664 |
like($@, qr/must be/); |
1662 | 1665 |
|
1666 |
+eval { |
|
1667 |
+ $result = $dbi->select_at( |
|
1668 |
+ table => 'table1', |
|
1669 |
+ primary_key => ['key1', 'key2'], |
|
1670 |
+ where => [1], |
|
1671 |
+ ); |
|
1672 |
+}; |
|
1673 |
+like($@, qr/same/); |
|
1674 |
+ |
|
1663 | 1675 |
eval { |
1664 | 1676 |
$result = $dbi->update_at( |
1665 | 1677 |
table => 'table1', |