/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġe Al va . com Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . e al va . w elite . test . db . trigger Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġcom . e al va . w elite . db . Transaction Ċ import Ġcom . e al va . w elite . db . expr . Expression Ċ import Ġcom . e al va . w elite . db . expr . case Ċ import Ġcom . e al va . w elite . db . expr . eq Ċ import Ġcom . e al va . w elite . db . expr . escape Ċ import Ġcom . e al va . w elite . db . expr . literal Ċ import Ġcom . e al va . w elite . db . expr . neq Ċ import Ġcom . e al va . w elite . db . expr . not Like Ċ import Ġcom . e al va . w elite . db . expr . raise Abort Ċ import Ġcom . e al va . w elite . db . table . On Conflict Ċ import Ġcom . e al va . w elite . db . table . as Expression Ċ import Ġcom . e al va . w elite . db . table . select Ċ import Ġcom . e al va . w elite . db . table . selectAll Ċ import Ġcom . e al va . w elite . db . table . select Count Ċ import Ġcom . e al va . w elite . db . table . where Ċ import Ġcom . e al va . w elite . db . trigger . Trigger Ċ import Ġcom . e al va . w elite . db . trigger . delete Trigger Ċ import Ġcom . e al va . w elite . db . trigger . insert Trigger Ċ import Ġcom . e al va . w elite . db . trigger . update Trigger Ċ import Ġcom . e al va . w elite . db . type . as Identity Ċ import Ġcom . e al va . w elite . test . shared . Album Table Ċ import Ġcom . e al va . w elite . test . shared . Artist Album Table Ċ import Ġcom . e al va . w elite . test . shared . Artist Table Ċ import Ġcom . e al va . w elite . test . shared . MEDIA _ TABLE S Ċ import Ġcom . e al va . w elite . test . shared . Media File Table Ċ import Ġcom . e al va . w elite . test . shared . Sql Executor Spy Ċ import Ġcom . e al va . w elite . test . shared . with Test Database Ċ import Ġcom . n ha ar man . expect . expect Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġjava . io . File Ċ Ċ public Ġtype alias ĠId Triple Ġ= ĠTrip le < Long , ĠLong , ĠLong > Ċ Ċ public Ġval ĠId Triple . artist Id : ĠLong ĊĠ Ġget () Ġ= Ġfirst Ċ Ċ public Ġval ĠId Triple . album Id : ĠLong ĊĠ Ġget () Ġ= Ġsecond Ċ Ċ public Ġval ĠId Triple . media Id : ĠLong ĊĠ Ġget () Ġ= Ġthird Ċ Ċ public Ġobject ĠCommon Trigger Tests Ġ{ ĊĠ Ġpublic Ġfun Ġtest Create Trigger () Ġ{ ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ ĠDelete Artist Trigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠDelete Artist Trigger ĠBE FORE ĠDELETE ĠON ĠArtist ĠBEGIN " Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" ĠDELETE ĠFROM ĠArtist Album ĠWHERE ĠArtist Album . Artist Id Ġ= ĠO LD ._ id ; ĠEND ;" ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ ĠDelete Album Trigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠDelete Album Trigger ĠBE FORE ĠDELETE ĠON ĠAlbum ĠBEGIN " Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" ĠDELETE ĠFROM ĠArtist Album ĠWHERE ĠArtist Album . Album Id Ġ= ĠO LD ._ id ; ĠEND ;" ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ ĠInsert Media Trigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠINSERT ĠON ĠMedia File Ġ""" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" BEGIN ĠSELECT ĠCASE ĠWHEN ĠNEW . Media Uri ĠNOT ĠLIKE Ġ' file :% ' ĠTHEN ĠR AI SE ( ABORT , Ġ""" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ' Abort , Ġnot ĠURI ') ĠEND ; ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ ĠDelete Media Trigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠDelete Media Trigger ĠAFTER ĠDELETE ĠON ĠMedia File ĠBEGIN Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" DELETE ĠFROM ĠAlbum ĠWHERE Ġ( SELECT ĠCOUNT (*) ĠFROM ĠMedia File ĠWHERE Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" Media File . Album Id Ġ= ĠO LD . Album Id ) Ġ= Ġ 0 ; ĠDELETE ĠFROM ĠArtist ĠWHERE Ġ( SELECT Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ" COUNT (*) ĠFROM ĠMedia File ĠWHERE ĠMedia File . Artist Id Ġ= ĠO LD . Artist Id ) Ġ= Ġ 0 ; ĠEND ;" ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Drop Trigger () Ġ{ ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ ĠDelete Artist Trigger . drop ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe (" DROP ĠTR IG GER ĠIF ĠEXISTS ĠDelete Artist Trigger ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Exec Delete Artist Trigger ( ĊĠĠĠ Ġapp Ctx : ĠContext , ĊĠĠĠ Ġtest Dispatcher : ĠCor outine Dispatcher ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwith Test Database ( ĊĠĠĠĠĠ Ġcontext Ġ= Ġapp Ctx , ĊĠĠĠĠĠ Ġtables Ġ= ĠMED IA _ TABLE S , ĊĠĠĠĠĠ Ġtest Dispatcher Ġ= Ġtest Dispatcher , ĊĠĠĠĠĠ Ġenable ForeignKey Constraints Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete Artist Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Artist Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . delete Ġ{ Ġartist Name Ġeq Ġ" Led ĠZe ppelin " Ġ}). toBe ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Exec Delete Album Trigger ( ĊĠĠĠ Ġapp Ctx : ĠContext , ĊĠĠĠ Ġtest Dispatcher : ĠCor outine Dispatcher ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwith Test Database ( app Ctx , ĠMED IA _ TABLE S , Ġtest Dispatcher , Ġenable ForeignKey Constraints Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete Album Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Album Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Album Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . delete Ġ{ Ġalbum Name Ġeq Ġ" House s Ġof Ġthe ĠH oly " Ġ}). toBe ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Insert Trigger Valid Uri ( ĊĠĠĠ Ġapp Ctx : ĠContext , ĊĠĠĠ Ġtest Dispatcher : ĠCor outine Dispatcher ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwith Test Database ( app Ctx , ĠMED IA _ TABLE S , Ġtest Dispatcher ) Ġ{ ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠInsert Media Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Insert Media Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Insert Trigger Invalid Uri Cause s Abort ( ĊĠĠĠ Ġapp Ctx : ĠContext , ĊĠĠĠ Ġtest Dispatcher : ĠCor outine Dispatcher ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwith Test Database ( app Ctx , ĠMED IA _ TABLE S , Ġtest Dispatcher ) Ġ{ ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠInsert Media Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Insert Media Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Insert Media Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġinsert Data (" An ĠArtist ", Ġ" An ĠAlbum ", Ġ" Song ĠTitle ", ĠUri . EMPTY ) Ġ// ĠUri . EMPTY Ġshould Ġabort ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Delete Media Trigger ( app Ctx : ĠContext , Ġtest Dispatcher : ĠCor outine Dispatcher ) Ġ{ ĊĠĠĠ Ġwith Test Database ( app Ctx , ĠMED IA _ TABLE S , Ġtest Dispatcher , Ġenable ForeignKey Constraints Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġids : ĠId Triple ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete Media Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġids Ġ= Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Media Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Id Ġ= ĠcheckNotNull ( ids ). media Id ĊĠĠĠĠĠĠĠ ĠMedia File Table . delete Ġ{ Ġid Ġeq Ġmedia Id Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġsuspend Ġfun Ġtest Delete Media And Triggers Cascade ( ĊĠĠĠ Ġapp Ctx : ĠContext , ĊĠĠĠ Ġtest Dispatcher : ĠCor outine Dispatcher ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġwith Test Database ( app Ctx , ĠMED IA _ TABLE S , Ġtest Dispatcher ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġids : ĠId Triple ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠDelete Album Trigger . create () ĊĠĠĠĠĠĠĠ ĠDelete Artist Trigger . create () ĊĠĠĠĠĠĠĠ ĠDelete Media Trigger . create () ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . from File ( File (""" / Music / Song . mp 3 "" ")) ĊĠĠĠĠĠĠĠ Ġids Ġ= Ġinsert Data (" Led ĠZe ppelin ", Ġ" House s Ġof Ġthe ĠH oly ", Ġ" Dy ' er ĠM ak ' er ", Ġuri ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Album Table . selectAll (). count ()). toBe ( 1 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Media Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Album Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠĠĠ Ġexpect ( Delete Artist Trigger . exists ). toBe ( true ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Id Ġ= ĠcheckNotNull ( ids ). media Id ĊĠĠĠĠĠĠĠ ĠMedia File Table . delete Ġ{ Ġid Ġeq Ġmedia Id Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġquery Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( Artist Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠĠĠ Ġexpect ( Album Table . selectAll (). count ()). toBe ( 0 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest New Column For Delete Event Is Invalid () Ġ{ ĊĠĠĠ ĠMedia File Table . delete Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Bad Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġselect ( ĊĠĠĠĠĠĠĠ Ġcase (). case When ( ĊĠĠĠĠĠĠĠĠĠ Ġnew ( Media File Table . media Uri ) Ġnot Like Ġ" file :% ", Ġ// Ġwill Ġthrow ĊĠĠĠĠĠĠĠĠĠ Ġraise Abort (" Abort , Ġnot ĠURI ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest New Reject s Column With Wrong Table () Ġ{ ĊĠĠĠ ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Bad Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġnew ( Album Table . id ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Old Reject s Column With Wrong Table () Ġ{ ĊĠĠĠ ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Bad Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġold ( Album Table . id ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Old Column For Insert Event Is Invalid () Ġ{ ĊĠĠĠ ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Bad Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġselect ( ĊĠĠĠĠĠĠĠ Ġcase (). case When ( ĊĠĠĠĠĠĠĠĠĠ Ġold ( Media File Table . media Uri ) Ġnot Like Ġ" file :% ", Ġ// Ġwill Ġthrow ĊĠĠĠĠĠĠĠĠĠ Ġraise Abort (" Abort , Ġnot ĠURI ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Insert On Insert Event () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠINSERT ĠON ĠMedia File ĠBEGIN """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠINSERT ĠINTO ĠAlbum Ġ( Album Name ) ĠVALUES Ġ(' Some ĠAlbum '); ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Update On Insert Trigger () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . update Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ}. where Ġ{ Ġnew ( Media File Table . media Uri ) Ġnot Like Ġ" file :% " Ġescape Ġ'\\ ' Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠINSERT ĠON ĠMedia File ĠBEGIN """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠUPDATE ĠAlbum ĠSET ĠAlbum Name =' Some ĠAlbum ' ĠWHERE ĠNEW . Media Uri ĠNOT ĠLIKE Ġ' file :% ' """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠESC APE Ġ'\ '; ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Old And New Column Identity () Ġ{ ĊĠĠĠ ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Bad Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . AFTER , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġstatement Ġis Ġrequired , Ġdoesn 't Ġmatter Ġwhat Ġfor Ġthis Ġtest ĊĠĠĠĠĠ Ġselect ( ĊĠĠĠĠĠĠĠ Ġcase (). case When ( ĊĠĠĠĠĠĠĠĠĠ Ġnew ( Media File Table . media Uri ) Ġnot Like Ġ" file :% ", Ġ// Ġmust Ġstart Ġwith Ġ" file :" ĊĠĠĠĠĠĠĠĠĠ Ġraise Abort (" Abort , Ġnot ĠURI ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġval Ġold Col Ġ= Ġold ( Media File Table . media Uri ) ĊĠĠĠĠĠ Ġval Ġnew Col Ġ= Ġnew ( Media File Table . album Id ) ĊĠĠĠĠĠ Ġexpect ( old Col . identity ()). toBe (" OLD . Media Uri ". as Identity ()) ĊĠĠĠĠĠ Ġexpect ( new Col . identity ()). toBe (" NEW . Album Id ". as Identity ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Temp Trigger () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtemporary Ġ= Ġtrue , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTEMP ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠINSERT ĠON ĠMedia File """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠBEGIN ĠINSERT ĠINTO ĠAlbum Ġ( Album Name ) ĠVALUES Ġ(' Some ĠAlbum '); ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Update Trigger When Condition () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtemporary Ġ= Ġtrue , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġold ( table . id ) Ġne q Ġnew ( table . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTEMP ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠUPDATE ĠON """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠMedia File ĠWHEN ĠO LD ._ id Ġ<> ĠNEW ._ id ĠBEGIN ĠINSERT ĠINTO ĠAlbum Ġ( Album Name ) """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠVALUES Ġ(' Some ĠAlbum '); ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Insert Trigger When Condition () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġnew ( table . id ) Ġne q Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġselect ( ĊĠĠĠĠĠĠĠ Ġcase (). case When ( ĊĠĠĠĠĠĠĠĠĠ Ġnew ( Media File Table . media Uri ) Ġnot Like Ġ" file :% ", Ġ// Ġmust Ġstart Ġwith Ġ" file :" ĊĠĠĠĠĠĠĠĠĠ Ġraise Abort (" Abort , Ġnot ĠURI ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠINSERT ĠON ĠMedia File ĠWHEN ĠNEW ._ id Ġ<> Ġ 1 ĠBEGIN ĠSELECT ĠCASE ĠWHEN ĠNEW . Media Uri ĠNOT """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠLIKE Ġ' file :% ' ĠTHEN ĠR AI SE ( ABORT , Ġ' Abort , Ġnot ĠURI ') ĠEND ; ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Delete Trigger When Condition () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠAlbum Table . delete Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Delete Album Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġold ( table . id ) Ġne q Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠArtist Album Table . delete Ġ{ ĠArtist Album Table . album Id Ġeq Ġold ( Album Table . id ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠDelete Album Trigger ĠBE FORE ĠDELETE ĠON ĠAlbum ĠWHEN """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠO LD ._ id Ġ<> Ġ 1 ĠBEGIN ĠDELETE ĠFROM ĠArtist Album ĠWHERE ĠArtist Album . Album Id Ġ= """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠO LD ._ id ; ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Trigger Condition New Reject s Column With Wrong Table () Ġ{ ĊĠĠĠ ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġold ( table . id ) Ġne q Ġnew ( Artist Table . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Trigger Condition Old Reject s Column With Wrong Table () Ġ{ ĊĠĠĠ ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġold ( Artist Table . id ) Ġne q Ġnew ( table . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest When Condition New Column For Delete Event Is Invalid () Ġ{ ĊĠĠĠ ĠMedia File Table . delete Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġnew ( table . id ) Ġne q Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest When Condition Old Column For Insert Event Is Invalid () Ġ{ ĊĠĠĠ ĠMedia File Table . insert Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġold ( Artist Table . id ) Ġne q Ġ 1 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Binding Arg In Trigger Rejected () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġtemporary Ġ= Ġtrue , ĊĠĠĠĠĠ Ġtrigger Condition Ġ= Ġ{ Ġtable Ġ-> ĊĠĠĠĠĠĠĠ Ġold ( table . id ) Ġne q Ġnew ( table . id ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ]. bind Arg () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġtrigger . create ( Sql Executor Spy ()) ĊĠ Ġ} ĊĊĠ Ġpublic Ġfun Ġtest Update Columns Trigger () Ġ{ ĊĠĠĠ Ġval Ġtrigger Ġ= ĠMedia File Table . update Trigger ( ĊĠĠĠĠĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠĠĠĠĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , ĊĠĠĠĠĠ Ġupdate Columns Ġ= ĠlistOf ( Media File Table . media Title , ĠMedia File Table . media Uri ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġ" Some ĠAlbum " ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSql Executor Spy (). let Ġ{ Ġspy Ġ-> ĊĠĠĠĠĠ Ġtrigger . create ( spy ) ĊĠĠĠĠĠ Ġval Ġexec SqlList Ġ= Ġspy . exec SqlList ĊĠĠĠĠĠ Ġexpect ( exec SqlList ). toHave Size ( 1 ) ĊĠĠĠĠĠ Ġexpect ( exec SqlList [ 0 ]). toBe ( ĊĠĠĠĠĠĠĠ Ġ""" CREATE ĠTR IG GER ĠIF ĠNOT ĠEXISTS ĠInsert Media Trigger ĠBE FORE ĠUPDATE ĠOF ĠMedia Title , """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" ĠMedia Uri ĠON ĠMedia File ĠBEGIN ĠINSERT ĠINTO ĠAlbum Ġ( Album Name ) ĠVALUES """ Ġ+ ĊĠĠĠĠĠĠĠĠĠ Ġ""" Ġ(' Some ĠAlbum '); ĠEND ; """ ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠTransaction . insert Data ( ĊĠĠĠ Ġartist : ĠString , ĊĠĠĠ Ġalbum : ĠString , ĊĠĠĠ Ġtitle : ĠString , ĊĠĠĠ Ġuri : ĠUri ĊĠ Ġ): ĠTrip le < Long , ĠLong , ĠLong > Ġ{ ĊĠĠĠ Ġval Ġid Artist : ĠLong Ġ= ĠArtist Table . select Ġ{ Ġid Ġ} ĊĠĠĠĠĠ Ġ. where Ġ{ Ġartist Name Ġeq Ġartist Ġ} ĊĠĠĠĠĠ Ġ. sequence Ġ{ Ġit [ id ] Ġ} ĊĠĠĠĠĠ Ġ. single OrNull () Ġ?: ĠArtist Table . insert Ġ{ Ġit [ artist Name ] Ġ= Ġartist Ġ} ĊĊĠĠĠ Ġval Ġid Album : ĠLong Ġ= ĠAlbum Table . select Ġ{ Ġid Ġ} ĊĠĠĠĠĠ Ġ. where Ġ{ Ġalbum Name Ġeq Ġalbum Ġ} ĊĠĠĠĠĠ Ġ. sequence Ġ{ Ġit [ id ] Ġ} ĊĠĠĠĠĠ Ġ. single OrNull () Ġ?: ĠAlbum Table . insert Ġ{ ĊĠĠĠĠĠ Ġit [ album Name ] Ġ= Ġalbum ĊĠĠĠĠĠ Ġit [ artist Name ] Ġ= Ġartist ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠArtist Album Table . insert ( On Conflict . Ignore ) Ġ{ ĊĠĠĠĠĠ Ġit [ artist Id ] Ġ= Ġid Artist ĊĠĠĠĠĠ Ġit [ album Id ] Ġ= Ġid Album ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmedia Id Ġ= ĠMedia File Table . insert Ġ{ ĊĠĠĠĠĠ Ġit [ media Title ] Ġ= Ġtitle ĊĠĠĠĠĠ Ġit [ media Uri ] Ġ= Ġuri . toString () ĊĠĠĠĠĠ Ġit [ artist Id ] Ġ= Ġid Artist ĊĠĠĠĠĠ Ġit [ album Id ] Ġ= Ġid Album ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠTrip le ( id Artist , Ġid Album , Ġmedia Id ) ĊĠ Ġ} Ċ } Ċ Ċ public Ġval ĠDelete Artist Trigger : ĠTrigger < Artist Table > Ġ= ĠArtist Table . delete Trigger ( ĊĠ Ġname Ġ= Ġ" Delete Artist Trigger ", ĊĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , Ċ ) Ġ{ ĊĠ ĠArtist Album Table . delete Ġ{ ĠArtist Album Table . artist Id Ġeq Ġold ( Artist Table . id ) Ġ} Ċ } Ċ Ċ public Ġval ĠDelete Album Trigger : ĠTrigger < Album Table > Ġ= ĠAlbum Table . delete Trigger ( ĊĠ Ġname Ġ= Ġ" Delete Album Trigger ", ĊĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , Ċ ) Ġ{ ĊĠ ĠArtist Album Table . delete Ġ{ ĠArtist Album Table . album Id Ġeq Ġold ( Album Table . id ) Ġ} Ċ } Ċ Ċ public Ġval ĠInsert Media Trigger : ĠTrigger < Media File Table > Ġ= ĠMedia File Table . insert Trigger ( ĊĠ Ġname Ġ= Ġ" Insert Media Trigger ", ĊĠ Ġbefore After Ġ= ĠTrigger . Before After . BEFORE , Ċ ) Ġ{ ĊĠ Ġselect ( ĊĠĠĠ Ġcase (). case When ( ĊĠĠĠĠĠ Ġnew ( Media File Table . media Uri ) Ġnot Like Ġ" file :% ", Ġ// Ġmust Ġstart Ġwith Ġ" file :" ĊĠĠĠĠĠ Ġraise Abort (" Abort , Ġnot ĠURI ") ĊĠĠĠ Ġ) ĊĠ Ġ) Ċ } Ċ Ċ public Ġval ĠDelete Media Trigger : ĠTrigger < Media File Table > Ġ= ĠMedia File Table . delete Trigger ( ĊĠ Ġname Ġ= Ġ" Delete Media Trigger ", ĊĠ Ġbefore After Ġ= ĠTrigger . Before After . AFTER , Ċ ) Ġ{ ĊĠ Ġval Ġmedia Album Count : ĠExpression < Long > Ġ= ĊĠĠĠ Ġ( Media File Table . select Count Ġ{ Ġalbum Id Ġeq Ġold ( album Id ) Ġ}) ĊĠĠĠĠĠ Ġ. as Expression () ĊĊĠ ĠAlbum Table . delete Ġ{ Ġmedia Album Count Ġeq Ġliteral ( 0 ) Ġ} ĊĊĠ Ġval Ġmedia Artist Count : ĠExpression < Long > Ġ= ĊĠĠĠ Ġ( Media File Table . select Count Ġ{ Ġartist Id Ġeq Ġold ( artist Id ) Ġ}) ĊĠĠĠĠĠ Ġ. as Expression () ĊĊĠ ĠArtist Table . delete Ġ{ Ġmedia Artist Count Ġeq Ġliteral ( 0 ) Ġ} Ċ } Ċ