diff --git a/lib/MetamodelX/Red/Model.pm6 b/lib/MetamodelX/Red/Model.pm6 index b8868ece..38746312 100644 --- a/lib/MetamodelX/Red/Model.pm6 +++ b/lib/MetamodelX/Red/Model.pm6 @@ -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. @@ -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 } } @@ -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 } @@ -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); } diff --git a/lib/Red/Do.pm6 b/lib/Red/Do.pm6 index c9a16dc4..e1d1f7d7 100644 --- a/lib/Red/Do.pm6 +++ b/lib/Red/Do.pm6 @@ -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 } diff --git a/lib/Red/Driver.pm6 b/lib/Red/Driver.pm6 index 31af50ef..651991a8 100644 --- a/lib/Red/Driver.pm6 +++ b/lib/Red/Driver.pm6 @@ -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) { diff --git a/lib/Red/Event.pm6 b/lib/Red/Event.pm6 index 545bbbf6..75ea83e6 100644 --- a/lib/Red/Event.pm6 +++ b/lib/Red/Event.pm6 @@ -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; \ No newline at end of file diff --git a/lib/Red/ResultSeq/Iterator.pm6 b/lib/Red/ResultSeq/Iterator.pm6 index 70f18dfe..217983cc 100644 --- a/lib/Red/ResultSeq/Iterator.pm6 +++ b/lib/Red/ResultSeq/Iterator.pm6 @@ -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 } diff --git a/t/04-blog.t b/t/04-blog.t index f91a3ca9..9ce22dd9 100755 --- a/t/04-blog.t +++ b/t/04-blog.t @@ -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 ; lives-ok { $post.^delete }