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,&not_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,&not_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>&nbsp;&nbsp;"
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          " &nbsp; &nbsp;<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