Skip to content

Commit

Permalink
More emitions. Related to #400
Browse files Browse the repository at this point in the history
  • Loading branch information
FCO committed Sep 24, 2019
1 parent ea977bf commit e3684dc
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 12 deletions.
41 changes: 33 additions & 8 deletions lib/MetamodelX/Red/Model.pm6
Expand Up @@ -48,11 +48,11 @@ has $.table;
has Bool $!temporary;

multi method emit(Mu $model, Red::Event $event) {
get-RED-DB.emit: $event.clone: :model($model.WHAT)
start try get-RED-DB.emit: $event.clone: :model($model.WHAT)
}

multi method emit(Mu $model, $data) {
get-RED-DB.emit: Red::Event.new: :model($model.WHAT), :$data
multi method emit(Mu $model, $data, Exception :$error, Red::Model :$origin) {
self.emit: $model, Red::Event.new: :model($model.WHAT), |(:$data with $data), |(:$error with $error)
}

#| Returns a list of columns names.of the model.
Expand Down Expand Up @@ -275,10 +275,10 @@ multi method create-table(\model) {
|(:comment(Red::AST::TableComment.new: :msg(.Str), :table(model.^table)) with model.WHY)
;
get-RED-DB.execute: |$data;
self.emit: model, Red::Event.new: :$data;
self.emit: model, $data;
CATCH {
default {
self.emit: model, Red::Event.new: :$data, :error($_);
self.emit: model, $data, :error($_);
proceed
}
}
Expand All @@ -295,22 +295,38 @@ method apply-row-phasers($obj, Mu:U $phase) {
#| Saves that object on database (create a new row)
multi method save($obj, Bool :$insert! where * == True, Bool :$from-create) {
self.apply-row-phasers($obj, BeforeCreate) unless $from-create;
my $ret := get-RED-DB.execute: Red::AST::Insert.new: $obj;
my $ast = Red::AST::Insert.new: $obj;
my $ret := get-RED-DB.execute: $ast;
$obj.^saved-on-db;
$obj.^clean-up;
$obj.^populate-ids;
self.apply-row-phasers($obj, AfterCreate) unless $from-create;
self.emit: $obj, $ast;
CATCH {
default {
self.emit: $obj, $ast, :error($_);
proceed
}
}
$ret
}

#| Saves that object on database (update the row)
multi method save($obj, Bool :$update! where * == True) {
self.apply-row-phasers($obj, BeforeUpdate);
my $ret := get-RED-DB.execute: Red::AST::Update.new: $obj;
my $ast = Red::AST::Update.new: $obj;
my $ret := get-RED-DB.execute: $ast;
$obj.^saved-on-db;
$obj.^clean-up;
$obj.^populate-ids;
self.apply-row-phasers($obj, AfterUpdate);
self.emit: $obj, $ast;
CATCH {
default {
self.emit: $obj, $ast, :error($_);
proceed
}
}
$ret
}

Expand Down Expand Up @@ -386,8 +402,17 @@ method create(\model, *%orig-pars) is rw {

#| Deletes row from database
method delete(\model) {
my $origin = model.clone;
self.apply-row-phasers(model, BeforeDelete);
get-RED-DB.execute: Red::AST::Delete.new: model ;
my $ast = Red::AST::Delete.new: model;
get-RED-DB.execute: $ast;
self.emit: model, $ast, :$origin;
CATCH {
default {
self.emit: model, $ast, :$origin, :error($_);
proceed
}
}
self.apply-row-phasers(model, AfterDelete);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/Red/Do.pm6
Expand Up @@ -79,7 +79,7 @@ sub red-emit(Str() $name, $data) is export {
}

sub red-tap(Str() $name, &func, :$red-db = $*RED-DB) is export {
Red::Class.instance.events.grep({ .name eq $name }).tap: -> Red::Event $_ {
Red::Class.instance.events.grep({ $_ eq $name with .name }).tap: -> Red::Event $_ {
my $*RED-DB = $red-db;
func .data
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Red/Driver.pm6
Expand Up @@ -18,7 +18,7 @@ method auto-register(|) {
}

multi method emit($data) {
$!supplier.emit: Red::Event.new: :db(self), :db-name(self.^name), :$data
self.emit: Red::Event.new: :db(self), :db-name(self.^name), :$data
}

multi method emit(Red::Event $event) {
Expand Down
1 change: 1 addition & 0 deletions lib/Red/Event.pm6
Expand Up @@ -6,6 +6,7 @@ has Str $.db-name;
has Str $.driver-name;
has Str $.name;
has $.data;
has @.bind;
has Red::Model:U $.model;
has Red::Model $.origin;
has Exception $.error;
9 changes: 8 additions & 1 deletion lib/Red/ResultSeq/Iterator.pm6
Expand Up @@ -14,7 +14,14 @@ submethod TWEAK(|) {
my @st-handler = $!driver.prepare: $ast;

@st-handler>>.execute unless $*RED-DRY-RUN;
$!st-handler = @st-handler.tail
$!st-handler = @st-handler.tail;
$!of.^emit: $ast;
CATCH {
default {
$!of.^emit: $ast, :error($_);
proceed
}
}
}

#method is-lazy { True }
Expand Down
1 change: 0 additions & 1 deletion t/04-blog.t
Expand Up @@ -54,7 +54,6 @@ lives-ok { $post2 = $p.posts.create: :title("Another commit"), :body("Blablabla"
is $post2.author-id, $p.id;
is $post2.title, "Another commit";
is $post2.body, "Blablabla";
todo "NYI: use the custom inflator creating the user";
ok $post2.tags ~~ set <bla ble>;

lives-ok { $post.^delete }
Expand Down

0 comments on commit e3684dc

Please sign in to comment.