--- /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 <dsm.h>
+#include <QDebug>
+
+// 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 <SMFSocialProfile> DataStoreManager::getAllRelated(const SMFUserProfile& user_profile) {
+ QList <SMFSocialProfile> 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;
+}