1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
|
package FirebirdMaker;
use warnings;
use strict;
use base 'Exporter';
use Carp;
use ExtUtils::MakeMaker;
use File::Basename;
use Config;
our @EXPORT_OK = qw( WriteMakefile1 setup_for_ms_gcc setup_for_ms_cl
locate_firebird check_and_set_devlibs alternative_locations
search_fb_home_dirs search_fb_inc_dirs search_fb_lib_dirs
locate_firebird_ms registry_lookup read_registry read_data
save_test_parameters read_test_parameters prompt_for_settings
prompt_for check_str check_path check_exe check_file help_message
welcome_msg closing_msg create_embedded_files
$test_conf $test_mark $use_libfbembed );
our @EXPORT = @EXPORT_OK;
our ( $use_libfbembed );
# Temp file names
our $test_conf = 't/tests-setup.tmp.conf';
our $test_mark = 't/tests-setup.tmp.OK';
# Written by Alexandr Ciornii, version 0.23. Added by eumm-upgrade.
sub WriteMakefile1 {
my %params = @_;
my $eumm_version = $ExtUtils::MakeMaker::VERSION;
$eumm_version = eval $eumm_version;
die "EXTRA_META is deprecated" if exists $params{EXTRA_META};
die "License not specified" if not exists $params{LICENSE};
if ( $params{AUTHOR}
and ref( $params{AUTHOR} ) eq 'ARRAY'
and $eumm_version < 6.5705 )
{
$params{META_ADD}{author} = $params{AUTHOR};
$params{AUTHOR} = join( ', ', @{ $params{AUTHOR} } );
}
if ( $params{BUILD_REQUIRES} and $eumm_version < 6.5503 ) {
#EUMM 6.5502 has problems with BUILD_REQUIRES
$params{PREREQ_PM} =
{ %{ $params{PREREQ_PM} || {} }, %{ $params{BUILD_REQUIRES} } };
delete $params{BUILD_REQUIRES};
}
delete $params{CONFIGURE_REQUIRES} if $eumm_version < 6.52;
delete $params{MIN_PERL_VERSION} if $eumm_version < 6.48;
delete $params{META_MERGE} if $eumm_version < 6.46;
delete $params{META_ADD} if $eumm_version < 6.46;
delete $params{LICENSE} if $eumm_version < 6.31;
delete $params{AUTHOR} if $] < 5.005;
delete $params{ABSTRACT_FROM} if $] < 5.005;
delete $params{BINARY_LOCATION} if $] < 5.005;
WriteMakefile(%params);
}
#- Helper SUBS ---------------------------------------------------------------#
#-- Subs for OS specific setting
sub setup_for_ms_gcc {
# Support for MinGW (still experimental, patches welcome!)
# ActiveState: cc => V:\absolute\path\to\gcc.exe
# Strawberry : cc => gcc
print "Using MinGW gcc\n";
# For ActiveState Perl hardwired MinGW path # other idea?
my $mingw_path = 'C:\Perl\site\lib\auto\MinGW';
# Expecting absolute paths in Straberry Perl
my $mingw_inc = $Config{incpath};
# For ActiveState Perl is \include # always?
if ( $mingw_inc eq '\include' ) {
$mingw_inc = File::Spec->catpath( $mingw_path, $mingw_inc );
}
my $mingw_lib = $Config{libpth};
# For ActiveState Perl is \lib # always?
if ( $mingw_lib eq '\lib' ) {
$mingw_lib = File::Spec->catpath( $mingw_path, $mingw_lib );
}
$INC .= qq{ -I"$mingw_inc"};
my $cur_libs = $Config{libs};
my $cur_lddlflags = $Config{lddlflags};
my $lib;
if ( -f "$FB::LIB/fbclient_ms.lib" ) {
$lib = "$FB::LIB/fbclient_ms.lib";
}
else { $lib = "$FB::LIB/gds32_ms.lib"; }
# This is ugly :)
eval "
sub MY::const_loadlibs {
'
LDLOADLIBS = \"$lib\" $cur_libs
LDDLFLAGS = -L\"$mingw_lib\" $cur_lddlflags
'
} ";
}
sub setup_for_ms_cl {
# NOT tested !!!
# Try to find Microsoft Visual C++ compiler
my $vc_dir = registry_lookup_ms_cl();
my @vc_dirs = ( $vc_dir . "/bin" );
my $VC_PATH =
dir_choice( "Visual C++ directory", [@vc_dirs], [qw(cl.exe)] );
unless ( -x $VC_PATH ) {
carp
"I can't find your MS VC++ installation.\nDBD::Firebird cannot build.\n";
exit 1;
}
my $vc_inc = $VC_PATH . "/include";
my $vc_lib = $VC_PATH . "/lib";
$INC .= " -I\"$vc_inc\"";
my $ib_lib = dir_choice(
"Firebird lib directory",
[ $FB::LIB . "SDK\\lib_ms", $FB::LIB . "lib" ],
[qw(gds32_ms.lib fbclient_ms.lib)]
);
my $cur_libs = $Config{libs};
my $cur_lddlflags = $Config{lddlflags};
my $lib;
if (-f "$FB::LIB/fbclient_ms.lib")
{ $lib = "$FB::LIB/fbclient_ms.lib"; }
else
{ $lib = "$FB::LIB/gds32_ms.lib"; }
eval "
sub MY::const_loadlibs {
'
LDLOADLIBS = \"$lib\" $cur_libs
LDDLFLAGS = -L\"$vc_lib\" $cur_lddlflags
'
} ";
return;
}
#-- Subs used to locate Firebird
=head2 locate_firebird
On *nix like systems try different standard paths.
=cut
sub locate_firebird {
my @bd = search_fb_home_dirs();
foreach my $dir (@bd) {
if ( -d $dir ) {
# File names specific to the Firebird/bin dir
my @fb_files = qw{fbsql isql-fb isql};
# fbsql not yet! but 'isql' is
# used by Virtuoso and UnixODBC
# That's why Debian ships it as
# isql-fb
my $found = 0;
while ( !$found ) {
my $file = shift @fb_files or last;
$file = File::Spec->catfile( $dir, 'bin', $file );
if ( -f $file and -x $file ) {
# Located
my $out = `echo 'quit;' | $file -z 2>&1`;
next unless $out =~ /firebird/si; # Firebird's isql?
check_and_set_devlibs($dir);
last;
}
}
}
}
return;
}
=head2 check_and_set_devlibs
Check and set global variables for home, inc and lib (?...).
=cut
sub check_and_set_devlibs {
my $fb_dir = shift;
$FB::HOME = File::Spec->canonpath($fb_dir);
$FB::INC = $FB::INC || File::Spec->catdir( $FB::HOME, 'include' );
$FB::INC = alternative_locations('inc') if !-d $FB::INC;
$FB::LIB = $FB::LIB || File::Spec->catdir( $FB::HOME, 'lib' );
$FB::LIB = alternative_locations('lib') if !-d $FB::LIB;
for my $dir ( split(/ /, $Config{libpth} ), $FB::LIB//() ) {
if ( -e File::Spec->catfile( $dir, 'libfbembed.so' ) ) {
$FB::libfbembed_available = 1;
print "libfbembed.so found in $dir\n";
last;
}
}
die "libfbembed.so not found\n"
if $ENV{DBD_FIREBIRD_REQUIRE_EMBEDDED}
and not $FB::libfbembed_available;
return;
}
=head2 alternative_locations
Search lib and inc in alternative locations.
=cut
sub alternative_locations {
my $find_what = shift;
my @fid = ();
@fid = search_fb_lib_dirs() if $find_what eq q{lib};
@fid = search_fb_inc_dirs() if $find_what eq q{inc};
foreach my $dir ( @fid ) {
return $dir if -d $dir;
}
help_message();
die "Firebird '$find_what' dir not located!";
}
=head2 search_fb_home_dirs
Common places for the Firebird home dir.
=cut
sub search_fb_home_dirs {
# Add other standard paths here
return (
qw{
/opt/firebird
/usr/local/firebird
/usr/lib/firebird
/usr
},
);
}
=head2 search_fb_inc_dirs
Common places for the Firebird include dir.
=cut
sub search_fb_inc_dirs {
# Add other standard paths here for include
return (
qw{
/usr/include/firebird
/usr/local/include/firebird
},
);
}
=head2 search_fb_lib_dirs
Common places for the Firebird lib dir.
=cut
sub search_fb_lib_dirs {
# Add other standard paths here for lib
return (
qw{
/usr/lib/firebird
/usr/local/lib/firebird
},
);
}
=head2 locate_firebird_ms
On Windows use the Registry to locate Firebird.
=cut
sub locate_firebird_ms {
my $hp_ref = registry_lookup('fb');
if (ref $hp_ref) {
$FB::HOME = $FB::HOME || File::Spec->canonpath($hp_ref->[0]);
$FB::INC = $FB::INC || File::Spec->catdir( $FB::HOME, 'include' );
$FB::LIB = $FB::LIB || File::Spec->catdir( $FB::HOME, 'lib' );
}
}
sub registry_lookup {
my $what = shift;
my $reg_data = read_data($what);
my $value;
foreach my $rec ( @{$reg_data->{$what}} ) {
$value = read_registry($rec)
}
return $value;
}
sub read_registry {
my $rec = shift;
my @path;
eval {
require Win32::TieRegistry;
my $path =
Win32::TieRegistry->new( $rec->{path} )->GetValue( $rec->{key} );
push @path, $path if $path;
};
if ($@) {
warn "Error: $@!\n";
}
return wantarray ? @path : \@path;
}
=head2 read_data
Read various default settings from the DATA section of this script.
=cut
sub read_data {
my $app_alias = shift;
my %reg_data;
while (<DATA>) {
my ($app, $key, $path) = split /:/, $_, 3;
chomp $path;
next if $app ne $app_alias;
push @{ $reg_data{$app} }, { key => $key, path => $path } ;
}
return \%reg_data;
}
sub save_test_parameters {
my ($db_path, $db_host, $user, $pass) = @_;
open my $t_fh, '>', $test_conf or die "Can't write $test_conf: $!";
my $test_time = scalar localtime();
my @record = (
q(# This is a temporary file used for test setup #),
q(# The field separator is := #),
q(# Should be deleted at the end of installation #),
q(# Init section ------ (created by Makefile.PL) #),
q(# Time: ) . $test_time,
);
$db_host = $db_host || q{localhost}; # not ||= for compatibility
# Other settings (interactive mode)
push @record, qq(host:=$db_host);
push @record, qq(path:=$db_path) if $db_path;
push @record, qq(tdsn:=dbi:Firebird:db=$db_path;host=$db_host;ib_dialect=3;ib_charset=ISO8859_1) if $db_path;
push @record, qq(user:=$user) if $user;
push @record, qq(pass:=$pass) if $pass;
push @record, qq(use_libfbembed:=1) if $use_libfbembed;
my $rec = join "\n", @record;
print {$t_fh} $rec, "\n";
close $t_fh or die "Can't close $test_conf: $!";
# Remove the mark file
if (-f $test_mark) {
unlink $test_mark or warn "Could not unlink $test_mark: $!";
}
return;
}
sub read_test_parameters {
my $record = {};
if (-f $test_conf) {
print "\nReading cached test configuration...\n";
open my $file_fh, '<', $test_conf
or croak "Can't open file ", $test_conf, ": $!";
foreach my $line (<$file_fh>) {
next if $line =~ m{^#+}; # skip comments
my ($key, $val) = split /:=/, $line, 2;
chomp $val;
$record->{$key} = $val;
}
close $file_fh;
}
return $record;
}
#-- Prompting subs ...
sub prompt_for_settings {
my $param = read_test_parameters();
my ($user, $pass) = (qw{SYSDBA masterkey}); # some defaults
my ($db_path, $db_host);
# If saved configs exists set them as defaults
if ( ref $param ) {
$user = $param->{user} || $user;
$pass = $param->{pass} || $pass;
$db_host = $param->{host} || 'localhost';
$db_path = $param->{path}
|| File::Spec->catfile( File::Spec->tmpdir(), 'dbd-fb-testdb.fdb' );
}
print qq{\nStarting interactive setup, two attempts for each option,\n};
print qq{ if both fail, the script will abort ...\n};
print qq{\n Enter the full paths to the Firebird instalation:\n};
$FB::HOME = prompt_for( 'path', ' Home:', $FB::HOME );
$FB::INC = $FB::INC || File::Spec->catdir( $FB::HOME, 'include' );
$FB::LIB = $FB::LIB || File::Spec->catdir( $FB::HOME, 'lib' );
$FB::INC = prompt_for( 'path', ' Include:', $FB::INC );
$FB::LIB = prompt_for( 'path', ' Lib:', $FB::LIB );
print qq{\n Configuring the test environment ...\n};
$db_host = prompt_for('str', ' Hostname:', $db_host );
print
qq{\n Enter the full path and file name of the test database (.fdb):\n};
$db_path = prompt_for( 'file', ' Test DB:', $db_path );
unless ($use_libfbembed) {
print qq{\n Enter authentication options:\n};
$user = prompt_for('str', ' Username:', $user );
$pass = prompt_for('str', ' Password:', $pass );
print "\n";
}
save_test_parameters($db_path, $db_host, $user, $pass);
return;
}
=head2 prompt_for
Show prompt.
=cut
sub prompt_for {
my ( $type, $msg, $value ) = @_;
LOOP: {
for ( 1 .. 2 ) {
$value = prompt( $msg, $value );
$value = File::Spec->canonpath($value)
if ( $type eq q{path} or $type eq q{exe} );
my $check_sub = qq{check_$type};
last LOOP if ( main->$check_sub($value) );
}
die "Unable to locate $type. Aborting ...";
}
return $value;
}
sub check_str { return ( $_[1] ) }
sub check_path { return ( -d $_[1] ) }
sub check_exe { return ( -x $_[1] ) }
=head2 prompt_new_file
Because we can't make difference between a simple path and a path with
a file name without extension, the fdb extension is required for the
test database.
=cut
sub check_file {
my ($self, $value) = @_;
my ($base, $db_path, $type) = fileparse($value, '\.fdb' );
return 0 if $type ne q{.fdb}; # expecting file with fdb extension
return ( -d $db_path and $base );
}
#-- Help and message subs
sub help_message {
my $msg =<<"MSG";
This script prepares the installation of the DBD::Firebird module,
automatically with minimum user intervention or in interactive mode.
In non interactive mode will try to determine the location of the
Firebird HOME, LIBRARY and INCLUDE directories:
1. From the environment variable FIREBIRD_HOME. Also FIREBIRD_INCLUDE
and FIREBIRD_LIB if they are not sub directories of FIREBIRD_HOME.
2. From the standard (hardwired) locations where Firebird can be
installed on various platforms and distros.
If no success, execute this script with the I<-i[nteractive]> command
line option, or set the required environment variables.
% perl Makefile.PL -i[nteractive]
The tests requires the path to the test database, the user name and
the password. All options have defaults: DBI_USER = 'SYSDBA',
DBI_PASS = 'masterkey', or run the script in interactive
mode. (ISC_USER and ISC_PASSWORD are recognized also), for DBI_DSN the
default is:
dbi:Firebird:db=OS_tmp_path/dbd-fb-testdb.fdb;host=localhost;
ib_dialect=3;ib_charset=ISO8859_1
If all else fails, email <mapopa\@gmail.com> for help.
MSG
print $msg;
}
sub welcome_msg {
my $msg =<<"MSG";
This script prepares the installation of the DBD::Firebird module.
Warning: the process will create a temporary file to store the values
required for the testing phase, including the password for access to
the Firebird server in plain text: 't/tests-setup.tmp.conf'.
MSG
print $msg;
}
sub closing_msg {
my $msg =<<"MSG";
Please, set at least DBI_PASS (or ISC_PASSWORD), before 'make test'.
The default for DBI_USER is 'SYSDBA'.
MSG
print $msg unless $use_libfbembed;
}
sub copy_mangled {
my ( $src, $p ) = @_;
my $dir = 'embed';
my $df = $p->{new_path} || File::Spec->catfile( $dir, $p->{name} || $src );
open( my $dfh, '>', $df ) or die "Unable to open $df for writing: $!\n";
open( my $sfh, '<', $src ) or die "Unable to open $src: $!\n";
my ($prefix, $skip_shebang);
if ( $src =~ /\.(?:xs|[ch])$/ ) {
$prefix = '//';
$skip_shebang = 0;
} elsif ( $src =~ /\.pl$/i ) {
$prefix = '#';
$skip_shebang = 1;
}
else {
$prefix = '#';
$skip_shebang = 0;
}
my $header_warning = sub {
my $line = '*' x 60;
print $dfh "\n" if $skip_shebang;
print $dfh "$prefix $line\n";
print $dfh "$prefix This is an automaticaly generated file.\n";
print $dfh "$prefix If needed, edit $src in the parent directory\n";
print $dfh "$prefix and run perl Makefile.PL to re-generate it.\n";
print $dfh "$prefix $line\n\n";
};
my $line_no = 0;
while ( defined( $_ = <$sfh> ) ) {
&$header_warning if $line_no++ == $skip_shebang;
last if $p->{last} and &{ $p->{last} }($_);
&{ $p->{mangle} }($_) if $p->{mangle};
print $dfh $_;
}
close($dfh) or die "Error closing $df: $!\n";
close($sfh) or die "Error closing $src: $!\n";
}
sub create_embedded_files {
my $dir = "embed";
unless (-d $dir) {
mkdir($dir) or die "Error creating directory $dir: $!\n";
}
# Makefile.PL
copy_mangled(
'Makefile.PL' => {
last => sub { $_[0] =~ /^exit 0/ },
mangle => sub { $_[0] =~ s/^our \$EMBEDDED = \K0/1/ },
}
);
# Simple copies
for my $f (qw( dbdimp.h )) {
copy_mangled($f);
}
copy_mangled(
'Firebird.h' => {
name => 'FirebirdEmbedded.h',
},
);
# dbdimp.c
copy_mangled(
'dbdimp.c' => {
mangle =>
sub { $_[0] =~ s/^#include "Firebird\K\.h"/Embedded.h"/ },
},
);
my $next_is_last = 0;
copy_mangled(
'Firebird.pm' => {
name => 'FirebirdEmbedded.pm',
last => sub {
return 1 if $next_is_last;
if ( $_[0] =~ /^=head1 DESCRIPTION$/ ) {
$next_is_last = 1;
$_[0] .= <<EOT;
B<DBD::FirebirdEmbedded> is a variant of L<DBD::Firebird>, linked with the
Firebird embedded library, F<libfbembed>. In addition to the ability to work
with remote Firebird servers (which DBD::Firebird has, being linked with the
Firebird client library, F<libfbclient>), DBD::FirebirdEmbedded can be used to
work with Firebird databases without the need of a dedicated Firebird server.
The following things should be set up first:
=over
=item Username/password
These should be unset. Both in the C<< DBI->connection(...) >> call and in the
environment (C<ISC_USER>, C<ISC_PASSWORD>, C<DBI_USER>, C<DBI_PASSWORD> variables).
=item Firebird lock directory
The C<FIREBIRD_LOCK> environment variable should be set to some place where the
process can write. Note that if you plan for several processes to access the
database file directly, they all should have C<FIREBIRD_LOCK> set to the same
directory, or else database corruption will occur.
=item No C<host> in the DSN
Obviously, do not set any host when calling C<< DBI->connection(...) >>, not
even C<localhost>.
=item Permissions to read/write the database
Obviously, the process needs to be able to read/write the database file.
=back
=head1 COMPARISON WITH DBD::FIREBIRD
DBD::FirebirdEmbedded provides exactly the same functionality as the Firebird
server of the same version as the F<libfbembed> library. It still can work with
remote datases, in which case the use is exactly the same (DSN, environment) as
with the regular L<DBD::Firebird>.
=head2 Pros
=over
=item Standalone work with Firebird databases
No need to setup/administer a Firebird server. All the server functionality is
available via the F<libfbembed> library. Shared access to databases is still
possible (but read L</Firebird lock directory> above).
=item No network latency
Working directly with the database file elliminates possible network delays
(even if the server is on the local host).
=back
=head2 Cons
=over
=item Memory footprint
The F<libfbembed> library contains a fully functional Firebird server and is
therefore bigger than the ordinary client library, F<libfbclient>.
=item Setup complexity
It is very important to make sure that all processes that access a given
database use the same lock directory. See L</Firebird lock directory> above.
=back
=head1 SEE ALSO
=over
=item L<DBD::Firebird>
=back
EOT
}
return 0;
},
mangle => sub {
$_[0] =~ s/DBD::Firebird - DBI driver for.+/DBD::FirebirdEmbedded - embedded Firebird server (and client)/;
$_[0] =~ s/dbi:Firebird:.+/dbi:FirebirdEmbedded:db=\$dbname", undef, undef);/g;
$_[0] =~ s/DBD::Firebird\b(?!::(?:Get|Type|Table)Info)/DBD::FirebirdEmbedded/g;
$_[0] =~ s/'Firebird'/'FirebirdEmbedded'/g;
},
},
);
copy_mangled(
'Firebird.xs' => {
name => 'FirebirdEmbedded.xs',
mangle => sub {
$_[0] =~ s/Firebird.h/FirebirdEmbedded.h/;
$_[0] =~ s/DBD::Firebird/DBD::FirebirdEmbedded/g;
$_[0] =~ s/^INCLUDE: Firebird\K.xsi/Embedded.xsi/;
},
},
);
for my $f ( glob('t/*.t') ) {
next if $f =~ 't/embed';
( my $n = $f ) =~ s,t/\K,embed-,;
copy_mangled(
$f => {
new_path => $n,
mangle => sub {
$_[0] =~ s/DBD::Firebird\b/DBD::FirebirdEmbedded/g;
$_[0] =~ s/TestFirebird\b/TestFirebirdEmbedded/g;
},
}
);
}
}
1;
#-- Known registry keys
__DATA__
fb:DefaultInstance:HKEY_LOCAL_MACHINE\SOFTWARE\Firebird Project\Firebird Server\Instances
vc:ProductDir:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++
vc:ProductDir:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Setup\VC
vc:ProductDir:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC
pv:CurrentVersion:HKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\ActivePerl
pl::HKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\ActivePerl\1203
|