line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package OpenPlugin::Datasource; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
# $Id: Datasource.pm,v 1.20 2003/04/28 17:43:48 andreychek Exp $ |
4
|
|
|
|
|
|
|
|
5
|
1
|
|
|
1
|
|
918
|
use strict; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
50
|
|
6
|
1
|
|
|
1
|
|
6
|
use base qw( OpenPlugin::Plugin ); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
106
|
|
7
|
1
|
|
|
1
|
|
6
|
use Data::Dumper qw( Dumper ); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
3423
|
|
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
$OpenPlugin::Datasource::VERSION = sprintf("%d.%02d", q$Revision: 1.20 $ =~ /(\d+)\.(\d+)/); |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
my %DS = (); # Holds a copy of all our datasource information/handles |
12
|
|
|
|
|
|
|
my %LOADED = (); # Holds a copy of all loaded datasource drivers |
13
|
|
|
|
|
|
|
|
14
|
0
|
|
|
0
|
0
|
0
|
sub type { return 'datasource' } |
15
|
1
|
|
|
1
|
0
|
13
|
sub OP { return $_[0]->{_m}{OP} } |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
sub connect { |
18
|
0
|
|
|
0
|
0
|
|
my ( $self, $ds_name ) = @_; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
# There's nothing we can do if we weren't give a datasource to connect to |
21
|
0
|
0
|
|
|
|
|
unless ( $ds_name ) { |
22
|
0
|
|
|
|
|
|
$self->OP->exception->throw( "No datasource specified!"); |
23
|
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
0
|
|
|
|
|
|
$self->OP->log->info( "Trying to find datasource ($ds_name)" ); |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
# If we don't alreay have a datasource handle for this datasource, create |
28
|
|
|
|
|
|
|
# one |
29
|
0
|
0
|
|
|
|
|
unless ( $DS{ $ds_name } ) { |
30
|
|
|
|
|
|
|
|
31
|
0
|
|
|
|
|
|
$self->OP->log->info( "Datasource ($ds_name) not connected yet" ); |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
# Get info on this particular datasource from the config |
34
|
0
|
|
|
|
|
|
my $ds_info = $self->OP->config->{datasource}{ $ds_name }; |
35
|
|
|
|
|
|
|
|
36
|
0
|
0
|
|
|
|
|
unless ( ref $ds_info eq 'HASH' ) { |
37
|
0
|
|
|
|
|
|
$self->OP->exception->throw |
38
|
|
|
|
|
|
|
( "No information defined for datasource [$ds_name]" ); |
39
|
|
|
|
|
|
|
} |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
# A 'type' is something like 'DBI' or 'LDAP' |
42
|
0
|
0
|
|
|
|
|
unless ( $ds_info->{type} ) { |
43
|
0
|
|
|
|
|
|
$self->OP->exception->throw |
44
|
|
|
|
|
|
|
( "Datasource ($ds_name) must have 'type' defined" ); |
45
|
|
|
|
|
|
|
} |
46
|
|
|
|
|
|
|
|
47
|
0
|
|
|
|
|
|
my $mgr_class = $self->OP->get_plugin_class( "datasource", |
48
|
|
|
|
|
|
|
$ds_info->{'type'} ); |
49
|
|
|
|
|
|
|
|
50
|
0
|
|
|
|
|
|
$mgr_class =~ m/^([\w:]+)$/g; |
51
|
0
|
|
|
|
|
|
$mgr_class = $1; |
52
|
|
|
|
|
|
|
|
53
|
0
|
0
|
|
|
|
|
unless ( $mgr_class ) { |
54
|
0
|
|
|
|
|
|
$self->OP->exception->throw( "Specified datasource type ", |
55
|
|
|
|
|
|
|
"[$ds_info->{type}] for datasource ", |
56
|
|
|
|
|
|
|
"[$ds_name] does not map to a ", |
57
|
|
|
|
|
|
|
"known driver." ); |
58
|
|
|
|
|
|
|
} |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
# Checks to see if a given driver class is loaded -- for example, |
61
|
|
|
|
|
|
|
# OpenPlugin::Datasource::DBI or OpenPlugin::Datasource::LDAP |
62
|
0
|
0
|
|
|
|
|
unless ( $LOADED{ $mgr_class } ) { |
63
|
|
|
|
|
|
|
|
64
|
0
|
|
|
|
|
|
$self->OP->log->info( "Loading driver [$mgr_class]." ); |
65
|
0
|
|
|
|
|
|
eval "require $mgr_class"; |
66
|
|
|
|
|
|
|
|
67
|
0
|
0
|
|
|
|
|
if ( $@ ) { |
68
|
0
|
|
|
|
|
|
$self->OP->exception->throw( "Cannot load datasource ", |
69
|
|
|
|
|
|
|
"driver class: $@" ); |
70
|
|
|
|
|
|
|
} |
71
|
|
|
|
|
|
|
|
72
|
0
|
|
|
|
|
|
$self->OP->log->info( "Driver [$mgr_class] loaded ok" ); |
73
|
0
|
|
|
|
|
|
$LOADED{ $mgr_class }++; |
74
|
|
|
|
|
|
|
} |
75
|
|
|
|
|
|
|
|
76
|
0
|
|
|
|
|
|
my $item = eval { $mgr_class->connect( $self->OP, $ds_name, |
|
0
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
$ds_info ); }; |
78
|
0
|
0
|
|
|
|
|
if ( $@ ) { |
79
|
0
|
|
|
|
|
|
$self->OP->exception->throw( $@ ); |
80
|
|
|
|
|
|
|
} |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
# Store the info for this particular datasource for future reference |
83
|
0
|
|
|
|
|
|
$DS{ $ds_name } = { manager => $mgr_class, |
84
|
|
|
|
|
|
|
connection => $item, |
85
|
|
|
|
|
|
|
config => $ds_info }; |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
# Return the datasource handle |
89
|
0
|
|
|
|
|
|
return $DS{ $ds_name }->{'connection'}; |
90
|
|
|
|
|
|
|
} |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
sub disconnect { |
93
|
0
|
|
|
0
|
0
|
|
my ( $self, $ds_name ) = @_; |
94
|
|
|
|
|
|
|
|
95
|
0
|
0
|
|
|
|
|
unless ( $DS{ $ds_name } ) { |
96
|
0
|
|
|
|
|
|
$self->OP->exception->throw( "No datasource by name [$ds_name] ", |
97
|
|
|
|
|
|
|
"available" ); |
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
|
100
|
0
|
|
|
|
|
|
my $mgr_class = $DS{ $ds_name }->{'manager'}; |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
# Pass in am OpenPlugin object and the datasource handle to the driver |
103
|
0
|
|
|
|
|
|
return $mgr_class->disconnect( $self->OP, $DS{ $ds_name }->{connection} ); |
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
# Disconnect all datasources |
107
|
|
|
|
|
|
|
sub shutdown { |
108
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
109
|
0
|
|
|
|
|
|
foreach my $ds_name ( keys %DS ) { |
110
|
0
|
|
|
|
|
|
$self->disconnect( $ds_name ); |
111
|
|
|
|
|
|
|
} |
112
|
0
|
|
|
|
|
|
return 1; |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
1; |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
__END__ |