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