The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
This file was generated by Devel::Cover Version 0.96
Devel::Cover is copyright 2001-2012, Paul Johnson (paul@pjcj.net)
Devel::Cover is free. It is licensed under the same terms as Perl itself.
The latest version of Devel::Cover should be available from my homepage:
http://www.pjcj.net
-->
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <link rel="stylesheet" type="text/css" href="cover.css"></link>
    <title>File Coverage: lib/DBIx/SchemaChecksum.pm</title>
</head>
<body>
<h1>File Coverage</h1>
<table>
<tr><td class="h" align="right">File:</td><td align="left">lib/DBIx/SchemaChecksum.pm</td></tr>
<tr><td class="h" align="right">Coverage:</td><td align="left" class="c0">73.4%</td></tr>
</table>
<div><br/></div>
<table>
<tr><th>line</th><th>stmt</th><th>bran</th><th>cond</th><th>sub</th><th>time</th><th>code</th></tr>
<tr><td class="h">1</td><td></td><td></td><td></td><td></td><td></td><td class="s">package DBIx::SchemaChecksum;</td></tr>
<tr><td class="h">2</td><td colspan="6"></td></tr><tr><td class="h">3</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L3">12</a></div></td><td><div>502833</div><div>30</div><div>343</div></td><td class="s">use 5.010;</td></tr>
<tr><td class="h">4</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L4">12</a></div></td><td><div>2315</div><div>5155350</div><div>194</div></td><td class="s">use Moose;</td></tr>
<tr><td class="h">5</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L5">12</a></div></td><td><div>123627</div><div>5224</div><div>157</div></td><td class="s">use version; our $VERSION = version-&gt;new(&#39;0.28&#39;);</td></tr>
<tr><td class="h">6</td><td colspan="6"></td></tr><tr><td class="h">7</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L7">12</a></div></td><td><div>8670</div><div>76186</div><div>512</div></td><td class="s">use DBI;</td></tr>
<tr><td class="h">8</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L8">12</a></div></td><td><div>2558</div><div>3985</div><div>332</div></td><td class="s">use Digest::SHA1;</td></tr>
<tr><td class="h">9</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L9">12</a></div></td><td><div>3015</div><div>36595</div><div>456</div></td><td class="s">use Data::Dumper;</td></tr>
<tr><td class="h">10</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L10">12</a></div></td><td><div>1433</div><div>148846</div><div>389</div></td><td class="s">use Path::Class;</td></tr>
<tr><td class="h">11</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L11">12</a></div></td><td><div>38</div><div>11</div><div>363</div></td><td class="s">use Carp;</td></tr>
<tr><td class="h">12</td><td><div class="c3">12</div><div class="c3">12</div><div class="c3">12</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L12">12</a></div></td><td><div>2520</div><div>74927</div><div>172</div></td><td class="s">use File::Find::Rule;</td></tr>
<tr><td class="h">13</td><td></td><td></td><td></td><td></td><td></td><td class="s">with  &#39;MooseX::Getopt&#39;;</td></tr>
<tr><td class="h">14</td><td colspan="6"></td></tr><tr><td class="h">15</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;dbh&#39; =&gt; ( is =&gt; &#39;ro&#39;, required=&gt;1 );</td></tr>
<tr><td class="h">16</td><td colspan="6"></td></tr><tr><td class="h">17</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;catalog&#39; =&gt; (</td></tr>
<tr><td class="h">18</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is =&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">19</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">20</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default =&gt; &#39;%&#39;,</td></tr>
<tr><td class="h">21</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;documentation =&gt; q[might be required by some DBI drivers]</td></tr>
<tr><td class="h">22</td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">23</td><td colspan="6"></td></tr><tr><td class="h">24</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;schemata&#39; =&gt; (</td></tr>
<tr><td class="h">25</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is =&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">26</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa =&gt; &#39;ArrayRef[Str]&#39;,</td></tr>
<tr><td class="h">27</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default =&gt; sub { [&#39;%&#39;] },</td></tr>
<tr><td class="h">28</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;documentation =&gt; q[List of schematas to include in checksum]</td></tr>
<tr><td class="h">29</td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">30</td><td colspan="6"></td></tr><tr><td class="h">31</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;tabletype&#39; =&gt; (</td></tr>
<tr><td class="h">32</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is =&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">33</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">34</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default =&gt; &#39;table&#39;,</td></tr>
<tr><td class="h">35</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;documentation =&gt; q[Table type according to DBI-&gt;table_info]</td></tr>
<tr><td class="h">36</td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">37</td><td colspan="6"></td></tr><tr><td class="h">38</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;sqlsnippetdir&#39; =&gt; (</td></tr>
<tr><td class="h">39</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa =&gt; &#39;Str&#39;,</td></tr>
<tr><td class="h">40</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is =&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">41</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;documentation =&gt; q[Directory containing sql update files],</td></tr>
<tr><td class="h">42</td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">43</td><td colspan="6"></td></tr><tr><td class="h">44</td><td></td><td></td><td></td><td></td><td></td><td class="s"># mainly needed for scripts</td></tr>
<tr><td class="h">45</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;verbose&#39;      =&gt; ( is =&gt; &#39;rw&#39;, isa =&gt; &#39;Bool&#39;, default =&gt; 0 );</td></tr>
<tr><td class="h">46</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;dry_run&#39;      =&gt; ( is =&gt; &#39;rw&#39;, isa =&gt; &#39;Bool&#39;, default =&gt; 0 );</td></tr>
<tr><td class="h">47</td><td colspan="6"></td></tr><tr><td class="h">48</td><td></td><td></td><td></td><td></td><td></td><td class="s"># internal</td></tr>
<tr><td class="h">49</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;_update_path&#39; =&gt; ( is =&gt; &#39;rw&#39;, isa =&gt; &#39;HashRef&#39;, lazy_build=&gt;1 );</td></tr>
<tr><td class="h">50</td><td></td><td></td><td></td><td></td><td></td><td class="s">has &#39;_schemadump&#39; =&gt; (</td></tr>
<tr><td class="h">51</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa=&gt;&#39;Str&#39;,</td></tr>
<tr><td class="h">52</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is=&gt;&#39;rw&#39;,</td></tr>
<tr><td class="h">53</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;lazy_build=&gt;1,</td></tr>
<tr><td class="h">54</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;clearer=&gt;&#39;reset_checksum&#39;,</td></tr>
<tr><td class="h">55</td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">56</td><td colspan="6"></td></tr><tr><td class="h">57 - 110</td><td colspan="5"></td><td class="s"><pre>=head1 NAME

DBIx::SchemaChecksum - Generate and compare checksums of database schematas

=head1 SYNOPSIS

    my $sc = DBIx::SchemaChecksum-&gt;new( dsn =&gt; &#39;dbi:Pg:name=foo&#39; );
    print $sc-&gt;checksum;

=head1 DESCRIPTION

When you&#39;re dealing with several instances of the same database (eg.  
developer, testing, stage, production), it is crucial to make sure 
that all databases use the same schema. This can be quite an 
hair-pulling experience, and this module should help you keep your 
hair (if you&#39;re already bald, it won&#39;t make your hair grow back, 
sorry...)

DBIx::SchemaChecksum connects to your database, gets schema 
information (tables, columns, primary keys, foreign keys) and 
generates a SHA1 digest. This digest can then be used to easily verify schema consistency across different databases.

B&lt;Caveat:&gt; The same schema might produce different checksums on 
different database versions.

DBIx::SchemaChecksum works with PostgreSQL 8.3 and SQLite (but see 
below). I assume that thanks to the abstraction provided by the C&lt;DBI&gt; 
it works with most databases. If you try DBIx::SchemaChecksum with 
different database systems, I&#39;d love to hear some feedback...

=head2 SQLite and column_info

DBD::SQLite doesn&#39;t really implement C&lt;column_info&gt;, which is needed 
to generate the checksum. We use the monkey-patch included in
http://rt.cpan.org/Public/Bug/Display.html?id=13631 
to make it work

=head2 Scripts

Please take a look at the scripts included in this distribution:

=head3 schema_checksum.pl

Calculates the checksum and prints it to STDOUT

=head3 schema_update.pl

Updates a schema based on the current checksum and SQL snippet files 

=head1 METHODS 

=head2 Public Methods

=cut</pre></td></tr>
<tr><td class="h">111</td><td colspan="6"></td></tr><tr><td class="h">112</td><td></td><td></td><td></td><td></td><td></td><td class="s">sub checksum {</td></tr>
<tr><td class="h">113</td><td><div class="c3">22</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L113">22</a></div></td><td><div>18004</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">114</td><td><div class="c3">22</div></td><td></td><td></td><td></td><td><div>598</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return Digest::SHA1::sha1_hex($self-&gt;_schemadump);</td></tr>
<tr><td class="h">115</td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">116</td><td colspan="6"></td></tr><tr><td class="h">117 - 124</td><td colspan="5"></td><td class="s"><pre>=head3 schemadump

    my $schemadump = $self-&gt;schemadump;

Returns a string representation of the whole schema (as a Data::Dumper 
Dump).

=cut</pre></td></tr>
<tr><td class="h">125</td><td colspan="6"></td></tr><tr><td class="h">126</td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _build__schemadump {</td></tr>
<tr><td class="h">127</td><td><div class="c3">13</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L127">13</a></div></td><td><div>20</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">128</td><td colspan="6"></td></tr><tr><td class="h">129</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>351</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $tabletype = $self-&gt;tabletype;</td></tr>
<tr><td class="h">130</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>351</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $catalog   = $self-&gt;catalog;</td></tr>
<tr><td class="h">131</td><td colspan="6"></td></tr><tr><td class="h">132</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>335</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $dbh = $self-&gt;dbh;</td></tr>
<tr><td class="h">133</td><td colspan="6"></td></tr><tr><td class="h">134</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>43</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my @metadata = qw(COLUMN_NAME COLUMN_SIZE NULLABLE TYPE_NAME COLUMN_DEF);</td></tr>
<tr><td class="h">135</td><td colspan="6"></td></tr><tr><td class="h">136</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>25</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %relevants = ();</td></tr>
<tr><td class="h">137</td><td><div class="c3">13</div><div class="c3">13</div></td><td></td><td></td><td></td><td><div>12</div><div>362</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $schema ( @{ $self-&gt;schemata } ) {</td></tr>
<tr><td class="h">138</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>246</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach</td></tr>
<tr><td class="h">139</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $table ( $dbh-&gt;tables( $catalog, $schema, &#39;%&#39;, $tabletype ) )</td></tr>
<tr><td class="h">140</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</td></tr>
<tr><td class="h">141</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>9287</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$table=~s/&quot;//g;</td></tr>
<tr><td class="h">142</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>30</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my %data;</td></tr>
<tr><td class="h">143</td><td colspan="6"></td></tr><tr><td class="h">144</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# remove schema name from table</td></tr>
<tr><td class="h">145</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>37</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $t = $table;</td></tr>
<tr><td class="h">146</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>84</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$t =~ s/^.*?\.//;</td></tr>
<tr><td class="h">147</td><td colspan="6"></td></tr><tr><td class="h">148</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>555</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my @pks = $dbh-&gt;primary_key( $catalog, $schema, $t );</td></tr>
<tr><td class="h">149</td><td><div class="c3">33</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L149">50</a></div></td><td></td><td></td><td><div>33967</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data{primary_keys} = \@pks if @pks;</td></tr>
<tr><td class="h">150</td><td colspan="6"></td></tr><tr><td class="h">151</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# columns</td></tr>
<tr><td class="h">152</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>564</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $sth_col = $dbh-&gt;column_info( $catalog, $schema, $t, &#39;%&#39; );</td></tr>
<tr><td class="h">153</td><td colspan="6"></td></tr><tr><td class="h">154</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>25350</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $column_info = $sth_col-&gt;fetchall_hashref(&#39;COLUMN_NAME&#39;);</td></tr>
<tr><td class="h">155</td><td colspan="6"></td></tr><tr><td class="h">156</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>7210</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ( my ( $column, $data ) = each %$column_info ) {</td></tr>
<tr><td class="h">157</td><td><div class="c3">75</div><div class="c3">375</div></td><td></td><td></td><td></td><td><div>63</div><div>454</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $info = { map { $_ =&gt; $data-&gt;{$_} } @metadata };</td></tr>
<tr><td class="h">158</td><td colspan="6"></td></tr><tr><td class="h">159</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# add postgres enums</td></tr>
<tr><td class="h">160</td><td><div class="c3">75</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L160">50</a></div></td><td></td><td></td><td><div>128</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $data-&gt;{pg_enum_values} ) {</td></tr>
<tr><td class="h">161</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$info-&gt;{pg_enum_values} = $data-&gt;{pg_enum_values};</td></tr>
<tr><td class="h">162</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">163</td><td colspan="6"></td></tr><tr><td class="h">164</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# some cleanup</td></tr>
<tr><td class="h">165</td><td><div class="c3">75</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L165">50</a></div></td><td></td><td></td><td><div>93</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (my $default = $info-&gt;{COLUMN_DEF}) {</td></tr>
<tr><td class="h">166</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L166">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $default =~ /nextval/ ) {</td></tr>
<tr><td class="h">167</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$default =~ m{&#39;([\w\.\-_]+)&#39;};</td></tr>
<tr><td class="h">168</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L168">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($1) {</td></tr>
<tr><td class="h">169</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $new = $1;</td></tr>
<tr><td class="h">170</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$new =~ s/^\w+\.//;</td></tr>
<tr><td class="h">171</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$default = &#39;nextval:&#39; . $new;</td></tr>
<tr><td class="h">172</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">173</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">174</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$default=~s/[&quot;&#39;\(\)\[\]\{\}]//g;</td></tr>
<tr><td class="h">175</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$info-&gt;{COLUMN_DEF}=$default;</td></tr>
<tr><td class="h">176</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">177</td><td colspan="6"></td></tr><tr><td class="h">178</td><td><div class="c3">75</div></td><td></td><td></td><td></td><td><div>234</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$info-&gt;{TYPE_NAME} =~ s/^(?:.+\.)?(.+)$/$1/g;</td></tr>
<tr><td class="h">179</td><td colspan="6"></td></tr><tr><td class="h">180</td><td><div class="c3">75</div></td><td></td><td></td><td></td><td><div>221</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data{columns}{$column} = $info;</td></tr>
<tr><td class="h">181</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">182</td><td colspan="6"></td></tr><tr><td class="h">183</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# foreign keys</td></tr>
<tr><td class="h">184</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>129</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $sth_fk</td></tr>
<tr><td class="h">185</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $dbh-&gt;foreign_key_info( &#39;&#39;, &#39;&#39;, &#39;&#39;, $catalog, $schema, $t );</td></tr>
<tr><td class="h">186</td><td><div class="c3">33</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L186">50</a></div></td><td></td><td></td><td><div>51</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($sth_fk) {</td></tr>
<tr><td class="h">187</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data{foreign_keys} = $sth_fk-&gt;fetchall_arrayref( {</td></tr>
<tr><td class="h">188</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map { $_ =&gt; 1 }</td></tr>
<tr><td class="h">189</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qw(FK_NAME UK_NAME UK_COLUMN_NAME FK_TABLE_NAME FK_COLUMN_NAME UPDATE_RULE DELETE_RULE)</td></tr>
<tr><td class="h">190</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">191</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</td></tr>
<tr><td class="h">192</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Nasty workaround</td></tr>
<tr><td class="h">193</td><td><div class="c0">0</div><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $row (@{$data{foreign_keys}}) {</td></tr>
<tr><td class="h">194</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row-&gt;{DEFERRABILITY} = undef;</td></tr>
<tr><td class="h">195</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">196</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">197</td><td colspan="6"></td></tr><tr><td class="h">198</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# postgres unique constraints</td></tr>
<tr><td class="h">199</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# very crude hack to see if we&#39;re running postgres</td></tr>
<tr><td class="h">200</td><td><div class="c3">33</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L200">50</a></div></td><td></td><td></td><td><div>92</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $INC{&#39;DBD/Pg.pm&#39;} ) {</td></tr>
<tr><td class="h">201</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my @unique;</td></tr>
<tr><td class="h">202</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $sth=$dbh-&gt;prepare( &quot;select indexdef from pg_indexes where schemaname=? and tablename=?&quot;);</td></tr>
<tr><td class="h">203</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sth-&gt;execute($schema, $t);</td></tr>
<tr><td class="h">204</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (my ($index) =$sth-&gt;fetchrow_array) {</td></tr>
<tr><td class="h">205</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$index=~s/$schema\.//g;</td></tr>
<tr><td class="h">206</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push(@unique,$index);</td></tr>
<tr><td class="h">207</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">208</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@unique = sort (@unique);</td></tr>
<tr><td class="h">209</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L209">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data{unique_keys} = \@unique if @unique;</td></tr>
<tr><td class="h">210</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">211</td><td colspan="6"></td></tr><tr><td class="h">212</td><td><div class="c3">33</div></td><td></td><td></td><td></td><td><div>915</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$relevants{$table} = \%data;</td></tr>
<tr><td class="h">213</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">214</td><td colspan="6"></td></tr><tr><td class="h">215</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">216</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>252</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $dumper = Data::Dumper-&gt;new( [ \%relevants ] );</td></tr>
<tr><td class="h">217</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>597</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$dumper-&gt;Sortkeys(1);</td></tr>
<tr><td class="h">218</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>311</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;$dumper-&gt;Indent(1);</td></tr>
<tr><td class="h">219</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>344</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $dump = $dumper-&gt;Dump;</td></tr>
<tr><td class="h">220</td><td><div class="c3">13</div></td><td></td><td></td><td></td><td><div>2159</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return $dump;</td></tr>
<tr><td class="h">221</td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">222</td><td colspan="6"></td></tr><tr><td class="h">223 - 233</td><td colspan="5"></td><td class="s"><pre>=head3 build_update_path

    my $update_info = $self-&gt;build_update_path( &#39;/path/to/sql/snippets&#39; )

Builds the datastructure needed by L&lt;apply_sql_update&gt;.
C&lt;build_update_path&gt; reads in all files ending in &quot;.sql&quot; in the
directory passed in (or defaulting to C&lt;&lt; $self-&gt;sqlsnippetdir &gt;&gt;). It 
builds something like a linked list of files, which are chained by 
their C&lt;preSHA1sum&gt; and C&lt;postSHA1sum&gt;.

=cut</pre></td></tr>
<tr><td class="h">234</td><td colspan="6"></td></tr><tr><td class="h">235</td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _build__update_path {</td></tr>
<tr><td class="h">236</td><td><div class="c3">9</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L236">9</a></div></td><td><div>12</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">237</td><td><div class="c3">9</div></td><td></td><td></td><td></td><td><div>196</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $dir = $self-&gt;sqlsnippetdir;</td></tr>
<tr><td class="h">238</td><td><div class="c3">9</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L238">50</a></div></td><td></td><td></td><td><div>18</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;croak(&quot;Please specify sqlsnippetdir&quot;) unless $dir;</td></tr>
<tr><td class="h">239</td><td><div class="c3">9</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L239">100</a></div></td><td></td><td></td><td><div>79</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;croak(&quot;Cannot find sqlsnippetdir: $dir&quot;) unless -d $dir;</td></tr>
<tr><td class="h">240</td><td colspan="6"></td></tr><tr><td class="h">241</td><td><div class="c3">7</div></td><td><div class="c0" title="-/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L241">50</a></div></td><td></td><td></td><td><div>146</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;say &quot;Checking directory $dir for checksum_files&quot; if $self-&gt;verbose;</td></tr>
<tr><td class="h">242</td><td colspan="6"></td></tr><tr><td class="h">243</td><td><div class="c3">7</div></td><td></td><td></td><td></td><td><div>8</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %update_info;</td></tr>
<tr><td class="h">244</td><td><div class="c3">7</div></td><td></td><td></td><td></td><td><div>132</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my @files = File::Find::Rule-&gt;file-&gt;name(&#39;*.sql&#39;)-&gt;in($dir);</td></tr>
<tr><td class="h">245</td><td colspan="6"></td></tr><tr><td class="h">246</td><td><div class="c3">7</div></td><td></td><td></td><td></td><td><div>5285</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;foreach my $file ( sort @files ) {</td></tr>
<tr><td class="h">247</td><td><div class="c3">18</div></td><td></td><td></td><td></td><td><div>2926</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ( $pre, $post ) = $self-&gt;get_checksums_from_snippet($file);</td></tr>
<tr><td class="h">248</td><td colspan="6"></td></tr><tr><td class="h">249</td><td><div class="c3">18</div></td><td><div class="c0" title="-/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L249">0</a></div></td><td><div class="c0"><a href="lib-DBIx-SchemaChecksum-pm--condition.html#L249">33</a></div></td><td></td><td><div>24</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( !$pre &amp;&amp; !$post ) {</td></tr>
<tr><td class="h">250</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L250">0</a></div></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;say &quot;skipping $file (has no checksums)&quot; if $self-&gt;verbose;</td></tr>
<tr><td class="h">251</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next;</td></tr>
<tr><td class="h">252</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">253</td><td colspan="6"></td></tr><tr><td class="h">254</td><td><div class="c3">18</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L254">100</a></div></td><td></td><td></td><td><div>31</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $pre eq $post ) {</td></tr>
<tr><td class="h">255</td><td><div class="c3">3</div></td><td><div class="c0" title="T/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L255">50</a></div></td><td></td><td></td><td><div>7</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $update_info{$pre} ) {</td></tr>
<tr><td class="h">256</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td><div>7</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my @new = (&#39;SAME_CHECKSUM&#39;);</td></tr>
<tr><td class="h">257</td><td><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td></td><td><div>3</div><div>7</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $item ( @{ $update_info{$pre} } ) {</td></tr>
<tr><td class="h">258</td><td><div class="c3">6</div></td><td><div class="c0" title="T/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L258">50</a></div></td><td></td><td></td><td><div>294</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push( @new, $item ) unless $item eq &#39;SAME_CHECKSUM&#39;;</td></tr>
<tr><td class="h">259</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">260</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td><div>7</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$update_info{$pre} = \@new;</td></tr>
<tr><td class="h">261</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">262</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {</td></tr>
<tr><td class="h">263</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$update_info{$pre} = [&#39;SAME_CHECKSUM&#39;];</td></tr>
<tr><td class="h">264</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">265</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">266</td><td colspan="6"></td></tr><tr><td class="h">267</td><td><div class="c3">18</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L267">100</a></div></td><td><div class="c0"><a href="lib-DBIx-SchemaChecksum-pm--condition.html#L267">67</a></div></td><td></td><td><div>47</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (   $update_info{$pre}</td></tr>
<tr><td class="h">268</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; $update_info{$pre}-&gt;[0] eq &#39;SAME_CHECKSUM&#39; )</td></tr>
<tr><td class="h">269</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</td></tr>
<tr><td class="h">270</td><td><div class="c3">3</div></td><td><div class="c0" title="T/-"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L270">50</a></div></td><td></td><td></td><td><div>6</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $post eq $pre ) {</td></tr>
<tr><td class="h">271</td><td><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td></td><td><div>4</div><div>41</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;splice( @{ $update_info{$pre} },</td></tr>
<tr><td class="h">272</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1, 0, Path::Class::File-&gt;new($file), $post );</td></tr>
<tr><td class="h">273</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">274</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {</td></tr>
<tr><td class="h">275</td><td><div class="c0">0</div><div class="c0">0</div></td><td></td><td></td><td></td><td><div>0</div><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push( @{ $update_info{$pre} },</td></tr>
<tr><td class="h">276</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path::Class::File-&gt;new($file), $post );</td></tr>
<tr><td class="h">277</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">278</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">279</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {</td></tr>
<tr><td class="h">280</td><td><div class="c3">15</div></td><td></td><td></td><td></td><td><div>248</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$update_info{$pre} = [ Path::Class::File-&gt;new($file), $post ];</td></tr>
<tr><td class="h">281</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">282</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">283</td><td colspan="6"></td></tr><tr><td class="h">284</td><td><div class="c3">7</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L284">100</a></div></td><td></td><td></td><td><div>1234</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return $self-&gt;_update_path( \%update_info ) if %update_info;</td></tr>
<tr><td class="h">285</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td><div>31</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return;</td></tr>
<tr><td class="h">286</td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">287</td><td colspan="6"></td></tr><tr><td class="h">288 - 301</td><td colspan="5"></td><td class="s"><pre>=head3 get_checksums_from_snippet

    my ($pre, $post) = $self-&gt;get_checksums_from_snippet( $file );

Returns a list of the preSHA1sum and postSHA1sum for the given file.

The file has to contain this info in SQL comments, eg:

  -- preSHA1sum: 89049e457886a86886a4fdf1f905b69250a8236c
  -- postSHA1sum: d9a02517255045167053ea92dace728e1389f8ca

  alter table foo add column bar;

=cut</pre></td></tr>
<tr><td class="h">302</td><td colspan="6"></td></tr><tr><td class="h">303</td><td></td><td></td><td></td><td></td><td></td><td class="s">sub get_checksums_from_snippet {</td></tr>
<tr><td class="h">304</td><td><div class="c3">22</div></td><td></td><td></td><td><div class="c3"><a href="lib-DBIx-SchemaChecksum-pm--subroutine.html#L304">22</a></div></td><td><div>5904</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $filename) = @_;</td></tr>
<tr><td class="h">305</td><td><div class="c3">22</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L305">100</a></div></td><td></td><td></td><td><div>48</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;die &quot;need a filename&quot; unless $filename;</td></tr>
<tr><td class="h">306</td><td colspan="6"></td></tr><tr><td class="h">307</td><td><div class="c3">21</div></td><td></td><td></td><td></td><td><div>16</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my %checksums;</td></tr>
<tr><td class="h">308</td><td colspan="6"></td></tr><tr><td class="h">309</td><td><div class="c3">21</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L309">100</a></div></td><td></td><td></td><td><div>284</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;open( my $fh, &quot;&lt;&quot;, $filename ) || croak &quot;Cannot read $filename: $!&quot;;</td></tr>
<tr><td class="h">310</td><td><div class="c3">20</div></td><td></td><td></td><td></td><td><div>186</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;while (&lt;$fh&gt;) {</td></tr>
<tr><td class="h">311</td><td><div class="c3">114</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L311">100</a></div></td><td></td><td></td><td><div>252</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (m/^--\s+(pre|post)SHA1sum:?\s+([0-9A-Fa-f]{40,})\s+$/) {</td></tr>
<tr><td class="h">312</td><td><div class="c3">39</div></td><td></td><td></td><td></td><td><div>114</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$checksums{$1} = $2;</td></tr>
<tr><td class="h">313</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">314</td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">315</td><td><div class="c3">20</div></td><td></td><td></td><td></td><td><div>57</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;close $fh;</td></tr>
<tr><td class="h">316</td><td><div class="c3">20</div><div class="c3">40</div></td><td><div class="c3" title="T/F"><a href="lib-DBIx-SchemaChecksum-pm--branch.html#L316">100</a></div></td><td></td><td></td><td><div>25</div><div>152</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return map { $checksums{$_} || &#39;&#39; } qw(pre post);</td></tr>
<tr><td class="h">317</td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">318</td><td colspan="6"></td></tr><tr><td class="h">319 - 362</td><td colspan="5"></td><td class="s"><pre>=head2 Attributes generated by Moose

All of this methods can also be set from the commandline. See 
MooseX::Getopts.

=head3 dbh

The database handle (DBH::db). 

=head3 dsn

The dsn.

=head3 user

The user to use to connect to the DB.

=head3 password

The password to use to authenticate the user.

=head3 catalog

The database catalog searched for data. Not implemented by all DBs. See C&lt;DBI::table_info&gt;

Default C&lt;%&gt;.

=head3 schemata

An Arrayref containg names of schematas to include in checksum calculation. See C&lt;DBI::table_info&gt;

Default C&lt;%&gt;.

=head3 tabletype

What kind of tables to include in checksum calculation. See C&lt;DBI::table_info&gt;

Default C&lt;table&gt;.

=head3 verbose

Be verbose or not. Default: 0

=cut</pre></td></tr>
<tr><td class="h">363</td><td colspan="6"></td></tr><tr><td class="h">364</td><td></td><td></td><td></td><td></td><td></td><td class="s">q{ Favourite record of the moment: The Dynamics - Version Excursions }</td></tr>
<tr><td class="h">365</td><td colspan="6"></td></tr></table>
</body>
</html>