package net.dev123.yibo.db;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.dev123.commons.ServiceProvider;
import net.dev123.commons.http.auth.Authorization;
import net.dev123.commons.oauth.config.OAuthConfiguration;
import net.dev123.commons.oauth.config.OAuthConfigurationFactory;
import net.dev123.commons.util.StringUtil;
import net.dev123.yibo.R;
import net.dev123.yibo.common.Constants;
import net.dev123.yibome.entity.Account;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
/**
* DBHelper
*
* @version
* @author 马庆升
* @time 2010-8-20 下午09:56:55
*/
public class DBHelper extends SQLiteOpenHelper {
private static final int DB_VERSION = 35;
private static final String DB_NAME = "yibo.db";
private String[] createSQL = null;
private String[] destroySQL = null;
private static DBHelper dbHelper;
public static synchronized DBHelper getInstance(Context context){
if (dbHelper == null) {
dbHelper = new DBHelper(context);
}
return dbHelper;
}
private DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
initSQL(context);
}
private void initSQL(Context context) {
createSQL = context.getResources().getStringArray(R.array.db_create_sql);
destroySQL = context.getResources().getStringArray(R.array.db_destroy_sql);
}
public void onCreate(SQLiteDatabase sqLiteDatabase) {
for (int i = 0; i < createSQL.length; i++) {
sqLiteDatabase.execSQL(createSQL[i]);
}
}
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
List<ContentValues> datas = retrieveAccountsData(sqLiteDatabase);
execSQLs(sqLiteDatabase, destroySQL);
execSQLs(sqLiteDatabase, createSQL);
if (datas != null && datas.size() > 0) {
for (ContentValues data : datas) {
sqLiteDatabase.insert("Account", null, data);
}
}
}
}
private void execSQLs(SQLiteDatabase sqLiteDatabase, String[] sqls) {
if (sqls != null && sqls.length > 0) {
for (int i = 0; i < sqls.length; i++) {
if (Constants.DEBUG) {
Log.d("EXECSQL", sqls[i]);
}
sqLiteDatabase.execSQL(sqls[i]);
}
}
}
private List<ContentValues> retrieveAccountsData(SQLiteDatabase db) {
List<ContentValues> datas = null;
Cursor cursor = db.rawQuery("select * from Account", null);
if (cursor != null) {
if (cursor.moveToFirst()) {
datas = new ArrayList<ContentValues>();
do {
datas.add(extractDataFromCursor(db, cursor));
} while (cursor.moveToNext());
}
cursor.deactivate();
cursor.close();
cursor = null;
}
return datas;
}
private ContentValues extractDataFromCursor(SQLiteDatabase db, Cursor cursor) {
ContentValues contentValues = new ContentValues();
contentValues.put("Auth_Token",
cursor.getString(cursor.getColumnIndex("Auth_Token")));
contentValues.put("Auth_Secret",
cursor.getString(cursor.getColumnIndex("Auth_Secret")));
contentValues.put("Service_Provider",
cursor.getInt(cursor.getColumnIndex("Service_Provider")));
contentValues.put("User_ID",
cursor.getString(cursor.getColumnIndex("User_ID")));
contentValues.put("Screen_Name",
cursor.getString(cursor.getColumnIndex("Screen_Name")));
int spNo = contentValues.getAsInteger("Service_Provider");
ServiceProvider sp = ServiceProvider.getServiceProvider(spNo);
int columnIndex = 0;
columnIndex = cursor.getColumnIndex("Auth_Version");
int authVersion = Authorization.AUTH_VERSION_BASIC;
if (columnIndex > 0) {
authVersion = cursor.getInt(columnIndex);
} else {
columnIndex = cursor.getColumnIndex("Is_OAuth");
if (columnIndex > 0 && cursor.getInt(columnIndex) == 1) {
authVersion = Authorization.AUTH_VERSION_OAUTH_1;
}
}
contentValues.put("Auth_Version", authVersion);
columnIndex = cursor.getColumnIndex("Token_Expires_At");
if (columnIndex > 0) {
contentValues.put("Token_Expires_At", cursor.getLong(columnIndex));
} else {
contentValues.put("Token_Expires_At", -1);
}
columnIndex = cursor.getColumnIndex("Token_Scopes");
if (columnIndex > 0) {
contentValues.put("Token_Scopes", cursor.getString(columnIndex));
}
columnIndex = cursor.getColumnIndex("State");
if (columnIndex > 0) {
contentValues.put("State", cursor.getInt(columnIndex));
} else {
contentValues.put("State", Account.STATE_ADDED);
}
columnIndex = cursor.getColumnIndex("Created_At");
if (columnIndex > 0) {
contentValues.put("Created_At", cursor.getLong(columnIndex));
} else {
contentValues.put("Created_At", new Date().getTime());
}
columnIndex = cursor.getColumnIndex("App_Key");
OAuthConfiguration defaultConfig
= OAuthConfigurationFactory.getOAuthConfiguration(sp);
if (columnIndex > 0) {
contentValues.put("App_Key", cursor.getString(columnIndex));
columnIndex = cursor.getColumnIndex("App_Secret");
if (columnIndex > 0) {
contentValues.put("App_Secret", cursor.getString(columnIndex));
} else if (StringUtil.isEquals(contentValues.getAsString("App_Key"),
defaultConfig.getOAuthConsumerKey())) {
contentValues.put("App_Secret", defaultConfig.getOAuthConsumerSecret());
} else {
contentValues.put("App_Secret", "NULL");
}
} else if (authVersion == Authorization.AUTH_VERSION_OAUTH_1
|| authVersion == Authorization.AUTH_VERSION_OAUTH_2){
contentValues.put("App_Key", defaultConfig.getOAuthConsumerKey());
contentValues.put("App_Secret", defaultConfig.getOAuthConsumerSecret());
} else {
contentValues.put("App_Key", "NULL");
contentValues.put("App_Secret", "NULL");
}
columnIndex = cursor.getColumnIndex("Is_Default");
if (columnIndex > 0) {
contentValues.put("Is_Default", cursor.getInt(columnIndex));
} else {
// SQLite does not have a separate Boolean storage class.
// Instead, Boolean values are stored as integers 0 (false) and 1 (true).
contentValues.put("Is_Default", 0);
}
if (sp == ServiceProvider.Twitter
&& authVersion == Authorization.AUTH_VERSION_BASIC) {
//处理Twitter使用代理的情况,
columnIndex = cursor.getColumnIndex("Rest_Proxy_Url");
if (columnIndex > 0) {
contentValues.put("Rest_Proxy_Url", cursor.getString(columnIndex));
}
columnIndex = cursor.getColumnIndex("Search_Proxy_Url");
if (columnIndex > 0) {
contentValues.put("Search_Proxy_Url", cursor.getString(columnIndex));
}
if (!contentValues.containsKey("Rest_Proxy_Url")) {
//如果Account表列中无代理配置,则从Setting表中找
//以下是处理1.0版本的Twitter代理存储在Setting表的情况
long accountId = cursor.getLong(cursor.getColumnIndex("Account_ID"));
Cursor settingCursor =
db.rawQuery("select Setting_Value from Setting where Setting_Name = ?",
new String[]{"rest_" + accountId});
if (settingCursor != null) {
if (settingCursor.moveToFirst()) {
contentValues.put("Rest_Proxy_Url", settingCursor.getString(0));
}
settingCursor.deactivate();
settingCursor.close();
settingCursor = null;
}
}
}
return contentValues;
}
@Override
protected void finalize() throws Throwable {
if (dbHelper != null) {
dbHelper.close();
dbHelper = null;
}
super.finalize();
}
}