/* * Copyright 2012 The Stanford MobiSocial Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package mobisocial.musubi.model.helpers; import mobisocial.musubi.model.MContactDataVersion; import mobisocial.musubi.model.MSyncState; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDoneException; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; /** * manages the state that tracks which email addresses, etc. have * been modified in the address book. also deals with the sync state * table which tracks things like the max contact id seen, etc */ public class ContactDataVersionManager extends ManagerBase { public ContactDataVersionManager(SQLiteOpenHelper databaseSource) { super(databaseSource); } // for address book update handler private SQLiteStatement mGetVersionStatement; private SQLiteStatement mSetVersionStatement; private SQLiteStatement mGetMaxContactIdStatement; private SQLiteStatement mGetMaxDataIdStatement; private SQLiteStatement mSetMaxDataIdSeenStatement; private SQLiteStatement mSetMaxContactIdSeenStatement; // for facebook update handler private SQLiteStatement mGetLastFacebookUpdateTime; private SQLiteStatement mSetLastFacebookUpdateTime; /** * @return the latest updated profile received from facebook or -1 */ public long getLastFacebookUpdateTime() { SQLiteDatabase db = initializeDatabase(); if(mGetLastFacebookUpdateTime == null) { synchronized(this) { if(mGetLastFacebookUpdateTime == null) { mGetLastFacebookUpdateTime = db.compileStatement( "SELECT " + MSyncState.COL_LAST_FACEBOOK_UPDATE_TIME + " FROM " + MSyncState.TABLE ); } } } synchronized (mGetLastFacebookUpdateTime) { try { return mGetLastFacebookUpdateTime.simpleQueryForLong(); } catch(SQLiteDoneException e) { return -1; } } } /** * set the latest facebook profile update time * * @param time */ public void setLastFacebookUpdateTime(long time) { SQLiteDatabase db = initializeDatabase(); if(mSetLastFacebookUpdateTime == null) { synchronized(this) { if(mSetLastFacebookUpdateTime == null) { mSetLastFacebookUpdateTime = db.compileStatement( "UPDATE " + MSyncState.TABLE + " SET " + MSyncState.COL_LAST_FACEBOOK_UPDATE_TIME + "=?" ); } } } synchronized (mSetLastFacebookUpdateTime) { mSetLastFacebookUpdateTime.bindLong(1, time); mSetLastFacebookUpdateTime.execute(); } } /** * get the version of the last raw contact data item that * was incorporated into musubi's address book * @param rawDataId * @return -1 version last synced */ public long getVersion(long rawDataId) { SQLiteDatabase db = initializeDatabase(); if(mGetVersionStatement == null) { synchronized(this) { if(mGetVersionStatement == null) { mGetVersionStatement = db.compileStatement( "SELECT " + MContactDataVersion.COL_VERSION + " FROM " + MContactDataVersion.TABLE + " WHERE " + MContactDataVersion.COL_RAW_DATA_ID + "=?" ); } } } synchronized (mGetVersionStatement) { try { mGetVersionStatement.bindLong(1, rawDataId); return mGetVersionStatement.simpleQueryForLong(); } catch(SQLiteDoneException e) { return -1; } } } /** * @return the highest id seen in the sync process or -1 */ public long getMaxContactIdSeen() { SQLiteDatabase db = initializeDatabase(); if(mGetMaxContactIdStatement == null) { synchronized(this) { if(mGetMaxContactIdStatement == null) { mGetMaxContactIdStatement = db.compileStatement( "SELECT " + MSyncState.COL_MAX_CONTACT + " FROM " + MSyncState.TABLE ); } } } synchronized (mGetMaxContactIdStatement) { try { return mGetMaxContactIdStatement.simpleQueryForLong(); } catch(SQLiteDoneException e) { return -1; } } } /** * @return the highest id seen in the sync process or -1 */ public long getMaxDataIdSeen() { SQLiteDatabase db = initializeDatabase(); if(mGetMaxDataIdStatement == null) { synchronized(this) { if(mGetMaxDataIdStatement == null) { mGetMaxDataIdStatement = db.compileStatement( "SELECT " + MSyncState.COL_MAX_DATA + " FROM " + MSyncState.TABLE ); } } } synchronized (mGetMaxDataIdStatement) { try { return mGetMaxDataIdStatement.simpleQueryForLong(); } catch(SQLiteDoneException e) { return -1; } } } /** * Set the version of a data item that has already been * applied to Musubi's contact list * @param rawDataId * @param version */ public void setVersion(long rawDataId, long version) { SQLiteDatabase db = initializeDatabase(); if(mSetVersionStatement == null) { synchronized(this) { if(mSetVersionStatement == null) { mSetVersionStatement = db.compileStatement( "INSERT OR REPLACE INTO " + MContactDataVersion.TABLE + " (" + MContactDataVersion.COL_RAW_DATA_ID + "," + MContactDataVersion.COL_VERSION + ")" + " VALUES (?, ?)" ); } } } synchronized (mSetVersionStatement) { mSetVersionStatement.bindLong(1, rawDataId); mSetVersionStatement.bindLong(2, version); mSetVersionStatement.execute(); } } /** * Set the highest contact id that has been seen for addr book sync */ public void setMaxContactIdSeen(long max_id) { SQLiteDatabase db = initializeDatabase(); if(mSetMaxContactIdSeenStatement == null) { synchronized(this) { if(mSetMaxContactIdSeenStatement == null) { mSetMaxContactIdSeenStatement = db.compileStatement( "UPDATE " + MSyncState.TABLE + " SET " + MSyncState.COL_MAX_CONTACT + "=?" ); } } } synchronized (mSetMaxContactIdSeenStatement) { mSetMaxContactIdSeenStatement.bindLong(1, max_id); mSetMaxContactIdSeenStatement.execute(); } } /** * Set the highest data id that has been seen for addr book sync */ public void setMaxDataIdSeen(long max_id) { SQLiteDatabase db = initializeDatabase(); if(mSetMaxDataIdSeenStatement == null) { synchronized(this) { if(mSetMaxDataIdSeenStatement == null) { mSetMaxDataIdSeenStatement = db.compileStatement( "UPDATE " + MSyncState.TABLE + " SET " + MSyncState.COL_MAX_DATA + "=?" ); } } } synchronized (mSetMaxDataIdSeenStatement) { mSetMaxDataIdSeenStatement.bindLong(1, max_id); mSetMaxDataIdSeenStatement.execute(); } } @Override public synchronized void close() { if (mGetVersionStatement != null) { mGetVersionStatement.close(); mGetVersionStatement = null; } if (mSetVersionStatement != null) { mSetVersionStatement.close(); mSetVersionStatement = null; } if (mGetMaxContactIdStatement != null) { mGetMaxContactIdStatement.close(); mGetMaxContactIdStatement = null; } if (mGetMaxDataIdStatement != null) { mGetMaxDataIdStatement.close(); mGetMaxDataIdStatement = null; } if (mSetMaxDataIdSeenStatement != null) { mSetMaxDataIdSeenStatement.close(); mSetMaxDataIdSeenStatement = null; } if (mSetMaxContactIdSeenStatement != null) { mSetMaxContactIdSeenStatement.close(); mSetMaxContactIdSeenStatement = null; } if (mGetLastFacebookUpdateTime != null) { mGetLastFacebookUpdateTime.close(); mGetLastFacebookUpdateTime = null; } if (mSetLastFacebookUpdateTime != null) { mSetLastFacebookUpdateTime.close(); mSetLastFacebookUpdateTime = null; } } }