make deploy's 'sources' arg default to just the journal related sources
[dbsrgits/DBIx-Class-Journal.git] / lib / DBIx / Class / Schema / Journal.pm
CommitLineData
f0f14c64 1package DBIx::Class::Schema::Journal;
2
3use base qw/DBIx::Class/;
4
d27ed438 5use Scalar::Util 'blessed';
b5851590 6use DBIx::Class::Schema::Journal::DB;
d27ed438 7
8__PACKAGE__->mk_classdata('journal_storage_type');
9__PACKAGE__->mk_classdata('journal_connection');
aa873584 10__PACKAGE__->mk_classdata('journal_no_automatic_deploy');
f0f14c64 11__PACKAGE__->mk_classdata('journal_sources'); ## [ source names ]
12__PACKAGE__->mk_classdata('journal_user'); ## [ class, field for user id ]
ec16e73a 13__PACKAGE__->mk_classdata('_journal_schema'); ## schema object for journal
5fc8406c 14__PACKAGE__->mk_classdata('_journal_internal_sources'); # the sources used to journal journal_sources
f0f14c64 15
caea9531 16our $VERSION = '0.01';
17
ec16e73a 18use strict;
19use warnings;
f3602465 20
ec16e73a 21# sub throw_exception
22# {
23# }
24
25# sub exception_action
26# {
27# my $self = shift;
28# # print STDERR Carp::longmess;
f3602465 29
ec16e73a 30# $self->next::method(@_);
31# }
f3602465 32
d19af369 33# sub load_classes
34# {
35# my $class = shift;
36
37
38# $class->next::method(@_);
39
40# }
41
b5851590 42sub connection
f0f14c64 43{
44 my $self = shift;
52558dc4 45 my $schema = $self->next::method(@_);
f0f14c64 46
8092c4ed 47# print STDERR join(":", $self->sources), "\n";
a5222e78 48
d19af369 49 my $journal_schema;
50 if(!defined($self->journal_connection))
51 {
52 ## If no connection, use the same schema/storage etc as the user
53 DBIx::Class::Componentised->inject_base(ref $self, 'DBIx::Class::Schema::Journal::DB');
54 $journal_schema = $self;
55 }
56 else
d27ed438 57 {
d19af369 58 $journal_schema = DBIx::Class::Schema::Journal::DB->connect(@{ $self->journal_connection });
59 if($self->journal_storage_type)
60 {
61 $journal_schema->storage_type($self->journal_storage_type);
62 }
d27ed438 63 }
64
65 ## get our own private version of the journaling sources
a5222e78 66 $self->_journal_schema($journal_schema->compose_namespace(blessed($self) . '::Journal'));
f0f14c64 67
74f04ccc 68 ## Create auditlog+history per table
f5c237df 69 my %j_sources = map { $_ => 1 } $self->journal_sources
70 ? @{$self->journal_sources}
71 : $self->sources;
5fc8406c 72
73 my @journal_sources = $journal_schema->sources; # not sources to journal, but sources used by the journal internally
74
f0f14c64 75 foreach my $s_name ($self->sources)
76 {
77 next unless($j_sources{$s_name});
5fc8406c 78 push @journal_sources, $self->create_journal_for($s_name);
c5fba518 79 $self->class($s_name)->load_components('Journal');
a5222e78 80# print STDERR "$s_name :", $self->class($s_name), "\n";
f0f14c64 81 }
82
5fc8406c 83 $self->_journal_internal_sources(\@journal_sources);
51b16220 84
aa873584 85 $self->journal_schema_deploy()
86 unless $self->journal_no_automatic_deploy;
51b16220 87
f0f14c64 88 ## Set up relationship between changeset->user_id and this schema's user
51b16220 89 if(!@{$self->journal_user || []})
f0f14c64 90 {
91 warn "No Journal User set!";
51b16220 92 return $schema;
f0f14c64 93 }
94
c5fba518 95 $self->_journal_schema->class('ChangeSet')->belongs_to('user', @{$self->journal_user});
f4f0b7c9 96 $self->_journal_schema->storage->disconnect();
52558dc4 97
98 return $schema;
f0f14c64 99}
100
51b16220 101sub journal_schema_deploy
102{
5fc8406c 103 my ( $self, $sqlt_args, @args ) = @_;
104
105 $sqlt_args ||= {};
106 $sqlt_args->{sources} = $self->_journal_internal_sources
107 unless exists $sqlt_args->{sources};
108
109 $self->_journal_schema->deploy( $sqlt_args, @args );
51b16220 110}
111
f0f14c64 112sub get_audit_log_class_name
113{
114 my ($self, $sourcename) = @_;
115
d27ed438 116 return blessed($self->_journal_schema) . "::${sourcename}AuditLog";
f0f14c64 117}
118
119sub get_audit_history_class_name
120{
121 my ($self, $sourcename) = @_;
122
d27ed438 123 return blessed($self->_journal_schema) . "::${sourcename}AuditHistory";
f0f14c64 124}
125
126sub create_journal_for
127{
128 my ($self, $s_name) = @_;
129
130 my $source = $self->source($s_name);
131 my $newclass = $self->get_audit_log_class_name($s_name);
d27ed438 132 DBIx::Class::Componentised->inject_base($newclass, 'DBIx::Class::Schema::Journal::DB::AuditLog');
c5fba518 133 $newclass->table(lc($s_name) . "_audit_log");
5fc8406c 134 my $log_source = "${s_name}AuditLog";
135 $self->_journal_schema->register_class($log_source, $newclass);
f0f14c64 136
137
c5fba518 138 my $histclass = $self->get_audit_history_class_name($s_name);
d27ed438 139 DBIx::Class::Componentised->inject_base($histclass, 'DBIx::Class::Schema::Journal::DB::AuditHistory');
c5fba518 140 $histclass->table(lc($s_name) . "_audit_history");
141# $histclass->result_source_instance->name(lc($s_name) . "_audit_hisory");
f0f14c64 142 $histclass->add_columns(
f0f14c64 143 map { $_ => $source->column_info($_) } $source->columns
144 );
f0f14c64 145
5fc8406c 146 my $hist_source = "${s_name}AuditHistory";
147 $self->_journal_schema->register_class($hist_source, $histclass);
148
149 return ( $log_source, $hist_source );
f0f14c64 150}
151
f4f0b7c9 152sub txn_do
74f04ccc 153{
154 my ($self, $code) = @_;
155
156 ## Create a new changeset, then run $code as a transaction
f4f0b7c9 157 my $cs = $self->_journal_schema->resultset('ChangeSet');
8092c4ed 158
159 $self->txn_begin;
ec16e73a 160 my %changesetdata;
161 if( defined $self->_journal_schema->current_user() )
162 {
163 $changesetdata{user_id} = $self->_journal_schema->current_user();
164 }
165 if( defined $self->_journal_schema->current_session() )
166 {
167 $changesetdata{session_id} = $self->_journal_schema->current_session();
168 }
169
170# (
171# $self->_journal_schema->current_user()
172# ? ( user_id => $self->_journal_schema->current_user())
173# : (),
174# $self->_journal_schema->current_session()
175# ? ( session_id => $self->_journal_schema->current_session() )
176# : ()
177# );
52558dc4 178 if(!%changesetdata)
179 {
180 %changesetdata = ( ID => undef );
181 }
182 my $changeset = $cs->create({ %changesetdata });
f4f0b7c9 183 $self->_journal_schema->current_changeset($changeset->ID);
74f04ccc 184
f4f0b7c9 185 $self->next::method($code);
74f04ccc 186}
187
ec16e73a 188sub changeset_user
189{
190 my ($self, $userid) = @_;
191
192 return $self->_journal_schema->current_user() if(@_ == 1);
193
194 $self->_journal_schema->current_user($userid);
195}
196
197sub changeset_session
198{
199 my ($self, $sessionid) = @_;
200
201 return $self->_journal_schema->current_session() if(@_ == 1);
202
203 $self->_journal_schema->current_session($sessionid);
204}
205
206
f0f14c64 2071;