1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.providers.contacts.database;
18 
19 import com.android.providers.contacts.util.NeededForTesting;
20 
21 import android.database.Cursor;
22 import android.util.Log;
23 
24 /**
25  * Static methods for database operations.
26  */
27 public class MoreDatabaseUtils {
28 
29     /**
30      * Builds a CREATE INDEX ddl statement for a given table and field.
31      *
32      * @param table The table name.
33      * @param field The field to index.
34      * @return The create index sql statement.
35      */
buildCreateIndexSql(String table, String field)36     public static String buildCreateIndexSql(String table, String field) {
37         return "CREATE INDEX " + buildIndexName(table, field) + " ON " + table
38                 + "(" + field + ")";
39     }
40 
41     /**
42      * Builds a DROP INDEX ddl statement for a given table and field.
43      *
44      * @param table The table name that was originally used to create the index.
45      * @param field The field that was originally used to create the index.
46      * @return The drop index sql statement.
47      */
48     @NeededForTesting
buildDropIndexSql(String table, String field)49     public static String buildDropIndexSql(String table, String field) {
50         return "DROP INDEX IF EXISTS " + buildIndexName(table, field);
51     }
52 
53     /**
54      * The index is created with a name using the following convention:
55      * <p>
56      * [table name]_[field name]_index
57      */
buildIndexName(String table, String field)58     public static String buildIndexName(String table, String field) {
59         return table + "_" + field + "_index";
60     }
61 
62     /**
63      * Build a bind arg where clause.
64      * <p>
65      * e.g. Calling this method with value of 4 results in:
66      * <p>
67      * "?,?,?,?"
68      *
69      * @param numArgs The number of arguments.
70      * @return A string that can be used for bind args in a sql where clause.
71      */
72     @NeededForTesting
buildBindArgString(int numArgs)73     public static String buildBindArgString(int numArgs) {
74         final StringBuilder sb = new StringBuilder();
75         String delimiter = "";
76         for (int i = 0; i < numArgs; i++) {
77             sb.append(delimiter).append("?");
78             delimiter = ",";
79         }
80         return sb.toString();
81     }
82 
83     /** Debug utility that dumps a cursor on logcat. */
dumpCursor(String logTag, String name, Cursor c)84     public static final void dumpCursor(String logTag, String name, Cursor c) {
85         Log.d(logTag, "Dumping cursor " + name + " containing " + c.getCount() + " rows");
86 
87         // Dump the column names.
88         final StringBuilder sb = new StringBuilder();
89         for (int i = 0; i < c.getColumnCount(); i++) {
90             if (sb.length() > 0) sb.append(" ");
91             sb.append(c.getColumnName(i));
92         }
93         Log.d(logTag, sb.toString());
94 
95         // Dump the values.
96         c.moveToPosition(-1);
97         while (c.moveToNext()) {
98             sb.setLength(0);
99             sb.append("row#");
100             sb.append(c.getPosition());
101 
102             for (int i = 0; i < c.getColumnCount(); i++) {
103                 sb.append(" ");
104 
105                 String s = c.getString(i);
106                 sb.append(s == null ? "{null}" : s.replaceAll("\\s", "{space}"));
107             }
108             Log.d(logTag, sb.toString());
109         }
110     }
111 }
112