1 /*
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government have not placed any restriction on its use or reproduction.
13 *
14 * Although all reasonable efforts have been taken to ensure the accuracy
15 * and reliability of the software and data, the NLM and the U.S.
16 * Government do not and cannot warrant the performance or results that
17 * may be obtained by using this software or data. The NLM and the U.S.
18 * Government disclaim all warranties, express or implied, including
19 * warranties of performance, merchantability or fitness for any particular
20 * purpose.
21 *
22 * Please cite the author in any work or product based on this material.
23 *
24 * ===========================================================================
25 *
26 * File Name: id1arch.c
27 *
28 * Author: Eugene Yaschenko
29 */
30
31 #include <sequtil.h>
32 #include <ncbinet.h>
33 #include <objsset.h>
34 #include <objsub.h>
35 #include <id1gen.h>
36 #include <id1arch.h>
37
38
39 static ID1serverBackPtr NetID1servReadAsn PROTO((void));
40 static Boolean ReestablishNetID1Arch PROTO((void));
41 static Boolean NetInit PROTO((void));
42 static Boolean ForceNetInit PROTO((void));
43 static Boolean NetFini PROTO((void));
44 static Boolean GenericReestablishNet PROTO((CharPtr svcName, Boolean showErrs));
45 static SeqIdPtr s_ID1ArchSeqIdsGet PROTO((Uint4 gi,AsnIoPtr aiopr,Boolean PNTR not_found));
46 static SeqEntryPtr s_ID1ArchSeqEntryGet PROTO((Int4 uid, CharPtr db, Int4 ent,Int4Ptr status, Int2 maxplex));
47 static Int4 s_ID1ArcgGIStateGet PROTO((Uint4 gi));
48 static ID1SeqHistPtr s_ID1ArchGIHistGet PROTO((Uint4 gi,Boolean rev,AsnIoPtr aiopr,Boolean PNTR not_found));
49
50 static NI_HandPtr svcp = NULL;
51 static AsnIoPtr asnin = NULL;
52 static AsnIoPtr asnout = NULL;
53 static Boolean num_attached = 0;
54 static Boolean reallyFinal = TRUE;
55 static NI_DispatcherPtr dispatcher;
56 static Boolean (*myNetInit) PROTO((void));
57
58
59 /*****************************************************************************
60 *
61 * ID1ArchInit ()
62 *
63 *****************************************************************************/
64
ID1ArchInit(void)65 Boolean ID1ArchInit (void)
66
67 {
68
69
70 myNetInit = ID1ArchInit;
71
72 if (! NetInit())
73 return FALSE;
74
75 svcp = NI_GenericGetService(dispatcher, NULL, "ID1", "ID1", TRUE);
76 if (svcp == NULL)
77 {
78 ErrPost(CTX_UNKNOWN, 1, "NI_ServiceGet [%s] (%s)", ni_errlist[ni_errno], ni_errtext);
79 ID1ArchFini();
80 return FALSE;
81 }
82
83 asnin = svcp->raip;
84 AsnIoSetBufsize(asnin,4390);
85 asnout = svcp->waip;
86 return TRUE;
87 }
88
89 /*****************************************************************************
90 *
91 * ID1ArchFini ()
92 *
93 *****************************************************************************/
94
s_ID1ArchFini(void)95 static Boolean s_ID1ArchFini (void)
96
97 {
98 NetFini();
99 return TRUE;
100 }
101
102 /* the only thing done here is to suppress errors */
ID1ArchFini(void)103 Boolean ID1ArchFini (void)
104
105 {
106 return s_ID1ArchFini();
107 }
108
109 static SeqEntryPtr
s_ID1ArchSeqEntryGet(Int4 uid,CharPtr db,Int4 ent,Int4Ptr status,Int2 maxplex)110 s_ID1ArchSeqEntryGet (Int4 uid, CharPtr db, Int4 ent,Int4Ptr status, Int2 maxplex)
111
112 {
113 ID1serverRequestPtr id1reqp;
114 SeqEntryPtr sep;
115 ID1serverMaxcomplexPtr mcp;
116 ID1serverBackPtr id1bp;
117
118
119 if(status)
120 *status=0;
121
122 id1reqp = ValNodeNew(NULL);
123 id1reqp->choice = ID1serverRequest_getsefromgi;
124 mcp = ID1serverMaxcomplexNew();
125 id1reqp->data.ptrvalue = mcp;
126 mcp -> gi = uid;
127 mcp -> maxplex = maxplex;
128 if(ent > 0){
129 mcp->ent = ent;
130 if(db){
131 mcp->sat=StringSave(db);
132 }
133 }
134 ID1serverRequestAsnWrite (id1reqp, asnout, NULL);
135 AsnIoReset(asnout);
136 ID1serverRequestFree (id1reqp);
137
138 SeqMgrHoldIndexing(TRUE);
139 id1bp = NetID1servReadAsn();
140 SeqMgrHoldIndexing(FALSE);
141
142 if (id1bp == NULL)
143 return NULL;
144
145 if (id1bp->choice != ID1serverBack_gotseqentry &&
146 id1bp->choice != ID1serverBack_gotdeadseqentry)
147 {
148 if(status && id1bp->choice == ID1serverBack_error){
149 *status = id1bp->data.intvalue;
150 }
151 ID1serverBackFree (id1bp);
152 return NULL;
153 }
154 if (status != NULL){
155 if (id1bp->choice == ID1serverBack_gotdeadseqentry){
156 * status = 3;
157 }else{
158 * status = 0;
159 }
160 }
161 sep = (SeqEntryPtr) (id1bp->data.ptrvalue);
162 id1bp->data.ptrvalue = NULL; /* for clean free */
163 ID1serverBackFree (id1bp);
164
165 return sep;
166 }
167
168 SeqEntryPtr
ID1ArchSeqEntryGet(Int4 gi,CharPtr db,Int4 ent,Int4Ptr status,Int2 maxplex)169 ID1ArchSeqEntryGet (Int4 gi,CharPtr db, Int4 ent, Int4Ptr status, Int2 maxplex)
170 {
171 Int4 i;
172 SeqEntryPtr sep=NULL;
173 Int4 retval = 0;
174 #if 0
175 if (maxplex < 0 || maxplex > 4){
176 ErrPost(CTX_UNKNOWN, 2, "ID1ArchSeqEntryGet: maxplex(%d) out of range (0-4)", maxplex);
177 return NULL;
178 }
179 #endif
180 for (i = 0; i < ID_SERV_RETRIES; i++){
181 if (i > 0){
182 if (! ReestablishNetID1Arch())
183 break;
184 }
185 sep = s_ID1ArchSeqEntryGet (gi, db, ent, status, maxplex);
186 if (sep) break; /* success */
187 if(status && *status > 0 ) break; /* valid error - no retry */
188 }
189 return sep;
190 }
191
192 static SeqIdPtr
s_ID1ArchSeqIdsGet(Uint4 gi,AsnIoPtr aiopr,Boolean PNTR not_found)193 s_ID1ArchSeqIdsGet (Uint4 gi,AsnIoPtr aiopr, Boolean PNTR not_found)
194 {
195 ID1serverRequestPtr id1reqp;
196 ID1serverBackPtr id1bp;
197 SeqIdPtr sip;
198
199 *not_found=FALSE;
200
201 id1reqp = ValNodeNew(NULL);
202 id1reqp->choice = ID1serverRequest_getseqidsfromgi;
203 id1reqp->data.intvalue = gi;
204 ID1serverRequestAsnWrite (id1reqp, asnout, NULL);
205 AsnIoReset(asnout);
206 ID1serverRequestFree (id1reqp);
207
208 if ((id1bp = NetID1servReadAsn()) == NULL)
209 return NULL;
210
211 if (id1bp->choice != ID1serverBack_ids) {
212 ID1serverBackFree (id1bp);
213 return NULL;
214 }
215 if(aiopr){
216 ID1serverBackAsnWrite(id1bp,aiopr,NULL);
217 AsnIoReset(aiopr);
218 }
219 sip = (id1bp->data.ptrvalue);
220 id1bp->data.ptrvalue = NULL;
221 ID1serverBackFree (id1bp);
222 if(sip==NULL) *not_found=TRUE;
223 return sip;
224 }
225
226 SeqIdPtr
ID1ArchSeqIdsGet(Uint4 gi,AsnIoPtr aiopr)227 ID1ArchSeqIdsGet(Uint4 gi,AsnIoPtr aiopr)
228 {
229 Int4 i;
230 SeqIdPtr sip = NULL;
231 Boolean not_found=FALSE;
232
233 for (i = 0; i < ID_SERV_RETRIES; i++) {
234 if (i > 0) { if (! ReestablishNetID1Arch()) break; }
235
236 sip = s_ID1ArchSeqIdsGet(gi,aiopr,¬_found);
237 if (sip) break; /* success */
238 if (not_found) break; /* not found */
239 }
240 return sip;
241 }
242
243 static ID1SeqHistPtr
s_ID1ArchGIHistGet(Uint4 gi,Boolean rev,AsnIoPtr aiopr,Boolean PNTR not_found)244 s_ID1ArchGIHistGet(Uint4 gi,Boolean rev,AsnIoPtr aiopr,Boolean PNTR not_found)
245 {
246 ID1serverRequestPtr id1reqp;
247 ID1serverBackPtr id1bp;
248
249 ID1SeqHistPtr ishp;
250
251 *not_found=FALSE;
252 id1reqp = ValNodeNew(NULL);
253 id1reqp->choice = rev? ID1serverRequest_getgirev : ID1serverRequest_getgihist;
254 id1reqp->data.intvalue = gi;
255 ID1serverRequestAsnWrite (id1reqp, asnout, NULL);
256 AsnIoReset(asnout);
257 ID1serverRequestFree (id1reqp);
258
259 if ((id1bp = NetID1servReadAsn()) == NULL)
260 return NULL;
261
262 if (id1bp->choice != ID1serverBack_girevhist && id1bp->choice != ID1serverBack_gihist)
263 {
264 ID1serverBackFree (id1bp);
265 return NULL;
266 }
267 if(aiopr){
268 ID1serverBackAsnWrite(id1bp,aiopr,NULL);
269 AsnIoReset(aiopr);
270 }
271 ishp = (id1bp->data.ptrvalue);
272 id1bp->data.ptrvalue = NULL;
273 ID1serverBackFree (id1bp);
274 if(ishp==NULL) *not_found=TRUE;
275 return ishp;
276 }
277
278 ID1SeqHistPtr
ID1ArchGIHistGet(Uint4 gi,Boolean rev,AsnIoPtr aiopr)279 ID1ArchGIHistGet(Uint4 gi,Boolean rev,AsnIoPtr aiopr)
280 {
281 Int4 i;
282 ID1SeqHistPtr ishp = NULL;
283 Boolean not_found=FALSE;
284
285 for (i = 0; i < ID_SERV_RETRIES; i++)
286 {
287 if (i > 0)
288 {
289 if (! ReestablishNetID1Arch())
290 break;
291 }
292
293 ishp = s_ID1ArchGIHistGet(gi,rev,aiopr,¬_found);
294 if (ishp) break; /* success */
295 if(not_found) break; /* not found */
296 }
297 return ishp;
298 }
299
300
301 static Int4
s_ID1ArcgGIStateGet(Uint4 gi)302 s_ID1ArcgGIStateGet(Uint4 gi)
303 {
304 ID1serverRequestPtr id1reqp;
305 ID1serverBackPtr id1bp;
306
307 Int4 state;
308
309 id1reqp = ValNodeNew(NULL);
310 id1reqp->choice = ID1serverRequest_getgistate;
311 id1reqp->data.intvalue = gi;
312 ID1serverRequestAsnWrite (id1reqp, asnout, NULL);
313 AsnIoReset(asnout);
314 ID1serverRequestFree (id1reqp);
315
316 if ((id1bp = NetID1servReadAsn()) == NULL)
317 return -1;
318
319 if (id1bp->choice != ID1serverBack_gistate)
320 {
321 ID1serverBackFree (id1bp);
322 return -1;
323 }
324 state = id1bp->data.intvalue;
325 ID1serverBackFree (id1bp);
326 return state;
327 }
328
329 Int4
ID1ArcgGIStateGet(Uint4 gi)330 ID1ArcgGIStateGet(Uint4 gi)
331 {
332 Int4 state=0,i;
333
334 for (i = 0; i < ID_SERV_RETRIES; i++)
335 {
336 if (i > 0 && !ReestablishNetID1Arch()) break;
337 state = s_ID1ArcgGIStateGet(gi);
338 if (state >=0 ) break; /* success */
339 }
340 return state;
341 }
342
NetID1servReadAsn(void)343 static ID1serverBackPtr NetID1servReadAsn(void)
344 {
345 ID1serverBackPtr id1bp=NULL;
346
347 id1bp = ID1serverBackAsnRead(asnin, NULL);
348
349 if (!id1bp)
350 {
351 ErrPostEx(SEV_ERROR, 0, 0, "Null message read from server");
352 }
353 return id1bp;
354 }
355
ReestablishNetID1Arch(void)356 static Boolean ReestablishNetID1Arch(void)
357 {
358 return GenericReestablishNet("ID1Arch", TRUE);
359 }
360
GenericReestablishNet(CharPtr svcName,Boolean showErrs)361 static Boolean GenericReestablishNet(CharPtr svcName, Boolean showErrs)
362 {
363 Monitor *mon = NULL;
364 Boolean retval;
365 CharPtr buf;
366
367 buf = MemNew(2 * StrLen(svcName) + 60);
368
369 if (showErrs) {
370 sprintf (buf, "Re-establishing %s Service", svcName);
371 mon = MonitorStrNew(buf, 40);
372 sprintf (buf, "Requesting %s service", svcName);
373 MonitorStrValue(mon, buf);
374 }
375 NetFini();
376 retval = TRUE;
377
378 if (! myNetInit())
379 {
380 sprintf (buf, "%s get failed; re-contacting dispatcher", svcName);
381 MonitorStrValue(mon, buf);
382 retval = FALSE;
383 if (ForceNetInit())
384 { /* successfully established contact w/dispatcher */
385 sprintf (buf, "%s get failed; re-requesting %s service",
386 svcName, svcName);
387 MonitorStrValue(mon, buf);
388 retval = myNetInit();
389 }
390 else {
391 ErrPost(CTX_UNKNOWN, 1, "Unable to re-contact dispatcher");
392 if (showErrs) {
393 ErrShow();
394 }
395 }
396 }
397
398 MonitorFree(mon);
399
400 if (! retval )
401 {
402 sprintf (buf, "Unable to re-establish %s service", svcName);
403 ErrPost(CTX_UNKNOWN, 1, buf);
404 if (showErrs) {
405 ErrShow();
406 }
407 }
408
409 MemFree(buf);
410 AsnIoSetBufsize(asnin,4390);
411 return retval;
412 }
413
414 static Boolean
NetInit(void)415 NetInit(void)
416 {
417 if (num_attached++ > 0)
418 return TRUE;
419
420 return ((dispatcher = NI_GenericInit(NULL, NULL, TRUE, NULL, 0)) != NULL);
421 }
422
423
ForceNetInit(void)424 static Boolean ForceNetInit(void)
425 {
426 Boolean retval;
427
428 reallyFinal = FALSE;
429 num_attached = 0; /* force re-attempt to contact dispatcher */
430 retval = NetInit();
431 reallyFinal = TRUE;
432
433 return retval;
434 }
435
NetFini(void)436 static Boolean NetFini(void)
437 {
438 if (num_attached > 0)
439 num_attached--;
440
441 if (num_attached == 0)
442 {
443 NI_ServiceDisconnect(svcp);
444 svcp = NULL;
445 NI_EndServices (dispatcher);
446 dispatcher = NULL;
447 }
448
449 return TRUE;
450 }
451
452
453 static Int4
s_ID1ArchGIGet(SeqIdPtr sip)454 s_ID1ArchGIGet (SeqIdPtr sip)
455 {
456 ID1serverRequestPtr id1reqp;
457 ID1serverBackPtr id1bp;
458 Int4 gi;
459
460 id1reqp = ValNodeNew(NULL);
461 id1reqp->choice = ID1serverRequest_getgi;
462 id1reqp->data.ptrvalue = sip;
463 ID1serverRequestAsnWrite (id1reqp, asnout, NULL);
464 AsnIoReset(asnout);
465 id1reqp->data.ptrvalue = NULL;
466 ID1serverRequestFree (id1reqp);
467
468 if ((id1bp = NetID1servReadAsn()) == NULL)
469 return -1;
470
471 if (id1bp->choice != ID1serverBack_gotgi)
472 {
473 ID1serverBackFree (id1bp);
474 return 0;
475 }
476 gi = (id1bp->data.intvalue);
477 ID1serverBackFree (id1bp);
478
479 return gi;
480 }
481
482 Int4
ID1ArchGIGet(SeqIdPtr sip)483 ID1ArchGIGet (SeqIdPtr sip)
484 {
485 Int4 gi=-1, i;
486 Int4 retval = 0;
487
488 for (i = 0; i < ID_SERV_RETRIES; i++)
489 {
490 if (i > 0)
491 {
492 if (! ReestablishNetID1Arch())
493 break;
494 }
495
496 gi = s_ID1ArchGIGet (sip);
497 if (gi >= 0)
498 break; /* success */
499 }
500 return gi;
501 }
502
503
504
SeqHistPrintTable(ID1SeqHistPtr ishp,FILE PNTR fp)505 void SeqHistPrintTable (ID1SeqHistPtr ishp,FILE PNTR fp)
506 {
507 Char repl_date[20];
508 SeqHistPtr shp;
509 SeqIdPtr sip;
510 Uint4 old_gi=0,ent=0;
511 CharPtr sat=NULL;
512 #ifdef IDFETCH_HTML_OUTPUT
513 Boolean checked=FALSE;
514 if(!ishp){
515 fprintf(fp,"<HR><h2>Gi is not found</h2>");
516 goto END;
517 }
518 fprintf(fp,"<PRE><FORM ACTION=\"http://%s:%s%s\"METHOD=POST" ">%c",
519 getenv("SERVER_NAME"),
520 getenv("SERVER_PORT"),
521 getenv("SCRIPT_NAME"),
522 10);
523 #endif
524 if(ishp){
525 #ifdef IDFETCH_HTML_OUTPUT
526 fprintf(fp,"<b>");
527 fprintf(fp,"%-20s%-20s%-20s\n","GI","Loaded","Select");
528 fprintf(fp,"%-20s%-20s%-20s\n","--","------","------");
529 fprintf(fp,"</b>");
530 #else
531 fprintf(fp,"%-20s%-20s%-10s%-20s\n","GI","Loaded","DB","Retrieval No.");
532 fprintf(fp,"%-20s%-20s%-10s%-20s\n","--","------","--","------------");
533
534 #endif
535
536 for(;ishp;ishp=ishp->next){
537 shp=(SeqHistPtr)ishp->hist;
538 for(sip=shp->replace_ids;sip;sip=sip->next){
539 if(sip->choice == SEQID_GI ){
540 if(old_gi != sip->data.intvalue){
541 old_gi = sip->data.intvalue;
542 }
543 }else if(sip->choice == SEQID_LOCAL){
544 ent = ((ObjectIdPtr)sip->data.ptrvalue)->id;
545 sat = "ID";
546 } else if(sip->choice == SEQID_GENERAL) {
547 ent = ((DbtagPtr)sip->data.ptrvalue)->tag->id;
548 sat = ((DbtagPtr)sip->data.ptrvalue)->db;
549 }
550 }
551 if(shp->replace_date){
552 if(shp->replace_date->data[0]){
553 sprintf(repl_date,"%0.2d/%0.2d/%0.4d",
554 shp->replace_date->data[2],
555 shp->replace_date->data[3],
556 1900+shp->replace_date->data[1]);
557 }else{
558 sprintf(repl_date,"%-20s",shp->replace_date->str);
559 }
560 }else{
561 sprintf(repl_date,"N/A");
562 }
563 fprintf(fp,"%-20d%-20s%",old_gi,repl_date);
564 #ifdef IDFETCH_HTML_OUTPUT
565 fprintf(fp,"<INPUT TYPE=radio NAME=in_gientlist VALUE=\"%d|%s|%d\" %s> ",
566 old_gi,repl_date,ent,checked?"":"CHECKED");
567 fprintf(fp,"<INPUT TYPE=radio NAME=in_gientlist_2 VALUE=\"%d|%s|%d\" %s>\n",
568 old_gi,repl_date,ent,checked?"":"CHECKED");
569 checked = TRUE;
570 #else
571 fprintf(fp,"%-10s%-20d\n",sat,ent);
572 #endif
573 }
574 }
575 #ifdef IDFETCH_HTML_OUTPUT
576 fprintf(fp,"</PRE>");
577 fprintf(fp,"<HR>\n<h3>View Sequence:</h3>\n");
578 fprintf(fp,"<b>Print Form:</b> "
579 "<select NAME=in_format> "
580 "<option> GenBank"
581 "<option> GenPept"
582 "<option> FASTA"
583 "<option> ASN.1"
584 "<option> GbDiff"
585 "</select>");
586 fprintf(fp,"<BR><INPUT TYPE=\"checkbox\" NAME=in_full VALUE=\"checked\">"
587 " <b>Get full record (including other gis</b>)"
588 "<BR><BR>");
589 fprintf(fp,"<INPUT TYPE = \"submit\" VALUE = \"Display\">");
590 fprintf(fp,"</FORM>");
591 END:
592 1==1;
593 #endif
594 }
id_print_gi_state(Int4 state,CharPtr buf,Uint1 len)595 void id_print_gi_state(Int4 state,CharPtr buf,Uint1 len)
596 {
597 Int4 dlen;
598 switch(state & 0xff){
599 case 0:
600 strncpy(buf,"NOT EXIST ",len-1);
601 break;
602 case 10:
603 strncpy(buf,"DELETED ",len-1);
604 break;
605 case 20:
606 strncpy(buf,"REPLACED ",len-1);
607 break;
608 case 40:
609 strncpy(buf,"LIVE ",len-1);
610 break;
611 default:
612 strncpy(buf,"UNKNOWN",len-1);
613 break;
614 }
615 dlen = strlen(buf);
616 if(state & GI_IS_SUPPRESSED){
617 strncpy(buf+dlen,"|SUPPRESSED",len - dlen - 1);
618 }
619 dlen = strlen(buf);
620 if(state & GI_IS_OVERRIDEN){
621 strncpy(buf+dlen,"|WITHDRAWN",len - dlen - 1);
622 }
623 dlen = strlen(buf);
624 if(state & GI_IS_CONFIDENTIAL){
625 strncpy(buf+dlen,"|CONFIDENTIAL",len - dlen - 1);
626 }
627 }
628