Commit | Line | Data |
ff746964 |
1 | #!/usr/bin/perl |
2 | |
3 | =head1 NAME |
4 | |
5 | dbicdump - Dump a schema using DBIx::Class::Schema::Loader |
6 | |
7 | =head1 SYNOPSIS |
8 | |
9 | dbicdump [-o <loader_option>=<value> ] <schema_class> <connect_info> |
10 | |
667f1a0b |
11 | Examples: |
12 | |
13 | $ dbicdump -o dump_directory=./lib \ |
14 | -o components='["InflateColumn::DateTime"]' \ |
15 | MyApp::Schema dbi:SQLite:./foo.db '{ quote_char => "\"" }' |
16 | |
17 | $ dbicdump -o dump_directory=./lib \ |
18 | -o components='["InflateColumn::DateTime"]' \ |
19 | -o preserve_case=1 \ |
20 | MyApp::Schema dbi:mysql:database=foo user pass '{ quote_char => "`" }' |
21 | |
eb40e254 |
22 | $ dbicdump -o dump_directory=./lib \ |
23 | -o components='["InflateColumn::DateTime"]' \ |
24 | MyApp::Schema 'dbi:mysql:database=foo;host=domain.tld;port=3306' user pass |
25 | |
93acebe1 |
26 | On Windows that would be: |
27 | |
28 | $ dbicdump -o dump_directory=.\lib ^ |
29 | -o components="[q{InflateColumn::DateTime}]" ^ |
30 | -o preserve_case=1 ^ |
31 | MyApp::Schema dbi:mysql:database=foo user pass "{ quote_char => q{`} }" |
32 | |
ff746964 |
33 | =head1 DESCRIPTION |
34 | |
35 | Dbicdump generates a L<DBIx::Class> schema using |
36 | L<DBIx::Class::Schema::Loader/make_schema_at> and dumps it to disk. |
37 | |
e83cb149 |
38 | You can pass any L<DBIx::Class::Schema::Loader::Base> constructor option using |
ff746964 |
39 | C<< -o <option>=<value> >>. For convenience, option names will have C<-> |
40 | replaced with C<_> and values that look like references or quote-like |
41 | operators will be C<eval>-ed before being passed to the constructor. |
42 | |
43 | The C<dump_directory> option defaults to the current directory if not |
44 | specified. |
45 | |
46 | =head1 SEE ALSO |
47 | |
48 | L<DBIx::Class::Schema::Loader>, L<DBIx::Class>. |
49 | |
50 | =head1 AUTHOR |
51 | |
52 | Dagfinn Ilmari Mannsåker C<< <ilmari@ilmari.org> >> |
53 | |
667f1a0b |
54 | =head1 CONTRIBUTORS |
55 | |
56 | Caelum: Rafael Kitover <rkitover@cpan.org> |
57 | |
ff746964 |
58 | =head1 LICENSE |
59 | |
60 | This program is free software; you can redistribute it and/or modify it |
61 | under the same terms as Perl itself. |
62 | |
63 | =cut |
64 | |
65 | use strict; |
66 | use warnings; |
67 | use Getopt::Long; |
707fb247 |
68 | |
69 | use Pod::Usage; |
70 | |
ff746964 |
71 | use DBIx::Class::Schema::Loader qw/ make_schema_at /; |
72 | require DBIx::Class::Schema::Loader::Base; |
73 | |
74 | my $loader_options; |
75 | |
76 | GetOptions( 'loader-option|o=s%' => \&handle_option ); |
77 | $loader_options->{dump_directory} ||= '.'; |
78 | |
707fb247 |
79 | my ($schema_class, @loader_connect_info) = @ARGV |
80 | or pod2usage(1); |
ff746964 |
81 | |
667f1a0b |
82 | my $dsn = shift @loader_connect_info; |
83 | |
84 | my ($user, $pass) = $dsn =~ /sqlite/i ? ('', '') |
85 | : splice @loader_connect_info, 0, 2; |
86 | |
87 | my @extra_connect_info_opts = map parse_value($_), @loader_connect_info; |
88 | |
89 | make_schema_at( |
90 | $schema_class, |
91 | $loader_options, |
92 | [ $dsn, $user, $pass, @extra_connect_info_opts ], |
93 | ); |
94 | |
95 | exit 0; |
96 | |
97 | sub parse_value { |
98 | my $value = shift; |
99 | |
100 | $value = eval $value if $value =~ /^\s*(?:sub\s*\{|q\w?\s*[^\w\s]|[[{])/; |
101 | |
102 | return $value; |
103 | } |
104 | |
ff746964 |
105 | sub handle_option { |
106 | my ($self, $key, $value) = @_; |
107 | |
108 | $key =~ tr/-/_/; |
109 | die "Unknown option: $key\n" |
110 | unless DBIx::Class::Schema::Loader::Base->can($key); |
111 | |
667f1a0b |
112 | $value = parse_value $value; |
ff746964 |
113 | |
114 | $loader_options->{$key} = $value; |
115 | } |
116 | |
667f1a0b |
117 | 1; |
118 | |
119 | __END__ |