... | ... |
@@ -19,6 +19,8 @@ use DBIx::Custom; |
19 | 19 |
sub create_table1_2 {'create table table1 (key1 varchar(255), key2 varchar(255), ' |
20 | 20 |
. 'key3 varchar(255), key4 varchar(255), key5 varchar(255)) engine=InnoDB;' } |
21 | 21 |
sub create_table1_type { 'create table table1 (key1 Date, key2 datetime) engine=InnoDB;;' } |
22 |
+ sub create_table1_highperformance { "create table table1 (ab varchar(255), bc varchar(255), " |
|
23 |
+ . "ik varchar(255), hi varchar(255), ui varchar(255), pq varchar(255), dc varchar(255)) engine=InnoDB;" } |
|
22 | 24 |
sub create_table2 { 'create table table2 (key1 varchar(255), key3 varchar(255)) engine=InnoDB;' } |
23 | 25 |
sub create_table2_2 { "create table table2 (key1 varchar(255), key2 varchar(255), key3 varchar(255)) engine=InnoDB" } |
24 | 26 |
sub create_table3 { "create table table3 (key1 varchar(255), key2 varchar(255), key3 varchar(255)) engine=InnoDB" } |
... | ... |
@@ -18,6 +18,8 @@ use DBIx::Custom; |
18 | 18 |
sub create_table1_2 {'create table table1 (key1 varchar(255), key2 varchar(255), ' |
19 | 19 |
. 'key3 varchar(255), key4 varchar(255), key5 varchar(255));' } |
20 | 20 |
sub create_table1_type { 'create table table1 (key1 Date, key2 varchar(255));' } |
21 |
+ sub create_table1_highperformance { "create table table1 (ab varchar(255), bc varchar(255), " |
|
22 |
+ . "ik varchar(255), hi varchar(255), ui varchar(255), pq varchar(255), dc varchar(255));" } |
|
21 | 23 |
sub create_table2 { 'create table table2 (key1 varchar(255), key3 varchar(255));' } |
22 | 24 |
sub create_table2_2 { "create table table2 (key1 varchar(255), key2 varchar(255), key3 varchar(255))" } |
23 | 25 |
sub create_table3 { "create table table3 (key1 varchar(255), key2 varchar(255), key3 varchar(255))" } |
... | ... |
@@ -13,6 +13,7 @@ use DBIx::Custom; |
13 | 13 |
sub create_table1 { 'create table table1 (key1, key2);' } |
14 | 14 |
sub create_table1_2 {'create table table1 (key1, key2, key3, key4, key5);' } |
15 | 15 |
sub create_table1_type { 'create table table1 (key1 Date, key2 datetime);' } |
16 |
+ sub create_table1_highperformance { "create table table1 (ab, bc, ik, hi, ui, pq, dc);" } |
|
16 | 17 |
sub create_table2 { 'create table table2 (key1, key3);' } |
17 | 18 |
sub create_table2_2 { "create table table2 (key1, key2, key3)" } |
18 | 19 |
sub create_table3 { "create table table3 (key1, key2, key3)" } |
... | ... |
@@ -12,6 +12,9 @@ use DBIx::Custom; |
12 | 12 |
sub create_table1 { 'create table table1 (key1, key2);' } |
13 | 13 |
sub create_table1_2 {'create table table1 (key1, key2, key3, key4, key5);' } |
14 | 14 |
sub create_table1_type { 'create table table1 (key1 Date, key2 datetime);' } |
15 |
+ |
|
16 |
+ sub create_table1_highperformance { "create table table1 (ab, bc, ik, hi, ui, pq, dc);" } |
|
17 |
+ |
|
15 | 18 |
sub create_table2 { 'create table table2 (key1, key3);' } |
16 | 19 |
sub create_table2_2 { "create table table2 (key1, key2, key3)" } |
17 | 20 |
sub create_table3 { "create table table3 (key1, key2, key3)" } |
... | ... |
@@ -146,6 +146,7 @@ sub test { print "# $_[0]\n" } |
146 | 146 |
my $create_table1 = $dbi->create_table1; |
147 | 147 |
my $create_table1_2 = $dbi->create_table1_2; |
148 | 148 |
my $create_table1_type = $dbi->create_table1_type; |
149 |
+my $create_table1_highperformance = $dbi->create_table1_highperformance; |
|
149 | 150 |
my $create_table2 = $dbi->create_table2; |
150 | 151 |
my $create_table2_2 = $dbi->create_table2_2; |
151 | 152 |
my $create_table3 = $dbi->create_table3; |
... | ... |
@@ -2671,4 +2672,325 @@ $param = $dbi->map_param( |
2671 | 2672 |
); |
2672 | 2673 |
is_deeply($param, {'book.price' => '%a'}); |
2673 | 2674 |
|
2675 |
+test 'order'; |
|
2676 |
+$dbi = DBIx::Custom->connect; |
|
2677 |
+eval { $dbi->execute('drop table table1') }; |
|
2678 |
+$dbi->execute($create_table1); |
|
2679 |
+$dbi->insert({key1 => 1, key2 => 1}, table => 'table1'); |
|
2680 |
+$dbi->insert({key1 => 1, key2 => 3}, table => 'table1'); |
|
2681 |
+$dbi->insert({key1 => 2, key2 => 2}, table => 'table1'); |
|
2682 |
+$dbi->insert({key1 => 2, key2 => 4}, table => 'table1'); |
|
2683 |
+my $order = $dbi->order; |
|
2684 |
+$order->prepend('key1', 'key2 desc'); |
|
2685 |
+$result = $dbi->select(table => 'table1', append => "$order"); |
|
2686 |
+is_deeply($result->all, [{key1 => 1, key2 => 3}, {key1 => 1, key2 => 1}, |
|
2687 |
+ {key1 => 2, key2 => 4}, {key1 => 2, key2 => 2}]); |
|
2688 |
+$order->prepend('key1 desc'); |
|
2689 |
+$result = $dbi->select(table => 'table1', append => "$order"); |
|
2690 |
+is_deeply($result->all, [{key1 => 2, key2 => 4}, {key1 => 2, key2 => 2}, |
|
2691 |
+ {key1 => 1, key2 => 3}, {key1 => 1, key2 => 1}]); |
|
2692 |
+ |
|
2693 |
+$order = $dbi->order; |
|
2694 |
+$order->prepend(['table1-key1'], [qw/table1-key2 desc/]); |
|
2695 |
+$result = $dbi->select(table => 'table1', |
|
2696 |
+ column => [[key1 => 'table1-key1'], [key2 => 'table1-key2']], |
|
2697 |
+ append => "$order"); |
|
2698 |
+is_deeply($result->all, [{'table1-key1' => 1, 'table1-key2' => 3}, |
|
2699 |
+ {'table1-key1' => 1, 'table1-key2' => 1}, |
|
2700 |
+ {'table1-key1' => 2, 'table1-key2' => 4}, |
|
2701 |
+ {'table1-key1' => 2, 'table1-key2' => 2}]); |
|
2702 |
+ |
|
2703 |
+test 'tag_parse'; |
|
2704 |
+$dbi = DBIx::Custom->connect; |
|
2705 |
+$dbi->tag_parse(0); |
|
2706 |
+eval { $dbi->execute('drop table table1') }; |
|
2707 |
+$dbi->execute($create_table1); |
|
2708 |
+$dbi->insert({key1 => 1, key2 => 1}, table => 'table1'); |
|
2709 |
+eval {$dbi->execute("select * from table1 where {= key1}", {key1 => 1})}; |
|
2710 |
+ok($@); |
|
2711 |
+ |
|
2712 |
+test 'last_sql'; |
|
2713 |
+$dbi = DBIx::Custom->connect; |
|
2714 |
+eval { $dbi->execute('drop table table1') }; |
|
2715 |
+$dbi->execute($create_table1); |
|
2716 |
+$dbi->execute('select * from table1'); |
|
2717 |
+is($dbi->last_sql, 'select * from table1;'); |
|
2718 |
+ |
|
2719 |
+eval{$dbi->execute("aaa")}; |
|
2720 |
+is($dbi->last_sql, 'aaa;'); |
|
2721 |
+ |
|
2722 |
+test 'DBIx::Custom header'; |
|
2723 |
+$dbi = DBIx::Custom->connect; |
|
2724 |
+eval { $dbi->execute('drop table table1') }; |
|
2725 |
+$dbi->execute($create_table1); |
|
2726 |
+$result = $dbi->execute('select key1 as h1, key2 as h2 from table1'); |
|
2727 |
+is_deeply($result->header, [qw/h1 h2/]); |
|
2728 |
+ |
|
2729 |
+test 'Named placeholder :name(operater) syntax'; |
|
2730 |
+$dbi->execute('drop table table1'); |
|
2731 |
+$dbi->execute($create_table1_2); |
|
2732 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
2733 |
+$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
2734 |
+ |
|
2735 |
+$source = "select * from table1 where :key1{=} and :key2{=}"; |
|
2736 |
+$result = $dbi->execute($source, param => {key1 => 1, key2 => 2}); |
|
2737 |
+$rows = $result->all; |
|
2738 |
+is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
2739 |
+ |
|
2740 |
+$source = "select * from table1 where :key1{ = } and :key2{=}"; |
|
2741 |
+$result = $dbi->execute($source, param => {key1 => 1, key2 => 2}); |
|
2742 |
+$rows = $result->all; |
|
2743 |
+is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
2744 |
+ |
|
2745 |
+$source = "select * from table1 where :key1{<} and :key2{=}"; |
|
2746 |
+$result = $dbi->execute($source, param => {key1 => 5, key2 => 2}); |
|
2747 |
+$rows = $result->all; |
|
2748 |
+is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
2749 |
+ |
|
2750 |
+$source = "select * from table1 where :table1.key1{=} and :table1.key2{=}"; |
|
2751 |
+$result = $dbi->execute( |
|
2752 |
+ $source, |
|
2753 |
+ param => {'table1.key1' => 1, 'table1.key2' => 1}, |
|
2754 |
+ filter => {'table1.key2' => sub { $_[0] * 2 }} |
|
2755 |
+); |
|
2756 |
+$rows = $result->all; |
|
2757 |
+is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
2758 |
+ |
|
2759 |
+test 'high perfomance way'; |
|
2760 |
+$dbi->execute('drop table table1'); |
|
2761 |
+$dbi->execute($create_table1_highperformance); |
|
2762 |
+$rows = [ |
|
2763 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
2764 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
2765 |
+]; |
|
2766 |
+{ |
|
2767 |
+ my $query; |
|
2768 |
+ foreach my $row (@$rows) { |
|
2769 |
+ $query ||= $dbi->insert($row, table => 'table1', query => 1); |
|
2770 |
+ $dbi->execute($query, $row, filter => {ab => sub { $_[0] * 2 }}); |
|
2771 |
+ } |
|
2772 |
+ is_deeply($dbi->select(table => 'table1')->all, |
|
2773 |
+ [ |
|
2774 |
+ {ab => 2, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
2775 |
+ {ab => 2, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
2776 |
+ ] |
|
2777 |
+ ); |
|
2778 |
+} |
|
2779 |
+ |
|
2780 |
+$dbi->execute('drop table table1'); |
|
2781 |
+$dbi->execute($create_table1_highperformance); |
|
2782 |
+$rows = [ |
|
2783 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
2784 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
2785 |
+]; |
|
2786 |
+{ |
|
2787 |
+ my $query; |
|
2788 |
+ my $sth; |
|
2789 |
+ foreach my $row (@$rows) { |
|
2790 |
+ $query ||= $dbi->insert($row, table => 'table1', query => 1); |
|
2791 |
+ $sth ||= $query->sth; |
|
2792 |
+ $sth->execute(map { $row->{$_} } sort keys %$row); |
|
2793 |
+ } |
|
2794 |
+ is_deeply($dbi->select(table => 'table1')->all, |
|
2795 |
+ [ |
|
2796 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
2797 |
+ {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
2798 |
+ ] |
|
2799 |
+ ); |
|
2800 |
+} |
|
2801 |
+ |
|
2802 |
+test 'result'; |
|
2803 |
+$dbi = DBIx::Custom->connect; |
|
2804 |
+eval { $dbi->execute('drop table table1') }; |
|
2805 |
+$dbi->execute($create_table1); |
|
2806 |
+$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
2807 |
+$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
2808 |
+ |
|
2809 |
+$result = $dbi->select(table => 'table1'); |
|
2810 |
+@rows = (); |
|
2811 |
+while (my $row = $result->fetch) { |
|
2812 |
+ push @rows, [@$row]; |
|
2813 |
+} |
|
2814 |
+is_deeply(\@rows, [[1, 2], [3, 4]]); |
|
2815 |
+ |
|
2816 |
+$result = $dbi->select(table => 'table1'); |
|
2817 |
+@rows = (); |
|
2818 |
+while (my $row = $result->fetch_hash) { |
|
2819 |
+ push @rows, {%$row}; |
|
2820 |
+} |
|
2821 |
+is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]); |
|
2822 |
+ |
|
2823 |
+$dbi = DBIx::Custom->connect; |
|
2824 |
+eval { $dbi->execute('drop table table1') }; |
|
2825 |
+$dbi->execute($create_table1); |
|
2826 |
+$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
2827 |
+$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
2828 |
+ |
|
2829 |
+test 'fetch_all'; |
|
2830 |
+$result = $dbi->select(table => 'table1'); |
|
2831 |
+$rows = $result->fetch_all; |
|
2832 |
+is_deeply($rows, [[1, 2], [3, 4]]); |
|
2833 |
+ |
|
2834 |
+$result = $dbi->select(table => 'table1'); |
|
2835 |
+$rows = $result->fetch_hash_all; |
|
2836 |
+is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]); |
|
2837 |
+ |
|
2838 |
+$result = $dbi->select(table => 'table1'); |
|
2839 |
+$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
|
2840 |
+$result->filter({key1 => 'three_times'}); |
|
2841 |
+ |
|
2842 |
+$rows = $result->fetch_all; |
|
2843 |
+is_deeply($rows, [[3, 2], [9, 4]], "array"); |
|
2844 |
+ |
|
2845 |
+$result = $dbi->select(table => 'table1'); |
|
2846 |
+$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
|
2847 |
+$result->filter({key1 => 'three_times'}); |
|
2848 |
+$rows = $result->fetch_hash_all; |
|
2849 |
+is_deeply($rows, [{key1 => 3, key2 => 2}, {key1 => 9, key2 => 4}], "hash"); |
|
2850 |
+ |
|
2851 |
+test "query_builder"; |
|
2852 |
+$datas = [ |
|
2853 |
+ # Basic tests |
|
2854 |
+ { name => 'placeholder basic', |
|
2855 |
+ source => "a {? k1} b {= k2} {<> k3} {> k4} {< k5} {>= k6} {<= k7} {like k8}", , |
|
2856 |
+ sql_expected => "a ? b k2 = ? k3 <> ? k4 > ? k5 < ? k6 >= ? k7 <= ? k8 like ?;", |
|
2857 |
+ columns_expected => [qw/k1 k2 k3 k4 k5 k6 k7 k8/] |
|
2858 |
+ }, |
|
2859 |
+ { |
|
2860 |
+ name => 'placeholder in', |
|
2861 |
+ source => "{in k1 3};", |
|
2862 |
+ sql_expected => "k1 in (?, ?, ?);", |
|
2863 |
+ columns_expected => [qw/k1 k1 k1/] |
|
2864 |
+ }, |
|
2865 |
+ |
|
2866 |
+ # Table name |
|
2867 |
+ { |
|
2868 |
+ name => 'placeholder with table name', |
|
2869 |
+ source => "{= a.k1} {= a.k2}", |
|
2870 |
+ sql_expected => "a.k1 = ? a.k2 = ?;", |
|
2871 |
+ columns_expected => [qw/a.k1 a.k2/] |
|
2872 |
+ }, |
|
2873 |
+ { |
|
2874 |
+ name => 'placeholder in with table name', |
|
2875 |
+ source => "{in a.k1 2} {in b.k2 2}", |
|
2876 |
+ sql_expected => "a.k1 in (?, ?) b.k2 in (?, ?);", |
|
2877 |
+ columns_expected => [qw/a.k1 a.k1 b.k2 b.k2/] |
|
2878 |
+ }, |
|
2879 |
+ { |
|
2880 |
+ name => 'not contain tag', |
|
2881 |
+ source => "aaa", |
|
2882 |
+ sql_expected => "aaa;", |
|
2883 |
+ columns_expected => [], |
|
2884 |
+ } |
|
2885 |
+]; |
|
2886 |
+ |
|
2887 |
+for (my $i = 0; $i < @$datas; $i++) { |
|
2888 |
+ my $data = $datas->[$i]; |
|
2889 |
+ my $builder = DBIx::Custom->new->query_builder; |
|
2890 |
+ my $query = $builder->build_query($data->{source}); |
|
2891 |
+ is($query->{sql}, $data->{sql_expected}, "$data->{name} : sql"); |
|
2892 |
+ is_deeply($query->columns, $data->{columns_expected}, "$data->{name} : columns"); |
|
2893 |
+} |
|
2894 |
+ |
|
2895 |
+$builder = DBIx::Custom->new->query_builder; |
|
2896 |
+$ret_val = $builder->register_tag( |
|
2897 |
+ p => sub { |
|
2898 |
+ my @args = @_; |
|
2899 |
+ |
|
2900 |
+ my $expand = "? $args[0] $args[1]"; |
|
2901 |
+ my $columns = [2]; |
|
2902 |
+ return [$expand, $columns]; |
|
2903 |
+ } |
|
2904 |
+); |
|
2905 |
+ |
|
2906 |
+$query = $builder->build_query("{p a b}"); |
|
2907 |
+is($query->{sql}, "? a b;", "register_tag sql"); |
|
2908 |
+is_deeply($query->{columns}, [2], "register_tag columns"); |
|
2909 |
+isa_ok($ret_val, 'DBIx::Custom::QueryBuilder'); |
|
2910 |
+ |
|
2911 |
+$builder = DBIx::Custom->new->query_builder; |
|
2912 |
+ |
|
2913 |
+eval{$builder->build_query('{? }')}; |
|
2914 |
+like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments"); |
|
2915 |
+ |
|
2916 |
+eval{$builder->build_query("{a }")}; |
|
2917 |
+like($@, qr/\QTag "a" is not registered/, "tag not exist"); |
|
2918 |
+ |
|
2919 |
+$builder->register_tag({ |
|
2920 |
+ q => 'string' |
|
2921 |
+}); |
|
2922 |
+ |
|
2923 |
+eval{$builder->build_query("{q}", {})}; |
|
2924 |
+like($@, qr/Tag "q" must be sub reference/, "tag not code ref"); |
|
2925 |
+ |
|
2926 |
+$builder->register_tag({ |
|
2927 |
+ r => sub {} |
|
2928 |
+}); |
|
2929 |
+ |
|
2930 |
+eval{$builder->build_query("{r}")}; |
|
2931 |
+like($@, qr/\QTag "r" must return [STRING, ARRAY_REFERENCE]/, "tag return noting"); |
|
2932 |
+ |
|
2933 |
+$builder->register_tag({ |
|
2934 |
+ s => sub { return ["a", ""]} |
|
2935 |
+}); |
|
2936 |
+ |
|
2937 |
+eval{$builder->build_query("{s}")}; |
|
2938 |
+like($@, qr/\QTag "s" must return [STRING, ARRAY_REFERENCE]/, "tag return not array columns"); |
|
2939 |
+ |
|
2940 |
+$builder->register_tag( |
|
2941 |
+ t => sub {return ["a", []]} |
|
2942 |
+); |
|
2943 |
+ |
|
2944 |
+ |
|
2945 |
+test 'General error case'; |
|
2946 |
+$builder = DBIx::Custom->new->query_builder; |
|
2947 |
+$builder->register_tag( |
|
2948 |
+ a => sub { |
|
2949 |
+ return ["? ? ?", ['']]; |
|
2950 |
+ } |
|
2951 |
+); |
|
2952 |
+eval{$builder->build_query("{a}")}; |
|
2953 |
+like($@, qr/\QPlaceholder count/, "placeholder count is invalid"); |
|
2954 |
+ |
|
2955 |
+ |
|
2956 |
+test 'Default tag Error case'; |
|
2957 |
+eval{$builder->build_query("{= }")}; |
|
2958 |
+like($@, qr/Column name must be specified in tag "{= }"/, "basic '=' : key not exist"); |
|
2959 |
+ |
|
2960 |
+eval{$builder->build_query("{in }")}; |
|
2961 |
+like($@, qr/Column name and count of values must be specified in tag "{in }"/, "in : key not exist"); |
|
2962 |
+ |
|
2963 |
+eval{$builder->build_query("{in a}")}; |
|
2964 |
+like($@, qr/\QColumn name and count of values must be specified in tag "{in }"/, |
|
2965 |
+ "in : key not exist"); |
|
2966 |
+ |
|
2967 |
+eval{$builder->build_query("{in a r}")}; |
|
2968 |
+like($@, qr/\QColumn name and count of values must be specified in tag "{in }"/, |
|
2969 |
+ "in : key not exist"); |
|
2970 |
+ |
|
2971 |
+test 'variouse source'; |
|
2972 |
+$source = "a {= b} c \\{ \\} {= \\{} {= \\}} d;"; |
|
2973 |
+$query = $builder->build_query($source); |
|
2974 |
+is($query->sql, 'a b = ? c { } { = ? } = ? d;', "basic : 1"); |
|
2975 |
+ |
|
2976 |
+$source = "abc;"; |
|
2977 |
+$query = $builder->build_query($source); |
|
2978 |
+is($query->sql, 'abc;', "basic : 2"); |
|
2979 |
+ |
|
2980 |
+$source = "{= a}"; |
|
2981 |
+$query = $builder->build_query($source); |
|
2982 |
+is($query->sql, 'a = ?;', "only tag"); |
|
2983 |
+ |
|
2984 |
+$source = "000;"; |
|
2985 |
+$query = $builder->build_query($source); |
|
2986 |
+is($query->sql, '000;', "contain 0 value"); |
|
2987 |
+ |
|
2988 |
+$source = "a {= b} }"; |
|
2989 |
+eval{$builder->build_query($source)}; |
|
2990 |
+like($@, qr/unexpected "}"/, "error : 1"); |
|
2991 |
+ |
|
2992 |
+$source = "a {= {}"; |
|
2993 |
+eval{$builder->build_query($source)}; |
|
2994 |
+like($@, qr/unexpected "{"/, "error : 2"); |
|
2995 |
+ |
|
2674 | 2996 |
1; |
... | ... |
@@ -203,383 +203,6 @@ $dbi = DBIx::Custom->connect; |
203 | 203 |
|
204 | 204 |
|
205 | 205 |
|
206 |
-test 'order'; |
|
207 |
-$dbi = DBIx::Custom->connect; |
|
208 |
-eval { $dbi->execute('drop table table1') }; |
|
209 |
-$dbi->execute("create table table1 (key1, key2)"); |
|
210 |
-$dbi->insert({key1 => 1, key2 => 1}, table => 'table1'); |
|
211 |
-$dbi->insert({key1 => 1, key2 => 3}, table => 'table1'); |
|
212 |
-$dbi->insert({key1 => 2, key2 => 2}, table => 'table1'); |
|
213 |
-$dbi->insert({key1 => 2, key2 => 4}, table => 'table1'); |
|
214 |
-my $order = $dbi->order; |
|
215 |
-$order->prepend('key1', 'key2 desc'); |
|
216 |
-$result = $dbi->select(table => 'table1', append => "$order"); |
|
217 |
-is_deeply($result->all, [{key1 => 1, key2 => 3}, {key1 => 1, key2 => 1}, |
|
218 |
- {key1 => 2, key2 => 4}, {key1 => 2, key2 => 2}]); |
|
219 |
-$order->prepend('key1 desc'); |
|
220 |
-$result = $dbi->select(table => 'table1', append => "$order"); |
|
221 |
-is_deeply($result->all, [{key1 => 2, key2 => 4}, {key1 => 2, key2 => 2}, |
|
222 |
- {key1 => 1, key2 => 3}, {key1 => 1, key2 => 1}]); |
|
223 |
- |
|
224 |
-$order = $dbi->order; |
|
225 |
-$order->prepend(['table1-key1'], [qw/table1-key2 desc/]); |
|
226 |
-$result = $dbi->select(table => 'table1', |
|
227 |
- column => [[key1 => 'table1-key1'], [key2 => 'table1-key2']], |
|
228 |
- append => "$order"); |
|
229 |
-is_deeply($result->all, [{'table1-key1' => 1, 'table1-key2' => 3}, |
|
230 |
- {'table1-key1' => 1, 'table1-key2' => 1}, |
|
231 |
- {'table1-key1' => 2, 'table1-key2' => 4}, |
|
232 |
- {'table1-key1' => 2, 'table1-key2' => 2}]); |
|
233 |
- |
|
234 |
-test 'tag_parse'; |
|
235 |
-$dbi = DBIx::Custom->connect; |
|
236 |
-$dbi->tag_parse(0); |
|
237 |
-eval { $dbi->execute('drop table table1') }; |
|
238 |
-$dbi->execute("create table table1 (key1, key2)"); |
|
239 |
-$dbi->insert({key1 => 1, key2 => 1}, table => 'table1'); |
|
240 |
-eval {$dbi->execute("select * from table1 where {= key1}", {key1 => 1})}; |
|
241 |
-ok($@); |
|
242 |
- |
|
243 |
-test 'last_sql'; |
|
244 |
-$dbi = DBIx::Custom->connect; |
|
245 |
-eval { $dbi->execute('drop table table1') }; |
|
246 |
-$dbi->execute("create table table1 (key1, key2)"); |
|
247 |
-$dbi->execute('select * from table1'); |
|
248 |
-is($dbi->last_sql, 'select * from table1;'); |
|
249 |
- |
|
250 |
-eval{$dbi->execute("aaa")}; |
|
251 |
-is($dbi->last_sql, 'aaa;'); |
|
252 |
- |
|
253 |
-test 'DBIx::Custom header'; |
|
254 |
-$dbi = DBIx::Custom->connect; |
|
255 |
-eval { $dbi->execute('drop table table1') }; |
|
256 |
-$dbi->execute("create table table1 (key1, key2)"); |
|
257 |
-$result = $dbi->execute('select key1 as h1, key2 as h2 from table1'); |
|
258 |
-is_deeply($result->header, [qw/h1 h2/]); |
|
259 |
- |
|
260 |
-test 'Named placeholder :name(operater) syntax'; |
|
261 |
-$dbi->execute('drop table table1'); |
|
262 |
-$dbi->execute($create_table1_2); |
|
263 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
264 |
-$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
265 |
- |
|
266 |
-$source = "select * from table1 where :key1{=} and :key2{=}"; |
|
267 |
-$result = $dbi->execute($source, param => {key1 => 1, key2 => 2}); |
|
268 |
-$rows = $result->all; |
|
269 |
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
270 |
- |
|
271 |
-$source = "select * from table1 where :key1{ = } and :key2{=}"; |
|
272 |
-$result = $dbi->execute($source, param => {key1 => 1, key2 => 2}); |
|
273 |
-$rows = $result->all; |
|
274 |
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
275 |
- |
|
276 |
-$source = "select * from table1 where :key1{<} and :key2{=}"; |
|
277 |
-$result = $dbi->execute($source, param => {key1 => 5, key2 => 2}); |
|
278 |
-$rows = $result->all; |
|
279 |
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
280 |
- |
|
281 |
-$source = "select * from table1 where :table1.key1{=} and :table1.key2{=}"; |
|
282 |
-$result = $dbi->execute( |
|
283 |
- $source, |
|
284 |
- param => {'table1.key1' => 1, 'table1.key2' => 1}, |
|
285 |
- filter => {'table1.key2' => sub { $_[0] * 2 }} |
|
286 |
-); |
|
287 |
-$rows = $result->all; |
|
288 |
-is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}]); |
|
289 |
- |
|
290 |
-test 'high perfomance way'; |
|
291 |
-$dbi->execute('drop table table1'); |
|
292 |
-$dbi->execute("create table table1 (ab, bc, ik, hi, ui, pq, dc);"); |
|
293 |
-$rows = [ |
|
294 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
295 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
296 |
-]; |
|
297 |
-{ |
|
298 |
- my $query; |
|
299 |
- foreach my $row (@$rows) { |
|
300 |
- $query ||= $dbi->insert($row, table => 'table1', query => 1); |
|
301 |
- $dbi->execute($query, $row, filter => {ab => sub { $_[0] * 2 }}); |
|
302 |
- } |
|
303 |
- is_deeply($dbi->select(table => 'table1')->all, |
|
304 |
- [ |
|
305 |
- {ab => 2, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
306 |
- {ab => 2, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
307 |
- ] |
|
308 |
- ); |
|
309 |
-} |
|
310 |
- |
|
311 |
-$dbi->execute('drop table table1'); |
|
312 |
-$dbi->execute("create table table1 (ab, bc, ik, hi, ui, pq, dc);"); |
|
313 |
-$rows = [ |
|
314 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
315 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
316 |
-]; |
|
317 |
-{ |
|
318 |
- my $query; |
|
319 |
- my $sth; |
|
320 |
- foreach my $row (@$rows) { |
|
321 |
- $query ||= $dbi->insert($row, table => 'table1', query => 1); |
|
322 |
- $sth ||= $query->sth; |
|
323 |
- $sth->execute(map { $row->{$_} } sort keys %$row); |
|
324 |
- } |
|
325 |
- is_deeply($dbi->select(table => 'table1')->all, |
|
326 |
- [ |
|
327 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 7}, |
|
328 |
- {ab => 1, bc => 2, ik => 3, hi => 4, ui => 5, pq => 6, dc => 8}, |
|
329 |
- ] |
|
330 |
- ); |
|
331 |
-} |
|
332 |
- |
|
333 |
-test 'result'; |
|
334 |
-$dbi = DBIx::Custom->connect; |
|
335 |
-eval { $dbi->execute('drop table table1') }; |
|
336 |
-$dbi->execute($create_table1); |
|
337 |
-$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
338 |
-$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
339 |
- |
|
340 |
-$result = $dbi->select(table => 'table1'); |
|
341 |
-@rows = (); |
|
342 |
-while (my $row = $result->fetch) { |
|
343 |
- push @rows, [@$row]; |
|
344 |
-} |
|
345 |
-is_deeply(\@rows, [[1, 2], [3, 4]]); |
|
346 |
- |
|
347 |
-$result = $dbi->select(table => 'table1'); |
|
348 |
-@rows = (); |
|
349 |
-while (my $row = $result->fetch_hash) { |
|
350 |
- push @rows, {%$row}; |
|
351 |
-} |
|
352 |
-is_deeply(\@rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]); |
|
353 |
- |
|
354 |
-$result = $dbi->select(table => 'table1'); |
|
355 |
-$row = $result->fetch_first; |
|
356 |
-is_deeply($row, [1, 2], "row"); |
|
357 |
-$row = $result->fetch; |
|
358 |
-ok(!$row, "finished"); |
|
359 |
- |
|
360 |
-$result = $dbi->select(table => 'table1'); |
|
361 |
-$row = $result->fetch_hash_first; |
|
362 |
-is_deeply($row, {key1 => 1, key2 => 2}, "row"); |
|
363 |
-$row = $result->fetch_hash; |
|
364 |
-ok(!$row, "finished"); |
|
365 |
- |
|
366 |
-$dbi->execute('create table table2 (key1, key2);'); |
|
367 |
-$result = $dbi->select(table => 'table2'); |
|
368 |
-$row = $result->fetch_hash_first; |
|
369 |
-ok(!$row, "no row fetch"); |
|
370 |
- |
|
371 |
-$dbi = DBIx::Custom->connect; |
|
372 |
-eval { $dbi->execute('drop table table1') }; |
|
373 |
-$dbi->execute($create_table1); |
|
374 |
-$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
375 |
-$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
376 |
-$dbi->insert({key1 => 5, key2 => 6}, table => 'table1'); |
|
377 |
-$dbi->insert({key1 => 7, key2 => 8}, table => 'table1'); |
|
378 |
-$dbi->insert({key1 => 9, key2 => 10}, table => 'table1'); |
|
379 |
-$result = $dbi->select(table => 'table1'); |
|
380 |
-$rows = $result->fetch_multi(2); |
|
381 |
-is_deeply($rows, [[1, 2], |
|
382 |
- [3, 4]], "fetch_multi first"); |
|
383 |
-$rows = $result->fetch_multi(2); |
|
384 |
-is_deeply($rows, [[5, 6], |
|
385 |
- [7, 8]], "fetch_multi secound"); |
|
386 |
-$rows = $result->fetch_multi(2); |
|
387 |
-is_deeply($rows, [[9, 10]], "fetch_multi third"); |
|
388 |
-$rows = $result->fetch_multi(2); |
|
389 |
-ok(!$rows); |
|
390 |
- |
|
391 |
-$result = $dbi->select(table => 'table1'); |
|
392 |
-eval {$result->fetch_multi}; |
|
393 |
-like($@, qr/Row count must be specified/, "Not specified row count"); |
|
394 |
- |
|
395 |
-$result = $dbi->select(table => 'table1'); |
|
396 |
-$rows = $result->fetch_hash_multi(2); |
|
397 |
-is_deeply($rows, [{key1 => 1, key2 => 2}, |
|
398 |
- {key1 => 3, key2 => 4}], "fetch_multi first"); |
|
399 |
-$rows = $result->fetch_hash_multi(2); |
|
400 |
-is_deeply($rows, [{key1 => 5, key2 => 6}, |
|
401 |
- {key1 => 7, key2 => 8}], "fetch_multi secound"); |
|
402 |
-$rows = $result->fetch_hash_multi(2); |
|
403 |
-is_deeply($rows, [{key1 => 9, key2 => 10}], "fetch_multi third"); |
|
404 |
-$rows = $result->fetch_hash_multi(2); |
|
405 |
-ok(!$rows); |
|
406 |
- |
|
407 |
-$result = $dbi->select(table => 'table1'); |
|
408 |
-eval {$result->fetch_hash_multi}; |
|
409 |
-like($@, qr/Row count must be specified/, "Not specified row count"); |
|
410 |
- |
|
411 |
-$dbi = DBIx::Custom->connect; |
|
412 |
-eval { $dbi->execute('drop table table1') }; |
|
413 |
-$dbi->execute($create_table1); |
|
414 |
-$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
415 |
-$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
416 |
- |
|
417 |
-test 'fetch_all'; |
|
418 |
-$result = $dbi->select(table => 'table1'); |
|
419 |
-$rows = $result->fetch_all; |
|
420 |
-is_deeply($rows, [[1, 2], [3, 4]]); |
|
421 |
- |
|
422 |
-$result = $dbi->select(table => 'table1'); |
|
423 |
-$rows = $result->fetch_hash_all; |
|
424 |
-is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]); |
|
425 |
- |
|
426 |
-$result = $dbi->select(table => 'table1'); |
|
427 |
-$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
|
428 |
-$result->filter({key1 => 'three_times'}); |
|
429 |
- |
|
430 |
-$rows = $result->fetch_all; |
|
431 |
-is_deeply($rows, [[3, 2], [9, 4]], "array"); |
|
432 |
- |
|
433 |
-$result = $dbi->select(table => 'table1'); |
|
434 |
-$result->dbi->filters({three_times => sub { $_[0] * 3}}); |
|
435 |
-$result->filter({key1 => 'three_times'}); |
|
436 |
-$rows = $result->fetch_hash_all; |
|
437 |
-is_deeply($rows, [{key1 => 3, key2 => 2}, {key1 => 9, key2 => 4}], "hash"); |
|
438 |
- |
|
439 |
-test "query_builder"; |
|
440 |
-$datas = [ |
|
441 |
- # Basic tests |
|
442 |
- { name => 'placeholder basic', |
|
443 |
- source => "a {? k1} b {= k2} {<> k3} {> k4} {< k5} {>= k6} {<= k7} {like k8}", , |
|
444 |
- sql_expected => "a ? b k2 = ? k3 <> ? k4 > ? k5 < ? k6 >= ? k7 <= ? k8 like ?;", |
|
445 |
- columns_expected => [qw/k1 k2 k3 k4 k5 k6 k7 k8/] |
|
446 |
- }, |
|
447 |
- { |
|
448 |
- name => 'placeholder in', |
|
449 |
- source => "{in k1 3};", |
|
450 |
- sql_expected => "k1 in (?, ?, ?);", |
|
451 |
- columns_expected => [qw/k1 k1 k1/] |
|
452 |
- }, |
|
453 |
- |
|
454 |
- # Table name |
|
455 |
- { |
|
456 |
- name => 'placeholder with table name', |
|
457 |
- source => "{= a.k1} {= a.k2}", |
|
458 |
- sql_expected => "a.k1 = ? a.k2 = ?;", |
|
459 |
- columns_expected => [qw/a.k1 a.k2/] |
|
460 |
- }, |
|
461 |
- { |
|
462 |
- name => 'placeholder in with table name', |
|
463 |
- source => "{in a.k1 2} {in b.k2 2}", |
|
464 |
- sql_expected => "a.k1 in (?, ?) b.k2 in (?, ?);", |
|
465 |
- columns_expected => [qw/a.k1 a.k1 b.k2 b.k2/] |
|
466 |
- }, |
|
467 |
- { |
|
468 |
- name => 'not contain tag', |
|
469 |
- source => "aaa", |
|
470 |
- sql_expected => "aaa;", |
|
471 |
- columns_expected => [], |
|
472 |
- } |
|
473 |
-]; |
|
474 |
- |
|
475 |
-for (my $i = 0; $i < @$datas; $i++) { |
|
476 |
- my $data = $datas->[$i]; |
|
477 |
- my $builder = DBIx::Custom->new->query_builder; |
|
478 |
- my $query = $builder->build_query($data->{source}); |
|
479 |
- is($query->{sql}, $data->{sql_expected}, "$data->{name} : sql"); |
|
480 |
- is_deeply($query->columns, $data->{columns_expected}, "$data->{name} : columns"); |
|
481 |
-} |
|
482 |
- |
|
483 |
-$builder = DBIx::Custom->new->query_builder; |
|
484 |
-$ret_val = $builder->register_tag( |
|
485 |
- p => sub { |
|
486 |
- my @args = @_; |
|
487 |
- |
|
488 |
- my $expand = "? $args[0] $args[1]"; |
|
489 |
- my $columns = [2]; |
|
490 |
- return [$expand, $columns]; |
|
491 |
- } |
|
492 |
-); |
|
493 |
- |
|
494 |
-$query = $builder->build_query("{p a b}"); |
|
495 |
-is($query->{sql}, "? a b;", "register_tag sql"); |
|
496 |
-is_deeply($query->{columns}, [2], "register_tag columns"); |
|
497 |
-isa_ok($ret_val, 'DBIx::Custom::QueryBuilder'); |
|
498 |
- |
|
499 |
-$builder = DBIx::Custom->new->query_builder; |
|
500 |
- |
|
501 |
-eval{$builder->build_query('{? }')}; |
|
502 |
-like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments"); |
|
503 |
- |
|
504 |
-eval{$builder->build_query("{a }")}; |
|
505 |
-like($@, qr/\QTag "a" is not registered/, "tag not exist"); |
|
506 |
- |
|
507 |
-$builder->register_tag({ |
|
508 |
- q => 'string' |
|
509 |
-}); |
|
510 |
- |
|
511 |
-eval{$builder->build_query("{q}", {})}; |
|
512 |
-like($@, qr/Tag "q" must be sub reference/, "tag not code ref"); |
|
513 |
- |
|
514 |
-$builder->register_tag({ |
|
515 |
- r => sub {} |
|
516 |
-}); |
|
517 |
- |
|
518 |
-eval{$builder->build_query("{r}")}; |
|
519 |
-like($@, qr/\QTag "r" must return [STRING, ARRAY_REFERENCE]/, "tag return noting"); |
|
520 |
- |
|
521 |
-$builder->register_tag({ |
|
522 |
- s => sub { return ["a", ""]} |
|
523 |
-}); |
|
524 |
- |
|
525 |
-eval{$builder->build_query("{s}")}; |
|
526 |
-like($@, qr/\QTag "s" must return [STRING, ARRAY_REFERENCE]/, "tag return not array columns"); |
|
527 |
- |
|
528 |
-$builder->register_tag( |
|
529 |
- t => sub {return ["a", []]} |
|
530 |
-); |
|
531 |
- |
|
532 |
- |
|
533 |
-test 'General error case'; |
|
534 |
-$builder = DBIx::Custom->new->query_builder; |
|
535 |
-$builder->register_tag( |
|
536 |
- a => sub { |
|
537 |
- return ["? ? ?", ['']]; |
|
538 |
- } |
|
539 |
-); |
|
540 |
-eval{$builder->build_query("{a}")}; |
|
541 |
-like($@, qr/\QPlaceholder count/, "placeholder count is invalid"); |
|
542 |
- |
|
543 |
- |
|
544 |
-test 'Default tag Error case'; |
|
545 |
-eval{$builder->build_query("{= }")}; |
|
546 |
-like($@, qr/Column name must be specified in tag "{= }"/, "basic '=' : key not exist"); |
|
547 |
- |
|
548 |
-eval{$builder->build_query("{in }")}; |
|
549 |
-like($@, qr/Column name and count of values must be specified in tag "{in }"/, "in : key not exist"); |
|
550 |
- |
|
551 |
-eval{$builder->build_query("{in a}")}; |
|
552 |
-like($@, qr/\QColumn name and count of values must be specified in tag "{in }"/, |
|
553 |
- "in : key not exist"); |
|
554 |
- |
|
555 |
-eval{$builder->build_query("{in a r}")}; |
|
556 |
-like($@, qr/\QColumn name and count of values must be specified in tag "{in }"/, |
|
557 |
- "in : key not exist"); |
|
558 |
- |
|
559 |
-test 'variouse source'; |
|
560 |
-$source = "a {= b} c \\{ \\} {= \\{} {= \\}} d;"; |
|
561 |
-$query = $builder->build_query($source); |
|
562 |
-is($query->sql, 'a b = ? c { } { = ? } = ? d;', "basic : 1"); |
|
563 |
- |
|
564 |
-$source = "abc;"; |
|
565 |
-$query = $builder->build_query($source); |
|
566 |
-is($query->sql, 'abc;', "basic : 2"); |
|
567 |
- |
|
568 |
-$source = "{= a}"; |
|
569 |
-$query = $builder->build_query($source); |
|
570 |
-is($query->sql, 'a = ?;', "only tag"); |
|
571 |
- |
|
572 |
-$source = "000;"; |
|
573 |
-$query = $builder->build_query($source); |
|
574 |
-is($query->sql, '000;', "contain 0 value"); |
|
575 |
- |
|
576 |
-$source = "a {= b} }"; |
|
577 |
-eval{$builder->build_query($source)}; |
|
578 |
-like($@, qr/unexpected "}"/, "error : 1"); |
|
579 |
- |
|
580 |
-$source = "a {= {}"; |
|
581 |
-eval{$builder->build_query($source)}; |
|
582 |
-like($@, qr/unexpected "{"/, "error : 2"); |
|
583 | 206 |
|
584 | 207 |
|
585 | 208 |
|
... | ... |
@@ -1501,6 +1124,71 @@ $result = $dbi->execute("select * from ${q}table$p"); |
1501 | 1124 |
$rows = $result->all; |
1502 | 1125 |
is_deeply($rows, [], "reserved word"); |
1503 | 1126 |
|
1127 |
+test 'finish statement handle'; |
|
1128 |
+$dbi = DBIx::Custom->connect; |
|
1129 |
+$dbi->execute($create_table1); |
|
1130 |
+$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
1131 |
+$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
1132 |
+ |
|
1133 |
+$result = $dbi->select(table => 'table1'); |
|
1134 |
+$row = $result->fetch_first; |
|
1135 |
+is_deeply($row, [1, 2], "row"); |
|
1136 |
+$row = $result->fetch; |
|
1137 |
+ok(!$row, "finished"); |
|
1138 |
+ |
|
1139 |
+$result = $dbi->select(table => 'table1'); |
|
1140 |
+$row = $result->fetch_hash_first; |
|
1141 |
+is_deeply($row, {key1 => 1, key2 => 2}, "row"); |
|
1142 |
+$row = $result->fetch_hash; |
|
1143 |
+ok(!$row, "finished"); |
|
1144 |
+ |
|
1145 |
+$dbi->execute('create table table2 (key1, key2);'); |
|
1146 |
+$result = $dbi->select(table => 'table2'); |
|
1147 |
+$row = $result->fetch_hash_first; |
|
1148 |
+ok(!$row, "no row fetch"); |
|
1149 |
+ |
|
1150 |
+$dbi = DBIx::Custom->connect; |
|
1151 |
+eval { $dbi->execute('drop table table1') }; |
|
1152 |
+$dbi->execute($create_table1); |
|
1153 |
+$dbi->insert({key1 => 1, key2 => 2}, table => 'table1'); |
|
1154 |
+$dbi->insert({key1 => 3, key2 => 4}, table => 'table1'); |
|
1155 |
+$dbi->insert({key1 => 5, key2 => 6}, table => 'table1'); |
|
1156 |
+$dbi->insert({key1 => 7, key2 => 8}, table => 'table1'); |
|
1157 |
+$dbi->insert({key1 => 9, key2 => 10}, table => 'table1'); |
|
1158 |
+$result = $dbi->select(table => 'table1'); |
|
1159 |
+$rows = $result->fetch_multi(2); |
|
1160 |
+is_deeply($rows, [[1, 2], |
|
1161 |
+ [3, 4]], "fetch_multi first"); |
|
1162 |
+$rows = $result->fetch_multi(2); |
|
1163 |
+is_deeply($rows, [[5, 6], |
|
1164 |
+ [7, 8]], "fetch_multi secound"); |
|
1165 |
+$rows = $result->fetch_multi(2); |
|
1166 |
+is_deeply($rows, [[9, 10]], "fetch_multi third"); |
|
1167 |
+$rows = $result->fetch_multi(2); |
|
1168 |
+ok(!$rows); |
|
1169 |
+ |
|
1170 |
+$result = $dbi->select(table => 'table1'); |
|
1171 |
+eval {$result->fetch_multi}; |
|
1172 |
+like($@, qr/Row count must be specified/, "Not specified row count"); |
|
1173 |
+ |
|
1174 |
+$result = $dbi->select(table => 'table1'); |
|
1175 |
+$rows = $result->fetch_hash_multi(2); |
|
1176 |
+is_deeply($rows, [{key1 => 1, key2 => 2}, |
|
1177 |
+ {key1 => 3, key2 => 4}], "fetch_multi first"); |
|
1178 |
+$rows = $result->fetch_hash_multi(2); |
|
1179 |
+is_deeply($rows, [{key1 => 5, key2 => 6}, |
|
1180 |
+ {key1 => 7, key2 => 8}], "fetch_multi secound"); |
|
1181 |
+$rows = $result->fetch_hash_multi(2); |
|
1182 |
+is_deeply($rows, [{key1 => 9, key2 => 10}], "fetch_multi third"); |
|
1183 |
+$rows = $result->fetch_hash_multi(2); |
|
1184 |
+ok(!$rows); |
|
1185 |
+ |
|
1186 |
+$result = $dbi->select(table => 'table1'); |
|
1187 |
+eval {$result->fetch_hash_multi}; |
|
1188 |
+like($@, qr/Row count must be specified/, "Not specified row count"); |
|
1189 |
+ |
|
1190 |
+ |
|
1191 |
+ |
|
1504 | 1192 |
|
1505 | 1193 |
|
1506 | 1194 |
|