package Ġnet . lf n 3 . le th . jooq Ċ Ċ import Ġnet . lf n 3 . le th .* Ċ import Ġnet . lf n 3 . le th . jooq . tables . Logged Ċ import Ġnet . lf n 3 . le th . jooq . tables . records . Logged Record Ċ import Ġkotlin . test . Test Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠDatabase Back ed Log Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtable Descriptor Ġ= ĠLog Writer Mappings ( ĊĠĠĠĠĠĠĠ ĠLog ged . LOG GED , ĊĠĠĠĠĠĠĠ Ġ{ ĠPair ( it . value One , Ġit . value Two ) Ġ}, ĊĠĠĠĠĠĠĠ ĠLog ged . LOG GED . LOG _ ID , ĊĠĠĠĠĠĠĠ ĠSe quences . LOG GED _ SEQ , ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrec Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrec . value One Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrec . value Two Ġ= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrec ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠLog ged . LOG GED . ANCE STOR _ ID ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġmake Log () Ġ: ĠLog < Pair < Long , ĠLong >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠClean Database Back ed Log ( table Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠPlain Ġ: ĠLog Test ( this :: make Log ) ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠConcurrent Ġ: ĠConcurrent Log Test ( this :: make Log ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsee Ġdatabase Ġupdates Ġoutside Ġof Ġlog Ġin Ġhead `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġlog . head () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġhead !!. first ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 , Ġhead . second ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsee Ġdatabase Ġupdates Ġoutside Ġof Ġlog Ġin Ġtail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġcounter . increment AndGet () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Norm ally Ġyou 'd Ġhave Ġto Ġattach Ġa ĠThread Back ed Log Poller Ġto Ġmake Ġthis Ġhappen ĊĠĠĠĠĠĠĠ Ġlog . reader . check Database () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcounter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsee Ġdatabase Ġupdates Ġoutside Ġof Ġlog Ġin Ġwhen Ġadding Ġanother Ġrecord `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġcounter . increment AndGet () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . record ( Pair ( 8 , Ġ 9 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcounter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsee Ġdatabase Ġupdates Ġoutside Ġof Ġlog Ġin Ġwhen Ġbatch ing Ġin Ġanother Ġrecord `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġcounter . increment AndGet () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . batch Record ( listOf ( Pair ( 8 L , Ġ 9 L ))) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcounter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġsee Ġdatabase Ġupdates Ġoutside Ġof Ġlog Ġpushed Ġto Ġtail `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġcounter . increment AndGet () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Norm ally Ġyou 'd Ġhave Ġto Ġattach Ġa ĠThread Back ed Log Poller Ġto Ġmake Ġthis Ġhappen ĊĠĠĠĠĠĠĠ Ġlog . reader . check Database () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcounter . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Observer Ġthat Ġthrows Ġshould Ġnot Ġeffect Ġother Ġob servers Ġwhen Ġthere Ġis Ġa Ġmissed Ġupdate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlog Ġ= ĠClean Database Back ed Log ( table Descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠLog ged Record () ĊĠĠĠĠĠĠĠ Ġrecord . value One Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġrecord . value Two Ġ= Ġ 1 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġcounter Ġ= ĠAtomicInteger () ĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġthrow ĠIllegalStateException () Ġ} ĊĠĠĠĠĠĠĠ Ġlog . tail Ġ{ Ġcounter . increment AndGet () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . dsl Provider (). use Ġ{ Ġd sl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl . insert Into ( table Descriptor . table ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Norm ally Ġyou 'd Ġhave Ġto Ġattach Ġa ĠThread Back ed Log Poller Ġto Ġmake Ġthis Ġhappen ĊĠĠĠĠĠĠĠ Ġlog . reader . check Database () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcounter . get ()) ĊĠĠĠ Ġ} Ċ }