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:
Geert Janssens
2012-06-21 15:13:09 +00:00
parent 331bcf384b
commit 1fb8800b44

View File

@@ -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);
}
}
/* ================================================================= */