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 & or &...; more
1744 ** generally, before replacing.
1745 */
1746
1747 ajStrExchangeCC(Pstr, "&", "&");
1748 ajStrExchangeCC(Pstr, "\"", """);
1749 ajStrExchangeCC(Pstr, "<", "<");
1750 ajStrExchangeCC(Pstr, ">", ">");
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