Hi John, Great work with this fix. I can't replicate the Server's Segfault when trying to join a Workplace that doesn't exist.
Regards, Max On 6 Jun 2011, at 03:31, nore...@launchpad.net wrote: > ------------------------------------------------------------ > revno: 227 > committer: John Deal <bassd...@yahoo.com> > branch nick: dbBackEnd > timestamp: Sun 2011-06-05 22:30:14 -0400 > message: > Fixed problem with creating and subscribing to workplaces. > modified: > mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp > > > -- > lp:~mira-dev/mira/dbBackEnd > https://code.launchpad.net/~mira-dev/mira/dbBackEnd > > You are subscribed to branch lp:~mira-dev/mira/dbBackEnd. > To unsubscribe from this branch go to > https://code.launchpad.net/~mira-dev/mira/dbBackEnd/+edit-subscription > === modified file 'mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp' > --- mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp 2011-05-31 > 14:00:52 +0000 > +++ mira-server/src/directory/db/sqlite/DbSqliteDirectory.cpp 2011-06-06 > 02:30:14 +0000 > @@ -340,7 +340,7 @@ > continue; > } > > - if ((current_size == 0) || (current_size < count)) > + if ((current_size == 0) || (current_size <= count)) > { // Anything still in target_list should be added. > add_list.push_back(*target_itr); > target_itr++; > @@ -460,6 +460,7 @@ > const std::string& workplace_name) > { > int error_code; > + unsigned int return_id; > Field work_field; > std::string work_string; > SubscriptionList work_subscription_list; > @@ -493,8 +494,9 @@ > return (unsigned int) 0; > } > > + return_id = (unsigned int) sqlite3_column_int64(m_prep_get_workplace_id, > 0); > sqlite3_reset(m_prep_get_workplace_id); > - return (unsigned int) sqlite3_column_int64(m_prep_get_workplace_id, 0); > + return return_id; > } > > bool DbSqliteDirectory::beginTransaction(const std::string& moduleName) > @@ -1638,21 +1640,12 @@ > return false; > } > > - if (error_code != SQLITE_DONE) > - { // Begin transaction failed. > - cout << "Error (DbSqliteDirectory::add_workplace): Begin of > transaction failed. Error Code: " > - << error_code << " Message: " << sqlite3_errmsg(m_db) << endl; > - sqlite3_reset(m_prep_begin_transaction_exclusive); > - return false; > - } > - > -// Add the workplace to the DB. > + // Add the workplace to the DB. > error_code = sqlite3_step(m_prep_put_workplace); > > if (error_code != SQLITE_DONE) > { // Insert failed. > - cout << "Error (DbSqliteDirectory::add_workplace): Insert of > workplace '" << > - workplace.get_name() << "' failed. Error Code: " > + cout << "Error (DbSqliteDirectory::add_workplace): Insert of > workplace '" << workplace.get_name() << "' failed. Error Code: " > << error_code << " Message: " << sqlite3_errmsg(m_db) << endl; > > // Note: No rollback since 1st insert failed. > @@ -1661,6 +1654,20 @@ > return false; > } > > + if (commitTransaction(m_max_commit_tries, > + "DbSqliteDirectory::add_workplace") == false) > + { // Commit failed. > + // Rollback the failed transaction. Note may automatically be rolled > + // back and return error if done expecitly so return not checked. > + sqlite3_reset(m_prep_rollback_transaction); > + sqlite3_step(m_prep_rollback_transaction); > + > + // Reset other used prepared statements. > + sqlite3_reset(m_prep_begin_transaction_exclusive); > + sqlite3_reset(m_prep_put_workplace); > + return false; // Something seriously wrong. > + } > + > // Now must add workplace subscription list. > work_id = get_workplace_id(workplace.get_name()); > > @@ -1668,18 +1675,6 @@ > { // Could not find workplace just added! > cout << "Error (DbSqliteDirectonary::add_workplace): Can not retrieve > workplace: " << > workplace.get_name() << ". Adding subscriptions failed." << endl; > - > - error_code = sqlite3_step(m_prep_rollback_transaction); > - > - if (error_code != SQLITE_DONE) > - { // Rollback of transaction failed. > - cout << "Error (DbSqliteDirectory::add_workplace): Rollback of > transaction failed. Error Code: " > - << error_code << " Message: " << sqlite3_errmsg(m_db) << > endl; > - } > - > - sqlite3_reset(m_prep_rollback_transaction); > - sqlite3_reset(m_prep_put_workplace); > - sqlite3_reset(m_prep_begin_transaction_exclusive); > return false; // Transaction failed and rolled back (hopefully). > } > > @@ -1698,19 +1693,13 @@ > workplace.get_name() << "' failed. Subscribed user ID: " << > *flItr << " invalid. Update aborted." << endl; > > - // Rollback transaction. > - sqlite3_reset(m_prep_rollback_transaction); > - error_code = sqlite3_step(m_prep_rollback_transaction); > + return false; > + } > > - if (error_code != SQLITE_DONE) > - { // Rollback failed. Punt! > - cout << "Error (DbSqliteDirectory::add_workplace): Rollback > of transaction failed. Error Code: " << > - error_code << " Message: " << sqlite3_errmsg(m_db) << > endl; > - sqlite3_reset(m_prep_rollback_transaction); > - sqlite3_reset(m_prep_put_workplace); > - sqlite3_reset(m_prep_begin_transaction_exclusive); > - return false; // Something seriously wrong. > - } > + // BEGIN TRANSACTION > + if (beginTransaction("DbSqliteDirectory::add_workplace") == false) > + { // Start of transaction failed. > + return false; > } > > if (add_subscription(work_id, work_user.get_id()) == false) > @@ -1734,23 +1723,23 @@ > sqlite3_reset(m_prep_begin_transaction_exclusive); > return false; > } > + > + // END TRANSACTION. > + if (commitTransaction(m_max_commit_tries, > + "DbSqliteDirectory::add_workplace") == false) > + { // Commit failed. > + // Rollback the failed transaction. May automatically be rolled > + // back and return error if done expecitly so return not checked. > + sqlite3_reset(m_prep_rollback_transaction); > + sqlite3_step(m_prep_rollback_transaction); > + > + // Reset other used prepared statements. > + sqlite3_reset(m_prep_begin_transaction_exclusive); > + sqlite3_reset(m_prep_put_workplace); > + return false; // Something seriously wrong. > + } > } // End for flItr != work_field.value_list.end(). > > - // END TRANSACTION. > - if (commitTransaction(m_max_commit_tries, > - "DbSqliteDirectory::add_workplace") == false) > - { // Commit failed. > - // Rollback the failed transaction. Note may automatically be rolled > - // back and return error if done expecitly so return not checked. > - sqlite3_reset(m_prep_rollback_transaction); > - sqlite3_step(m_prep_rollback_transaction); > - > - // Reset other used prepared statements. > - sqlite3_reset(m_prep_begin_transaction_exclusive); > - sqlite3_reset(m_prep_put_workplace); > - return false; // Something seriously wrong. > - } > - > sqlite3_reset(m_prep_put_workplace); > sqlite3_reset(m_prep_begin_transaction_exclusive); > return true; > @@ -1791,6 +1780,9 @@ > cout << "Error (DbSqliteDirectory::find_workplace: Error > retrieving workplace record. Error Code: " > << error_code << " Message: " << sqlite3_errmsg(m_db) << endl; > } > + > + workplace.set_invalid(); > + return workplace; > } > > try > @@ -2191,9 +2183,6 @@ > } // End if subscribtions to add or delete. > > // Things look good so commit the transaction. > - sqlite3_reset(m_prep_commit_transaction); > - error_code = sqlite3_step(m_prep_commit_transaction); > - > if (commitTransaction(m_max_commit_tries, > "DbSqliteDirectory::update_workplace") == false) > { > > ------------------------------------------------------------------------------ > Simplify data backup and recovery for your virtual environment with vRanger. > Installation's a snap, and flexible recovery options mean your data is safe, > secure and there when you need it. Discover what all the cheering's about. > Get your free trial download today. > http://p.sf.net/sfu/quest-dev2dev2 > _______________________________________________ > Mira-development mailing list > Mira-development@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mira-development ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ Mira-development mailing list Mira-development@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mira-development