@@ -81,9 +81,9 @@ class DatabaseConfigurationTest : BaseDatabaseTest(){
8181 }))
8282
8383 val conn = manager.surpriseMeConnection()
84- println ( " tr 0 " )
84+
8585 assertEquals(conn.journalMode, JournalMode .WAL )
86- println ( " tr 1 " )
86+
8787 println (" Update journal to DELETE result ${conn.updateJournalMode(JournalMode .DELETE )} " )
8888 assertEquals(conn.journalMode, JournalMode .DELETE )
8989 println (" Update journal to WAL result ${conn.updateJournalMode(JournalMode .WAL )} " )
@@ -109,5 +109,73 @@ class DatabaseConfigurationTest : BaseDatabaseTest(){
109109 conn2.close()
110110 }
111111
112+ @Test
113+ fun foreignKeyConstraintsSetting (){
114+ runFkTest(" fkoff" , false )
115+ runFkTest(" fkon" , true )
116+ }
117+
118+ private fun runFkTest (dbname : String , enableFK : Boolean ){
119+ var bookId = 1
120+ fun makeBookWithoutTransaction (conn : DatabaseConnection ) =
121+ conn.withStatement(" insert into book(id, name, author_id)values(${bookId++ } , 'Hello Book', 5)" ) { executeInsert() }
122+
123+ fun makeBook (conn : DatabaseConnection ) {
124+ conn.withTransaction { conn ->
125+ makeBookWithoutTransaction(conn)
126+ }
127+ }
128+ fun checkAB (conn : DatabaseConnection , expectBooks : Int , expectAuthors : Int ){
129+ val books = conn.longForQuery(" select count(*) from book" ).toInt()
130+ val authors = conn.longForQuery(" select count(*) from author" ).toInt()
131+
132+ assertEquals(expectBooks, books)
133+ assertEquals(expectAuthors, authors)
134+ }
135+
136+ val manager = createDatabaseManager(DatabaseConfiguration (
137+ name = dbname,
138+ version = 1 ,
139+ journalMode = JournalMode .WAL ,
140+ foreignKeyConstraints = enableFK,
141+ create = { db ->
142+ db.withStatement(AUTHOR ) {
143+ execute()
144+ }
145+ db.withStatement(BOOK ) {
146+ execute()
147+ }
148+ }))
149+
150+ val conn = manager.createMultiThreadedConnection()
151+
152+ try {
153+ checkAB(conn, 0 , 0 )
154+
155+ if (enableFK){
156+ assertFails { makeBook(conn) }
157+ assertFails { makeBookWithoutTransaction(conn) }
158+ checkAB(conn, 0 , 0 )
159+ }else {
160+ makeBook(conn)
161+ makeBookWithoutTransaction(conn)
162+ checkAB(conn, 2 , 0 )
163+ }
164+ } finally {
165+ conn.close()
166+ DatabaseFileContext .deleteDatabase(dbname)
167+ }
168+ }
112169
170+ private val AUTHOR = """ CREATE TABLE author (
171+ id INTEGER NOT NULL PRIMARY KEY,
172+ name TEXT NOT NULL
173+ );"""
174+
175+ private val BOOK = """ CREATE TABLE book (
176+ id INTEGER NOT NULL PRIMARY KEY,
177+ name TEXT NOT NULL,
178+ author_id INTEGER NOT NULL,
179+ FOREIGN KEY (author_id) REFERENCES author(id) ON DELETE CASCADE
180+ );"""
113181}
0 commit comments