-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathBase.pm
3244 lines (2414 loc) · 101 KB
/
Base.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
package DBIx::Class::Schema::Loader::Base;
use strict;
use warnings;
use base qw/Class::Accessor::Grouped Class::C3::Componentised/;
use MRO::Compat;
use mro 'c3';
use Carp::Clan qw/^DBIx::Class/;
use DBIx::Class::Schema::Loader::RelBuilder ();
use Data::Dump 'dump';
use POSIX ();
use File::Spec ();
use Cwd ();
use Digest::MD5 ();
use Lingua::EN::Inflect::Number ();
use Lingua::EN::Inflect::Phrase ();
use String::ToIdentifier::EN ();
use String::ToIdentifier::EN::Unicode ();
use File::Temp ();
use Class::Unload;
use Class::Inspector ();
use Scalar::Util 'looks_like_number';
use DBIx::Class::Schema::Loader::Column;
use DBIx::Class::Schema::Loader::Utils qw/split_name dumper_squashed eval_package_without_redefine_warnings class_path slurp_file sigwarn_silencer firstidx uniq/;
use DBIx::Class::Schema::Loader::Optional::Dependencies ();
use Try::Tiny;
use DBIx::Class ();
use Encode qw/encode decode/;
use List::Util qw/all any none/;
use File::Temp 'tempfile';
use namespace::clean;
our $VERSION = '0.07045';
__PACKAGE__->mk_group_ro_accessors('simple', qw/
schema
schema_class
exclude
constraint
additional_classes
additional_base_classes
left_base_classes
components
schema_components
skip_relationships
skip_load_external
moniker_map
col_accessor_map
custom_column_info
inflect_singular
inflect_plural
debug
dump_directory
dump_overwrite
really_erase_my_files
resultset_namespace
default_resultset_class
schema_base_class
result_base_class
result_roles
use_moose
only_autoclean
overwrite_modifications
dry_run
generated_classes
omit_version
omit_timestamp
relationship_attrs
_tables
classes
_upgrading_classes
monikers
dynamic
naming
datetime_timezone
datetime_locale
config_file
loader_class
table_comments_table
column_comments_table
class_to_table
moniker_to_table
uniq_to_primary
quiet
allow_extra_m2m_cols
/);
__PACKAGE__->mk_group_accessors('simple', qw/
version_to_dump
schema_version_to_dump
_upgrading_from
_upgrading_from_load_classes
_downgrading_to_load_classes
_rewriting_result_namespace
use_namespaces
result_namespace
generate_pod
pod_comment_mode
pod_comment_spillover_length
preserve_case
col_collision_map
rel_collision_map
rel_name_map
real_dump_directory
result_components_map
result_roles_map
datetime_undef_if_invalid
_result_class_methods
naming_set
filter_generated_code
db_schema
qualify_objects
moniker_parts
moniker_part_separator
moniker_part_map
/);
my $CURRENT_V = 'v7';
my @CLASS_ARGS = qw(
schema_components schema_base_class result_base_class
additional_base_classes left_base_classes additional_classes components
result_roles
);
my $CR = "\x0d";
my $LF = "\x0a";
my $CRLF = "\x0d\x0a";
=head1 NAME
DBIx::Class::Schema::Loader::Base - Base DBIx::Class::Schema::Loader Implementation.
=head1 SYNOPSIS
See L<DBIx::Class::Schema::Loader>.
=head1 DESCRIPTION
This is the base class for the storage-specific C<DBIx::Class::Schema::*>
classes, and implements the common functionality between them.
=head1 CONSTRUCTOR OPTIONS
These constructor options are the base options for
L<DBIx::Class::Schema::Loader/loader_options>. Available constructor options are:
=head2 skip_relationships
Skip setting up relationships. The default is to attempt the loading
of relationships.
=head2 skip_load_external
Skip loading of other classes in @INC. The default is to merge all other classes
with the same name found in @INC into the schema file we are creating.
=head2 naming
Static schemas (ones dumped to disk) will, by default, use the new-style
relationship names and singularized Results, unless you're overwriting an
existing dump made by an older version of L<DBIx::Class::Schema::Loader>, in
which case the backward compatible RelBuilder will be activated, and the
appropriate monikerization used.
Specifying
naming => 'current'
will disable the backward-compatible RelBuilder and use
the new-style relationship names along with singularized Results, even when
overwriting a dump made with an earlier version.
The option also takes a hashref:
naming => {
relationships => 'v8',
monikers => 'v8',
column_accessors => 'v8',
force_ascii => 1,
}
or
naming => { ALL => 'v8', force_ascii => 1 }
The keys are:
=over 4
=item ALL
Set L</relationships>, L</monikers> and L</column_accessors> to the specified
value.
=item relationships
How to name relationship accessors.
=item monikers
How to name Result classes.
=item column_accessors
How to name column accessors in Result classes.
=item force_ascii
For L</v8> mode and later, uses L<String::ToIdentifier::EN> instead of
L<String::ToIdentifier::EN::Unicode> to force monikers and other identifiers to
ASCII.
=back
The values can be:
=over 4
=item current
Latest style, whatever that happens to be.
=item v4
Unsingularlized monikers, C<has_many> only relationships with no _id stripping.
=item v5
Monikers singularized as whole words, C<might_have> relationships for FKs on
C<UNIQUE> constraints, C<_id> stripping for belongs_to relationships.
Some of the C<_id> stripping edge cases in C<0.05003> have been reverted for
the v5 RelBuilder.
=item v6
All monikers and relationships are inflected using
L<Lingua::EN::Inflect::Phrase>, and there is more aggressive C<_id> stripping
from relationship names.
In general, there is very little difference between v5 and v6 schemas.
=item v7
This mode is identical to C<v6> mode, except that monikerization of CamelCase
table names is also done better (but best in v8.)
CamelCase column names in case-preserving mode will also be handled better
for relationship name inflection (but best in v8.) See L</preserve_case>.
In this mode, CamelCase L</column_accessors> are normalized based on case
transition instead of just being lowercased, so C<FooId> becomes C<foo_id>.
=item v8
(EXPERIMENTAL)
The default mode is L</v7>, to get L</v8> mode, you have to specify it in
L</naming> explicitly until C<0.08> comes out.
L</monikers> and L</column_accessors> are created using
L<String::ToIdentifier::EN::Unicode> or L<String::ToIdentifier::EN> if
L</force_ascii> is set; this is only significant for names with non-C<\w>
characters such as C<.>.
CamelCase identifiers with words in all caps, e.g. C<VLANValidID> are supported
correctly in this mode.
For relationships, belongs_to accessors are made from column names by stripping
postfixes other than C<_id> as well, for example just C<Id>, C<_?ref>, C<_?cd>,
C<_?code> and C<_?num>, case insensitively.
=item preserve
For L</monikers>, this option does not inflect the table names but makes
monikers based on the actual name. For L</column_accessors> this option does
not normalize CamelCase column names to lowercase column accessors, but makes
accessors that are the same names as the columns (with any non-\w chars
replaced with underscores.)
=item singular
For L</monikers>, singularizes the names using the most current inflector. This
is the same as setting the option to L</current>.
=item plural
For L</monikers>, pluralizes the names, using the most current inflector.
=back
Dynamic schemas will always default to the 0.04XXX relationship names and won't
singularize Results for backward compatibility, to activate the new RelBuilder
and singularization put this in your C<Schema.pm> file:
__PACKAGE__->naming('current');
Or if you prefer to use 0.07XXX features but insure that nothing breaks in the
next major version upgrade:
__PACKAGE__->naming('v7');
=head2 quiet
If true, will not print the usual C<Dumping manual schema ... Schema dump
completed.> messages. Does not affect warnings (except for warnings related to
L</really_erase_my_files>.)
=head2 dry_run
If true, don't actually write out the generated files. This can only be
used with static schema generation.
=head2 generate_pod
By default POD will be generated for columns and relationships, using database
metadata for the text if available and supported.
Comment metadata can be stored in two ways.
The first is that you can create two tables named C<table_comments> and
C<column_comments> respectively. These tables must exist in the same database
and schema as the tables they describe. They both need to have columns named
C<table_name> and C<comment_text>. The second one needs to have a column named
C<column_name>. Then data stored in these tables will be used as a source of
metadata about tables and comments.
(If you wish you can change the name of these tables with the parameters
L</table_comments_table> and L</column_comments_table>.)
As a fallback you can use built-in commenting mechanisms. Currently this is
only supported for PostgreSQL, Oracle and MySQL. To create comments in
PostgreSQL you add statements of the form C<COMMENT ON TABLE some_table IS
'...'>, the same syntax is used in Oracle. To create comments in MySQL you add
C<COMMENT '...'> to the end of the column or table definition. Note that MySQL
restricts the length of comments, and also does not handle complex Unicode
characters properly.
Set this to C<0> to turn off all POD generation.
=head2 pod_comment_mode
Controls where table comments appear in the generated POD. Smaller table
comments are appended to the C<NAME> section of the documentation, and larger
ones are inserted into C<DESCRIPTION> instead. You can force a C<DESCRIPTION>
section to be generated with the comment always, only use C<NAME>, or choose
the length threshold at which the comment is forced into the description.
=over 4
=item name
Use C<NAME> section only.
=item description
Force C<DESCRIPTION> always.
=item auto
Use C<DESCRIPTION> if length > L</pod_comment_spillover_length>, this is the
default.
=back
=head2 pod_comment_spillover_length
When pod_comment_mode is set to C<auto>, this is the length of the comment at
which it will be forced into a separate description section.
The default is C<60>
=head2 table_comments_table
The table to look for comments about tables in. By default C<table_comments>.
See L</generate_pod> for details.
This must not be a fully qualified name, the table will be looked for in the
same database and schema as the table whose comment is being retrieved.
=head2 column_comments_table
The table to look for comments about columns in. By default C<column_comments>.
See L</generate_pod> for details.
This must not be a fully qualified name, the table will be looked for in the
same database and schema as the table/column whose comment is being retrieved.
=head2 relationship_attrs
Hashref of attributes to pass to each generated relationship, listed by type.
Also supports relationship type 'all', containing options to pass to all
generated relationships. Attributes set for more specific relationship types
override those set in 'all', and any attributes specified by this option
override the introspected attributes of the foreign key if any.
For example:
relationship_attrs => {
has_many => { cascade_delete => 1, cascade_copy => 1 },
might_have => { cascade_delete => 1, cascade_copy => 1 },
},
use this to turn L<DBIx::Class> cascades to on on your
L<has_many|DBIx::Class::Relationship/has_many> and
L<might_have|DBIx::Class::Relationship/might_have> relationships, they default
to off.
Can also be a coderef, for more precise control, in which case the coderef gets
this hash of parameters (as a list:)
rel_name # the name of the relationship
rel_type # the type of the relationship: 'belongs_to', 'has_many' or 'might_have'
local_source # the DBIx::Class::ResultSource object for the source the rel is *from*
remote_source # the DBIx::Class::ResultSource object for the source the rel is *to*
local_table # a DBIx::Class::Schema::Loader::Table object for the table of the source the rel is from
local_cols # an arrayref of column names of columns used in the rel in the source it is from
remote_table # a DBIx::Class::Schema::Loader::Table object for the table of the source the rel is to
remote_cols # an arrayref of column names of columns used in the rel in the source it is to
attrs # the attributes that would be set
it should return the new hashref of attributes, or nothing for no changes.
For example:
relationship_attrs => sub {
my %p = @_;
say "the relationship name is: $p{rel_name}";
say "the relationship is a: $p{rel_type}";
say "the local class is: ", $p{local_source}->result_class;
say "the remote class is: ", $p{remote_source}->result_class;
say "the local table is: ", $p{local_table}->sql_name;
say "the rel columns in the local table are: ", (join ", ", @{$p{local_cols}});
say "the remote table is: ", $p{remote_table}->sql_name;
say "the rel columns in the remote table are: ", (join ", ", @{$p{remote_cols}});
if ($p{local_table} eq 'dogs' && @{$p{local_cols}} == 1 && $p{local_cols}[0] eq 'name') {
$p{attrs}{could_be_snoopy} = 1;
reutrn $p{attrs};
}
},
These are the default attributes:
has_many => {
cascade_delete => 0,
cascade_copy => 0,
},
might_have => {
cascade_delete => 0,
cascade_copy => 0,
},
belongs_to => {
on_delete => 'CASCADE',
on_update => 'CASCADE',
is_deferrable => 1,
},
For L<belongs_to|DBIx::Class::Relationship/belongs_to> relationships, these
defaults are overridden by the attributes introspected from the foreign key in
the database, if this information is available (and the driver is capable of
retrieving it.)
This information overrides the defaults mentioned above, and is then itself
overridden by the user's L</relationship_attrs> for C<belongs_to> if any are
specified.
In general, for most databases, for a plain foreign key with no rules, the
values for a L<belongs_to|DBIx::Class::Relationship/belongs_to> relationship
will be:
on_delete => 'NO ACTION',
on_update => 'NO ACTION',
is_deferrable => 0,
In the cases where an attribute is not supported by the DB, a value matching
the actual behavior is used, for example Oracle does not support C<ON UPDATE>
rules, so C<on_update> is set to C<NO ACTION>. This is done so that the
behavior of the schema is preserved when cross deploying to a different RDBMS
such as SQLite for testing.
In the cases where the DB does not support C<DEFERRABLE> foreign keys, the
value is set to C<1> if L<DBIx::Class> has a working C<<
$storage->with_deferred_fk_checks >>. This is done so that the same
L<DBIx::Class> code can be used, and cross deployed from and to such databases.
=head2 debug
If set to true, each constructive L<DBIx::Class> statement the loader
decides to execute will be C<warn>-ed before execution.
=head2 db_schema
Set the name of the schema to load (schema in the sense that your database
vendor means it).
Can be set to an arrayref of schema names for multiple schemas, or the special
value C<%> for all schemas.
For MSSQL, Sybase ASE, and Informix can be set to a hashref of databases as
keys and arrays of owners as values, set to the value:
{ '%' => '%' }
for all owners in all databases.
Name clashes resulting from the same table name in different databases/schemas
will be resolved automatically by prefixing the moniker with the database
and/or schema.
To prefix/suffix all monikers with the database and/or schema, see
L</moniker_parts>.
=head2 moniker_parts
The database table names are represented by the
L<DBIx::Class::Schema::Loader::Table> class in the loader, the
L<DBIx::Class::Schema::Loader::Table::Sybase> class for Sybase ASE and
L<DBIx::Class::Schema::Loader::Table::Informix> for Informix.
Monikers are created normally based on just the
L<name|DBIx::Class::Schema::Loader::DBObject/name> property, corresponding to
the table name, but can consist of other parts of the fully qualified name of
the table.
The L</moniker_parts> option is an arrayref of methods on the table class
corresponding to parts of the fully qualified table name, defaulting to
C<['name']>, in the order those parts are used to create the moniker name.
The parts are joined together using L</moniker_part_separator>.
The C<'name'> entry B<must> be present.
Below is a table of supported databases and possible L</moniker_parts>.
=over 4
=item * DB2, Firebird, mysql, Oracle, Pg, SQLAnywhere, SQLite, MS Access
C<schema>, C<name>
=item * Informix, MSSQL, Sybase ASE
C<database>, C<schema>, C<name>
=back
=head2 moniker_part_separator
String used to join L</moniker_parts> when creating the moniker.
Defaults to the empty string. Use C<::> to get a separate namespace per
database and/or schema.
=head2 constraint
Only load matching tables.
=head2 exclude
Exclude matching tables.
These can be specified either as a regex (preferably on the C<qr//>
form), or as an arrayref of arrayrefs. Regexes are matched against
the (unqualified) table name, while arrayrefs are matched according to
L</moniker_parts>.
For example:
db_schema => [qw(some_schema other_schema)],
moniker_parts => [qw(schema name)],
constraint => [
[ qr/\Asome_schema\z/ => qr/\A(?:foo|bar)\z/ ],
[ qr/\Aother_schema\z/ => qr/\Abaz\z/ ],
],
In this case only the tables C<foo> and C<bar> in C<some_schema> and
C<baz> in C<other_schema> will be dumped.
=head2 moniker_map
Overrides the default table name to moniker translation. Either
=over
=item *
a nested hashref, which will be traversed according to L</moniker_parts>
For example:
moniker_parts => [qw(schema name)],
moniker_map => {
foo => {
bar => "FooishBar",
},
},
In which case the table C<bar> in the C<foo> schema would get the moniker
C<FooishBar>.
=item *
a hashref of unqualified table name keys and moniker values
=item *
a coderef for a translator function taking a L<table
object|DBIx::Class::Schema::Loader::Table> argument (which stringifies to the
unqualified table name) and returning a scalar moniker
For Example:
Some databases like to prefix a namespace to every table definition
(e.g. Microsoft SQL Server likes to add 'dbo'). To avoid having your classes
contain redundant information you can pass C<moniker_map> a function to strip it off.
moniker_map => sub { my $name = $_[0];
$name =~ s/^dbo//;
join '', map ucfirst, split '_', $name
}
The function is also passed a coderef that can be called with either
of the hashref forms to get the moniker mapped accordingly. This is
useful if you need to handle some monikers specially, but want to use
the hashref form for the rest.
=back
If the hash entry does not exist, or the function returns a false
value, the code falls back to default behavior for that table name.
The default behavior is to split on case transition and non-alphanumeric
boundaries, singularize the resulting phrase, then join the titlecased words
together. Examples:
Table Name | Moniker Name
---------------------------------
luser | Luser
luser_group | LuserGroup
luser-opts | LuserOpt
stations_visited | StationVisited
routeChange | RouteChange
=head2 moniker_part_map
Map for overriding the monikerization of individual L</moniker_parts>.
The keys are the moniker part to override, the value is either a
hashref of coderef for mapping the corresponding part of the
moniker. If a coderef is used, it gets called with the moniker part
and the hash key the code ref was found under.
For example:
moniker_part_map => {
schema => sub { ... },
},
Given the table C<foo.bar>, the code ref would be called with the
arguments C<foo> and C<schema>, plus a coderef similar to the one
described in L</moniker_map>.
L</moniker_map> takes precedence over this.
=head2 col_accessor_map
Same as moniker_map, but for column accessor names. The nested
hashref form is traversed according to L</moniker_parts>, with an
extra level at the bottom for the column name. If a coderef is
passed, the code is called with arguments of
the DBIx::Class::Schema::Loader::Column object for the column,
default accessor name that DBICSL would ordinarily give this column,
{
table_class => name of the DBIC class we are building,
table_moniker => calculated moniker for this table (after moniker_map if present),
table => table object of interface DBIx::Class::Schema::Loader::Table,
full_table_name => schema-qualified name of the database table (RDBMS specific),
schema_class => name of the schema class we are building,
column_info => hashref of column info (data_type, is_nullable, etc),
}
coderef ref that can be called with a hashref map
The L<column|DBIx::Class::Schema::Loader::Column> and
L<table|DBIx::Class::Schema::Loader::Table> objects stringify to their
unqualified names.
=head2 rel_name_map
Similar in idea to moniker_map, but different in the details. It can be
a hashref or a code ref.
If it is a hashref, keys can be either the default relationship name, or the
moniker. The keys that are the default relationship name should map to the
name you want to change the relationship to. Keys that are monikers should map
to hashes mapping relationship names to their translation. You can do both at
once, and the more specific moniker version will be picked up first. So, for
instance, you could have
{
bar => "baz",
Foo => {
bar => "blat",
},
}
and relationships that would have been named C<bar> will now be named C<baz>
except that in the table whose moniker is C<Foo> it will be named C<blat>.
If it is a coderef, it will be passed a hashref of this form:
{
name => default relationship name,
type => the relationship type eg: C<has_many>,
local_class => name of the DBIC class we are building,
local_moniker => moniker of the DBIC class we are building,
local_columns => columns in this table in the relationship,
remote_class => name of the DBIC class we are related to,
remote_moniker => moniker of the DBIC class we are related to,
remote_columns => columns in the other table in the relationship,
# for type => "many_to_many" only:
link_class => name of the DBIC class for the link table
link_moniker => moniker of the DBIC class for the link table
link_rel_name => name of the relationship to the link table
}
In addition it is passed a coderef that can be called with a hashref map.
DBICSL will try to use the value returned as the relationship name.
=head2 inflect_plural
Just like L</moniker_map> above (can be hash/code-ref, falls back to default
if hash key does not exist or coderef returns false), but acts as a map
for pluralizing relationship names. The default behavior is to utilize
L<Lingua::EN::Inflect::Phrase/to_PL>.
=head2 inflect_singular
As L</inflect_plural> above, but for singularizing relationship names.
Default behavior is to utilize L<Lingua::EN::Inflect::Phrase/to_S>.
=head2 schema_base_class
Base class for your schema classes. Defaults to 'DBIx::Class::Schema'.
=head2 schema_components
List of components to load into the Schema class.
=head2 result_base_class
Base class for your table classes (aka result classes). Defaults to
'DBIx::Class::Core'.
=head2 additional_base_classes
List of additional base classes all of your table classes will use.
=head2 left_base_classes
List of additional base classes all of your table classes will use
that need to be leftmost.
=head2 additional_classes
List of additional classes which all of your table classes will use.
=head2 components
List of additional components to be loaded into all of your Result
classes. A good example would be
L<InflateColumn::DateTime|DBIx::Class::InflateColumn::DateTime>
=head2 result_components_map
A hashref of moniker keys and component values. Unlike L</components>, which
loads the given components into every Result class, this option allows you to
load certain components for specified Result classes. For example:
result_components_map => {
StationVisited => '+YourApp::Schema::Component::StationVisited',
RouteChange => [
'+YourApp::Schema::Component::RouteChange',
'InflateColumn::DateTime',
],
}
You may use this in conjunction with L</components>.
=head2 result_roles
List of L<Moose> roles to be applied to all of your Result classes.
=head2 result_roles_map
A hashref of moniker keys and role values. Unlike L</result_roles>, which
applies the given roles to every Result class, this option allows you to apply
certain roles for specified Result classes. For example:
result_roles_map => {
StationVisited => [
'YourApp::Role::Building',
'YourApp::Role::Destination',
],
RouteChange => 'YourApp::Role::TripEvent',
}
You may use this in conjunction with L</result_roles>.
=head2 use_namespaces
This is now the default, to go back to L<DBIx::Class::Schema/load_classes> pass
a C<0>.
Generate result class names suitable for
L<DBIx::Class::Schema/load_namespaces> and call that instead of
L<DBIx::Class::Schema/load_classes>. When using this option you can also
specify any of the options for C<load_namespaces> (i.e. C<result_namespace>,
C<resultset_namespace>, C<default_resultset_class>), and they will be added
to the call (and the generated result class names adjusted appropriately).
=head2 dump_directory
The value of this option is a perl libdir pathname. Within
that directory this module will create a baseline manual
L<DBIx::Class::Schema> module set, based on what it creates at runtime.
The created schema class will have the same classname as the one on
which you are setting this option (and the ResultSource classes will be
based on this name as well).
Normally you wouldn't hard-code this setting in your schema class, as it
is meant for one-time manual usage.
See L<DBIx::Class::Schema::Loader/dump_to_dir> for examples of the
recommended way to access this functionality.
=head2 dump_overwrite
Deprecated. See L</really_erase_my_files> below, which does *not* mean
the same thing as the old C<dump_overwrite> setting from previous releases.
=head2 really_erase_my_files
Default false. If true, Loader will unconditionally delete any existing
files before creating the new ones from scratch when dumping a schema to disk.
The default behavior is instead to only replace the top portion of the
file, up to and including the final stanza which contains
C<# DO NOT MODIFY THE FIRST PART OF THIS FILE>
leaving any customizations you placed after that as they were.
When C<really_erase_my_files> is not set, if the output file already exists,
but the aforementioned final stanza is not found, or the checksum
contained there does not match the generated contents, Loader will
croak and not touch the file.
You should really be using version control on your schema classes (and all
of the rest of your code for that matter). Don't blame me if a bug in this
code wipes something out when it shouldn't have, you've been warned.
=head2 overwrite_modifications
Default false. If false, when updating existing files, Loader will
refuse to modify any Loader-generated code that has been modified
since its last run (as determined by the checksum Loader put in its
comment lines).
If true, Loader will discard any manual modifications that have been
made to Loader-generated code.
Again, you should be using version control on your schema classes. Be
careful with this option.
=head2 omit_version
Omit the package version from the signature comment.
=head2 omit_timestamp
Omit the creation timestamp from the signature comment.
=head2 custom_column_info
Hook for adding extra attributes to the
L<column_info|DBIx::Class::ResultSource/column_info> for a column.
Must be a coderef that returns a hashref with the extra attributes.
Receives the L<table object|DBIx::Class::Schema::Loader::Table> (which
stringifies to the unqualified table name), column name and column_info.
For example:
custom_column_info => sub {
my ($table, $column_name, $column_info) = @_;
if ($column_name eq 'dog' && $column_info->{default_value} eq 'snoopy') {
return { is_snoopy => 1 };
}
},
This attribute can also be used to set C<inflate_datetime> on a non-datetime
column so it also receives the L</datetime_timezone> and/or L</datetime_locale>.
=head2 datetime_timezone
Sets the timezone attribute for L<DBIx::Class::InflateColumn::DateTime> for all
columns with the DATE/DATETIME/TIMESTAMP data_types.
=head2 datetime_locale
Sets the locale attribute for L<DBIx::Class::InflateColumn::DateTime> for all
columns with the DATE/DATETIME/TIMESTAMP data_types.
=head2 datetime_undef_if_invalid
Pass a C<0> for this option when using MySQL if you B<DON'T> want C<<
datetime_undef_if_invalid => 1 >> in your column info for DATE, DATETIME and
TIMESTAMP columns.
The default is recommended to deal with data such as C<00/00/00> which
sometimes ends up in such columns in MySQL.
=head2 config_file
File in Perl format, which should return a HASH reference, from which to read
loader options.
=head2 preserve_case
Normally database names are lowercased and split by underscore, use this option
if you have CamelCase database names.
Drivers for case sensitive databases like Sybase ASE or MSSQL with a
case-sensitive collation will turn this option on unconditionally.
B<NOTE:> L</naming> = C<v8> is highly recommended with this option as the
semantics of this mode are much improved for CamelCase database names.
L</naming> = C<v7> or greater is required with this option.
=head2 qualify_objects
Set to true to prepend the L</db_schema> to table names for C<<
__PACKAGE__->table >> calls, and to some other things like Oracle sequences.
This attribute is automatically set to true for multi db_schema configurations,
unless explicitly set to false by the user.
=head2 use_moose
Creates Schema and Result classes that use L<Moose>, L<MooseX::NonMoose> and
L<MooseX::MarkAsMethods> (or L<namespace::autoclean>, see below). The default
content after the md5 sum also makes the classes immutable.
It is safe to upgrade your existing Schema to this option.
=head2 only_autoclean
By default, we use L<MooseX::MarkAsMethods> to remove imported functions from
your generated classes. It uses L<namespace::autoclean> to do this, after
telling your object's metaclass that any operator L<overload>s in your class
are methods, which will cause namespace::autoclean to spare them from removal.
This prevents the "Hey, where'd my overloads go?!" effect.
If you don't care about operator overloads, enabling this option falls back to
just using L<namespace::autoclean> itself.
If none of the above made any sense, or you don't have some pressing need to
only use L<namespace::autoclean>, leaving this set to the default is
recommended.
=head2 col_collision_map
This option controls how accessors for column names which collide with perl
methods are named. See L</COLUMN ACCESSOR COLLISIONS> for more information.
This option takes either a single L<sprintf|perlfunc/sprintf> format or a hashref of
strings which are compiled to regular expressions that map to
L<sprintf|perlfunc/sprintf> formats.
Examples:
col_collision_map => 'column_%s'
col_collision_map => { '(.*)' => 'column_%s' }
col_collision_map => { '(foo).*(bar)' => 'column_%s_%s' }
=head2 rel_collision_map
Works just like L</col_collision_map>, but for relationship names/accessors