| ... | ... |
@@ -1,3 +1,5 @@ |
| 1 |
+0.1644 |
|
| 2 |
+ update pod |
|
| 1 | 3 |
0.1643 |
| 2 | 4 |
add experimental selection option to select() |
| 3 | 5 |
add experimental table tag |
| ... | ... |
@@ -341,6 +341,20 @@ Following SQL is executed. |
| 341 | 341 |
C<appned> is also used at C<insert()>, C<update()>, C<update_all()> |
| 342 | 342 |
C<delete()>, C<delete_all()>, and C<select()>. |
| 343 | 343 |
|
| 344 |
+Instead of C<column> and C<table>, |
|
| 345 |
+you can use C<selection>. |
|
| 346 |
+This is used to specify column names and table names at once |
|
| 347 |
+ |
|
| 348 |
+ my $selection = <<"EOS"; |
|
| 349 |
+ title, author, company_name |
|
| 350 |
+ from book inner join company on book.company_id = company.id |
|
| 351 |
+ EOS |
|
| 352 |
+ |
|
| 353 |
+ $dbi->select(selection => $selection); |
|
| 354 |
+ |
|
| 355 |
+Note that you can't use where clause in C<selection>. |
|
| 356 |
+use clause like "inner join". |
|
| 357 |
+ |
|
| 344 | 358 |
=head3 C<execute()> SQL |
| 345 | 359 |
|
| 346 | 360 |
use C<execute()> to execute SQL |
| ... | ... |
@@ -562,6 +576,18 @@ You can also use column name which contains table name. |
| 562 | 576 |
where => {'book.issue_date' => $tp}
|
| 563 | 577 |
); |
| 564 | 578 |
|
| 579 |
+In fetching, Filter is effective if you use "TABLE__COLUMN" as column name. |
|
| 580 |
+ |
|
| 581 |
+ my $result = $dbi->execute( |
|
| 582 |
+ "select issue_date as book__issue_date from book"); |
|
| 583 |
+ |
|
| 584 |
+You can apply C<end> filter execute after C<in> filter. |
|
| 585 |
+ |
|
| 586 |
+ $dbi->apply_filter('book',
|
|
| 587 |
+ issue_date => {out => 'tp_to_date', in => 'date_to_tp',
|
|
| 588 |
+ end => 'tp_to_displaydate'}, |
|
| 589 |
+ ); |
|
| 590 |
+ |
|
| 565 | 591 |
=head3 Individual filter C<filter> |
| 566 | 592 |
|
| 567 | 593 |
You can apply individual filter . |
| ... | ... |
@@ -661,9 +687,6 @@ If you want to use these, escape it by '\'; |
| 661 | 687 |
|
| 662 | 688 |
\ is perl's escape character, you need two \. |
| 663 | 689 |
|
| 664 |
-C<\>���̂�Perl�̃G�X�P�[�v�����ł��̂ŁA |
|
| 665 |
-C<\>�͓�K�v�ɂȂ�܂��B |
|
| 666 |
- |
|
| 667 | 690 |
Tag is expanded before executing SQL. |
| 668 | 691 |
|
| 669 | 692 |
select * from book where title = ? and author like ?; |
| ... | ... |
@@ -683,10 +706,9 @@ You can specify C<filter()> at C<execute()>. |
| 683 | 706 |
|
| 684 | 707 |
Note that at C<execute()> the filter applied by C<apply_filter()> |
| 685 | 708 |
don't has effective to columns. |
| 686 |
-You need specify C<table> to have effective. |
|
| 709 |
+You have to use C<table> tag in SQL |
|
| 687 | 710 |
|
| 688 |
- $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
|
|
| 689 |
- table => ['book']); |
|
| 711 |
+ my $sql = "select * from {table book} where {= author} and {like title};"
|
|
| 690 | 712 |
|
| 691 | 713 |
=head3 Tag list |
| 692 | 714 |
|
| ... | ... |
@@ -694,6 +716,14 @@ L<DBIx::Custom> |
| 694 | 716 |
|
| 695 | 717 |
The following tag is available. |
| 696 | 718 |
|
| 719 |
+=head4 C<table> |
|
| 720 |
+ |
|
| 721 |
+ {table NAME} -> NAME
|
|
| 722 |
+ |
|
| 723 |
+This is used to specify table name in SQL. |
|
| 724 |
+If you specify table name, Filtering by |
|
| 725 |
+C<apply_filter()> is effective. |
|
| 726 |
+ |
|
| 697 | 727 |
=head4 C<?> |
| 698 | 728 |
|
| 699 | 729 |
{? NAME} -> ?
|
| ... | ... |
@@ -950,77 +980,56 @@ C<execute()> |
| 950 | 980 |
|
| 951 | 981 |
$dbi->execute($sql, param => $param); |
| 952 | 982 |
|
| 953 |
-=head2 7. �e�[�u�����f�� |
|
| 954 |
- |
|
| 955 |
-=head3 �e�[�u���I�u�W�F�N�g�̍쐬 C<table()> |
|
| 983 |
+=head2 7. Table object |
|
| 956 | 984 |
|
| 957 |
-L<DBIx::Custom>�̓��W�b�N�Ƃ��ăe�[�u���𒆐S�ɂ����� |
|
| 958 |
-���f���̍쐬��x�����܂��B |
|
| 985 |
+=head3 Create table object C<table()> |
|
| 959 | 986 |
|
| 960 |
-�A�v���P�[�V�����̃��W�b�N��L�q����Ƃ��ɁA���̃��W�b�N�� |
|
| 961 |
-�f�[�^�x�[�X�̃e�[�u���ɂ����邱�Ƃ́ARDBMS�𗘗p���� |
|
| 962 |
-���f���ł���A�R�[�h�̏d�����Ȃ� |
|
| 963 |
-�킩��₷����̂ɂȂ�܂��B |
|
| 964 |
- |
|
| 965 |
-�e�[�u���I�u�W�F�N�g������ɂ�C<table()>��g�p���܂��B |
|
| 987 |
+You can create table object to access table in database. |
|
| 988 |
+use C<tabel()> to create table object. |
|
| 966 | 989 |
|
| 967 | 990 |
my $table = $dbi->table('book');
|
| 968 | 991 |
|
| 969 |
-��ۂɃf�[�^�x�[�X�Ƀe�[�u���͑��݂��Ă���K�v�͂���܂���B |
|
| 970 |
-����͉��z�I�ȃe�[�u���I�u�W�F�N�g�ł��B����� |
|
| 971 |
-L<DBIx::Customm::Table>�I�u�W�F�N�g�ɂȂ�܂��B |
|
| 972 |
- |
|
| 973 |
-�e�[�u���I�u�W�F�N�g�����C<insert()>�AC<update()>�AC<update_all()>�A |
|
| 974 |
-C<delete()>�AC<delete_all()>�AC<select()>�Ȃǂ̃��\�b�h�Ăяo�����Ƃ��ł��܂��B |
|
| 975 |
-L<DBIx::Custom>�ƈقȂ�Ƃ���́AC<table>��K������w�肷��K�v�� |
|
| 976 |
-�Ȃ��Ƃ������Ƃł��B |
|
| 992 |
+Return value is L<DBIx::Custom::Table>. |
|
| 993 |
+From table object, you can call C<insert()>, C<update()>, C<update_all()>�A |
|
| 994 |
+C<delete()>, C<delete_all()>, C<select()>. |
|
| 995 |
+You don't have to specify table name. |
|
| 977 | 996 |
|
| 978 | 997 |
$table->insert(param => $param); |
| 979 | 998 |
|
| 980 |
-C<table���̒l�͎����I��book�ɐݒ肳��܂��B |
|
| 981 |
- |
|
| 982 |
-�܂��e�[�u���I�u�W�F�N�g�ɂ͓Ǝ��̃��\�b�h��lj���邱�Ƃ��ł��܂��B |
|
| 999 |
+You can add any method to table object. |
|
| 983 | 1000 |
|
| 984 | 1001 |
$table->method( |
| 985 | 1002 |
register => sub {
|
| 986 | 1003 |
my $self = shift; |
| 987 | 1004 |
my $table_name = $self->name; |
| 988 |
- # something |
|
| 1005 |
+ # ... |
|
| 989 | 1006 |
}, |
| 990 |
- list => sub {
|
|
| 991 |
- my $self = shift; |
|
| 992 |
- my $table_name = $self->name; |
|
| 993 |
- # something |
|
| 994 |
- } |
|
| 1007 |
+ list => sub { ... }
|
|
| 995 | 1008 |
); |
| 996 | 1009 |
|
| 997 |
-���\�b�h�ɓn���������L<DBIx::Custom::Table>�I�u�W�F�N�g�ł��B |
|
| 998 |
-C<name()>��g�p���āA�e�[�u������擾���邱�Ƃ��ł��܂��B |
|
| 1010 |
+You can get table name by C<name()>. |
|
| 999 | 1011 |
|
| 1000 |
-���̂悤�ɂ��ēo�^�������\�b�h�͒��ڌĂяo�����Ƃ��ł��܂��B |
|
| 1012 |
+You can call these method from table object. |
|
| 1001 | 1013 |
|
| 1002 | 1014 |
$table->register(...); |
| 1003 | 1015 |
$table->list(...); |
| 1004 | 1016 |
|
| 1005 |
-�܂��e�[�u����p�̃��\�b�h��I�[�o�[���C�h���č쐬���邱�Ƃ�ł��܂��B |
|
| 1017 |
+=head2 Use L<DBIx::Custom> and <DBI> methods |
|
| 1006 | 1018 |
|
| 1007 |
- $table->method( |
|
| 1008 |
- insert => sub {
|
|
| 1009 |
- my $self = shift; |
|
| 1010 |
- |
|
| 1011 |
- $self->base_insert(...); |
|
| 1012 |
- |
|
| 1013 |
- # something |
|
| 1014 |
- } |
|
| 1015 |
- ); |
|
| 1019 |
+You can call all methods of L<DBIx::Custom> and L<DBI> |
|
| 1016 | 1020 |
|
| 1017 |
-��Ƃ�Ƒ��݂��Ă���C<insert()>��ĂԂɂ�C<base_$method>�Ƃ��܂��BL<DBIx::Custom::Table> |
|
| 1018 |
-�̃I�[�o�[���C�h�̋@�\�͊ȈՓI�Ȃ�̂ł����A�ƂĂ�֗��ł��B |
|
| 1021 |
+ # DBIx::Custom method |
|
| 1022 |
+ $table->execute($sql); |
|
| 1023 |
+ |
|
| 1024 |
+ # DBI method |
|
| 1025 |
+ $table->begin_work; |
|
| 1026 |
+ $table->commit; |
|
| 1019 | 1027 |
|
| 1020 |
-=head2 �e�[�u���ŋ��L�̃��\�b�h�̓o�^ |
|
| 1028 |
+=head2 Add table shared method |
|
| 1021 | 1029 |
|
| 1022 |
-���ׂẴe�[�u���Ń��\�b�h��L����ɂ�C<table>���\�b�h�Ńe�[�u����쐬����O�ɁA |
|
| 1023 |
-C<base_table>�Ƀ��\�b�h��o�^���Ă����܂��B |
|
| 1030 |
+To share methods in all tables, |
|
| 1031 |
+add method to base table. |
|
| 1032 |
+You can get base table by C<base_table()>. |
|
| 1024 | 1033 |
|
| 1025 | 1034 |
$dbi->base_table->method( |
| 1026 | 1035 |
count => sub {
|
| ... | ... |
@@ -1029,19 +1038,27 @@ C<base_table> |
| 1029 | 1038 |
} |
| 1030 | 1039 |
); |
| 1031 | 1040 |
|
| 1032 |
-�܂��e�[�u�������L<DBIx::Custom>��L<DBI>�̂��ׂẴ��\�b�h��Ăяo�����Ƃ��ł��܂��B |
|
| 1041 |
+This method is used by all talbes. |
|
| 1033 | 1042 |
|
| 1034 |
- # DBIx::Custom method |
|
| 1035 |
- $table->execute($sql); |
|
| 1036 |
- |
|
| 1037 |
- # DBI method |
|
| 1038 |
- $table->begin_work; |
|
| 1039 |
- $table->commit; |
|
| 1043 |
+ $dbi->table('book')->count(...);
|
|
| 1040 | 1044 |
|
| 1041 |
-=head2 ��ʓI�ȃ��f���̍\�� |
|
| 1045 |
+Even if same method name is added to table, |
|
| 1046 |
+You can use base table method by C<base_METHOD()>. |
|
| 1042 | 1047 |
|
| 1043 |
-��ʓI�ɂ́AL<DBIx::Custom>��p�����ăR���X�g���N�^�̒��ɁA���f����쐬 |
|
| 1044 |
-����̂��悢�ł��傤�B |
|
| 1048 |
+ $table->method( |
|
| 1049 |
+ count => sub {
|
|
| 1050 |
+ my $self = shift; |
|
| 1051 |
+ |
|
| 1052 |
+ $self->base_count(...); |
|
| 1053 |
+ |
|
| 1054 |
+ # ... |
|
| 1055 |
+ } |
|
| 1056 |
+ ); |
|
| 1057 |
+ |
|
| 1058 |
+=head2 Model example |
|
| 1059 |
+ |
|
| 1060 |
+Generally, it is good to create model in constructor |
|
| 1061 |
+in the class extending L<DBIx::Custom>. |
|
| 1045 | 1062 |
|
| 1046 | 1063 |
package MyDBI; |
| 1047 | 1064 |
|
| ... | ... |
@@ -1051,82 +1068,63 @@ C<base_table> |
| 1051 | 1068 |
my $self = shift->SUPER::connect(@_); |
| 1052 | 1069 |
|
| 1053 | 1070 |
$self->base_table->method( |
| 1054 |
- ... => sub { ... }
|
|
| 1071 |
+ delete_multi => sub { ... }
|
|
| 1055 | 1072 |
); |
| 1056 | 1073 |
|
| 1057 | 1074 |
$self->table('book')->method(
|
| 1058 |
- insert_multi => sub { ... },
|
|
| 1059 |
- ... => sub { ... }
|
|
| 1075 |
+ register => sub { ... },
|
|
| 1076 |
+ remove => sub { ... },
|
|
| 1060 | 1077 |
); |
| 1061 | 1078 |
|
| 1062 | 1079 |
$self->table('company')->method(
|
| 1063 |
- ... => sub { ... },
|
|
| 1080 |
+ register => sub { ... },
|
|
| 1081 |
+ remove => sub { ... },
|
|
| 1064 | 1082 |
); |
| 1065 | 1083 |
} |
| 1066 | 1084 |
|
| 1067 |
-���̂悤�ɂ��Ē�`���Ă����A���̂悤�ɗ��p���邱�Ƃ��ł��܂��B |
|
| 1085 |
+You can use this class in the following way. |
|
| 1068 | 1086 |
|
| 1069 | 1087 |
my $dbi = MyDBI->connect(...); |
| 1070 |
- $dbi->table('book')->insert_multi(...);
|
|
| 1071 |
- |
|
| 1072 |
-=head2 8. �p�t�H�[�}���X�̉�P |
|
| 1073 |
- |
|
| 1074 |
-=head3 �N�G���̍쐬 |
|
| 1088 |
+ $dbi->table('book')->delete_multi(...);
|
|
| 1075 | 1089 |
|
| 1076 |
-��C<insert()>���\�b�h��g�p���ăC���T�[�g���s�����ꍇ�A |
|
| 1077 |
-�K�v�ȃp�t�H�[�}���X���Ȃ��ꍇ�����邩����܂���B |
|
| 1078 |
-C<insert()>���\�b�h�́ASQL���ƃX�e�[�g�����g�n���h���� |
|
| 1079 |
-����쐬���邽�߂ł��B |
|
| 1090 |
+=head2 8. Improve performance |
|
| 1080 | 1091 |
|
| 1081 |
-���̂悤�ȏꍇ�́AC<query>�I�v�V������w�肷�邱�ƂŁA |
|
| 1082 |
-�N�G����擾���邱�Ƃ��ł��܂��B |
|
| 1092 |
+=head3 Create query |
|
| 1083 | 1093 |
|
| 1084 |
- my $query = $dbi->insert(table => 'book', param => $param, query => 1); |
|
| 1094 |
+If you can't get performance, create query by C<query> option. |
|
| 1095 |
+For example, many insert is needed. |
|
| 1085 | 1096 |
|
| 1086 |
-�܂�C<create_query()>���\�b�h��g��ĔC�ӂ�SQL�̃N�G����쐬 |
|
| 1087 |
-���邱�Ƃ�ł��܂��B |
|
| 1088 |
- |
|
| 1089 |
- my $query = $dbi->create_query( |
|
| 1090 |
- "insert into book {insert_param title author};";
|
|
| 1091 |
- ); |
|
| 1097 |
+ my $params = [ |
|
| 1098 |
+ {title => 'Perl', author => 'Ken'},
|
|
| 1099 |
+ {title => 'Good day', author => 'Tom'}
|
|
| 1100 |
+ ] |
|
| 1101 |
+ my $query = $dbi->insert(table => 'book', param => $params->[0], query => 1); |
|
| 1092 | 1102 |
|
| 1093 |
-�߂�l��L<DBIx::Custom::Query>�I�u�W�F�N�g�ł��B |
|
| 1094 |
-���̃I�u�W�F�N�g��SQL���ƃp�����[�^�o�C���h���̗� |
|
| 1095 |
-�ێ����Ă��܂��B�܂��X�e�[�g�����g�n���h����ێ����Ă��܂��B |
|
| 1103 |
+Return value is L<DBIx::Custom::Query> object. |
|
| 1104 |
+This query is executed by C<execute()>. |
|
| 1096 | 1105 |
|
| 1097 |
- {
|
|
| 1098 |
- sql => 'insert into book (title, author) values (?, ?);', |
|
| 1099 |
- columns => ['title', 'author'], |
|
| 1100 |
- sth => $sth |
|
| 1106 |
+ foreach my $param (@$params) {
|
|
| 1107 |
+ $dbi->execute($query, $param); |
|
| 1101 | 1108 |
} |
| 1102 | 1109 |
|
| 1103 |
-�N�G���I�u�W�F�N�g��g��ČJ��Ԃ���s����ɂ�C<execute()>��g�p���܂��B |
|
| 1104 |
- |
|
| 1105 |
- my $params = [ |
|
| 1106 |
- {title => 'Perl', author => 'Ken'},
|
|
| 1107 |
- {title => 'Good days', author => 'Mike'}
|
|
| 1108 |
- ]; |
|
| 1109 |
- |
|
| 1110 |
- foreach my $param (@$paramss) {
|
|
| 1111 |
- $dbi->execute($query, table => 'book', param => $input); |
|
| 1112 |
- } |
|
| 1110 |
+Performance is improved because statement handle is reused |
|
| 1111 |
+C<query> option is used in C<insert()>, C<update()>, C<update_all()>, |
|
| 1112 |
+C<delete()>, C<delete_all()>. |
|
| 1113 |
+ |
|
| 1114 |
+Note that parameters count is same as method for creating query and C<execute()>. |
|
| 1113 | 1115 |
|
| 1114 |
-C<execute>���\�b�h�̑���ɃN�G���I�u�W�F�g��n�����Ƃ��ł��܂��B |
|
| 1115 |
-C<insert()>���\�b�h�������ł��B |
|
| 1116 |
+You can create query from any SQL by C<create_query()>. |
|
| 1116 | 1117 |
|
| 1117 |
-���ӓ_������������܂��B����̓p�����[�^�̐��͕K�������łȂ��Ă͂Ȃ�Ȃ� |
|
| 1118 |
-�Ƃ������Ƃł��B�ŏ���3�̃p�����[�^������n�����̂ɁA���̎�s�ł� |
|
| 1119 |
-��̃p�����[�^��n���Ɨ\��Ȃ����ʂɂȂ�܂��B����� |
|
| 1120 |
-���I�ɐ������ꂽSQL�Ɋ܂܂��v���[�X�z���_�̐����قȂ邩��ł��B |
|
| 1121 |
-�܂�C<execute()>�ɂ��Ă͎����I�ɂ̓t�B���^���L��ɂȂ�Ȃ��̂ŁA |
|
| 1122 |
-C<table>��w�肷��K�v�̂��邱�Ƃɒ��ӂ��Ă��������B |
|
| 1123 |
-�{���ɕK�v�ȏꍇ�������p���Ă��������B
|
|
| 1118 |
+ my $query = $dbi->create_query( |
|
| 1119 |
+ "insert into book {insert_param title author};";
|
|
| 1120 |
+ ); |
|
| 1124 | 1121 |
|
| 1125 |
-=head2 9. ���̑��̋@�\ |
|
| 1122 |
+=head2 9. Other features |
|
| 1126 | 1123 |
|
| 1127 |
-=head3 ���\�b�h�̓o�^ |
|
| 1124 |
+=head3 Add method |
|
| 1128 | 1125 |
|
| 1129 |
-���\�b�h��o�^����ɂ�C<method()>��g�p���܂��B |
|
| 1126 |
+You can add method to L<DBIx::Custom> object. |
|
| 1127 |
+use C<method(). |
|
| 1130 | 1128 |
|
| 1131 | 1129 |
$dbi->method( |
| 1132 | 1130 |
update_or_insert => sub {
|
| ... | ... |
@@ -1139,15 +1137,14 @@ C<table> |
| 1139 | 1137 |
} |
| 1140 | 1138 |
); |
| 1141 | 1139 |
|
| 1142 |
-<method()>�œo�^�������\�b�h�� |
|
| 1143 |
-L<DBIx::Custom>�I�u�W�F�N�g���璼�ڌĂяo�����Ƃ��ł��܂��B |
|
| 1140 |
+You can call these methods from L<DBIx::Custom> object. |
|
| 1144 | 1141 |
|
| 1145 | 1142 |
$dbi->update_or_insert; |
| 1146 | 1143 |
$dbi->find_or_create; |
| 1147 | 1144 |
|
| 1148 |
-=head3 ���ʃN���X�̕ύX |
|
| 1145 |
+=head3 Change result class |
|
| 1149 | 1146 |
|
| 1150 |
-�K�v�Ȃ�Ό��ʃN���X��ύX���邱�Ƃ��ł��܂��B |
|
| 1147 |
+You can change result class. By default it is L<DBIx::Custom::Result>. |
|
| 1151 | 1148 |
|
| 1152 | 1149 |
package MyResult; |
| 1153 | 1150 |
use base 'DBIx::Custom::Result'; |
| ... | ... |
@@ -1165,16 +1162,14 @@ L<DBIx::Custom> |
| 1165 | 1162 |
|
| 1166 | 1163 |
=head3 �L���b�V���O |
| 1167 | 1164 |
|
| 1168 |
-�^�O�̓W�J���SQL�̓p�t�H�[�}���X�̗��R�̂��߂ɃL���b�V������܂��B |
|
| 1169 |
-�����C<chace>�Őݒ�ł��A�f�t�H���g�ł̓L���b�V����s���ݒ�ł��B |
|
| 1165 |
+SQL after parsing tag is cached for performance. |
|
| 1166 |
+You can set C<cache()>. By default, chaching is true. |
|
| 1170 | 1167 |
|
| 1171 | 1168 |
$dbi->cache(1); |
| 1172 | 1169 |
|
| 1173 |
-�L���b�V����@��C<cache_method>�Ƀ��\�b�h��w�肷�邱�Ƃ� |
|
| 1174 |
-�ύX���邱�Ƃ��ł��܂��B |
|
| 1175 |
-�f�[�^�̕ۑ��Ǝ擾�̂��߂̃��\�b�h���`���܂��B |
|
| 1176 |
- |
|
| 1177 |
-�f�t�H���g�ł͎��̂悤�Ƀ�������ɃL���b�V����s����̂ɂȂ�Ă��܂��B |
|
| 1170 |
+The way to cache is changed by C<cache_method()>. |
|
| 1171 |
+Default method is the following one. |
|
| 1172 |
+Cache is saved to memory. |
|
| 1178 | 1173 |
|
| 1179 | 1174 |
$dbi->cache_method(sub {
|
| 1180 | 1175 |
sub {
|
| ... | ... |
@@ -1183,28 +1178,27 @@ L<DBIx::Custom> |
| 1183 | 1178 |
$self->{_cached} ||= {};
|
| 1184 | 1179 |
|
| 1185 | 1180 |
if (@_ > 1) {
|
| 1186 |
- # Set |
|
| 1181 |
+ # Save cache |
|
| 1187 | 1182 |
$self->{_cached}{$_[0]} = $_[1]
|
| 1188 | 1183 |
} |
| 1189 | 1184 |
else {
|
| 1190 |
- # Get |
|
| 1185 |
+ # Get cache |
|
| 1191 | 1186 |
return $self->{_cached}{$_[0]}
|
| 1192 | 1187 |
} |
| 1193 | 1188 |
} |
| 1194 | 1189 |
}); |
| 1195 | 1190 |
|
| 1196 |
-����L<DBIx::Custom>�I�u�W�F�N�g�ł��B |
|
| 1197 |
-����̓^�O�̓W�J�����O��SQL�ł��B |
|
| 1198 |
-��O��̓^�O�̓W�J���SQL�ł��B |
|
| 1199 |
- |
|
| 1200 |
-�����ō쐬����ꍇ�͑�O�����݂����ꍇ�̓L���b�V����ݒ肵�A |
|
| 1201 |
-���݂��Ȃ�����ꍇ�̓L���b�V����擾�������� |
|
| 1202 |
-�����������B |
|
| 1191 |
+First argument is L<DBIx::Custom> object. |
|
| 1192 |
+Second argument is SQL before parsing. |
|
| 1193 |
+Third argument is SQL information after parsing. This is hash reference. |
|
| 1203 | 1194 |
|
| 1204 |
-=cut |
|
| 1195 |
+If third argument exists, you save cache, |
|
| 1196 |
+and if third argument isn't exists, you get chace. |
|
| 1205 | 1197 |
|
| 1206 | 1198 |
=head1 EXAMPLES |
| 1207 | 1199 |
|
| 1200 |
+You can see exsamples in the following wiki. |
|
| 1201 |
+ |
|
| 1208 | 1202 |
L<DBIx::Custom Wiki|https://github.com/yuki-kimoto/DBIx-Custom/wiki> - Many useful examples |
| 1209 | 1203 |
|
| 1210 | 1204 |
=cut |
| ... | ... |
@@ -348,6 +348,19 @@ C<append>はSQLの末尾に追加される文字列です。 |
| 348 | 348 |
またC<append>は、C<select>だけでなくC<insert()>、C<update()>、C<update_all()> |
| 349 | 349 |
C<delete()>、C<delete_all()>、C<select()>で使用することもできます。 |
| 350 | 350 |
|
| 351 |
+C<column>とC<table>を使用する代わりに、C<selection>を使用することも |
|
| 352 |
+できます。列名とテーブル名をまとめて指定する場合に利用します。 |
|
| 353 |
+ |
|
| 354 |
+ my $selection = <<"EOS"; |
|
| 355 |
+ title, author, company_name |
|
| 356 |
+ from book inner join company on book.company_id = company.id |
|
| 357 |
+ EOS |
|
| 358 |
+ |
|
| 359 |
+ $dbi->select(selection => $selection); |
|
| 360 |
+ |
|
| 361 |
+C<selection>においてはwhere句を利用できないということに注意してください。 |
|
| 362 |
+"inner join"などの句を利用してください。 |
|
| 363 |
+ |
|
| 351 | 364 |
=head3 SQLの実行 C<execute()> |
| 352 | 365 |
|
| 353 | 366 |
SQLを実行するにはC<execute()>を使用します。 |
| ... | ... |
@@ -575,6 +588,19 @@ L<Time::Piece>オブジェクトに変換されます。 |
| 575 | 588 |
where => {'book.title' => 'Perl', 'book.author' => 'Ken'}
|
| 576 | 589 |
); |
| 577 | 590 |
|
| 591 |
+フェッチを行う場合に"TABLE__COLUMN"という名前を使用した場合もフィルタは |
|
| 592 |
+有効になります。 |
|
| 593 |
+ |
|
| 594 |
+ my $result = $dbi->execute( |
|
| 595 |
+ "select issue_date as book__issue_date from book"); |
|
| 596 |
+ |
|
| 597 |
+C<in>フィルタの後に実行されるC<end>フィルタを適用することもできます。 |
|
| 598 |
+ |
|
| 599 |
+ $dbi->apply_filter('book',
|
|
| 600 |
+ issue_date => {out => 'tp_to_date', in => 'date_to_tp',
|
|
| 601 |
+ end => 'tp_to_displaydate'}, |
|
| 602 |
+ ); |
|
| 603 |
+ |
|
| 578 | 604 |
=head3 個別のフィルタ C<filter> |
| 579 | 605 |
|
| 580 | 606 |
個別にフィルタを適用することもできます。 |
| ... | ... |
@@ -693,13 +719,20 @@ C<execute()>においてもC<filter>を指定することができます。 |
| 693 | 719 |
C<execute>ではC<apply_filter()>で適用されたフィルタ |
| 694 | 720 |
は有効ではないということに注意してください。 |
| 695 | 721 |
C<apply_filter()>で適用されたフィルタを有効にするには、 |
| 696 |
-C<table>を指定する必要があります。 |
|
| 722 |
+C<table>タグを利用します。 |
|
| 697 | 723 |
|
| 698 |
- $dbi->execute($sql, param => {title => 'Perl', author => '%Ken%'}
|
|
| 699 |
- table => ['book']); |
|
| 724 |
+ my $sql = "select * from {table book} where {= author} and {like title};"
|
|
| 700 | 725 |
|
| 701 | 726 |
=head3 タグ一覧 |
| 702 | 727 |
|
| 728 |
+=head4 C<table> |
|
| 729 |
+ |
|
| 730 |
+ {table NAME} -> NAME
|
|
| 731 |
+ |
|
| 732 |
+これはSQLの中でテーブル名を指定する場合に利用します。 |
|
| 733 |
+テーブル名を指定することによって、C<apply_filter()> |
|
| 734 |
+によるフィルタリングが有効になります。 |
|
| 735 |
+ |
|
| 703 | 736 |
=head4 C<?> |
| 704 | 737 |
|
| 705 | 738 |
{? NAME} -> ?
|
| ... | ... |
@@ -957,36 +990,25 @@ C<execute()>との連携です。SQLを作成するときに埋め込むこと |
| 957 | 990 |
|
| 958 | 991 |
$dbi->execute($sql, param => $param); |
| 959 | 992 |
|
| 960 |
-=head2 7. テーブルモデル |
|
| 993 |
+=head2 7. テーブルオブジェクト |
|
| 961 | 994 |
|
| 962 | 995 |
=head3 テーブルオブジェクトの作成 C<table()> |
| 963 | 996 |
|
| 964 |
-L<DBIx::Custom>はロジックとしてテーブルを中心にすえた |
|
| 965 |
-モデルの作成を支援します。 |
|
| 966 |
- |
|
| 967 |
-アプリケーションのロジックを記述するときに、そのロジックを |
|
| 968 |
-データベースのテーブルにすえることは、RDBMSを利用する |
|
| 969 |
-モデルであれば、コードの重複も少なく |
|
| 970 |
-わかりやすいものになります。 |
|
| 997 |
+データベースのテーブルにアクセスするための |
|
| 998 |
+テーブルオブジェクトを作成することができます。 |
|
| 971 | 999 |
|
| 972 | 1000 |
テーブルオブジェクトを生成するにはC<table()>を使用します。 |
| 973 | 1001 |
|
| 974 | 1002 |
my $table = $dbi->table('book');
|
| 975 | 1003 |
|
| 976 |
-実際にデータベースにテーブルは存在している必要はありません。 |
|
| 977 |
-これは仮想的なテーブルオブジェクトです。これは |
|
| 978 |
-L<DBIx::Customm::Table>オブジェクトになります。 |
|
| 979 |
- |
|
| 1004 |
+戻り値はL<DBIx::Custom::Table>オブジェクトです。 |
|
| 980 | 1005 |
テーブルオブジェクトからはC<insert()>、C<update()>、C<update_all()>、 |
| 981 | 1006 |
C<delete()>、C<delete_all()>、C<select()>などのメソッド呼び出すことができます。 |
| 982 |
-L<DBIx::Custom>と異なるところは、C<table>を必ずしも指定する必要が |
|
| 983 |
-ないということです。 |
|
| 1007 |
+C<table>を指定する必要はありません。 |
|
| 984 | 1008 |
|
| 985 | 1009 |
$table->insert(param => $param); |
| 986 | 1010 |
|
| 987 |
-C<table>の値は自動的にbookに設定されます。 |
|
| 988 |
- |
|
| 989 |
-またテーブルオブジェクトには独自のメソッドを追加することができます。 |
|
| 1011 |
+テーブルオブジェクトには任意のメソッドを追加することができます。 |
|
| 990 | 1012 |
|
| 991 | 1013 |
$table->method( |
| 992 | 1014 |
register => sub {
|
| ... | ... |
@@ -994,40 +1016,32 @@ C<table>の値は自動的にbookに設定されます。 |
| 994 | 1016 |
my $table_name = $self->name; |
| 995 | 1017 |
# something |
| 996 | 1018 |
}, |
| 997 |
- list => sub {
|
|
| 998 |
- my $self = shift; |
|
| 999 |
- my $table_name = $self->name; |
|
| 1000 |
- # something |
|
| 1001 |
- } |
|
| 1019 |
+ list => sub { ... },
|
|
| 1002 | 1020 |
); |
| 1003 | 1021 |
|
| 1004 |
-メソッドに渡される第一引数はL<DBIx::Custom::Table>オブジェクトです。 |
|
| 1005 | 1022 |
C<name()>を使用して、テーブル名を取得することができます。 |
| 1006 | 1023 |
|
| 1007 |
-このようにして登録したメソッドは直接呼び出すことができます。 |
|
| 1024 |
+このようにして登録したメソッドはテーブルオブジェクトから呼び出すことができます。 |
|
| 1008 | 1025 |
|
| 1009 | 1026 |
$table->register(...); |
| 1010 | 1027 |
$table->list(...); |
| 1011 | 1028 |
|
| 1012 |
-またテーブル専用のメソッドをオーバーライドして作成することもできます。 |
|
| 1029 |
+=head2 L<DBIx::Custom>と<DBI>のメソッドの利用 |
|
| 1013 | 1030 |
|
| 1014 |
- $table->method( |
|
| 1015 |
- insert => sub {
|
|
| 1016 |
- my $self = shift; |
|
| 1017 |
- |
|
| 1018 |
- $self->base_insert(...); |
|
| 1019 |
- |
|
| 1020 |
- # something |
|
| 1021 |
- } |
|
| 1022 |
- ); |
|
| 1031 |
+テーブルからはL<DBIx::Custom>とL<DBI>のすべてのメソッドを呼び出すことができます。 |
|
| 1023 | 1032 |
|
| 1024 |
-もともと存在していたC<insert()>を呼ぶにはC<base_$method>とします。L<DBIx::Custom::Table> |
|
| 1025 |
-のオーバーライドの機能は簡易的なものですが、とても便利です。 |
|
| 1033 |
+ # DBIx::Custom method |
|
| 1034 |
+ $table->execute($sql); |
|
| 1035 |
+ |
|
| 1036 |
+ # DBI method |
|
| 1037 |
+ $table->begin_work; |
|
| 1038 |
+ $table->commit; |
|
| 1026 | 1039 |
|
| 1027 |
-=head2 テーブルで共有のメソッドの登録 |
|
| 1040 |
+=head2 テーブルで共有のメソッドの追加 |
|
| 1028 | 1041 |
|
| 1029 |
-すべてのテーブルでメソッドを共有するにはC<table>メソッドでテーブルを作成する前に、 |
|
| 1030 |
-C<base_table>にメソッドを登録しておきます。 |
|
| 1042 |
+すべてのテーブルでメソッドを共有するには |
|
| 1043 |
+ベーステーブルにメソッドを登録します。 |
|
| 1044 |
+ベーステーブルを取得するにはC<base_table>を使用します。 |
|
| 1031 | 1045 |
|
| 1032 | 1046 |
$dbi->base_table->method( |
| 1033 | 1047 |
count => sub {
|
| ... | ... |
@@ -1036,16 +1050,24 @@ C<base_table>にメソッドを登録しておきます。 |
| 1036 | 1050 |
} |
| 1037 | 1051 |
); |
| 1038 | 1052 |
|
| 1039 |
-またテーブルからはL<DBIx::Custom>とL<DBI>のすべてのメソッドを呼び出すことができます。 |
|
| 1053 |
+このメソッドはすべてのテーブルから利用することができます。 |
|
| 1040 | 1054 |
|
| 1041 |
- # DBIx::Custom method |
|
| 1042 |
- $table->execute($sql); |
|
| 1043 |
- |
|
| 1044 |
- # DBI method |
|
| 1045 |
- $table->begin_work; |
|
| 1046 |
- $table->commit; |
|
| 1055 |
+ $dbi->table('book')->count(...);
|
|
| 1047 | 1056 |
|
| 1048 |
-=head2 一般的なモデルの構成 |
|
| 1057 |
+また同名のメソッドをテーブルに追加して、ベーステーブルの |
|
| 1058 |
+メソッドを利用したい場合はC<base_METHOD()>と記述します。 |
|
| 1059 |
+ |
|
| 1060 |
+ $table->method( |
|
| 1061 |
+ count => sub {
|
|
| 1062 |
+ my $self = shift; |
|
| 1063 |
+ |
|
| 1064 |
+ $self->base_count(...); |
|
| 1065 |
+ |
|
| 1066 |
+ # ... |
|
| 1067 |
+ } |
|
| 1068 |
+ ); |
|
| 1069 |
+ |
|
| 1070 |
+=head2 モデルのサンプル |
|
| 1049 | 1071 |
|
| 1050 | 1072 |
一般的には、L<DBIx::Custom>を継承してコンストラクタの中に、モデルを作成 |
| 1051 | 1073 |
するのがよいでしょう。 |
| ... | ... |
@@ -1058,82 +1080,69 @@ C<base_table>にメソッドを登録しておきます。 |
| 1058 | 1080 |
my $self = shift->SUPER::connect(@_); |
| 1059 | 1081 |
|
| 1060 | 1082 |
$self->base_table->method( |
| 1061 |
- ... => sub { ... }
|
|
| 1083 |
+ delete_multi => sub { ... }
|
|
| 1062 | 1084 |
); |
| 1063 | 1085 |
|
| 1064 | 1086 |
$self->table('book')->method(
|
| 1065 |
- insert_multi => sub { ... },
|
|
| 1066 |
- ... => sub { ... }
|
|
| 1087 |
+ register => sub { ... },
|
|
| 1088 |
+ remove => sub { ... },
|
|
| 1067 | 1089 |
); |
| 1068 | 1090 |
|
| 1069 | 1091 |
$self->table('company')->method(
|
| 1070 |
- ... => sub { ... },
|
|
| 1092 |
+ register => sub { ... },
|
|
| 1093 |
+ remove => sub { ... },
|
|
| 1071 | 1094 |
); |
| 1072 | 1095 |
} |
| 1073 | 1096 |
|
| 1074 |
-このようにして定義しておけば、次のように利用することができます。 |
|
| 1097 |
+次のようにこのクラスを利用することができます。 |
|
| 1075 | 1098 |
|
| 1076 | 1099 |
my $dbi = MyDBI->connect(...); |
| 1077 |
- $dbi->table('book')->insert_multi(...);
|
|
| 1100 |
+ $dbi->table('book')->delete_multi(...);
|
|
| 1101 |
+ $dbi->table('book')->register(...);
|
|
| 1078 | 1102 |
|
| 1079 | 1103 |
=head2 8. パフォーマンスの改善 |
| 1080 | 1104 |
|
| 1081 | 1105 |
=head3 クエリの作成 |
| 1082 | 1106 |
|
| 1083 |
-もしC<insert()>メソッドを使用してインサートを実行した場合、 |
|
| 1084 |
-必要なパフォーマンスを得られない場合があるかもしれません。 |
|
| 1085 |
-C<insert()>メソッドは、SQL文とステートメントハンドルを |
|
| 1086 |
-毎回作成するためです。 |
|
| 1107 |
+パフォーマンスが得られない場合はC<query>オプションを使って |
|
| 1108 |
+クエリを作成してみてください。 |
|
| 1087 | 1109 |
|
| 1088 |
-そのような場合は、C<query>オプションを指定することで、 |
|
| 1089 |
-クエリを取得することができます。 |
|
| 1110 |
+ my $params = [ |
|
| 1111 |
+ {title => 'Perl', author => 'Ken'},
|
|
| 1112 |
+ {title => 'Good day', author => 'Tom'}
|
|
| 1113 |
+ ] |
|
| 1114 |
+ my $query = $dbi->insert(table => 'book', param => $params->[0], query => 1); |
|
| 1090 | 1115 |
|
| 1091 |
- my $query = $dbi->insert(table => 'book', param => $param, query => 1); |
|
| 1116 |
+戻り値はL<DBIx::Custom::Query>オブジェクトです。 |
|
| 1117 |
+作成したクエリはC<execute()>で実行することができます。 |
|
| 1092 | 1118 |
|
| 1093 |
-またC<create_query()>メソッドを使って任意のSQLのクエリを作成 |
|
| 1119 |
+ foreach my $param (@$params) {
|
|
| 1120 |
+ $dbi->execute($query, $param); |
|
| 1121 |
+ } |
|
| 1122 |
+ |
|
| 1123 |
+ステートメントハンドルが再利用されるので、パフォーマンスが |
|
| 1124 |
+改善されます。 |
|
| 1125 |
+C<query>オプションはC<insert()>, C<update()>, C<update_all()>, |
|
| 1126 |
+C<delete()>, C<delete_all()>で利用することができます. |
|
| 1127 |
+ |
|
| 1128 |
+クエリを作成するメソッドに渡すパラメータと |
|
| 1129 |
+C<execute()>に渡すパラメータの個数は同じでなければならない |
|
| 1130 |
+ことに注意してください。 |
|
| 1131 |
+ |
|
| 1132 |
+C<create_query()>を使って任意のSQLのクエリを作成 |
|
| 1094 | 1133 |
することもできます。 |
| 1095 | 1134 |
|
| 1096 | 1135 |
my $query = $dbi->create_query( |
| 1097 | 1136 |
"insert into book {insert_param title author};";
|
| 1098 | 1137 |
); |
| 1099 | 1138 |
|
| 1100 |
-戻り値はL<DBIx::Custom::Query>オブジェクトです。 |
|
| 1101 |
-このオブジェクトはSQL文とパラメータバインド時の列名を |
|
| 1102 |
-保持しています。またステートメントハンドルも保持しています。 |
|
| 1103 |
- |
|
| 1104 |
- {
|
|
| 1105 |
- sql => 'insert into book (title, author) values (?, ?);', |
|
| 1106 |
- columns => ['title', 'author'], |
|
| 1107 |
- sth => $sth |
|
| 1108 |
- } |
|
| 1109 |
- |
|
| 1110 |
-クエリオブジェクトを使って繰り返し実行するにはC<execute()>を使用します。 |
|
| 1111 |
- |
|
| 1112 |
- my $params = [ |
|
| 1113 |
- {title => 'Perl', author => 'Ken'},
|
|
| 1114 |
- {title => 'Good days', author => 'Mike'}
|
|
| 1115 |
- ]; |
|
| 1116 |
- |
|
| 1117 |
- foreach my $param (@$paramss) {
|
|
| 1118 |
- $dbi->execute($query, table => 'book', param => $input); |
|
| 1119 |
- } |
|
| 1120 |
- |
|
| 1121 |
-C<execute>メソッドの第一引数にクエリオブジェトを渡すことができます。 |
|
| 1122 |
-C<insert()>メソッドよりも高速です。 |
|
| 1123 |
- |
|
| 1124 |
-注意点がいくつかあります。それはパラメータの数は必ず同じでなくてはならない |
|
| 1125 |
-ということです。最初に3つのパラメータだけを渡したのに、次の実行では |
|
| 1126 |
-二つのパラメータを渡すと予期しない結果になります。それは |
|
| 1127 |
-動的に生成されたSQLに含まれるプレースホルダの数が異なるからです。 |
|
| 1128 |
-またC<execute()>によっては自動的にはフィルタが有効にならないので、 |
|
| 1129 |
-C<table>を指定する必要のあることに注意してください。 |
|
| 1130 |
-本当に必要な場合だけ利用してください。 |
|
| 1131 | 1139 |
|
| 1132 | 1140 |
=head2 9. その他の機能 |
| 1133 | 1141 |
|
| 1134 | 1142 |
=head3 メソッドの登録 |
| 1135 | 1143 |
|
| 1136 |
-メソッドを登録するにはC<method()>を使用します。 |
|
| 1144 |
+D<DBIx::Custom>オブジェクトにメソッドを追加することができます。 |
|
| 1145 |
+C<method()>を使用します。 |
|
| 1137 | 1146 |
|
| 1138 | 1147 |
$dbi->method( |
| 1139 | 1148 |
update_or_insert => sub {
|
| ... | ... |
@@ -1146,15 +1155,16 @@ C<table>を指定する必要のあることに注意してください。 |
| 1146 | 1155 |
} |
| 1147 | 1156 |
); |
| 1148 | 1157 |
|
| 1149 |
-<method()>で登録したメソッドは |
|
| 1150 |
-L<DBIx::Custom>オブジェクトから直接呼び出すことができます。 |
|
| 1158 |
+これらのメソッドは |
|
| 1159 |
+L<DBIx::Custom>オブジェクトから呼び出すことができます。 |
|
| 1151 | 1160 |
|
| 1152 | 1161 |
$dbi->update_or_insert; |
| 1153 | 1162 |
$dbi->find_or_create; |
| 1154 | 1163 |
|
| 1155 | 1164 |
=head3 結果クラスの変更 |
| 1156 | 1165 |
|
| 1157 |
-必要ならば結果クラスを変更することができます。 |
|
| 1166 |
+結果クラスを変更することができます。 |
|
| 1167 |
+デフォルトはL<DBIx::Custom::Result>です。 |
|
| 1158 | 1168 |
|
| 1159 | 1169 |
package MyResult; |
| 1160 | 1170 |
use base 'DBIx::Custom::Result'; |
| ... | ... |
@@ -1172,16 +1182,14 @@ L<DBIx::Custom>オブジェクトから直接呼び出すことができます |
| 1172 | 1182 |
|
| 1173 | 1183 |
=head3 キャッシング |
| 1174 | 1184 |
|
| 1175 |
-タグの展開後のSQLはパフォーマンスの理由のためにキャッシュされます。 |
|
| 1185 |
+タグの解析後のSQLはパフォーマンスの理由のためにキャッシュされます。 |
|
| 1176 | 1186 |
これはC<chace>で設定でき、デフォルトではキャッシュを行う設定です。 |
| 1177 | 1187 |
|
| 1178 | 1188 |
$dbi->cache(1); |
| 1179 | 1189 |
|
| 1180 |
-キャッシュ方法はC<cache_method>にメソッドを指定することで |
|
| 1181 |
-変更することができます。 |
|
| 1182 |
-データの保存と取得のためのメソッドを定義します。 |
|
| 1183 |
- |
|
| 1184 |
-デフォルトでは次のようにメモリ上にキャッシュを行うものになっています。 |
|
| 1190 |
+キャッシュ方法はC<cache_method>で変更することができます。 |
|
| 1191 |
+デフォルトのメソッドは以下のようになっていて、 |
|
| 1192 |
+メモリ上にキャッシュが保存されます。 |
|
| 1185 | 1193 |
|
| 1186 | 1194 |
$dbi->cache_method(sub {
|
| 1187 | 1195 |
sub {
|
| ... | ... |
@@ -1190,22 +1198,28 @@ L<DBIx::Custom>オブジェクトから直接呼び出すことができます |
| 1190 | 1198 |
$self->{_cached} ||= {};
|
| 1191 | 1199 |
|
| 1192 | 1200 |
if (@_ > 1) {
|
| 1193 |
- # Set |
|
| 1201 |
+ # キャッシュの保存 |
|
| 1194 | 1202 |
$self->{_cached}{$_[0]} = $_[1]
|
| 1195 | 1203 |
} |
| 1196 | 1204 |
else {
|
| 1197 |
- # Get |
|
| 1205 |
+ # キャッシュの取得 |
|
| 1198 | 1206 |
return $self->{_cached}{$_[0]}
|
| 1199 | 1207 |
} |
| 1200 | 1208 |
} |
| 1201 | 1209 |
}); |
| 1202 | 1210 |
|
| 1203 | 1211 |
第一はL<DBIx::Custom>オブジェクトです。 |
| 1204 |
-第二引数はタグの展開される前のSQLです。 |
|
| 1205 |
-第三引数はタグの展開後のSQLです。 |
|
| 1212 |
+第二引数はタグが解析される前のSQLです。 |
|
| 1213 |
+第三引数はタグの解析後のSQLの情報です。これはハッシュのリファレンスです。 |
|
| 1206 | 1214 |
|
| 1207 |
-自分で作成する場合は第三引数が存在した場合はキャッシュを設定し、 |
|
| 1215 |
+第三引数が存在した場合はキャッシュを設定し、 |
|
| 1208 | 1216 |
存在しなかった場合はキャッシュを取得する実装に |
| 1209 | 1217 |
してください。 |
| 1210 | 1218 |
|
| 1219 |
+=head1 サンプル |
|
| 1220 |
+ |
|
| 1221 |
+以下のWikiでサンプルを見ることができます。 |
|
| 1222 |
+ |
|
| 1223 |
+L<DBIx::Custom Wiki|https://github.com/yuki-kimoto/DBIx-Custom/wiki> |
|
| 1224 |
+ |
|
| 1211 | 1225 |
=cut |