| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Reply::Plugin::ORM; |
|
2
|
1
|
|
|
1
|
|
768
|
use 5.008005; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
42
|
|
|
3
|
1
|
|
|
1
|
|
5
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
115
|
|
|
4
|
1
|
|
|
1
|
|
10
|
use warnings; |
|
|
1
|
|
|
|
|
10
|
|
|
|
1
|
|
|
|
|
38
|
|
|
5
|
1
|
|
|
1
|
|
1024
|
use parent qw/ Reply::Plugin /; |
|
|
1
|
|
|
|
|
368
|
|
|
|
1
|
|
|
|
|
5
|
|
|
6
|
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
27164
|
use Module::Load; |
|
|
1
|
|
|
|
|
1315
|
|
|
|
1
|
|
|
|
|
7
|
|
|
8
|
1
|
|
|
1
|
|
1482
|
use Path::Tiny; |
|
|
1
|
|
|
|
|
25390
|
|
|
|
1
|
|
|
|
|
258
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = "0.01"; |
|
11
|
|
|
|
|
|
|
my $ORM; |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
sub new { |
|
14
|
0
|
|
|
0
|
0
|
|
my ($class, %opts) = @_; |
|
15
|
|
|
|
|
|
|
|
|
16
|
0
|
|
|
|
|
|
my $db_name = $ENV{PERL_REPLY_PLUGIN_ORM}; |
|
17
|
0
|
0
|
|
|
|
|
return $class->SUPER::new(%opts) unless defined $db_name; |
|
18
|
|
|
|
|
|
|
|
|
19
|
0
|
0
|
|
|
|
|
my $config_path = delete $opts{config} |
|
20
|
|
|
|
|
|
|
or Carp::croak "[Error] Please set config file's path at .replyrc"; |
|
21
|
0
|
|
|
|
|
|
my $config = $class->_config($db_name, $config_path); |
|
22
|
0
|
|
|
|
|
|
$class->_config_validate($config); |
|
23
|
|
|
|
|
|
|
|
|
24
|
0
|
|
|
|
|
|
my $orm_module = "Reply::Plugin::ORM::$config->{orm}"; |
|
25
|
0
|
|
|
|
|
|
eval "require $orm_module"; |
|
26
|
0
|
0
|
|
|
|
|
Carp::croak "[Error] Module '$orm_module' not found." if $@; |
|
27
|
|
|
|
|
|
|
|
|
28
|
0
|
|
|
|
|
|
load $orm_module; |
|
29
|
0
|
|
|
|
|
|
$ORM = $orm_module->new($db_name => $config, %opts); |
|
30
|
0
|
|
|
|
|
|
my @methods = (@{$ORM->{methods}}, qw/ Show_dbname Show_methods /); |
|
|
0
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
|
|
32
|
1
|
|
|
1
|
|
9
|
no strict 'refs'; |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
136
|
|
|
33
|
0
|
|
|
|
|
|
for my $method (@{$ORM->{methods}}) { |
|
|
0
|
|
|
|
|
|
|
|
34
|
0
|
|
|
0
|
|
|
*{"main::$method"} = sub { _command(lc $method, @_ ) }; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
} |
|
36
|
0
|
|
|
0
|
|
|
*main::Show_dbname = sub { return $db_name }; |
|
|
0
|
|
|
|
|
|
|
|
37
|
0
|
|
|
0
|
|
|
*main::Show_methods = sub { return @methods }; |
|
|
0
|
|
|
|
|
|
|
|
38
|
1
|
|
|
1
|
|
5
|
use strict 'refs'; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
1214
|
|
|
39
|
|
|
|
|
|
|
|
|
40
|
0
|
|
|
|
|
|
printf "Connect database : %s (using %s)\n", $db_name, $config->{orm}; |
|
41
|
|
|
|
|
|
|
|
|
42
|
0
|
|
|
|
|
|
return $class->SUPER::new(%opts, methods => \@methods); |
|
43
|
|
|
|
|
|
|
} |
|
44
|
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
sub tab_handler { |
|
46
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
|
47
|
0
|
|
|
|
|
|
my ($line) = @_; |
|
48
|
|
|
|
|
|
|
|
|
49
|
0
|
0
|
|
|
|
|
return if length $line <= 0; |
|
50
|
0
|
0
|
|
|
|
|
return if $line =~ /^#/; # command |
|
51
|
0
|
0
|
|
|
|
|
return if $line =~ /->\s*$/; # method call |
|
52
|
0
|
0
|
|
|
|
|
return if $line =~ /[\$\@\%\&\*]\s*$/; |
|
53
|
|
|
|
|
|
|
|
|
54
|
0
|
|
|
|
|
|
return sort grep { |
|
55
|
0
|
|
|
|
|
|
index ($_, $line) == 0 |
|
56
|
0
|
|
|
|
|
|
} @{$self->{methods}}; |
|
57
|
|
|
|
|
|
|
} |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
sub _config { |
|
60
|
0
|
|
|
0
|
|
|
my ($class, $db_name, $config_path) = @_; |
|
61
|
|
|
|
|
|
|
|
|
62
|
0
|
|
|
|
|
|
my $config_fullpath = path($config_path); |
|
63
|
0
|
0
|
|
|
|
|
Carp::croak "[Error] Config file not found: $config_fullpath" unless -f $config_fullpath; |
|
64
|
0
|
0
|
|
|
|
|
my $config = do $config_fullpath |
|
65
|
|
|
|
|
|
|
or Carp::croak "[Error] Failed to load config file: $config_path"; |
|
66
|
|
|
|
|
|
|
|
|
67
|
0
|
0
|
|
|
|
|
Carp::croak "[Error] Setting of '$db_name' not found at config file" unless $config->{$db_name}; |
|
68
|
0
|
|
|
|
|
|
return $config->{$db_name} |
|
69
|
|
|
|
|
|
|
} |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
sub _config_validate { |
|
72
|
0
|
|
|
0
|
|
|
my ($class, $config) = @_; |
|
73
|
0
|
0
|
|
|
|
|
Carp::croak "[Error] Please set 'orm' at config file." unless $config->{orm}; |
|
74
|
0
|
0
|
|
|
|
|
Carp::croak "[Error] Please set 'connect_info' at config file." unless $config->{connect_info}; |
|
75
|
|
|
|
|
|
|
} |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
sub _command { |
|
78
|
0
|
|
0
|
0
|
|
|
my $command = shift || ''; |
|
79
|
0
|
|
|
|
|
|
return $ORM->{orm}->$command(@_); |
|
80
|
|
|
|
|
|
|
} |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
1; |
|
83
|
|
|
|
|
|
|
__END__ |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=encoding utf-8 |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
=head1 NAME |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
Reply::Plugin::ORM - Reply + O/R Mapper |
|
90
|
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
; .replyrc |
|
94
|
|
|
|
|
|
|
... |
|
95
|
|
|
|
|
|
|
[ORM] |
|
96
|
|
|
|
|
|
|
config = ~/.reply-plugin-orm |
|
97
|
|
|
|
|
|
|
otogiri_plugins = DeleteCascade ; You can use O/R Mapper plugin (in this case, 'Otogiri::Plugin::DeleteCascade'). |
|
98
|
|
|
|
|
|
|
teng_plugins = Count,SearchJoined ; You can use multiple plugins, like this. |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
; .reply-plugin-orm |
|
101
|
|
|
|
|
|
|
+{ |
|
102
|
|
|
|
|
|
|
sandbox => { |
|
103
|
|
|
|
|
|
|
orm => 'Otogiri', # or 'Teng' |
|
104
|
|
|
|
|
|
|
connect_info => ["dbi:SQLite:dbname=...", '', '', { ... }], |
|
105
|
|
|
|
|
|
|
} |
|
106
|
|
|
|
|
|
|
} |
|
107
|
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
$ PERL_REPLY_PLUGIN_ORM=sandbox reply |
|
109
|
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
Reply::Plugin::ORM is Reply's plugin for operation of database using O/R Mapper. |
|
113
|
|
|
|
|
|
|
In this version, we have support for Otogiri and Teng. |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=head1 METHODS |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
Using this module, you can use O/R Mapper's method at Reply shell. |
|
118
|
|
|
|
|
|
|
If you set loading of O/R Mapper's plugin in config file, you can use method that provided by plugin on shell. |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
In order to prevent the redefined of function, these method's initials are upper case. |
|
121
|
|
|
|
|
|
|
You can call Teng's C<single> method, like this: |
|
122
|
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
1> Single 'table_name'; |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
In addition, this module provides two additional methods. |
|
126
|
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
=over 4 |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=item * C<Show_methods> |
|
130
|
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
This method outputs a list of methods provided by this module. |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=item * C<Show_dbname> |
|
134
|
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
This method outputs the name of database which you are connecting. |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=back |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
=head1 LICENSE |
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
Copyright (C) papix. |
|
142
|
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or modify |
|
144
|
|
|
|
|
|
|
it under the same terms as Perl itself. |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
=head1 AUTHOR |
|
147
|
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
papix E<lt>mail@papix.netE<gt> |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
L<Reply> |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
L<Otogiri> |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
L<Teng> |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=cut |
|
159
|
|
|
|
|
|
|
|