File Coverage

blib/lib/Config/IniFiles/Import.pm
Criterion Covered Total %
statement 18 105 17.1
branch 0 40 0.0
condition 0 9 0.0
subroutine 6 8 75.0
pod 0 2 0.0
total 24 164 14.6


line stmt bran cond sub pod time code
1             # ###################################################################################################
2             # # Script : Config::IniFiles::Import #
3             # # -------------------------------------------------------------------------------- #
4             # # Author : Juergen von Brietzke (c) JvBSoft #
5             # # -------------------------------------------------------------------------------- #
6             # # Version : 1.100 27.Aug.2003 #
7             # ###################################################################################################
8             # # Language : PERL 5 (v) 5.00x.xx , 5.6.x , 5.8.x #
9             # # -------------------------------------------------------------------------------- #
10             # # Pragmas : strict Beschraenkt unsichere Konstrukte #
11             # # vars Vordeklaration globaler Variablen #
12             # # -------------------------------------------------------------------------------- #
13             # # Module : Carp Generiert Fehlermeldungen #
14             # # Date::Language Datumsformatierung mit Multi-Language-Support #
15             # # FindBin Ermittelt das Verzeichnis des Perl-Skripts #
16             # # Config::IniFiles Verarbeitung von MS-Windows-Format-Ini-Dateien #
17             # ###################################################################################################
18             # # Decription : Import von MS-Windows-Format-Ini-Dateien auf Variablen #
19             # # ================================================================================ #
20             # # Die Definitionen von Ini-Dateien werden mittels des Moduls 'Config::IniFiles' #
21             # # gelesen, und mit dem vorliegenden Modul auf korrespondierende Variablen impor- #
22             # # tiert. Dabei werden die Variablen-Namen wie folgt gebildet: #
23             # # - Der Sektions-Name wird mit dem Parameter-Namen, getrennt durch Unterstrich #
24             # # verbunden und dem Package 'INI' ( Standardfall ) zugeordnet. #
25             # # - Es besteht aber auch die Moeglichkeit den Package-Name frei zu waehlen. #
26             # # -------------------------------------------------------------------------------- #
27             # # Die INI-Dateien koennen durch die Verwendung von Substitutionen flexible gehal- #
28             # # ten werden. Dabei ist folgende Syntax anzuwenden: #
29             # # - Parameter = ...{Sektionsname::Parametername}... #
30             # # -------------------------------------------------------------------------------- #
31             # # Fuer die Substitution steht ein Satz von 'predefinierten Variablen' zur Verfue- #
32             # # gung, die wie folgt angesprochen werden koennen: #
33             # # - Parameter = ...{Variable}... #
34             # # - Folgende predefinierte Variablen stehen zur Verfuegung: #
35             # # - FindBin - Verzeichnis-Pfad zum Skript #
36             # # - UserName - Name des angemeldeten Nutzers #
37             # # - TimeShort - Uhrzeit des Programmstarts - 'HH:MM' #
38             # # - TimeLong - Uhrzeit des Programmstarts - 'HH:MM:SS' #
39             # # - DateShort - Datum des Programmstarts - 'TT.MM.JJJJ' #
40             # # - DateTime - Datum und Uhrzeit des Programmstarts - 'TT.MM.JJJJ - HH:MM' #
41             # # - DateLong - Datum des Programmstarts - 'TT.MMM.JJJJ' #
42             # # -------------------------------------------------------------------------------- #
43             # # Darueber hinaus besteht die Moeglichkeit 'Nutzerdefierte Variablen' zu erzeugen. #
44             # # Diese sind dem Konstruktor zu uebergeben. #
45             # # - Hierfuer stehen die beiden folgenden Formen: #
46             # # - -predef => [ 'UserValue', key, value ] ( allgemeiner Wert ) #
47             # # - -predef => [ 'DateTime' , key, template, language ] ( Datum/Zeit ) #
48             # # ================================================================================ #
49             # # Methode: new Klassenkonstruktor #
50             # # ---------------------------------------------------------------------- #
51             # # Definiert eine neue Klasse vom Typ - Config::IniFiles::Import #
52             # # -------------------------------------------------------------------------------- #
53             # # Methode: Import Importiert die Werte auf Variable #
54             # # ---------------------------------------------------------------------- #
55             # # Diese Methode liest die Ini-Datei(en) ein und importiert die Daten auf #
56             # # Variable. #
57             # # ================================================================================ #
58             # # ... #
59             # # use Config::IniFiles::Import #
60             # # ... #
61             # # $INI = Config::IniFiles::Import -> new( #
62             # # -language => language, #
63             # # -predef => [ ... ] , #
64             # # -option => value , #
65             # # ... #
66             # # ); #
67             # # ... #
68             # # $INI -> Import( #
69             # # -loadsection => [ qw( section1 section2 ... ) ] , #
70             # # -loadvariable => [ qw( section3::par1+par2 section4::par1 ) ], #
71             # # -protocol => filehandle , #
72             # # -exportto => 'Config' , #
73             # # ); #
74             # # ... #
75             # ###################################################################################################
76              
77             package Config::IniFiles::Import;
78              
79 1     1   56504 use vars qw( $VERSION );
  1         2  
  1         96  
