SQLiteOpenHelperWriter.kt revision d72e20e472815b7d0918e0d309cee48a71c7988b
1d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar/*
2d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * Copyright (C) 2016 The Android Open Source Project
3d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar *
4d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * you may not use this file except in compliance with the License.
6d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * You may obtain a copy of the License at
7d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar *
8d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar *
10d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * Unless required by applicable law or agreed to in writing, software
11d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * See the License for the specific language governing permissions and
14d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * limitations under the License.
15d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar */
16d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
17d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarpackage com.android.support.room.writer
18d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
19d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.ext.L
20d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.ext.N
21d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.ext.SupportDbTypeNames
22d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.ext.T
23d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.solver.CodeGenScope
24d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.android.support.room.vo.Database
25d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.squareup.javapoet.FieldSpec
26d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.squareup.javapoet.MethodSpec
27d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.squareup.javapoet.ParameterSpec
28d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.squareup.javapoet.TypeName
29d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport com.squareup.javapoet.TypeSpec
30d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarimport javax.lang.model.element.Modifier.PUBLIC
31d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
32d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar/**
33d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar * Create an open helper using SupportSQLiteOpenHelperFactory
34d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar */
35d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyarclass SQLiteOpenHelperWriter(val database : Database) {
36d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    fun write(outVar : String, configuration : ParameterSpec, scope: CodeGenScope) {
37d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        scope.builder().apply {
38d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            val sqliteConfigVar = scope.getTmpVar("_sqliteConfig")
39d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            val callbackVar = scope.getTmpVar("_openCallback")
40d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addStatement("final $T $L = $L",
41d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CALLBACK,
42d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    callbackVar, createOpenCallback())
43d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            // build configuration
44d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addStatement(
45d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    """
46d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    final $T $L = $T.builder($N.context)
47d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    .name($N.name)
48d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    .version($N.version)
49d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    .callback($L)
50d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    .build()
51d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    """.trimIndent(),
52d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CONFIG, sqliteConfigVar,
53d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    SupportDbTypeNames.SQLITE_OPEN_HELPER_CONFIG,
54d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    configuration, configuration, configuration, callbackVar)
55d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addStatement("final $T $N = $N.sqliteOpenHelperFactory.create($L)",
56d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    SupportDbTypeNames.SQLITE_OPEN_HELPER, outVar,
57d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar                    configuration, sqliteConfigVar)
58d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        }
59d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    }
60d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
61d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    private fun createOpenCallback() : TypeSpec {
62d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        return TypeSpec.anonymousClassBuilder("").apply {
63d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            superclass(SupportDbTypeNames.SQLITE_OPEN_HELPER_CALLBACK)
64d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addMethod(createOnCreate())
65d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addMethod(createOnUpgrade())
66d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addMethod(createOnDowngrade())
67d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        }.build()
68d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    }
69d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
70d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    private fun createOnCreate() : MethodSpec {
71d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        return MethodSpec.methodBuilder("onCreate").apply {
72d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addModifiers(PUBLIC)
73d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(SupportDbTypeNames.DB, "_db")
74d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            // TODO
75d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        }.build()
76d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    }
77d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
78d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    private fun createOnUpgrade() : MethodSpec {
79d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        return MethodSpec.methodBuilder("onUpgrade").apply {
80d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addModifiers(PUBLIC)
81d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(SupportDbTypeNames.DB, "_db")
82d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(TypeName.INT, "_oldVersion")
83d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(TypeName.INT, "_newVersion")
84d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            // TODO
85d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        }.build()
86d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    }
87d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar
88d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    private fun createOnDowngrade() : MethodSpec {
89d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        return MethodSpec.methodBuilder("onDowngrade").apply {
90d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addModifiers(PUBLIC)
91d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(SupportDbTypeNames.DB, "_db")
92d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(TypeName.INT, "_oldVersion")
93d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            addParameter(TypeName.INT, "_newVersion")
94d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar            // TODO
95d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar        }.build()
96d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar    }
97d72e20e472815b7d0918e0d309cee48a71c7988bYigit Boyar}
98