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