File Coverage

blib/lib/SQL/Load.pm
Criterion Covered Total %
statement 68 71 95.7
branch 20 28 71.4
condition 1 3 33.3
subroutine 14 14 100.0
pod 3 3 100.0
total 106 119 89.0


line stmt bran cond sub pod time code
1             package SQL::Load;
2              
3 6     6   339340 use strict;
  6         55  
  6         172  
4 6     6   31 use warnings;
  6         12  
  6         159  
5 6     6   30 use Carp;
  6         11  
  6         395  
6 6         346 use SQL::Load::Util qw/
7             name_list
8             remove_extension
9 6     6   2587 /;
  6         15  
10 6     6   2502 use SQL::Load::Method;
  6         17  
  6         6389  
11              
12             our $VERSION = '0.05';
13              
14             sub new {
15 5     5 1 1299 my ($class, $path, $end) = @_;
16            
17             # valid if path exists
18 5 50       20 croak "Path not defined!" unless $path;
19 5 50       98 croak "The '$path' path does not exist!" unless -d $path;
20            
21 5         44 my $self = {
22             _path => $path,
23             _end => $end,
24             _data => {},
25             _keys => {}
26             };
27            
28 5         23 return bless $self, $class;
29             }
30              
31             sub load {
32 28     28 1 1676 my ($self, $file_name, $reload) = @_;
33            
34 28         42 my $name;
35            
36 28 100       152 if ($file_name =~ /^([\w\-\/\.]+)\#([\w\-]+)$/) {
37 18         56 $file_name = remove_extension($1);
38 18         45 $name = $2;
39             } else {
40 10         32 $file_name = remove_extension($file_name);
41             }
42            
43 28 50 33     180 if ($file_name && $file_name =~ /^[\w\-\/]+$/) {
44             # if true not get tmp
45 28 100       64 unless ($reload) {
46             # check if exist the key to get tmp
47 26         58 my $key = $self->_key($file_name);
48            
49             # check if tmp exists, if true return
50 26 100       110 if ($key) {
51 19 100       50 return $name
52             ? $self->_get_tmp($key)->name($name)
53             : $self->_get_tmp($key);
54             }
55             }
56            
57             # get name list
58 9         37 my $name_list = name_list($file_name);
59            
60             # get file from name list
61 9         25 my $file = $self->_find_file($name_list);
62            
63             # get content
64 9         57 my $content = $self->_file_content($file);
65            
66             # set tmp
67 9         51 $self->_set_tmp($content, $file, $name_list);
68            
69             return $name
70             ? SQL::Load::Method->new($content, $self->{_end})->name($name)
71 9 50       70 : SQL::Load::Method->new($content, $self->{_end});
72             }
73            
74 0         0 croak "the name '$file_name' is invalid!";
75             }
76              
77             sub reload {
78 1     1 1 709 my ($self, $file_name) = @_;
79            
80 1         5 return $self->load($file_name, 1);
81             }
82              
83             sub _find_file {
84 9     9   33 my ($self, $name_list) = @_;
85            
86 9         13 my $file;
87            
88 9         25 for my $name (@$name_list) {
89 18         53 my $is_file = $self->{_path} . '/' . $name . '.sql';
90            
91 18 100       376 if (-e $is_file) {
92 9         27 $file = $is_file;
93            
94 9         28 last;
95             }
96            
97 9 50       37 last if $file;
98             }
99            
100 9 50       33 return $file if $file;
101            
102 0         0 croak "The file does not exist!";
103             }
104              
105             sub _file_content {
106 9     9   26 my ($self, $file) = @_;
107              
108 9         17 my $content = '';
109            
110 9 50       293 open FH, '<', $file or croak $!;
111 9         367 while () {
112 103         262 $content .= $_;
113             }
114 9         94 close FH;
115            
116 9         323 $content =~ s/^\s+|\s+$//g;
117            
118 9         44 return $content;
119             }
120              
121             sub _key {
122 26     26   67 my ($self, $name) = @_;
123            
124 26 100       104 return $self->{_keys}->{$name} if exists $self->{_keys}->{$name};
125            
126 7         18 return;
127             }
128              
129             sub _generate_key {
130 9     9   102 my @characters = ('0'..'9', 'A'..'Z', 'a'..'z');
131 9         22 my $x = int scalar @characters;
132 9         249 my $result = join '', map $characters[rand $x], 1..16;
133              
134 9         57 return $result;
135             }
136              
137             sub _get_tmp {
138 19     19   42 my ($self, $key) = @_;
139            
140             return SQL::Load::Method->new($self->{_data}->{$key}->{content})
141 19 50       81 if exists $self->{_data}->{$key}->{content};
142            
143 0         0 return;
144             }
145              
146             sub _set_tmp {
147 9     9   30 my ($self, $content, $file, $name_list) = @_;
148            
149             # generate new key
150 9         21 my $key = $self->_generate_key;
151            
152             # save name => key in tmp keys
153 9         54 $self->{_keys}->{$_} = $key for @$name_list;
154            
155             # save data in tmp data
156 9         34 $self->{_data}->{$key}->{content} = $content;
157             }
158              
159             1;
160              
161             __END__