static void inner_main_add_price_quotes(void *closure, int argc, char **argv) { SCM mod, add_quotes, scm_book, scm_result = SCM_BOOL_F; QofSession *session = NULL; scm_c_eval_string("(debug-set! stack 200000)"); mod = scm_c_resolve_module("gnucash price-quotes"); scm_set_current_module(mod); load_gnucash_modules(); qof_event_suspend(); scm_c_eval_string("(gnc:price-quotes-install-sources)"); if (!gnc_quote_source_fq_installed()) { g_print("%s", _("No quotes retrieved. Finance::Quote isn't " "installed properly.\n")); goto fail; } add_quotes = scm_c_eval_string("gnc:book-add-quotes"); session = gnc_get_current_session(); if (!session) goto fail; qof_session_begin(session, add_quotes_file, FALSE, FALSE); if (qof_session_get_error(session) != ERR_BACKEND_NO_ERR) goto fail; qof_session_load(session, NULL); if (qof_session_get_error(session) != ERR_BACKEND_NO_ERR) goto fail; scm_book = gnc_book_to_scm(qof_session_get_book(session)); scm_result = scm_call_2(add_quotes, SCM_BOOL_F, scm_book); qof_session_save(session, NULL); if (qof_session_get_error(session) != ERR_BACKEND_NO_ERR) goto fail; qof_session_destroy(session); if (!scm_is_true(scm_result)) { g_warning("Failed to add quotes to %s.", add_quotes_file); goto fail; } qof_event_resume(); gnc_shutdown(0); return; fail: if (session && qof_session_get_error(session) != ERR_BACKEND_NO_ERR) g_warning("Session Error: %s", qof_session_get_error_message(session)); qof_event_resume(); gnc_shutdown(1); }
void MainWindow::newFile() { if (maybeSave()) { if (m_session) { /* close any ongoing file sessions, and free the accounts. * disable events so we don't gobj spammed by redraws. */ qof_event_suspend (); gnc_hook_run(HOOK_BOOK_CLOSED, m_session.gobj()); qof_session_destroy(m_session.gobj()); m_session.reset(); qof_event_resume (); } /* start a new book */ m_session.reset(qof_session_new()); gnc_hook_run(HOOK_NEW_BOOK, NULL); /* Call this after re-enabling events. */ gnc_hook_run(HOOK_BOOK_OPENED, m_session.gobj()); setCurrentFile(""); } }
gboolean qof_instance_copy_coll(QofSession *new_session, QofCollection *entity_coll) { QofInstanceCopyData qecd; g_return_val_if_fail(new_session, FALSE); if (!entity_coll) { return FALSE; } qof_event_suspend(); qecd.param_list = NULL; qecd.new_session = new_session; qof_book_set_partial(qof_session_get_book(qecd.new_session)); qof_collection_foreach(entity_coll, qof_instance_coll_foreach, &qecd); qof_class_param_foreach(qof_collection_get_type(entity_coll), qof_instance_param_cb, &qecd); qof_collection_foreach(entity_coll, qof_instance_coll_copy, &qecd); if (qecd.param_list != NULL) { g_slist_free(qecd.param_list); } qof_event_resume(); return TRUE; }
QofSession * gnc_get_current_session (void) { if (!current_session) { qof_event_suspend(); current_session = qof_session_new (); qof_event_resume(); } return current_session; }
gboolean qof_instance_copy_to_session(QofSession* new_session, QofInstance* original) { QofInstanceCopyData qecd; QofInstance *inst; QofBook *book; if (!new_session || !original) { return FALSE; } if (qof_instance_guid_match(new_session, original)) { return FALSE; } if (!qof_object_compliance(original->e_type, TRUE)) { return FALSE; } qof_event_suspend(); qecd.param_list = NULL; book = qof_session_get_book(new_session); qecd.new_session = new_session; qof_book_set_partial(book); inst = (QofInstance*)qof_object_new_instance(original->e_type, book); qecd.to = inst; qecd.from = original; qof_instance_set_guid(qecd.to, qof_instance_get_guid(original)); qof_begin_edit(inst); qof_class_param_foreach(original->e_type, qof_instance_param_cb, &qecd); qof_commit_edit(inst); if (g_slist_length(qecd.param_list) == 0) { return FALSE; } g_slist_foreach(qecd.param_list, qof_instance_foreach_copy, &qecd); g_slist_free(qecd.param_list); qof_event_resume(); return TRUE; }
void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { m_dboard->mainWindowCloseEvent(); writeSettings(); event->accept(); /* disable events; otherwise the mass deletion of accounts and * transactions during shutdown would cause massive redraws */ qof_event_suspend (); gnc_hook_run(HOOK_BOOK_CLOSED, m_session.gobj()); qof_session_destroy(m_session.gobj()); m_session.reset(); qof_event_resume (); } else { event->ignore(); } }
gboolean qof_instance_copy_list(QofSession *new_session, GList *entity_list) { QofInstanceCopyData *qecd; if (!new_session || !entity_list) { return FALSE; } ENTER (" list=%d", g_list_length(entity_list)); qecd = g_new0(QofInstanceCopyData, 1); qof_event_suspend(); qecd->param_list = NULL; qecd->new_session = new_session; qof_book_set_partial(qof_session_get_book(new_session)); g_list_foreach(entity_list, qof_instance_list_foreach, qecd); qof_event_resume(); if (qecd->error) { PWARN (" some/all entities in the list could not be copied."); } g_free(qecd); LEAVE (" "); return TRUE; }
/** * Executes a transaction query statement and loads the transactions and all * of the splits. * * @param be SQL backend * @param stmt SQL statement */ static void query_transactions( GncSqlBackend* be, GncSqlStatement* stmt ) { GncSqlResult* result; g_return_if_fail( be != NULL ); g_return_if_fail( stmt != NULL ); result = gnc_sql_execute_select_statement( be, stmt ); if ( result != NULL ) { GList* tx_list = NULL; GList* node; GncSqlRow* row; Transaction* tx; #if LOAD_TRANSACTIONS_AS_NEEDED GSList* bal_list = NULL; GSList* nextbal; Account* root = gnc_book_get_root_account( be->book ); qof_event_suspend(); xaccAccountBeginEdit( root ); // Save the start/ending balances (balance, cleared and reconciled) for // every account. gnc_account_foreach_descendant( gnc_book_get_root_account( be->primary_book ), save_account_balances, &bal_list ); #endif // Load the transactions row = gnc_sql_result_get_first_row( result ); while ( row != NULL ) { tx = load_single_tx( be, row ); if ( tx != NULL ) { tx_list = g_list_prepend( tx_list, tx ); } row = gnc_sql_result_get_next_row( result ); } gnc_sql_result_dispose( result ); // Load all splits and slots for the transactions if ( tx_list != NULL ) { gnc_sql_slots_load_for_list( be, tx_list ); load_splits_for_tx_list( be, tx_list ); } // Commit all of the transactions for ( node = tx_list; node != NULL; node = node->next ) { Transaction* pTx = GNC_TRANSACTION(node->data); xaccTransCommitEdit( pTx ); } g_list_free( tx_list ); #if LOAD_TRANSACTIONS_AS_NEEDED // Update the account balances based on the loaded splits. If the end // balance has changed, update the start balance so that the end // balance is the same as it was before the splits were loaded. // Repeat for cleared and reconciled balances. for ( nextbal = bal_list; nextbal != NULL; nextbal = nextbal->next ) { full_acct_balances_t* balns = (full_acct_balances_t*)nextbal->data; gnc_numeric* pnew_end_bal; gnc_numeric* pnew_end_c_bal; gnc_numeric* pnew_end_r_bal; gnc_numeric adj; g_object_get( balns->acc, "end-balance", &pnew_end_bal, "end-cleared-balance", &pnew_end_c_bal, "end-reconciled-balance", &pnew_end_r_bal, NULL ); if ( !gnc_numeric_eq( *pnew_end_bal, balns->end_bal ) ) { adj = gnc_numeric_sub( balns->end_bal, *pnew_end_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_bal = gnc_numeric_add( balns->start_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-balance", &balns->start_bal, NULL ); } if ( !gnc_numeric_eq( *pnew_end_c_bal, balns->end_cleared_bal ) ) { adj = gnc_numeric_sub( balns->end_cleared_bal, *pnew_end_c_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_cleared_bal = gnc_numeric_add( balns->start_cleared_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-cleared-balance", &balns->start_cleared_bal, NULL ); } if ( !gnc_numeric_eq( *pnew_end_r_bal, balns->end_reconciled_bal ) ) { adj = gnc_numeric_sub( balns->end_reconciled_bal, *pnew_end_r_bal, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); balns->start_reconciled_bal = gnc_numeric_add( balns->start_reconciled_bal, adj, GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD ); g_object_set( balns->acc, "start-reconciled-balance", &balns->start_reconciled_bal, NULL ); } xaccAccountRecomputeBalance( balns->acc ); g_free( pnew_end_bal ); g_free( pnew_end_c_bal ); g_free( pnew_end_r_bal ); g_free( balns ); } if ( bal_list != NULL ) { g_slist_free( bal_list ); } xaccAccountCommitEdit( root ); qof_event_resume(); #endif } }
static gboolean ap_close_period (GnomeDruidPage *druidpage, GtkWidget *druid, gpointer user_data) { AcctPeriodInfo *info = user_data; QofBook *closed_book = NULL, *current_book; const char *btitle; char *bnotes; Timespec closing_date; KvpFrame *book_frame; gboolean really_do_close_books = FALSE; ENTER("info=%p", info); current_book = gnc_get_current_book (); btitle = gtk_entry_get_text (info->book_title); bnotes = xxxgtk_textview_get_text (info->book_notes); PINFO("book title=%s\n", btitle); timespecFromTime_t (&closing_date, gnc_timet_get_day_end_gdate (&info->closing_date)); #define REALLY_DO_CLOSE_BOOKS #ifdef REALLY_DO_CLOSE_BOOKS really_do_close_books = TRUE; #endif /* REALLY_DO_CLOSE_BOOKS */ if (really_do_close_books) { /* Close the books ! */ qof_event_suspend (); gnc_suspend_gui_refresh (); scrub_all(); closed_book = gnc_book_close_period (current_book, closing_date, NULL, btitle); book_frame = qof_book_get_slots(closed_book); kvp_frame_set_str (book_frame, "/book/title", btitle); kvp_frame_set_str (book_frame, "/book/notes", bnotes); qof_session_add_book (gnc_get_current_session(), closed_book); /* We must save now; if we don't, and the user bails without saving, * then opening account balances will be incorrect, and this can only * lead to unhappiness. */ gnc_file_save (); gnc_resume_gui_refresh (); qof_event_resume (); gnc_gui_refresh_all (); /* resume above should have been enough ??? */ } g_free(bnotes); /* Report the status back to the user. */ info->close_status = 0; /* XXX fixme success or failure? */ /* Find the next closing date ... */ info->prev_closing_date = info->closing_date; recurrenceListNextInstance(info->period, &info->prev_closing_date, &info->closing_date); /* If the next closing date is in the future, then we are done. */ if (time(NULL) < gnc_timet_get_day_end_gdate (&info->closing_date)) { return FALSE; } /* Load up the GUI for the next closing period. */ gnc_frequency_setup_recurrence(info->period_menu, NULL, &info->closing_date); show_book_details (info); return TRUE; }