C:\cpanrun\depot\main\contrib-patched\perl\CPAN\src\Data-Sync\blib/html/site/lib/Data/Sync/Advanced.html


put</pre> <pre> <span class=``keyword''>my</span> <span class=``variable''>$result</span> <span class=``operator''>=</span> <span class=``variable''>$sync</span><span class=``operator''>-&gt;</span><span class=``variable''>put</span><span class=``operator''>(</span><span class=``variable''>$AoH</span><span class=``operator''>);</span> </pre> <p>This function writes the content of $AoH (an array of hashes) to the target defined in the Data::Sync constructor, and returns the result (1 for success).</p> <p> </p> <h2><a name=``hashrecord''>hashrecord</a></h2> <pre> <span class=``keyword''>my</span> <span class=``variable''>$hash</span> <span class=``operator''>=</span> <span class=``variable''>$sync</span><span class=``operator''>-&gt;</span><span class=``variable''>hashrecord</span><span class=``operator''>(</span><span class=``variable''>$hashref</span><span class=``operator''>,</span><span class=``variable''>$arrayref</span><span class=``operator''>);</span> </pre> <p>This function is used internally by Data::Sync to detect changes in records (for minimising writes), but is also accessible for other uses. It takes a hashref of the db record, and an arrayref of attributes to include in the hash. It returns a hex representation of the MD5 hash of the concatenated record values. You can also call it with</p> <pre> <span class=``keyword''>my</span> <span class=``variable''>$hash</span> <span class=``operator''>=</span> <span class=``variable''>Data::Sync</span><span class=``operator''>-&gt;</span><span class=``variable''>hashrecord</span><span class=``operator''>(</span><span class=``variable''>$hashref</span><span class=``operator''>,</span><span class=``variable''>$arrayref</span><span class=``operator''>);</span>


 <span class="operator">(</span><span class="variable">i</span><span class="operator">.</span><span class="variable">e</span><span class="operator">.</span> <span class="variable">it</span> <span class="variable">does</span> <span class="keyword">not</span> <span class="variable">depend</span> <span class="variable">on</span> <span class="keyword">values</span> <span class="variable">set</span> <span class="variable">in</span> <span class="variable">the</span> <span class="variable">object</span> <span class="variable">constructor</span><span class="operator">).</span>
</pre>
<p>
</p>
<h2><a name="remap">remap</a></h2>
<pre>
 my $remapped = $sync-&gt;remap($AoH)

Remaps the field names, as defined in $sync-&gt;mappings. Takes array of hashes, returns array of hashes with the hash keys renamed.</pre>
<p>
</p>
<h2><a name="runtransform">runtransform</a></h2>
<pre>
 <span class="keyword">my</span> <span class="variable">$transformed</span> <span class="operator">=</span> <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">runtransform</span><span class="operator">(</span><span class="variable">$AoH</span><span class="operator">);</span>

 <span class="variable">Runs</span> <span class="variable">the</span> <span class="variable">transformations</span> <span class="keyword">defined</span> <span class="variable">in</span> <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">transform</span><span class="operator">.</span> <span class="variable">Takes</span> <span class="variable">array</span> <span class="variable">of</span> <span class="variable">hashes</span><span class="operator">,</span> <span class="variable">returns</span> <span class="variable">array</span> <span class="variable">of</span> <span class="variable">hashes</span><span class="operator">.</span> <span class="variable">You</span> <span class="variable">can</span> <span class="keyword">use</span> <span class="variable">this</span> <span class="variable">function</span> <span class="variable">in</span> <span class="variable">conjunction</span> <span class="variable">with</span> <span class="variable">mappings</span> <span class="variable">as</span> <span class="variable">a</span> <span class="variable">utility</span> <span class="variable">function</span> <span class="variable">to</span> <span class="variable">perform</span> <span class="variable">recursive</span> <span class="variable">transformations</span> <span class="variable">of</span> <span class="variable">data</span><span class="operator">:</span>
