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