SQLiteOpenHelperWriter.kt revision a64756a18111a7312b3fa03b76d13381a8907176
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2016 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.support.room.writer
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
19495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport android.support.annotation.VisibleForTesting
20495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport com.android.support.room.ext.L
21495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport com.android.support.room.ext.N
228f573952b8729b4319043ae0908997ecd2d68951Dianne Hackbornimport com.android.support.room.ext.RoomTypeNames
23629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport com.android.support.room.ext.S
24629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport com.android.support.room.ext.SupportDbTypeNames
25495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport com.android.support.room.ext.T
2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport com.android.support.room.solver.CodeGenScope
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport com.android.support.room.vo.Database
28495f2892288504f4ab87e62957b3f71144dd73c2Adam Powellimport com.android.support.room.vo.Entity
295c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guyimport com.squareup.javapoet.MethodSpec
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport com.squareup.javapoet.ParameterSpec
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport com.squareup.javapoet.TypeName
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport com.squareup.javapoet.TypeSpec
33f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Projectimport javax.lang.model.element.Modifier.PROTECTED
345c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guyimport javax.lang.model.element.Modifier.PUBLIC
35956091ba7863bd72086275e61084864994dd6fa7Joe Onorato
36080d9b614e609826dce2606f9e474af674ead933Joe Onorato/**
37495f2892288504f4ab87e62957b3f71144dd73c2Adam Powell * Create an open helper using SupportSQLiteOpenHelperFactory
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectclass SQLiteOpenHelperWriter(val database : Database) {
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    fun write(outVar : String, configuration : ParameterSpec, scope: CodeGenScope) {
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        scope.builder().apply {
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            val sqliteConfigVar = scope.getTmpVar("_sqliteConfig")
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            val callbackVar = scope.getTmpVar("_openCallback")
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addStatement("final $T $L = new $T($N, $L, $S)",
452762dd856ef95b3c5cb1f554fb733e15b1eb2a9cAdam Powell                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CALLBACK,
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    callbackVar, RoomTypeNames.OPEN_HELPER, configuration, createOpenCallback(),
47f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project                    database.identityHash)
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            // build configuration
49edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy            addStatement(
50edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy                    """
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    final $T $L = $T.builder($N.context)
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    .name($N.name)
5331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    .version($L)
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    .callback($L)
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    .build()
5685a02a8d13eced310aee4c2a795e9c9c5435038fJoe Onorato                    """.trimIndent(),
57e47f55c30b9c24f01f2be861247c92f17fbe4a61Romain Guy                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CONFIG, sqliteConfigVar,
583a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CONFIG,
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    configuration, configuration, database.version, callbackVar)
6070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey            addStatement("final $T $N = $N.sqliteOpenHelperFactory.create($L)",
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    SupportDbTypeNames.SQLITE_OPEN_HELPER, outVar,
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project                    configuration, sqliteConfigVar)
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
64a588b878b91ee817e3c78411ab0e08e2342acbd8Adam Powell    }
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
668f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn    private fun createOpenCallback() : TypeSpec {
678f573952b8729b4319043ae0908997ecd2d68951Dianne Hackborn        return TypeSpec.anonymousClassBuilder("").apply {
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            superclass(RoomTypeNames.OPEN_HELPER_DELEGATE)
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addMethod(createCreateAllTables())
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addMethod(createDropAllTables())
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addMethod(createOnOpen())
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addMethod(createValidateMigration())
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }.build()
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private fun createValidateMigration(): MethodSpec {
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return MethodSpec.methodBuilder("validateMigration").apply {
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addModifiers(PROTECTED)
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            returns(TypeName.BOOLEAN)
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addParameter(SupportDbTypeNames.DB, "_db")
8170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey            addStatement("return true")
8270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey        }.build()
8370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey    }
8470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey
8570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey    private fun createOnOpen(): MethodSpec {
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return MethodSpec.methodBuilder("onOpen").apply {
8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addModifiers(PUBLIC)
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addParameter(SupportDbTypeNames.DB, "_db")
89f8bbd34d7d4705b49db202be92b920196bc7ea38Mike Cleron            addStatement("mDatabase = _db")
9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addStatement("internalInitInvalidationTracker(_db)")
9131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }.build()
9231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
9331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private fun createCreateAllTables() : MethodSpec {
9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return MethodSpec.methodBuilder("createAllTables").apply {
9631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addModifiers(PUBLIC)
9731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addParameter(SupportDbTypeNames.DB, "_db")
980589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            database.bundle.buildCreateQueries().forEach {
9900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato                addStatement("_db.execSQL($S)", it)
10070864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey            }
10170864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey        }.build()
10270864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey    }
10370864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey
10470864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey    private fun createDropAllTables() : MethodSpec {
10570864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey        return MethodSpec.methodBuilder("dropAllTables").apply {
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            addModifiers(PUBLIC)
10770864289fba6daf07b8de98524cdfb765a62552dJeff Sharkey            addParameter(SupportDbTypeNames.DB, "_db")
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            database.entities.forEach {
109a9c28f6f97a4b34d9527c786e3aa8f02d92d9e07Joe Onorato                addStatement("_db.execSQL($S)", createDropTableQuery(it))
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            }
11131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }.build()
112a206daaed1318005d1534cca2e4eeec56144d104Romain Guy    }
1133499d4aac4333e9dc33fe4d09bb261574a633e91Adam Powell
1143499d4aac4333e9dc33fe4d09bb261574a633e91Adam Powell    @VisibleForTesting
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    fun createQuery(entity : Entity) : String {
1163499d4aac4333e9dc33fe4d09bb261574a633e91Adam Powell        return entity.createTableQuery
1173499d4aac4333e9dc33fe4d09bb261574a633e91Adam Powell    }
1188a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy
1198a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy    @VisibleForTesting
120fea5d0250767ab938f623a404e6292a32dd2fdf5Adam Powell    fun createDropTableQuery(entity: Entity) : String {
121fe8e279dbc31a5155d7ad09987d5cda8aad10206Adam Powell        return "DROP TABLE IF EXISTS `${entity.tableName}`"
122fe8e279dbc31a5155d7ad09987d5cda8aad10206Adam Powell    }
123fe8e279dbc31a5155d7ad09987d5cda8aad10206Adam Powell}
124fe8e279dbc31a5155d7ad09987d5cda8aad10206Adam Powell