</pre>
<pre>
 <span class="keyword">my</span> <span class="variable">$sync</span> <span class="operator">=</span> <span class="variable">Data::Sync</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">();</span>
 <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">transform</span><span class="operator">(</span><span class="string">name</span><span class="operator">=&gt;</span><span class="variable">lowercase</span><span class="operator">);</span>
 <span class="keyword">my</span> <span class="variable">$transformed</span> <span class="operator">=</span> <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">runtransform</span><span class="operator">(</span><span class="variable">$AoH</span><span class="operator">);</span>

 <span class="variable">will</span> <span class="variable">recurse</span> <span class="variable">through</span> <span class="variable">a</span> <span class="variable">data</span> <span class="variable">structure</span> <span class="operator">(</span><span class="variable">an</span> <span class="variable">array</span> <span class="variable">of</span> <span class="variable">arrays</span><span class="operator">,</span> <span class="variable">array</span> <span class="variable">of</span> <span class="variable">hashes</span><span class="operator">,</span> <span class="variable">array</span> <span class="variable">of</span> <span class="variable">hashes</span> <span class="variable">of</span> <span class="variable">arrays</span> <span class="variable">of</span> <span class="variable">hashes</span> <span class="variable">etc</span><span class="operator">)</span> <span class="variable">of</span> <span class="variable">arbitrary</span> <span class="variable">depth</span><span class="operator">,</span> <span class="variable">performing</span> <span class="variable">the</span> <span class="variable">transform</span> <span class="variable">on</span> <span class="variable">all</span> <span class="variable">hash</span> <span class="keyword">values</span> <span class="variable">where</span> <span class="variable">the</span> <span class="variable">key</span> <span class="variable">matches</span> <span class="operator">(</span><span class="variable">including</span> <span class="variable">every</span> <span class="variable">value</span> <span class="variable">of</span> <span class="variable">hash</span> <span class="keyword">values</span> <span class="variable">containing</span> <span class="variable">anonymous</span> <span class="variable">arrays</span><span class="operator">).</span>
</pre>
<p>
</p>
<h2><a name="makebuiltattributes">makebuiltattributes</a></h2>
<pre>
 <span class="keyword">my</span> <span class="variable">$transformed</span> <span class="operator">=</span> <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">makebuiltattributes</span><span class="operator">(</span><span class="variable">$AoH</span><span class="operator">);</span>

 <span class="variable">Create</span> <span class="variable">attributes</span> <span class="variable">in</span> <span class="variable">the</span> <span class="variable">data</span> <span class="variable">set</span> <span class="variable">as</span> <span class="keyword">defined</span> <span class="variable">in</span> <span class="variable">buildattributes</span><span class="operator">().</span>
</pre>
<p>
</p>
<h2><a name="scanhashtable">scanhashtable</a></h2>
<pre>
 <span class="keyword">my</span> <span class="variable">$hashed</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">scanhashtable</span><span class="operator">(</span><span class="variable">$AoH</span><span class="operator">);</span>

 <span class="variable">Check</span> <span class="variable">the</span> <span class="variable">dataset</span> <span class="variable">against</span> <span class="variable">the</span> <span class="variable">stored</span> <span class="variable">hashtable</span><span class="operator">,</span> <span class="variable">to</span> <span class="variable">filter</span> <span class="variable">out</span> <span class="variable">unchanged</span> <span class="variable">records</span><span class="operator">.</span> <span class="variable">Returns</span> <span class="variable">a</span> <span class="variable">dataset</span> <span class="variable">with</span> <span class="variable">unchanged</span> <span class="variable">records</span> <span class="variable">removed</span><span class="operator">.</span> <span class="variable">Requires</span> <span class="variable">that</span> <span class="variable">hashattributes</span> <span class="variable">has</span> <span class="variable">been</span> <span class="variable">set</span> <span class="variable">in</span> <span class="variable">the</span> <span class="variable">target</span> <span class="variable">definition</span><span class="operator">.</span>
</pre>
<p>
</p>
<h2><a name="hashrecord">hashrecord</a></h2>
<pre>
 <span class="keyword">my</span> <span class="variable">$hash</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">hashrecord</span><span class="operator">(\</span><span class="variable">%record</span><span class="operator">,</span><span class="operator">[</span><span class="variable">ATTRIB</span><span class="operator">,</span><span class="variable">ATTRIB</span><span class="operator">]</span><span class="operator">);</span>

 <span class="variable">returns</span> <span class="variable">a</span> <span class="variable">hexdigest</span> <span class="variable">MD5</span> <span class="variable">hash</span> <span class="variable">of</span> <span class="variable">the</span> <span class="variable">attributes</span> <span class="variable">in</span> <span class="variable">the</span> <span class="variable">record</span><span class="operator">.</span>
