1 /* @source ensanalysis ********************************************************
2 **
3 ** Ensembl Analysis functions
4 **
5 ** @author Copyright (C) 1999 Ensembl Developers
6 ** @author Copyright (C) 2006 Michael K. Schuster
7 ** @version $Revision: 1.59 $
8 ** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
9 ** @modified $Date: 2013/02/17 13:02:10 $ by $Author: mks $
10 ** @@
11 **
12 ** This library is free software; you can redistribute it and/or
13 ** modify it under the terms of the GNU Lesser General Public
14 ** License as published by the Free Software Foundation; either
15 ** version 2.1 of the License, or (at your option) any later version.
16 **
17 ** This library is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 ** Lesser General Public License for more details.
21 **
22 ** You should have received a copy of the GNU Lesser General Public
23 ** License along with this library; if not, write to the Free Software
24 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 ** MA  02110-1301,  USA.
26 **
27 ******************************************************************************/
28 
29 /* ========================================================================= */
30 /* ============================= include files ============================= */
31 /* ========================================================================= */
32 
33 #include "ensanalysis.h"
34 #include "enstable.h"
35 
36 
37 
38 
39 /* ========================================================================= */
40 /* =============================== constants =============================== */
41 /* ========================================================================= */
42 
43 
44 
45 
46 /* ========================================================================= */
47 /* =========================== global variables ============================ */
48 /* ========================================================================= */
49 
50 
51 
52 
53 /* ========================================================================= */
54 /* ============================= private data ============================== */
55 /* ========================================================================= */
56 
57 
58 
59 
60 /* ========================================================================= */
61 /* =========================== private constants =========================== */
62 /* ========================================================================= */
63 
64 /* @conststatic analysisadaptorKTablenames ************************************
65 **
66 ** Array of Ensembl Analysis Adaptor SQL table names
67 **
68 ******************************************************************************/
69 
70 static const char *const analysisadaptorKTablenames[] =
71 {
72     "analysis",
73     "analysis_description",
74     (const char *) NULL
75 };
76 
77 
78 
79 
80 /* @conststatic analysisadaptorKColumnnames ***********************************
81 **
82 ** Array of Ensembl Analysis Adaptor SQL column names
83 **
84 ******************************************************************************/
85 
86 static const char *const analysisadaptorKColumnnames[] =
87 {
88     "analysis.analysis_id",
89     "analysis.created",
90     "analysis.logic_name",
91     "analysis.db",
92     "analysis.db_version",
93     "analysis.db_file",
94     "analysis.program",
95     "analysis.program_version",
96     "analysis.program_file",
97     "analysis.parameters",
98     "analysis.module",
99     "analysis.module_version",
100     "analysis.gff_source",
101     "analysis.gff_feature",
102     "analysis_description.description",
103     "analysis_description.display_label",
104     "analysis_description.displayable",
105     "analysis_description.web_data",
106     (const char *) NULL
107 };
108 
109 
110 
111 
112 /* @conststatic analysisadaptorKLeftjoins *************************************
113 **
114 ** Array of Ensembl Analysis Adaptor SQL LEFT JOIN conditions
115 **
116 ******************************************************************************/
117 
118 static const EnsOBaseadaptorLeftjoin analysisadaptorKLeftjoins[] =
119 {
120     {
121         "analysis_description",
122         "analysis.analysis_id = analysis_description.analysis_id"
123     },
124     {(const char *) NULL, (const char *) NULL}
125 };
126 
127 
128 
129 
130 /* @conststatic analysisadaptorKFeatureClasses ********************************
131 **
132 ** Correlation of Ensembl data object types and SQL table names
133 **
134 ******************************************************************************/
135 
136 static const char *const analysisadaptorKFeatureClasses[] =
137 {
138     "AffyFeature", "affy_feature",
139     "Densityfeature", "density_type", /* density_type.analysis_id */
140     "Dnaalignfeature", "dna_align_feature",
141     "Gene", "gene",
142     "Markerfeature", "marker_feature",
143     "Predictiontranscript", "prediction_transcript",
144     "OligoFeature", "oligo_feature",
145     "Proteinalignfeature", "protein_align_feature",
146     "Proteinfeature", "protein_feature",
147     "QtlFeature", "qtl_feature",
148     "Repeatfeature", "repeat_feature",
149     "Simplefeature", "simple_feature",
150     (const char *) NULL, (const char *) NULL
151 };
152 
153 
154 
155 
156 /* ========================================================================= */
157 /* =========================== private variables =========================== */
158 /* ========================================================================= */
159 
160 
161 
162 
163 /* ========================================================================= */
164 /* =========================== private functions =========================== */
165 /* ========================================================================= */
166 
167 static int listAnalysisCompareIdentifierAscending(
168     const void *item1,
169     const void *item2);
170 
171 static int listAnalysisCompareIdentifierDescending(
172     const void *item1,
173     const void *item2);
174 
175 static int listAnalysisCompareNameAscending(
176     const void *item1,
177     const void *item2);
178 
179 static int listAnalysisCompareNameDescending(
180     const void *item1,
181     const void *item2);
182 
183 static AjBool analysisadaptorFetchAllbyStatement(
184     EnsPBaseadaptor ba,
185     const AjPStr statement,
186     EnsPAssemblymapper am,
187     EnsPSlice slice,
188     AjPList analyses);
189 
190 static AjBool analysisadaptorCacheInit(
191     EnsPAnalysisadaptor aa);
192 
193 static AjBool analysisadaptorCacheInsert(
194     EnsPAnalysisadaptor aa,
195     EnsPAnalysis *Panalysis);
196 
197 static void analysisadaptorFetchAll(const void *key,
198                                     void **Pvalue,
199                                     void *cl);
200 
201 
202 
203 
204 /* ========================================================================= */
205 /* ======================= All functions by section ======================== */
206 /* ========================================================================= */
207 
208 
209 
210 
211 /* @filesection ensanalysis ***************************************************
212 **
213 ** @nam1rule ens Function belongs to the Ensembl library
214 **
215 ******************************************************************************/
216 
217 
218 
219 
220 /* @datasection [EnsPAnalysis] Ensembl Analysis *******************************
221 **
222 ** @nam2rule Analysis Functions for manipulating Ensembl Analysis objects
223 **
224 ** @cc Bio::EnsEMBL::Analysis
225 ** @cc CVS Revision: 1.33
226 ** @cc CVS Tag: branch-ensembl-68
227 **
228 ******************************************************************************/
229 
230 
231 
232 
233 /* @section constructors ******************************************************
234 **
235 ** All constructors return a new Ensembl Analysis by pointer.
236 ** It is the responsibility of the user to first destroy any previous
237 ** Ensembl Analysis.
238 ** The target pointer does not need to be initialised to NULL, but it is good
239 ** programming practice to do so anyway.
240 **
241 ** @fdata [EnsPAnalysis]
242 **
243 ** @nam3rule New Constructor
244 ** @nam4rule Cpy Constructor with existing object
245 ** @nam4rule Ini Constructor with initial values
246 ** @nam4rule Ref Constructor by incrementing the reference counter
247 **
248 ** @argrule Cpy analysis [const EnsPAnalysis] Ensembl Analysis
249 ** @argrule Ini aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
250 ** @argrule Ini identifier [ajuint] SQL database-internal identifier
251 ** @argrule Ini cdate [AjPStr] Creation date
252 ** @argrule Ini name [AjPStr] Name
253 ** @argrule Ini databasename [AjPStr] Database name
254 ** @argrule Ini databaseversion [AjPStr] Database version
255 ** @argrule Ini databasefile [AjPStr] Database file
256 ** @argrule Ini programname [AjPStr] Program name
257 ** @argrule Ini programversion [AjPStr] Program version
258 ** @argrule Ini programfile [AjPStr] Program file
259 ** @argrule Ini parameters [AjPStr] Parameters
260 ** @argrule Ini modulename [AjPStr] Module name
261 ** @argrule Ini moduleversion [AjPStr] Module version
262 ** @argrule Ini gffsource [AjPStr] GFF source
263 ** @argrule Ini gfffeature [AjPStr] GFF feature
264 ** @argrule Ini description [AjPStr] Description
265 ** @argrule Ini displaylabel [AjPStr] Display label
266 ** @argrule Ini webdata [AjPStr] Web data
267 ** @argrule Ini displayable [AjBool] Displayable flag
268 ** @argrule Ref analysis [EnsPAnalysis] Ensembl Analysis
269 **
270 ** @valrule * [EnsPAnalysis] Ensembl Analysis or NULL
271 **
272 ** @fcategory new
273 ******************************************************************************/
274 
275 
276 
277 
278 /* @func ensAnalysisNewCpy ****************************************************
279 **
280 ** Object-based constructor function, which returns an independent object.
281 **
282 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
283 **
284 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
285 **
286 ** @release 6.4.0
287 ** @@
288 ******************************************************************************/
289 
ensAnalysisNewCpy(const EnsPAnalysis analysis)290 EnsPAnalysis ensAnalysisNewCpy(const EnsPAnalysis analysis)
291 {
292     EnsPAnalysis pthis = NULL;
293 
294     if (!analysis)
295         return NULL;
296 
297     AJNEW0(pthis);
298 
299     pthis->Use = 1U;
300 
301     pthis->Identifier = analysis->Identifier;
302 
303     pthis->Adaptor = analysis->Adaptor;
304 
305     if (analysis->DateCreation)
306         pthis->DateCreation = ajStrNewRef(analysis->DateCreation);
307 
308     if (analysis->Name)
309         pthis->Name = ajStrNewRef(analysis->Name);
310 
311     if (analysis->Databasename)
312         pthis->Databasename = ajStrNewRef(analysis->Databasename);
313 
314     if (analysis->Databaseversion)
315         pthis->Databaseversion = ajStrNewRef(analysis->Databaseversion);
316 
317     if (analysis->Databasefile)
318         pthis->Databasefile = ajStrNewRef(analysis->Databasefile);
319 
320     if (analysis->Programname)
321         pthis->Programname = ajStrNewRef(analysis->Programname);
322 
323     if (analysis->Programversion)
324         pthis->Programversion = ajStrNewRef(analysis->Programversion);
325 
326     if (analysis->Programfile)
327         pthis->Programfile = ajStrNewRef(analysis->Programfile);
328 
329     if (analysis->Parameters)
330         pthis->Parameters = ajStrNewRef(analysis->Parameters);
331 
332     if (analysis->Modulename)
333         pthis->Modulename = ajStrNewRef(analysis->Modulename);
334 
335     if (analysis->Moduleversion)
336         pthis->Moduleversion = ajStrNewRef(analysis->Moduleversion);
337 
338     if (analysis->Gffsource)
339         pthis->Gffsource = ajStrNewRef(analysis->Gffsource);
340 
341     if (analysis->Gfffeature)
342         pthis->Gfffeature = ajStrNewRef(analysis->Gfffeature);
343 
344     if (analysis->Description)
345         pthis->Description = ajStrNewRef(analysis->Description);
346 
347     if (analysis->Displaylabel)
348         pthis->Displaylabel = ajStrNewRef(analysis->Displaylabel);
349 
350     if (analysis->Webdata)
351         pthis->Webdata = ajStrNewRef(analysis->Webdata);
352 
353     pthis->Displayable = analysis->Displayable;
354 
355     return pthis;
356 }
357 
358 
359 
360 
361 /* @func ensAnalysisNewIni ****************************************************
362 **
363 ** Constructor for an Ensembl Analysis object with initial values.
364 **
365 ** @cc Bio::EnsEMBL::Storable::new
366 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
367 ** @param [r] identifier [ajuint] SQL database-internal identifier
368 ** @cc Bio::EnsEMBL::Analysis::new
369 ** @param [u] cdate [AjPStr] Creation date
370 ** @param [u] name [AjPStr] Name
371 ** @param [u] databasename [AjPStr] Database name
372 ** @param [u] databaseversion [AjPStr] Database version
373 ** @param [u] databasefile [AjPStr] Database file
374 ** @param [u] programname [AjPStr] Program name
375 ** @param [u] programversion [AjPStr] Program version
376 ** @param [u] programfile [AjPStr] Program file
377 ** @param [u] parameters [AjPStr] Parameters
378 ** @param [u] modulename [AjPStr] Module name
379 ** @param [u] moduleversion [AjPStr] Module version
380 ** @param [u] gffsource [AjPStr] GFF source
381 ** @param [u] gfffeature [AjPStr] GFF feature
382 ** @param [u] description [AjPStr] Description
383 ** @param [u] displaylabel [AjPStr] Display label
384 ** @param [u] webdata [AjPStr] Web data
385 ** @param [r] displayable [AjBool] Displayable flag
386 **
387 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
388 **
389 ** @release 6.4.0
390 ** @@
391 ******************************************************************************/
392 
ensAnalysisNewIni(EnsPAnalysisadaptor aa,ajuint identifier,AjPStr cdate,AjPStr name,AjPStr databasename,AjPStr databaseversion,AjPStr databasefile,AjPStr programname,AjPStr programversion,AjPStr programfile,AjPStr parameters,AjPStr modulename,AjPStr moduleversion,AjPStr gffsource,AjPStr gfffeature,AjPStr description,AjPStr displaylabel,AjPStr webdata,AjBool displayable)393 EnsPAnalysis ensAnalysisNewIni(EnsPAnalysisadaptor aa,
394                                ajuint identifier,
395                                AjPStr cdate,
396                                AjPStr name,
397                                AjPStr databasename,
398                                AjPStr databaseversion,
399                                AjPStr databasefile,
400                                AjPStr programname,
401                                AjPStr programversion,
402                                AjPStr programfile,
403                                AjPStr parameters,
404                                AjPStr modulename,
405                                AjPStr moduleversion,
406                                AjPStr gffsource,
407                                AjPStr gfffeature,
408                                AjPStr description,
409                                AjPStr displaylabel,
410                                AjPStr webdata,
411                                AjBool displayable)
412 {
413     EnsPAnalysis analysis = NULL;
414 
415     if (!name)
416         return NULL;
417 
418     AJNEW0(analysis);
419 
420     analysis->Use = 1U;
421 
422     analysis->Identifier = identifier;
423 
424     analysis->Adaptor = aa;
425 
426     if (cdate)
427         analysis->DateCreation = ajStrNewRef(cdate);
428 
429     if (name)
430         analysis->Name = ajStrNewRef(name);
431 
432     if (databasename)
433         analysis->Databasename = ajStrNewRef(databasename);
434 
435     if (databaseversion)
436         analysis->Databaseversion = ajStrNewRef(databaseversion);
437 
438     if (databasefile)
439         analysis->Databasefile = ajStrNewRef(databasefile);
440 
441     if (programname)
442         analysis->Programname = ajStrNewRef(programname);
443 
444     if (programversion)
445         analysis->Programversion = ajStrNewRef(programversion);
446 
447     if (programfile)
448         analysis->Programfile = ajStrNewRef(programfile);
449 
450     if (parameters)
451         analysis->Parameters = ajStrNewRef(parameters);
452 
453     if (modulename)
454         analysis->Modulename = ajStrNewRef(modulename);
455 
456     if (moduleversion)
457         analysis->Moduleversion = ajStrNewRef(moduleversion);
458 
459     if (gffsource)
460         analysis->Gffsource = ajStrNewRef(gffsource);
461 
462     if (gfffeature)
463         analysis->Gfffeature = ajStrNewRef(gfffeature);
464 
465     if (description)
466         analysis->Description = ajStrNewRef(description);
467 
468     if (displaylabel)
469         analysis->Displaylabel = ajStrNewRef(displaylabel);
470 
471     analysis->Displayable = displayable;
472 
473     if (webdata)
474         analysis->Webdata = ajStrNewRef(webdata);
475 
476     return analysis;
477 }
478 
479 
480 
481 
482 /* @func ensAnalysisNewRef ****************************************************
483 **
484 ** Ensembl Object referencing function, which returns a pointer to the
485 ** Ensembl Object passed in and increases its reference count.
486 **
487 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
488 **
489 ** @return [EnsPAnalysis] Ensembl Analysis or NULL
490 **
491 ** @release 6.2.0
492 ** @@
493 ******************************************************************************/
494 
ensAnalysisNewRef(EnsPAnalysis analysis)495 EnsPAnalysis ensAnalysisNewRef(EnsPAnalysis analysis)
496 {
497     if (!analysis)
498         return NULL;
499 
500     analysis->Use++;
501 
502     return analysis;
503 }
504 
505 
506 
507 
508 /* @section destructors *******************************************************
509 **
510 ** Destruction destroys all internal data structures and frees the memory
511 ** allocated for an Ensembl Analysis object.
512 **
513 ** @fdata [EnsPAnalysis]
514 **
515 ** @nam3rule Del Destroy (free) an Ensembl Analysis
516 **
517 ** @argrule * Panalysis [EnsPAnalysis*] Ensembl Analysis address
518 **
519 ** @valrule * [void]
520 **
521 ** @fcategory delete
522 ******************************************************************************/
523 
524 
525 
526 
527 /* @func ensAnalysisDel *******************************************************
528 **
529 ** Default destructor for an Ensembl Analysis.
530 **
531 ** @param [d] Panalysis [EnsPAnalysis*] Ensembl Analysis address
532 **
533 ** @return [void]
534 **
535 ** @release 6.2.0
536 ** @@
537 ******************************************************************************/
538 
ensAnalysisDel(EnsPAnalysis * Panalysis)539 void ensAnalysisDel(EnsPAnalysis *Panalysis)
540 {
541     EnsPAnalysis pthis = NULL;
542 
543     if (!Panalysis)
544         return;
545 
546 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
547     if (ajDebugTest("ensAnalysisDel"))
548     {
549         ajDebug("ensAnalysisDel\n"
550                 "  *Panalysis %p\n",
551                 *Panalysis);
552 
553         ensAnalysisTrace(*Panalysis, 1);
554     }
555 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
556 
557     if (!(pthis = *Panalysis) || --pthis->Use)
558     {
559         *Panalysis = NULL;
560 
561         return;
562     }
563 
564     ajStrDel(&pthis->DateCreation);
565     ajStrDel(&pthis->Name);
566     ajStrDel(&pthis->Databasename);
567     ajStrDel(&pthis->Databaseversion);
568     ajStrDel(&pthis->Databasefile);
569     ajStrDel(&pthis->Programname);
570     ajStrDel(&pthis->Programversion);
571     ajStrDel(&pthis->Programfile);
572     ajStrDel(&pthis->Parameters);
573     ajStrDel(&pthis->Modulename);
574     ajStrDel(&pthis->Moduleversion);
575     ajStrDel(&pthis->Gffsource);
576     ajStrDel(&pthis->Gfffeature);
577     ajStrDel(&pthis->Description);
578     ajStrDel(&pthis->Displaylabel);
579     ajStrDel(&pthis->Webdata);
580 
581     ajMemFree((void **) Panalysis);
582 
583     return;
584 }
585 
586 
587 
588 
589 /* @section member retrieval **************************************************
590 **
591 ** Functions for returning members of an Ensembl Analysis object.
592 **
593 ** @fdata [EnsPAnalysis]
594 **
595 ** @nam3rule Get Return Ensembl Analysis attribute(s)
596 ** @nam4rule Adaptor Return the Ensembl Analysis Adaptor
597 ** @nam4rule Databasefile Return the database file
598 ** @nam4rule Databasename Return the database name
599 ** @nam4rule Databaseversion Return the database version
600 ** @nam4rule Date Return a date
601 ** @nam5rule Creation Return the date of creation
602 ** @nam4rule Description Return the description
603 ** @nam4rule Displayable Return the displayable flag
604 ** @nam4rule Displaylabel Return the display label
605 ** @nam4rule Gfffeature Return the GFF feature
606 ** @nam4rule Gffsource Return the GFF source
607 ** @nam4rule Identifier Return the SQL database-internal identifier
608 ** @nam4rule Modulename Return the module name
609 ** @nam4rule Moduleversion Return the module version
610 ** @nam4rule Name Return the name
611 ** @nam4rule Parameters Return the parameters
612 ** @nam4rule Programfile Return the program file
613 ** @nam4rule Programname Return the program name
614 ** @nam4rule Programversion Return the program version
615 ** @nam4rule Webdata Return the web data
616 **
617 ** @argrule * analysis [const EnsPAnalysis] Ensembl Analysis
618 **
619 ** @valrule Adaptor [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
620 ** @valrule Databasefile [AjPStr] Database file or NULL
621 ** @valrule Databasename [AjPStr] Database name or NULL
622 ** @valrule Databaseversion [AjPStr] Database version or NULL
623 ** @valrule DateCreation [AjPStr] Creation date or NULL
624 ** @valrule Description [AjPStr] Description or NULL
625 ** @valrule Displayable [AjBool] Displayable flag or ajFalse
626 ** @valrule Displaylabel [AjPStr] Display label or NULL
627 ** @valrule Gfffeature [AjPStr] GFF feature or NULL
628 ** @valrule Gffsource [AjPStr] GFF source or NULL
629 ** @valrule Identifier [ajuint] SQL database-internal identifier or 0U
630 ** @valrule Modulename [AjPStr] Module name or NULL
631 ** @valrule Moduleversion [AjPStr] Module version or NULL
632 ** @valrule Name [AjPStr] Name or NULL
633 ** @valrule Parameters [AjPStr] Parameters or NULL
634 ** @valrule Programfile [AjPStr] Program file or NULL
635 ** @valrule Programname [AjPStr] Program name or NULL
636 ** @valrule Programversion [AjPStr] Program version or NULL
637 ** @valrule Webdata [AjPStr] Web data or NULL
638 **
639 ** @fcategory use
640 ******************************************************************************/
641 
642 
643 
644 
645 /* @func ensAnalysisGetAdaptor ************************************************
646 **
647 ** Get the Ensembl Analysis Adaptor member of an Ensembl Analysis.
648 **
649 ** @cc Bio::EnsEMBL::Storable::adaptor
650 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
651 **
652 ** @return [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
653 **
654 ** @release 6.2.0
655 ** @@
656 ******************************************************************************/
657 
ensAnalysisGetAdaptor(const EnsPAnalysis analysis)658 EnsPAnalysisadaptor ensAnalysisGetAdaptor(const EnsPAnalysis analysis)
659 {
660     return (analysis) ? analysis->Adaptor : NULL;
661 }
662 
663 
664 
665 
666 /* @func ensAnalysisGetDatabasefile *******************************************
667 **
668 ** Get the database file member of an Ensembl Analysis.
669 **
670 ** @cc Bio::EnsEMBL::Analysis::db_file
671 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
672 **
673 ** @return [AjPStr] Database file or NULL
674 **
675 ** @release 6.3.0
676 ** @@
677 ******************************************************************************/
678 
ensAnalysisGetDatabasefile(const EnsPAnalysis analysis)679 AjPStr ensAnalysisGetDatabasefile(const EnsPAnalysis analysis)
680 {
681     return (analysis) ? analysis->Databasefile : NULL;
682 }
683 
684 
685 
686 
687 /* @func ensAnalysisGetDatabasename *******************************************
688 **
689 ** Get the database name member of an Ensembl Analysis.
690 **
691 ** @cc Bio::EnsEMBL::Analysis::db
692 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
693 **
694 ** @return [AjPStr] Database name or NULL
695 **
696 ** @release 6.3.0
697 ** @@
698 ******************************************************************************/
699 
ensAnalysisGetDatabasename(const EnsPAnalysis analysis)700 AjPStr ensAnalysisGetDatabasename(const EnsPAnalysis analysis)
701 {
702     return (analysis) ? analysis->Databasename : NULL;
703 }
704 
705 
706 
707 
708 /* @func ensAnalysisGetDatabaseversion ****************************************
709 **
710 ** Get the database version member of an Ensembl Analysis.
711 **
712 ** @cc Bio::EnsEMBL::Analysis::db_version
713 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
714 **
715 ** @return [AjPStr] Database version or NULL
716 **
717 ** @release 6.3.0
718 ** @@
719 ******************************************************************************/
720 
ensAnalysisGetDatabaseversion(const EnsPAnalysis analysis)721 AjPStr ensAnalysisGetDatabaseversion(const EnsPAnalysis analysis)
722 {
723     return (analysis) ? analysis->Databaseversion : NULL;
724 }
725 
726 
727 
728 
729 /* @func ensAnalysisGetDateCreation *******************************************
730 **
731 ** Get the date of creation member of an Ensembl Analysis.
732 **
733 ** @cc Bio::EnsEMBL::Analysis::created
734 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
735 **
736 ** @return [AjPStr] Creation date or NULL
737 **
738 ** @release 6.4.0
739 ** @@
740 ******************************************************************************/
741 
ensAnalysisGetDateCreation(const EnsPAnalysis analysis)742 AjPStr ensAnalysisGetDateCreation(const EnsPAnalysis analysis)
743 {
744     return (analysis) ? analysis->DateCreation : NULL;
745 }
746 
747 
748 
749 
750 /* @func ensAnalysisGetDescription ********************************************
751 **
752 ** Get the description member of an Ensembl Analysis.
753 **
754 ** @cc Bio::EnsEMBL::Analysis::description
755 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
756 **
757 ** @return [AjPStr] Description or NULL
758 **
759 ** @release 6.2.0
760 ** @@
761 ******************************************************************************/
762 
ensAnalysisGetDescription(const EnsPAnalysis analysis)763 AjPStr ensAnalysisGetDescription(const EnsPAnalysis analysis)
764 {
765     return (analysis) ? analysis->Description : NULL;
766 }
767 
768 
769 
770 
771 /* @func ensAnalysisGetDisplayable ********************************************
772 **
773 ** Get the displayable member of an Ensembl Analysis.
774 **
775 ** @cc Bio::EnsEMBL::Analysis::displayable
776 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
777 **
778 ** @return [AjBool] Displayable flag or ajFalse
779 **
780 ** @release 6.2.0
781 ** @@
782 ******************************************************************************/
783 
ensAnalysisGetDisplayable(const EnsPAnalysis analysis)784 AjBool ensAnalysisGetDisplayable(const EnsPAnalysis analysis)
785 {
786     return (analysis) ? analysis->Displayable : ajFalse;
787 }
788 
789 
790 
791 
792 /* @func ensAnalysisGetDisplaylabel *******************************************
793 **
794 ** Get the display label member of an Ensembl Analysis.
795 **
796 ** @cc Bio::EnsEMBL::Analysis::display_label
797 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
798 **
799 ** @return [AjPStr] Display label or NULL
800 **
801 ** @release 6.3.0
802 ** @@
803 ******************************************************************************/
804 
ensAnalysisGetDisplaylabel(const EnsPAnalysis analysis)805 AjPStr ensAnalysisGetDisplaylabel(const EnsPAnalysis analysis)
806 {
807     return (analysis) ? analysis->Displaylabel : NULL;
808 }
809 
810 
811 
812 
813 /* @func ensAnalysisGetGfffeature *********************************************
814 **
815 ** Get the GFF feature member of an Ensembl Analysis.
816 **
817 ** @cc Bio::EnsEMBL::Analysis::gff_feature
818 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
819 **
820 ** @return [AjPStr] GFF feature or NULL
821 **
822 ** @release 6.3.0
823 ** @@
824 ******************************************************************************/
825 
ensAnalysisGetGfffeature(const EnsPAnalysis analysis)826 AjPStr ensAnalysisGetGfffeature(const EnsPAnalysis analysis)
827 {
828     return (analysis) ? analysis->Gfffeature : NULL;
829 }
830 
831 
832 
833 
834 /* @func ensAnalysisGetGffsource **********************************************
835 **
836 ** Get the GFF source member of an Ensembl Analysis.
837 **
838 ** @cc Bio::EnsEMBL::Analysis::gff_source
839 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
840 **
841 ** @return [AjPStr] GFF source or NULL
842 **
843 ** @release 6.3.0
844 ** @@
845 ******************************************************************************/
846 
ensAnalysisGetGffsource(const EnsPAnalysis analysis)847 AjPStr ensAnalysisGetGffsource(const EnsPAnalysis analysis)
848 {
849     return (analysis) ? analysis->Gffsource : NULL;
850 }
851 
852 
853 
854 
855 /* @func ensAnalysisGetIdentifier *********************************************
856 **
857 ** Get the SQL database-internal identifier member of an Ensembl Analysis.
858 **
859 ** @cc Bio::EnsEMBL::Storable::dbID
860 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
861 **
862 ** @return [ajuint] SQL database-internal identifier or 0U
863 **
864 ** @release 6.2.0
865 ** @@
866 ******************************************************************************/
867 
ensAnalysisGetIdentifier(const EnsPAnalysis analysis)868 ajuint ensAnalysisGetIdentifier(const EnsPAnalysis analysis)
869 {
870     return (analysis) ? analysis->Identifier : 0U;
871 }
872 
873 
874 
875 
876 /* @func ensAnalysisGetModulename *********************************************
877 **
878 ** Get the module name member of an Ensembl Analysis.
879 **
880 ** @cc Bio::EnsEMBL::Analysis::module
881 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
882 **
883 ** @return [AjPStr] Module name or NULL
884 **
885 ** @release 6.3.0
886 ** @@
887 ******************************************************************************/
888 
ensAnalysisGetModulename(const EnsPAnalysis analysis)889 AjPStr ensAnalysisGetModulename(const EnsPAnalysis analysis)
890 {
891     return (analysis) ? analysis->Modulename : NULL;
892 }
893 
894 
895 
896 
897 /* @func ensAnalysisGetModuleversion ******************************************
898 **
899 ** Get the module version member of an Ensembl Analysis.
900 **
901 ** @cc Bio::EnsEMBL::Analysis::module_version
902 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
903 **
904 ** @return [AjPStr] Module version or NULL
905 **
906 ** @release 6.3.0
907 ** @@
908 ******************************************************************************/
909 
ensAnalysisGetModuleversion(const EnsPAnalysis analysis)910 AjPStr ensAnalysisGetModuleversion(const EnsPAnalysis analysis)
911 {
912     return (analysis) ? analysis->Moduleversion : NULL;
913 }
914 
915 
916 
917 
918 /* @func ensAnalysisGetName ***************************************************
919 **
920 ** Get the name member of an Ensembl Analysis.
921 **
922 ** @cc Bio::EnsEMBL::Analysis::logic_name
923 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
924 **
925 ** @return [AjPStr] Name or NULL
926 **
927 ** @release 6.2.0
928 ** @@
929 ******************************************************************************/
930 
ensAnalysisGetName(const EnsPAnalysis analysis)931 AjPStr ensAnalysisGetName(const EnsPAnalysis analysis)
932 {
933     return (analysis) ? analysis->Name : NULL;
934 }
935 
936 
937 
938 
939 /* @func ensAnalysisGetParameters *********************************************
940 **
941 ** Get the parameters member of an Ensembl Analysis.
942 **
943 ** @cc Bio::EnsEMBL::Analysis::parameters
944 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
945 **
946 ** @return [AjPStr] Parameters or NULL
947 **
948 ** @release 6.2.0
949 ** @@
950 ******************************************************************************/
951 
ensAnalysisGetParameters(const EnsPAnalysis analysis)952 AjPStr ensAnalysisGetParameters(const EnsPAnalysis analysis)
953 {
954     return (analysis) ? analysis->Parameters : NULL;
955 }
956 
957 
958 
959 
960 /* @func ensAnalysisGetProgramfile ********************************************
961 **
962 ** Get the program file member of an Ensembl Analysis.
963 **
964 ** @cc Bio::EnsEMBL::Analysis::program_file
965 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
966 **
967 ** @return [AjPStr] Program file or NULL
968 **
969 ** @release 6.3.0
970 ** @@
971 ******************************************************************************/
972 
ensAnalysisGetProgramfile(const EnsPAnalysis analysis)973 AjPStr ensAnalysisGetProgramfile(const EnsPAnalysis analysis)
974 {
975     return (analysis) ? analysis->Programfile : NULL;
976 }
977 
978 
979 
980 
981 /* @func ensAnalysisGetProgramname ********************************************
982 **
983 ** Get the program name member of an Ensembl Analysis.
984 **
985 ** @cc Bio::EnsEMBL::Analysis::program
986 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
987 **
988 ** @return [AjPStr] Program name or NULL
989 **
990 ** @release 6.3.0
991 ** @@
992 ******************************************************************************/
993 
ensAnalysisGetProgramname(const EnsPAnalysis analysis)994 AjPStr ensAnalysisGetProgramname(const EnsPAnalysis analysis)
995 {
996     return (analysis) ? analysis->Programname : NULL;
997 }
998 
999 
1000 
1001 
1002 /* @func ensAnalysisGetProgramversion *****************************************
1003 **
1004 ** Get the program version member of an Ensembl Analysis.
1005 **
1006 ** @cc Bio::EnsEMBL::Analysis::program_version
1007 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1008 **
1009 ** @return [AjPStr] Program version or NULL
1010 **
1011 ** @release 6.3.0
1012 ** @@
1013 ******************************************************************************/
1014 
ensAnalysisGetProgramversion(const EnsPAnalysis analysis)1015 AjPStr ensAnalysisGetProgramversion(const EnsPAnalysis analysis)
1016 {
1017     return (analysis) ? analysis->Programversion : NULL;
1018 }
1019 
1020 
1021 
1022 
1023 
1024 /* @func ensAnalysisGetWebdata ************************************************
1025 **
1026 ** Get the web data member of an Ensembl Analysis.
1027 **
1028 ** @cc Bio::EnsEMBL::Analysis::web_data
1029 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1030 **
1031 ** @return [AjPStr] Web data or NULL
1032 **
1033 ** @release 6.3.0
1034 ** @@
1035 ******************************************************************************/
1036 
ensAnalysisGetWebdata(const EnsPAnalysis analysis)1037 AjPStr ensAnalysisGetWebdata(const EnsPAnalysis analysis)
1038 {
1039     return (analysis) ? analysis->Webdata : NULL;
1040 }
1041 
1042 
1043 
1044 
1045 /* @section member assignment *************************************************
1046 **
1047 ** Functions for assigning members of an Ensembl Analysis object.
1048 **
1049 ** @fdata [EnsPAnalysis]
1050 **
1051 ** @nam3rule Set Set one member of an Ensembl Analysis
1052 ** @nam4rule Adaptor Set the Ensembl Analysis Adaptor
1053 ** @nam4rule Databasefile Set the database file
1054 ** @nam4rule Databasename Set the database name
1055 ** @nam4rule Databaseversion Set the database version
1056 ** @nam4rule Date Set a date
1057 ** @nam5rule Creation Set the date of creation
1058 ** @nam4rule Description Set the description
1059 ** @nam4rule Displayable Set the displayable flag
1060 ** @nam4rule Displaylabel Set the display label
1061 ** @nam4rule Gfffeature Set the GFF feature
1062 ** @nam4rule Gffsource Set the GFF source
1063 ** @nam4rule Identifier Set the SQL database-internal identifier
1064 ** @nam4rule Modulename Set the module name
1065 ** @nam4rule Moduleversion Set the module version
1066 ** @nam4rule Name Set the name
1067 ** @nam4rule Parameters Set the parameters
1068 ** @nam4rule Programfile Set the program file
1069 ** @nam4rule Programname Set the program name
1070 ** @nam4rule Programversion Set the program version
1071 ** @nam4rule Webdata Set the web data
1072 **
1073 ** @argrule * analysis [EnsPAnalysis] Ensembl Analysis object
1074 ** @argrule Adaptor aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
1075 ** @argrule Databasefile databasefile [AjPStr] Database file
1076 ** @argrule Databasename databasename [AjPStr] Database name
1077 ** @argrule Databaseversion databaseversion [AjPStr] Database version
1078 ** @argrule DateCreation cdate [AjPStr] Creation date
1079 ** @argrule Description description [AjPStr] Description
1080 ** @argrule Displayable displayable [AjBool] Displayable flag
1081 ** @argrule Displaylabel displaylabel [AjPStr] Display label
1082 ** @argrule Gfffeature gfffeature [AjPStr] GFF feature
1083 ** @argrule Gffsource gffsource [AjPStr] GFF source
1084 ** @argrule Identifier identifier [ajuint] SQL database-internal identifier
1085 ** @argrule Modulename modulename [AjPStr] Module name
1086 ** @argrule Moduleversion moduleversion [AjPStr] Module version
1087 ** @argrule Name name [AjPStr] Name
1088 ** @argrule Parameters parameters [AjPStr] Parameters
1089 ** @argrule Programfile programfile [AjPStr] Program file
1090 ** @argrule Programname programname [AjPStr] Program name
1091 ** @argrule Programversion programversion [AjPStr] Program version
1092 ** @argrule Webdata webdata [AjPStr] Web data
1093 **
1094 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1095 **
1096 ** @fcategory modify
1097 ******************************************************************************/
1098 
1099 
1100 
1101 
1102 /* @func ensAnalysisSetAdaptor ************************************************
1103 **
1104 ** Set the Ensembl Analysis Adaptor member of an Ensembl Analysis.
1105 **
1106 ** @cc Bio::EnsEMBL::Storable::adaptor
1107 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1108 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
1109 **
1110 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1111 **
1112 ** @release 6.2.0
1113 ** @@
1114 ******************************************************************************/
1115 
ensAnalysisSetAdaptor(EnsPAnalysis analysis,EnsPAnalysisadaptor aa)1116 AjBool ensAnalysisSetAdaptor(EnsPAnalysis analysis,
1117                              EnsPAnalysisadaptor aa)
1118 {
1119     if (!analysis)
1120         return ajFalse;
1121 
1122     analysis->Adaptor = aa;
1123 
1124     return ajTrue;
1125 }
1126 
1127 
1128 
1129 
1130 /* @func ensAnalysisSetDatabasefile *******************************************
1131 **
1132 ** Set the database file member of an Ensembl Analysis.
1133 **
1134 ** @cc Bio::EnsEMBL::Analysis::db_file
1135 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1136 ** @param [u] databasefile [AjPStr] Database file
1137 **
1138 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1139 **
1140 ** @release 6.3.0
1141 ** @@
1142 ******************************************************************************/
1143 
ensAnalysisSetDatabasefile(EnsPAnalysis analysis,AjPStr databasefile)1144 AjBool ensAnalysisSetDatabasefile(EnsPAnalysis analysis,
1145                                   AjPStr databasefile)
1146 {
1147     if (!analysis)
1148         return ajFalse;
1149 
1150     ajStrDel(&analysis->Databasefile);
1151 
1152     analysis->Databasefile = ajStrNewRef(databasefile);
1153 
1154     return ajTrue;
1155 }
1156 
1157 
1158 
1159 
1160 /* @func ensAnalysisSetDatabasename *******************************************
1161 **
1162 ** Set the database name member of an Ensembl Analysis.
1163 **
1164 ** @cc Bio::EnsEMBL::Analysis::db
1165 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1166 ** @param [u] databasename [AjPStr] Database name
1167 **
1168 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1169 **
1170 ** @release 6.3.0
1171 ** @@
1172 ******************************************************************************/
1173 
ensAnalysisSetDatabasename(EnsPAnalysis analysis,AjPStr databasename)1174 AjBool ensAnalysisSetDatabasename(EnsPAnalysis analysis,
1175                                   AjPStr databasename)
1176 {
1177     if (!analysis)
1178         return ajFalse;
1179 
1180     ajStrDel(&analysis->Databasename);
1181 
1182     analysis->Databasename = ajStrNewRef(databasename);
1183 
1184     return ajTrue;
1185 }
1186 
1187 
1188 
1189 
1190 /* @func ensAnalysisSetDatabaseversion ****************************************
1191 **
1192 ** Set the database version member of an Ensembl Analysis.
1193 **
1194 ** @cc Bio::EnsEMBL::Analysis::db_version
1195 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1196 ** @param [u] databaseversion [AjPStr] Database version
1197 **
1198 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1199 **
1200 ** @release 6.3.0
1201 ** @@
1202 ******************************************************************************/
1203 
ensAnalysisSetDatabaseversion(EnsPAnalysis analysis,AjPStr databaseversion)1204 AjBool ensAnalysisSetDatabaseversion(EnsPAnalysis analysis,
1205                                      AjPStr databaseversion)
1206 {
1207     if (!analysis)
1208         return ajFalse;
1209 
1210     ajStrDel(&analysis->Databaseversion);
1211 
1212     analysis->Databaseversion = ajStrNewRef(databaseversion);
1213 
1214     return ajTrue;
1215 }
1216 
1217 
1218 
1219 
1220 /* @func ensAnalysisSetDateCreation *******************************************
1221 **
1222 ** Set the date of creation member of an Ensembl Analysis.
1223 **
1224 ** @cc Bio::EnsEMBL::Analysis::created
1225 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1226 ** @param [u] cdate [AjPStr] Creation date
1227 **
1228 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1229 **
1230 ** @release 6.4.0
1231 ** @@
1232 ******************************************************************************/
1233 
ensAnalysisSetDateCreation(EnsPAnalysis analysis,AjPStr cdate)1234 AjBool ensAnalysisSetDateCreation(EnsPAnalysis analysis,
1235                                   AjPStr cdate)
1236 {
1237     if (!analysis)
1238         return ajFalse;
1239 
1240     ajStrDel(&analysis->DateCreation);
1241 
1242     analysis->DateCreation = ajStrNewRef(cdate);
1243 
1244     return ajTrue;
1245 }
1246 
1247 
1248 
1249 
1250 /* @func ensAnalysisSetDescription ********************************************
1251 **
1252 ** Set the description member of an Ensembl Analysis.
1253 **
1254 ** @cc Bio::EnsEMBL::Analysis::description
1255 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1256 ** @param [u] description [AjPStr] Description
1257 **
1258 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1259 **
1260 ** @release 6.2.0
1261 ** @@
1262 ******************************************************************************/
1263 
ensAnalysisSetDescription(EnsPAnalysis analysis,AjPStr description)1264 AjBool ensAnalysisSetDescription(EnsPAnalysis analysis,
1265                                  AjPStr description)
1266 {
1267     if (!analysis)
1268         return ajFalse;
1269 
1270     ajStrDel(&analysis->Description);
1271 
1272     analysis->Description = ajStrNewRef(description);
1273 
1274     return ajTrue;
1275 }
1276 
1277 
1278 
1279 
1280 /* @func ensAnalysisSetDisplayable ********************************************
1281 **
1282 ** Set the displayable member of an Ensembl Analysis.
1283 **
1284 ** @cc Bio::EnsEMBL::Analysis::displayable
1285 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1286 ** @param [r] displayable [AjBool] Displayable flag
1287 **
1288 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1289 **
1290 ** @release 6.2.0
1291 ** @@
1292 ******************************************************************************/
1293 
ensAnalysisSetDisplayable(EnsPAnalysis analysis,AjBool displayable)1294 AjBool ensAnalysisSetDisplayable(EnsPAnalysis analysis,
1295                                  AjBool displayable)
1296 {
1297     if (!analysis)
1298         return ajFalse;
1299 
1300     analysis->Displayable = displayable;
1301 
1302     return ajTrue;
1303 }
1304 
1305 
1306 
1307 
1308 /* @func ensAnalysisSetDisplaylabel *******************************************
1309 **
1310 ** Set the display label member of an Ensembl Analysis.
1311 **
1312 ** @cc Bio::EnsEMBL::Analysis::display_label
1313 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1314 ** @param [u] displaylabel [AjPStr] Display label
1315 **
1316 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1317 **
1318 ** @release 6.3.0
1319 ** @@
1320 ******************************************************************************/
1321 
ensAnalysisSetDisplaylabel(EnsPAnalysis analysis,AjPStr displaylabel)1322 AjBool ensAnalysisSetDisplaylabel(EnsPAnalysis analysis,
1323                                   AjPStr displaylabel)
1324 {
1325     if (!analysis)
1326         return ajFalse;
1327 
1328     ajStrDel(&analysis->Displaylabel);
1329 
1330     analysis->Displaylabel = ajStrNewRef(displaylabel);
1331 
1332     return ajTrue;
1333 }
1334 
1335 
1336 
1337 
1338 /* @func ensAnalysisSetGfffeature *********************************************
1339 **
1340 ** Set the GFF feature member of an Ensembl Analysis.
1341 **
1342 ** @cc Bio::EnsEMBL::Analysis::gff_feature
1343 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1344 ** @param [u] gfffeature [AjPStr] GFF feature
1345 **
1346 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1347 **
1348 ** @release 6.3.0
1349 ** @@
1350 ******************************************************************************/
1351 
ensAnalysisSetGfffeature(EnsPAnalysis analysis,AjPStr gfffeature)1352 AjBool ensAnalysisSetGfffeature(EnsPAnalysis analysis,
1353                                 AjPStr gfffeature)
1354 {
1355     if (!analysis)
1356         return ajFalse;
1357 
1358     ajStrDel(&analysis->Gfffeature);
1359 
1360     analysis->Gfffeature = ajStrNewRef(gfffeature);
1361 
1362     return ajTrue;
1363 }
1364 
1365 
1366 
1367 
1368 /* @func ensAnalysisSetGffsource **********************************************
1369 **
1370 ** Set the GFF source member of an Ensembl Analysis.
1371 **
1372 ** @cc Bio::EnsEMBL::Analysis::gff_source
1373 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1374 ** @param [u] gffsource [AjPStr] GFF source
1375 **
1376 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1377 **
1378 ** @release 6.3.0
1379 ** @@
1380 ******************************************************************************/
1381 
ensAnalysisSetGffsource(EnsPAnalysis analysis,AjPStr gffsource)1382 AjBool ensAnalysisSetGffsource(EnsPAnalysis analysis,
1383                                AjPStr gffsource)
1384 {
1385     if (!analysis)
1386         return ajFalse;
1387 
1388     ajStrDel(&analysis->Gffsource);
1389 
1390     analysis->Gffsource = ajStrNewRef(gffsource);
1391 
1392     return ajTrue;
1393 }
1394 
1395 
1396 
1397 
1398 /* @func ensAnalysisSetIdentifier *********************************************
1399 **
1400 ** Set the SQL database-internal identifier member of an Ensembl Analysis.
1401 **
1402 ** @cc Bio::EnsEMBL::Storable::dbID
1403 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1404 ** @param [r] identifier [ajuint] SQL database-internal identifier
1405 **
1406 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1407 **
1408 ** @release 6.2.0
1409 ** @@
1410 ******************************************************************************/
1411 
ensAnalysisSetIdentifier(EnsPAnalysis analysis,ajuint identifier)1412 AjBool ensAnalysisSetIdentifier(EnsPAnalysis analysis,
1413                                 ajuint identifier)
1414 {
1415     if (!analysis)
1416         return ajFalse;
1417 
1418     analysis->Identifier = identifier;
1419 
1420     return ajTrue;
1421 }
1422 
1423 
1424 
1425 
1426 /* @func ensAnalysisSetModulename *********************************************
1427 **
1428 ** Set the module name member of an Ensembl Analysis.
1429 **
1430 ** @cc Bio::EnsEMBL::Analysis::module
1431 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1432 ** @param [u] modulename [AjPStr] Module name
1433 **
1434 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1435 **
1436 ** @release 6.3.0
1437 ** @@
1438 ******************************************************************************/
1439 
ensAnalysisSetModulename(EnsPAnalysis analysis,AjPStr modulename)1440 AjBool ensAnalysisSetModulename(EnsPAnalysis analysis,
1441                                 AjPStr modulename)
1442 {
1443     if (!analysis)
1444         return ajFalse;
1445 
1446     ajStrDel(&analysis->Modulename);
1447 
1448     analysis->Modulename = ajStrNewRef(modulename);
1449 
1450     return ajTrue;
1451 }
1452 
1453 
1454 
1455 
1456 /* @func ensAnalysisSetModuleversion ******************************************
1457 **
1458 ** Set the module version member of an Ensembl Analysis.
1459 **
1460 ** @cc Bio::EnsEMBL::Analysis::module_version
1461 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1462 ** @param [u] moduleversion [AjPStr] Module version
1463 **
1464 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1465 **
1466 ** @release 6.3.0
1467 ** @@
1468 ******************************************************************************/
1469 
ensAnalysisSetModuleversion(EnsPAnalysis analysis,AjPStr moduleversion)1470 AjBool ensAnalysisSetModuleversion(EnsPAnalysis analysis,
1471                                    AjPStr moduleversion)
1472 {
1473     if (!analysis)
1474         return ajFalse;
1475 
1476     ajStrDel(&analysis->Moduleversion);
1477 
1478     analysis->Moduleversion = ajStrNewRef(moduleversion);
1479 
1480     return ajTrue;
1481 }
1482 
1483 
1484 
1485 
1486 /* @func ensAnalysisSetName ***************************************************
1487 **
1488 ** Set the name member of an Ensembl Analysis.
1489 **
1490 ** @cc Bio::EnsEMBL::Analysis::logic_name
1491 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1492 ** @param [u] name [AjPStr] Name
1493 **
1494 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1495 **
1496 ** @release 6.2.0
1497 ** @@
1498 ******************************************************************************/
1499 
ensAnalysisSetName(EnsPAnalysis analysis,AjPStr name)1500 AjBool ensAnalysisSetName(EnsPAnalysis analysis,
1501                           AjPStr name)
1502 {
1503     if (!analysis)
1504         return ajFalse;
1505 
1506     ajStrDel(&analysis->Name);
1507 
1508     analysis->Name = ajStrNewRef(name);
1509 
1510     return ajTrue;
1511 }
1512 
1513 
1514 
1515 
1516 /* @func ensAnalysisSetParameters *********************************************
1517 **
1518 ** Set the parameters member of an Ensembl Analysis.
1519 **
1520 ** @cc Bio::EnsEMBL::Analysis::parameters
1521 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1522 ** @param [u] parameters [AjPStr] Parameters
1523 **
1524 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1525 **
1526 ** @release 6.2.0
1527 ** @@
1528 ******************************************************************************/
1529 
ensAnalysisSetParameters(EnsPAnalysis analysis,AjPStr parameters)1530 AjBool ensAnalysisSetParameters(EnsPAnalysis analysis,
1531                                 AjPStr parameters)
1532 {
1533     if (!analysis)
1534         return ajFalse;
1535 
1536     ajStrDel(&analysis->Parameters);
1537 
1538     analysis->Parameters = ajStrNewRef(parameters);
1539 
1540     return ajTrue;
1541 }
1542 
1543 
1544 
1545 
1546 /* @func ensAnalysisSetProgramfile ********************************************
1547 **
1548 ** Set the program file member of an Ensembl Analysis.
1549 **
1550 ** @cc Bio::EnsEMBL::Analysis::program_file
1551 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1552 ** @param [u] programfile [AjPStr] Program file
1553 **
1554 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1555 **
1556 ** @release 6.3.0
1557 ** @@
1558 ******************************************************************************/
1559 
ensAnalysisSetProgramfile(EnsPAnalysis analysis,AjPStr programfile)1560 AjBool ensAnalysisSetProgramfile(EnsPAnalysis analysis,
1561                                  AjPStr programfile)
1562 {
1563     if (!analysis)
1564         return ajFalse;
1565 
1566     ajStrDel(&analysis->Programfile);
1567 
1568     analysis->Programfile = ajStrNewRef(programfile);
1569 
1570     return ajTrue;
1571 }
1572 
1573 
1574 
1575 
1576 /* @func ensAnalysisSetProgramname ********************************************
1577 **
1578 ** Set the program name member of an Ensembl Analysis.
1579 **
1580 ** @cc Bio::EnsEMBL::Analysis::program
1581 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1582 ** @param [u] programname [AjPStr] Program name
1583 **
1584 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1585 **
1586 ** @release 6.3.0
1587 ** @@
1588 ******************************************************************************/
1589 
ensAnalysisSetProgramname(EnsPAnalysis analysis,AjPStr programname)1590 AjBool ensAnalysisSetProgramname(EnsPAnalysis analysis,
1591                                  AjPStr programname)
1592 {
1593     if (!analysis)
1594         return ajFalse;
1595 
1596     ajStrDel(&analysis->Programname);
1597 
1598     analysis->Programname = ajStrNewRef(programname);
1599 
1600     return ajTrue;
1601 }
1602 
1603 
1604 
1605 
1606 /* @func ensAnalysisSetProgramversion *****************************************
1607 **
1608 ** Set the program version member of an Ensembl Analysis.
1609 **
1610 ** @cc Bio::EnsEMBL::Analysis::program_version
1611 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1612 ** @param [u] programversion [AjPStr] Program version
1613 **
1614 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1615 **
1616 ** @release 6.3.0
1617 ** @@
1618 ******************************************************************************/
1619 
ensAnalysisSetProgramversion(EnsPAnalysis analysis,AjPStr programversion)1620 AjBool ensAnalysisSetProgramversion(EnsPAnalysis analysis,
1621                                     AjPStr programversion)
1622 {
1623     if (!analysis)
1624         return ajFalse;
1625 
1626     ajStrDel(&analysis->Programversion);
1627 
1628     analysis->Programversion = ajStrNewRef(programversion);
1629 
1630     return ajTrue;
1631 }
1632 
1633 
1634 
1635 
1636 /* @func ensAnalysisSetWebdata ************************************************
1637 **
1638 ** Set the web data member of an Ensembl Analysis.
1639 **
1640 ** @cc Bio::EnsEMBL::Analysis::web_data
1641 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
1642 ** @param [u] webdata [AjPStr] Web data
1643 **
1644 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1645 **
1646 ** @release 6.3.0
1647 ** @@
1648 ******************************************************************************/
1649 
ensAnalysisSetWebdata(EnsPAnalysis analysis,AjPStr webdata)1650 AjBool ensAnalysisSetWebdata(EnsPAnalysis analysis,
1651                              AjPStr webdata)
1652 {
1653     if (!analysis)
1654         return ajFalse;
1655 
1656     ajStrDel(&analysis->Webdata);
1657 
1658     analysis->Webdata = ajStrNewRef(webdata);
1659 
1660     return ajTrue;
1661 }
1662 
1663 
1664 
1665 
1666 /* @section debugging *********************************************************
1667 **
1668 ** Functions for reporting of an Ensembl Analysis object.
1669 **
1670 ** @fdata [EnsPAnalysis]
1671 **
1672 ** @nam3rule Trace Report Ensembl Analysis members to debug file.
1673 **
1674 ** @argrule Trace analysis [const EnsPAnalysis] Ensembl Analysis
1675 ** @argrule Trace level [ajuint] Indentation level
1676 **
1677 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1678 **
1679 ** @fcategory misc
1680 ******************************************************************************/
1681 
1682 
1683 
1684 
1685 /* @func ensAnalysisTrace *****************************************************
1686 **
1687 ** Trace an Ensembl Analysis.
1688 **
1689 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1690 ** @param [r] level [ajuint] Indentation level
1691 **
1692 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1693 **
1694 ** @release 6.2.0
1695 ** @@
1696 ******************************************************************************/
1697 
ensAnalysisTrace(const EnsPAnalysis analysis,ajuint level)1698 AjBool ensAnalysisTrace(const EnsPAnalysis analysis, ajuint level)
1699 {
1700     AjPStr indent = NULL;
1701 
1702     if (!analysis)
1703         return ajFalse;
1704 
1705     indent = ajStrNew();
1706 
1707     ajStrAppendCountK(&indent, ' ', level * 2);
1708 
1709     ajDebug("%SensAnalysisTrace %p\n"
1710             "%S  Use %u\n"
1711             "%S  Identifier %u\n"
1712             "%S  Adaptor %p\n"
1713             "%S  DateCreation '%S'\n"
1714             "%S  Name '%S'\n"
1715             "%S  Databasename '%S'\n"
1716             "%S  Databaseversion '%S'\n"
1717             "%S  Databasefile '%S'\n"
1718             "%S  Programname '%S'\n"
1719             "%S  Programversion '%S'\n"
1720             "%S  Programfile '%S'\n"
1721             "%S  Parameters '%S'\n"
1722             "%S  Modulename '%S'\n"
1723             "%S  Moduleversion '%S'\n"
1724             "%S  Gffsource '%S'\n"
1725             "%S  Gfffeature '%S'\n"
1726             "%S  Description %p\n"
1727             "%S  Displaylabel '%S'\n"
1728             "%S  Displayable '%B'\n"
1729             "%S  Webdata %p\n",
1730             indent, analysis,
1731             indent, analysis->Use,
1732             indent, analysis->Identifier,
1733             indent, analysis->Adaptor,
1734             indent, analysis->DateCreation,
1735             indent, analysis->Name,
1736             indent, analysis->Databasename,
1737             indent, analysis->Databaseversion,
1738             indent, analysis->Databasefile,
1739             indent, analysis->Programname,
1740             indent, analysis->Programversion,
1741             indent, analysis->Programfile,
1742             indent, analysis->Parameters,
1743             indent, analysis->Modulename,
1744             indent, analysis->Moduleversion,
1745             indent, analysis->Gffsource,
1746             indent, analysis->Gfffeature,
1747             indent, analysis->Description,
1748             indent, analysis->Displaylabel,
1749             indent, analysis->Displayable,
1750             indent, analysis->Webdata);
1751 
1752     ajStrDel(&indent);
1753 
1754     return ajTrue;
1755 }
1756 
1757 
1758 
1759 
1760 /* @section calculate *********************************************************
1761 **
1762 ** Functions for calculating information from an Ensembl Analysis object.
1763 **
1764 ** @fdata [EnsPAnalysis]
1765 **
1766 ** @nam3rule Calculate Calculate Ensembl Analysis information
1767 ** @nam4rule Memsize Calculate the memory size in bytes
1768 **
1769 ** @argrule * analysis [const EnsPAnalysis] Ensembl Analysis
1770 **
1771 ** @valrule Memsize [size_t] Memory size in bytes or 0
1772 **
1773 ** @fcategory misc
1774 ******************************************************************************/
1775 
1776 
1777 
1778 
1779 /* @func ensAnalysisCalculateMemsize ******************************************
1780 **
1781 ** Get the memory size in bytes of an Ensembl Analysis.
1782 **
1783 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1784 **
1785 ** @return [size_t] Memory size in bytes or 0
1786 **
1787 ** @release 6.4.0
1788 ** @@
1789 ******************************************************************************/
1790 
ensAnalysisCalculateMemsize(const EnsPAnalysis analysis)1791 size_t ensAnalysisCalculateMemsize(const EnsPAnalysis analysis)
1792 {
1793     size_t size = 0;
1794 
1795     if (!analysis)
1796         return 0;
1797 
1798     size += sizeof (EnsOAnalysis);
1799 
1800     if (analysis->DateCreation)
1801     {
1802         size += sizeof (AjOStr);
1803 
1804         size += ajStrGetRes(analysis->DateCreation);
1805     }
1806 
1807     if (analysis->Name)
1808     {
1809         size += sizeof (AjOStr);
1810 
1811         size += ajStrGetRes(analysis->Name);
1812     }
1813 
1814     if (analysis->Databasename)
1815     {
1816         size += sizeof (AjOStr);
1817 
1818         size += ajStrGetRes(analysis->Databasename);
1819     }
1820 
1821     if (analysis->Databaseversion)
1822     {
1823         size += sizeof (AjOStr);
1824 
1825         size += ajStrGetRes(analysis->Databaseversion);
1826     }
1827 
1828     if (analysis->Databasefile)
1829     {
1830         size += sizeof (AjOStr);
1831 
1832         size += ajStrGetRes(analysis->Databasefile);
1833     }
1834 
1835     if (analysis->Programname)
1836     {
1837         size += sizeof (AjOStr);
1838 
1839         size += ajStrGetRes(analysis->Programname);
1840     }
1841 
1842     if (analysis->Programversion)
1843     {
1844         size += sizeof (AjOStr);
1845 
1846         size += ajStrGetRes(analysis->Programversion);
1847     }
1848 
1849     if (analysis->Programfile)
1850     {
1851         size += sizeof (AjOStr);
1852 
1853         size += ajStrGetRes(analysis->Programfile);
1854     }
1855 
1856     if (analysis->Parameters)
1857     {
1858         size += sizeof (AjOStr);
1859 
1860         size += ajStrGetRes(analysis->Parameters);
1861     }
1862 
1863     if (analysis->Modulename)
1864     {
1865         size += sizeof (AjOStr);
1866 
1867         size += ajStrGetRes(analysis->Modulename);
1868     }
1869 
1870     if (analysis->Moduleversion)
1871     {
1872         size += sizeof (AjOStr);
1873 
1874         size += ajStrGetRes(analysis->Moduleversion);
1875     }
1876 
1877     if (analysis->Gffsource)
1878     {
1879         size += sizeof (AjOStr);
1880 
1881         size += ajStrGetRes(analysis->Gffsource);
1882     }
1883 
1884     if (analysis->Gfffeature)
1885     {
1886         size += sizeof (AjOStr);
1887 
1888         size += ajStrGetRes(analysis->Gfffeature);
1889     }
1890 
1891     if (analysis->Description)
1892     {
1893         size += sizeof (AjOStr);
1894 
1895         size += ajStrGetRes(analysis->Description);
1896     }
1897 
1898     if (analysis->Displaylabel)
1899     {
1900         size += sizeof (AjOStr);
1901 
1902         size += ajStrGetRes(analysis->Displaylabel);
1903     }
1904 
1905     if (analysis->Webdata)
1906     {
1907         size += sizeof (AjOStr);
1908 
1909         size += ajStrGetRes(analysis->Webdata);
1910     }
1911 
1912     return size;
1913 }
1914 
1915 
1916 
1917 
1918 /* @section testing properties ************************************************
1919 **
1920 ** @fdata [EnsPAnalysis]
1921 **
1922 ** @nam3rule Is Test an Ensembl Analysis property
1923 ** @nam4rule Database Ensembl Analysis is based on a database
1924 **
1925 ** @argrule Is analysis [const EnsPAnalysis] Ensembl Analysis
1926 **
1927 ** @valrule * [AjBool] Ensembl Analysis boolean property
1928 **
1929 ** @fcategory use
1930 ******************************************************************************/
1931 
1932 
1933 
1934 
1935 /* @func ensAnalysisIsDatabase ************************************************
1936 **
1937 ** Test whether an Ensembl Analysis is based on a database.
1938 **
1939 ** @cc Bio::EnsEMBL::Analysis::has_database
1940 ** @param [r] analysis [const EnsPAnalysis] Ensembl Analysis
1941 **
1942 ** @return [AjBool]
1943 ** ajTrue if the Ensembl Analysis was defined and has a database attached
1944 **
1945 ** @release 6.2.0
1946 ** @@
1947 ******************************************************************************/
1948 
ensAnalysisIsDatabase(const EnsPAnalysis analysis)1949 AjBool ensAnalysisIsDatabase(const EnsPAnalysis analysis)
1950 {
1951     if (!analysis)
1952         return ajFalse;
1953 
1954     if (analysis->Databasename && ajStrGetLen(analysis->Databasename))
1955         return ajTrue;
1956     else
1957         return ajFalse;
1958 }
1959 
1960 
1961 
1962 
1963 /* @section comparison ********************************************************
1964 **
1965 ** Functions for comparing Ensembl Analysis objects
1966 **
1967 ** @fdata [EnsPAnalysis]
1968 **
1969 ** @nam3rule Match Compare two Ensembl Analysis objects
1970 **
1971 ** @argrule * analysis1 [const EnsPAnalysis] Ensembl Analysis
1972 ** @argrule * analysis2 [const EnsPAnalysis] Ensembl Analysis
1973 **
1974 ** @valrule * [AjBool] ajTrue if the Ensembl Analysis objects are equal
1975 **
1976 ** @fcategory use
1977 ******************************************************************************/
1978 
1979 
1980 
1981 
1982 /* @func ensAnalysisMatch *****************************************************
1983 **
1984 ** Test for matching two Ensembl Analysis objects.
1985 **
1986 ** @cc Bio::EnsEMBL::Analysis::compare
1987 ** @param [r] analysis1 [const EnsPAnalysis] First Ensembl Analysis
1988 ** @param [r] analysis2 [const EnsPAnalysis] Second Ensembl Analysis
1989 **
1990 ** @return [AjBool] ajTrue if the Ensembl Analysis objects are equal
1991 **
1992 ** @release 6.2.0
1993 ** @@
1994 ** The comparison is based on an initial pointer equality test and if that
1995 ** fails, a case-insensitive string comparison of the name and version members
1996 ** is performed.
1997 ******************************************************************************/
1998 
ensAnalysisMatch(const EnsPAnalysis analysis1,const EnsPAnalysis analysis2)1999 AjBool ensAnalysisMatch(const EnsPAnalysis analysis1,
2000                         const EnsPAnalysis analysis2)
2001 {
2002     if (ajDebugTest("ensAnalysisMatch"))
2003         ajDebug("ensAnalysisMatch\n"
2004                 "  analysis1 %p\n"
2005                 "  analysis2 %p\n",
2006                 analysis1,
2007                 analysis2);
2008 
2009     if (!analysis1)
2010         return ajFalse;
2011 
2012     if (!analysis2)
2013         return ajFalse;
2014 
2015     if (analysis1 == analysis2)
2016         return ajTrue;
2017 
2018     if (!ajStrMatchCaseS(analysis1->Name,
2019                          analysis2->Name))
2020         return ajFalse;
2021 
2022     if (!ajStrMatchCaseS(analysis1->Databasename,
2023                          analysis2->Databasename))
2024         return ajFalse;
2025 
2026     if (!ajStrMatchCaseS(analysis1->Databaseversion,
2027                          analysis2->Databaseversion))
2028         return ajFalse;
2029 
2030     if (!ajStrMatchCaseS(analysis1->Databasefile,
2031                          analysis2->Databasefile))
2032         return ajFalse;
2033 
2034     if (!ajStrMatchCaseS(analysis1->Programname,
2035                          analysis2->Programname))
2036         return ajFalse;
2037 
2038     if (!ajStrMatchCaseS(analysis1->Programversion,
2039                          analysis2->Programversion))
2040         return ajFalse;
2041 
2042     if (!ajStrMatchCaseS(analysis1->Programfile,
2043                          analysis2->Programfile))
2044         return ajFalse;
2045 
2046     if (!ajStrMatchCaseS(analysis1->Parameters,
2047                          analysis2->Parameters))
2048         return ajFalse;
2049 
2050     if (!ajStrMatchCaseS(analysis1->Modulename,
2051                          analysis2->Modulename))
2052         return ajFalse;
2053 
2054     if (!ajStrMatchCaseS(analysis1->Moduleversion,
2055                          analysis2->Moduleversion))
2056         return ajFalse;
2057 
2058     if (!ajStrMatchCaseS(analysis1->Gffsource,
2059                          analysis2->Gffsource))
2060         return ajFalse;
2061 
2062     if (!ajStrMatchCaseS(analysis1->Gfffeature,
2063                          analysis2->Gfffeature))
2064         return ajFalse;
2065 
2066     return ajTrue;
2067 }
2068 
2069 
2070 
2071 
2072 /* @datasection [AjPList] AJAX List *******************************************
2073 **
2074 ** @nam2rule List Functions for manipulating AJAX List objects
2075 **
2076 ******************************************************************************/
2077 
2078 
2079 
2080 
2081 /* @funcstatic listAnalysisCompareIdentifierAscending *************************
2082 **
2083 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2084 ** Ensembl Analysis identifier in ascending order.
2085 **
2086 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2087 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2088 ** @see ajListSort
2089 **
2090 ** @return [int] The comparison function returns an integer less than,
2091 **               equal to, or greater than zero if the first argument is
2092 **               considered to be respectively less than, equal to, or
2093 **               greater than the second.
2094 **
2095 ** @release 6.4.0
2096 ** @@
2097 ******************************************************************************/
2098 
listAnalysisCompareIdentifierAscending(const void * item1,const void * item2)2099 static int listAnalysisCompareIdentifierAscending(
2100     const void *item1,
2101     const void *item2)
2102 {
2103     EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2104     EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2105 
2106 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2107     if (ajDebugTest("listAnalysisCompareIdentifierAscending"))
2108         ajDebug("listAnalysisCompareIdentifierAscending\n"
2109                 "  analysis1 %p\n"
2110                 "  analysis2 %p\n",
2111                 analysis1,
2112                 analysis2);
2113 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2114 
2115     /* Sort empty values towards the end of the AJAX List. */
2116 
2117     if (analysis1 && (!analysis2))
2118         return -1;
2119 
2120     if ((!analysis1) && (!analysis2))
2121         return 0;
2122 
2123     if ((!analysis1) && analysis2)
2124         return +1;
2125 
2126     if (analysis1->Identifier < analysis2->Identifier)
2127         return -1;
2128 
2129     if (analysis1->Identifier > analysis2->Identifier)
2130         return +1;
2131 
2132     return 0;
2133 }
2134 
2135 
2136 
2137 
2138 /* @funcstatic listAnalysisCompareIdentifierDescending ************************
2139 **
2140 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2141 ** Ensembl Analysis identifier in descending order.
2142 **
2143 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2144 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2145 ** @see ajListSort
2146 **
2147 ** @return [int] The comparison function returns an integer less than,
2148 **               equal to, or greater than zero if the first argument is
2149 **               considered to be respectively less than, equal to, or
2150 **               greater than the second.
2151 **
2152 ** @release 6.4.0
2153 ** @@
2154 ******************************************************************************/
2155 
listAnalysisCompareIdentifierDescending(const void * item1,const void * item2)2156 static int listAnalysisCompareIdentifierDescending(
2157     const void *item1,
2158     const void *item2)
2159 {
2160     EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2161     EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2162 
2163 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2164     if (ajDebugTest("listAnalysisCompareIdentifierDescending"))
2165         ajDebug("listAnalysisCompareIdentifierDescending\n"
2166                 "  analysis1 %p\n"
2167                 "  analysis2 %p\n",
2168                 analysis1,
2169                 analysis2);
2170 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2171 
2172     /* Sort empty values towards the end of the AJAX List. */
2173 
2174     if (analysis1 && (!analysis2))
2175         return -1;
2176 
2177     if ((!analysis1) && (!analysis2))
2178         return 0;
2179 
2180     if ((!analysis1) && analysis2)
2181         return +1;
2182 
2183     if (analysis1->Identifier > analysis2->Identifier)
2184         return -1;
2185 
2186     if (analysis1->Identifier < analysis2->Identifier)
2187         return +1;
2188 
2189     return 0;
2190 }
2191 
2192 
2193 
2194 
2195 /* @funcstatic listAnalysisCompareNameAscending *******************************
2196 **
2197 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2198 ** Ensembl Analysis name in ascending order.
2199 **
2200 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2201 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2202 ** @see ajListSort
2203 **
2204 ** @return [int] The comparison function returns an integer less than,
2205 **               equal to, or greater than zero if the first argument is
2206 **               considered to be respectively less than, equal to, or
2207 **               greater than the second.
2208 **
2209 ** @release 6.4.0
2210 ** @@
2211 ******************************************************************************/
2212 
listAnalysisCompareNameAscending(const void * item1,const void * item2)2213 static int listAnalysisCompareNameAscending(
2214     const void *item1,
2215     const void *item2)
2216 {
2217     EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2218     EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2219 
2220 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2221     if (ajDebugTest("listAnalysisCompareNameAscending"))
2222         ajDebug("listAnalysisCompareNameAscending\n"
2223                 "  analysis1 %p\n"
2224                 "  analysis2 %p\n",
2225                 analysis1,
2226                 analysis2);
2227 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2228 
2229     /* Sort empty values towards the end of the AJAX List. */
2230 
2231     if (analysis1 && (!analysis2))
2232         return -1;
2233 
2234     if ((!analysis1) && (!analysis2))
2235         return 0;
2236 
2237     if ((!analysis1) && analysis2)
2238         return +1;
2239 
2240     return ajStrCmpS(analysis1->Name, analysis2->Name);
2241 }
2242 
2243 
2244 
2245 
2246 /* @funcstatic listAnalysisCompareNameDescending ******************************
2247 **
2248 ** AJAX List of Ensembl Analysis objects comparison function to sort by
2249 ** Ensembl Analysis name in descending order.
2250 **
2251 ** @param [r] item1 [const void*] Ensembl Analysis address 1
2252 ** @param [r] item2 [const void*] Ensembl Analysis address 2
2253 ** @see ajListSort
2254 **
2255 ** @return [int] The comparison function returns an integer less than,
2256 **               equal to, or greater than zero if the first argument is
2257 **               considered to be respectively less than, equal to, or
2258 **               greater than the second.
2259 **
2260 ** @release 6.4.0
2261 ** @@
2262 ******************************************************************************/
2263 
listAnalysisCompareNameDescending(const void * item1,const void * item2)2264 static int listAnalysisCompareNameDescending(
2265     const void *item1,
2266     const void *item2)
2267 {
2268     EnsPAnalysis analysis1 = *(EnsOAnalysis *const *) item1;
2269     EnsPAnalysis analysis2 = *(EnsOAnalysis *const *) item2;
2270 
2271 #if defined(AJ_DEBUG) && AJ_DEBUG >= 2
2272     if (ajDebugTest("listAnalysisCompareNameDescending"))
2273         ajDebug("listAnalysisCompareNameDescending\n"
2274                 "  analysis1 %p\n"
2275                 "  analysis2 %p\n",
2276                 analysis1,
2277                 analysis2);
2278 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 2 */
2279 
2280     /* Sort empty values towards the end of the AJAX List. */
2281 
2282     if (analysis1 && (!analysis2))
2283         return -1;
2284 
2285     if ((!analysis1) && (!analysis2))
2286         return 0;
2287 
2288     if ((!analysis1) && analysis2)
2289         return +1;
2290 
2291     return -1 * ajStrCmpS(analysis1->Name, analysis2->Name);
2292 }
2293 
2294 
2295 
2296 
2297 /* @section list **************************************************************
2298 **
2299 ** Functions for manipulating AJAX List objects.
2300 **
2301 ** @fdata [AjPList]
2302 **
2303 ** @nam3rule Analysis Functions for manipulating AJAX List objects of
2304 ** Ensembl Analysis objects
2305 ** @nam4rule Sort Sort functions
2306 ** @nam5rule Identifier Sort by Ensembl Analysis identifier member
2307 ** @nam5rule Name Sort by Ensembl Analysis name member
2308 ** @nam6rule Ascending  Sort in ascending order
2309 ** @nam6rule Descending Sort in descending order
2310 **
2311 ** @argrule Sort analyses [AjPList] AJAX List of Ensembl Analysis objects
2312 **
2313 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2314 **
2315 ** @fcategory misc
2316 ******************************************************************************/
2317 
2318 
2319 
2320 
2321 /* @func ensListAnalysisSortIdentifierAscending *******************************
2322 **
2323 ** Sort an AJAX List of Ensembl Analysis objects by their
2324 ** Ensembl Analysis identifier in ascending order.
2325 **
2326 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2327 **
2328 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2329 **
2330 ** @release 6.4.0
2331 ** @@
2332 ******************************************************************************/
2333 
ensListAnalysisSortIdentifierAscending(AjPList analyses)2334 AjBool ensListAnalysisSortIdentifierAscending(AjPList analyses)
2335 {
2336     if (!analyses)
2337         return ajFalse;
2338 
2339     ajListSort(analyses, &listAnalysisCompareIdentifierAscending);
2340 
2341     return ajTrue;
2342 }
2343 
2344 
2345 
2346 
2347 /* @func ensListAnalysisSortIdentifierDescending ******************************
2348 **
2349 ** Sort an AJAX List of Ensembl Analysis objects by their
2350 ** Ensembl Analysis identifier in descending order.
2351 **
2352 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2353 **
2354 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2355 **
2356 ** @release 6.4.0
2357 ** @@
2358 ******************************************************************************/
2359 
ensListAnalysisSortIdentifierDescending(AjPList analyses)2360 AjBool ensListAnalysisSortIdentifierDescending(AjPList analyses)
2361 {
2362     if (!analyses)
2363         return ajFalse;
2364 
2365     ajListSort(analyses, &listAnalysisCompareIdentifierDescending);
2366 
2367     return ajTrue;
2368 }
2369 
2370 
2371 
2372 
2373 /* @func ensListAnalysisSortNameAscending *************************************
2374 **
2375 ** Sort an AJAX List of Ensembl Analysis objects by their
2376 ** Ensembl Analysis name in ascending order.
2377 **
2378 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2379 **
2380 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2381 **
2382 ** @release 6.4.0
2383 ** @@
2384 ******************************************************************************/
2385 
ensListAnalysisSortNameAscending(AjPList analyses)2386 AjBool ensListAnalysisSortNameAscending(AjPList analyses)
2387 {
2388     if (!analyses)
2389         return ajFalse;
2390 
2391     ajListSort(analyses, &listAnalysisCompareNameAscending);
2392 
2393     return ajTrue;
2394 }
2395 
2396 
2397 
2398 
2399 /* @func ensListAnalysisSortNameDescending ************************************
2400 **
2401 ** Sort an AJAX List of Ensembl Analysis objects by their
2402 ** Ensembl Analysis name in descending order.
2403 **
2404 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2405 **
2406 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2407 **
2408 ** @release 6.4.0
2409 ** @@
2410 ******************************************************************************/
2411 
ensListAnalysisSortNameDescending(AjPList analyses)2412 AjBool ensListAnalysisSortNameDescending(AjPList analyses)
2413 {
2414     if (!analyses)
2415         return ajFalse;
2416 
2417     ajListSort(analyses, &listAnalysisCompareNameDescending);
2418 
2419     return ajTrue;
2420 }
2421 
2422 
2423 
2424 
2425 /* @datasection [EnsPAnalysisadaptor] Ensembl Analysis Adaptor ****************
2426 **
2427 ** @nam2rule Analysisadaptor Functions for manipulating
2428 ** Ensembl Analysis Adaptor objects
2429 **
2430 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor
2431 ** @cc CVS Revision: 1.76
2432 ** @cc CVS Tag: branch-ensembl-68
2433 **
2434 ******************************************************************************/
2435 
2436 
2437 
2438 
2439 /* @funcstatic analysisadaptorFetchAllbyStatement *****************************
2440 **
2441 ** Run a SQL statement against an Ensembl Database Adaptor and consolidate the
2442 ** results into an AJAX List of Ensembl Analysis objects.
2443 **
2444 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::_objFromHashref
2445 ** @param [u] ba [EnsPBaseadaptor] Ensembl Base Adaptor
2446 ** @param [r] statement [const AjPStr] SQL statement
2447 ** @param [uN] am [EnsPAssemblymapper] Ensembl Assembly Mapper
2448 ** @param [uN] slice [EnsPSlice] Ensembl Slice
2449 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
2450 **
2451 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2452 **
2453 ** @release 6.4.0
2454 ** @@
2455 ******************************************************************************/
2456 
analysisadaptorFetchAllbyStatement(EnsPBaseadaptor ba,const AjPStr statement,EnsPAssemblymapper am,EnsPSlice slice,AjPList analyses)2457 static AjBool analysisadaptorFetchAllbyStatement(
2458     EnsPBaseadaptor ba,
2459     const AjPStr statement,
2460     EnsPAssemblymapper am,
2461     EnsPSlice slice,
2462     AjPList analyses)
2463 {
2464     ajuint identifier = 0U;
2465 
2466     AjBool displayable = AJFALSE;
2467 
2468     AjPSqlstatement sqls = NULL;
2469     AjISqlrow sqli       = NULL;
2470     AjPSqlrow sqlr       = NULL;
2471 
2472     AjPStr cdate           = NULL;
2473     AjPStr name            = NULL;
2474     AjPStr databasename    = NULL;
2475     AjPStr databaseversion = NULL;
2476     AjPStr databasefile    = NULL;
2477     AjPStr programname     = NULL;
2478     AjPStr programversion  = NULL;
2479     AjPStr programfile     = NULL;
2480     AjPStr parameters      = NULL;
2481     AjPStr modulename      = NULL;
2482     AjPStr moduleversion   = NULL;
2483     AjPStr gffsource       = NULL;
2484     AjPStr gfffeature      = NULL;
2485     AjPStr description     = NULL;
2486     AjPStr displaylabel    = NULL;
2487     AjPStr webdata         = NULL;
2488 
2489     EnsPAnalysis analysis  = NULL;
2490     EnsPAnalysisadaptor aa = NULL;
2491 
2492     EnsPDatabaseadaptor dba = NULL;
2493 
2494     if (ajDebugTest("analysisadaptorFetchAllbyStatement"))
2495         ajDebug("analysisadaptorFetchAllbyStatement\n"
2496                 "  ba %p\n"
2497                 "  statement %p\n"
2498                 "  am %p\n"
2499                 "  slice %p\n"
2500                 "  analyses %p\n",
2501                 ba,
2502                 statement,
2503                 am,
2504                 slice,
2505                 analyses);
2506 
2507     if (!ba)
2508         return ajFalse;
2509 
2510     if (!statement)
2511         return ajFalse;
2512 
2513     if (!analyses)
2514         return ajFalse;
2515 
2516     dba = ensBaseadaptorGetDatabaseadaptor(ba);
2517 
2518     aa = ensRegistryGetAnalysisadaptor(dba);
2519 
2520     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
2521 
2522     sqli = ajSqlrowiterNew(sqls);
2523 
2524     while (!ajSqlrowiterDone(sqli))
2525     {
2526         identifier      = 0;
2527         cdate           = ajStrNew();
2528         name            = ajStrNew();
2529         databasename    = ajStrNew();
2530         databaseversion = ajStrNew();
2531         databasefile    = ajStrNew();
2532         programname     = ajStrNew();
2533         programversion  = ajStrNew();
2534         programfile     = ajStrNew();
2535         parameters      = ajStrNew();
2536         modulename      = ajStrNew();
2537         moduleversion   = ajStrNew();
2538         gffsource       = ajStrNew();
2539         gfffeature      = ajStrNew();
2540         description     = ajStrNew();
2541         displaylabel    = ajStrNew();
2542         displayable     = ajFalse;
2543         webdata         = ajStrNew();
2544 
2545         sqlr = ajSqlrowiterGet(sqli);
2546 
2547         ajSqlcolumnToUint(sqlr, &identifier);
2548         ajSqlcolumnToStr(sqlr, &cdate);
2549         ajSqlcolumnToStr(sqlr, &name);
2550         ajSqlcolumnToStr(sqlr, &databasename);
2551         ajSqlcolumnToStr(sqlr, &databaseversion);
2552         ajSqlcolumnToStr(sqlr, &databasefile);
2553         ajSqlcolumnToStr(sqlr, &programname);
2554         ajSqlcolumnToStr(sqlr, &programversion);
2555         ajSqlcolumnToStr(sqlr, &programfile);
2556         ajSqlcolumnToStr(sqlr, &parameters);
2557         ajSqlcolumnToStr(sqlr, &modulename);
2558         ajSqlcolumnToStr(sqlr, &moduleversion);
2559         ajSqlcolumnToStr(sqlr, &gffsource);
2560         ajSqlcolumnToStr(sqlr, &gfffeature);
2561         ajSqlcolumnToStr(sqlr, &description);
2562         ajSqlcolumnToStr(sqlr, &displaylabel);
2563         ajSqlcolumnToBool(sqlr, &displayable);
2564         ajSqlcolumnToStr(sqlr, &webdata);
2565 
2566         analysis = ensAnalysisNewIni(aa,
2567                                      identifier,
2568                                      cdate,
2569                                      name,
2570                                      databasename,
2571                                      databaseversion,
2572                                      databasefile,
2573                                      programname,
2574                                      programversion,
2575                                      programfile,
2576                                      parameters,
2577                                      modulename,
2578                                      moduleversion,
2579                                      gffsource,
2580                                      gfffeature,
2581                                      description,
2582                                      displaylabel,
2583                                      webdata,
2584                                      displayable);
2585 
2586         ajListPushAppend(analyses, (void *) analysis);
2587 
2588         ajStrDel(&cdate);
2589         ajStrDel(&name);
2590         ajStrDel(&databasename);
2591         ajStrDel(&databaseversion);
2592         ajStrDel(&databasefile);
2593         ajStrDel(&programname);
2594         ajStrDel(&programversion);
2595         ajStrDel(&programfile);
2596         ajStrDel(&parameters);
2597         ajStrDel(&modulename);
2598         ajStrDel(&moduleversion);
2599         ajStrDel(&gffsource);
2600         ajStrDel(&gfffeature);
2601         ajStrDel(&description);
2602         ajStrDel(&displaylabel);
2603         ajStrDel(&webdata);
2604     }
2605 
2606     ajSqlrowiterDel(&sqli);
2607 
2608     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
2609 
2610     return ajTrue;
2611 }
2612 
2613 
2614 
2615 
2616 /* @section constructors ******************************************************
2617 **
2618 ** All constructors return a new Ensembl Analysis Adaptor by pointer.
2619 ** It is the responsibility of the user to first destroy any previous
2620 ** Ensembl Analysis Adaptor.
2621 ** The target pointer does not need to be initialised to NULL, but it is good
2622 ** programming practice to do so anyway.
2623 **
2624 ** @fdata [EnsPAnalysisadaptor]
2625 **
2626 ** @nam3rule New Constructor
2627 **
2628 ** @argrule New dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
2629 **
2630 ** @valrule * [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
2631 **
2632 ** @fcategory new
2633 ******************************************************************************/
2634 
2635 
2636 
2637 
2638 /* @func ensAnalysisadaptorNew ************************************************
2639 **
2640 ** Default constructor for an Ensembl Analysis Adaptor.
2641 **
2642 ** Ensembl Object Adaptors are singleton objects in the sense that a single
2643 ** instance of an Ensembl Object Adaptor connected to a particular database is
2644 ** sufficient to instantiate any number of Ensembl Objects from the database.
2645 ** Each Ensembl Object will have a weak reference to the Object Adaptor that
2646 ** instantiated it. Therefore, Ensembl Object Adaptors should not be
2647 ** instantiated directly, but rather obtained from the Ensembl Registry,
2648 ** which will in turn call this function if neccessary.
2649 **
2650 ** @see ensRegistryGetDatabaseadaptor
2651 ** @see ensRegistryGetAnalysisadaptor
2652 **
2653 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::new
2654 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
2655 **
2656 ** @return [EnsPAnalysisadaptor] Ensembl Analysis Adaptor or NULL
2657 **
2658 ** @release 6.2.0
2659 ** @@
2660 ******************************************************************************/
2661 
ensAnalysisadaptorNew(EnsPDatabaseadaptor dba)2662 EnsPAnalysisadaptor ensAnalysisadaptorNew(
2663     EnsPDatabaseadaptor dba)
2664 {
2665     EnsPAnalysisadaptor aa = NULL;
2666 
2667     if (!dba)
2668         return NULL;
2669 
2670     if (ajDebugTest("ensAnalysisadaptorNew"))
2671         ajDebug("ensAnalysisadaptorNew\n"
2672                 "  dba %p\n",
2673                 dba);
2674 
2675     AJNEW0(aa);
2676 
2677     aa->Adaptor = ensBaseadaptorNew(
2678         dba,
2679         analysisadaptorKTablenames,
2680         analysisadaptorKColumnnames,
2681         analysisadaptorKLeftjoins,
2682         (const char *) NULL,
2683         (const char *) NULL,
2684         &analysisadaptorFetchAllbyStatement);
2685 
2686     /*
2687     ** NOTE: The cache cannot be initialised here because the
2688     ** analysisadaptorCacheInit function calls
2689     ** ensBaseadaptorFetchAllbyConstraint,
2690     ** which calls analysisadaptorFetchAllbyStatement, which calls
2691     ** ensRegistryGetAnalysisadaptor. At that point, however,
2692     ** the Ensembl Analysis Adaptor has not been stored in the Registry.
2693     ** Therefore, each ensAnalysisadaptorFetch function has to test the
2694     ** presence of the adaptor-internal cache and eventually initialise
2695     ** before accessing it.
2696     **
2697     ** analysisadaptorCacheInit(aa);
2698     */
2699 
2700     return aa;
2701 }
2702 
2703 
2704 
2705 
2706 /* @section cache *************************************************************
2707 **
2708 ** Functions for maintaining the Ensembl Analysis Adaptor-internal cache of
2709 ** Ensembl Analysis objects.
2710 **
2711 ** @fdata [EnsPAnalysisadaptor]
2712 **
2713 ** @nam3rule Cache Process an Ensembl Analysis Adaptor-internal cache
2714 ** @nam4rule Clear Clear the Ensembl Analysis Adaptor-internal cache
2715 **
2716 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2717 **
2718 ** @valrule * [AjBool] True on success, ajFalse otherwise
2719 **
2720 ** @fcategory use
2721 ******************************************************************************/
2722 
2723 
2724 
2725 
2726 /* @funcstatic analysisadaptorCacheInit ***************************************
2727 **
2728 ** Initialise the internal Ensembl Analysis cache of an
2729 ** Ensembl Analysis Adaptor.
2730 **
2731 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2732 **
2733 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2734 **
2735 ** @release 6.3.0
2736 ** @@
2737 ******************************************************************************/
2738 
analysisadaptorCacheInit(EnsPAnalysisadaptor aa)2739 static AjBool analysisadaptorCacheInit(
2740     EnsPAnalysisadaptor aa)
2741 {
2742     AjBool result = AJFALSE;
2743 
2744     AjPList analyses = NULL;
2745 
2746     EnsPAnalysis analysis = NULL;
2747 
2748     if (ajDebugTest("analysisadaptorCacheInit"))
2749         ajDebug("analysisadaptorCacheInit\n"
2750                 "  aa %p\n",
2751                 aa);
2752 
2753     if (!aa)
2754         return ajFalse;
2755 
2756     if (aa->CacheByIdentifier)
2757         return ajFalse;
2758     else
2759     {
2760         aa->CacheByIdentifier = ajTableuintNew(0);
2761 
2762         ajTableSetDestroyvalue(
2763             aa->CacheByIdentifier,
2764             (void (*)(void **)) &ensAnalysisDel);
2765     }
2766 
2767     if (aa->CacheByName)
2768         return ajFalse;
2769     else
2770     {
2771         aa->CacheByName = ajTablestrNew(0U);
2772 
2773         ajTableSetDestroyvalue(
2774             aa->CacheByName,
2775             (void (*)(void **)) &ensAnalysisDel);
2776     }
2777 
2778     analyses = ajListNew();
2779 
2780     result = ensBaseadaptorFetchAllbyConstraint(
2781         ensAnalysisadaptorGetBaseadaptor(aa),
2782         (const AjPStr) NULL,
2783         (EnsPAssemblymapper) NULL,
2784         (EnsPSlice) NULL,
2785         analyses);
2786 
2787     while (ajListPop(analyses, (void **) &analysis))
2788     {
2789         analysisadaptorCacheInsert(aa, &analysis);
2790 
2791         /*
2792         ** Both caches hold internal references to the
2793         ** Ensembl Analysis objects.
2794         */
2795 
2796         ensAnalysisDel(&analysis);
2797     }
2798 
2799     ajListFree(&analyses);
2800 
2801     return result;
2802 }
2803 
2804 
2805 
2806 
2807 /* @funcstatic analysisadaptorCacheInsert *************************************
2808 **
2809 ** Insert an Ensembl Analysis into the Ensembl Analysis Adaptor-internal cache.
2810 ** If an Ensembl Analysis with the same name member is already present in the
2811 ** Ensembl Analysis Adaptor-internal cache, the Ensembl Analysis is deleted and
2812 ** a pointer to the cached Ensembl Analysis is returned.
2813 **
2814 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2815 ** @param [u] Panalysis [EnsPAnalysis*] Ensembl Analysis address
2816 **
2817 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2818 **
2819 ** @release 6.3.0
2820 ** @@
2821 ******************************************************************************/
2822 
analysisadaptorCacheInsert(EnsPAnalysisadaptor aa,EnsPAnalysis * Panalysis)2823 static AjBool analysisadaptorCacheInsert(
2824     EnsPAnalysisadaptor aa,
2825     EnsPAnalysis *Panalysis)
2826 {
2827     ajuint *Pidentifier = NULL;
2828 
2829     EnsPAnalysis analysis1 = NULL;
2830     EnsPAnalysis analysis2 = NULL;
2831 
2832     if (!aa)
2833         return ajFalse;
2834 
2835     if (!aa->CacheByIdentifier)
2836         return ajFalse;
2837 
2838     if (!aa->CacheByName)
2839         return ajFalse;
2840 
2841     if (!Panalysis)
2842         return ajFalse;
2843 
2844     if (!*Panalysis)
2845         return ajFalse;
2846 
2847     /* Search the identifer cache. */
2848 
2849     analysis1 = (EnsPAnalysis) ajTableFetchmodV(
2850         aa->CacheByIdentifier,
2851         (const void *) &((*Panalysis)->Identifier));
2852 
2853     /* Search the name cache. */
2854 
2855     analysis2 = (EnsPAnalysis) ajTableFetchmodS(
2856         aa->CacheByName,
2857         (*Panalysis)->Name);
2858 
2859     if ((!analysis1) && (!analysis2))
2860     {
2861         /* Insert into the identifier cache. */
2862 
2863         AJNEW0(Pidentifier);
2864 
2865         *Pidentifier = (*Panalysis)->Identifier;
2866 
2867         ajTablePut(aa->CacheByIdentifier,
2868                    (void *) Pidentifier,
2869                    (void *) ensAnalysisNewRef(*Panalysis));
2870 
2871         /* Insert into the name cache. */
2872 
2873         ajTablePut(aa->CacheByName,
2874                    (void *) ajStrNewS((*Panalysis)->Name),
2875                    (void *) ensAnalysisNewRef(*Panalysis));
2876     }
2877 
2878     if (analysis1 && analysis2 && (analysis1 == analysis2))
2879     {
2880         ajDebug("analysisadaptorCacheInsert replaced Ensembl Analysis %p "
2881                 "with one already cached %p.\n",
2882                 *Panalysis, analysis1);
2883 
2884         ensAnalysisDel(Panalysis);
2885 
2886         ensAnalysisNewRef(analysis1);
2887 
2888         Panalysis = &analysis1;
2889     }
2890 
2891     if (analysis1 && analysis2 && (analysis1 != analysis2))
2892         ajDebug("analysisadaptorCacheInsert detected Ensembl Analysis objects "
2893                 "in the identifier and name cache with identical names "
2894                 "('%S' and '%S') but different addresses (%p and %p).\n",
2895                 analysis1->Name, analysis2->Name, analysis1, analysis2);
2896 
2897     if (analysis1 && (!analysis2))
2898         ajDebug("analysisadaptorCacheInsert detected an Ensembl Analysis "
2899                 "in the identifier, but not in the name cache.\n");
2900 
2901     if ((!analysis1) && analysis2)
2902         ajDebug("analysisadaptorCacheInsert detected an Ensembl Analysis "
2903                 "in the name, but not in the identifier cache.\n");
2904 
2905     return ajTrue;
2906 }
2907 
2908 
2909 
2910 
2911 #if AJFALSE
2912 /* @funcstatic analysisadaptorCacheRemove *************************************
2913 **
2914 ** Remove an Ensembl Analysis from the Ensembl Analysis Adaptor-internal cache.
2915 **
2916 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2917 ** @param [u] analysis [EnsPAnalysis] Ensembl Analysis
2918 **
2919 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2920 **
2921 ** @release 6.3.0
2922 ** @@
2923 ******************************************************************************/
2924 
analysisadaptorCacheRemove(EnsPAnalysisadaptor aa,EnsPAnalysis analysis)2925 static AjBool analysisadaptorCacheRemove(
2926     EnsPAnalysisadaptor aa,
2927     EnsPAnalysis analysis)
2928 {
2929     EnsPAnalysis analysis1 = NULL;
2930     EnsPAnalysis analysis2 = NULL;
2931 
2932     if (!aa)
2933         return ajFalse;
2934 
2935     if (!analysis)
2936         return ajFalse;
2937 
2938     analysis1 = (EnsPAnalysis) ajTableRemove(
2939         aa->CacheByIdentifier,
2940         (const void *) &analysis->Identifier);
2941 
2942     analysis2 = (EnsPAnalysis) ajTableRemove(
2943         aa->CacheByName,
2944         (const void *) analysis->Name);
2945 
2946     if (analysis1 && (!analysis2))
2947         ajWarn("analysisadaptorCacheRemove could remove Ensembl Analysis with "
2948                "identifier %u and name '%S' only from the identifier cache.\n",
2949                analysis->Identifier,
2950                analysis->Name);
2951 
2952     if ((!analysis1) && analysis2)
2953         ajWarn("analysisadaptorCacheRemove could remove Ensembl Analysis with "
2954                "identifier %u and name '%S' only from the name cache.\n",
2955                analysis->Identifier,
2956                analysis->Name);
2957 
2958     ensAnalysisDel(&analysis1);
2959     ensAnalysisDel(&analysis2);
2960 
2961     return ajTrue;
2962 }
2963 
2964 #endif /* AJFALSE */
2965 
2966 
2967 
2968 
2969 /* @func ensAnalysisadaptorCacheClear *****************************************
2970 **
2971 ** Clear the Ensembl Analysis Adaptor-internal cache of
2972 ** Ensembl Analysis objects.
2973 **
2974 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
2975 **
2976 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2977 **
2978 ** @release 6.4.0
2979 ** @@
2980 ******************************************************************************/
2981 
ensAnalysisadaptorCacheClear(EnsPAnalysisadaptor aa)2982 AjBool ensAnalysisadaptorCacheClear(
2983     EnsPAnalysisadaptor aa)
2984 {
2985     if (!aa)
2986         return ajFalse;
2987 
2988     ajTableDel(&aa->CacheByIdentifier);
2989     ajTableDel(&aa->CacheByName);
2990 
2991     return ajTrue;
2992 }
2993 
2994 
2995 
2996 
2997 /* @section destructors *******************************************************
2998 **
2999 ** Destruction destroys all internal data structures and frees the memory
3000 ** allocated for an Ensembl Analysis Adaptor object.
3001 **
3002 ** @fdata [EnsPAnalysisadaptor]
3003 **
3004 ** @nam3rule Del Destroy (free) an Ensembl Analysis Adaptor
3005 **
3006 ** @argrule * Paa [EnsPAnalysisadaptor*] Ensembl Analysis Adaptor address
3007 **
3008 ** @valrule * [void]
3009 **
3010 ** @fcategory delete
3011 ******************************************************************************/
3012 
3013 
3014 
3015 
3016 /* @func ensAnalysisadaptorDel ************************************************
3017 **
3018 ** Default destructor for an Ensembl Analysis Adaptor.
3019 **
3020 ** This function also clears the internal caches.
3021 **
3022 ** Ensembl Object Adaptors are singleton objects that are registered in the
3023 ** Ensembl Registry and weakly referenced by Ensembl Objects that have been
3024 ** instantiated by it. Therefore, Ensembl Object Adaptors should never be
3025 ** destroyed directly. Upon exit, the Ensembl Registry will call this function
3026 ** if required.
3027 **
3028 ** @param [d] Paa [EnsPAnalysisadaptor*] Ensembl Analysis Adaptor address
3029 **
3030 ** @return [void]
3031 **
3032 ** @release 6.2.0
3033 ** @@
3034 ******************************************************************************/
3035 
ensAnalysisadaptorDel(EnsPAnalysisadaptor * Paa)3036 void ensAnalysisadaptorDel(
3037     EnsPAnalysisadaptor *Paa)
3038 {
3039     EnsPAnalysisadaptor pthis = NULL;
3040 
3041     if (!Paa)
3042         return;
3043 
3044 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
3045     if (ajDebugTest("ensAnalysisadaptorDel"))
3046         ajDebug("ensAnalysisadaptorDel\n"
3047                 "  *Paa %p\n",
3048                 *Paa);
3049 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
3050 
3051     if (!(pthis = *Paa))
3052         return;
3053 
3054     ensAnalysisadaptorCacheClear(pthis);
3055 
3056     ensBaseadaptorDel(&pthis->Adaptor);
3057 
3058     ajMemFree((void **) Paa);
3059 
3060     return;
3061 }
3062 
3063 
3064 
3065 
3066 /* @section member retrieval **************************************************
3067 **
3068 ** Functions for returning members of an Ensembl Analysis Adaptor object.
3069 **
3070 ** @fdata [EnsPAnalysisadaptor]
3071 **
3072 ** @nam3rule Get Return Ensembl Analysis Adaptor attribute(s)
3073 ** @nam4rule Baseadaptor Return the Ensembl Base Adaptor
3074 ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor
3075 **
3076 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3077 **
3078 ** @valrule Baseadaptor [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
3079 ** @valrule Databaseadaptor [EnsPDatabaseadaptor] Ensembl Database Adaptor
3080 ** or NULL
3081 **
3082 ** @fcategory use
3083 ******************************************************************************/
3084 
3085 
3086 
3087 
3088 /* @func ensAnalysisadaptorGetBaseadaptor *************************************
3089 **
3090 ** Get the Ensembl Base Adaptor member of an Ensembl Analysis Adaptor.
3091 **
3092 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3093 **
3094 ** @return [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
3095 **
3096 ** @release 6.2.0
3097 ** @@
3098 ******************************************************************************/
3099 
ensAnalysisadaptorGetBaseadaptor(EnsPAnalysisadaptor aa)3100 EnsPBaseadaptor ensAnalysisadaptorGetBaseadaptor(
3101     EnsPAnalysisadaptor aa)
3102 {
3103     return (aa) ? aa->Adaptor : NULL;
3104 }
3105 
3106 
3107 
3108 
3109 /* @func ensAnalysisadaptorGetDatabaseadaptor *********************************
3110 **
3111 ** Get the Ensembl Database Adaptor member of an Ensembl Analysis Adaptor.
3112 **
3113 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3114 **
3115 ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL
3116 **
3117 ** @release 6.2.0
3118 ** @@
3119 ******************************************************************************/
3120 
ensAnalysisadaptorGetDatabaseadaptor(EnsPAnalysisadaptor aa)3121 EnsPDatabaseadaptor ensAnalysisadaptorGetDatabaseadaptor(
3122     EnsPAnalysisadaptor aa)
3123 {
3124     return ensBaseadaptorGetDatabaseadaptor(
3125         ensAnalysisadaptorGetBaseadaptor(aa));
3126 }
3127 
3128 
3129 
3130 
3131 /* @section object retrieval **************************************************
3132 **
3133 ** Functions for fetching Ensembl Analysis objects from an
3134 ** Ensembl SQL database.
3135 **
3136 ** @fdata [EnsPAnalysisadaptor]
3137 **
3138 ** @nam3rule Fetch Fetch Ensembl Analysis object(s)
3139 ** @nam4rule All Fetch all Ensembl Analysis objects
3140 ** @nam4rule Allby Fetch all Ensembl Analysis objects matching a criterion
3141 ** @nam5rule Featureclass Fetch all by Feature class
3142 ** @nam4rule By Fetch one Ensembl Analysis object matching a criterion
3143 ** @nam5rule Identifier Fetch by an SQL database internal identifier
3144 ** @nam5rule Name Fetch by a name
3145 **
3146 ** @argrule * aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3147 ** @argrule All analyses [AjPList] AJAX List of Ensembl Analysis objects
3148 ** @argrule AllbyFeatureclass class [const AjPStr] Ensembl Feature class
3149 ** @argrule AllbyFeatureclass analyses [AjPList]
3150 ** AJAX List of Ensembl Analysis objects
3151 ** @argrule ByIdentifier identifier [ajuint] SQL database-internal identifier
3152 ** @argrule ByIdentifier Panalysis [EnsPAnalysis*] Ensembl Analysis address
3153 ** @argrule ByName name [const AjPStr] Ensembl Analysis name
3154 ** @argrule ByName Panalysis [EnsPAnalysis*] Ensembl Analysis address
3155 **
3156 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
3157 **
3158 ** @fcategory use
3159 ******************************************************************************/
3160 
3161 
3162 
3163 
3164 /* @funcstatic analysisadaptorFetchAll ****************************************
3165 **
3166 ** An ajTableMap "apply" function to return all Ensembl Analysis objects from
3167 ** the Ensembl Analysis Adaptor-internal cache.
3168 **
3169 ** @param [u] key [const void*] AJAX unsigned integer key data address
3170 ** @param [u] Pvalue [void**] Ensembl Analysis value data address
3171 ** @param [u] cl [void*]
3172 ** AJAX List of Ensembl Analysis objects, passed in via ajTableMap
3173 ** @see ajTableMap
3174 **
3175 ** @return [void]
3176 **
3177 ** @release 6.3.0
3178 ** @@
3179 ******************************************************************************/
3180 
analysisadaptorFetchAll(const void * key,void ** Pvalue,void * cl)3181 static void analysisadaptorFetchAll(const void *key,
3182                                     void **Pvalue,
3183                                     void *cl)
3184 {
3185     if (!key)
3186         return;
3187 
3188     if (!Pvalue)
3189         return;
3190 
3191     if (!*Pvalue)
3192         return;
3193 
3194     if (!cl)
3195         return;
3196 
3197     ajListPushAppend((AjPList) cl,
3198                      (void *) ensAnalysisNewRef(*((EnsPAnalysis *) Pvalue)));
3199 
3200     return;
3201 }
3202 
3203 
3204 
3205 
3206 /* @func ensAnalysisadaptorFetchAll *******************************************
3207 **
3208 ** Fetch all Ensembl Analysis objects.
3209 **
3210 ** The caller is responsible for deleting the Ensembl Analysis objects before
3211 ** deleting the AJAX List object.
3212 **
3213 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_all
3214 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3215 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
3216 **
3217 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3218 **
3219 ** @release 6.2.0
3220 ** @@
3221 ******************************************************************************/
3222 
ensAnalysisadaptorFetchAll(EnsPAnalysisadaptor aa,AjPList analyses)3223 AjBool ensAnalysisadaptorFetchAll(
3224     EnsPAnalysisadaptor aa,
3225     AjPList analyses)
3226 {
3227     if (!aa)
3228         return ajFalse;
3229 
3230     if (!analyses)
3231         return ajFalse;
3232 
3233     if (!aa->CacheByIdentifier)
3234         analysisadaptorCacheInit(aa);
3235 
3236     ajTableMap(aa->CacheByIdentifier,
3237                &analysisadaptorFetchAll,
3238                (void *) analyses);
3239 
3240     return ajTrue;
3241 }
3242 
3243 
3244 
3245 
3246 /* @func ensAnalysisadaptorFetchAllbyFeatureclass *****************************
3247 **
3248 ** Fetch all Ensembl Analysis objects referenced by an Ensembl Feature class.
3249 **
3250 ** Please see the analysisadaptorFeatureClasses array for a list of valid
3251 ** Feature classes that reference Ensembl Analysis objects.
3252 **
3253 ** The caller is responsible for deleting the Ensembl Analysis objects before
3254 ** deleting the AJAX List.
3255 **
3256 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_all_by_feature_class
3257 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3258 ** @param [r] class [const AjPStr] Ensembl Feature class
3259 ** @param [u] analyses [AjPList] AJAX List of Ensembl Analysis objects
3260 **
3261 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3262 **
3263 ** @release 6.4.0
3264 ** @@
3265 ******************************************************************************/
3266 
ensAnalysisadaptorFetchAllbyFeatureclass(EnsPAnalysisadaptor aa,const AjPStr class,AjPList analyses)3267 AjBool ensAnalysisadaptorFetchAllbyFeatureclass(
3268     EnsPAnalysisadaptor aa,
3269     const AjPStr class,
3270     AjPList analyses)
3271 {
3272     register ajuint i = 0U;
3273     ajuint identifier = 0U;
3274     ajuint match      = 0U;
3275 
3276     AjPSqlstatement sqls = NULL;
3277     AjISqlrow sqli       = NULL;
3278     AjPSqlrow sqlr       = NULL;
3279 
3280     AjPStr statement = NULL;
3281 
3282     EnsPAnalysis analysis = NULL;
3283 
3284     EnsPDatabaseadaptor dba = NULL;
3285 
3286     if (!aa)
3287         return ajFalse;
3288 
3289     if (!(class && ajStrGetLen(class)))
3290         return ajFalse;
3291 
3292     if (!analyses)
3293         return ajFalse;
3294 
3295     for (i = 0U; analysisadaptorKFeatureClasses[i]; i += 2U)
3296         if (ajStrMatchC(class, analysisadaptorKFeatureClasses[i]))
3297             match = i + 1U;
3298 
3299     if (match)
3300     {
3301         dba = ensAnalysisadaptorGetDatabaseadaptor(aa);
3302 
3303         statement = ajFmtStr(
3304             "SELECT DISTINCT %s.analysis_id FROM %s",
3305             analysisadaptorKFeatureClasses[match],
3306             analysisadaptorKFeatureClasses[match]);
3307 
3308         sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
3309 
3310         sqli = ajSqlrowiterNew(sqls);
3311 
3312         while (!ajSqlrowiterDone(sqli))
3313         {
3314             identifier = 0;
3315 
3316             sqlr = ajSqlrowiterGet(sqli);
3317 
3318             ajSqlcolumnToUint(sqlr, &identifier);
3319 
3320             ensAnalysisadaptorFetchByIdentifier(aa, identifier, &analysis);
3321 
3322             if (analysis)
3323                 ajListPushAppend(analyses, (void *) analysis);
3324             else
3325                 ajWarn("ensAnalysisadaptorFetchAllbyFeatureclass found "
3326                        "Ensembl Analysis identifier %u in the '%s' table, "
3327                        "which is not referenced in the 'analysis' table.\n",
3328                        identifier,
3329                        analysisadaptorKFeatureClasses[match]);
3330         }
3331 
3332         ajSqlrowiterDel(&sqli);
3333 
3334         ensDatabaseadaptorSqlstatementDel(dba, &sqls);
3335 
3336         ajStrDel(&statement);
3337     }
3338     else
3339     {
3340         ajDebug("ensAnalysisadaptorFetchAllbyFeatureclass got invalid "
3341                 "Feature class '%S'\n",
3342                 class);
3343 
3344         return ajFalse;
3345     }
3346 
3347     return ajTrue;
3348 }
3349 
3350 
3351 
3352 
3353 /* @func ensAnalysisadaptorFetchByIdentifier **********************************
3354 **
3355 ** Fetch an Ensembl Analysis by its SQL database-internal identifier.
3356 ** The caller is responsible for deleting the Ensembl Analysis.
3357 **
3358 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_by_dbID
3359 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3360 ** @param [r] identifier [ajuint] SQL database-internal identifier
3361 ** @param [wP] Panalysis [EnsPAnalysis*] Ensembl Analysis address
3362 **
3363 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3364 **
3365 ** @release 6.2.0
3366 ** @@
3367 ******************************************************************************/
3368 
ensAnalysisadaptorFetchByIdentifier(EnsPAnalysisadaptor aa,ajuint identifier,EnsPAnalysis * Panalysis)3369 AjBool ensAnalysisadaptorFetchByIdentifier(
3370     EnsPAnalysisadaptor aa,
3371     ajuint identifier,
3372     EnsPAnalysis *Panalysis)
3373 {
3374     AjBool result = AJFALSE;
3375 
3376     if (!aa)
3377         return ajFalse;
3378 
3379     if (!identifier)
3380         return ajFalse;
3381 
3382     if (!Panalysis)
3383         return ajFalse;
3384 
3385     /*
3386     ** Initially, search the identifier cache.
3387     ** For any object returned by the AJAX Table the reference counter needs
3388     ** to be incremented manually.
3389     */
3390 
3391     if (!aa->CacheByIdentifier)
3392         analysisadaptorCacheInit(aa);
3393 
3394     *Panalysis = (EnsPAnalysis) ajTableFetchmodV(aa->CacheByIdentifier,
3395                                                  (const void *) &identifier);
3396 
3397     if (*Panalysis)
3398     {
3399         ensAnalysisNewRef(*Panalysis);
3400 
3401         return ajTrue;
3402     }
3403 
3404     /* For a cache miss re-query the database. */
3405 
3406     result = ensBaseadaptorFetchByIdentifier(
3407         ensAnalysisadaptorGetBaseadaptor(aa),
3408         identifier,
3409         (void **) Panalysis);
3410 
3411     analysisadaptorCacheInsert(aa, Panalysis);
3412 
3413     return result;
3414 }
3415 
3416 
3417 
3418 
3419 /* @func ensAnalysisadaptorFetchByName ****************************************
3420 **
3421 ** Fetch an Ensembl Analysis by its name.
3422 ** The caller is responsible for deleting the Ensembl Analysis.
3423 **
3424 ** @cc Bio::EnsEMBL::DBSQL::AnalysisAdaptor::fetch_by_logic_name
3425 ** @param [u] aa [EnsPAnalysisadaptor] Ensembl Analysis Adaptor
3426 ** @param [r] name [const AjPStr] Ensembl Analysis name
3427 ** @param [wP] Panalysis [EnsPAnalysis*] Ensembl Analysis address
3428 **
3429 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
3430 **
3431 ** @release 6.2.0
3432 ** @@
3433 ******************************************************************************/
3434 
ensAnalysisadaptorFetchByName(EnsPAnalysisadaptor aa,const AjPStr name,EnsPAnalysis * Panalysis)3435 AjBool ensAnalysisadaptorFetchByName(
3436     EnsPAnalysisadaptor aa,
3437     const AjPStr name,
3438     EnsPAnalysis *Panalysis)
3439 {
3440     char *txtname = NULL;
3441 
3442     AjBool result = AJFALSE;
3443 
3444     AjPList analyses = NULL;
3445 
3446     AjPStr constraint = NULL;
3447 
3448     EnsPAnalysis analysis = NULL;
3449 
3450     EnsPBaseadaptor ba = NULL;
3451 
3452     if (!aa)
3453         return ajFalse;
3454 
3455     if (!(name && ajStrGetLen(name)))
3456         return ajFalse;
3457 
3458     if (!Panalysis)
3459         return ajFalse;
3460 
3461     /*
3462     ** Initially, search the name cache.
3463     ** For any object returned by the AJAX Table the reference counter needs
3464     ** to be incremented manually.
3465     */
3466 
3467     if (!aa->CacheByName)
3468         analysisadaptorCacheInit(aa);
3469 
3470     *Panalysis = (EnsPAnalysis) ajTableFetchmodS(aa->CacheByName, name);
3471 
3472     if (*Panalysis)
3473     {
3474         ensAnalysisNewRef(*Panalysis);
3475 
3476         return ajTrue;
3477     }
3478 
3479     /* In case of a cache miss, re-query the database. */
3480 
3481     ba = ensAnalysisadaptorGetBaseadaptor(aa);
3482 
3483     ensBaseadaptorEscapeC(ba, &txtname, name);
3484 
3485     constraint = ajFmtStr("analysis.logic_name = '%s'", txtname);
3486 
3487     ajCharDel(&txtname);
3488 
3489     analyses = ajListNew();
3490 
3491     result = ensBaseadaptorFetchAllbyConstraint(
3492         ba,
3493         constraint,
3494         (EnsPAssemblymapper) NULL,
3495         (EnsPSlice) NULL,
3496         analyses);
3497 
3498     if (ajListGetLength(analyses) > 1)
3499         ajWarn("ensAnalysisadaptorFetchByName got more than one "
3500                "Ensembl Analysis for (UNIQUE) name '%S'.\n",
3501                name);
3502 
3503     ajListPop(analyses, (void **) Panalysis);
3504 
3505     analysisadaptorCacheInsert(aa, Panalysis);
3506 
3507     while (ajListPop(analyses, (void **) &analysis))
3508     {
3509         analysisadaptorCacheInsert(aa, &analysis);
3510 
3511         ensAnalysisDel(&analysis);
3512     }
3513 
3514     ajListFree(&analyses);
3515 
3516     ajStrDel(&constraint);
3517 
3518     return result;
3519 }
3520