How do I communicate @HOGS from &view_handler to find_hidden_views_with_resortable_indexes( $db ) without having to use a global? I'm certain there is a normal XML::Twig facility or an idiomatic way to do this. Am I expected to pass in closures to XML::Twig->new? I think it'd be nice to share the same parser across the program instead of having to recreate it during the loop. Updates Fixed a bug where @hogs was returned but @HOGS was tested. Also replaced @HOGS = () with local @HOGS. use strict;
use warnings;
use vars qw(@HOGS $TWIG $DEFAULT_SERVER);
use Notes::OLE ();
use File::Basename ();
use File::Temp ();
use XML::Twig;
use YAML ();
$DEFAULT_SERVER = 'dev1';
exit main( @ARGV );
=pod
<database>
<view name='(...)'>
<column resort='...'/>
</view>
</database>
INTO
server:
filepath:
view name:
WHERE
view name starts with ( and ends with ) and has a column with a resort
attribute.
=cut
sub main
{
my $server = shift(@_) || $DEFAULT_SERVER;
$TWIG = XML::Twig->new( twig_handlers =>
{ q[view[@name =~ /^\(.+?\)$/]] =>
\&handle_view },
twig_roots =>
{ view => 1,
column => 1 } );
my %hogs;
for my $dbp ( Notes::OLE::server_databases( $server ) )
{
my $db = $Notes::OLE::S->GetDatabase( $dbp->{'server'},
$dbp->{'filepath'} )
or next;
my @hogs = find_hidden_views_with_resortable_indexes( $db );
if ( @hogs )
{
$hogs{ $dbp->{'server'} }{ $dbp->{'filepath'} } = [ @hogs ];
}
}
my $output = File::Basename::basename( $0 );
$output =~ s/\.[^.]+$/.yml/;
YAML::DumpFile( $output, \%hogs );
my $editor = $ENV{'EDITOR'} || 'notepad';
system( $editor, $output );
return 1;
}
sub find_hidden_views_with_resortable_indexes
{
my $db = shift;
# Input
my $notes = $db->CreateNoteCollection( 0 );
$notes->{'SelectViews'} = 1;
$notes->BuildCollection;
# Output
my $temp_file = File::Temp::tmpnam();
my $stream = $Notes::OLE::S->CreateStream;
$stream->Open( $temp_file );
# Exporter
my $exporter = $Notes::OLE::S->CreateDXLExporter( $notes, $stream
+);
$exporter->Process;
# Cleanup so there are no open handles to the file
$stream->Close;
# Run XML::Twig on the exported schema
local @HOGS;
$TWIG->parsefile( $temp_file );
$TWIG->purge;
# Remove the exported schema
unlink $temp_file or warn "Couldn't delete $temp_file: $!";
return @HOGS;
}
sub handle_view
{
my ($t, $view) = @_;
my $name = $view->att( 'name' );
push @HOGS, $name if $view->children( 'column[@resort]' );
return 1;
}
janitored by ybiC: Balanced <readmore> tags around the codeblock, to reduce vertical scrolling on Monastery front page
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|