diff -r b85b0c039c14 -r 1d94eb8df9c2 smf/smfservermodule/smfserver/datastoremgr/dsm.cpp --- a/smf/smfservermodule/smfserver/datastoremgr/dsm.cpp Fri May 21 15:40:57 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,603 +0,0 @@ -/*! \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; -}