vss2svn.pl: Improve error reporting and statistics
[vss2svn.git] / script / Vss2Svn / DataCache.pm
blob0b92bf35cb3f844fe88fe82a23719bd2b46127c8
1 package Vss2Svn::DataCache;
3 use warnings;
4 use strict;
6 our(%gCfg);
8 # SQLite can get a bit slow when doing lots of sequential inserts, so we speed
9 # that up by using the sqlite2 "COPY" command, which allows reading in a tab-
10 # delimited file of data all at once. Each table that will be filled has a
11 # DataCache object created; the 'add' method adds a row of data to the cache,
12 # and the 'commit' method performs the COPY operation.
14 ###############################################################################
15 # new
16 ###############################################################################
17 sub new {
18 my($class, $table, $autoinc) = @_;
20 my $self =
22 table => $table,
23 autoinc => $autoinc,
24 pkey => -1,
25 verbose => $gCfg{verbose},
26 fh => undef,
27 file => "$gCfg{cachedir}\\datachache.$table.tmp.txt",
30 $self = bless($self, $class);
32 if ($self->{verbose}) {
33 print "\nSTARTING CACHE FOR $table\n";
36 $self->_delete_table();
38 if ((-e $self->{file}) && !(unlink($self->{file}))) {
39 print "\nERROR: Could not delete existing cache file '$self->{file}'\n";
40 return undef;
43 if ( !open($self->{fh}, ">$self->{file}") ) {
44 print "\nERROR: Could not open file '$self->{file}'\n";
45 return undef;
48 return $self;
49 } # End new
51 ###############################################################################
52 # _delete_table
53 ###############################################################################
54 sub _delete_table {
55 my($self) = @_;
57 my $sth = $gCfg{dbh}->prepare("DELETE FROM $self->{table}");
58 return $sth->execute;
60 } # End _delete_table
62 ###############################################################################
63 # add
64 ###############################################################################
65 sub add {
66 my($self, @data) = @_;
68 if (ref($data[0]) eq 'ARRAY') {
69 @data = @{ $data[0] };
72 if ($self->{autoinc}) {
73 unshift(@data, ++$self->{pkey});
76 my $fh = $self->{fh};
77 print $fh join("\t", map {&FormatCacheData($_)} @data), "\n";
79 } # End add
81 ###############################################################################
82 # commit
83 ###############################################################################
84 sub commit {
85 my($self) = @_;
87 my($sql, $sth);
89 close($self->{fh});
91 if ($self->{verbose}) {
92 print "\n\nCOMMITTING CACHE '$self->{table}' TO DATABASE\n"
95 $sql = "COPY $self->{table} FROM '$self->{file}'";
97 $sth = $gCfg{dbh}->prepare($sql);
98 $sth->execute();
100 } # End commit
102 ###############################################################################
103 # FormatCacheData
104 ###############################################################################
105 sub FormatCacheData {
106 my($data) = @_;
107 return '\\N' if !defined($data);
109 $data =~ s/([\t\n\\])/\\$1/g;
111 return $data;
112 } # End FormatCacheData
114 ###############################################################################
115 # SetCacheDir
116 ###############################################################################
117 sub SetCacheDir {
118 my($class, $dir) = @_;
120 $gCfg{cachedir} = $dir;
121 } # End SetCacheDir
123 ###############################################################################
124 # SetDbHandle
125 ###############################################################################
126 sub SetDbHandle {
127 my($class, $dbh) = @_;
129 $gCfg{dbh} = $dbh;
130 } # End SetDbHandle
132 ###############################################################################
133 # SetVerbose
134 ###############################################################################
135 sub SetVerbose {
136 my($class, $verbose) = @_;
138 $gCfg{verbose} = $verbose;
139 } # End SetVerbose