File Coverage

blib/lib/SQL/Translator/Schema/Procedure.pm
Criterion Covered Total %
statement 15 15 100.0
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 20 20 100.0


line stmt bran cond sub pod time code
1             package SQL::Translator::Schema::Procedure;
2              
3             =pod
4              
5             =head1 NAME
6              
7             SQL::Translator::Schema::Procedure - SQL::Translator procedure object
8              
9             =head1 SYNOPSIS
10              
11             use SQL::Translator::Schema::Procedure;
12             my $procedure = SQL::Translator::Schema::Procedure->new(
13             name => 'foo',
14             sql => 'CREATE PROC foo AS SELECT * FROM bar',
15             parameters => 'foo,bar',
16             owner => 'nomar',
17             comments => 'blah blah blah',
18             schema => $schema,
19             );
20              
21             =head1 DESCRIPTION
22              
23             C is a class for dealing with
24             stored procedures (and possibly other pieces of nameable SQL code?).
25              
26             =head1 METHODS
27              
28             =cut
29              
30 73     73   527 use Moo;
  73         273  
  73         498  
31 73     73   72193 use SQL::Translator::Utils qw(ex2err);
  73         285  
  73         6775  
32 73     73   41050 use SQL::Translator::Role::ListAttr;
  73         285  
  73         729  
33 73     73   46597 use SQL::Translator::Types qw(schema_obj);
  73         293  
  73         5924  
34 73     73   567 use Sub::Quote qw(quote_sub);
  73         281  
  73         56980  
35              
36             extends 'SQL::Translator::Schema::Object';
37              
38             our $VERSION = '1.66';
39              
40             =head2 new
41              
42             Object constructor.
43              
44             my $schema = SQL::Translator::Schema::Procedure->new;
45              
46             =cut
47              
48             =head2 parameters
49              
50             Gets and set the parameters of the stored procedure.
51              
52             $procedure->parameters('id');
53             $procedure->parameters('id', 'name');
54             $procedure->parameters( 'id, name' );
55             $procedure->parameters( [ 'id', 'name' ] );
56             $procedure->parameters( qw[ id name ] );
57              
58             my @parameters = $procedure->parameters;
59              
60             =cut
61              
62             with ListAttr parameters => (uniq => 1);
63              
64             =head2 name
65              
66             Get or set the procedure's name.
67              
68             $procedure->name('foo');
69             my $name = $procedure->name;
70              
71             =cut
72              
73             has name => (is => 'rw', default => quote_sub(q{ '' }));
74              
75             =head2 sql
76              
77             Get or set the procedure's SQL.
78              
79             $procedure->sql('select * from foo');
80             my $sql = $procedure->sql;
81              
82             =cut
83              
84             has sql => (is => 'rw', default => quote_sub(q{ '' }));
85              
86             =head2 order
87              
88             Get or set the order of the procedure.
89              
90             $procedure->order( 3 );
91             my $order = $procedure->order;
92              
93             =cut
94              
95             has order => (is => 'rw');
96              
97             =head2 owner
98              
99             Get or set the owner of the procedure.
100              
101             $procedure->owner('nomar');
102             my $sql = $procedure->owner;
103              
104             =cut
105              
106             has owner => (is => 'rw', default => quote_sub(q{ '' }));
107              
108             =head2 comments
109              
110             Get or set the comments on a procedure.
111              
112             $procedure->comments('foo');
113             $procedure->comments('bar');
114             print join( ', ', $procedure->comments ); # prints "foo, bar"
115              
116             =cut
117              
118             has comments => (
119             is => 'rw',
120             coerce => quote_sub(q{ ref($_[0]) eq 'ARRAY' ? $_[0] : [$_[0]] }),
121             default => quote_sub(q{ [] }),
122             );
123              
124             around comments => sub {
125             my $orig = shift;
126             my $self = shift;
127             my @comments = ref $_[0] ? @{ $_[0] } : @_;
128              
129             for my $arg (@comments) {
130             $arg = $arg->[0] if ref $arg;
131             push @{ $self->$orig }, $arg if defined $arg && $arg;
132             }
133              
134             return wantarray ? @{ $self->$orig } : join("\n", @{ $self->$orig });
135             };
136              
137             =head2 schema
138              
139             Get or set the procedures's schema object.
140              
141             $procedure->schema( $schema );
142             my $schema = $procedure->schema;
143              
144             =cut
145              
146             has schema => (is => 'rw', isa => schema_obj('Schema'), weak_ref => 1);
147              
148             around schema => \&ex2err;
149              
150             =head2 equals
151              
152             Determines if this procedure is the same as another
153              
154             my $isIdentical = $procedure1->equals( $procedure2 );
155              
156             =cut
157              
158             around equals => sub {
159             my $orig = shift;
160             my $self = shift;
161             my $other = shift;
162             my $case_insensitive = shift;
163             my $ignore_sql = shift;
164              
165             return 0 unless $self->$orig($other);
166             return 0
167             unless $case_insensitive
168             ? uc($self->name) eq uc($other->name)
169             : $self->name eq $other->name;
170              
171             unless ($ignore_sql) {
172             my $selfSql = $self->sql;
173             my $otherSql = $other->sql;
174              
175             # Remove comments
176             $selfSql =~ s/--.*$//mg;
177             $otherSql =~ s/--.*$//mg;
178              
179             # Collapse whitespace to space to avoid whitespace comparison issues
180             $selfSql =~ s/\s+/ /sg;
181             $otherSql =~ s/\s+/ /sg;
182             return 0 unless $selfSql eq $otherSql;
183             }
184              
185             return 0
186             unless $self->_compare_objects(scalar $self->parameters, scalar $other->parameters);
187              
188             # return 0 unless $self->comments eq $other->comments;
189             # return 0 unless $case_insensitive ? uc($self->owner) eq uc($other->owner) : $self->owner eq $other->owner;
190             return 0
191             unless $self->_compare_objects(scalar $self->extra, scalar $other->extra);
192             return 1;
193             };
194              
195             # Must come after all 'has' declarations
196             around new => \&ex2err;
197              
198             1;
199              
200             =pod
201              
202             =head1 AUTHORS
203              
204             Ken Youens-Clark Ekclark@cshl.orgE,
205             Paul Harrington EPaul-Harrington@deshaw.comE.
206              
207             =cut