</pre>
<p>
</p>
<h2><a name="getdeletes">getdeletes</a></h2>
<pre>
 <span class="keyword">my</span> <span class="variable">@deletes</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">getdeletes</span><span class="operator">();</span>

 <span class="variable">returns</span> <span class="variable">a</span> <span class="variable">list</span> <span class="variable">of</span> <span class="string">TARGETINDEX</span><span class="operator">=&gt;</span><span class="variable">value</span> <span class="variable">entries</span> <span class="keyword">for</span> <span class="variable">all</span> <span class="variable">entries</span> <span class="variable">that</span> <span class="variable">have</span> <span class="variable">been</span> <span class="variable">deleted</span><span class="operator">.</span> <span class="variable">This</span> <span class="variable">is</span> <span class="variable">a</span> <span class="variable">function</span> <span class="variable">of</span> <span class="variable">hashing</span><span class="operator">,</span> <span class="variable">so</span> <span class="variable">will</span> <span class="variable">only</span> <span class="variable">detect</span> <span class="variable">deletes</span> <span class="keyword">if</span> <span class="variable">the</span> <span class="variable">following</span> <span class="variable">steps</span> <span class="variable">are</span> <span class="variable">followed</span> <span class="operator">(</span><span class="variable">the</span> <span class="variable">run</span> <span class="variable">method</span> <span class="variable">does</span> <span class="variable">this</span><span class="operator">):</span>
</pre>
<pre>
 1) read from source
 2) transform etc
 3) hash the entries

Note that you don't need to write for deletes to be detected - the hashing of entries is done by scanhashtable before the write to target function is called. This means that using get() and scanhashtable() you can set the deltas to the current state without performing a write.</pre>
<p>
</p>
<hr />
<h1><a name="batch_update_mode">batch update mode</a></h1>
<pre>
 <span class="variable">$sync</span><span class="operator">-&gt;</span><span class="variable">source</span><span class="operator">(</span><span class="variable">$handle</span><span class="operator">,</span><span class="operator">{</span>        <span class="string">batchsize</span><span class="operator">=&gt;x,</span>
                                <span class="string">controls</span><span class="operator">=&gt;</span><span class="operator">[</span><span class="variable">$ldapcontrol</span><span class="operator">]</span>        <span class="operator">}</span> <span class="operator">);</span>
</pre>
<p>Batch update mode is only used in the standard (i.e. $sync-&gt;run based) usage of Data::Sync. Its primarily intended to handle asynchronous, persistent/paged LDAP searches, or SQL database queries where you want to see the updates as quickly as possible (without necessarily waiting for them all to complete). For details on how to construct persistent &amp; asynchronous LDAP controls, see Net::LDAP::Control. This will read a batch from the handle, perform the operation, read the next batch from the handle, and so on. Note that with a DBI handle, this will still be working against an entire record set matching your criteria, so the memory advantages are limited.</p>
<p>
</p>
<hr />
<h1><a name="subclassing_data__sync">subclassing Data::Sync</a></h1>
<p>For whatever reason, you may want to subclass Data::Sync - perhaps to implement RDBMS specific read or write functions, or to add new functionality. Data::Sync is (or should be) subclass safe. The main functions you are likely to want to overload are:</p>
<pre>
 readdbi
 writedbi
 readldap
 writeldap</pre>
