void gnc_module_init_backend_xml (void) { const char* name {"GnuCash File Backend Version 2"}; auto prov = QofBackendProvider_ptr(new QofXmlBackendProvider{name, "xml"}); qof_backend_register_provider(std::move(prov)); prov = QofBackendProvider_ptr(new QofXmlBackendProvider{name, "file"}); qof_backend_register_provider(std::move(prov)); /* And the business objects */ business_core_xml_init (); }
TEST (QofSessionTest, safe_save) { qof_backend_register_provider (get_provider ()); QofSession s; s.begin ("book1", false, false, false); s.safe_save (nullptr); EXPECT_EQ (safe_sync_called, true); qof_backend_unregister_all_providers (); safe_sync_called = false; }
TEST (QofSessionTest, ensure_all_data_loaded) { qof_backend_register_provider (get_provider ()); QofSession s; s.begin ("book1", false, false, false); data_loaded = false; s.ensure_all_data_loaded (); EXPECT_EQ (data_loaded, true); qof_backend_unregister_all_providers (); }
TEST (QofSessionTest, pop_error) { qof_backend_register_provider (get_provider ()); QofSession s; s.begin ("book1", false, false, false); //We run the test first, and make sure there is an error condition. s.ensure_all_data_loaded (); EXPECT_NE (s.pop_error (), ERR_BACKEND_NO_ERR); EXPECT_EQ (s.get_error (), ERR_BACKEND_NO_ERR); qof_backend_unregister_all_providers (); }
TEST (QofSessionTest, get_error) { qof_backend_register_provider (get_provider ()); QofSession s; s.begin ("book1", false, false, false); s.ensure_all_data_loaded (); EXPECT_NE (s.get_error (), ERR_BACKEND_NO_ERR); //get_error should not clear the error. EXPECT_NE (s.get_error (), ERR_BACKEND_NO_ERR); qof_backend_unregister_all_providers (); }
TEST (QofSessionTest, swap_books) { qof_backend_register_provider (get_provider ()); QofSession s1; s1.begin ("book1", false, false, false); QofSession s2; s2.begin ("book2", false, false, false); QofBook * b1 {s1.get_book ()}; QofBook * b2 {s2.get_book ()}; ASSERT_NE (b1, b2); s1.swap_books (s2); EXPECT_EQ (s1.get_book (), b2); EXPECT_EQ (s2.get_book (), b1); qof_backend_unregister_all_providers (); }
TEST (QofSessionTest, export_session) { qof_backend_register_provider (get_provider ()); QofSession s1; s1.begin ("book1", false, false, false); QofSession s2; s2.begin ("book2", false, false, false); QofBook * b1 = s1.get_book (); QofBook * b2 = s2.get_book (); b1->backend = s1.get_backend (); b2->backend = s2.get_backend (); s2.export_session (s1, nullptr); EXPECT_EQ (exported_book, b1); qof_backend_unregister_all_providers (); }
TEST (QofSessionTest, load) { // We register a provider that gives a backend that // throws an error on load. // This error during load should cause the qof session to // "roll back" the book load. qof_backend_register_provider (get_provider ()); QofSession s; s.begin ("book1", false, false, false); auto book = s.get_book (); s.load (nullptr); EXPECT_EQ (book, s.get_book ()); // Now we'll do the load without returning an error from the backend, // and ensure that the book changed to a new book. load_error = false; s.load (nullptr); EXPECT_NE (book, s.get_book ()); // I'll put load_error back just to be tidy. load_error = true; qof_backend_unregister_all_providers (); }
void gnc_module_init_backend_dbi (void) { const char* driver_dir; int num_drivers; gboolean have_sqlite3_driver = FALSE; gboolean have_mysql_driver = FALSE; gboolean have_pgsql_driver = FALSE; /* Initialize libdbi and see which drivers are available. Only register qof backends which have drivers available. */ driver_dir = g_getenv ("GNC_DBD_DIR"); if (driver_dir == nullptr) { PINFO ("GNC_DBD_DIR not set: using libdbi built-in default\n"); } /* dbi_initialize returns -1 in case of errors */ #if HAVE_LIBDBI_R if (dbi_instance) return; num_drivers = dbi_initialize_r (driver_dir, &dbi_instance); #else num_drivers = dbi_initialize (driver_dir); #endif if (num_drivers <= 0) { gchar* dir = g_build_filename (gnc_path_get_libdir (), "dbd", nullptr); #if HAVE_LIBDBI_R if (dbi_instance) return; num_drivers = dbi_initialize_r (dir, &dbi_instance); #else num_drivers = dbi_initialize (dir); #endif g_free (dir); } if (num_drivers <= 0) { PWARN ("No DBD drivers found\n"); } else { dbi_driver driver = nullptr; PINFO ("%d DBD drivers found\n", num_drivers); do { #if HAVE_LIBDBI_R driver = dbi_driver_list_r (driver, dbi_instance); #else driver = dbi_driver_list (driver); #endif if (driver != nullptr) { const gchar* name = dbi_driver_get_name (driver); PINFO ("Driver: %s\n", name); if (strcmp (name, "sqlite3") == 0) { have_sqlite3_driver = TRUE; } else if (strcmp (name, "mysql") == 0) { have_mysql_driver = TRUE; } else if (strcmp (name, "pgsql") == 0) { have_pgsql_driver = TRUE; } } } while (driver != nullptr); } if (have_sqlite3_driver) { const char* name = "GnuCash Libdbi (SQLITE3) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_SQLITE>{name, FILE_URI_TYPE}); qof_backend_register_provider(std::move(prov)); prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_SQLITE>{name, SQLITE3_URI_TYPE}); qof_backend_register_provider(std::move(prov)); } if (have_mysql_driver) { const char *name = "GnuCash Libdbi (MYSQL) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_MYSQL>{name, "mysql"}); qof_backend_register_provider(std::move(prov)); } if (have_pgsql_driver) { const char* name = "GnuCash Libdbi (POSTGRESQL) Backend"; auto prov = QofBackendProvider_ptr(new QofDbiBackendProvider<DbType::DBI_PGSQL>{name, "postgres"}); qof_backend_register_provider(std::move(prov)); } /* If needed, set log level to DEBUG so that SQl statements will be put into the gnucash.trace file. */ /* qof_log_set_level( log_module, QOF_LOG_DEBUG ); */ }