diff -r c39a6cfd1fb9 -r be09cf1f39dd smf/smfservermodule/smfserver/datastoremgr/dsm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smf/smfservermodule/smfserver/datastoremgr/dsm.cpp Tue May 18 17:37:12 2010 +0530 @@ -0,0 +1,603 @@ +/*! \file + \brief File containing class description for DataStoreManager class. + + Copyright (c) 2010 Sasken Communication Technologies Ltd. + All rights reserved. + This component and the accompanying materials are made available + under the terms of the "{License}" + which accompanies this distribution, and is available + at the URL "{LicenseUrl}". + + \author Jaspinder Singh, Sasken Communication Technologies Ltd - Initial contribution + + \version 0.1 + +*/ + +#include +#include + +// Static data initialization +DataStoreManager* DataStoreManager::m_dsm_instance = NULL; +const QString DataStoreManager::db_name = "dsm.db"; +DataStoreManagerState DataStoreManager::state = CLOSED; + +//! \fn getDataStoreManager() +/*! + \brief To get a handle on the datastore instantiation. + \brief This function returns a pointer to the existing DataStoreManager instantiation(object). + If no object exists, a new one is created. + + \return Pointer to the current instantiation of DataStoreManager. +*/ +DataStoreManager* DataStoreManager::getDataStoreManager(){ + if(m_dsm_instance == NULL){ + m_dsm_instance = new DataStoreManager(DataStoreManager::db_name); + if(!(m_dsm_instance->InitializeDataBase())){ + return NULL; + } + + } + + return m_dsm_instance; +} + +//! \fn ~DataStoreManager() +/*! + \brief Destructor for DataStoreManager class. + + \note Should this be public? +*/ +DataStoreManager::~DataStoreManager(){ + db.close(); + state = CLOSED; + delete m_dsm_instance; +} + +//! \fn getState() +/*! + \brief Get the current state of the DataStoreManager object. + \return The state of the DSM object. +*/ +DataStoreManagerState DataStoreManager::getState() const{ + return state; +} + +//! \fn getError() +/*! + \brief Get the last error message from the DataStoreManager object. + \return The last error message string of the DSM object. +*/ +QString DataStoreManager::getError() const{ + return m_last_msg; +} + +/* Refactor this. Think Signals. */ +QList DataStoreManager::getAllRelated(const SMFUserProfile& user_profile) { + QList related_profiles; + int usr_id = user_profile.userID(); + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return related_profiles; + /* Do something to signal an error. Just returning an empty list is NOT ok */ + } + } + + QSqlQuery qry; + qry.prepare("SELECT social_profiles.social_profile_id , social_profiles.user_id , social_profiles.sns_id , " + " social_profiles.profile_url , social_profiles.screen_alias" + " FROM social_profiles JOIN user_profiles WHERE user_profiles.user_id = social_profiles.user_id" + " AND social_profiles.user_id = :user_id"); + qry.bindValue(":user_id", usr_id); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + /* Do something to signal an error. Just returning an empty list is NOT ok */ + return related_profiles; + } + + while(qry.next()) + { + SMFSocialProfile _profile(qry.value(2).toInt()/* sns ID*/, + qry.value(1).toInt() /* user ID */, + qry.value(3).toString()/* url */, + qry.value(4).toString()/* alias */); + related_profiles << _profile; + + } +/* + for( int i = 0; i < related_profiles.size(); i++){ + qDebug() << related_profiles.at(i).associatedSnsID() << ", " << related_profiles.at(i).associatedUserID() + << related_profiles.at(i).profileURL() << related_profiles.at(i).screenAlias() ; + } +*/ + qry.finish(); + db.close(); + + return related_profiles; + +} + + +SMFSocialProfile DataStoreManager::getRelatedByService(const SMFUserProfile& user_profile, const SMFSocialNetworkingSite& sns){ + + SMFSocialProfile _profile; + int usr_id = user_profile.userID(); + int sns_id = sns.snsID(); + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return _profile; + /* Do something to signal an error. Just returning an empty list is NOT ok */ + } + } + + QSqlQuery qry; + qry.prepare("SELECT social_profiles.social_profile_id , social_profiles.user_id , social_profiles.sns_id , " + " social_profiles.profile_url , social_profiles.screen_alias" + " FROM social_profiles JOIN user_profiles WHERE user_profiles.user_id = social_profiles.user_id" + " AND social_profiles.user_id = :user_id AND social_profiles.sns_id = :sns_id"); + qry.bindValue(":user_id", usr_id); + qry.bindValue(":sns_id", sns_id); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + /* Do something to signal an error. Just returning an empty list is NOT ok */ + return _profile; + } + + if(qry.next()) { + _profile.setAssociatedSnsID(qry.value(2).toInt()); + _profile.setAssociatedUserID(qry.value(1).toInt()); + _profile.setProfileURL(qry.value(3).toString()); + _profile.setScreenAlias(qry.value(4).toString()); + } +/* + qDebug() << _profile.associatedSnsID() << ", " << _profile.associatedUserID() << ", " + << _profile.profileURL() << ", "<< _profile.screenAlias() ; +*/ + qry.finish(); + db.close(); + + return _profile; +} + +/* Cannot return something like this. Make this async */ +SMFUserProfile DataStoreManager::getUserProfile(const QString& name, const QString& contact_id){ + SMFUserProfile _profile; + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return _profile; + /* Do something to signal an error. Just returning an empty list is NOT ok */ + } + } + + QSqlQuery qry; + qry.prepare("SELECT user_id , name , contact_id FROM user_profiles WHERE name=:name AND contact_id=:contact_id"); + qry.bindValue(":name", name); + qry.bindValue(":contact_id", contact_id); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + /* Do something to signal an error. Just returning an empty list is NOT ok */ + return _profile; + } + + if(qry.next()){ + _profile.setName(qry.value(1).toString()); + _profile.setContactID(qry.value(2).toString()); + _profile.setUserID(qry.value(0).toInt()); + } + + qry.finish(); + db.close(); + + return _profile; +} + +/*! Fetches the Social Networking site identified by \a name */ +SMFSocialNetworkingSite DataStoreManager::getSNSEntry(const QString& name){ + SMFSocialNetworkingSite sns; + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return sns; + /* Do something to signal an error. Just returning an empty list is NOT ok */ + } + } + + QSqlQuery qry; + qry.prepare("SELECT sns_id, sns_name, sns_url FROM sns_base WHERE sns_name=:name"); + qry.bindValue(":name", name); + + if(!qry.exec()){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return sns; + } + + if(qry.next()){ + sns.setSnsID(qry.value(0).toInt()); + sns.setSnsName(qry.value(1).toString()); + sns.setSnsURL(qry.value(2).toString()); + } + + qry.finish(); + db.close(); + + return sns; +} + +/* Actually all these 'save' functions can be written as a template */ +void DataStoreManager::saveUserProfile(const SMFUserProfile& user_profile){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + } + } + + QSqlQuery qry; + qry.prepare("UPDATE user_profiles" + " SET name=:name , contact_id=:contact_id" + " WHERE user_id=:user_id"); + qry.bindValue(":name", user_profile.name()); + qry.bindValue(":contact_id", user_profile.contactID()); + qry.bindValue(":user_id", user_profile.userID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + } + + qry.finish(); + db.close(); +} + +void DataStoreManager::saveSocialProfile(const SMFSocialProfile& social_profile){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + } + } + + QSqlQuery qry; + qry.prepare("UPDATE social_profiles" + " SET user_id=:user_id, sns_id=:sns_id, profile_url=:profile_url, screen_alias=:screen_alias" + " WHERE social_profile_id=:social_profile_id"); + qry.bindValue(":user_id", social_profile.associatedUserID()); + qry.bindValue(":sns_id", social_profile.associatedSnsID()); + qry.bindValue(":profile_url", social_profile.profileURL()); + qry.bindValue(":screen_alias", social_profile.screenAlias()); + qry.bindValue(":social_profile_id", social_profile.profileID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + } + + qry.finish(); + db.close(); +} + +void DataStoreManager::saveSNSEntry(const SMFSocialNetworkingSite& sns){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + } + } + + QSqlQuery qry; + qry.prepare("UPDATE sns_base" + " SET sns_name=:sns_name, sns_url=:sns_url" + " WHERE sns_id=:sns_id"); + qry.bindValue(":sns_name", sns.snsName()); + qry.bindValue(":sns_url", sns.snsURL()); + qry.bindValue(":sns_id", sns.snsID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + } + + qry.finish(); + db.close(); + +} + +void DataStoreManager::modifyRelation(SMFSocialProfile& sns, SMFUserProfile& new_user_profile){ + sns.setAssociatedUserID(new_user_profile.userID()); +} + + +int DataStoreManager::addUserProfile(SMFUserProfile& user_profile){ + int user_id = user_profile.userID(); + + /* Check Required to identify multiple Entries */ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return user_id; + } + } + + QSqlQuery qry; + qry.prepare("INSERT INTO user_profiles (name, contact_id) VALUES (:name, :contact_id)"); + qry.bindValue(":name", user_profile.name()); + qry.bindValue(":contact_id", user_profile.contactID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return user_id; + } + + qry.prepare("SELECT user_id FROM user_profiles WHERE name=:name AND contact_id=:contact_id"); + qry.bindValue(":name", user_profile.name()); + qry.bindValue(":contact_id", user_profile.contactID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return user_id; + } + + if(qry.next()){ + user_id = qry.value(0).toInt(); + user_profile.setUserID(user_id); + } + + qry.finish(); + db.close(); + + return user_id; + + +} + +int DataStoreManager::deleteUserProfile( SMFUserProfile& user_profile){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return -1; + } + } + + QSqlQuery qry; + qry.prepare("DELETE FROM user_profiles WHERE user_id=:user_id"); + qry.bindValue(":user_id", user_profile.userID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return -1; + } + + qry.finish(); + db.close(); + + return 0; +} + +int DataStoreManager::addSocialProfile(SMFSocialProfile& social_profile){ + int social_prof_id = social_profile.profileID(); + + /* Check Required to identify multiple entries */ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return social_prof_id; + } + } + + /* There might be a request to add a social profile with either user and/or sns profile(s) + not stored in the database. What to do in that case? Automatically store the other profiles too? + */ + QSqlQuery qry; + qry.prepare("INSERT INTO social_profiles (user_id, sns_id, profile_url, screen_alias) " + "VALUES (:user_id, :sns_id, :profile_url, :screen_alias)"); + qry.bindValue(":user_id", social_profile.associatedUserID()); + qry.bindValue(":sns_id", social_profile.associatedSnsID()); + qry.bindValue(":profile_url", social_profile.profileURL()); + qry.bindValue(":screen_alias", social_profile.screenAlias()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return social_prof_id; + } + + qry.prepare("SELECT social_profile_id FROM social_profiles " + "WHERE user_id=:user_id AND sns_id=:sns_id AND profile_url=:profile_url AND screen_alias=:screen_alias"); + qry.bindValue(":user_id", social_profile.associatedUserID()); + qry.bindValue(":sns_id", social_profile.associatedSnsID()); + qry.bindValue(":profile_url", social_profile.profileURL()); + qry.bindValue(":screen_alias", social_profile.screenAlias()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return social_prof_id; + } + + if(qry.next()){ + social_prof_id = qry.value(0).toInt(); + social_profile.setProfileID(social_prof_id); + } + + qry.finish(); + db.close(); + + return social_prof_id; +} + +int DataStoreManager::deleteSocialProfile(SMFSocialProfile& social_profile){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return -1; + } + } + + QSqlQuery qry; + qry.prepare("DELETE FROM social_profiles WHERE social_profile_id=:social_profile_id"); + qry.bindValue(":social_profile_id", social_profile.profileID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return -1; + } + + qry.finish(); + db.close(); + + return 0; +} + +int DataStoreManager::addSNSEntry( SMFSocialNetworkingSite& sns){ + int sns_id = sns.snsID(); + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return sns_id; + } + } + + QSqlQuery qry; + qry.prepare("INSERT INTO sns_base (sns_name, sns_url) VALUES (:sns_name, :sns_url)"); + qry.bindValue(":sns_name", sns.snsName()); + qry.bindValue(":sns_url", sns.snsURL()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return sns_id; + } + + qry.prepare("SELECT sns_id FROM sns_base WHERE sns_name=:sns_name AND sns_url=:sns_url"); + qry.bindValue(":sns_name", sns.snsName()); + qry.bindValue(":sns_url", sns.snsURL()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return sns_id; + } + + if(qry.next()){ + sns_id = qry.value(0).toInt(); + sns.setSnsID(sns_id); + } + + qry.finish(); + db.close(); + + return sns_id; +} + +int DataStoreManager::deleteSNSEntry(SMFSocialNetworkingSite& sns){ + + if (!(db.isOpen())){ + if(!(db.open())){ + state = ERROR; + m_last_msg = db.lastError().text(); + return -1; + } + } + + QSqlQuery qry; + qry.prepare("DELETE FROM sns_base WHERE sns_id=:sns_id"); + qry.bindValue(":sns_id", sns.snsID()); + + if(!(qry.exec())){ + m_last_msg = qry.lastError().text(); + qry.finish(); + return -1; + } + + qry.finish(); + db.close(); + + return 0; +} + +int DataStoreManager::createRelation(const SMFUserProfile& user_profile, SMFSocialProfile& social_profile){ + social_profile.setAssociatedUserID(user_profile.userID()); + /* Save the socialProfile */ + //saveSocialProfile(social_profile); + return 0; +} + +int DataStoreManager::deleteRelation(const SMFUserProfile&, SMFSocialProfile& social_profile){ + social_profile.setAssociatedUserID(-1); + /* Save the profile */ + //saveSocialProfile(social_profile); + return 0; +} + + +DataStoreManager::DataStoreManager(const QString& db_name, QObject* parent):QObject(parent){ + db = QSqlDatabase::addDatabase("QSQLITE"); + db.setDatabaseName(db_name); +} + +bool DataStoreManager::InitializeDataBase(){ + + if(!db.open()){ + state = ERROR; + m_last_msg = db.lastError().text(); + return FALSE; + } + else + state = READY; + + QSqlQuery create_tables[3]; + + create_tables[0].prepare("CREATE TABLE IF NOT EXISTS user_profiles (user_id INTEGER PRIMARY KEY AUTOINCREMENT , name TEXT, contact_id TEXT)"); + create_tables[1].prepare("CREATE TABLE IF NOT EXISTS sns_base (sns_id INTEGER PRIMARY KEY AUTOINCREMENT , sns_name TEXT, sns_url TEXT)"); + create_tables[2].prepare("CREATE TABLE IF NOT EXISTS social_profiles (social_profile_id INTEGER PRIMARY KEY AUTOINCREMENT , user_id INTEGER, sns_id INTEGER, profile_url TEXT, screen_alias TEXT)"); + + + + for(int i = 0; i < 3; i++){ + if(!create_tables[i].exec()){ + state = ERROR; + m_last_msg = create_tables[i].lastError().text(); + return FALSE; + } + create_tables[i].finish(); + } + + db.close(); + state = CLOSED; + return TRUE; +}