1 /* @source ensqcsequence ******************************************************
2 **
3 ** Ensembl Quality Check Sequence functions
4 **
5 ** @author Copyright (C) 1999 Ensembl Developers
6 ** @author Copyright (C) 2006 Michael K. Schuster
7 ** @version $Revision: 1.36 $
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 "ensqcsequence.h"
34 
35 
36 
37 
38 /* ========================================================================= */
39 /* =============================== constants =============================== */
40 /* ========================================================================= */
41 
42 
43 
44 
45 /* ========================================================================= */
46 /* =========================== global variables ============================ */
47 /* ========================================================================= */
48 
49 
50 
51 
52 /* ========================================================================= */
53 /* ============================= private data ============================== */
54 /* ========================================================================= */
55 
56 
57 
58 
59 /* ========================================================================= */
60 /* =========================== private constants =========================== */
61 /* ========================================================================= */
62 
63 /* @conststatic qcsequenceadaptorKTablenames **********************************
64 **
65 ** Array of Ensembl Quality Check Sequence Adaptor SQL table names
66 **
67 ******************************************************************************/
68 
69 static const char *qcsequenceadaptorKTablenames[] =
70 {
71     "sequence",
72     (const char *) NULL
73 };
74 
75 
76 
77 
78 /* @conststatic qcsequenceadaptorKColumnnames *********************************
79 **
80 ** Array of Ensembl Quality Check Sequence Adaptor SQL column names
81 **
82 ******************************************************************************/
83 
84 static const char *qcsequenceadaptorKColumnnames[] =
85 {
86     "sequence.sequence_id",
87     "sequence.sequence_db_id",
88     "sequence.name",
89     "sequence.accession",
90     "sequence.version",
91     "sequence.type",
92     "sequence.length",
93     "sequence.cdsstart",
94     "sequence.cdend",
95     "sequence.cdsstrand",
96     "sequence.polya",
97     "sequence.description",
98     (const char *) NULL
99 };
100 
101 
102 
103 
104 /* ========================================================================= */
105 /* =========================== private variables =========================== */
106 /* ========================================================================= */
107 
108 
109 
110 
111 /* ========================================================================= */
112 /* =========================== private functions =========================== */
113 /* ========================================================================= */
114 
115 static AjBool qcsequenceadaptorFetchAllbyStatement(
116     EnsPBaseadaptor ba,
117     const AjPStr statement,
118     EnsPAssemblymapper am,
119     EnsPSlice slice,
120     AjPList qcss);
121 
122 
123 
124 
125 /* ========================================================================= */
126 /* ======================= All functions by section ======================== */
127 /* ========================================================================= */
128 
129 
130 
131 
132 /* @filesection ensqcsequence *************************************************
133 **
134 ** @nam1rule ens Function belongs to the Ensembl library
135 **
136 ******************************************************************************/
137 
138 
139 
140 
141 /* @datasection [EnsPQcsequence] Ensembl Quality Check Sequence ***************
142 **
143 ** @nam2rule Qcsequence Functions for manipulating
144 ** Ensembl Quality Check Sequence objects
145 **
146 ** @cc Bio::EnsEMBL::QC::Sequence
147 ** @cc CVS Revision:
148 ** @cc CVS Tag:
149 **
150 ******************************************************************************/
151 
152 
153 
154 
155 /* @section constructors ******************************************************
156 **
157 ** All constructors return a new Ensembl Quality Check Sequence by pointer.
158 ** It is the responsibility of the user to first destroy any previous
159 ** Quality Check Sequence. The target pointer does not need to be initialised
160 ** to NULL, but it is good programming practice to do so anyway.
161 **
162 ** @fdata [EnsPQcsequence]
163 **
164 ** @nam3rule New Constructor
165 ** @nam4rule Cpy Constructor with existing object
166 ** @nam4rule Ini Constructor with initial values
167 ** @nam4rule Ref Constructor by incrementing the reference counter
168 **
169 ** @argrule Cpy qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
170 ** @argrule Ini qcsa [EnsPQcsequenceadaptor]
171 ** Ensembl Quality Check Sequence Adaptor
172 ** @argrule Ini identifier [ajuint] SQL database-internal identifier
173 ** @argrule Ini qcdb [EnsPQcdatabase] Ensembl Quality Check Database
174 ** @argrule Ini name [AjPStr] Name
175 ** @argrule Ini accession [AjPStr] Accession
176 ** @argrule Ini version [ajuint] Version
177 ** @argrule Ini type [AjPStr] Type
178 ** @argrule Ini length [ajuint] Length
179 ** @argrule Ini cdsstart [ajuint] CDS start
180 ** @argrule Ini cdsend [ajuint] CDS end
181 ** @argrule Ini cdsstrand [ajint] CDS strand
182 ** @argrule Ini polya [ajuint] PolyA+ tail length
183 ** @argrule Ini description [AjPStr] Description
184 ** @argrule Ref qcs [EnsPQcsequence] Ensembl Quality Check Sequence
185 **
186 ** @valrule * [EnsPQcsequence] Ensembl Quality Check Sequence or NULL
187 **
188 ** @fcategory new
189 ******************************************************************************/
190 
191 
192 
193 
194 /* @func ensQcsequenceNewCpy **************************************************
195 **
196 ** Object-based constructor function, which returns an independent object.
197 **
198 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
199 **
200 ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL
201 **
202 ** @release 6.4.0
203 ** @@
204 ******************************************************************************/
205 
ensQcsequenceNewCpy(const EnsPQcsequence qcs)206 EnsPQcsequence ensQcsequenceNewCpy(const EnsPQcsequence qcs)
207 {
208     EnsPQcsequence pthis = NULL;
209 
210     if (!qcs)
211         return NULL;
212 
213     AJNEW0(pthis);
214 
215     pthis->Use        = 1U;
216     pthis->Identifier = qcs->Identifier;
217     pthis->Adaptor    = qcs->Adaptor;
218     pthis->Qcdatabase = ensQcdatabaseNewRef(qcs->Qcdatabase);
219 
220     if (qcs->Name)
221         pthis->Name = ajStrNewRef(qcs->Name);
222 
223     if (qcs->Accession)
224         pthis->Accession = ajStrNewRef(qcs->Accession);
225 
226     pthis->Version = qcs->Version;
227 
228     if (qcs->Type)
229         pthis->Type = ajStrNewRef(qcs->Type);
230 
231     pthis->Length    = qcs->Length;
232     pthis->CdsStart  = qcs->CdsStart;
233     pthis->CdsEnd    = qcs->CdsEnd;
234     pthis->CdsStrand = qcs->CdsStrand;
235     pthis->Polya     = qcs->Polya;
236 
237     if (qcs->Description)
238         pthis->Description = ajStrNewRef(qcs->Description);
239 
240     return pthis;
241 }
242 
243 
244 
245 
246 /* @func ensQcsequenceNewIni **************************************************
247 **
248 ** Constructor for an Ensembl Quality Check Sequence with initial values.
249 **
250 ** @cc Bio::EnsEMBL::Storable::new
251 ** @param [u] qcsa [EnsPQcsequenceadaptor]
252 ** Ensembl Quality Check Sequence Adaptor
253 ** @param [r] identifier [ajuint] SQL database-internal identifier
254 ** @cc Bio::EnsEMBL::QC::Sequence::new
255 ** @param [u] qcdb [EnsPQcdatabase] Ensembl Quality Check Database
256 ** @param [u] name [AjPStr] Name
257 ** @param [u] accession [AjPStr] Accession
258 ** @param [r] version [ajuint] Version
259 ** @param [u] type [AjPStr] Type
260 ** @param [r] length [ajuint] Length
261 ** @param [r] cdsstart [ajuint] CDS start
262 ** @param [r] cdsend [ajuint] CDS end
263 ** @param [r] cdsstrand [ajint] CDS strand
264 ** @param [r] polya [ajuint] PolyA+ tail length
265 ** @param [u] description [AjPStr] Description
266 **
267 ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL
268 **
269 ** @release 6.4.0
270 ** @@
271 ******************************************************************************/
272 
ensQcsequenceNewIni(EnsPQcsequenceadaptor qcsa,ajuint identifier,EnsPQcdatabase qcdb,AjPStr name,AjPStr accession,ajuint version,AjPStr type,ajuint length,ajuint cdsstart,ajuint cdsend,ajint cdsstrand,ajuint polya,AjPStr description)273 EnsPQcsequence ensQcsequenceNewIni(EnsPQcsequenceadaptor qcsa,
274                                    ajuint identifier,
275                                    EnsPQcdatabase qcdb,
276                                    AjPStr name,
277                                    AjPStr accession,
278                                    ajuint version,
279                                    AjPStr type,
280                                    ajuint length,
281                                    ajuint cdsstart,
282                                    ajuint cdsend,
283                                    ajint cdsstrand,
284                                    ajuint polya,
285                                    AjPStr description)
286 {
287     EnsPQcsequence qcs = NULL;
288 
289     if (!qcdb)
290         return NULL;
291 
292     if (!name)
293         return NULL;
294 
295     if (!accession)
296         return NULL;
297 
298     AJNEW0(qcs);
299 
300     qcs->Use        = 1U;
301     qcs->Identifier = identifier;
302     qcs->Adaptor    = qcsa;
303     qcs->Qcdatabase = ensQcdatabaseNewRef(qcdb);
304 
305     if (name)
306         qcs->Name = ajStrNewRef(name);
307 
308     if (accession)
309         qcs->Accession = ajStrNewRef(accession);
310 
311     qcs->Version = version;
312 
313     if (type)
314         qcs->Type = ajStrNewRef(type);
315 
316     qcs->Length    = length;
317     qcs->CdsStart  = cdsstart;
318     qcs->CdsEnd    = cdsend;
319     qcs->CdsStrand = cdsstrand;
320     qcs->Polya     = polya;
321 
322     if (description)
323         qcs->Description = ajStrNewRef(description);
324 
325     return qcs;
326 }
327 
328 
329 
330 
331 /* @func ensQcsequenceNewRef **************************************************
332 **
333 ** Ensembl Object referencing function, which returns a pointer to the
334 ** Ensembl Object passed in and increases its reference count.
335 **
336 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
337 **
338 ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL
339 **
340 ** @release 6.2.0
341 ** @@
342 ******************************************************************************/
343 
ensQcsequenceNewRef(EnsPQcsequence qcs)344 EnsPQcsequence ensQcsequenceNewRef(EnsPQcsequence qcs)
345 {
346     if (!qcs)
347         return NULL;
348 
349     qcs->Use++;
350 
351     return qcs;
352 }
353 
354 
355 
356 
357 /* @section destructors *******************************************************
358 **
359 ** Destruction destroys all internal data structures and frees the memory
360 ** allocated for an Ensembl Quality Check Sequence object.
361 **
362 ** @fdata [EnsPQcsequence]
363 **
364 ** @nam3rule Del Destroy (free) an Ensembl Quality Check Sequence
365 **
366 ** @argrule * Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
367 **
368 ** @valrule * [void]
369 **
370 ** @fcategory delete
371 ******************************************************************************/
372 
373 
374 
375 
376 /* @func ensQcsequenceDel *****************************************************
377 **
378 ** Default destructor for an Ensembl Quality Check Sequence.
379 **
380 ** @param [d] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
381 **
382 ** @return [void]
383 **
384 ** @release 6.2.0
385 ** @@
386 ******************************************************************************/
387 
ensQcsequenceDel(EnsPQcsequence * Pqcs)388 void ensQcsequenceDel(EnsPQcsequence *Pqcs)
389 {
390     EnsPQcsequence pthis = NULL;
391 
392     if (!Pqcs)
393         return;
394 
395 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
396     if (ajDebugTest("ensQcsequenceDel"))
397     {
398         ajDebug("ensQcsequenceDel\n"
399                 "  *Pqcs %p\n",
400                 *Pqcs);
401 
402         ensQcsequenceTrace(*Pqcs, 1);
403     }
404 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
405 
406     if (!(pthis = *Pqcs) || --pthis->Use)
407     {
408         *Pqcs = NULL;
409 
410         return;
411     }
412 
413     ensQcdatabaseDel(&pthis->Qcdatabase);
414 
415     ajStrDel(&pthis->Name);
416     ajStrDel(&pthis->Accession);
417     ajStrDel(&pthis->Type);
418     ajStrDel(&pthis->Description);
419 
420     ajMemFree((void **) Pqcs);
421 
422     return;
423 }
424 
425 
426 
427 
428 /* @section member retrieval **************************************************
429 **
430 ** Functions for returning members of an
431 ** Ensembl Quality Check Sequence object.
432 **
433 ** @fdata [EnsPQcsequence]
434 **
435 ** @nam3rule Get Return Ensembl Quality Check Sequence attribute(s)
436 ** @nam4rule Accession Return the accession number
437 ** @nam4rule Adaptor Return the Ensembl Quality Check Sequence Adaptor
438 ** @nam4rule Cds Return coding sequence members
439 ** @nam5rule End Return the coding sequence end
440 ** @nam5rule Start Return the coding sequence start
441 ** @nam5rule Strand Return the coding sequence strand
442 ** @nam4rule Description Return the description
443 ** @nam4rule Identifier Return the SQL database-internal identifier
444 ** @nam4rule Length Return the length
445 ** @nam4rule Name Return the name
446 ** @nam4rule Polya Return the PolyA+ tail length
447 ** @nam4rule Qcdatabase Return the Ensembl Quality Check Database
448 ** @nam4rule Type Retrun the type
449 ** @nam4rule Version Return the version
450 **
451 ** @argrule * qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
452 **
453 ** @valrule Accession [AjPStr] Accession number or NULL
454 ** @valrule Adaptor [EnsPQcsequenceadaptor]
455 ** Ensembl Quality Check Sequence Adaptor or NULL
456 ** @valrule CdsEnd [ajuint] Coding sequence end or 0U
457 ** @valrule CdsStart [ajuint] Coding sequence start or 0U
458 ** @valrule CdsStrand [ajint] Coding sequence strand or 0
459 ** @valrule Description [AjPStr] Description or NULL
460 ** @valrule Identifier [ajuint] SQL database-internal identifier or 0U
461 ** @valrule Length [ajuint] Length or 0U
462 ** @valrule Name [AjPStr] Name or NULL
463 ** @valrule Polya [ajuint] Polya tail length or 0U
464 ** @valrule Qcdatabase [EnsPQcdatabase] Ensembl Quality Check Database or NULL
465 ** @valrule Type [AjPStr] Type or NULL
466 ** @valrule Version [ajuint] Version or 0U
467 **
468 ** @fcategory use
469 ******************************************************************************/
470 
471 
472 
473 
474 /* @func ensQcsequenceGetAccession ********************************************
475 **
476 ** Get the accession number member of an Ensembl Quality Check Sequence.
477 **
478 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
479 **
480 ** @return [AjPStr] Accession number or NULL
481 **
482 ** @release 6.2.0
483 ** @@
484 ******************************************************************************/
485 
ensQcsequenceGetAccession(const EnsPQcsequence qcs)486 AjPStr ensQcsequenceGetAccession(const EnsPQcsequence qcs)
487 {
488     return (qcs) ? qcs->Accession : NULL;
489 }
490 
491 
492 
493 
494 /* @func ensQcsequenceGetAdaptor **********************************************
495 **
496 ** Get the Ensembl Quality Check Sequence Adaptor member of an
497 ** Ensembl Quality Check Sequence.
498 **
499 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
500 **
501 ** @return [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor
502 ** or NULL
503 **
504 ** @release 6.2.0
505 ** @@
506 ******************************************************************************/
507 
ensQcsequenceGetAdaptor(const EnsPQcsequence qcs)508 EnsPQcsequenceadaptor ensQcsequenceGetAdaptor(const EnsPQcsequence qcs)
509 {
510     return (qcs) ? qcs->Adaptor : NULL;
511 }
512 
513 
514 
515 
516 /* @func ensQcsequenceGetCdsEnd ***********************************************
517 **
518 ** Get the CDS end member of an Ensembl Quality Check Sequence.
519 **
520 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
521 **
522 ** @return [ajuint] CDS start or 0U
523 **
524 ** @release 6.4.0
525 ** @@
526 ******************************************************************************/
527 
ensQcsequenceGetCdsEnd(const EnsPQcsequence qcs)528 ajuint ensQcsequenceGetCdsEnd(const EnsPQcsequence qcs)
529 {
530     return (qcs) ? qcs->CdsEnd : 0U;
531 }
532 
533 
534 
535 
536 /* @func ensQcsequenceGetCdsStart *********************************************
537 **
538 ** Get the CDS start member of an Ensembl Quality Check Sequence.
539 **
540 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
541 **
542 ** @return [ajuint] CDS start or 0U
543 **
544 ** @release 6.4.0
545 ** @@
546 ******************************************************************************/
547 
ensQcsequenceGetCdsStart(const EnsPQcsequence qcs)548 ajuint ensQcsequenceGetCdsStart(const EnsPQcsequence qcs)
549 {
550     return (qcs) ? qcs->CdsStart : 0U;
551 }
552 
553 
554 
555 
556 /* @func ensQcsequenceGetCdsStrand ********************************************
557 **
558 ** Get the CDS strand member of an Ensembl Quality Check Sequence.
559 **
560 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
561 **
562 ** @return [ajint] CDS strand or 0
563 **
564 ** @release 6.4.0
565 ** @@
566 ******************************************************************************/
567 
ensQcsequenceGetCdsStrand(const EnsPQcsequence qcs)568 ajint ensQcsequenceGetCdsStrand(const EnsPQcsequence qcs)
569 {
570     return (qcs) ? qcs->CdsStrand : 0;
571 }
572 
573 
574 
575 
576 /* @func ensQcsequenceGetDescription ******************************************
577 **
578 ** Get the description member of an Ensembl Quality Check Sequence.
579 **
580 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
581 **
582 ** @return [AjPStr] Description or NULL
583 **
584 ** @release 6.2.0
585 ** @@
586 ******************************************************************************/
587 
ensQcsequenceGetDescription(const EnsPQcsequence qcs)588 AjPStr ensQcsequenceGetDescription(const EnsPQcsequence qcs)
589 {
590     return (qcs) ? qcs->Description : NULL;
591 }
592 
593 
594 
595 
596 /* @func ensQcsequenceGetIdentifier *******************************************
597 **
598 ** Get the SQL database-internal identifier member of an
599 ** Ensembl Quality Check Sequence.
600 **
601 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
602 **
603 ** @return [ajuint] SQL database-internal identifier or 0U
604 **
605 ** @release 6.2.0
606 ** @@
607 ******************************************************************************/
608 
ensQcsequenceGetIdentifier(const EnsPQcsequence qcs)609 ajuint ensQcsequenceGetIdentifier(const EnsPQcsequence qcs)
610 {
611     return (qcs) ? qcs->Identifier : 0U;
612 }
613 
614 
615 
616 
617 /* @func ensQcsequenceGetLength ***********************************************
618 **
619 ** Get the length member of an Ensembl Quality Check Sequence.
620 **
621 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
622 **
623 ** @return [ajuint] Length or 0U
624 **
625 ** @release 6.2.0
626 ** @@
627 ******************************************************************************/
628 
ensQcsequenceGetLength(const EnsPQcsequence qcs)629 ajuint ensQcsequenceGetLength(const EnsPQcsequence qcs)
630 {
631     return (qcs) ? qcs->Length : 0U;
632 }
633 
634 
635 
636 
637 /* @func ensQcsequenceGetName *************************************************
638 **
639 ** Get the name member of an Ensembl Quality Check Sequence.
640 **
641 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
642 **
643 ** @return [AjPStr] Name or NULL
644 **
645 ** @release 6.2.0
646 ** @@
647 ******************************************************************************/
648 
ensQcsequenceGetName(const EnsPQcsequence qcs)649 AjPStr ensQcsequenceGetName(const EnsPQcsequence qcs)
650 {
651     return (qcs) ? qcs->Name : NULL;
652 }
653 
654 
655 
656 
657 /* @func ensQcsequenceGetPolya ************************************************
658 **
659 ** Get the PolyA+ tail length member of an Ensembl Quality Check Sequence.
660 **
661 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
662 **
663 ** @return [ajuint] PolyA+ tail length or 0U
664 **
665 ** @release 6.4.0
666 ** @@
667 ******************************************************************************/
668 
ensQcsequenceGetPolya(const EnsPQcsequence qcs)669 ajuint ensQcsequenceGetPolya(const EnsPQcsequence qcs)
670 {
671     return (qcs) ? qcs->Polya : 0U;
672 }
673 
674 
675 
676 
677 /* @func ensQcsequenceGetQcdatabase *******************************************
678 **
679 ** Get the Ensembl Quality Check Database member of an
680 ** Ensembl Quality Check Sequence.
681 **
682 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
683 **
684 ** @return [EnsPQcdatabase] Ensembl Quality Check Database or NULL
685 **
686 ** @release 6.2.0
687 ** @@
688 ******************************************************************************/
689 
ensQcsequenceGetQcdatabase(const EnsPQcsequence qcs)690 EnsPQcdatabase ensQcsequenceGetQcdatabase(const EnsPQcsequence qcs)
691 {
692     return (qcs) ? qcs->Qcdatabase : NULL;
693 }
694 
695 
696 
697 
698 /* @func ensQcsequenceGetType *************************************************
699 **
700 ** Get the type member of an Ensembl Quality Check Sequence.
701 **
702 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
703 **
704 ** @return [AjPStr] Type or NULL
705 **
706 ** @release 6.2.0
707 ** @@
708 ******************************************************************************/
709 
ensQcsequenceGetType(const EnsPQcsequence qcs)710 AjPStr ensQcsequenceGetType(const EnsPQcsequence qcs)
711 {
712     return (qcs) ? qcs->Type : NULL;
713 }
714 
715 
716 
717 
718 /* @func ensQcsequenceGetVersion **********************************************
719 **
720 ** Get the version member of an Ensembl Quality Check Sequence.
721 **
722 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
723 **
724 ** @return [ajuint] Version or 0U
725 **
726 ** @release 6.2.0
727 ** @@
728 ******************************************************************************/
729 
ensQcsequenceGetVersion(const EnsPQcsequence qcs)730 ajuint ensQcsequenceGetVersion(const EnsPQcsequence qcs)
731 {
732     return (qcs) ? qcs->Version : 0U;
733 }
734 
735 
736 
737 
738 /* @section modifiers *********************************************************
739 **
740 ** Functions for assigning members of an
741 ** Ensembl Quality Check Sequence object.
742 **
743 ** @fdata [EnsPQcsequence]
744 **
745 ** @nam3rule Set Set one member of an Ensembl Quality Check Sequence
746 ** @nam4rule Accession Set the accession number
747 ** @nam4rule Adaptor Set the Ensembl Quality Check Sequence Adaptor
748 ** @nam4rule Cds Set coding sequence members
749 ** @nam5rule End Set the CDS end
750 ** @nam5rule Start Set the CDS start
751 ** @nam5rule Strand Set the CDS strand
752 ** @nam4rule Description Set the description
753 ** @nam4rule Identifier Set the SQL database-internal identifier
754 ** @nam4rule Length Set the length
755 ** @nam4rule Name Set the name
756 ** @nam4rule Polya Set the Polya+ tail length
757 ** @nam4rule Qcdatabase Set the Ensembl Quality Check Database
758 ** @nam4rule Type Set the type
759 ** @nam4rule Version Set the version
760 **
761 ** @argrule * qcs [EnsPQcsequence] Ensembl Quality Check Sequence
762 ** @argrule Accession accession [AjPStr] Accession number
763 ** @argrule Adaptor qcsa [EnsPQcsequenceadaptor]
764 ** Ensembl Quality Check Sequence Adaptor
765 ** @argrule CdsEnd cdsend [ajuint] CDS end
766 ** @argrule CdsStart cdsstart [ajuint] CDS start
767 ** @argrule CdsStrand cdsstrand [ajint] CDS strand
768 ** @argrule Description description [AjPStr] Description
769 ** @argrule Identifier identifier [ajuint] SQL database-internal identifier
770 ** @argrule Length length [ajuint] Length
771 ** @argrule Name name [AjPStr] Name
772 ** @argrule Polya polya [ajuint] PolyA+ tail length
773 ** @argrule Qcdatabase qcdb [EnsPQcdatabase] Ensembl Quality Check Database
774 ** @argrule Type type [AjPStr] Type
775 ** @argrule Version version [ajuint] Version
776 **
777 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
778 **
779 ** @fcategory modify
780 ******************************************************************************/
781 
782 
783 
784 
785 /* @func ensQcsequenceSetAccession ********************************************
786 **
787 ** Set the accession number member of an Ensembl Quality Check Sequence.
788 **
789 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
790 ** @param [uN] accession [AjPStr] Accession number
791 **
792 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
793 **
794 ** @release 6.2.0
795 ** @@
796 ******************************************************************************/
797 
ensQcsequenceSetAccession(EnsPQcsequence qcs,AjPStr accession)798 AjBool ensQcsequenceSetAccession(EnsPQcsequence qcs, AjPStr accession)
799 {
800     if (!qcs)
801         return ajFalse;
802 
803     ajStrDel(&qcs->Accession);
804 
805     qcs->Accession = ajStrNewRef(accession);
806 
807     return ajTrue;
808 }
809 
810 
811 
812 
813 /* @func ensQcsequenceSetAdaptor **********************************************
814 **
815 ** Set the Ensembl Quality Check Sequence Adaptor member of an
816 ** Ensembl Quality Check Sequence.
817 **
818 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
819 ** @param [uN] qcsa [EnsPQcsequenceadaptor]
820 ** Ensembl Quality Check Sequence Adaptor
821 **
822 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
823 **
824 ** @release 6.2.0
825 ** @@
826 ******************************************************************************/
827 
ensQcsequenceSetAdaptor(EnsPQcsequence qcs,EnsPQcsequenceadaptor qcsa)828 AjBool ensQcsequenceSetAdaptor(EnsPQcsequence qcs, EnsPQcsequenceadaptor qcsa)
829 {
830     if (!qcs)
831         return ajFalse;
832 
833     qcs->Adaptor = qcsa;
834 
835     return ajTrue;
836 }
837 
838 
839 
840 
841 /* @func ensQcsequenceSetCdsEnd ***********************************************
842 **
843 ** Set the CDS end member of an Ensembl Quality Check Sequence.
844 **
845 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
846 ** @param [r] cdsend [ajuint] CDS end
847 **
848 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
849 **
850 ** @release 6.4.0
851 ** @@
852 ******************************************************************************/
853 
ensQcsequenceSetCdsEnd(EnsPQcsequence qcs,ajuint cdsend)854 AjBool ensQcsequenceSetCdsEnd(EnsPQcsequence qcs, ajuint cdsend)
855 {
856     if (!qcs)
857         return ajFalse;
858 
859     qcs->CdsEnd = cdsend;
860 
861     return ajTrue;
862 }
863 
864 
865 
866 
867 /* @func ensQcsequenceSetCdsStart *********************************************
868 **
869 ** Set the CDS start member of an Ensembl Quality Check Sequence.
870 **
871 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
872 ** @param [r] cdsstart [ajuint] CDS start
873 **
874 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
875 **
876 ** @release 6.4.0
877 ** @@
878 ******************************************************************************/
879 
ensQcsequenceSetCdsStart(EnsPQcsequence qcs,ajuint cdsstart)880 AjBool ensQcsequenceSetCdsStart(EnsPQcsequence qcs, ajuint cdsstart)
881 {
882     if (!qcs)
883         return ajFalse;
884 
885     qcs->CdsStart = cdsstart;
886 
887     return ajTrue;
888 }
889 
890 
891 
892 
893 /* @func ensQcsequenceSetCdsStrand ********************************************
894 **
895 ** Set the CDS strand member of an Ensembl Quality Check Sequence.
896 **
897 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
898 ** @param [r] cdsstrand [ajint] CDS strand
899 **
900 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
901 **
902 ** @release 6.4.0
903 ** @@
904 ******************************************************************************/
905 
ensQcsequenceSetCdsStrand(EnsPQcsequence qcs,ajint cdsstrand)906 AjBool ensQcsequenceSetCdsStrand(EnsPQcsequence qcs, ajint cdsstrand)
907 {
908     if (!qcs)
909         return ajFalse;
910 
911     qcs->CdsStrand = cdsstrand;
912 
913     return ajTrue;
914 }
915 
916 
917 
918 
919 /* @func ensQcsequenceSetDescription ******************************************
920 **
921 ** Set the description member of an Ensembl Quality Check Sequence.
922 **
923 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
924 ** @param [uN] description [AjPStr] Description
925 **
926 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
927 **
928 ** @release 6.2.0
929 ** @@
930 ******************************************************************************/
931 
ensQcsequenceSetDescription(EnsPQcsequence qcs,AjPStr description)932 AjBool ensQcsequenceSetDescription(EnsPQcsequence qcs, AjPStr description)
933 {
934     if (!qcs)
935         return ajFalse;
936 
937     ajStrDel(&qcs->Description);
938 
939     qcs->Description = ajStrNewRef(description);
940 
941     return ajTrue;
942 }
943 
944 
945 
946 
947 /* @func ensQcsequenceSetIdentifier *******************************************
948 **
949 ** Set the SQL database-internal identifier member of an
950 ** Ensembl Quality Check Sequence.
951 **
952 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
953 ** @param [r] identifier [ajuint] SQL database-internal identifier
954 **
955 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
956 **
957 ** @release 6.2.0
958 ** @@
959 ******************************************************************************/
960 
ensQcsequenceSetIdentifier(EnsPQcsequence qcs,ajuint identifier)961 AjBool ensQcsequenceSetIdentifier(EnsPQcsequence qcs, ajuint identifier)
962 {
963     if (!qcs)
964         return ajFalse;
965 
966     qcs->Identifier = identifier;
967 
968     return ajTrue;
969 }
970 
971 
972 
973 
974 /* @func ensQcsequenceSetLength ***********************************************
975 **
976 ** Set the length member of an Ensembl Quality Check Sequence.
977 **
978 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
979 ** @param [r] length [ajuint] Length
980 **
981 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
982 **
983 ** @release 6.2.0
984 ** @@
985 ******************************************************************************/
986 
ensQcsequenceSetLength(EnsPQcsequence qcs,ajuint length)987 AjBool ensQcsequenceSetLength(EnsPQcsequence qcs, ajuint length)
988 {
989     if (!qcs)
990         return ajFalse;
991 
992     qcs->Length = length;
993 
994     return ajTrue;
995 }
996 
997 
998 
999 
1000 /* @func ensQcsequenceSetName *************************************************
1001 **
1002 ** Set the name member of an Ensembl Quality Check Sequence.
1003 **
1004 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
1005 ** @param [uN] name [AjPStr] Name
1006 **
1007 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1008 **
1009 ** @release 6.2.0
1010 ** @@
1011 ******************************************************************************/
1012 
ensQcsequenceSetName(EnsPQcsequence qcs,AjPStr name)1013 AjBool ensQcsequenceSetName(EnsPQcsequence qcs, AjPStr name)
1014 {
1015     if (!qcs)
1016         return ajFalse;
1017 
1018     ajStrDel(&qcs->Name);
1019 
1020     qcs->Name = ajStrNewRef(name);
1021 
1022     return ajTrue;
1023 }
1024 
1025 
1026 
1027 
1028 /* @func ensQcsequenceSetPolya ************************************************
1029 **
1030 ** Set the PolyA+ tail length member of an Ensembl Quality Check Sequence.
1031 **
1032 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
1033 ** @param [r] polya [ajuint] PolyA+ tail length
1034 **
1035 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1036 **
1037 ** @release 6.4.0
1038 ** @@
1039 ******************************************************************************/
1040 
ensQcsequenceSetPolya(EnsPQcsequence qcs,ajuint polya)1041 AjBool ensQcsequenceSetPolya(EnsPQcsequence qcs, ajuint polya)
1042 {
1043     if (!qcs)
1044         return ajFalse;
1045 
1046     qcs->Polya = polya;
1047 
1048     return ajTrue;
1049 }
1050 
1051 
1052 
1053 
1054 /* @func ensQcsequenceSetQcdatabase *******************************************
1055 **
1056 ** Set the Ensembl Quality Check Database member of an
1057 ** Ensembl Quality Check Sequence.
1058 **
1059 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
1060 ** @param [uN] qcdb [EnsPQcdatabase] Ensembl Quality Check Database
1061 **
1062 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1063 **
1064 ** @release 6.2.0
1065 ** @@
1066 ******************************************************************************/
1067 
ensQcsequenceSetQcdatabase(EnsPQcsequence qcs,EnsPQcdatabase qcdb)1068 AjBool ensQcsequenceSetQcdatabase(EnsPQcsequence qcs, EnsPQcdatabase qcdb)
1069 {
1070     if (!qcs)
1071         return ajFalse;
1072 
1073     ensQcdatabaseDel(&qcs->Qcdatabase);
1074 
1075     qcs->Qcdatabase = ensQcdatabaseNewRef(qcdb);
1076 
1077     return ajTrue;
1078 }
1079 
1080 
1081 
1082 
1083 /* @func ensQcsequenceSetType *************************************************
1084 **
1085 ** Set the type member of an Ensembl Quality Check Sequence.
1086 **
1087 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
1088 ** @param [uN] type [AjPStr] Type
1089 **
1090 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1091 **
1092 ** @release 6.2.0
1093 ** @@
1094 ******************************************************************************/
1095 
ensQcsequenceSetType(EnsPQcsequence qcs,AjPStr type)1096 AjBool ensQcsequenceSetType(EnsPQcsequence qcs, AjPStr type)
1097 {
1098     if (!qcs)
1099         return ajFalse;
1100 
1101     ajStrDel(&qcs->Type);
1102 
1103     qcs->Type = ajStrNewRef(type);
1104 
1105     return ajTrue;
1106 }
1107 
1108 
1109 
1110 
1111 /* @func ensQcsequenceSetVersion **********************************************
1112 **
1113 ** Set the version member of an Ensembl Quality Check Sequence.
1114 **
1115 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
1116 ** @param [r] version [ajuint] Version
1117 **
1118 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1119 **
1120 ** @release 6.2.0
1121 ** @@
1122 ******************************************************************************/
1123 
ensQcsequenceSetVersion(EnsPQcsequence qcs,ajuint version)1124 AjBool ensQcsequenceSetVersion(EnsPQcsequence qcs, ajuint version)
1125 {
1126     if (!qcs)
1127         return ajFalse;
1128 
1129     qcs->Version = version;
1130 
1131     return ajTrue;
1132 }
1133 
1134 
1135 
1136 
1137 /* @section debugging *********************************************************
1138 **
1139 ** Functions for reporting of an Ensembl Quality Check Sequence object.
1140 **
1141 ** @fdata [EnsPQcsequence]
1142 **
1143 ** @nam3rule Trace Report Ensembl Quality Check Sequence members to debug file
1144 **
1145 ** @argrule Trace qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1146 ** @argrule Trace level [ajuint] Indentation level
1147 **
1148 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1149 **
1150 ** @fcategory misc
1151 ******************************************************************************/
1152 
1153 
1154 
1155 
1156 /* @func ensQcsequenceTrace ***************************************************
1157 **
1158 ** Trace an Ensembl Quality Check Sequence.
1159 **
1160 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1161 ** @param [r] level [ajuint] Indentation level
1162 **
1163 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1164 **
1165 ** @release 6.2.0
1166 ** @@
1167 ******************************************************************************/
1168 
ensQcsequenceTrace(const EnsPQcsequence qcs,ajuint level)1169 AjBool ensQcsequenceTrace(const EnsPQcsequence qcs, ajuint level)
1170 {
1171     AjPStr indent = NULL;
1172 
1173     if (!qcs)
1174         return ajFalse;
1175 
1176     indent = ajStrNew();
1177 
1178     ajStrAppendCountK(&indent, ' ', level * 2);
1179 
1180     ajDebug("%SensQcsequenceTrace %p\n"
1181             "%S  Use %u\n"
1182             "%S  Identifier %u\n"
1183             "%S  Adaptor %p\n"
1184             "%S  Qcdatabase %p\n"
1185             "%S  Name '%S'\n"
1186             "%S  Accession '%S'\n"
1187             "%S  Version %u\n"
1188             "%S  Type '%S'\n"
1189             "%S  Length %u\n"
1190             "%S  CdsStart %u\n"
1191             "%S  CdsEnd %u\n"
1192             "%S  CdsStrand %d\n"
1193             "%S  Polya %u\n"
1194             "%S  Description '%S'\n",
1195             indent, qcs,
1196             indent, qcs->Use,
1197             indent, qcs->Identifier,
1198             indent, qcs->Adaptor,
1199             indent, qcs->Qcdatabase,
1200             indent, qcs->Name,
1201             indent, qcs->Accession,
1202             indent, qcs->Version,
1203             indent, qcs->Type,
1204             indent, qcs->Length,
1205             indent, qcs->CdsStart,
1206             indent, qcs->CdsEnd,
1207             indent, qcs->CdsStrand,
1208             indent, qcs->Polya,
1209             indent, qcs->Description);
1210 
1211     ensQcdatabaseTrace(qcs->Qcdatabase, 1);
1212 
1213     ajStrDel(&indent);
1214 
1215     return ajTrue;
1216 }
1217 
1218 
1219 
1220 
1221 /* @section calculate *********************************************************
1222 **
1223 ** Functions for calculating information from an
1224 ** Ensembl Quality Check Sequence object.
1225 **
1226 ** @fdata [EnsPQcsequence]
1227 **
1228 ** @nam3rule Calculate   Calculate Ensembl Quality Check Sequence information
1229 ** @nam4rule Memsize     Calculate the memory size in bytes
1230 **
1231 ** @argrule Memsize qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1232 **
1233 ** @valrule Memsize [size_t] Memory size in bytes or 0
1234 **
1235 ** @fcategory misc
1236 ******************************************************************************/
1237 
1238 
1239 
1240 
1241 /* @func ensQcsequenceCalculateMemsize ****************************************
1242 **
1243 ** Get the memory size in bytes of an Ensembl Quality Check Sequence.
1244 **
1245 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1246 **
1247 ** @return [size_t] Memory size in bytes or 0
1248 **
1249 ** @release 6.4.0
1250 ** @@
1251 ******************************************************************************/
1252 
ensQcsequenceCalculateMemsize(const EnsPQcsequence qcs)1253 size_t ensQcsequenceCalculateMemsize(const EnsPQcsequence qcs)
1254 {
1255     size_t size = 0;
1256 
1257     if (!qcs)
1258         return 0;
1259 
1260     size += sizeof (EnsOQcsequence);
1261 
1262     size += ensQcdatabaseCalculateMemsize(qcs->Qcdatabase);
1263 
1264     if (qcs->Name)
1265     {
1266         size += sizeof (AjOStr);
1267 
1268         size += ajStrGetRes(qcs->Name);
1269     }
1270 
1271     if (qcs->Accession)
1272     {
1273         size += sizeof (AjOStr);
1274 
1275         size += ajStrGetRes(qcs->Accession);
1276     }
1277 
1278     if (qcs->Type)
1279     {
1280         size += sizeof (AjOStr);
1281 
1282         size += ajStrGetRes(qcs->Type);
1283     }
1284 
1285     if (qcs->Description)
1286     {
1287         size += sizeof (AjOStr);
1288 
1289         size += ajStrGetRes(qcs->Description);
1290     }
1291 
1292     return size;
1293 }
1294 
1295 
1296 
1297 
1298 /* @section convenience functions *********************************************
1299 **
1300 ** Ensembl Quality Check Sequence convenience functions
1301 **
1302 ** @fdata [EnsPQcsequence]
1303 **
1304 ** @nam3rule Get Get member(s) of associated objects
1305 ** @nam4rule Qcdatabase Get Ensembl Quality Check Database members
1306 ** @nam5rule Identifier Get the SQL database-internal identifier
1307 **
1308 ** @argrule * qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1309 **
1310 ** @valrule QcdatabaseIdentifier [ajuint] Ensembl Quality Check Database
1311 ** SQL database-internal identifier or 0U
1312 **
1313 ** @fcategory use
1314 ******************************************************************************/
1315 
1316 
1317 
1318 
1319 /* @func ensQcsequenceGetQcdatabaseIdentifier *********************************
1320 **
1321 ** Get the Ensembl Quality Check Database SQL database-internal identifier
1322 ** of an Ensembl Quality Check Sequence.
1323 **
1324 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1325 **
1326 ** @return [ajuint] Ensembl Quality Check Database SQL database-internal
1327 ** identifier or 0U
1328 **
1329 ** @release 6.2.0
1330 ** @@
1331 ******************************************************************************/
1332 
ensQcsequenceGetQcdatabaseIdentifier(const EnsPQcsequence qcs)1333 ajuint ensQcsequenceGetQcdatabaseIdentifier(const EnsPQcsequence qcs)
1334 {
1335     return (qcs) ? ensQcdatabaseGetIdentifier(qcs->Qcdatabase) : 0U;
1336 }
1337 
1338 
1339 
1340 
1341 /* @section matching **********************************************************
1342 **
1343 ** Functions for matching Ensembl Quality Check Sequence objects
1344 **
1345 ** @fdata [EnsPQcsequence]
1346 **
1347 ** @nam3rule Match Compare two Ensembl Quality Check Sequence objects
1348 **
1349 ** @argrule * qcs1 [const EnsPQcsequence] Ensembl Quality Check Sequence
1350 ** @argrule * qcs2 [const EnsPQcsequence] Ensembl Quality Check Sequence
1351 **
1352 ** @valrule * [AjBool] True on success
1353 **
1354 ** @fcategory use
1355 ******************************************************************************/
1356 
1357 
1358 
1359 
1360 /* @func ensQcsequenceMatch ***************************************************
1361 **
1362 ** Tests for matching two Ensembl Quality Check Sequences.
1363 **
1364 ** @param [r] qcs1 [const EnsPQcsequence] First Ensembl Quality Check Sequence
1365 ** @param [r] qcs2 [const EnsPQcsequence] Second Ensembl Quality Check Sequence
1366 **
1367 ** @return [AjBool] ajTrue if the Ensembl Quality Check Sequences are equal
1368 **
1369 ** @release 6.2.0
1370 ** @@
1371 ** The comparison is based on initial pointer equality and if that fails
1372 ** each member is compared.
1373 ******************************************************************************/
1374 
ensQcsequenceMatch(const EnsPQcsequence qcs1,const EnsPQcsequence qcs2)1375 AjBool ensQcsequenceMatch(const EnsPQcsequence qcs1,
1376                           const EnsPQcsequence qcs2)
1377 {
1378     if (!qcs1)
1379         return ajFalse;
1380 
1381     if (!qcs2)
1382         return ajFalse;
1383 
1384     if (qcs1 == qcs2)
1385         return ajTrue;
1386 
1387     if (qcs1->Identifier != qcs2->Identifier)
1388         return ajFalse;
1389 
1390     if ((qcs1->Adaptor && qcs2->Adaptor) && (qcs1->Adaptor != qcs2->Adaptor))
1391         return ajFalse;
1392 
1393     if (!ensQcdatabaseMatch(qcs1->Qcdatabase, qcs2->Qcdatabase))
1394         return ajFalse;
1395 
1396     if (!ajStrMatchCaseS(qcs1->Name, qcs2->Name))
1397         return ajFalse;
1398 
1399     if (!ajStrMatchCaseS(qcs1->Accession, qcs2->Accession))
1400         return ajFalse;
1401 
1402     if (!ajStrMatchCaseS(qcs1->Description, qcs2->Description))
1403         return ajFalse;
1404 
1405     if (!ajStrMatchCaseS(qcs1->Type, qcs2->Type))
1406         return ajFalse;
1407 
1408     if (qcs1->Version != qcs2->Version)
1409         return ajFalse;
1410 
1411     if (qcs1->Length != qcs2->Length)
1412         return ajFalse;
1413 
1414     if (qcs1->CdsStart != qcs2->CdsStart)
1415         return ajFalse;
1416 
1417     if (qcs1->CdsEnd != qcs2->CdsEnd)
1418         return ajFalse;
1419 
1420     if (qcs1->CdsStrand != qcs2->CdsStrand)
1421         return ajFalse;
1422 
1423     if (qcs1->Polya != qcs2->Polya)
1424         return ajFalse;
1425 
1426     return ajTrue;
1427 }
1428 
1429 
1430 
1431 
1432 /* @section fetch *************************************************************
1433 **
1434 ** Functions for fetching information from an
1435 ** Ensembl Quality Check Sequence object.
1436 **
1437 ** @fdata [EnsPQcsequence]
1438 **
1439 ** @nam3rule Fetch Fetch Ensembl Quality Check Sequence information
1440 ** @nam4rule All Fetch all objects
1441 ** @nam4rule Anchor Fetch an HTML anchor
1442 ** @nam5rule External Fetch an HTML document-external anchor
1443 ** @nam5rule Internal Fetch an HTML document-internal anchor
1444 ** @nam4rule Url Fetch a Uniform Resource Locator (URL)
1445 ** @nam5rule External Fetch an external Uniform Resource Locator (URL)
1446 ** @nam5rule Internal Fetch an internal Uniform Resource Locator (URL)
1447 **
1448 ** @argrule AnchorExternal qcs [const EnsPQcsequence]
1449 ** Ensembl Quality Check Sequence
1450 ** @argrule AnchorExternal htmlid [AjBool] Set the HTML id attribute in the
1451 ** anchor element
1452 ** @argrule AnchorInternal qcs [const EnsPQcsequence]
1453 ** Ensembl Quality Check Sequence
1454 ** @argrule Anchor Pstr [AjPStr*] Anchor string
1455 ** @argrule UrlExternal qcs [const EnsPQcsequence]
1456 ** Ensembl Quality Check Sequence
1457 ** @argrule UrlExternal Pstr [AjPStr*] URL string
1458 **
1459 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1460 **
1461 ** @fcategory misc
1462 ******************************************************************************/
1463 
1464 
1465 
1466 
1467 /* @func ensQcsequenceFetchAnchorExternal *************************************
1468 **
1469 ** Fetch an external HTML anchor for an Ensembl Quality Check Sequence.
1470 **
1471 ** Returns a complete HTML anchor element, which displays the sequence name
1472 ** and links it to the corresponding sequence entry in the external source
1473 ** database. Linking is dependent on template information in the
1474 ** 'sequence_db.external_url' field of the Ensembl Quality Check database.
1475 ** Although the sequence name is displayed, the link is based on ###NAME###,
1476 ** ###ACCESSION### or ###VERSION### placeholders in the template URL. If no
1477 ** template isavailable, just an anchor element the name set as 'id' attribute
1478 ** is returned.
1479 **
1480 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1481 ** @param [r] htmlid [AjBool] Set the HTML id attribute in the anchor element
1482 ** @param [w] Pstr [AjPStr*] Anchor string
1483 **
1484 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1485 **
1486 ** @release 6.4.0
1487 ** @@
1488 ******************************************************************************/
1489 
ensQcsequenceFetchAnchorExternal(const EnsPQcsequence qcs,AjBool htmlid,AjPStr * Pstr)1490 AjBool ensQcsequenceFetchAnchorExternal(const EnsPQcsequence qcs,
1491                                         AjBool htmlid,
1492                                         AjPStr *Pstr)
1493 {
1494     AjPStr sgmlid  = NULL;
1495     AjPStr exturl  = NULL;
1496     AjPStr qcsname = NULL;
1497     AjPStr qcdname = NULL;
1498 
1499     if (!qcs)
1500         return ajFalse;
1501 
1502     if (!Pstr)
1503         return ajFalse;
1504 
1505     if (!*Pstr)
1506         *Pstr = ajStrNew();
1507 
1508     ensQcsequenceFetchUrlExternal(qcs, &exturl);
1509 
1510     if (exturl && ajStrGetLen(exturl))
1511     {
1512         ajStrAppendC(Pstr, "<a ");
1513 
1514         if (htmlid)
1515         {
1516             sgmlid = ajStrNewS(qcs->Name);
1517 
1518             ensHtmlEncodeSgmlid(&sgmlid);
1519 
1520             ajFmtPrintAppS(Pstr, "id=\"%S\" ", sgmlid);
1521 
1522             ajStrDel(&sgmlid);
1523         }
1524 
1525         ensHtmlEncodeEntities(&exturl);
1526 
1527         qcdname = ajStrNewS(ensQcdatabaseGetName(qcs->Qcdatabase));
1528 
1529         ensHtmlEncodeEntities(&qcdname);
1530 
1531         qcsname = ajStrNewS(qcs->Name);
1532 
1533         ensHtmlEncodeEntities(&qcsname);
1534 
1535         ajFmtPrintAppS(Pstr,
1536                        "href=\"%S\" target=\"%S\">%S</a>",
1537                        exturl,
1538                        qcdname,
1539                        qcsname);
1540 
1541         ajStrDel(&qcdname);
1542 
1543         ajStrDel(&qcsname);
1544     }
1545     else
1546     {
1547         if (htmlid)
1548         {
1549             sgmlid = ajStrNewS(qcs->Name);
1550 
1551             ensHtmlEncodeSgmlid(&sgmlid);
1552 
1553             qcsname = ajStrNewS(qcs->Name);
1554 
1555             ensHtmlEncodeEntities(&qcsname);
1556 
1557             ajFmtPrintAppS(Pstr,
1558                            "<a id=\"%S\">%S</a>",
1559                            sgmlid,
1560                            qcsname);
1561 
1562             ajStrDel(&sgmlid);
1563 
1564             ajStrDel(&qcsname);
1565         }
1566         else
1567             ajStrAppendS(Pstr, qcs->Name);
1568     }
1569 
1570     ajStrDel(&exturl);
1571 
1572     return ajTrue;
1573 }
1574 
1575 
1576 
1577 
1578 /* @func ensQcsequenceFetchAnchorInternal *************************************
1579 **
1580 ** Fetch an internal HTML anchor for an Ensembl Quality Check Sequence.
1581 **
1582 ** Returns a complete HTML anchor element, which displays the sequence name
1583 ** and links it to the corresponding document-internal anchor element.
1584 **
1585 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1586 ** @param [w] Pstr [AjPStr*] Anchor string
1587 **
1588 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1589 **
1590 ** @release 6.4.0
1591 ** @@
1592 ******************************************************************************/
1593 
ensQcsequenceFetchAnchorInternal(const EnsPQcsequence qcs,AjPStr * Pstr)1594 AjBool ensQcsequenceFetchAnchorInternal(const EnsPQcsequence qcs,
1595                                         AjPStr *Pstr)
1596 {
1597     AjPStr sgmlid = NULL;
1598     AjPStr name   = NULL;
1599 
1600     if (!qcs)
1601         return ajFalse;
1602 
1603     if (!Pstr)
1604         return ajFalse;
1605 
1606     if (!*Pstr)
1607         *Pstr = ajStrNew();
1608 
1609     sgmlid = ajStrNewS(qcs->Name);
1610 
1611     ensHtmlEncodeSgmlid(&sgmlid);
1612 
1613     name = ajStrNewS(qcs->Name);
1614 
1615     ensHtmlEncodeEntities(&name);
1616 
1617     ajFmtPrintAppS(Pstr, "<a href=\"#%S\">%S</a>", sgmlid, name);
1618 
1619     ajStrDel(&sgmlid);
1620     ajStrDel(&name);
1621 
1622     return ajTrue;
1623 }
1624 
1625 
1626 
1627 
1628 /* @func ensQcsequenceFetchUrlExternal ****************************************
1629 **
1630 ** Fetch an external URL for an Ensembl Quality Check Sequence.
1631 **
1632 ** The caller is responsible for deleting the AJAX String.
1633 **
1634 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
1635 ** @param [u] Pstr [AjPStr*] URL string
1636 **
1637 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1638 **
1639 ** @release 6.4.0
1640 ** @@
1641 ******************************************************************************/
1642 
ensQcsequenceFetchUrlExternal(const EnsPQcsequence qcs,AjPStr * Pstr)1643 AjBool ensQcsequenceFetchUrlExternal(const EnsPQcsequence qcs, AjPStr *Pstr)
1644 {
1645     AjPStr exturl = NULL;
1646     AjPStr version = NULL;
1647 
1648     EnsPQcdatabase qcdb = NULL;
1649 
1650     if (!qcs)
1651         return ajFalse;
1652 
1653     if (!Pstr)
1654         return ajFalse;
1655 
1656     if (*Pstr)
1657         ajStrAssignClear(Pstr);
1658     else
1659         *Pstr = ajStrNew();
1660 
1661     qcdb = ensQcsequenceGetQcdatabase(qcs);
1662 
1663     exturl = ensQcdatabaseGetUrlExternal(qcdb);
1664 
1665     if (exturl && ajStrGetLen(exturl))
1666     {
1667         ajStrAssignS(Pstr, exturl);
1668 
1669         ajStrExchangeCS(Pstr, "###NAME###", qcs->Name);
1670 
1671         ajStrExchangeCS(Pstr, "###ACCESSION###", qcs->Accession);
1672 
1673         version = ajFmtStr("%d", qcs->Version);
1674 
1675         ajStrExchangeCS(Pstr, "###VERSION###", version);
1676 
1677         ajStrDel(&version);
1678     }
1679 
1680     return ajTrue;
1681 }
1682 
1683 
1684 
1685 
1686 /* @datasection [AjPStr] AJAX String ******************************************
1687 **
1688 ** @nam2rule Html Functions for manipulating AJAX String objects
1689 **
1690 ******************************************************************************/
1691 
1692 
1693 
1694 
1695 /* @section encode ************************************************************
1696 **
1697 ** Functions for manipulating AJAX String objects cconforming to HTML rules.
1698 **
1699 ** @fdata [AjPStr]
1700 **
1701 ** @nam3rule Encode Encode AJAX String objects conforming to HTML rules
1702 ** @nam4rule Entities Encode HTML character entities
1703 ** @nam4rule Sgmlid   Encode HTML SGML identifiers
1704 **
1705 ** @argrule ensHtmlEncodeEntities Pstr [AjPStr*] HTML string
1706 ** @argrule ensHtmlEncodeSgmlid Pstr [AjPStr*] HTML String
1707 **
1708 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
1709 **
1710 ** @fcategory misc
1711 ******************************************************************************/
1712 
1713 
1714 
1715 
1716 /* @func ensHtmlEncodeEntities ************************************************
1717 **
1718 ** Encode HTML character entities in an AJAX String.
1719 **
1720 ** http://www.w3.org/TR/html401/charset.html#h-5.3.2
1721 **
1722 ** @param [u] Pstr [AjPStr*] HTML string
1723 **
1724 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1725 **
1726 ** @release 6.4.0
1727 ** @@
1728 ** NOTE: Since EMBOSS is limited to ASCII only '"', '&', '<', and '>' need
1729 ** replacing.
1730 ** FIXME: This function should move!
1731 ******************************************************************************/
1732 
ensHtmlEncodeEntities(AjPStr * Pstr)1733 AjBool ensHtmlEncodeEntities(AjPStr *Pstr)
1734 {
1735     if (!Pstr)
1736         return ajFalse;
1737 
1738     if (!*Pstr)
1739         return ajFalse;
1740 
1741     /*
1742     ** FIXME: The & character has to be the first character to replace.
1743     ** It would be better to check for the occurence of &amp; or &...; more
1744     ** generally, before replacing.
1745     */
1746 
1747     ajStrExchangeCC(Pstr, "&", "&amp;");
1748     ajStrExchangeCC(Pstr, "\"", "&quot;");
1749     ajStrExchangeCC(Pstr, "<", "&lt;");
1750     ajStrExchangeCC(Pstr, ">", "&gt;");
1751 
1752     return ajTrue;
1753 }
1754 
1755 
1756 
1757 
1758 /* @func ensHtmlEncodeSgmlid **************************************************
1759 **
1760 ** Fetch a valid HTML 4.01 identifier or name token from an AJAX String.
1761 ** The caller is responsible for deleting the AJAX String.
1762 **
1763 ** The HTML 4.01 standard defines the content of id attributes as the SGML
1764 ** ID and NAME tokens, as defined in
1765 ** "Information Processing -- Text and Office Systems --
1766 ** Standard Generalized Markup Language (SGML)", ISO 8879:1986.
1767 ** http://www.iso.ch/cate/d16387.html
1768 ** http://www.w3.org/TR/html401/struct/global.html#h-7.5.2
1769 **
1770 ** ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed
1771 ** by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"),
1772 ** colons (":"), and periods (".").
1773 ** http://www.w3.org/TR/html401/types.html#type-name
1774 **
1775 ** @param [w] Pstr [AjPStr*] SGML identifier string
1776 **
1777 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1778 **
1779 ** @release 6.4.0
1780 ** @@
1781 ** FIXME: This function should move!
1782 ******************************************************************************/
1783 
ensHtmlEncodeSgmlid(AjPStr * Pstr)1784 AjBool ensHtmlEncodeSgmlid(AjPStr *Pstr)
1785 {
1786     const char *txtstr = NULL;
1787 
1788     if (!Pstr)
1789         return ajFalse;
1790 
1791     ajStrExchangeSetRestCK(Pstr,
1792                            "-."
1793                            "0123456789"
1794                            ":"
1795                            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1796                            "_"
1797                            "abcdefghijklmnopqrstuvwxyz",
1798                            '_');
1799 
1800     txtstr = ajStrGetPtr(*Pstr);
1801 
1802     if (!
1803         ((*txtstr >= 'A' && *txtstr <= 'Z') ||
1804          (*txtstr >= 'a' && *txtstr <= 'z')))
1805         ajStrInsertC(Pstr, 0, "ID_");
1806 
1807     return ajTrue;
1808 }
1809 
1810 
1811 
1812 
1813 /* @datasection [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor
1814 **
1815 ** @nam2rule Qcsequenceadaptor Functions for manipulating
1816 ** Ensembl Quality Check Sequence Adaptor objects
1817 **
1818 ** @cc Bio::EnsEMBL::QC::DBSQL::Sequenceadaptor
1819 ** @cc CVS Revision:
1820 ** @cc CVS Tag:
1821 **
1822 ******************************************************************************/
1823 
1824 
1825 
1826 
1827 /* @funcstatic qcsequenceadaptorFetchAllbyStatement ***************************
1828 **
1829 ** Run a SQL statement against an Ensembl Database Adaptor and consolidate the
1830 ** results into an AJAX List of Ensembl Quality Check Sequence objects.
1831 **
1832 ** @param [u] ba [EnsPBaseadaptor] Ensembl Base Adaptor
1833 ** @param [r] statement [const AjPStr] SQL statement
1834 ** @param [uN] am [EnsPAssemblymapper] Ensembl Assembly Mapper
1835 ** @param [uN] slice [EnsPSlice] Ensembl Slice
1836 ** @param [u] qcss [AjPList] AJAX List of Ensembl Quality Check Sequences
1837 **
1838 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
1839 **
1840 ** @release 6.4.0
1841 ** @@
1842 ******************************************************************************/
1843 
qcsequenceadaptorFetchAllbyStatement(EnsPBaseadaptor ba,const AjPStr statement,EnsPAssemblymapper am,EnsPSlice slice,AjPList qcss)1844 static AjBool qcsequenceadaptorFetchAllbyStatement(
1845     EnsPBaseadaptor ba,
1846     const AjPStr statement,
1847     EnsPAssemblymapper am,
1848     EnsPSlice slice,
1849     AjPList qcss)
1850 {
1851     ajuint identifier = 0U;
1852     ajuint databaseid = 0U;
1853     ajuint version    = 0U;
1854     ajuint length     = 0U;
1855     ajuint cdsstart   = 0U;
1856     ajuint cdsend     = 0U;
1857     ajint  cdsstrand  = 0;
1858     ajuint polya      = 0U;
1859 
1860     AjPSqlstatement sqls = NULL;
1861     AjISqlrow sqli       = NULL;
1862     AjPSqlrow sqlr       = NULL;
1863 
1864     AjPStr name        = NULL;
1865     AjPStr accession   = NULL;
1866     AjPStr type        = NULL;
1867     AjPStr description = NULL;
1868 
1869     EnsPDatabaseadaptor dba = NULL;
1870 
1871     EnsPQcsequence qcs         = NULL;
1872     EnsPQcsequenceadaptor qcsa = NULL;
1873 
1874     EnsPQcdatabase qcdb         = NULL;
1875     EnsPQcdatabaseadaptor qcdba = NULL;
1876 
1877     if (ajDebugTest("qcsequenceadaptorFetchAllbyStatement"))
1878         ajDebug("qcsequenceadaptorFetchAllbyStatement\n"
1879                 "  ba %p\n"
1880                 "  statement %p\n"
1881                 "  am %p\n"
1882                 "  slice %p\n"
1883                 "  qcss %p\n",
1884                 ba,
1885                 statement,
1886                 am,
1887                 slice,
1888                 qcss);
1889 
1890     if (!ba)
1891         return ajFalse;
1892 
1893     if (!statement)
1894         return ajFalse;
1895 
1896     if (!qcss)
1897         return ajFalse;
1898 
1899     dba = ensBaseadaptorGetDatabaseadaptor(ba);
1900 
1901     qcdba = ensRegistryGetQcdatabaseadaptor(dba);
1902     qcsa  = ensRegistryGetQcsequenceadaptor(dba);
1903 
1904     sqls  = ensDatabaseadaptorSqlstatementNew(dba, statement);
1905 
1906     sqli  = ajSqlrowiterNew(sqls);
1907 
1908     while (!ajSqlrowiterDone(sqli))
1909     {
1910         identifier  = 0;
1911         databaseid  = 0;
1912         name        = ajStrNew();
1913         accession   = ajStrNew();
1914         version     = 0;
1915         type        = ajStrNew();
1916         length      = 0;
1917         cdsstart    = 0;
1918         cdsend      = 0;
1919         cdsstrand   = 0;
1920         polya       = 0;
1921         description = ajStrNew();
1922 
1923         sqlr = ajSqlrowiterGet(sqli);
1924 
1925         ajSqlcolumnToUint(sqlr, &identifier);
1926         ajSqlcolumnToUint(sqlr, &databaseid);
1927         ajSqlcolumnToStr(sqlr, &name);
1928         ajSqlcolumnToStr(sqlr, &accession);
1929         ajSqlcolumnToUint(sqlr, &version);
1930         ajSqlcolumnToStr(sqlr, &type);
1931         ajSqlcolumnToUint(sqlr, &length);
1932         ajSqlcolumnToUint(sqlr, &cdsstart);
1933         ajSqlcolumnToUint(sqlr, &cdsend);
1934         ajSqlcolumnToInt(sqlr, &cdsstrand);
1935         ajSqlcolumnToUint(sqlr, &polya);
1936         ajSqlcolumnToStr(sqlr, &description);
1937 
1938         ensQcdatabaseadaptorFetchByIdentifier(qcdba,
1939                                               databaseid,
1940                                               &qcdb);
1941 
1942         qcs = ensQcsequenceNewIni(qcsa,
1943                                   identifier,
1944                                   qcdb,
1945                                   name,
1946                                   accession,
1947                                   version,
1948                                   type,
1949                                   length,
1950                                   cdsstart,
1951                                   cdsend,
1952                                   cdsstrand,
1953                                   polya,
1954                                   description);
1955 
1956         ajListPushAppend(qcss, (void *) qcs);
1957 
1958         ensQcdatabaseDel(&qcdb);
1959 
1960         ajStrDel(&name);
1961         ajStrDel(&accession);
1962         ajStrDel(&type);
1963         ajStrDel(&description);
1964     }
1965 
1966     ajSqlrowiterDel(&sqli);
1967 
1968     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
1969 
1970     return ajTrue;
1971 }
1972 
1973 
1974 
1975 
1976 /* @section constructors ******************************************************
1977 **
1978 ** All constructors return a new Ensembl Quality Check Sequence Adaptor by
1979 ** pointer. It is the responsibility of the user to first destroy any previous
1980 ** Quality Check Sequence Adaptor. The target pointer does not need to be
1981 ** initialised to NULL, but it is good programming practice to do so anyway.
1982 **
1983 ** @fdata [EnsPQcsequenceadaptor]
1984 **
1985 ** @nam3rule New Constructor
1986 **
1987 ** @argrule New dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
1988 **
1989 ** @valrule * [EnsPQcsequenceadaptor]
1990 ** Ensembl Quality Check Sequence Adaptor or NULL
1991 **
1992 ** @fcategory new
1993 ******************************************************************************/
1994 
1995 
1996 
1997 
1998 /* @func ensQcsequenceadaptorNew **********************************************
1999 **
2000 ** Default constructor for an Ensembl Quality Check Sequence Adaptor.
2001 **
2002 ** Ensembl Object Adaptors are singleton objects in the sense that a single
2003 ** instance of an Ensembl Object Adaptor connected to a particular database is
2004 ** sufficient to instantiate any number of Ensembl Objects from the database.
2005 ** Each Ensembl Object will have a weak reference to the Object Adaptor that
2006 ** instantiated it. Therefore, Ensembl Object Adaptors should not be
2007 ** instantiated directly, but rather obtained from the Ensembl Registry,
2008 ** which will in turn call this function if neccessary.
2009 **
2010 ** @see ensRegistryGetDatabaseadaptor
2011 ** @see ensRegistryGetQcsequenceadaptor
2012 **
2013 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
2014 **
2015 ** @return [EnsPQcsequenceadaptor]
2016 ** Ensembl Quality Check Sequence Adaptor or NULL
2017 **
2018 ** @release 6.2.0
2019 ** @@
2020 ******************************************************************************/
2021 
ensQcsequenceadaptorNew(EnsPDatabaseadaptor dba)2022 EnsPQcsequenceadaptor ensQcsequenceadaptorNew(
2023     EnsPDatabaseadaptor dba)
2024 {
2025     EnsPQcsequenceadaptor qcsa = NULL;
2026 
2027     if (!dba)
2028         return NULL;
2029 
2030     AJNEW0(qcsa);
2031 
2032     qcsa->Adaptor = ensBaseadaptorNew(
2033         dba,
2034         qcsequenceadaptorKTablenames,
2035         qcsequenceadaptorKColumnnames,
2036         (const EnsPBaseadaptorLeftjoin) NULL,
2037         (const char *) NULL,
2038         (const char *) NULL,
2039         &qcsequenceadaptorFetchAllbyStatement);
2040 
2041     return qcsa;
2042 }
2043 
2044 
2045 
2046 
2047 /* @section destructors *******************************************************
2048 **
2049 ** Destruction destroys all internal data structures and frees the memory
2050 ** allocated for an Ensembl Quality Check Sequence Adaptor object.
2051 **
2052 ** @fdata [EnsPQcsequenceadaptor]
2053 **
2054 ** @nam3rule Del Destroy (free) an Ensembl Quality Check Sequence Adaptor
2055 **
2056 ** @argrule * Pqcsa [EnsPQcsequenceadaptor*]
2057 ** Ensembl Quality Check Sequence Adaptor address
2058 **
2059 ** @valrule * [void]
2060 **
2061 ** @fcategory delete
2062 ******************************************************************************/
2063 
2064 
2065 
2066 
2067 /* @func ensQcsequenceadaptorDel **********************************************
2068 **
2069 ** Default destructor for an Ensembl Quality Check Sequence Adaptor.
2070 **
2071 ** Ensembl Object Adaptors are singleton objects that are registered in the
2072 ** Ensembl Registry and weakly referenced by Ensembl Objects that have been
2073 ** instantiated by it. Therefore, Ensembl Object Adaptors should never be
2074 ** destroyed directly. Upon exit, the Ensembl Registry will call this function
2075 ** if required.
2076 **
2077 ** @param [d] Pqcsa [EnsPQcsequenceadaptor*]
2078 ** Ensembl Quality Check Sequence Adaptor address
2079 **
2080 ** @return [void]
2081 **
2082 ** @release 6.2.0
2083 ** @@
2084 ******************************************************************************/
2085 
ensQcsequenceadaptorDel(EnsPQcsequenceadaptor * Pqcsa)2086 void ensQcsequenceadaptorDel(EnsPQcsequenceadaptor *Pqcsa)
2087 {
2088     EnsPQcsequenceadaptor pthis = NULL;
2089 
2090     if (!Pqcsa)
2091         return;
2092 
2093 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
2094     if (ajDebugTest("ensQcsequenceadaptorDel"))
2095         ajDebug("ensQcsequenceadaptorDel\n"
2096                 "  *Pqcsa %p\n",
2097                 *Pqcsa);
2098 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
2099 
2100     if (!(pthis = *Pqcsa))
2101         return;
2102 
2103     ensBaseadaptorDel(&pthis->Adaptor);
2104 
2105     ajMemFree((void **) Pqcsa);
2106 
2107     return;
2108 }
2109 
2110 
2111 
2112 
2113 /* @section member retrieval **************************************************
2114 **
2115 ** Functions for returning members of an
2116 ** Ensembl Quality Check Sequence Adaptor object.
2117 **
2118 ** @fdata [EnsPQcsequenceadaptor]
2119 **
2120 ** @nam3rule Get Return Ensembl Quality Check Sequence Adaptor attribute(s)
2121 ** @nam4rule Baseadaptor Return the Ensembl Base Adaptor
2122 ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor
2123 **
2124 ** @argrule * qcsa [EnsPQcsequenceadaptor]
2125 ** Ensembl Quality Check Sequence Adaptor
2126 **
2127 ** @valrule Baseadaptor [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
2128 ** @valrule Databaseadaptor [EnsPDatabaseadaptor] Ensembl Database Adaptor
2129 ** or NULL
2130 **
2131 ** @fcategory use
2132 ******************************************************************************/
2133 
2134 
2135 
2136 
2137 /* @func ensQcsequenceadaptorGetBaseadaptor ***********************************
2138 **
2139 ** Get the Ensembl Base Adaptor member of an
2140 ** Ensembl Quality Check Sequence Adaptor.
2141 **
2142 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2143 ** Ensembl Quality Check Sequence Adaptor
2144 **
2145 ** @return [EnsPBaseadaptor] Ensembl Base Adaptor or NULL
2146 **
2147 ** @release 6.4.0
2148 ** @@
2149 ******************************************************************************/
2150 
ensQcsequenceadaptorGetBaseadaptor(EnsPQcsequenceadaptor qcsa)2151 EnsPBaseadaptor ensQcsequenceadaptorGetBaseadaptor(
2152     EnsPQcsequenceadaptor qcsa)
2153 {
2154     return (qcsa) ? qcsa->Adaptor : NULL;
2155 }
2156 
2157 
2158 
2159 
2160 /* @func ensQcsequenceadaptorGetDatabaseadaptor *******************************
2161 **
2162 ** Get the Ensembl Database Adaptor member of an
2163 ** Ensembl Quality Check Sequence Adaptor.
2164 **
2165 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2166 ** Ensembl Quality Check Sequence Adaptor
2167 **
2168 ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL
2169 **
2170 ** @release 6.4.0
2171 ** @@
2172 ******************************************************************************/
2173 
ensQcsequenceadaptorGetDatabaseadaptor(EnsPQcsequenceadaptor qcsa)2174 EnsPDatabaseadaptor ensQcsequenceadaptorGetDatabaseadaptor(
2175     EnsPQcsequenceadaptor qcsa)
2176 {
2177     return ensBaseadaptorGetDatabaseadaptor(
2178         ensQcsequenceadaptorGetBaseadaptor(qcsa));
2179 }
2180 
2181 
2182 
2183 
2184 /* @section object retrieval **************************************************
2185 **
2186 ** Functions for fetching Ensembl Quality Check Sequence objects from an
2187 ** Ensembl SQL database.
2188 **
2189 ** @fdata [EnsPQcsequenceadaptor]
2190 **
2191 ** @nam3rule Fetch      Fetch Ensembl Quality Check Sequence object(s)
2192 ** @nam4rule All        Fetch all Ensembl Quality Check Sequence objects
2193 ** @nam4rule Allby      Fetch all Ensembl Quality Check Sequence objects
2194 **                      matching a criterion
2195 ** @nam5rule Qcdatabase Fetch all by an Ensembl Quality Check Database
2196 ** @nam4rule By         Fetch one Ensembl Quality Check Sequence object
2197 **                      matching a criterion
2198 ** @nam5rule Accession  Fetch by an accession number
2199 ** @nam5rule Identifier Fetch by an SQL database internal identifier
2200 ** @nam5rule Name       Fetch by a name
2201 **
2202 ** @argrule * qcsa [EnsPQcsequenceadaptor]
2203 ** Ensembl Quality Check Sequence Adaptor
2204 ** @argrule AllbyQcdatabase qcdb [const EnsPQcdatabase]
2205 ** Ensembl Quality Check Database
2206 ** @argrule Allby qcss [AjPList] AJAX List of Ensembl Quality Check Sequence
2207 ** objects
2208 ** @argrule ByAccession qcdbid [ajuint]
2209 ** Ensembl Quality Check Database identifier
2210 ** @argrule ByAccession accession [const AjPStr]
2211 ** Ensembl Quality Check Sequence accession number
2212 ** @argrule ByName qcdbid [ajuint] Ensembl Quality Check Database identifier
2213 ** @argrule ByName name [const AjPStr] Ensembl Quality Check Sequence name
2214 ** @argrule ByAccession version [ajuint] Ensembl Quality Check Sequence version
2215 ** @argrule ByIdentifier identifier [ajuint] SQL database-internal identifier
2216 ** @argrule By Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
2217 **
2218 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2219 **
2220 ** @fcategory use
2221 ******************************************************************************/
2222 
2223 
2224 
2225 
2226 /* @func ensQcsequenceadaptorFetchAllbyQcdatabase *****************************
2227 **
2228 ** Fetch all Ensembl Quality Check Sequences via an
2229 ** Ensembl Quality Check Database.
2230 ** The caller is responsible for deleting the Ensembl Quality Check Sequences
2231 ** before deleting the AJAX List.
2232 **
2233 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2234 ** Ensembl Quality Check Sequence Adaptor
2235 ** @param [r] qcdb [const EnsPQcdatabase] Ensembl Quality Check Database
2236 ** @param [u] qcss [AjPList] AJAX List of Ensembl Quality Check Sequences
2237 **
2238 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2239 **
2240 ** @release 6.4.0
2241 ** @@
2242 ******************************************************************************/
2243 
ensQcsequenceadaptorFetchAllbyQcdatabase(EnsPQcsequenceadaptor qcsa,const EnsPQcdatabase qcdb,AjPList qcss)2244 AjBool ensQcsequenceadaptorFetchAllbyQcdatabase(EnsPQcsequenceadaptor qcsa,
2245                                                 const EnsPQcdatabase qcdb,
2246                                                 AjPList qcss)
2247 {
2248     AjBool result = AJFALSE;
2249 
2250     AjPStr constraint = NULL;
2251 
2252     if (!qcsa)
2253         return ajFalse;
2254 
2255     if (!qcdb)
2256         return ajFalse;
2257 
2258     if (!qcss)
2259         return ajFalse;
2260 
2261     constraint = ajFmtStr("sequence.sequence_db_id = %u",
2262                           ensQcdatabaseGetIdentifier(qcdb));
2263 
2264     result = ensBaseadaptorFetchAllbyConstraint(
2265         ensQcsequenceadaptorGetBaseadaptor(qcsa),
2266         constraint,
2267         (EnsPAssemblymapper) NULL,
2268         (EnsPSlice) NULL,
2269         qcss);
2270 
2271     ajStrDel(&constraint);
2272 
2273     return result;
2274 }
2275 
2276 
2277 
2278 
2279 /* @func ensQcsequenceadaptorFetchByAccession *********************************
2280 **
2281 ** Fetch an Ensembl Quality Check Sequence by its accession number and
2282 ** sequence version.
2283 **
2284 ** The caller is responsible for deleting the Ensembl Quality Check Sequence.
2285 **
2286 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2287 ** Ensembl Quality Check Sequence Adaptor
2288 ** @param [r] qcdbid [ajuint] Ensembl Quality Check Database identifier
2289 ** @param [r] accession [const AjPStr]
2290 ** Ensembl Quality Check Sequence accession number
2291 ** @param [rN] version [ajuint]
2292 ** Ensembl Quality Check Sequence version
2293 ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
2294 **
2295 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2296 **
2297 ** @release 6.2.0
2298 ** @@
2299 ******************************************************************************/
2300 
ensQcsequenceadaptorFetchByAccession(EnsPQcsequenceadaptor qcsa,ajuint qcdbid,const AjPStr accession,ajuint version,EnsPQcsequence * Pqcs)2301 AjBool ensQcsequenceadaptorFetchByAccession(EnsPQcsequenceadaptor qcsa,
2302                                             ajuint qcdbid,
2303                                             const AjPStr accession,
2304                                             ajuint version,
2305                                             EnsPQcsequence *Pqcs)
2306 {
2307     char *txtaccession = NULL;
2308 
2309     AjBool result = AJFALSE;
2310 
2311     AjPList qcss = NULL;
2312 
2313     AjPStr constraint = NULL;
2314 
2315     EnsPBaseadaptor ba = NULL;
2316 
2317     EnsPQcsequence qcs = NULL;
2318 
2319     if (!qcsa)
2320         return ajFalse;
2321 
2322     if (!accession)
2323         return ajFalse;
2324 
2325     if (!Pqcs)
2326         return ajFalse;
2327 
2328     *Pqcs = NULL;
2329 
2330     ba = ensQcsequenceadaptorGetBaseadaptor(qcsa);
2331 
2332     ensBaseadaptorEscapeC(ba, &txtaccession, accession);
2333 
2334     constraint = ajFmtStr("sequence.sequence_db_id = %u "
2335                           "AND "
2336                           "sequence.accession = '%s'",
2337                           qcdbid,
2338                           txtaccession);
2339 
2340     ajCharDel(&txtaccession);
2341 
2342     if (version)
2343         ajFmtPrintAppS(&constraint, " AND sequence.version = %u", version);
2344 
2345     qcss = ajListNew();
2346 
2347     result = ensBaseadaptorFetchAllbyConstraint(
2348         ba,
2349         constraint,
2350         (EnsPAssemblymapper) NULL,
2351         (EnsPSlice) NULL,
2352         qcss);
2353 
2354     if (ajListGetLength(qcss) > 1)
2355         ajWarn("ensQcsequenceadaptorFetchByAccession got more than "
2356                "one Ensembl Quality Check Sequence for accession '%S' "
2357                "and Quality Check Database identifier %u.\n",
2358                accession, qcdbid);
2359 
2360     ajListPop(qcss, (void **) Pqcs);
2361 
2362     /*
2363     ** TODO: To implement?
2364     ** qcsequenceadaptorCacheInsert(qcsa, Pqcs);
2365     */
2366 
2367     while (ajListPop(qcss, (void **) &qcs))
2368     {
2369 
2370         /*
2371         ** TODO: To implement?
2372         ** qcsequenceadaptorCacheInsert(qcsa, &qcs);
2373         */
2374 
2375         ensQcsequenceDel(&qcs);
2376     }
2377 
2378     ajListFree(&qcss);
2379 
2380     ajStrDel(&constraint);
2381 
2382     return result;
2383 }
2384 
2385 
2386 
2387 
2388 /* @func ensQcsequenceadaptorFetchByIdentifier ********************************
2389 **
2390 ** Fetch an Ensembl Quality Check Sequence via its
2391 ** SQL database-internal identifier.
2392 **
2393 ** The caller is responsible for deleting the Ensembl Quality Check Sequence.
2394 **
2395 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2396 ** Ensembl Quality Check Sequence Adaptor
2397 ** @param [r] identifier [ajuint]
2398 ** SQL database-internal Ensembl Quality Check Sequence identifier
2399 ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
2400 **
2401 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2402 **
2403 ** @release 6.2.0
2404 ** @@
2405 ******************************************************************************/
2406 
ensQcsequenceadaptorFetchByIdentifier(EnsPQcsequenceadaptor qcsa,ajuint identifier,EnsPQcsequence * Pqcs)2407 AjBool ensQcsequenceadaptorFetchByIdentifier(EnsPQcsequenceadaptor qcsa,
2408                                              ajuint identifier,
2409                                              EnsPQcsequence *Pqcs)
2410 {
2411     return ensBaseadaptorFetchByIdentifier(
2412         ensQcsequenceadaptorGetBaseadaptor(qcsa),
2413         identifier,
2414         (void **) Pqcs);
2415 }
2416 
2417 
2418 
2419 
2420 /* @func ensQcsequenceadaptorFetchByName **************************************
2421 **
2422 ** Fetch an Ensembl Quality Check Sequence by its name.
2423 **
2424 ** The caller is responsible for deleting the Ensembl Quality Check Sequence.
2425 **
2426 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2427 ** Ensembl Quality Check Sequence Adaptor
2428 ** @param [r] qcdbid [ajuint] Ensembl Quality Check Database identifier
2429 ** @param [r] name [const AjPStr] Ensembl Quality Check Sequence name
2430 ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address
2431 **
2432 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2433 **
2434 ** @release 6.2.0
2435 ** @@
2436 ******************************************************************************/
2437 
ensQcsequenceadaptorFetchByName(EnsPQcsequenceadaptor qcsa,ajuint qcdbid,const AjPStr name,EnsPQcsequence * Pqcs)2438 AjBool ensQcsequenceadaptorFetchByName(EnsPQcsequenceadaptor qcsa,
2439                                        ajuint qcdbid,
2440                                        const AjPStr name,
2441                                        EnsPQcsequence *Pqcs)
2442 {
2443     char *txtname = NULL;
2444 
2445     AjBool result = AJFALSE;
2446 
2447     AjPList qcss = NULL;
2448 
2449     AjPStr constraint = NULL;
2450 
2451     EnsPBaseadaptor ba = NULL;
2452 
2453     EnsPQcsequence qcs = NULL;
2454 
2455     if (!qcsa)
2456         return ajFalse;
2457 
2458     if (!name)
2459         return ajFalse;
2460 
2461     if (!Pqcs)
2462         return ajFalse;
2463 
2464     *Pqcs = NULL;
2465 
2466     ba = ensQcsequenceadaptorGetBaseadaptor(qcsa);
2467 
2468     ensBaseadaptorEscapeC(ba, &txtname, name);
2469 
2470     constraint = ajFmtStr("sequence.sequence_db_id = %u "
2471                           "AND "
2472                           "sequence.name = '%s'",
2473                           qcdbid,
2474                           txtname);
2475 
2476     ajCharDel(&txtname);
2477 
2478     qcss = ajListNew();
2479 
2480     result = ensBaseadaptorFetchAllbyConstraint(
2481         ba,
2482         constraint,
2483         (EnsPAssemblymapper) NULL,
2484         (EnsPSlice) NULL,
2485         qcss);
2486 
2487     if (ajListGetLength(qcss) > 1)
2488         ajWarn("ensQcsequenceadaptorFetchByName got more than "
2489                "one Ensembl Quality Check Sequence for (UNIQUE) name '%S' "
2490                "and Quality Check Database identifier %u.\n",
2491                name, qcdbid);
2492 
2493     ajListPop(qcss, (void **) Pqcs);
2494 
2495     /*
2496     ** TODO: To implement?
2497     ** qcsequenceadaptorCacheInsert(qcsa, Pqcs);
2498     */
2499 
2500     while (ajListPop(qcss, (void **) &qcs))
2501     {
2502         /*
2503         ** TODO: To implement?
2504         ** qcsequenceadaptorCacheInsert(qcsa, &qcs);
2505         */
2506 
2507         ensQcsequenceDel(&qcs);
2508     }
2509 
2510     ajListFree(&qcss);
2511 
2512     ajStrDel(&constraint);
2513 
2514     return result;
2515 }
2516 
2517 
2518 
2519 
2520 /* @section object access *****************************************************
2521 **
2522 ** Functions for accessing Ensembl Quality Check Sequence objects in an
2523 ** Ensembl SQL database.
2524 **
2525 ** @fdata [EnsPQcsequenceadaptor]
2526 **
2527 ** @nam3rule Delete Delete Ensembl Quality Check Sequence object(s)
2528 ** @nam3rule Store  Store Ensembl Quality Check Sequence object(s)
2529 ** @nam3rule Update Update Ensembl Quality Check Sequence object(s)
2530 **
2531 ** @argrule * qcsa [EnsPQcsequenceadaptor]
2532 ** Ensembl Quality Check Sequence Adaptor
2533 ** @argrule Delete qcs [EnsPQcsequence] Ensembl Quality Check Sequence
2534 ** @argrule Store qcs [EnsPQcsequence] Ensembl Quality Check Sequence
2535 ** @argrule Update qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
2536 **
2537 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
2538 **
2539 ** @fcategory use
2540 ******************************************************************************/
2541 
2542 
2543 
2544 
2545 /* @func ensQcsequenceadaptorDelete *******************************************
2546 **
2547 ** Delete an Ensembl Quality Check Sequence.
2548 **
2549 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2550 ** Ensembl Quality Check Sequence Adaptor
2551 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence
2552 **
2553 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2554 **
2555 ** @release 6.2.0
2556 ** @@
2557 ******************************************************************************/
2558 
ensQcsequenceadaptorDelete(EnsPQcsequenceadaptor qcsa,EnsPQcsequence qcs)2559 AjBool ensQcsequenceadaptorDelete(EnsPQcsequenceadaptor qcsa,
2560                                   EnsPQcsequence qcs)
2561 {
2562     AjBool result = AJFALSE;
2563 
2564     AjPSqlstatement sqls = NULL;
2565 
2566     AjPStr statement = NULL;
2567 
2568     EnsPDatabaseadaptor dba = NULL;
2569 
2570     if (!qcsa)
2571         return ajFalse;
2572 
2573     if (!qcs)
2574         return ajFalse;
2575 
2576     if (!ensQcsequenceGetIdentifier(qcs))
2577         return ajFalse;
2578 
2579     dba = ensQcsequenceadaptorGetDatabaseadaptor(qcsa);
2580 
2581     statement = ajFmtStr("DELETE FROM "
2582                          "sequence "
2583                          "WHERE "
2584                          "sequence.sequence_id = %u",
2585                          qcs->Identifier);
2586 
2587     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
2588 
2589     if (ajSqlstatementGetAffectedrows(sqls))
2590     {
2591         qcs->Adaptor    = NULL;
2592         qcs->Identifier = 0U;
2593 
2594         result = ajTrue;
2595     }
2596 
2597     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
2598 
2599     ajStrDel(&statement);
2600 
2601     return result;
2602 }
2603 
2604 
2605 
2606 
2607 /* @func ensQcsequenceadaptorStore ********************************************
2608 **
2609 ** Store an Ensembl Quality Check Sequence.
2610 **
2611 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2612 ** Ensembl Quality Check Sequence Adaptor
2613 ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Seqeunce
2614 **
2615 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2616 **
2617 ** @release 6.2.0
2618 ** @@
2619 ******************************************************************************/
2620 
ensQcsequenceadaptorStore(EnsPQcsequenceadaptor qcsa,EnsPQcsequence qcs)2621 AjBool ensQcsequenceadaptorStore(EnsPQcsequenceadaptor qcsa,
2622                                  EnsPQcsequence qcs)
2623 {
2624     char *txtname        = NULL;
2625     char *txtaccession   = NULL;
2626     char *txtdescription = NULL;
2627     char *txttype        = NULL;
2628 
2629     AjBool result = AJFALSE;
2630 
2631     AjPSqlstatement sqls = NULL;
2632 
2633     AjPStr statement = NULL;
2634 
2635     EnsPDatabaseadaptor dba = NULL;
2636 
2637     if (!qcsa)
2638         return ajFalse;
2639 
2640     if (!qcs)
2641         return ajFalse;
2642 
2643     if (ensQcsequenceGetAdaptor(qcs) &&
2644         ensQcsequenceGetIdentifier(qcs))
2645         return ajFalse;
2646 
2647     dba = ensQcsequenceadaptorGetDatabaseadaptor(qcsa);
2648 
2649     ensDatabaseadaptorEscapeC(dba, &txtname, qcs->Name);
2650     ensDatabaseadaptorEscapeC(dba, &txtaccession, qcs->Accession);
2651     ensDatabaseadaptorEscapeC(dba, &txtdescription, qcs->Description);
2652     ensDatabaseadaptorEscapeC(dba, &txttype, qcs->Type);
2653 
2654     statement = ajFmtStr("INSERT IGNORE INTO "
2655                          "sequence "
2656                          "SET "
2657                          "sequence.sequence_db_id = %u, "
2658                          "sequence.name = '%s', "
2659                          "sequence.accession = '%s', "
2660                          "sequence.version = %u, "
2661                          "sequence.description = '%s' "
2662                          "sequence.molecule_type = '%s', "
2663                          "sequence.length = %u, "
2664                          "sequence.cds_start = %u, "
2665                          "sequence.cds_end = %u, "
2666                          "sequence.cds_strand = %d, "
2667                          "sequence.poly_a = %u",
2668                          ensQcsequenceGetQcdatabaseIdentifier(qcs),
2669                          txtname,
2670                          txtaccession,
2671                          qcs->Version,
2672                          txtdescription,
2673                          txttype,
2674                          qcs->Length,
2675                          qcs->CdsStart,
2676                          qcs->CdsEnd,
2677                          qcs->CdsStrand,
2678                          qcs->Polya);
2679 
2680     ajCharDel(&txtname);
2681     ajCharDel(&txtaccession);
2682     ajCharDel(&txtdescription);
2683     ajCharDel(&txttype);
2684 
2685     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
2686 
2687     if (ajSqlstatementGetAffectedrows(sqls))
2688     {
2689         ensQcsequenceSetIdentifier(qcs, ajSqlstatementGetIdentifier(sqls));
2690 
2691         ensQcsequenceSetAdaptor(qcs, qcsa);
2692 
2693         result = ajTrue;
2694     }
2695 
2696     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
2697 
2698     ajStrDel(&statement);
2699 
2700     return result;
2701 }
2702 
2703 
2704 
2705 
2706 /* @func ensQcsequenceadaptorUpdate *******************************************
2707 **
2708 ** Update an Ensembl Quality Check Sequence.
2709 **
2710 ** @param [u] qcsa [EnsPQcsequenceadaptor]
2711 ** Ensembl Quality Check Sequence Adaptor
2712 ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence
2713 **
2714 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
2715 **
2716 ** @release 6.2.0
2717 ** @@
2718 ******************************************************************************/
2719 
ensQcsequenceadaptorUpdate(EnsPQcsequenceadaptor qcsa,const EnsPQcsequence qcs)2720 AjBool ensQcsequenceadaptorUpdate(EnsPQcsequenceadaptor qcsa,
2721                                   const EnsPQcsequence qcs)
2722 {
2723     char *txtname        = NULL;
2724     char *txtaccession   = NULL;
2725     char *txtdescription = NULL;
2726     char *txttype        = NULL;
2727 
2728     AjBool result = AJFALSE;
2729 
2730     AjPSqlstatement sqls = NULL;
2731 
2732     AjPStr statement = NULL;
2733 
2734     EnsPDatabaseadaptor dba = NULL;
2735 
2736     if (!qcsa)
2737         return ajFalse;
2738 
2739     if (!qcs)
2740         return ajFalse;
2741 
2742     if (!ensQcsequenceGetIdentifier(qcs))
2743         return ajFalse;
2744 
2745     dba = ensQcsequenceadaptorGetDatabaseadaptor(qcsa);
2746 
2747     ensDatabaseadaptorEscapeC(dba, &txtname, qcs->Name);
2748     ensDatabaseadaptorEscapeC(dba, &txtaccession, qcs->Accession);
2749     ensDatabaseadaptorEscapeC(dba, &txtdescription, qcs->Description);
2750     ensDatabaseadaptorEscapeC(dba, &txttype, qcs->Type);
2751 
2752     statement = ajFmtStr("UPDATE IGNORE "
2753                          "sequence "
2754                          "SET "
2755                          "sequence.sequence_db_id = %u, "
2756                          "sequence.name = '%s', "
2757                          "sequence.accession = '%s', "
2758                          "sequence.version = %u, "
2759                          "sequence.description = '%s' "
2760                          "sequence.molecule_type = '%s', "
2761                          "sequence.length = %u, "
2762                          "sequence.cds_start = %u, "
2763                          "sequence.cds_end = %u, "
2764                          "sequence.cds_strand = %d, "
2765                          "sequence.poly_a = %u "
2766                          "WHERE "
2767                          "sequence.sequence_id = %u",
2768                          ensQcsequenceGetQcdatabaseIdentifier(qcs),
2769                          txtname,
2770                          txtaccession,
2771                          qcs->Version,
2772                          txtdescription,
2773                          txttype,
2774                          qcs->Length,
2775                          qcs->CdsStart,
2776                          qcs->CdsEnd,
2777                          qcs->CdsStrand,
2778                          qcs->Polya,
2779                          qcs->Identifier);
2780 
2781     ajCharDel(&txtname);
2782     ajCharDel(&txtaccession);
2783     ajCharDel(&txtdescription);
2784     ajCharDel(&txttype);
2785 
2786     sqls = ensDatabaseadaptorSqlstatementNew(dba, statement);
2787 
2788     if (ajSqlstatementGetAffectedrows(sqls))
2789         result = ajTrue;
2790 
2791     ensDatabaseadaptorSqlstatementDel(dba, &sqls);
2792 
2793     ajStrDel(&statement);
2794 
2795     return result;
2796 }
2797