package com.tomclaw.mandarin.core; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.tomclaw.mandarin.R; import com.tomclaw.mandarin.im.StatusUtil; import com.tomclaw.mandarin.im.icq.IcqAccountRoot; import com.tomclaw.mandarin.util.GsonSingleton; import com.tomclaw.mandarin.util.Logger; import com.tomclaw.mandarin.util.StringUtil; import java.util.Random; /** * Created with IntelliJ IDEA. * User: solkin * Date: 4/23/13 * Time: 10:55 AM */ public class DatabaseHelper extends SQLiteOpenHelper { private final Context context; public DatabaseHelper(Context context) { super(context, Settings.DB_NAME, null, Settings.DB_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { try { // Creating roster database. db.execSQL(GlobalProvider.DB_CREATE_REQUEST_TABLE_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_ACCOUNT_TABLE_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_GROUP_TABLE_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_BUDDY_TABLE_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_HISTORY_TABLE_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_HISTORY_INDEX_BUDDY_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_HISTORY_INDEX_MESSAGE_SCRIPT); if (true) return; ContentValues cv0 = new ContentValues(); ContentValues cv1 = new ContentValues(); ContentValues cv2 = new ContentValues(); ContentValues cv3 = new ContentValues(); int[] statuses = new int[]{ StatusUtil.STATUS_OFFLINE }; Random random = new Random(System.currentTimeMillis()); for (int a = 0; a < 3 + random.nextInt(5); a++) { IcqAccountRoot accountRoot = new IcqAccountRoot(); accountRoot.setUserId(String.valueOf(random.nextInt(999999999))); accountRoot.setUserPassword(generateRandomWord(random)); accountRoot.setUserNick(generateRandomWord(random)); cv0.put(GlobalProvider.ACCOUNT_TYPE, accountRoot.getAccountType()); cv0.put(GlobalProvider.ACCOUNT_NAME, accountRoot.getUserNick()); cv0.put(GlobalProvider.ACCOUNT_USER_ID, accountRoot.getUserId()); cv0.put(GlobalProvider.ACCOUNT_USER_PASSWORD, accountRoot.getUserPassword()); cv0.put(GlobalProvider.ACCOUNT_STATUS, accountRoot.getStatusIndex()); cv0.put(GlobalProvider.ACCOUNT_STATUS_TITLE, generateRandomText(random, 1 + random.nextInt(2))); cv0.put(GlobalProvider.ACCOUNT_STATUS_MESSAGE, generateRandomText(random, 4 + random.nextInt(6))); cv0.put(GlobalProvider.ACCOUNT_CONNECTING, accountRoot.isConnecting() ? 1 : 0); cv0.put(GlobalProvider.ACCOUNT_BUNDLE, GsonSingleton.getInstance().toJson(accountRoot)); long accountDbId = db.insert(GlobalProvider.ACCOUNTS_TABLE, null, cv0); for (int i = 1; i <= 4 + random.nextInt(3); i++) { int groupId = (random.nextInt(10) == 1) ? GlobalProvider.GROUP_ID_RECYCLE : i; String groupName = groupId == GlobalProvider.GROUP_ID_RECYCLE ? context.getString(R.string.recycle) : generateRandomWord(random); cv1.put(GlobalProvider.ROSTER_GROUP_ACCOUNT_DB_ID, accountDbId); cv1.put(GlobalProvider.ROSTER_GROUP_NAME, groupName); cv1.put(GlobalProvider.ROSTER_GROUP_ID, groupId); cv1.put(GlobalProvider.ROSTER_GROUP_TYPE, GlobalProvider.GROUP_TYPE_DEFAULT); db.insert(GlobalProvider.ROSTER_GROUP_TABLE, null, cv1); for (int c = 1; c <= 15 + random.nextInt(15); c++) { int status = statuses[random.nextInt(statuses.length)]; String nick = generateRandomWord(random); boolean isDialog = (random.nextInt(10) == 1); cv2.put(GlobalProvider.ROSTER_BUDDY_ACCOUNT_DB_ID, accountDbId); cv2.put(GlobalProvider.ROSTER_BUDDY_ACCOUNT_TYPE, accountRoot.getAccountType()); cv2.put(GlobalProvider.ROSTER_BUDDY_ID, random.nextInt(999999999)); cv2.put(GlobalProvider.ROSTER_BUDDY_NICK, nick); cv2.put(GlobalProvider.ROSTER_BUDDY_GROUP, groupName); cv2.put(GlobalProvider.ROSTER_BUDDY_GROUP_ID, groupId); cv2.put(GlobalProvider.ROSTER_BUDDY_STATUS, status); cv2.put(GlobalProvider.ROSTER_BUDDY_STATUS_TITLE, generateRandomText(random, 1 + random.nextInt(2))); cv2.put(GlobalProvider.ROSTER_BUDDY_STATUS_MESSAGE, generateRandomText(random, 4 + random.nextInt(6))); cv2.put(GlobalProvider.ROSTER_BUDDY_DIALOG, isDialog); cv2.put(GlobalProvider.ROSTER_BUDDY_UPDATE_TIME, System.currentTimeMillis()); cv2.put(GlobalProvider.ROSTER_BUDDY_ALPHABET_INDEX, StringUtil.getAlphabetIndex(nick)); cv2.put(GlobalProvider.ROSTER_BUDDY_UNREAD_COUNT, 0); cv2.put(GlobalProvider.ROSTER_BUDDY_SEARCH_FIELD, nick.toUpperCase()); long id = db.insert(GlobalProvider.ROSTER_BUDDY_TABLE, null, cv2); int unreadCount = 0; if (isDialog) { for (int j = 0; j < random.nextInt(1500) + 1250; j++) { int messageType = (random.nextInt(3) == 1) ? 2 : 1; boolean isRead = (messageType != 1); unreadCount += isRead ? 0 : 1; cv3.put(GlobalProvider.HISTORY_BUDDY_ACCOUNT_DB_ID, accountDbId); cv3.put(GlobalProvider.HISTORY_BUDDY_DB_ID, String.valueOf(id)); cv3.put(GlobalProvider.HISTORY_MESSAGE_TYPE, messageType); cv3.put(GlobalProvider.HISTORY_MESSAGE_COOKIE, String.valueOf(random.nextLong())); cv3.put(GlobalProvider.HISTORY_MESSAGE_STATE, 4); cv3.put(GlobalProvider.HISTORY_MESSAGE_TIME, System.currentTimeMillis() + j - 24 * 60 * 60 * 1000 - 10); cv3.put(GlobalProvider.HISTORY_MESSAGE_READ, isRead ? 1 : 0); cv3.put(GlobalProvider.HISTORY_NOTICE_SHOWN, 1); String message = generateRandomText(random); cv3.put(GlobalProvider.HISTORY_MESSAGE_TEXT, message); cv3.put(GlobalProvider.HISTORY_SEARCH_FIELD, message.toUpperCase()); db.insert(GlobalProvider.CHAT_HISTORY_TABLE, null, cv3); } } cv2 = new ContentValues(); cv2.put(GlobalProvider.ROSTER_BUDDY_UNREAD_COUNT, unreadCount); //db.update(GlobalProvider.ROSTER_BUDDY_TABLE, cv2, GlobalProvider.ROW_AUTO_ID + "==" + id, null); } } } String query = "UPDATE " + GlobalProvider.ROSTER_BUDDY_TABLE + " SET " + GlobalProvider.ROSTER_BUDDY_UNREAD_COUNT + "=" + "(" + "SELECT COUNT(*) FROM " + GlobalProvider.CHAT_HISTORY_TABLE + " WHERE " + GlobalProvider.CHAT_HISTORY_TABLE + "." + GlobalProvider.HISTORY_MESSAGE_READ + "=0" + " AND " + GlobalProvider.CHAT_HISTORY_TABLE + "." + GlobalProvider.HISTORY_BUDDY_DB_ID + "=" + GlobalProvider.ROSTER_BUDDY_TABLE + "." + GlobalProvider.ROW_AUTO_ID + ");"; Logger.log("query: " + query); db.execSQL(query); Logger.log("DB created: " + db.toString()); PreferenceHelper.setShowStartHelper(context, false); } catch (Throwable ex) { ex.printStackTrace(); } } public static String generateRandomText(Random r) { int wordCount = 10 + r.nextInt(13); return generateRandomText(r, wordCount); } public static String generateRandomText(Random r, int wordCount) { StringBuilder sb = new StringBuilder(wordCount); for (int i = 0; i < wordCount; i++) { // For each letter in the word sb.append(generateRandomWord(r, i == 0)).append((i < (wordCount - 1)) ? " " : "."); // Add it to the String } return sb.toString(); } private static String generateRandomWord(Random r) { return generateRandomWord(r, true); } private static String generateRandomWord(Random r, boolean capitalize) { int wordLength = 4 + r.nextInt(6); // Initialize a Random Number Generator with SysTime as the seed StringBuilder sb = new StringBuilder(wordLength); for (int i = 0; i < wordLength; i++) { // For each letter in the word char tmp = (char) ('a' + r.nextInt('z' - 'a')); // Generate a letter between a and z sb.append(tmp); // Add it to the String } String word = sb.toString(); if (capitalize) { return String.valueOf(word.charAt(0)).toUpperCase() + word.substring(1); } else { return word; } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Yo! Logger.log("Now we need to upgrade database from " + oldVersion + " to " + newVersion); switch (oldVersion) { case 1: { db.execSQL("ALTER TABLE " + GlobalProvider.ROSTER_BUDDY_TABLE + " ADD COLUMN " + GlobalProvider.ROSTER_BUDDY_DRAFT + " text"); } case 2: { db.execSQL("ALTER TABLE " + GlobalProvider.ROSTER_BUDDY_TABLE + " ADD COLUMN " + GlobalProvider.ROSTER_BUDDY_LAST_SEEN + " int default 0"); db.execSQL("ALTER TABLE " + GlobalProvider.ROSTER_BUDDY_TABLE + " ADD COLUMN " + GlobalProvider.ROSTER_BUDDY_LAST_TYPING + " int default 0"); } case 3: { db.execSQL("ALTER TABLE " + GlobalProvider.ROSTER_BUDDY_TABLE + " ADD COLUMN " + GlobalProvider.ROSTER_BUDDY_OPERATION + " int default " + GlobalProvider.ROSTER_BUDDY_OPERATION_NO); } case 4: { db.execSQL(GlobalProvider.DB_CREATE_HISTORY_INDEX_BUDDY_SCRIPT); db.execSQL(GlobalProvider.DB_CREATE_HISTORY_INDEX_MESSAGE_SCRIPT); } case 5: { db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_TYPE + " int default " + GlobalProvider.HISTORY_CONTENT_TYPE_TEXT); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_SIZE + " bigint default 0"); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_STATE + " int default " + GlobalProvider.HISTORY_CONTENT_STATE_STABLE); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_PROGRESS + " int default 0"); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_URI + " text"); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_NAME + " text"); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_PREVIEW_HASH + " text"); db.execSQL("ALTER TABLE " + GlobalProvider.CHAT_HISTORY_TABLE + " ADD COLUMN " + GlobalProvider.HISTORY_CONTENT_TAG + " text"); } case 6: { db.execSQL("ALTER TABLE " + GlobalProvider.ROSTER_BUDDY_TABLE + " ADD COLUMN " + GlobalProvider.ROSTER_BUDDY_LAST_MESSAGE_TIME + " int default 0"); } } Logger.log("Database upgrade completed"); } }