80              
81             $VERSION = '1.100';
82              
83 1     1   5 use Carp;
  1         2  
  1         97  
84 1     1   817 use Date::Language;
  1         40917  
  1         44  
85 1     1   3628 use FindBin;
  1         1826  
  1         59  
86 1     1   2988 use Config::IniFiles 2.29;
  1         139445  
  1         41  
87              
88 1     1   13 use strict;
  1         3  
  1         3121  
89              
90             # #################################################################################################
91             # # 1.) OEFFENTLICHE METHODEN #
92             # #################################################################################################
93              
94             # +--------------------------------------------------------------------------------------------+
95             # | new Klassen-Konstruktor |
96             # | -------------------- ------------------------------------------------------------------- |
97             # | $INI = Config::IniFiles::Import -> new( -option => value ... ); |
98             # +--------------------------------------------------------------------------------------------+
99              
100             sub new
101             {
102              
103 0     0 0   my $class = shift;
104 0           my $self = { -caller => caller };
105              
106 0           $self->{language} = 'German';
107              
108 0           my $time = time;
109              
110             # --- Optionen uebernehmen
111              
112 0           while ( my ( $key, $value ) = splice( @_, 0, 2 ) )
113             {
114 0 0         if ( $key eq '-file' ) { unshift( @{$self->{option}}, ( $key, $value ) ) }
  0 0          
  0 0          
115 0           elsif ( $key eq '-language' ) { $self->{language} = $value }
116             elsif ( $key eq '-predef' )
117             {
118 0           my ( $type, $key, $value, $lang ) = @$value;
119 0 0         if ( $type eq 'DateTime' )
    0          
120             {
121 0           my $lang = Date::Language -> new( $lang );
122 0           $self->{predef}->{$key} = $lang -> time2str( $value, $time );
123             }
124             elsif ( $type eq 'UserValue' )
125             {
126 0           $self->{predef}->{$key} = $value;
127             }
128             else
129             {
130 0           croak "Error by predifinition : $type : $key = $value\n";
131             }
132             }
133             else
134             {
135 0           push( @{$self->{option}}, ( $key, $value ) );
  0            
136             }
137             }
138              
139             # --- Testen ob die INI-Files vorhanden sind
140              
141 0 0 0       unless ( defined( ${$self->{option}}[0] ) and ${$self->{option}}[0] eq '-file' )
  0            
  0            
142             {
143 0           croak "INI-File not defined\n";
144             }
145 0 0         unless ( -T ${$self->{option}}[1] )
  0            
146             {
147 0           croak "INI-File not found\n";
148             }
149              
150             # --- Belegen der predefinierten Variablen
151              
152 0           $self->{predef}->{'FindBin'} = $FindBin::Bin;
153 0           $self->{predef}->{'UserName'} = $ENV{USER};
154              
155 0           my $lang = Date::Language -> new( $self->{language} );
156              
157 0           $self->{predef}->{'TimeShort'} = $lang -> time2str( '%H:%M' , $time );
158 0           $self->{predef}->{'TimeLong'} = $lang -> time2str( '%X' , $time );
159 0           $self->{predef}->{'DateShort'} = $lang -> time2str( '%d.%m.%Y' , $time );
160 0           $self->{predef}->{'DateLong'} = $lang -> time2str( '%d.%b.%Y' , $time );
161 0           $self->{predef}->{'DateTime'} = $lang -> time2str( '%d.%m.%Y - %H:%M', $time );
162              
163 0           bless $self, $class;
164              
165             }
166              
167             # +--------------------------------------------------------------------------------------------+
168             # | Import Lesen und importieren der Ini-Dateien |
169             # | -------------------- ------------------------------------------------------------------- |
170             # | $INI -> Import( |
171             # | -loadsection => [ qw( section1 ... ) ], |
172             # | -loadvariable => [ qw( section2:value1,... ... ) ], |
173             # | -protocol => filehandle , |
174             # | -exportto => 'packagename' |
175             # | ); |
176             # +--------------------------------------------------------------------------------------------+
177              
178             sub Import
179             {
180              
181 0     0 0   my $self = shift;
182              
183 0           my $sections = ';';
184 0           my $filehandle = undef;
185 0           my $exportto = 'INI';
186              
187             # --- Optionen uebernehmen
188              
189 0           while ( my ( $key, $value ) = splice( @_, 0, 2 ) )
190             {
191 0 0         if ( $key eq '-loadsection' ) { $sections .= join( '_*;', @{$value}, ';' ) }
  0 0          
  0 0          
    0          
192 0           elsif ( $key eq '-protocol' ) { $filehandle = $value }
193 0           elsif ( $key eq '-exportto' ) { $exportto = $value }
194             elsif ( $key eq '-loadvariable' )
195             {
196 0           foreach ( @{$value} )
  0            
197             {
198 0           my ( $section, $members ) = split( /::/ );
199 0           foreach ( split( /\+/, $members ) )
200             {
201 0           $sections .= "${section}_$_;";
202             }
203             }
204             }
205             }
206              
207 0           $sections =~ s/;;/;/g;
208              
209             # --- Uebernehmen der INI-Eintraege aus Modul Config::IniFiles
210              
211 0           tie my %ini, 'Config::IniFiles', ( @{$self->{option}} );
  0            
212              
213 0           foreach my $section ( keys( %ini ) )
214             {
215 0           foreach my $parameter ( keys( %{$ini{$section}} ) )
  0            
216             {
217 0           $self->{entrys}->{"${section}::${parameter}"} = $ini{$section}{$parameter};
218             }
219             }
220              
221 0           untie %ini;
222              
223             # --- Substitutionen ausfuehren
224              
225 0           foreach my $key ( keys( %{$self->{entrys}} ) )
  0            
226             {
227 0           while ( $self->{entrys}->{$key} =~ /{([:\w]+?)}/ )
228             {
229 0 0         if ( defined( $self->{entrys}->{$1} ) )
    0          
230             {
231 0           $self->{entrys}->{$key} =~ s/{([:\w]+?)}/$self->{entrys}->{$1}/;
232             }
233             elsif ( defined( $self->{predef}->{$1} ) )
234             {
235 0           $self->{entrys}->{$key} =~ s/{([:\w]+?)}/$self->{predef}->{$1}/;
236             }
237             else
238             {
239 0           my $subst = $1;
240 0 0         if ( $subst =~ /(ENV::)(.+)/ )
241             {
242 0 0         if ( defined( $ENV{$2} ) )
243             {
244 0           $self->{entrys}->{$key} =~ s/{([:\w]+?)}/$ENV{$2}/;
245             }
246             else
247             {
248 0           croak "Can't substitute value by $key\n";
249             }
250             }
251             else
252             {
253 0           croak "Can't substitute value by $key\n";
254             }
255             }
256             }
257             }
258              
259             # --- Export der INI-Eintraege auf Variablen
260              
261 0 0         if ( defined( $filehandle ) )
262             {
263 0           print $filehandle "Config::IniFiles::Import ( V: $VERSION ) - Protokoll";
264 0           print $filehandle ' ' x 13 . $self->{predef}->{'DateTime'} . "\n";
265 0           print $filehandle '=' x 80 . "\n\n";
266             }
267              
268 0           foreach my $key ( sort( keys( %{$self->{entrys}} ) ) )
  0            
269             {
270 0           $key =~ /(\w+)::(\w+)/i;
271 0           my $variable = "\$$1_$2";
272 0           my $section = $1;
273 0           my $parameter = $2;
274 0 0 0       if ( index( $sections, "$1_*" ) > 0 or
      0        
275             index( $sections, "$1_$2" ) > 0 or $sections eq ';' )
276             {
277 0           $self->{entrys}->{$key} =~ s(\\$){\\\\};
278 0 0         unless (
279             defined(
280             eval(
281             "package $exportto; " .
282             "use vars qw( $variable ); " .
283             "$variable = '$self->{entrys}->{$key}';"
284             )
285             )
286             )
287             {
288 0           croak "Can't create variable $exportto" . '::' . "$variable\n";
289             }
290 0 0         if ( defined( $filehandle ) )
291             {
292 0           $variable =~ s/^\$//;
293 0           printf $filehandle "%-25s = %-52s\n", $variable, $self->{entrys}->{$key}
294             }
295             }
296             }
297              
298 0 0         if ( defined( $filehandle ) )
299             {
300 0           print $filehandle "\n" . '=' x 80 . "\n";
301             }
302              
303             }
304              
305             # ###################################################################################################
306             # # E N D E #
307             # ###################################################################################################
308             1;