mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Bug #671323 - Scheduled monthly transactions lose "except on weekends"
setting when using MySQL git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@22224 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
@@ -45,9 +45,10 @@
|
||||
G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
|
||||
|
||||
#define TABLE_NAME "recurrences"
|
||||
#define TABLE_VERSION 1
|
||||
#define TABLE_VERSION 2
|
||||
|
||||
#define BUDGET_MAX_RECURRENCE_PERIOD_TYPE_LEN 2048
|
||||
#define BUDGET_MAX_RECURRENCE_WEEKEND_ADJUST_LEN 2048
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -64,6 +65,8 @@ static gint get_recurrence_mult( gpointer pObject );
|
||||
static void set_recurrence_mult( gpointer pObject, gint value );
|
||||
static /*@ null @*/ gpointer get_recurrence_period_type( gpointer pObject );
|
||||
static void set_recurrence_period_type( gpointer pObject, /*@ null @*/ gpointer pValue );
|
||||
static /*@ null @*/ gpointer get_recurrence_weekend_adjust( gpointer pObject );
|
||||
static void set_recurrence_weekend_adjust( gpointer pObject, /*@ null @*/ gpointer pValue );
|
||||
static /*@ dependent @*//*@ null @*/ gpointer get_recurrence_period_start( gpointer pObject );
|
||||
static void set_recurrence_period_start( gpointer pObject, /*@ null @*/ gpointer pValue );
|
||||
|
||||
@@ -87,6 +90,10 @@ static const GncSqlColumnTableEntry col_table[] =
|
||||
"recurrence_period_start", CT_GDATE, 0, COL_NNUL, NULL, NULL,
|
||||
(QofAccessFunc)get_recurrence_period_start, set_recurrence_period_start
|
||||
},
|
||||
{
|
||||
"recurrence_weekend_adjust", CT_STRING, BUDGET_MAX_RECURRENCE_WEEKEND_ADJUST_LEN, COL_NNUL, NULL, NULL,
|
||||
(QofAccessFunc)get_recurrence_weekend_adjust, set_recurrence_weekend_adjust
|
||||
},
|
||||
{ NULL }
|
||||
/*@ +full_init_block @*/
|
||||
};
|
||||
@@ -104,6 +111,17 @@ static const GncSqlColumnTableEntry guid_col_table[] =
|
||||
/*@ +full_init_block @*/
|
||||
};
|
||||
|
||||
/* Special column table used to upgrade table from version 1 to 2 */
|
||||
static const GncSqlColumnTableEntry weekend_adjust_col_table[] =
|
||||
{
|
||||
/*@ -full_init_block @*/
|
||||
{
|
||||
"recurrence_weekend_adjust", CT_STRING, BUDGET_MAX_RECURRENCE_WEEKEND_ADJUST_LEN, 0,
|
||||
},
|
||||
{ NULL }
|
||||
/*@ +full_init_block @*/
|
||||
};
|
||||
|
||||
/* ================================================================= */
|
||||
|
||||
static /*@ null @*/ gpointer
|
||||
@@ -168,6 +186,30 @@ set_recurrence_period_type( gpointer pObject, gpointer pValue )
|
||||
pInfo->pRecurrence->ptype = recurrencePeriodTypeFromString( (gchar*)pValue );
|
||||
}
|
||||
|
||||
static /*@ null @*/ gpointer
|
||||
get_recurrence_weekend_adjust( gpointer pObject )
|
||||
{
|
||||
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
|
||||
|
||||
g_return_val_if_fail( pObject != NULL, NULL );
|
||||
g_return_val_if_fail( pInfo->pRecurrence != NULL, NULL );
|
||||
|
||||
return (gpointer)recurrenceWeekendAdjustToString(
|
||||
recurrenceGetWeekendAdjust( pInfo->pRecurrence ) );
|
||||
}
|
||||
|
||||
static void
|
||||
set_recurrence_weekend_adjust( gpointer pObject, gpointer pValue )
|
||||
{
|
||||
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
|
||||
|
||||
g_return_if_fail( pObject != NULL );
|
||||
g_return_if_fail( pInfo->pRecurrence != NULL );
|
||||
g_return_if_fail( pValue != NULL );
|
||||
|
||||
pInfo->pRecurrence->wadj = recurrenceWeekendAdjustFromString( (gchar*)pValue );
|
||||
}
|
||||
|
||||
static /*@ dependent @*//*@ null @*/ gpointer
|
||||
get_recurrence_period_start( gpointer pObject )
|
||||
{
|
||||
@@ -347,10 +389,39 @@ gnc_sql_recurrence_load_list( GncSqlBackend* be, const GncGUID* guid )
|
||||
}
|
||||
|
||||
/* ================================================================= */
|
||||
static void
|
||||
upgrade_recurrence_table_1_2 ( GncSqlBackend* be )
|
||||
{
|
||||
/* Step 1: add field, but allow it to be null */
|
||||
gboolean ok = gnc_sql_add_columns_to_table( be, TABLE_NAME, weekend_adjust_col_table );
|
||||
if ( !ok )
|
||||
{
|
||||
PERR( "Unable to add recurrence_weekend_adjust column\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Step 2: insert a default value in the newly created column */
|
||||
{
|
||||
gchar *weekend_adj_str = recurrenceWeekendAdjustToString(WEEKEND_ADJ_NONE);
|
||||
gchar *update_query = g_strdup_printf ("UPDATE %s SET %s = '%s';",
|
||||
TABLE_NAME,
|
||||
weekend_adjust_col_table[0].col_name,
|
||||
weekend_adj_str);
|
||||
(void)gnc_sql_execute_nonselect_sql (be, update_query);
|
||||
g_free (weekend_adj_str);
|
||||
g_free (update_query);
|
||||
}
|
||||
|
||||
/* Step 3: rewrite the table, requiring the weekend_adj column to be non-null */
|
||||
gnc_sql_upgrade_table( be, TABLE_NAME, col_table );
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
create_recurrence_tables( GncSqlBackend* be )
|
||||
{
|
||||
gint version;
|
||||
gboolean ok;
|
||||
|
||||
g_return_if_fail( be != NULL );
|
||||
|
||||
@@ -359,6 +430,18 @@ create_recurrence_tables( GncSqlBackend* be )
|
||||
{
|
||||
(void)gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
|
||||
}
|
||||
else if ( version < TABLE_VERSION )
|
||||
{
|
||||
/* Upgrade:
|
||||
1->2: Add recurrence_weekend_adjust field (mandatory, non-null field)
|
||||
*/
|
||||
if ( version == 1 )
|
||||
{
|
||||
upgrade_recurrence_table_1_2 (be);
|
||||
}
|
||||
(void)gnc_sql_set_table_version( be, TABLE_NAME, TABLE_VERSION );
|
||||
PINFO("Recurrence table upgraded from version %d to version %d\n", version, TABLE_VERSION);
|
||||
}
|
||||
}
|
||||
|
||||
/* ================================================================= */
|
||||
|
||||
Reference in New Issue
Block a user