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

Reply via email to