<p>each will be passed the following parameters in sequential order:</p>
<pre>
 self
 db/ldap handle
 anonymous hash of parameters (see 'source' and 'target' methods.

and called by get/put or run().</pre>
<p>You might also want to overload ::run with your own variant. ::run calls the read, remap, transform and writes methods sequentially (If you look at ::run, it also calls sourceToAoH - this is a vital call to convert a DBI or LDAP handle into an array of hashes record set, before remapping and transforming the records).</p>
<p>You may also wish to use a database other than SQLite to hash records, in which case you need to overload <code>getdeletes()</code> and <code>scanhashtable()</code>. See the code for more details.</p>
<p>
</p>
<hr />
<h1><a name="example_uses">EXAMPLE USES</a></h1>
<pre>
 <span class="keyword">my</span> <span class="variable">$source1</span> <span class="operator">=</span> <span class="variable">Data::Sync</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">();</span>
 <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">source</span><span class="operator">(</span><span class="variable">$dbhandle</span><span class="operator">,</span><span class="string">"select * from sourcetable1"</span><span class="operator">);</span>
 <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">mappings</span><span class="operator">(</span><span class="string">NAME</span><span class="operator">=&gt;</span><span class="variable">NEWNAME</span><span class="operator">);</span>
 <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">transform</span><span class="operator">(</span><span class="string">NEWNAME</span><span class="operator">=&gt;</span><span class="variable">lowercase</span><span class="operator">);</span>

 <span class="keyword">my</span> <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">();</span>
 <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">source</span><span class="operator">(</span><span class="variable">$dbhandle2</span><span class="operator">,</span><span class="string">"select * from sourcetable2"</span><span class="operator">);</span>
 <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">mappings</span><span class="operator">(</span><span class="string">FULLNAME</span><span class="operator">=&gt;</span><span class="variable">NEWNAME</span><span class="operator">);</span>
 <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">transform</span><span class="operator">(</span><span class="string">NEWNAME</span><span class="operator">=&gt;</span><span class="variable">lowercase</span><span class="operator">);</span>

 <span class="keyword">my</span> <span class="variable">$target</span><span class="operator">=</span><span class="variable">Data::Sync</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">();</span>
 <span class="variable">$target</span><span class="operator">-&gt;</span><span class="variable">target</span><span class="operator">(</span><span class="variable">$dbhandle3</span><span class="operator">,</span><span class="operator">{</span><span class="string">index</span><span class="operator">=&gt;</span><span class="variable">NEWNAME</span><span class="operator">}</span><span class="operator">);</span>

 <span class="keyword">my</span> <span class="variable">$set1</span> <span class="operator">=</span> <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">get</span><span class="operator">();</span>
 <span class="variable">$set1</span> <span class="operator">=</span> <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">remap</span><span class="operator">(</span><span class="variable">$set1</span><span class="operator">);</span>
 <span class="variable">$set1</span> <span class="operator">=</span> <span class="variable">$source1</span><span class="operator">-&gt;</span><span class="variable">runtransform</span><span class="operator">(</span><span class="variable">$set1</span><span class="operator">);</span>

 <span class="keyword">my</span> <span class="variable">$set2</span> <span class="operator">=</span> <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">get</span><span class="operator">();</span>
 <span class="variable">$set2</span> <span class="operator">=</span> <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">remap</span><span class="operator">(</span><span class="variable">$set2</span><span class="operator">);</span>
 <span class="variable">$set2</span> <span class="operator">=</span> <span class="variable">$source2</span><span class="operator">-&gt;</span><span class="variable">runtransform</span><span class="operator">(</span><span class="variable">$set2</span><span class="operator">);</span>

 <span class="keyword">my</span> <span class="variable">@recordset</span> <span class="operator">=</span> <span class="operator">(</span><span class="variable">@$set1</span><span class="operator">,</span><span class="variable">@$set2</span><span class="operator">);</span>
 <span class="variable">$target</span><span class="operator">-&gt;</span><span class="variable">put</span><span class="operator">(\</span><span class="variable">@recordset</span><span class="operator">);</span>

 <span class="variable">Would</span> <span class="keyword">read</span> <span class="variable">the</span> <span class="variable">two</span> <span class="keyword">defined</span> <span class="variable">sources</span><span class="operator">,</span> <span class="variable">remap</span> <span class="operator">&amp;</span> <span class="variable">transform</span> <span class="variable">the</span> <span class="variable">contents</span><span class="operator">,</span> <span class="keyword">join</span> <span class="variable">the</span> <span class="variable">two</span> <span class="variable">datasets</span> <span class="variable">together</span><span class="operator">,</span> <span class="keyword">and</span> <span class="keyword">write</span> <span class="variable">them</span> <span class="variable">both</span> <span class="variable">to</span> <span class="variable">the</span> <span class="variable">target</span><span class="operator">.</span>
</pre>

</body>

</html>

 C:\cpanrun\depot\main\contrib-patched\perl\CPAN\src\Data-Sync\blib/html/site/lib/Data/Sync/Advanced.html