File Coverage

blib/lib/Database/Temp/Driver/CSV.pm
Criterion Covered Total %
statement 32 67 47.7
branch 1 6 16.6
condition 0 5 0.0
subroutine 10 15 66.6
pod 2 2 100.0
total 45 95 47.3


line stmt bran cond sub pod time code
1             package Database::Temp::Driver::CSV;
2              
3 1     1   579 use strict;
  1         2  
  1         29  
4 1     1   3 use warnings;
  1         2  
  1         54  
5              
6             # ABSTRACT: Create an ad-hoc database, driver for CSV
7              
8             our $VERSION = '0.003'; # VERSION: generated by DZP::OurPkgVersion
9              
10 1     1   417 use Module::Load::Conditional qw( can_load );
  1         15750  
  1         62  
11              
12 1     1   7 use Carp qw( shortmess );
  1         1  
  1         36  
13 1     1   4 use File::Path qw( make_path remove_tree );
  1         2  
  1         35  
14 1     1   3 use File::Spec;
  1         2  
  1         11  
15              
16 1     1   3 use Log::Any;
  1         2  
  1         7  
17 1     1   30 use Try::Tiny;
  1         1  
  1         39  
18 1     1   3 use Const::Fast;
  1         2  
  1         22  
19              
20             const my $TEMP_PATH_CHMOD => 700;
21              
22             sub is_available {
23 1     1 1 4 my $_log = Log::Any->get_logger( category => 'Database::Temp' );
24 1         1860 my %needed = ( 'DBD::CSV' => 0.57, );
25 1 50       4 if ( !can_load( modules => \%needed ) ) {
26 1         406 $_log->infof( 'Cannot load module %s, %s', %needed );
27 1         9 return 0;
28             }
29 0           return 1;
30             }
31              
32             sub new {
33 0     0 1   my ( $class, %params ) = @_;
34 0           my $_log = Log::Any->get_logger( category => 'Database::Temp' );
35              
36 0   0       my $dir = $params{'args'}->{'dir'} // File::Spec->tmpdir();
37 0           my $db_dir = $params{'name'};
38 0           my $dirpath = File::Spec->catfile( $dir, $db_dir );
39 0           make_path( $dirpath, { verbose => 0, mode => oct($TEMP_PATH_CHMOD), } );
40 0           my $dsn = 'dbi:CSV:';
41 0           $_log->debugf( 'Created temp dirpath \'%s\'', $dirpath );
42              
43 0           my %attrs = (
44             'AutoCommit' => 1,
45             'RaiseError' => 1,
46             'PrintError' => 1,
47             'RaiseWarn' => 1,
48             'PrintWarn' => 1,
49             'TaintIn' => 1,
50             'TaintOut' => 0,
51             'TraceLevel' => 0,
52             'f_dir' => $dirpath,
53             'f_ext' => '.csv/r',
54             'f_encoding' => 'utf8',
55             );
56 0           my %info = ( 'dirpath' => $dirpath, );
57              
58             # Construct start method
59             my $_start = sub {
60 0     0     my ( $dbh, $name ) = @_;
61 0           Log::Any->get_logger( category => 'Database::Temp' )->debugf( 'Created temp db \'%s\'', $name );
62 0           };
63              
64             # Construct init method
65 0           my $init;
66 0 0         if ( ref $params{'init'} eq 'CODE' ) {
67 0           $init = $params{'init'};
68             }
69             else { # SCALAR
70             # Attn. CSV does not have transactions (begin_work, commit)
71             $init = sub {
72 0     0     my ($dbh) = @_;
73 0           foreach my $row ( split qr/;\s*/msx, $params{'init'} ) {
74 0           $dbh->do($row);
75             }
76 0           return;
77             }
78 0           }
79              
80             # Construct deinit method
81 0           my $deinit;
82 0 0         if ( ref $params{'deinit'} eq 'CODE' ) {
83 0           $deinit = $params{'deinit'};
84             }
85             else { # SCALAR
86             $deinit = sub {
87 0     0     my ($dbh) = @_;
88 0           foreach my $row ( split qr/;\s*/msx, $params{'deinit'} ) {
89 0           $dbh->do($row);
90             }
91 0           return;
92             }
93 0           }
94              
95             # Construct _cleanup method
96             my $_cleanup = sub {
97 0     0     my ( $dbh, $name, $info ) = @_;
98 0           $_log->infof( 'Deleting dir %s for temp db \'%s\'', $info->{'dirpath'}, $name );
99 0           remove_tree( $info->{'dirpath'}, { safe => 1, } );
100 0           };
101              
102             # Create database representing object.
103             return Database::Temp::DB->new(
104             driver => ( __PACKAGE__ =~ m/^Database::Temp::Driver::(.*)$/msx )[0],
105             name => $params{'name'},
106 0   0       cleanup => $params{'cleanup'} // 0,
107             _cleanup => $_cleanup,
108             _start => $_start,
109             init => $init,
110             deinit => $deinit,
111             dsn => $dsn,
112             username => undef,
113             password => undef,
114             attr => \%attrs,
115             info => \%info,
116             );
117             }
118              
119             1;
120              
121             __END__
122              
123             =pod
124              
125             =encoding UTF-8
126              
127             =head1 NAME
128              
129             Database::Temp::Driver::CSV - Create an ad-hoc database, driver for CSV
130              
131             =head1 VERSION
132              
133             version 0.003
134              
135             =head2 is_available
136              
137             Can this driver provide a database?
138              
139             Return boolean.
140              
141             =head2 new
142              
143             Create a temp database.
144              
145             User should never call this subroutine directly, only via L<Database::Temp>.
146              
147             =head1 AUTHOR
148              
149             Mikko Koivunalho <mikkoi@cpan.org>
150              
151             =head1 COPYRIGHT AND LICENSE
152              
153             This software is copyright (c) 2023 by Mikko Johannes Koivunalho.
154              
155             This is free software; you can redistribute it and/or modify it under
156             the same terms as the Perl 5 programming language system itself.
157              
158             =cut