1
// =============================================================== //
3
// File : MG_names.cxx //
6
// Institute of Microbiology (Technical University Munich) //
7
// http://www.arb-home.de/ //
9
// =============================================================== //
13
#include <AW_rename.hxx>
6
14
#include <aw_root.hxx>
7
#include <aw_device.hxx>
15
#include <aw_awar.hxx>
8
17
#include <aw_window.hxx>
9
#include <AW_rename.hxx>
18
#include <arb_progress.h>
12
20
// --------------------------------------------------------------------------------
14
#define AWAR_MERGE_ADDID "tmp/merge1/addid"
15
#define AWAR_DEST_ADDID "tmp/merge2/addid"
22
#define AWAR_ADDID_SRC AWAR_MERGE_TMP_SRC "addid"
23
#define AWAR_ADDID_DST AWAR_MERGE_TMP_DST "addid"
17
#define AWAR_ADDID_MATCH "tmp/merge/addidmatch"
18
#define AWAR_RENAME_STATUS "tmp/merge/renamestat"
19
#define AWAR_ALLOW_DUPS "tmp/merge/allowdups"
20
#define AWAR_OVERRIDE "tmp/merge/override"
25
#define AWAR_ADDID_MATCH AWAR_MERGE_TMP "addidmatch"
26
#define AWAR_RENAME_STATUS AWAR_MERGE_TMP "renamestat"
27
#define AWAR_ALLOW_DUPS AWAR_MERGE_TMP "allowdups"
28
#define AWAR_OVERRIDE AWAR_MERGE_TMP "override"
22
30
// --------------------------------------------------------------------------------
31
39
// --------------------------------------------------------------------------------
33
41
static const char *addids_match_info(AW_root *aw_root) {
34
char *addid1 = aw_root->awar(AWAR_MERGE_ADDID)->read_string();
35
char *addid2 = aw_root->awar(AWAR_DEST_ADDID)->read_string();
36
const char *result = (strcmp(addid1, addid2) == 0) ? "Ok" : "MISMATCH!";
42
char *src_addid = aw_root->awar(AWAR_ADDID_SRC)->read_string();
43
char *dst_addid = aw_root->awar(AWAR_ADDID_DST)->read_string();
45
const char *result = (strcmp(src_addid, dst_addid) == 0) ? "Ok" : "MISMATCH!";
44
53
static void addids_match_info_refresh_cb(AW_root *aw_root) {
45
54
aw_root->awar(AWAR_ADDID_MATCH)->write_string(addids_match_info(aw_root));
46
MG_set_renamed(false, aw_root, "Needed (add.field changed)");
55
MG_set_renamed(false, aw_root, "Needed (add.field changed)");
49
void MG_create_db_dependent_rename_awars(AW_root *aw_root, GBDATA *gb_merge, GBDATA *gb_dest) {
58
void MG_create_db_dependent_rename_awars(AW_root *aw_root, GBDATA *gb_src, GBDATA *gb_dst) {
50
59
static bool created = false;
53
GB_transaction t1(gb_merge);
54
GB_transaction t2(gb_dest);
62
GB_transaction src_ta(gb_src);
63
GB_transaction dst_ta(gb_dst);
55
64
GB_ERROR error = 0;
57
66
// Awars for additional ID need to be mapped, cause they use same db-path in both DBs
59
GBDATA *gb_addid1 = GB_search(gb_merge, AWAR_NAMESERVER_ADDID, GB_STRING);
60
GBDATA *gb_addid2 = GB_search(gb_dest, AWAR_NAMESERVER_ADDID, GB_STRING);
61
const char *addid1 = gb_addid1 ? GB_read_char_pntr(gb_addid1) : "";
62
const char *addid2 = gb_addid2 ? GB_read_char_pntr(gb_addid2) : "";
68
GBDATA *gb_src_addid = GB_search(gb_src, AWAR_NAMESERVER_ADDID, GB_STRING);
69
GBDATA *gb_dst_addid = GB_search(gb_dst, AWAR_NAMESERVER_ADDID, GB_STRING);
71
const char *src_addid = gb_src_addid ? GB_read_char_pntr(gb_src_addid) : "";
72
const char *dst_addid = gb_dst_addid ? GB_read_char_pntr(gb_dst_addid) : "";
64
74
// use other as default (needed e.g. for import)
65
if (gb_addid1 && !gb_addid2) {
66
gb_addid2 = GB_create(gb_dest, AWAR_NAMESERVER_ADDID, GB_STRING);
67
if (!gb_addid2) error = GB_await_error();
68
else error = GB_write_string(gb_addid2, addid1);
75
if (gb_src_addid && !gb_dst_addid) {
76
gb_dst_addid = GB_create(gb_dst, AWAR_NAMESERVER_ADDID, GB_STRING);
77
if (!gb_dst_addid) error = GB_await_error();
78
else error = GB_write_string(gb_dst_addid, src_addid);
70
else if (!gb_addid1 && gb_addid2) {
71
gb_addid1 = GB_create(gb_merge, AWAR_NAMESERVER_ADDID, GB_STRING);
72
if (!gb_addid1) error = GB_await_error();
73
else error = GB_write_string(gb_addid1, addid2);
80
else if (!gb_src_addid && gb_dst_addid) {
81
gb_src_addid = GB_create(gb_src, AWAR_NAMESERVER_ADDID, GB_STRING);
82
if (!gb_src_addid) error = GB_await_error();
83
else error = GB_write_string(gb_src_addid, dst_addid);
77
AW_awar *awar_addid1 = aw_root->awar_string(AWAR_MERGE_ADDID, "xxx", gb_merge);
78
AW_awar *awar_addid2 = aw_root->awar_string(AWAR_DEST_ADDID, "xxx", gb_dest);
80
awar_addid1->unmap(); awar_addid1->map(gb_addid1);
81
awar_addid2->unmap(); awar_addid2->map(gb_addid2);
83
awar_addid1->add_callback(addids_match_info_refresh_cb);
84
awar_addid2->add_callback(addids_match_info_refresh_cb);
87
AW_awar *awar_src_addid = aw_root->awar_string(AWAR_ADDID_SRC, "xxx", gb_src);
88
AW_awar *awar_dst_addid = aw_root->awar_string(AWAR_ADDID_DST, "xxx", gb_dst);
90
awar_src_addid->unmap(); awar_src_addid->map(gb_src_addid);
91
awar_dst_addid->unmap(); awar_dst_addid->map(gb_dst_addid);
93
awar_src_addid->add_callback(addids_match_info_refresh_cb);
94
awar_dst_addid->add_callback(addids_match_info_refresh_cb);
86
96
addids_match_info_refresh_cb(aw_root);
90
error = t1.close(error);
91
error = t2.close(error);
100
error = src_ta.close(error);
101
error = dst_ta.close(error);
92
102
aw_message(error);
109
119
GB_ERROR MG_expect_renamed() {
110
120
GB_ERROR error = 0;
111
if (!was_renamed) error = "First you have to rename species in both databases";
121
if (!was_renamed) error = "First you have to synchronize species IDs in both databases";
115
125
// --------------------------------------------------------------------------------
117
127
static GB_ERROR renameDB(const char *which, GBDATA *gb_db, bool allowDups) {
118
aw_openstatus(GBS_global_string("Generating new names in %s database", which));
119
aw_status("Contacting name server");
121
bool isDuplicatesWarning;
122
GB_ERROR error = AWTC_pars_names(gb_db, 1, &isDuplicatesWarning);
128
arb_progress progress(GBS_global_string("Generating new names in %s database", which));
129
bool isDuplicatesWarning;
130
GB_ERROR error = AWTC_pars_names(gb_db, &isDuplicatesWarning);
125
133
error = GBS_global_string("While renaming %s DB:\n%s", which, error);
172
AW_window *MG_merge_names_cb(AW_root *awr){
173
static AW_window_simple *aws = 0;
175
aws = new AW_window_simple;
176
aws->init( awr, "MERGE_AUTORENAME_SPECIES", "SYNCHRONIZE NAMES");
177
aws->load_xfig("merge/names.fig");
179
aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
180
aws->create_button("CLOSE","CLOSE","C");
183
aws->callback(AW_POPUP_HELP,(AW_CL)"mg_names.hlp");
184
aws->create_button("HELP","HELP","H");
187
aws->create_input_field(AWAR_MERGE_ADDID, 10);
190
aws->create_input_field(AWAR_DEST_ADDID, 10);
193
aws->label("Allow merging duplicates (dangerous! see HELP)");
194
aws->create_toggle(AWAR_ALLOW_DUPS);
197
aws->label("Override (even more dangerous! see HELP)");
198
aws->callback(override_toggle_cb);
199
aws->create_toggle(AWAR_OVERRIDE);
202
aws->button_length(12);
203
aws->create_button("MATCH", AWAR_ADDID_MATCH, 0, "+");
206
aws->button_length(25);
207
aws->label("Status:");
208
aws->create_button("STATUS", AWAR_RENAME_STATUS, 0, "+");
211
aws->callback(rename_both_databases);
212
aws->create_autosize_button("RENAME_DATABASES","Rename species");
214
aws->button_length(0);
215
aws->shadow_width(1);
217
aws->callback(AW_POPUP_HELP,(AW_CL)"mg_names.hlp");
218
aws->create_button("HELP_MERGE", "#merge/icon.bitmap");
179
AW_window *MG_create_merge_names_window(AW_root *awr) {
180
AW_window_simple *aws = new AW_window_simple;
182
aws->init(awr, "MERGE_AUTORENAME_SPECIES", "Synchronize IDs");
183
aws->load_xfig("merge/names.fig");
185
aws->at("close"); aws->callback((AW_CB0)AW_POPDOWN);
186
aws->create_button("CLOSE", "CLOSE", "C");
189
aws->callback(makeHelpCallback("mg_names.hlp"));
190
aws->create_button("HELP", "HELP", "H");
193
aws->create_input_field(AWAR_ADDID_SRC, 10);
196
aws->create_input_field(AWAR_ADDID_DST, 10);
199
aws->label("Allow merging duplicates (dangerous! see HELP)");
200
aws->create_toggle(AWAR_ALLOW_DUPS);
203
aws->label("Override (even more dangerous! see HELP)");
204
aws->callback(override_toggle_cb);
205
aws->create_toggle(AWAR_OVERRIDE);
208
aws->button_length(12);
209
aws->create_button(0, AWAR_ADDID_MATCH, 0, "+");
212
aws->button_length(25);
213
aws->label("Status:");
214
aws->create_button(0, AWAR_RENAME_STATUS, 0, "+");
217
aws->callback(rename_both_databases);
218
aws->create_autosize_button("RENAME_DATABASES", "Synchronize");
220
aws->button_length(0);
221
aws->shadow_width(1);
223
aws->callback(makeHelpCallback("mg_names.hlp"));
224
aws->create_button("HELP_MERGE", "#merge/icon.xpm");