1 /* @source ensgvdatabaseadaptor ***********************************************
2 **
3 ** Ensembl Genetic Variation Database Adaptor functions
4 **
5 ** @author Copyright (C) 1999 Ensembl Developers
6 ** @author Copyright (C) 2006 Michael K. Schuster
7 ** @version $Revision: 1.14 $
8 ** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
9 ** @modified $Date: 2013/02/17 13:02:40 $ 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 "ensgvdatabaseadaptor.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
64
65
66 /* ========================================================================= */
67 /* =========================== private variables =========================== */
68 /* ========================================================================= */
69
70
71
72
73 /* ========================================================================= */
74 /* =========================== private functions =========================== */
75 /* ========================================================================= */
76
77
78
79
80 /* ========================================================================= */
81 /* ======================= All functions by section ======================== */
82 /* ========================================================================= */
83
84
85
86
87 /* @filesection ensgvdatabaseadaptor ******************************************
88 **
89 ** @nam1rule ens Function belongs to the Ensembl library
90 **
91 ******************************************************************************/
92
93
94
95
96 /* @datasection [EnsPGvdatabaseadaptor] Ensembl Genetic Variation
97 ** Database Adaptor
98 **
99 ** @nam2rule Gvdatabaseadaptor Functions for manipulating
100 ** Ensembl Genetic Variation Database Adaptor objects
101 **
102 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor
103 ** @cc CVS Revision: 1.40
104 ** @cc CVS Tag: branch-ensembl-68
105 **
106 ******************************************************************************/
107
108
109
110
111 /* @section constructors ******************************************************
112 **
113 ** All constructors return a new Ensembl Genetic Variation Database Adaptor
114 ** by pointer.
115 ** It is the responsibility of the user to first destroy any previous
116 ** Genentic Variation Database Adaptor. The target pointer does not need to be
117 ** initialised to NULL, but it is good programming practice to do so anyway.
118 **
119 ** @fdata [EnsPGvdatabaseadaptor]
120 **
121 ** @nam3rule New Constructor
122 ** @nam4rule Ini Constructor with initial values
123 **
124 ** @argrule Ini dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
125 **
126 ** @valrule * [EnsPGvdatabaseadaptor]
127 ** Ensembl Genetic Variation Database Adaptor or NULL
128 **
129 ** @fcategory new
130 ******************************************************************************/
131
132
133
134
135 /* @func ensGvdatabaseadaptorNewIni *******************************************
136 **
137 ** Constructor for an Ensembl Genetic Variation Database Adaptor with
138 ** initial values.
139 **
140 ** Ensembl Database Adaptors are singleton objects in the sense that a single
141 ** instance of an Ensembl Database Adaptor connected to a particular database
142 ** is sufficient to instantiate any number of Ensembl Object Adaptors from the
143 ** database. Each Ensembl Object Adaptor will have a weak reference to the
144 ** Ensembl Database Adaptor that instantiated it. Therefore, Ensembl Database
145 ** Adaptors should not be instantiated directly, but rather obtained from the
146 ** Ensembl Registry, which will in turn call this function if neccessary.
147 **
148 ** @see ensRegistryGetGvdatabaseadaptor
149 **
150 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::new
151 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
152 **
153 ** @return [EnsPGvdatabaseadaptor]
154 ** Ensembl Genetic Variation Database Adaptor or NULL
155 **
156 ** @release 6.4.0
157 ** @@
158 ******************************************************************************/
159
ensGvdatabaseadaptorNewIni(EnsPDatabaseadaptor dba)160 EnsPGvdatabaseadaptor ensGvdatabaseadaptorNewIni(EnsPDatabaseadaptor dba)
161 {
162 EnsPGvdatabaseadaptor gvdba = NULL;
163
164 if (!dba)
165 return NULL;
166
167 if (ensDatabaseadaptorGetGroup(dba) !=
168 ensEDatabaseadaptorGroupGeneticVariation)
169 return NULL;
170
171 AJNEW0(gvdba);
172
173 gvdba->Adaptor = dba;
174 gvdba->Failedvariations = ajFalse;
175
176 return gvdba;
177 }
178
179
180
181
182 /* @section destructors *******************************************************
183 **
184 ** Destruction destroys all internal data structures and frees the memory
185 ** allocated for an Ensembl Genetic Variation Database Adaptor object.
186 **
187 ** @fdata [EnsPGvdatabaseadaptor]
188 **
189 ** @nam3rule Del Destroy (free) an Ensembl Genetic Variation Database Adaptor
190 **
191 ** @argrule * Pgvdba [EnsPGvdatabaseadaptor*]
192 ** Ensembl Genetic Variation Database Adaptor address
193 **
194 ** @valrule * [void]
195 **
196 ** @fcategory delete
197 ******************************************************************************/
198
199
200
201
202 /* @func ensGvdatabaseadaptorDel **********************************************
203 **
204 ** Default destructor for an Ensembl Genetic Variation Database Adaptor.
205 **
206 ** Ensembl Database Adaptors are singleton objects that are registered in the
207 ** Ensembl Registry and weakly referenced by Ensembl Object Adaptors that have
208 ** been instantiated by it. Therefore, Ensembl Database Adaptors should never
209 ** be destroyed directly. Upon exit, the Ensembl Registry will call this
210 ** function if required.
211 **
212 ** @see ensExit
213 ** @see ensRegistryExit
214 **
215 ** @param [d] Pgvdba [EnsPGvdatabaseadaptor*]
216 ** Ensembl Genetic Variation Database Adaptor address
217 **
218 ** @return [void]
219 **
220 ** @release 6.4.0
221 ** @@
222 ******************************************************************************/
223
ensGvdatabaseadaptorDel(EnsPGvdatabaseadaptor * Pgvdba)224 void ensGvdatabaseadaptorDel(EnsPGvdatabaseadaptor *Pgvdba)
225 {
226 EnsPGvdatabaseadaptor pthis = NULL;
227
228 if (!Pgvdba)
229 return;
230
231 #if defined(AJ_DEBUG) && AJ_DEBUG >= 1
232 if (ajDebugTest("ensGvdatabaseadaptorDel"))
233 {
234 ajDebug("ensGvdatabaseadaptorDel\n"
235 " *Pgvdba %p\n",
236 *Pgvdba);
237
238 ensGvdatabaseadaptorTrace(*Pgvdba, 1);
239 }
240 #endif /* defined(AJ_DEBUG) && AJ_DEBUG >= 1 */
241
242 if (!(pthis = *Pgvdba))
243 return;
244
245 ajMemFree((void **) Pgvdba);
246
247 return;
248 }
249
250
251
252
253 /* @section member retrieval **************************************************
254 **
255 ** Functions for returning members of an
256 ** Ensembl Genetic Variation Database Adaptor object.
257 **
258 ** @fdata [EnsPGvdatabaseadaptor]
259 **
260 ** @nam3rule Get Return Ensembl Database Adaptor attribute(s)
261 ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor
262 ** @nam4rule Failedvariations Return the failed variations attribute
263 **
264 ** @argrule * gvdba [const EnsPGvdatabaseadaptor]
265 ** Ensembl Genetic Variation Database Adaptor
266 **
267 ** @valrule Databaseadaptor [EnsPDatabaseadaptor]
268 ** Ensembl Database Adaptor or NULL
269 ** @valrule Failedvariations [AjBool] Failed variations attribute or ajFalse
270 **
271 ** @fcategory use
272 ******************************************************************************/
273
274
275
276
277 /* @func ensGvdatabaseadaptorGetDatabaseadaptor *******************************
278 **
279 ** Get the Ensembl Database Adaptor member of an
280 ** Ensembl Genetic Variation Database Adaptor.
281 **
282 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::db
283 ** @param [r] gvdba [const EnsPGvdatabaseadaptor]
284 ** Ensembl Genetic Variation Database Adaptor
285 **
286 ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL
287 **
288 ** @release 6.4.0
289 ** @@
290 ******************************************************************************/
291
ensGvdatabaseadaptorGetDatabaseadaptor(const EnsPGvdatabaseadaptor gvdba)292 EnsPDatabaseadaptor ensGvdatabaseadaptorGetDatabaseadaptor(
293 const EnsPGvdatabaseadaptor gvdba)
294 {
295 return (gvdba) ? gvdba->Adaptor : NULL;
296 }
297
298
299
300
301 /* @func ensGvdatabaseadaptorGetFailedvariations ******************************
302 **
303 ** Get the failed variations member of an
304 ** Ensembl Genetic Variation Database Adaptor.
305 **
306 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::include_failed_variations
307 ** @param [r] gvdba [const EnsPGvdatabaseadaptor]
308 ** Ensembl Genetic Variation Database Adaptor
309 **
310 ** @return [AjBool] Failed variation attribute or ajFalse
311 **
312 ** @release 6.4.0
313 ** @@
314 ******************************************************************************/
315
ensGvdatabaseadaptorGetFailedvariations(const EnsPGvdatabaseadaptor gvdba)316 AjBool ensGvdatabaseadaptorGetFailedvariations(
317 const EnsPGvdatabaseadaptor gvdba)
318 {
319 return (gvdba) ? gvdba->Failedvariations : ajFalse;
320 }
321
322
323
324
325 /* @section member assignment *************************************************
326 **
327 ** Functions for assigning members of an
328 ** Ensembl Genetic Variation Database Adaptor object.
329 **
330 ** @fdata [EnsPGvdatabaseadaptor]
331 **
332 ** @nam3rule Set Set one member of an
333 ** Ensembl Genetic Variation Database Adaptor
334 ** @nam4rule Databaseadaptor Set the Ensembl Database Adaptor
335 ** @nam4rule Failedvariations Set the failed variations attribute
336 **
337 ** @argrule * gvdba [EnsPGvdatabaseadaptor]
338 ** Ensembl Genetic Variation Database Adaptor object
339 ** @argrule Databaseadaptor dba [EnsPDatabaseadaptor]
340 ** Ensembl Database Adaptor
341 ** @argrule Failedvariations fv [AjBool] Failed variations attribute
342 **
343 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
344 **
345 ** @fcategory modify
346 ******************************************************************************/
347
348
349
350
351 /* @func ensGvdatabaseadaptorSetDatabaseadaptor *******************************
352 **
353 ** Set the Ensembl Database Adaptor member of an
354 ** Ensembl Genetic Variation Database Adaptor.
355 **
356 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::db
357 ** @param [u] gvdba [EnsPGvdatabaseadaptor]
358 ** Ensembl Genetic Variation Database Adaptor
359 ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor
360 **
361 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
362 **
363 ** @release 6.4.0
364 ** @@
365 ******************************************************************************/
366
ensGvdatabaseadaptorSetDatabaseadaptor(EnsPGvdatabaseadaptor gvdba,EnsPDatabaseadaptor dba)367 AjBool ensGvdatabaseadaptorSetDatabaseadaptor(EnsPGvdatabaseadaptor gvdba,
368 EnsPDatabaseadaptor dba)
369 {
370 if (!gvdba)
371 return ajFalse;
372
373 gvdba->Adaptor = dba;
374
375 return ajTrue;
376 }
377
378
379
380
381 /* @func ensGvdatabaseadaptorSetFailedvariations ******************************
382 **
383 ** Set the failed variation member of an
384 ** Ensembl Genetic Variation Database Adaptor.
385 **
386 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::include_failed_variations
387 ** @param [u] gvdba [EnsPGvdatabaseadaptor]
388 ** Ensembl Genetic Variation Database Adaptor
389 ** @param [r] fv [AjBool] Failed variations attribute
390 **
391 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
392 **
393 ** @release 6.4.0
394 ** @@
395 ******************************************************************************/
396
ensGvdatabaseadaptorSetFailedvariations(EnsPGvdatabaseadaptor gvdba,AjBool fv)397 AjBool ensGvdatabaseadaptorSetFailedvariations(EnsPGvdatabaseadaptor gvdba,
398 AjBool fv)
399 {
400 if (!gvdba)
401 return ajFalse;
402
403 gvdba->Failedvariations = fv;
404
405 return ajTrue;
406 }
407
408
409
410
411 /* @section debugging *********************************************************
412 **
413 ** Functions for reporting of an
414 ** Ensembl Genetic Variation Database Adaptor object.
415 **
416 ** @fdata [EnsPGvdatabaseadaptor]
417 **
418 ** @nam3rule Trace Report Ensembl Genetic Variation Database Adaptor
419 ** members to debug file
420 **
421 ** @argrule Trace gvdba [const EnsPGvdatabaseadaptor]
422 ** Ensembl Genetic Variation Database Adaptor
423 ** @argrule Trace level [ajuint] Indentation level
424 **
425 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
426 **
427 ** @fcategory misc
428 ******************************************************************************/
429
430
431
432
433 /* @func ensGvdatabaseadaptorTrace ********************************************
434 **
435 ** Trace an Ensembl Genetic Variation Database Adaptor.
436 **
437 ** @param [r] gvdba [const EnsPGvdatabaseadaptor]
438 ** Ensembl Genetic Variation Database Adaptor
439 ** @param [r] level [ajuint] Indentation level
440 **
441 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
442 **
443 ** @release 6.4.0
444 ** @@
445 ******************************************************************************/
446
ensGvdatabaseadaptorTrace(const EnsPGvdatabaseadaptor gvdba,ajuint level)447 AjBool ensGvdatabaseadaptorTrace(const EnsPGvdatabaseadaptor gvdba,
448 ajuint level)
449 {
450 AjPStr indent = NULL;
451
452 if (!gvdba)
453 return ajFalse;
454
455 indent = ajStrNew();
456
457 ajStrAppendCountK(&indent, ' ', level * 2);
458
459 ajDebug("%SensGvdatabaseadaptorTrace %p\n"
460 "%S Databaseadaptor %p\n"
461 "%S Failedvariations '%B'\n",
462 indent, gvdba,
463 indent, gvdba->Adaptor,
464 indent, gvdba->Failedvariations);
465
466 ensDatabaseadaptorTrace(gvdba->Adaptor, level + 1);
467
468 ajStrDel(&indent);
469
470 return ajTrue;
471 }
472
473
474
475
476 /* @section accessory object retrieval ****************************************
477 **
478 ** Functions for retrieving objects releated to
479 ** Ensembl Genetic Variation Database Adaptor objects.
480 **
481 ** @fdata [EnsPGvdatabaseadaptor]
482 **
483 ** @nam3rule Failedallelesconstraint Retrieve an SQL constraint for
484 ** failed Ensembl Genetic Variation Allele object(s)
485 ** @nam3rule Failedstructuralsconstraint Retrieve an SQL constraint for
486 ** failed Ensembl Genetic Variation Structural Variation object(s)
487 ** @nam3rule Failedvariationsconstraint Retrieve an SQL constraint for
488 ** failed Ensembl Genetic Variation Variation object(s)
489 **
490 ** @argrule * gvdba [EnsPGvdatabaseadaptor]
491 ** Ensembl Genetic Variation Database Adaptor
492 ** @argrule Failedallelesconstraint tablename [const AjPStr] SQL table name
493 ** @argrule Failedallelesconstraint Pconstraint [AjPStr*] SQL constraint
494 ** @argrule Failedstructuralsconstraint tablename [const AjPStr] SQL table name
495 ** @argrule Failedstructuralsconstraint Pconstraint [AjPStr*] SQL constraint
496 ** @argrule Failedvariationsconstraint tablename [const AjPStr] SQL table name
497 ** @argrule Failedvariationsconstraint Pconstraint [AjPStr*] SQL constraint
498 **
499 ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise
500 **
501 ** @fcategory use
502 ******************************************************************************/
503
504
505
506
507 /* @func ensGvdatabaseadaptorFailedallelesconstraint **************************
508 **
509 ** API-internal method for getting the constraint to filter out failed
510 ** Ensembl Genetic Variation Allele objects.
511 ** Assumes that the "failed_variation" SQL table has been
512 ** (left) joined to the SQL statement and that the SQL table name is either
513 ** supplied or equals "failed_variation".
514 **
515 ** The caller is responsible for deleting the AJAX String
516 **
517 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::
518 ** _exclude_failed_alleles_constraint
519 ** @param [u] gvdba [EnsPGvdatabaseadaptor]
520 ** Ensembl Genetic Variation Database Adaptor
521 ** @param [rN] tablename [const AjPStr] SQL table name
522 ** @param [u] Pconstraint [AjPStr*] SQL constraint
523 **
524 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
525 **
526 ** @release 6.4.0
527 ** @@
528 ******************************************************************************/
529
ensGvdatabaseadaptorFailedallelesconstraint(EnsPGvdatabaseadaptor gvdba,const AjPStr tablename,AjPStr * Pconstraint)530 AjBool ensGvdatabaseadaptorFailedallelesconstraint(
531 EnsPGvdatabaseadaptor gvdba,
532 const AjPStr tablename,
533 AjPStr *Pconstraint)
534 {
535 char *txttablename = NULL;
536
537 if (!gvdba)
538 return ajFalse;
539
540 if (!Pconstraint)
541 return ajFalse;
542
543 if (!*Pconstraint)
544 *Pconstraint = ajStrNew();
545
546 if (gvdba->Failedvariations)
547 {
548 if ((tablename != NULL) && (ajStrGetLen(tablename)))
549 {
550 ensDatabaseadaptorEscapeC(
551 ensGvdatabaseadaptorGetDatabaseadaptor(gvdba),
552 &txttablename,
553 tablename);
554
555 ajStrAssignC(Pconstraint, txttablename);
556
557 ajCharDel(&txttablename);
558 }
559 else
560 ajStrAssignC(Pconstraint, "failed_variation");
561
562 ajStrAppendC(Pconstraint, ".allele_id IS NULL");
563 }
564 else
565 ajStrAssignC(Pconstraint, "1");
566
567 return ajTrue;
568 }
569
570
571
572
573 /* @func ensGvdatabaseadaptorFailedstructuralsconstraint **********************
574 **
575 ** API-internal method for getting the constraint to filter out failed
576 ** Ensembl Genetic Variation Structural Variation objects.
577 ** Assumes that the "failed_structural_variation" SQL table has been
578 ** (left) joined to the SQL statement and that the SQL table name is either
579 ** supplied or equals "failed_structural_variation".
580 **
581 ** The caller is responsible for deleting the AJAX String
582 **
583 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::
584 ** _exclude_failed_structural_variations_constraint
585 ** @param [u] gvdba [EnsPGvdatabaseadaptor]
586 ** Ensembl Genetic Variation Database Adaptor
587 ** @param [rN] tablename [const AjPStr] SQL table name
588 ** @param [u] Pconstraint [AjPStr*] SQL constraint
589 **
590 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
591 **
592 ** @release 6.4.0
593 ** @@
594 ******************************************************************************/
595
ensGvdatabaseadaptorFailedstructuralsconstraint(EnsPGvdatabaseadaptor gvdba,const AjPStr tablename,AjPStr * Pconstraint)596 AjBool ensGvdatabaseadaptorFailedstructuralsconstraint(
597 EnsPGvdatabaseadaptor gvdba,
598 const AjPStr tablename,
599 AjPStr *Pconstraint)
600 {
601 char *txttablename = NULL;
602
603 if (!gvdba)
604 return ajFalse;
605
606 if (!Pconstraint)
607 return ajFalse;
608
609 if (!*Pconstraint)
610 *Pconstraint = ajStrNew();
611
612 if (gvdba->Failedvariations)
613 {
614 if ((tablename != NULL) && (ajStrGetLen(tablename)))
615 {
616 ensDatabaseadaptorEscapeC(
617 ensGvdatabaseadaptorGetDatabaseadaptor(gvdba),
618 &txttablename,
619 tablename);
620
621 ajStrAssignC(Pconstraint, txttablename);
622
623 ajCharDel(&txttablename);
624 }
625 else
626 ajStrAssignC(Pconstraint, "failed_structural_variation");
627
628 ajStrAppendC(Pconstraint, ".structural_variation_id IS NULL");
629 }
630 else
631 ajStrAssignC(Pconstraint, "1");
632
633 return ajTrue;
634 }
635
636
637
638
639 /* @func ensGvdatabaseadaptorFailedvariationsconstraint ***********************
640 **
641 ** API-internal method for getting the constraint to filter out failed
642 ** Ensembl Genetic Variation Variation objects.
643 ** Assumes that the "failed_variation" SQL table has been
644 ** (left) joined to the SQL statement and that the SQL table name is either
645 ** supplied or equals "failed_variation".
646 **
647 ** The caller is responsible for deleting the AJAX String
648 **
649 ** @cc Bio::EnsEMBL::Variation::DBSQL::DBAdaptor::
650 ** _exclude_failed_variations_constraint
651 ** @param [u] gvdba [EnsPGvdatabaseadaptor]
652 ** Ensembl Genetic Variation Database Adaptor
653 ** @param [rN] tablename [const AjPStr] SQL table name
654 ** @param [u] Pconstraint [AjPStr*] SQL constraint
655 **
656 ** @return [AjBool] ajTrue upon success, ajFalse otherwise
657 **
658 ** @release 6.4.0
659 ** @@
660 ******************************************************************************/
661
ensGvdatabaseadaptorFailedvariationsconstraint(EnsPGvdatabaseadaptor gvdba,const AjPStr tablename,AjPStr * Pconstraint)662 AjBool ensGvdatabaseadaptorFailedvariationsconstraint(
663 EnsPGvdatabaseadaptor gvdba,
664 const AjPStr tablename,
665 AjPStr *Pconstraint)
666 {
667 char *txttablename = NULL;
668
669 if (!gvdba)
670 return ajFalse;
671
672 if (!Pconstraint)
673 return ajFalse;
674
675 if (!*Pconstraint)
676 *Pconstraint = ajStrNew();
677
678 if (gvdba->Failedvariations)
679 {
680 if ((tablename != NULL) && (ajStrGetLen(tablename)))
681 {
682 ensDatabaseadaptorEscapeC(
683 ensGvdatabaseadaptorGetDatabaseadaptor(gvdba),
684 &txttablename,
685 tablename);
686
687 ajStrAssignC(Pconstraint, txttablename);
688
689 ajCharDel(&txttablename);
690 }
691 else
692 ajStrAssignC(Pconstraint, "failed_variation");
693
694 ajStrAppendC(Pconstraint, ".variation_id IS NULL");
695 }
696 else
697 ajStrAssignC(Pconstraint, "1");
698
699 return ajTrue;
700 }
701