Revert 18490/18491/18527 - I'm not sure it's actually deleting the objects without affecting the database.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@18589 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Phil Longstaff 2010-01-30 22:57:55 +00:00
parent 3d8123287f
commit fbdcd66a91
5 changed files with 43 additions and 192 deletions

View File

@ -997,7 +997,6 @@ xaccFreeAccount (Account *acc)
{
AccountPrivate *priv;
GList *lp;
gboolean shutting_down = qof_book_shutting_down(qof_instance_get_book(acc));
g_return_if_fail(GNC_IS_ACCOUNT(acc));
@ -1016,16 +1015,13 @@ xaccFreeAccount (Account *acc)
/* remove lots -- although these should be gone by now. */
if (priv->lots)
{
/* If shutting down, just drop lots - don't worry about nicities. */
if (!shutting_down) {
PERR (" instead of calling xaccFreeAccount(), please call \n"
" xaccAccountBeginEdit(); xaccAccountDestroy(); \n");
PERR (" instead of calling xaccFreeAccount(), please call \n"
" xaccAccountBeginEdit(); xaccAccountDestroy(); \n");
for (lp=priv->lots; lp; lp=lp->next)
{
GNCLot *lot = lp->data;
gnc_lot_destroy (lot);
}
for (lp=priv->lots; lp; lp=lp->next)
{
GNCLot *lot = lp->data;
gnc_lot_destroy (lot);
}
g_list_free (priv->lots);
priv->lots = NULL;
@ -1037,34 +1033,20 @@ xaccFreeAccount (Account *acc)
* check once we know the warning isn't occurring any more. */
if (priv->splits)
{
GList *slist = priv->splits;
/* If shutting down, just drop lots - don't worry about nicities. */
if (!shutting_down) {
PERR (" instead of calling xaccFreeAccount(), please call \n"
" xaccAccountBeginEdit(); xaccAccountDestroy(); \n");
GList *slist;
PERR (" instead of calling xaccFreeAccount(), please call \n"
" xaccAccountBeginEdit(); xaccAccountDestroy(); \n");
qof_instance_reset_editlevel(acc);
qof_instance_reset_editlevel(acc);
slist = g_list_copy(priv->splits);
for (lp = slist; lp; lp = lp->next) {
Split *s = (Split *) lp->data;
g_assert(xaccSplitGetAccount(s) == acc);
xaccSplitDestroy (s);
}
} else {
/* The book is being shut down. Just break the link from the split
to this account. */
for (lp = priv->splits; lp; lp = lp->next) {
Split *s = (Split *) lp->data;
s->acc = NULL;
s->orig_acc = NULL;
}
}
g_list_free(slist);
if (!shutting_down && priv->splits != NULL) {
PERR("priv->splits != NULL\n");
slist = g_list_copy(priv->splits);
for (lp = slist; lp; lp = lp->next) {
Split *s = (Split *) lp->data;
g_assert(xaccSplitGetAccount(s) == acc);
xaccSplitDestroy (s);
}
g_list_free(slist);
g_assert(priv->splits == NULL);
}
CACHE_REPLACE(priv->accountName, NULL);
@ -1153,11 +1135,8 @@ xaccAccountCommitEdit (Account *acc)
{
GList *lp, *slist;
QofCollection *col;
gboolean shutting_down;
qof_instance_increase_editlevel(acc);
book = qof_instance_get_book(acc);
shutting_down = qof_book_shutting_down(book);
/* First, recursively free children */
xaccFreeAccountChildren(acc);
@ -1166,12 +1145,10 @@ xaccAccountCommitEdit (Account *acc)
acc, priv->accountName ? priv->accountName : "(null)");
slist = g_list_copy(priv->splits);
if (!shutting_down) {
for (lp = slist; lp; lp = lp->next)
{
Split *s = lp->data;
xaccSplitDestroy (s);
}
for (lp = slist; lp; lp = lp->next)
{
Split *s = lp->data;
xaccSplitDestroy (s);
}
g_list_free(slist);
/* It turns out there's a case where this assertion does not hold:
@ -1182,7 +1159,8 @@ xaccAccountCommitEdit (Account *acc)
g_assert(priv->splits == NULL || qof_book_shutting_down(acc->inst.book));
*/
if (!shutting_down) {
book = qof_instance_get_book(acc);
if (!qof_book_shutting_down(book)) {
col = qof_book_get_collection(book, GNC_ID_TRANS);
qof_collection_foreach(col, destroy_pending_splits_for_account, acc);
}
@ -1588,10 +1566,8 @@ gnc_account_remove_split (Account *acc, Split *s)
// And send the account-based event, too
qof_event_gen(&acc->inst, GNC_EVENT_ITEM_REMOVED, s);
if (!qof_book_shutting_down(qof_instance_get_book(acc))) {
priv->balance_dirty = TRUE;
xaccAccountRecomputeBalance(acc);
}
priv->balance_dirty = TRUE;
xaccAccountRecomputeBalance(acc);
return TRUE;
}
@ -4632,22 +4608,6 @@ xaccAccountForEachTransaction(const Account *acc, TransactionCallback proc,
return xaccAccountStagedTransactionTraversal(acc, 42, proc, data);
}
static void
account_book_end(QofBook* book)
{
QofCollection *col;
Account *root;
col = qof_book_get_collection (book, GNC_ID_ROOT_ACCOUNT);
root = gnc_coll_get_root_account (col);
if (root != NULL) {
xaccAccountBeginEdit(root);
xaccAccountDestroy(root);
}
col = qof_book_get_collection (book, GNC_ID_ACCOUNT);
printf("Accounts left: %d\n", qof_collection_count(col));
}
/* ================================================================ */
/* QofObject function implementation and registration */
@ -4657,7 +4617,7 @@ static QofObject account_object_def = {
.type_label = "Account",
.create = (gpointer)xaccMallocAccount,
.book_begin = NULL,
.book_end = account_book_end,
.book_end = NULL,
.is_dirty = qof_collection_is_dirty,
.mark_clean = qof_collection_mark_clean,
.foreach = qof_collection_foreach,

View File

@ -514,30 +514,27 @@ void
xaccSplitCommitEdit(Split *s)
{
Account *acc, *orig_acc;
gboolean shutting_down = qof_book_shutting_down(qof_instance_get_book(s));
g_return_if_fail(s);
if (!qof_instance_is_dirty(QOF_INSTANCE(s)) && !shutting_down) {
if (!qof_instance_is_dirty(QOF_INSTANCE(s)))
return;
}
orig_acc = s->orig_acc;
acc = s->acc;
/* Remove from lot (but only if it hasn't been moved to
new lot already) */
if (s->lot && (s->lot->account != acc || qof_instance_get_destroying(s))) {
if (s->lot && (s->lot->account != acc || qof_instance_get_destroying(s)))
gnc_lot_remove_split (s->lot, s);
}
/* Possibly remove the split from the original account... */
if (orig_acc && (orig_acc != acc || qof_instance_get_destroying(s))) {
if (!gnc_account_remove_split(orig_acc, s)) {
PERR("Account lost track of moved or deleted split.");
}
}
}
/* ... and insert it into the new account if needed */
if (acc && (orig_acc != acc) && !qof_instance_get_destroying(s) && !shutting_down) {
if (acc && (orig_acc != acc) && !qof_instance_get_destroying(s)) {
if (gnc_account_insert_split(acc, s)) {
/* If the split's lot belonged to some other account, we
leave it so. */
@ -568,7 +565,7 @@ xaccSplitCommitEdit(Split *s)
qof_commit_edit_part2(QOF_INSTANCE(s), commit_err, NULL,
(void (*) (QofInstance *)) xaccFreeSplit);
if (acc && !shutting_down) {
if (acc) {
g_object_set(acc, "sort-dirty", TRUE, "balance-dirty", TRUE, NULL);
xaccAccountRecomputeBalance(acc);
}
@ -1119,10 +1116,8 @@ xaccSplitDestroy (Split *split)
acc = split->acc;
trans = split->parent;
if (acc && !qof_instance_get_destroying(acc)
&& xaccTransGetReadOnly(trans)
&& !qof_book_shutting_down(qof_instance_get_book(split))) {
&& xaccTransGetReadOnly(trans))
return FALSE;
}
xaccTransBeginEdit(trans);
ed.node = split;

View File

@ -334,11 +334,6 @@ xaccTransSortSplits (Transaction *trans)
GList *node, *new_list = NULL;
Split *split;
/* Don't bother if shutting down */
if (qof_book_shutting_down(qof_instance_get_book(trans))) {
return;
}
/* first debits */
for (node = trans->splits; node; node = node->next) {
split = node->data;
@ -456,8 +451,6 @@ xaccFreeTransaction (Transaction *trans)
{
GList *node;
if (qof_book_shutting_down(qof_instance_get_book(trans)))
PINFO("xaccFreeTransaction(%p)\n", trans);
if (!trans) return;
ENTER ("(addr=%p)", trans);
@ -964,14 +957,10 @@ xaccTransDestroy (Transaction *trans)
{
if (!trans) return;
if (qof_book_shutting_down(qof_instance_get_book(trans)))
PINFO("xaccTransDestroy(%p)\n", trans);
if (!xaccTransGetReadOnly (trans) ||
qof_book_shutting_down(qof_instance_get_book(trans))) {
xaccTransBeginEdit(trans);
qof_instance_set_destroying(trans, TRUE);
if (qof_book_shutting_down(qof_instance_get_book(trans)))
PINFO("xaccTransDestroy(%p): set destroying\n", trans);
xaccTransCommitEdit(trans);
}
}
@ -1002,9 +991,6 @@ do_destroy (Transaction *trans)
SplitList *node;
gboolean shutting_down = qof_book_shutting_down(qof_instance_get_book(trans));
if (shutting_down)
PINFO("do_destroy(%p)\n", trans);
/* If there are capital-gains transactions associated with this,
* they need to be destroyed too. */
destroy_gains (trans);
@ -1016,24 +1002,13 @@ do_destroy (Transaction *trans)
qof_event_gen (&trans->inst, QOF_EVENT_DESTROY, NULL);
/* We only own the splits that still think they belong to us. */
if (shutting_down) {
while (trans->splits != NULL) {
Split* s;
node = g_list_first(trans->splits);
s = node->data;
trans->splits = g_list_remove_link(trans->splits, node);
xaccSplitDestroy(s);
xaccSplitCommitEdit(s);
trans->splits = g_list_copy(trans->splits);
for (node = trans->splits; node; node = node->next) {
Split *s = node->data;
if (s->parent == trans) {
xaccSplitDestroy(s);
xaccSplitCommitEdit(s);
}
} else {
// trans->splits = g_list_copy(trans->splits);
for (node = trans->splits; node; node = node->next) {
Split *s = node->data;
if (s->parent == trans) {
xaccSplitDestroy(s);
xaccSplitCommitEdit(s);
}
}
}
g_list_free (trans->splits);
trans->splits = NULL;
@ -1043,7 +1018,7 @@ do_destroy (Transaction *trans)
/********************************************************************\
\********************************************************************/
/* Temporary hack for data consistency */
/* Temporary hack for data consitency */
static int scrub_data = 1;
void xaccEnableDataScrubbing(void) { scrub_data = 1; }
void xaccDisableDataScrubbing(void) { scrub_data = 0; }
@ -1151,7 +1126,7 @@ xaccTransCommitEdit (Transaction *trans)
* change the number of splits in this transaction, and the
* transaction itself might be deleted. This is also why
* we can't really enforce these constraints elsewhere: they
* can cause pointers to splits and transactions to disappear out
* can cause pointers to splits and transactions to disapear out
* from under the holder.
*/
if (!qof_instance_get_destroying(trans) && scrub_data &&
@ -2038,42 +2013,6 @@ xaccTransFindSplitByAccount(const Transaction *trans, const Account *acc)
return NULL;
}
static void
trans_destroy(Transaction* trans)
{
ENTER("trans=%p", trans);
xaccTransDestroy(trans);
LEAVE("trans=%p", trans);
}
static void
trans_xy(Transaction* trans)
{
xaccTransDestroy(trans);
}
static void
trans_book_end(QofBook* book)
{
guint old_count = 0;
guint count;
QofCollection *col;
col = qof_book_get_collection (book, GNC_ID_TRANS);
count = qof_collection_count(col);
if( count == 0 ) return;
printf( "Transactions left: %d\n", count);
qof_collection_foreach(col, (QofInstanceForeachCB)trans_destroy, NULL);
printf( "Transactions left: %d\n", count);
while( old_count != count ) {
old_count = count;
qof_collection_foreach(col, (QofInstanceForeachCB)trans_destroy, NULL);
count = qof_collection_count(col);
printf( "Transactions left: %d\n", count);
}
}
/********************************************************************\
\********************************************************************/
/* QofObject function implementation */
@ -2085,7 +2024,7 @@ static QofObject trans_object_def = {
.type_label = "Transaction",
.create = (gpointer)xaccMallocTransaction,
.book_begin = NULL,
.book_end = trans_book_end,
.book_end = NULL,
.is_dirty = qof_collection_is_dirty,
.mark_clean = qof_collection_mark_clean,
.foreach = qof_collection_foreach,

View File

@ -602,21 +602,6 @@ gnc_budget_get_default (QofBook *book)
return bgt;
}
/* Book handling routines */
/**
* Delete all budgets
*
* @param book Book
*/
static void
budget_book_end(QofBook* book)
{
QofCollection *col;
col = qof_book_get_collection(book, GNC_ID_BUDGET);
qof_collection_foreach(col, (QofInstanceForeachCB)gnc_budget_destroy, NULL);
}
/* Define the QofObject. */
static QofObject budget_object_def =
{
@ -625,7 +610,7 @@ static QofObject budget_object_def =
.type_label = "Budget",
.create = (gpointer)gnc_budget_new,
.book_begin = NULL,
.book_end = budget_book_end,
.book_end = NULL,
.is_dirty = qof_collection_is_dirty,
.mark_clean = qof_collection_mark_clean,
.foreach = qof_collection_foreach,

View File

@ -434,34 +434,6 @@ gnc_lot_get_latest_split (GNCLot *lot)
return node->data;
}
/* When the book is being closed, destroy all lots */
static void
lot_destroy_book_end(GNCLot* lot)
{
gnc_lot_begin_edit(lot);
while (lot->splits != NULL) {
gnc_lot_remove_split(lot, (Split*)lot->splits->data);
}
qof_instance_set_destroying(lot, TRUE);
gnc_lot_commit_edit(lot);
}
static void
lot_book_end(QofBook* book)
{
QofCollection *col;
guint count;
col = qof_book_get_collection (book, GNC_ID_LOT);
count = qof_collection_count(col);
printf( "Book end: Lots left: %d\n", count);
while(count > 0) {
qof_collection_foreach(col, (QofInstanceForeachCB)lot_destroy_book_end, NULL);
count = qof_collection_count(col);
printf( "Lots left: %d\n", count);
}
}
/* ============================================================= */
static QofObject gncLotDesc =
@ -471,7 +443,7 @@ static QofObject gncLotDesc =
.type_label = "Lot",
.create = (gpointer)gnc_lot_new,
.book_begin = NULL,
.book_end = lot_book_end,
.book_end = NULL,
.is_dirty = qof_collection_is_dirty,
.mark_clean = qof_collection_mark_clean,
.foreach = qof_collection_foreach,