misc cleanup, bug fix

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6469 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 2002-01-02 03:07:43 +00:00
parent b19ce51b45
commit 00e23dd632
5 changed files with 197 additions and 110 deletions

View File

@ -1,6 +1,6 @@
/********************************************************************\
* PostgresBackend.c -- implements postgres backend - main file *
* Copyright (c) 2000, 2001 Linas Vepstas *
* Copyright (c) 2000, 2001, 2002 Linas Vepstas <linas@linas.org> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
@ -1896,21 +1896,24 @@ pgend_session_begin (Backend *backend,
{
case MODE_SINGLE_FILE:
pgendEnable(be);
be->be.book_load = pgend_book_load_single;
be->be.price_load = pgend_price_load_single;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = NULL;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = NULL;
be->be.trans_rollback_edit = NULL;
be->be.price_begin_edit = NULL;
be->be.price_commit_edit = NULL;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = pgendSyncSingleFile;
be->be.sync_price = pgendSyncPriceDBSingleFile;
be->be.events_pending = NULL;
be->be.process_events = NULL;
be->be.book_load = pgend_book_load_single;
be->be.price_load = pgend_price_load_single;
be->be.book_transfer_begin = pgend_book_transfer_begin;
be->be.book_transfer_commit = pgend_book_transfer_commit;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = NULL;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = NULL;
be->be.trans_rollback_edit = NULL;
be->be.price_begin_edit = NULL;
be->be.price_commit_edit = NULL;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = pgendSyncSingleFile;
be->be.sync_group = NULL;
be->be.sync_price = pgendSyncPriceDBSingleFile;
be->be.events_pending = NULL;
be->be.process_events = NULL;
PWARN ("mode=single-file is final beta -- \n"
"we've fixed all known bugs but that doesn't mean\n"
"there aren't any! We think it's safe to use.\n");
@ -1918,21 +1921,24 @@ pgend_session_begin (Backend *backend,
case MODE_SINGLE_UPDATE:
pgendEnable(be);
be->be.book_load = pgend_book_load_single;
be->be.price_load = pgend_price_load_single;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = NULL; /* no-op for single user */
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = pgendSync;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = NULL;
be->be.process_events = NULL;
be->be.book_load = pgend_book_load_single;
be->be.price_load = pgend_price_load_single;
be->be.book_transfer_begin = pgend_book_transfer_begin;
be->be.book_transfer_commit = pgend_book_transfer_commit;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = NULL; /* no-op for single user */
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = pgendSync;
be->be.sync_group = NULL;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = NULL;
be->be.process_events = NULL;
PWARN ("mode=single-update is final beta -- \n"
"we've fixed all known bugs but that doesn't mean\n"
"there aren't any! We think it's safe to use.\n");
@ -1940,21 +1946,24 @@ pgend_session_begin (Backend *backend,
case MODE_POLL:
pgendEnable(be);
be->be.book_load = pgend_book_load_poll;
be->be.price_load = NULL;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = pgend_trans_rollback_edit;
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = pgendRunQuery;
be->be.price_lookup = pgendPriceLookup;
be->be.sync_all = pgendSync;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = NULL;
be->be.process_events = NULL;
be->be.book_load = pgend_book_load_poll;
be->be.price_load = NULL;
be->be.book_transfer_begin = pgend_book_transfer_begin;
be->be.book_transfer_commit = pgend_book_transfer_commit;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = pgend_trans_rollback_edit;
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = pgendRunQuery;
be->be.price_lookup = pgendPriceLookup;
be->be.sync_all = pgendSync;
be->be.sync_group = NULL;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = NULL;
be->be.process_events = NULL;
PWARN ("mode=multi-user-poll is beta -- \n"
"we've fixed all known bugs but that doesn't mean\n"
@ -1967,21 +1976,24 @@ pgend_session_begin (Backend *backend,
pgendSessionGetPid (be);
pgendSessionSetupNotifies (be);
be->be.book_load = pgend_book_load_poll;
be->be.price_load = NULL;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = pgend_trans_rollback_edit;
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = pgendRunQuery;
be->be.price_lookup = pgendPriceLookup;
be->be.sync_all = pgendSync;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = pgendEventsPending;
be->be.process_events = pgendProcessEvents;
be->be.book_load = pgend_book_load_poll;
be->be.price_load = NULL;
be->be.book_transfer_begin = pgend_book_transfer_begin;
be->be.book_transfer_commit = pgend_book_transfer_commit;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = pgend_account_commit_edit;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = pgend_trans_commit_edit;
be->be.trans_rollback_edit = pgend_trans_rollback_edit;
be->be.price_begin_edit = pgend_price_begin_edit;
be->be.price_commit_edit = pgend_price_commit_edit;
be->be.run_query = pgendRunQuery;
be->be.price_lookup = pgendPriceLookup;
be->be.sync_all = pgendSync;
be->be.sync_group = NULL;
be->be.sync_price = pgendSyncPriceDB;
be->be.events_pending = pgendEventsPending;
be->be.process_events = pgendProcessEvents;
PWARN ("mode=multi-user is beta -- \n"
"we've fixed all known bugs but that doesn't mean\n"
@ -2013,33 +2025,47 @@ pgendDisable (PGBackend *be)
if (1 < be->nest_count) return;
/* save hooks */
be->snr.account_begin_edit = be->be.account_begin_edit;
be->snr.account_commit_edit = be->be.account_commit_edit;
be->snr.trans_begin_edit = be->be.trans_begin_edit;
be->snr.trans_commit_edit = be->be.trans_commit_edit;
be->snr.trans_rollback_edit = be->be.trans_rollback_edit;
be->snr.price_begin_edit = be->be.price_begin_edit;
be->snr.price_commit_edit = be->be.price_commit_edit;
be->snr.run_query = be->be.run_query;
be->snr.price_lookup = be->be.price_lookup;
be->snr.sync_all = be->be.sync_all;
be->snr.sync_price = be->be.sync_price;
be->snr.events_pending = be->be.events_pending;
be->snr.process_events = be->be.process_events;
be->snr.book_load = be->be.book_load;
be->snr.price_load = be->be.price_load;
be->snr.session_end = be->be.session_end;
be->snr.destroy_backend = be->be.destroy_backend;
be->snr.book_transfer_begin = be->be.book_transfer_begin;
be->snr.book_transfer_commit = be->be.book_transfer_commit;
be->snr.account_begin_edit = be->be.account_begin_edit;
be->snr.account_commit_edit = be->be.account_commit_edit;
be->snr.trans_begin_edit = be->be.trans_begin_edit;
be->snr.trans_commit_edit = be->be.trans_commit_edit;
be->snr.trans_rollback_edit = be->be.trans_rollback_edit;
be->snr.price_begin_edit = be->be.price_begin_edit;
be->snr.price_commit_edit = be->be.price_commit_edit;
be->snr.run_query = be->be.run_query;
be->snr.price_lookup = be->be.price_lookup;
be->snr.sync_all = be->be.sync_all;
be->snr.sync_group = be->be.sync_group;
be->snr.sync_price = be->be.sync_price;
be->snr.events_pending = be->be.events_pending;
be->snr.process_events = be->be.process_events;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = NULL;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = NULL;
be->be.trans_rollback_edit = NULL;
be->be.price_begin_edit = NULL;
be->be.price_commit_edit = NULL;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = NULL;
be->be.sync_price = NULL;
be->be.events_pending = NULL;
be->be.process_events = NULL;
be->be.book_load = NULL;
be->be.price_load = NULL;
be->be.session_end = NULL;
be->be.destroy_backend = NULL;
be->be.book_transfer_begin = NULL;
be->be.book_transfer_commit = NULL;
be->be.account_begin_edit = NULL;
be->be.account_commit_edit = NULL;
be->be.trans_begin_edit = NULL;
be->be.trans_commit_edit = NULL;
be->be.trans_rollback_edit = NULL;
be->be.price_begin_edit = NULL;
be->be.price_commit_edit = NULL;
be->be.run_query = NULL;
be->be.price_lookup = NULL;
be->be.sync_all = NULL;
be->be.sync_group = NULL;
be->be.sync_price = NULL;
be->be.events_pending = NULL;
be->be.process_events = NULL;
}
/* ============================================================= */
@ -2056,19 +2082,26 @@ pgendEnable (PGBackend *be)
if (be->nest_count) return;
/* restore hooks */
be->be.account_begin_edit = be->snr.account_begin_edit;
be->be.account_commit_edit = be->snr.account_commit_edit;
be->be.trans_begin_edit = be->snr.trans_begin_edit;
be->be.trans_commit_edit = be->snr.trans_commit_edit;
be->be.trans_rollback_edit = be->snr.trans_rollback_edit;
be->be.price_begin_edit = be->snr.price_begin_edit;
be->be.price_commit_edit = be->snr.price_commit_edit;
be->be.run_query = be->snr.run_query;
be->be.price_lookup = be->snr.price_lookup;
be->be.sync_all = be->snr.sync_all;
be->be.sync_price = be->snr.sync_price;
be->be.events_pending = be->snr.events_pending;
be->be.process_events = be->snr.process_events;
be->be.book_load = be->snr.book_load;
be->be.price_load = be->snr.price_load;
be->be.session_end = be->snr.session_end;
be->be.destroy_backend = be->snr.destroy_backend;
be->be.book_transfer_begin = be->snr.book_transfer_begin;
be->be.book_transfer_commit = be->snr.book_transfer_commit;
be->be.account_begin_edit = be->snr.account_begin_edit;
be->be.account_commit_edit = be->snr.account_commit_edit;
be->be.trans_begin_edit = be->snr.trans_begin_edit;
be->be.trans_commit_edit = be->snr.trans_commit_edit;
be->be.trans_rollback_edit = be->snr.trans_rollback_edit;
be->be.price_begin_edit = be->snr.price_begin_edit;
be->be.price_commit_edit = be->snr.price_commit_edit;
be->be.run_query = be->snr.run_query;
be->be.price_lookup = be->snr.price_lookup;
be->be.sync_all = be->snr.sync_all;
be->be.sync_group = be->snr.sync_group;
be->be.sync_price = be->snr.sync_price;
be->be.events_pending = be->snr.events_pending;
be->be.process_events = be->snr.process_events;
}
/* ============================================================= */

View File

@ -1,6 +1,6 @@
/********************************************************************\
* book.c -- implements book handling for postgres backend *
* Copyright (c) 2000, 2001 Linas Vepstas *
* Copyright (c) 2000, 2001, 2002 Linas Vepstas <linas@linas.org> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
@ -176,4 +176,28 @@ pgendGetBook (PGBackend *be, GNCBook *book)
LEAVE (" ");
}
/* ============================================================= */
void
pgend_book_transfer_begin(Backend *bend, GNCBook *newbook)
{
PGBackend *be = (PGBackend *) bend;
ENTER (" ");
/* first, store the new book */
pgendStoreBook (be, newbook);
LEAVE (" ");
}
void
pgend_book_transfer_commit(Backend *bend, GNCBook *newbook)
{
PGBackend *be = (PGBackend *) bend;
ENTER (" ");
LEAVE (" ");
}
/* ======================== END OF FILE ======================== */

View File

@ -1,6 +1,6 @@
/********************************************************************\
* book.h -- implements books for the postgres backend *
* Copyright (c) 2000, 2001 Linas Vepstas *
* Copyright (c) 2000, 2001 Linas Vepstas <linas@linas.org> *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
@ -33,4 +33,7 @@ void pgendGetBook (PGBackend *be, GNCBook *book);
void pgendStoreBookNoLock (PGBackend *be, GNCBook *book, int do_check_version);
void pgendStoreBook (PGBackend *be, GNCBook *book);
void pgend_book_transfer_begin (Backend *, GNCBook*);
void pgend_book_transfer_commit (Backend *, GNCBook*);
#endif /* POSTGRES_BOOK_H */

View File

@ -41,14 +41,15 @@ CREATE TABLE gncCommodity (
namespace TEXT NOT NULL,
mnemonic TEXT NOT NULL,
code TEXT,
fraction INT DEFAULT '100'
fraction INT DEFAULT '100',
bookGuid CHAR(32) NOT NULL
);
CREATE TABLE gncBook (
bookGuid CHAR(32) PRIMARY KEY,
book_open CHAR DEFAULT 'n',
version INT4 NOT NULL,
iguid INT4 UNIQUE DEFAULT nextval('gnc_iguid_seq')
iguid INT4 DEFAULT 0
);
-- Account structure -- parentGUID points to parent account
@ -136,7 +137,8 @@ CREATE TABLE gncPrice (
type TEXT,
valueNum INT8 DEFAULT '0',
valueDenom INT4 DEFAULT '100',
version INT4 NOT NULL
version INT4 NOT NULL,
bookGuid CHAR(32) NOT NULL
);

View File

@ -295,6 +295,10 @@ add_multiple_book_support (PGBackend *be)
p = "LOCK TABLE gncAccount IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncAccountTrail IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncCommodity IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncCommodityTrail IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncPrice IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncPriceTrail IN ACCESS EXCLUSIVE MODE;\n"
"LOCK TABLE gncVersion IN ACCESS EXCLUSIVE MODE;\n"
"INSERT INTO gncVersion (major,minor,rev,name) VALUES \n"
" (1,4,0,'Start Add multiple book support');";
@ -321,29 +325,50 @@ add_multiple_book_support (PGBackend *be)
FINISH_QUERY(be->connection);
p = "ALTER TABLE gncAccount ADD COLUMN bookGuid CHAR(32) NOT NULL;\n"
"ALTER TABLE gncAccountTrail ADD COLUMN bookGuid CHAR(32) NOT NULL;\n";
"ALTER TABLE gncAccountTrail ADD COLUMN bookGuid CHAR(32) NOT NULL;\n"
"ALTER TABLE gncCommodity ADD COLUMN bookGuid CHAR(32) NOT NULL;\n"
"ALTER TABLE gncCommodityTrail ADD COLUMN bookGuid CHAR(32) NOT NULL;\n"
"ALTER TABLE gncPrice ADD COLUMN bookGuid CHAR(32) NOT NULL;\n"
"ALTER TABLE gncPriceTrail ADD COLUMN bookGuid CHAR(32) NOT NULL;\n";
SEND_QUERY (be,p, );
FINISH_QUERY(be->connection);
p = buff;
p = stpcpy (p, "UPDATE gncAccount SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';");
p = stpcpy (p, "';\n");
p = stpcpy (p, "UPDATE gncAccountTrail SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';\n");
SEND_QUERY (be,buff, );
FINISH_QUERY(be->connection);
p = buff;
p = stpcpy (p, "UPDATE gncAccountTrail SET bookGuid = '");
p = stpcpy (p, "UPDATE gncPrice SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';");
p = stpcpy (p, "';\n");
p = stpcpy (p, "UPDATE gncPriceTrail SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';\n");
SEND_QUERY (be,buff, );
FINISH_QUERY(be->connection);
p = buff;
p = stpcpy (p, "UPDATE gncCommodity SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';\n");
p = stpcpy (p, "UPDATE gncCommodityTrail SET bookGuid = '");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "';\n");
SEND_QUERY (be,buff, );
FINISH_QUERY(be->connection);
p = buff;
p = stpcpy (p, "INSERT INTO gncBook (bookGuid, book_open, version, iguid) "
"VALUES ('");
p = guid_to_string_buff (gnc_book_get_guid (be->book), p);
p = stpcpy (p, "', 'y', 1, nextval('gnc_iguid_seq') );");
p = stpcpy (p, "', 'y', 1, 0);");
SEND_QUERY (be,buff, );
FINISH_QUERY(be->connection);