mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Fix memory handling of queries by the register.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3347 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
ce09e164fc
commit
223fc82741
@ -43,6 +43,12 @@
|
|||||||
static short module = MOD_LEDGER;
|
static short module = MOD_LEDGER;
|
||||||
|
|
||||||
|
|
||||||
|
/** Declarations ****************************************************/
|
||||||
|
static xaccLedgerDisplay *
|
||||||
|
xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q,
|
||||||
|
SplitRegisterType type, SplitRegisterStyle style);
|
||||||
|
|
||||||
|
|
||||||
/** Implementations *************************************************/
|
/** Implementations *************************************************/
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -339,6 +345,30 @@ close_handler (gpointer user_data)
|
|||||||
g_free (ld);
|
g_free (ld);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_ledger_query (xaccLedgerDisplay *ld, gboolean show_all,
|
||||||
|
SplitRegisterType type)
|
||||||
|
{
|
||||||
|
ld->query = xaccMallocQuery ();
|
||||||
|
|
||||||
|
/* This is a bit of a hack. The number of splits should be
|
||||||
|
* configurable, or maybe we should go back a time range instead
|
||||||
|
* of picking a number, or maybe we should be able to exclude
|
||||||
|
* based on reconciled status. Anyway, this works for now. */
|
||||||
|
if (!show_all && (type != SEARCH_LEDGER))
|
||||||
|
xaccQuerySetMaxSplits (ld->query, 30);
|
||||||
|
|
||||||
|
xaccQuerySetGroup (ld->query, gncGetCurrentGroup());
|
||||||
|
|
||||||
|
if (ld->displayed_accounts)
|
||||||
|
xaccQueryAddAccountMatch (ld->query, ld->displayed_accounts,
|
||||||
|
ACCT_MATCH_ANY, QUERY_OR);
|
||||||
|
|
||||||
|
if (ld->leader &&
|
||||||
|
(g_list_find (ld->displayed_accounts, ld->leader) == NULL))
|
||||||
|
xaccQueryAddSingleAccountMatch (ld->query, ld->leader, QUERY_OR);
|
||||||
|
}
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
* xaccLedgerDisplayGeneral *
|
* xaccLedgerDisplayGeneral *
|
||||||
* opens up a ledger window for a list of accounts *
|
* opens up a ledger window for a list of accounts *
|
||||||
@ -347,11 +377,46 @@ close_handler (gpointer user_data)
|
|||||||
* (may be NULL) *
|
* (may be NULL) *
|
||||||
* accounts - the list of accounts to display *
|
* accounts - the list of accounts to display *
|
||||||
* (may be NULL) *
|
* (may be NULL) *
|
||||||
|
* type - the type of split register to open *
|
||||||
|
* style - the style of register to use *
|
||||||
* Return: the register window instance *
|
* Return: the register window instance *
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
xaccLedgerDisplay *
|
xaccLedgerDisplay *
|
||||||
xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts,
|
xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts,
|
||||||
SplitRegisterType type, SplitRegisterStyle style)
|
SplitRegisterType type, SplitRegisterStyle style)
|
||||||
|
{
|
||||||
|
return xaccLedgerDisplayInternal (lead_account, accounts, NULL, type, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************************************************\
|
||||||
|
* xaccLedgerDisplayQuery *
|
||||||
|
* opens up a ledger window for an arbitrary query *
|
||||||
|
* *
|
||||||
|
* Args: query - the query to use for the register *
|
||||||
|
* type - the type of split register to open *
|
||||||
|
* style - the style of register to use *
|
||||||
|
* Return: the register window instance *
|
||||||
|
\********************************************************************/
|
||||||
|
xaccLedgerDisplay *
|
||||||
|
xaccLedgerDisplayQuery (Query *query, SplitRegisterType type,
|
||||||
|
SplitRegisterStyle style)
|
||||||
|
{
|
||||||
|
return xaccLedgerDisplayInternal (NULL, NULL, query, type, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q)
|
||||||
|
{
|
||||||
|
if (!ledger_display || !q)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xaccFreeQuery (ledger_display->query);
|
||||||
|
ledger_display->query = xaccQueryCopy (q);
|
||||||
|
}
|
||||||
|
|
||||||
|
static xaccLedgerDisplay *
|
||||||
|
xaccLedgerDisplayInternal (Account *lead_account, GList *accounts, Query *q,
|
||||||
|
SplitRegisterType type, SplitRegisterStyle style)
|
||||||
{
|
{
|
||||||
xaccLedgerDisplay *ld;
|
xaccLedgerDisplay *ld;
|
||||||
gboolean show_all;
|
gboolean show_all;
|
||||||
@ -402,24 +467,10 @@ xaccLedgerDisplayGeneral (Account *lead_account, GList *accounts,
|
|||||||
TRUE);
|
TRUE);
|
||||||
|
|
||||||
/* set up the query filter */
|
/* set up the query filter */
|
||||||
ld->query = xaccMallocQuery ();
|
if (q)
|
||||||
|
ld->query = xaccQueryCopy (q);
|
||||||
/* This is a bit of a hack. The number of splits should be
|
else
|
||||||
* configurable, or maybe we should go back a time range instead
|
make_ledger_query (ld, show_all, type);
|
||||||
* of picking a number, or maybe we should be able to exclude
|
|
||||||
* based on reconciled status. Anyway, this works for now. */
|
|
||||||
if (!show_all && (type != SEARCH_LEDGER))
|
|
||||||
xaccQuerySetMaxSplits(ld->query, 30);
|
|
||||||
|
|
||||||
xaccQuerySetGroup (ld->query, gncGetCurrentGroup());
|
|
||||||
|
|
||||||
if (ld->displayed_accounts)
|
|
||||||
xaccQueryAddAccountMatch (ld->query, ld->displayed_accounts,
|
|
||||||
ACCT_MATCH_ANY, QUERY_OR);
|
|
||||||
|
|
||||||
if ((ld->leader != NULL) &&
|
|
||||||
(g_list_find (ld->displayed_accounts, ld->leader) == NULL))
|
|
||||||
xaccQueryAddSingleAccountMatch (ld->query, ld->leader, QUERY_OR);
|
|
||||||
|
|
||||||
ld->component_id = gnc_register_gui_component (class, NULL,
|
ld->component_id = gnc_register_gui_component (class, NULL,
|
||||||
close_handler, ld);
|
close_handler, ld);
|
||||||
@ -459,7 +510,7 @@ void
|
|||||||
xaccLedgerDisplayRefresh (xaccLedgerDisplay *ld)
|
xaccLedgerDisplayRefresh (xaccLedgerDisplay *ld)
|
||||||
{
|
{
|
||||||
/* If we don't really need the redraw, don't do it. */
|
/* If we don't really need the redraw, don't do it. */
|
||||||
if (!(ld->dirty))
|
if (!ld->dirty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ld->dirty = FALSE; /* mark clean */
|
ld->dirty = FALSE; /* mark clean */
|
||||||
|
@ -79,6 +79,14 @@ xaccLedgerDisplay * xaccLedgerDisplayGeneral (Account *lead_account,
|
|||||||
SplitRegisterType type,
|
SplitRegisterType type,
|
||||||
SplitRegisterStyle style);
|
SplitRegisterStyle style);
|
||||||
|
|
||||||
|
/* display a register for an arbitrary query */
|
||||||
|
xaccLedgerDisplay * xaccLedgerDisplayQuery (Query *query,
|
||||||
|
SplitRegisterType type,
|
||||||
|
SplitRegisterStyle style);
|
||||||
|
|
||||||
|
/* Set the query used for a register. */
|
||||||
|
void xaccLedgerDisplaySetQuery (xaccLedgerDisplay *ledger_display, Query *q);
|
||||||
|
|
||||||
/* redisplay/redraw all windows that contain any transactions that are
|
/* redisplay/redraw all windows that contain any transactions that are
|
||||||
* associated with the indicated account. */
|
* associated with the indicated account. */
|
||||||
void xaccAccountDisplayRefresh (Account *account);
|
void xaccAccountDisplayRefresh (Account *account);
|
||||||
|
@ -39,12 +39,16 @@
|
|||||||
#include "dialog-utils.h"
|
#include "dialog-utils.h"
|
||||||
#include "glade-cb-gnc-dialogs.h"
|
#include "glade-cb-gnc-dialogs.h"
|
||||||
#include "gnc-dateedit.h"
|
#include "gnc-dateedit.h"
|
||||||
|
#include "gnc-engine-util.h"
|
||||||
#include "gnc-ui.h"
|
#include "gnc-ui.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "splitreg.h"
|
#include "splitreg.h"
|
||||||
#include "window-help.h"
|
#include "window-help.h"
|
||||||
#include "window-register.h"
|
#include "window-register.h"
|
||||||
|
|
||||||
|
/* This static indicates the debugging module that this .o belongs to. */
|
||||||
|
static short module = MOD_GUI;
|
||||||
|
|
||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
* gnc_ui_find_transactions_dialog_create
|
* gnc_ui_find_transactions_dialog_create
|
||||||
* make a new print check dialog and wait for it.
|
* make a new print check dialog and wait for it.
|
||||||
@ -59,7 +63,7 @@ gnc_ui_find_transactions_dialog_create(xaccLedgerDisplay * orig_ledg) {
|
|||||||
ftd->ledger = orig_ledg;
|
ftd->ledger = orig_ledg;
|
||||||
|
|
||||||
if(orig_ledg) {
|
if(orig_ledg) {
|
||||||
ftd->q = orig_ledg->query;
|
ftd->q = xaccQueryCopy (orig_ledg->query);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ftd->q = NULL;
|
ftd->q = NULL;
|
||||||
@ -227,7 +231,13 @@ gnc_ui_find_transactions_dialog_destroy(FindTransactionsDialog * ftd) {
|
|||||||
gnome_dialog_close(GNOME_DIALOG(ftd->dialog));
|
gnome_dialog_close(GNOME_DIALOG(ftd->dialog));
|
||||||
|
|
||||||
ftd->dialog = NULL;
|
ftd->dialog = NULL;
|
||||||
|
|
||||||
|
xaccFreeQuery (ftd->q);
|
||||||
|
ftd->q = NULL;
|
||||||
|
|
||||||
g_free(ftd->ymd_format);
|
g_free(ftd->ymd_format);
|
||||||
|
ftd->ymd_format = NULL;
|
||||||
|
|
||||||
g_free(ftd);
|
g_free(ftd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,6 +349,7 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button,
|
|||||||
float amt_temp;
|
float amt_temp;
|
||||||
int amt_type;
|
int amt_type;
|
||||||
Query * q, * q2;
|
Query * q, * q2;
|
||||||
|
Query * new_q;
|
||||||
gboolean new_ledger = FALSE;
|
gboolean new_ledger = FALSE;
|
||||||
|
|
||||||
int use_start_date, use_end_date;
|
int use_start_date, use_end_date;
|
||||||
@ -516,39 +527,45 @@ gnc_ui_find_transactions_dialog_ok_cb(GtkButton * button,
|
|||||||
xaccQueryAddBalanceMatch(q, how, QUERY_AND);
|
xaccQueryAddBalanceMatch(q, how, QUERY_AND);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ftd->ledger) {
|
|
||||||
new_ledger = TRUE;
|
|
||||||
ftd->ledger = xaccLedgerDisplayGeneral(NULL, NULL,
|
|
||||||
SEARCH_LEDGER,
|
|
||||||
REG_STYLE_JOURNAL);
|
|
||||||
xaccFreeQuery(ftd->ledger->query);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(search_type) {
|
switch(search_type) {
|
||||||
case 0:
|
case 0:
|
||||||
ftd->ledger->query = q;
|
new_q = q;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
ftd->ledger->query = xaccQueryMerge(ftd->q, q, QUERY_AND);
|
new_q = xaccQueryMerge(ftd->q, q, QUERY_AND);
|
||||||
xaccFreeQuery(q);
|
xaccFreeQuery(q);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ftd->ledger->query = xaccQueryMerge(ftd->q, q, QUERY_OR);
|
new_q = xaccQueryMerge(ftd->q, q, QUERY_OR);
|
||||||
xaccFreeQuery(q);
|
xaccFreeQuery(q);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
q2 = xaccQueryInvert(q);
|
q2 = xaccQueryInvert(q);
|
||||||
ftd->ledger->query = xaccQueryMerge(ftd->q, q2, QUERY_AND);
|
new_q = xaccQueryMerge(ftd->q, q2, QUERY_AND);
|
||||||
xaccFreeQuery(q2);
|
xaccFreeQuery(q2);
|
||||||
xaccFreeQuery(q);
|
xaccFreeQuery(q);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
PERR ("bad search type: %d", search_type);
|
||||||
|
new_q = q;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ftd->ledger->dirty = 1;
|
if(!ftd->ledger) {
|
||||||
|
new_ledger = TRUE;
|
||||||
|
ftd->ledger = xaccLedgerDisplayQuery (new_q, SEARCH_LEDGER,
|
||||||
|
REG_STYLE_JOURNAL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
xaccLedgerDisplaySetQuery (ftd->ledger, new_q);
|
||||||
|
|
||||||
|
xaccFreeQuery (new_q);
|
||||||
|
|
||||||
|
ftd->ledger->dirty = TRUE;
|
||||||
xaccLedgerDisplayRefresh(ftd->ledger);
|
xaccLedgerDisplayRefresh(ftd->ledger);
|
||||||
if (new_ledger) regWindowLedger(ftd->ledger);
|
|
||||||
|
if (new_ledger)
|
||||||
|
regWindowLedger(ftd->ledger);
|
||||||
|
|
||||||
gnc_ui_find_transactions_dialog_destroy(ftd);
|
gnc_ui_find_transactions_dialog_destroy(ftd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -905,13 +905,12 @@ static void
|
|||||||
gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data)
|
gnc_ui_find_transactions_cb (GtkWidget *widget, gpointer data)
|
||||||
{
|
{
|
||||||
RegWindow * regdata = data;
|
RegWindow * regdata = data;
|
||||||
if(regdata->ledger->type == SEARCH_LEDGER) {
|
|
||||||
|
if (regdata->ledger->type == SEARCH_LEDGER)
|
||||||
gnc_ui_find_transactions_dialog_create (regdata->ledger);
|
gnc_ui_find_transactions_dialog_create (regdata->ledger);
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
gnc_ui_find_transactions_dialog_create (NULL);
|
gnc_ui_find_transactions_dialog_create (NULL);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static GtkWidget *
|
static GtkWidget *
|
||||||
|
Loading…
Reference in New Issue
Block a user