/* @source Ensembl Quality Check Sequence functions ** ** @author Copyright (C) 1999 Ensembl Developers ** @author Copyright (C) 2006 Michael K. Schuster ** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core ** @modified $Date: 2011/05/25 19:55:04 $ by $Author: mks $ ** @version $Revision: 1.23 $ ** @@ ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ******************************************************************************/ /* ==================================================================== */ /* ========================== include files =========================== */ /* ==================================================================== */ #include "ensqcsequence.h" /* ==================================================================== */ /* ============================ constants ============================= */ /* ==================================================================== */ /* ==================================================================== */ /* ======================== global variables ========================== */ /* ==================================================================== */ /* ==================================================================== */ /* ========================== private data ============================ */ /* ==================================================================== */ /* ==================================================================== */ /* ======================== private constants ========================= */ /* ==================================================================== */ /* @conststatic qcsequenceadaptorTables *************************************** ** ** Array of Ensembl Quality Check Sequence Adaptor SQL table names ** ******************************************************************************/ static const char* qcsequenceadaptorTables[] = { "sequence", (const char*) NULL }; /* @conststatic qcsequenceadaptorColumns ************************************** ** ** Array of Ensembl Quality Check Sequence Adaptor SQL column names ** ******************************************************************************/ static const char* qcsequenceadaptorColumns[] = { "sequence.sequence_id", "sequence.sequence_db_id", "sequence.name", "sequence.accession", "sequence.version", "sequence.type", "sequence.length", "sequence.cdsstart", "sequence.cdend", "sequence.cdsstrand", "sequence.polya", "sequence.description", (const char*) NULL }; /* ==================================================================== */ /* ======================== private variables ========================= */ /* ==================================================================== */ /* ==================================================================== */ /* ======================== private functions ========================= */ /* ==================================================================== */ static AjBool qcsequenceadaptorFetchAllbyStatement( EnsPDatabaseadaptor dba, const AjPStr statement, EnsPAssemblymapper am, EnsPSlice slice, AjPList qcss); /* ==================================================================== */ /* ===================== All functions by section ===================== */ /* ==================================================================== */ /* @filesection ensqcsequence ************************************************* ** ** @nam1rule ens Function belongs to the Ensembl library ** ******************************************************************************/ /* @datasection [EnsPQcsequence] Ensembl Quality Check Sequence *************** ** ** @nam2rule Qcsequence Functions for manipulating ** Ensembl Quality Check Sequence objects ** ** @cc Bio::EnsEMBL::QC::Sequence ** @cc CVS Revision: ** @cc CVS Tag: ** ******************************************************************************/ /* @section constructors ****************************************************** ** ** All constructors return a new Ensembl Quality Check Sequence by pointer. ** It is the responsibility of the user to first destroy any previous ** Quality Check Sequence. The target pointer does not need to be initialised ** to NULL, but it is good programming practice to do so anyway. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule New Constructor ** @nam4rule Cpy Constructor with existing object ** @nam4rule Ini Constructor with initial values ** @nam4rule Ref Constructor by incrementing the reference counter ** ** @argrule Cpy qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule Ini qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @argrule Ini identifier [ajuint] SQL database-internal identifier ** @argrule Ini qcdb [EnsPQcdatabase] Ensembl Quality Check Database ** @argrule Ini name [AjPStr] Name ** @argrule Ini accession [AjPStr] Accession ** @argrule Ini version [ajuint] Version ** @argrule Ini type [AjPStr] Type ** @argrule Ini length [ajuint] Length ** @argrule Ini cdsstart [ajuint] CDS start ** @argrule Ini cdsend [ajuint] CDS end ** @argrule Ini cdsstrand [ajint] CDS strand ** @argrule Ini polya [ajuint] PolyA+ tail length ** @argrule Ini description [AjPStr] Description ** @argrule Ref qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule * [EnsPQcsequence] Ensembl Quality Check Sequence ** ** @fcategory new ******************************************************************************/ /* @func ensQcsequenceNewCpy ************************************************** ** ** Object-based constructor function, which returns an independent object. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL ** @@ ******************************************************************************/ EnsPQcsequence ensQcsequenceNewCpy(const EnsPQcsequence qcs) { EnsPQcsequence pthis = NULL; if(!qcs) return NULL; AJNEW0(pthis); pthis->Use = 1; pthis->Identifier = qcs->Identifier; pthis->Adaptor = qcs->Adaptor; pthis->Qcdatabase = ensQcdatabaseNewRef(qcs->Qcdatabase); if(qcs->Name) pthis->Name = ajStrNewRef(qcs->Name); if(qcs->Accession) pthis->Accession = ajStrNewRef(qcs->Accession); pthis->Version = qcs->Version; if(qcs->Type) pthis->Type = ajStrNewRef(qcs->Type); pthis->Length = qcs->Length; pthis->CdsStart = qcs->CdsStart; pthis->CdsEnd = qcs->CdsEnd; pthis->CdsStrand = qcs->CdsStrand; pthis->Polya = qcs->Polya; if(qcs->Description) pthis->Description = ajStrNewRef(qcs->Description); return pthis; } /* @func ensQcsequenceNewIni ************************************************** ** ** Constructor for an Ensembl Quality Check Sequence with initial values. ** ** @cc Bio::EnsEMBL::Storable::new ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] identifier [ajuint] SQL database-internal identifier ** @cc Bio::EnsEMBL::QC::Sequence::new ** @param [u] qcdb [EnsPQcdatabase] Ensembl Quality Check Database ** @param [u] name [AjPStr] Name ** @param [u] accession [AjPStr] Accession ** @param [r] version [ajuint] Version ** @param [u] type [AjPStr] Type ** @param [r] length [ajuint] Length ** @param [r] cdsstart [ajuint] CDS start ** @param [r] cdsend [ajuint] CDS end ** @param [r] cdsstrand [ajint] CDS strand ** @param [r] polya [ajuint] PolyA+ tail length ** @param [u] description [AjPStr] Description ** ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL ** @@ ******************************************************************************/ EnsPQcsequence 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) { EnsPQcsequence qcs = NULL; if(!qcdb) return NULL; if(!name) return NULL; if(!accession) return NULL; AJNEW0(qcs); qcs->Use = 1; qcs->Identifier = identifier; qcs->Adaptor = qcsa; qcs->Qcdatabase = ensQcdatabaseNewRef(qcdb); if(name) qcs->Name = ajStrNewRef(name); if(accession) qcs->Accession = ajStrNewRef(accession); qcs->Version = version; if(type) qcs->Type = ajStrNewRef(type); qcs->Length = length; qcs->CdsStart = cdsstart; qcs->CdsEnd = cdsend; qcs->CdsStrand = cdsstrand; qcs->Polya = polya; if(description) qcs->Description = ajStrNewRef(description); return qcs; } /* @func ensQcsequenceNewRef ************************************************** ** ** Ensembl Object referencing function, which returns a pointer to the ** Ensembl Object passed in and increases its reference count. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [EnsPQcsequence] Ensembl Quality Check Sequence or NULL ** @@ ******************************************************************************/ EnsPQcsequence ensQcsequenceNewRef(EnsPQcsequence qcs) { if(!qcs) return NULL; qcs->Use++; return qcs; } /* @section destructors ******************************************************* ** ** Destruction destroys all internal data structures and frees the ** memory allocated for an Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Del Destroy (free) an Ensembl Quality Check Sequence object ** ** @argrule * Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence ** object address ** ** @valrule * [void] ** ** @fcategory delete ******************************************************************************/ /* @func ensQcsequenceDel ***************************************************** ** ** Default destructor for an Ensembl Quality Check Sequence. ** ** @param [d] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence ** object address ** ** @return [void] ** @@ ******************************************************************************/ void ensQcsequenceDel(EnsPQcsequence* Pqcs) { EnsPQcsequence pthis = NULL; if(!Pqcs) return; if(!*Pqcs) return; if(ajDebugTest("ensQcsequenceDel")) { ajDebug("ensQcsequenceDel\n" " *Pqcs %p\n", *Pqcs); ensQcsequenceTrace(*Pqcs, 1); } pthis = *Pqcs; pthis->Use--; if(pthis->Use) { *Pqcs = NULL; return; } ensQcdatabaseDel(&pthis->Qcdatabase); ajStrDel(&pthis->Name); ajStrDel(&pthis->Accession); ajStrDel(&pthis->Type); ajStrDel(&pthis->Description); AJFREE(pthis); *Pqcs = NULL; return; } /* @section element retrieval ************************************************* ** ** Functions for returning elements of an ** Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Get Return Ensembl Quality Check Sequence attribute(s) ** @nam4rule Accession Return the accession number ** @nam4rule Adaptor Return the Ensembl Quality Check Sequence Adaptor ** @nam4rule Cds Return coding sequence members ** @nam5rule End Return the coding sequence end ** @nam5rule Start Return the coding sequence start ** @nam5rule Strand Return the coding sequence strand ** @nam4rule Description Return the description ** @nam4rule Identifier Return the SQL database-internal identifier ** @nam4rule Length Return the length ** @nam4rule Name Return the name ** @nam4rule Polya Return the PolyA+ tail length ** @nam4rule Qcdatabase Return the Ensembl Quality Check Database ** @nam4rule Type Retrun the type ** @nam4rule Version Return the version ** ** @argrule * qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule Accession [AjPStr] Accession number or NULL ** @valrule Adaptor [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor or NULL ** @valrule CdsEnd [ajuint] Coding sequence end or 0 ** @valrule CdsStart [ajuint] Coding sequence start or 0 ** @valrule CdsStrand [ajint] Coding sequence strand or 0 ** @valrule Description [AjPStr] Description or NULL ** @valrule Identifier [ajuint] SQL database-internal identifier or 0 ** @valrule Length [ajuint] Length or 0 ** @valrule Name [AjPStr] Name or NULL ** @valrule Polya [ajuint] Polya tail length or 0 ** @valrule Qcdatabase [EnsPQcdatabase] Ensembl Quality Check Database or NULL ** @valrule Type [AjPStr] Type or NULL ** @valrule Version [ajuint] Version or 0 ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceGetAccession ******************************************** ** ** Get the accession number element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjPStr] Accession number or NULL ** @@ ******************************************************************************/ AjPStr ensQcsequenceGetAccession(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Accession; } /* @func ensQcsequenceGetAdaptor ********************************************** ** ** Get the Ensembl Quality Check Sequence Adaptor element of an ** Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor ** or NULL ** @@ ******************************************************************************/ EnsPQcsequenceadaptor ensQcsequenceGetAdaptor(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Adaptor; } /* @func ensQcsequenceGetCdsEnd *********************************************** ** ** Get the CDS end element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] CDS start or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetCdsEnd(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->CdsEnd; } /* @func ensQcsequenceGetCdsStart ********************************************* ** ** Get the CDS start element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] CDS start or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetCdsStart(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->CdsStart; } /* @func ensQcsequenceGetCdsStrand ******************************************** ** ** Get the CDS strand element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajint] CDS strand or 0 ** @@ ******************************************************************************/ ajint ensQcsequenceGetCdsStrand(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->CdsStrand; } /* @func ensQcsequenceGetDescription ****************************************** ** ** Get the description element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjPStr] Description or NULL ** @@ ******************************************************************************/ AjPStr ensQcsequenceGetDescription(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Description; } /* @func ensQcsequenceGetIdentifier ******************************************* ** ** Get the SQL database-internal identifier element of an ** Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] SQL database-internal identifier or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetIdentifier(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->Identifier; } /* @func ensQcsequenceGetLength *********************************************** ** ** Get the length element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] Length or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetLength(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->Length; } /* @func ensQcsequenceGetName ************************************************* ** ** Get the name element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjPStr] Name or NULL ** @@ ******************************************************************************/ AjPStr ensQcsequenceGetName(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Name; } /* @func ensQcsequenceGetPolya ************************************************ ** ** Get the PolyA+ tail length element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] PolyA+ tail length or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetPolya(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->Polya; } /* @func ensQcsequenceGetQcdatabase ******************************************* ** ** Get the Ensembl Quality Check Database element of an ** Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [EnsPQcdatabase] Ensembl Quality Check Database or NULL ** @@ ******************************************************************************/ EnsPQcdatabase ensQcsequenceGetQcdatabase(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Qcdatabase; } /* @func ensQcsequenceGetType ************************************************* ** ** Get the type element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjPStr] Type or NULL ** @@ ******************************************************************************/ AjPStr ensQcsequenceGetType(const EnsPQcsequence qcs) { if(!qcs) return NULL; return qcs->Type; } /* @func ensQcsequenceGetVersion ********************************************** ** ** Get the version element of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] Version or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetVersion(const EnsPQcsequence qcs) { if(!qcs) return 0; return qcs->Version; } /* @section modifiers ********************************************************* ** ** Functions for assigning elements of an ** Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Set Set one element of an Ensembl Quality Check Sequence ** @nam4rule Accession Set the accession number ** @nam4rule Adaptor Set the Ensembl Quality Check Sequence Adaptor ** @nam4rule Cds Set coding sequence members ** @nam5rule End Set the CDS end ** @nam5rule Start Set the CDS start ** @nam5rule Strand Set the CDS strand ** @nam4rule Description Set the description ** @nam4rule Identifier Set the SQL database-internal identifier ** @nam4rule Length Set the length ** @nam4rule Name Set the name ** @nam4rule Polya Set the Polya+ tail length ** @nam4rule Qcdatabase Set the Ensembl Quality Check Database ** @nam4rule Type Set the type ** @nam4rule Version Set the version ** ** @argrule * qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule Accession accession [AjPStr] Accession number ** @argrule Adaptor qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @argrule CdsEnd cdsend [ajuint] CDS end ** @argrule CdsStart cdsstart [ajuint] CDS start ** @argrule CdsStrand cdsstrand [ajint] CDS strand ** @argrule Description description [AjPStr] Description ** @argrule Identifier identifier [ajuint] SQL database-internal identifier ** @argrule Length length [ajuint] Length ** @argrule Name name [AjPStr] Name ** @argrule Polya polya [ajuint] PolyA+ tail length ** @argrule Qcdatabase qcdb [EnsPQcdatabase] Ensembl Quality Check Database ** @argrule Type type [AjPStr] Type ** @argrule Version version [ajuint] Version ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory modify ******************************************************************************/ /* @func ensQcsequenceSetAccession ******************************************** ** ** Set the accession number element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] accession [AjPStr] Accession number ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetAccession(EnsPQcsequence qcs, AjPStr accession) { if(!qcs) return ajFalse; ajStrDel(&qcs->Accession); qcs->Accession = ajStrNewRef(accession); return ajTrue; } /* @func ensQcsequenceSetAdaptor ********************************************** ** ** Set the Ensembl Quality Check Sequence Adaptor element of an ** Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetAdaptor(EnsPQcsequence qcs, EnsPQcsequenceadaptor qcsa) { if(!qcs) return ajFalse; qcs->Adaptor = qcsa; return ajTrue; } /* @func ensQcsequenceSetCdsEnd *********************************************** ** ** Set the CDS end element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] cdsend [ajuint] CDS end ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetCdsEnd(EnsPQcsequence qcs, ajuint cdsend) { if(!qcs) return ajFalse; qcs->CdsEnd = cdsend; return ajTrue; } /* @func ensQcsequenceSetCdsStart ********************************************* ** ** Set the CDS start element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] cdsstart [ajuint] CDS start ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetCdsStart(EnsPQcsequence qcs, ajuint cdsstart) { if(!qcs) return ajFalse; qcs->CdsStart = cdsstart; return ajTrue; } /* @func ensQcsequenceSetCdsStrand ******************************************** ** ** Set the CDS strand element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] cdsstrand [ajint] CDS strand ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetCdsStrand(EnsPQcsequence qcs, ajint cdsstrand) { if(!qcs) return ajFalse; qcs->CdsStrand = cdsstrand; return ajTrue; } /* @func ensQcsequenceSetDescription ****************************************** ** ** Set the description element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] description [AjPStr] Description ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetDescription(EnsPQcsequence qcs, AjPStr description) { if(!qcs) return ajFalse; ajStrDel(&qcs->Description); qcs->Description = ajStrNewRef(description); return ajTrue; } /* @func ensQcsequenceSetIdentifier ******************************************* ** ** Set the SQL database-internal identifier element of an ** Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] identifier [ajuint] SQL database-internal identifier ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetIdentifier(EnsPQcsequence qcs, ajuint identifier) { if(!qcs) return ajFalse; qcs->Identifier = identifier; return ajTrue; } /* @func ensQcsequenceSetLength *********************************************** ** ** Set the length element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] length [ajuint] Length ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetLength(EnsPQcsequence qcs, ajuint length) { if(!qcs) return ajFalse; qcs->Length = length; return ajTrue; } /* @func ensQcsequenceSetName ************************************************* ** ** Set the name element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] name [AjPStr] Name ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetName(EnsPQcsequence qcs, AjPStr name) { if(!qcs) return ajFalse; ajStrDel(&qcs->Name); qcs->Name = ajStrNewRef(name); return ajTrue; } /* @func ensQcsequenceSetPolya ************************************************ ** ** Set the PolyA+ tail length element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] polya [ajuint] PolyA+ tail length ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetPolya(EnsPQcsequence qcs, ajuint polya) { if(!qcs) return ajFalse; qcs->Polya = polya; return ajTrue; } /* @func ensQcsequenceSetQcdatabase ******************************************* ** ** Set the Ensembl Quality Check Database element of an ** Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] qcdb [EnsPQcdatabase] Ensembl Quality Check Database ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetQcdatabase(EnsPQcsequence qcs, EnsPQcdatabase qcdb) { if(!qcs) return ajFalse; ensQcdatabaseDel(&qcs->Qcdatabase); qcs->Qcdatabase = ensQcdatabaseNewRef(qcdb); return ajTrue; } /* @func ensQcsequenceSetType ************************************************* ** ** Set the type element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [uN] type [AjPStr] Type ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetType(EnsPQcsequence qcs, AjPStr type) { if(!qcs) return ajFalse; ajStrDel(&qcs->Type); qcs->Type = ajStrNewRef(type); return ajTrue; } /* @func ensQcsequenceSetVersion ********************************************** ** ** Set the version element of an Ensembl Quality Check Sequence. ** ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] version [ajuint] Version ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceSetVersion(EnsPQcsequence qcs, ajuint version) { if(!qcs) return ajFalse; qcs->Version = version; return ajTrue; } /* @section debugging ********************************************************* ** ** Functions for reporting of an Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Trace Report Ensembl Quality Check Sequence elements to debug file ** ** @argrule Trace qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule Trace level [ajuint] Indentation level ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory misc ******************************************************************************/ /* @func ensQcsequenceTrace *************************************************** ** ** Trace an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] level [ajuint] Indentation level ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceTrace(const EnsPQcsequence qcs, ajuint level) { AjPStr indent = NULL; if(!qcs) return ajFalse; indent = ajStrNew(); ajStrAppendCountK(&indent, ' ', level * 2); ajDebug("%SensQcsequenceTrace %p\n" "%S Use %u\n" "%S Identifier %u\n" "%S Adaptor %p\n" "%S Qcdatabase %p\n" "%S Name '%S'\n" "%S Accession '%S'\n" "%S Version %u\n" "%S Type '%S'\n" "%S Length %u\n" "%S CdsStart %u\n" "%S CdsEnd %u\n" "%S CdsStrand %d\n" "%S Polya %u\n" "%S Description '%S'\n", indent, qcs, indent, qcs->Use, indent, qcs->Identifier, indent, qcs->Adaptor, indent, qcs->Qcdatabase, indent, qcs->Name, indent, qcs->Accession, indent, qcs->Version, indent, qcs->Type, indent, qcs->Length, indent, qcs->CdsStart, indent, qcs->CdsEnd, indent, qcs->CdsStrand, indent, qcs->Polya, indent, qcs->Description); ensQcdatabaseTrace(qcs->Qcdatabase, 1); ajStrDel(&indent); return ajTrue; } /* @section calculate ********************************************************* ** ** Functions for calculating values of an ** Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Calculate Calculate Ensembl Quality Check Sequence values ** @nam4rule Memsize Calculate the memory size in bytes ** ** @argrule Memsize qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule Memsize [size_t] Memory size in bytes or 0 ** ** @fcategory misc ******************************************************************************/ /* @func ensQcsequenceCalculateMemsize **************************************** ** ** Get the memory size in bytes of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [size_t] Memory size in bytes or 0 ** @@ ******************************************************************************/ size_t ensQcsequenceCalculateMemsize(const EnsPQcsequence qcs) { size_t size = 0; if(!qcs) return 0; size += sizeof (EnsOQcsequence); size += ensQcdatabaseCalculateMemsize(qcs->Qcdatabase); if(qcs->Name) { size += sizeof (AjOStr); size += ajStrGetRes(qcs->Name); } if(qcs->Accession) { size += sizeof (AjOStr); size += ajStrGetRes(qcs->Accession); } if(qcs->Type) { size += sizeof (AjOStr); size += ajStrGetRes(qcs->Type); } if(qcs->Description) { size += sizeof (AjOStr); size += ajStrGetRes(qcs->Description); } return size; } /* @section convenience functions ********************************************* ** ** Ensembl Quality Check Sequence convenience functions ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Get Get member(s) of associated objects ** @nam4rule Qcdatabase Get Ensembl Quality Check Database members ** @nam5rule Identifier Get the SQL database-internal identifier ** ** @argrule * qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule QcdatabaseIdentifier [ajuint] Ensembl Quality Check Database ** SQL database-internal identifier or 0 ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceGetQcdatabaseIdentifier ********************************* ** ** Get the Ensembl Quality Check Database SQL database-internal identifier ** of an Ensembl Quality Check Sequence. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [ajuint] Ensembl Quality Check Database SQL database-internal ** identifier or 0 ** @@ ******************************************************************************/ ajuint ensQcsequenceGetQcdatabaseIdentifier(const EnsPQcsequence qcs) { if(!qcs) return 0; return ensQcdatabaseGetIdentifier(qcs->Qcdatabase); } /* @section matching ********************************************************** ** ** Functions for matching Ensembl Quality Check Sequence objects ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Match Compare two Ensembl Quality Check Sequence objects ** ** @argrule * qcs1 [const EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule * qcs2 [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule * [AjBool] True on success ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceMatch *************************************************** ** ** Tests for matching two Ensembl Quality Check Sequences. ** ** @param [r] qcs1 [const EnsPQcsequence] First Ensembl Quality Check Sequence ** @param [r] qcs2 [const EnsPQcsequence] Second Ensembl Quality Check Sequence ** ** @return [AjBool] ajTrue if the Ensembl Quality Check Sequences are equal ** @@ ** The comparison is based on initial pointer equality and if that fails ** each element is compared. ******************************************************************************/ AjBool ensQcsequenceMatch(const EnsPQcsequence qcs1, const EnsPQcsequence qcs2) { if(!qcs1) return ajFalse; if(!qcs2) return ajFalse; if(qcs1 == qcs2) return ajTrue; if(qcs1->Identifier != qcs2->Identifier) return ajFalse; if((qcs1->Adaptor && qcs2->Adaptor) && (qcs1->Adaptor != qcs2->Adaptor)) return ajFalse; if(!ensQcdatabaseMatch(qcs1->Qcdatabase, qcs2->Qcdatabase)) return ajFalse; if(!ajStrMatchCaseS(qcs1->Name, qcs2->Name)) return ajFalse; if(!ajStrMatchCaseS(qcs1->Accession, qcs2->Accession)) return ajFalse; if(!ajStrMatchCaseS(qcs1->Description, qcs2->Description)) return ajFalse; if(!ajStrMatchCaseS(qcs1->Type, qcs2->Type)) return ajFalse; if(qcs1->Version != qcs2->Version) return ajFalse; if(qcs1->Length != qcs2->Length) return ajFalse; if(qcs1->CdsStart != qcs2->CdsStart) return ajFalse; if(qcs1->CdsEnd != qcs2->CdsEnd) return ajFalse; if(qcs1->CdsStrand != qcs2->CdsStrand) return ajFalse; if(qcs1->Polya != qcs2->Polya) return ajFalse; return ajTrue; } /* @section fetch ************************************************************* ** ** Functions for fetching values of an Ensembl Quality Check Sequence object. ** ** @fdata [EnsPQcsequence] ** ** @nam3rule Fetch Fetch Ensembl Quality Check Sequence values ** @nam4rule All Fetch all objects ** @nam4rule Anchor Fetch an HTML anchor ** @nam5rule External Fetch an HTML document-external anchor ** @nam5rule Internal Fetch an HTML document-internal anchor ** @nam4rule Url Fetch a Uniform Resource Locator (URL) ** @nam5rule External Fetch an external Uniform Resource Locator (URL) ** @nam5rule Internal Fetch an internal Uniform Resource Locator (URL) ** ** @argrule AnchorExternal qcs [const EnsPQcsequence] ** Ensembl Quality Check Sequence ** @argrule AnchorExternal htmlid [AjBool] Set the HTML id attribute in the ** anchor element ** @argrule AnchorInternal qcs [const EnsPQcsequence] ** Ensembl Quality Check Sequence ** @argrule Anchor Pstr [AjPStr*] Anchor string ** @argrule UrlExternal qcs [const EnsPQcsequence] ** Ensembl Quality Check Sequence ** @argrule UrlExternal Pstr [AjPStr*] URL string ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory misc ******************************************************************************/ /* @func ensQcsequenceFetchAnchorExternal ************************************* ** ** Fetch an external HTML anchor for an Ensembl Quality Check Sequence. ** ** Returns a complete HTML anchor element, which displays the sequence name ** and links it to the corresponding sequence entry in the external source ** database. Linking is dependent on template information in the ** 'sequence_db.external_url' field of the Ensembl Quality Check database. ** Although the sequence name is displayed, the link is based on ###NAME###, ** ###ACCESSION### or ###VERSION### placeholders in the template URL. If no ** template isavailable, just an anchor element the name set as 'id' attribute ** is returned. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @param [r] htmlid [AjBool] Set the HTML id attribute in the anchor element ** @param [w] Pstr [AjPStr*] Anchor string ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceFetchAnchorExternal(const EnsPQcsequence qcs, AjBool htmlid, AjPStr* Pstr) { AjPStr sgmlid = NULL; AjPStr exturl = NULL; AjPStr qcsname = NULL; AjPStr qcdname = NULL; if(!qcs) return ajFalse; if(!Pstr) return ajFalse; ensQcsequenceFetchUrlExternal(qcs, &exturl); if(exturl && ajStrGetLen(exturl)) { ajStrAppendC(Pstr, "Name); ensHtmlEncodeSgmlid(&sgmlid); ajFmtPrintAppS(Pstr, "id=\"%S\" ", sgmlid); ajStrDel(&sgmlid); } ensHtmlEncodeEntities(&exturl); qcdname = ajStrNewS(ensQcdatabaseGetName(qcs->Qcdatabase)); ensHtmlEncodeEntities(&qcdname); qcsname = ajStrNewS(qcs->Name); ensHtmlEncodeEntities(&qcsname); ajFmtPrintAppS(Pstr, "href=\"%S\" target=\"%S\">%S", exturl, qcdname, qcsname); ajStrDel(&qcdname); ajStrDel(&qcsname); } else { if(htmlid) { sgmlid = ajStrNewS(qcs->Name); ensHtmlEncodeSgmlid(&sgmlid); qcsname = ajStrNewS(qcs->Name); ensHtmlEncodeEntities(&qcsname); ajFmtPrintAppS(Pstr, "%S", sgmlid, qcsname); ajStrDel(&sgmlid); ajStrDel(&qcsname); } else ajStrAppendS(Pstr, qcs->Name); } ajStrDel(&exturl); return ajTrue; } /* @func ensQcsequenceFetchAnchorInternal ************************************* ** ** Fetch an internal HTML anchor for an Ensembl Quality Check Sequence. ** ** Returns a complete HTML anchor element, which displays the sequence name ** and links it to the corresponding document-internal anchor element. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @param [w] Pstr [AjPStr*] Anchor string ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceFetchAnchorInternal(const EnsPQcsequence qcs, AjPStr* Pstr) { AjPStr sgmlid = NULL; AjPStr name = NULL; if(!qcs) return ajFalse; if(!Pstr) return ajFalse; sgmlid = ajStrNewS(qcs->Name); ensHtmlEncodeSgmlid(&sgmlid); name = ajStrNewS(qcs->Name); ensHtmlEncodeEntities(&name); ajFmtPrintAppS(Pstr, "%S", sgmlid, name); ajStrDel(&sgmlid); ajStrDel(&name); return ajTrue; } /* @func ensQcsequenceFetchUrlExternal **************************************** ** ** Fetch an external URL for an Ensembl Quality Check Sequence. ** ** The caller is responsible for deleting the AJAX String. ** ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** @param [u] Pstr [AjPStr*] URL string ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceFetchUrlExternal(const EnsPQcsequence qcs, AjPStr* Pstr) { AjPStr exturl = NULL; AjPStr version = NULL; EnsPQcdatabase qcdb = NULL; if(!qcs) return ajFalse; if(!Pstr) return ajFalse; if(*Pstr) ajStrAssignClear(Pstr); else *Pstr = ajStrNew(); qcdb = ensQcsequenceGetQcdatabase(qcs); exturl = ensQcdatabaseGetUrlExternal(qcdb); if(exturl && ajStrGetLen(exturl)) { ajStrAssignS(Pstr, exturl); ajStrExchangeCS(Pstr, "###NAME###", qcs->Name); ajStrExchangeCS(Pstr, "###ACCESSION###", qcs->Accession); version = ajFmtStr("%d", qcs->Version); ajStrExchangeCS(Pstr, "###VERSION###", version); ajStrDel(&version); } return ajTrue; } /* @datasection [AjPStr] AJAX String ****************************************** ** ** @nam2rule Html Functions for manipulating AJAX String objects ** ******************************************************************************/ /* @section encode ************************************************************ ** ** Functions for manipulating AJAX String objects cconforming to HTML rules. ** ** @fdata [AjPStr] ** ** @nam3rule Encode Encode AJAX String objects conforming to HTML rules ** @nam4rule Entities Encode HTML character entities ** @nam4rule Sgmlid Encode HTML SGML identifiers ** ** @argrule ensHtmlEncodeEntities Pstr [AjPStr*] HTML string ** @argrule ensHtmlEncodeSgmlid Pstr [AjPStr*] HTML String ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory misc ******************************************************************************/ /* @func ensHtmlEncodeEntities ************************************************ ** ** Encode HTML character entities in an AJAX String. ** ** http://www.w3.org/TR/html401/charset.html#h-5.3.2 ** ** @param [u] Pstr [AjPStr*] HTML string ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ** NOTE: Since EMBOSS is limited to ASCII only '"', '&', '<', and '>' need ** replacing. ** FIXME: This function should move! ******************************************************************************/ AjBool ensHtmlEncodeEntities(AjPStr* Pstr) { if(!Pstr) return ajFalse; if(!*Pstr) return ajFalse; /* ** FIXME: The & character has to be the first character to replace. ** It would be better to check for the occurence of & or &...; more ** generally, before replacing. */ ajStrExchangeCC(Pstr, "&", "&"); ajStrExchangeCC(Pstr, "\"", """); ajStrExchangeCC(Pstr, "<", "<"); ajStrExchangeCC(Pstr, ">", ">"); return ajTrue; } /* @func ensHtmlEncodeSgmlid ************************************************** ** ** Fetch a valid HTML 4.01 identifier or name token from an AJAX String. ** The caller is responsible for deleting the AJAX String. ** ** The HTML 4.01 standard defines the content of id attributes as the SGML ** ID and NAME tokens, as defined in ** "Information Processing -- Text and Office Systems -- ** Standard Generalized Markup Language (SGML)", ISO 8879:1986. ** http://www.iso.ch/cate/d16387.html ** http://www.w3.org/TR/html401/struct/global.html#h-7.5.2 ** ** ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed ** by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), ** colons (":"), and periods ("."). ** http://www.w3.org/TR/html401/types.html#type-name ** ** @param [w] Pstr [AjPStr*] SGML identifier string ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ** FIXME: This function should move! ******************************************************************************/ AjBool ensHtmlEncodeSgmlid(AjPStr* Pstr) { const char* txtstr = NULL; if(!Pstr) return ajFalse; ajStrExchangeSetRestCK(Pstr, "-." "0123456789" ":" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "_" "abcdefghijklmnopqrstuvwxyz", '_'); txtstr = ajStrGetPtr(*Pstr); if(! ((*txtstr >= 'A' && *txtstr <= 'Z') || (*txtstr >= 'a' && *txtstr <= 'z'))) ajStrInsertC(Pstr, 0, "ID_"); return ajTrue; } /* @datasection [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor ** ** @nam2rule Qcsequenceadaptor Functions for manipulating ** Ensembl Quality Check Sequence Adaptor objects ** ** @cc Bio::EnsEMBL::QC::DBSQL::Sequenceadaptor ** @cc CVS Revision: ** @cc CVS Tag: ** ******************************************************************************/ /* @funcstatic qcsequenceadaptorFetchAllbyStatement *************************** ** ** Run a SQL statement against an Ensembl Database Adaptor and consolidate the ** results into an AJAX List of Ensembl Quality Check Sequence objects. ** ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor ** @param [r] statement [const AjPStr] SQL statement ** @param [uN] am [EnsPAssemblymapper] Ensembl Assembly Mapper ** @param [uN] slice [EnsPSlice] Ensembl Slice ** @param [u] qcss [AjPList] AJAX List of Ensembl Quality Check Sequences ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ static AjBool qcsequenceadaptorFetchAllbyStatement( EnsPDatabaseadaptor dba, const AjPStr statement, EnsPAssemblymapper am, EnsPSlice slice, AjPList qcss) { ajuint identifier = 0; ajuint databaseid = 0; ajuint version = 0; ajuint length = 0; ajuint cdsstart = 0; ajuint cdsend = 0; ajint cdsstrand = 0; ajuint polya = 0; AjPSqlstatement sqls = NULL; AjISqlrow sqli = NULL; AjPSqlrow sqlr = NULL; AjPStr name = NULL; AjPStr accession = NULL; AjPStr type = NULL; AjPStr description = NULL; EnsPQcsequence qcs = NULL; EnsPQcsequenceadaptor qcsa = NULL; EnsPQcdatabase qcdb = NULL; EnsPQcdatabaseadaptor qcdba = NULL; if(ajDebugTest("qcsequenceadaptorFetchAllbyStatement")) ajDebug("qcsequenceadaptorFetchAllbyStatement\n" " dba %p\n" " statement %p\n" " am %p\n" " slice %p\n" " qcss %p\n", dba, statement, am, slice, qcss); if(!dba) return ajFalse; if(!statement) return ajFalse; if(!qcss) return ajFalse; qcdba = ensRegistryGetQcdatabaseadaptor(dba); qcsa = ensRegistryGetQcsequenceadaptor(dba); sqls = ensDatabaseadaptorSqlstatementNew(dba, statement); sqli = ajSqlrowiterNew(sqls); while(!ajSqlrowiterDone(sqli)) { identifier = 0; databaseid = 0; name = ajStrNew(); accession = ajStrNew(); version = 0; type = ajStrNew(); length = 0; cdsstart = 0; cdsend = 0; cdsstrand = 0; polya = 0; description = ajStrNew(); sqlr = ajSqlrowiterGet(sqli); ajSqlcolumnToUint(sqlr, &identifier); ajSqlcolumnToUint(sqlr, &databaseid); ajSqlcolumnToStr(sqlr, &name); ajSqlcolumnToStr(sqlr, &accession); ajSqlcolumnToUint(sqlr, &version); ajSqlcolumnToStr(sqlr, &type); ajSqlcolumnToUint(sqlr, &length); ajSqlcolumnToUint(sqlr, &cdsstart); ajSqlcolumnToUint(sqlr, &cdsend); ajSqlcolumnToInt(sqlr, &cdsstrand); ajSqlcolumnToUint(sqlr, &polya); ajSqlcolumnToStr(sqlr, &description); ensQcdatabaseadaptorFetchByIdentifier(qcdba, databaseid, &qcdb); qcs = ensQcsequenceNewIni(qcsa, identifier, qcdb, name, accession, version, type, length, cdsstart, cdsend, cdsstrand, polya, description); ajListPushAppend(qcss, (void*) qcs); ensQcdatabaseDel(&qcdb); ajStrDel(&name); ajStrDel(&accession); ajStrDel(&type); ajStrDel(&description); } ajSqlrowiterDel(&sqli); ensDatabaseadaptorSqlstatementDel(dba, &sqls); return ajTrue; } /* @section constructors ****************************************************** ** ** All constructors return a new Ensembl Quality Check Sequence Adaptor by ** pointer. It is the responsibility of the user to first destroy any previous ** Quality Check Sequence Adaptor. The target pointer does not need to be ** initialised to NULL, but it is good programming practice to do so anyway. ** ** @fdata [EnsPQcsequenceadaptor] ** ** @nam3rule New Constructor ** ** @argrule New dba [EnsPDatabaseadaptor] Ensembl Database Adaptor ** ** @valrule * [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor ** ** @fcategory new ******************************************************************************/ /* @func ensQcsequenceadaptorNew ********************************************** ** ** Default constructor for an Ensembl Quality Check Sequence Adaptor. ** ** Ensembl Object Adaptors are singleton objects in the sense that a single ** instance of an Ensembl Object Adaptor connected to a particular database is ** sufficient to instantiate any number of Ensembl Objects from the database. ** Each Ensembl Object will have a weak reference to the Object Adaptor that ** instantiated it. Therefore, Ensembl Object Adaptors should not be ** instantiated directly, but rather obtained from the Ensembl Registry, ** which will in turn call this function if neccessary. ** ** @see ensRegistryGetDatabaseadaptor ** @see ensRegistryGetQcsequenceadaptor ** ** @param [u] dba [EnsPDatabaseadaptor] Ensembl Database Adaptor ** ** @return [EnsPQcsequenceadaptor] Ensembl Quality Check Sequence Adaptor ** or NULL ** @@ ******************************************************************************/ EnsPQcsequenceadaptor ensQcsequenceadaptorNew( EnsPDatabaseadaptor dba) { EnsPQcsequenceadaptor qcsa = NULL; if(!dba) return NULL; AJNEW0(qcsa); qcsa->Adaptor = ensBaseadaptorNew( dba, qcsequenceadaptorTables, qcsequenceadaptorColumns, (EnsPBaseadaptorLeftjoin) NULL, (const char*) NULL, (const char*) NULL, qcsequenceadaptorFetchAllbyStatement); return qcsa; } /* @section destructors ******************************************************* ** ** Destruction destroys all internal data structures and frees the ** memory allocated for an Ensembl Quality Check Sequence Adaptor object. ** ** @fdata [EnsPQcsequenceadaptor] ** ** @nam3rule Del Destroy (free) an Ensembl Quality Check Sequence Adaptor ** object ** ** @argrule * Pqcsa [EnsPQcsequenceadaptor*] ** Ensembl Quality Check Sequence Adaptor object address ** ** @valrule * [void] ** ** @fcategory delete ******************************************************************************/ /* @func ensQcsequenceadaptorDel ********************************************** ** ** Default destructor for an Ensembl Quality Check Sequence Adaptor. ** ** Ensembl Object Adaptors are singleton objects that are registered in the ** Ensembl Registry and weakly referenced by Ensembl Objects that have been ** instantiated by it. Therefore, Ensembl Object Adaptors should never be ** destroyed directly. Upon exit, the Ensembl Registry will call this function ** if required. ** ** @param [d] Pqcsa [EnsPQcsequenceadaptor*] ** Ensembl Quality Check Sequence Adaptor object address ** ** @return [void] ** @@ ******************************************************************************/ void ensQcsequenceadaptorDel(EnsPQcsequenceadaptor* Pqcsa) { EnsPQcsequenceadaptor pthis = NULL; if(!Pqcsa) return; if(!*Pqcsa) return; if(ajDebugTest("ensQcsequenceadaptorDel")) ajDebug("ensQcsequenceadaptorDel\n" " *Pqcsa %p\n", *Pqcsa); pthis = *Pqcsa; ensBaseadaptorDel(&pthis->Adaptor); AJFREE(pthis); *Pqcsa = NULL; return; } /* @section element retrieval ************************************************* ** ** Functions for returning elements of an ** Ensembl Quality Check Sequence Adaptor object. ** ** @fdata [EnsPQcsequenceadaptor] ** ** @nam3rule Get Return Ensembl Quality Check Sequence Adaptor attribute(s) ** @nam4rule Baseadaptor Return the Ensembl Base Adaptor ** @nam4rule Databaseadaptor Return the Ensembl Database Adaptor ** ** @argrule * qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** ** @valrule Baseadaptor [EnsPBaseadaptor] Ensembl Base Adaptor or NULL ** @valrule Databaseadaptor [EnsPDatabaseadaptor] Ensembl Database Adaptor ** or NULL ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceadaptorGetBaseadaptor *********************************** ** ** Get the Ensembl Base Adaptor element of an ** Ensembl Quality Check Sequence Adaptor. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** ** @return [EnsPBaseadaptor] Ensembl Base Adaptor or NULL ** @@ ******************************************************************************/ EnsPBaseadaptor ensQcsequenceadaptorGetBaseadaptor( EnsPQcsequenceadaptor qcsa) { if(!qcsa) return NULL; return qcsa->Adaptor; } /* @func ensQcsequenceadaptorGetDatabaseadaptor ******************************* ** ** Get the Ensembl Database Adaptor element of an ** Ensembl Quality Check Sequence Adaptor. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** ** @return [EnsPDatabaseadaptor] Ensembl Database Adaptor or NULL ** @@ ******************************************************************************/ EnsPDatabaseadaptor ensQcsequenceadaptorGetDatabaseadaptor( EnsPQcsequenceadaptor qcsa) { if(!qcsa) return NULL; return ensBaseadaptorGetDatabaseadaptor(qcsa->Adaptor); } /* @section object retrieval ************************************************** ** ** Functions for fetching Ensembl Quality Check Sequence objects from an ** Ensembl SQL database. ** ** @fdata [EnsPQcsequenceadaptor] ** ** @nam3rule Fetch Fetch Ensembl Quality Check Sequence object(s) ** @nam4rule All Fetch all Ensembl Quality Check Sequence objects ** @nam4rule Allby Fetch all Ensembl Quality Check Sequence objects ** matching a criterion ** @nam5rule Qcdatabase Fetch all by an Ensembl Quality Check Database ** @nam4rule By Fetch one Ensembl Quality Check Sequence object ** matching a criterion ** @nam5rule Accession Fetch by an accession number ** @nam5rule Identifier Fetch by an SQL database internal identifier ** @nam5rule Name Fetch by a name ** ** @argrule * qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @argrule AllbyQcdatabase qcdb [const EnsPQcdatabase] ** Ensembl Quality Check Database ** @argrule Allby qcss [AjPList] AJAX List of Ensembl Quality Check Sequence ** objects ** @argrule ByAccession qcdbid [ajuint] ** Ensembl Quality Check Database identifier ** @argrule ByAccession accession [const AjPStr] ** Ensembl Quality Check Sequence accession number ** @argrule ByName qcdbid [ajuint] Ensembl Quality Check Database identifier ** @argrule ByName name [const AjPStr] Ensembl Quality Check Sequence name ** @argrule ByAccession version [ajuint] Ensembl Quality Check Sequence version ** @argrule ByIdentifier identifier [ajuint] SQL database-internal identifier ** @argrule By Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceadaptorFetchAllbyQcdatabase ***************************** ** ** Fetch all Ensembl Quality Check Sequences via an ** Ensembl Quality Check Database. ** The caller is responsible for deleting the Ensembl Quality Check Sequences ** before deleting the AJAX List. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] qcdb [const EnsPQcdatabase] Ensembl Quality Check Database ** @param [u] qcss [AjPList] AJAX List of Ensembl Quality Check Sequences ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorFetchAllbyQcdatabase(EnsPQcsequenceadaptor qcsa, const EnsPQcdatabase qcdb, AjPList qcss) { AjPStr constraint = NULL; if(!qcsa) return ajFalse; if(!qcdb) return ajFalse; if(!qcss) return ajFalse; constraint = ajFmtStr("sequence.sequence_db_id = %u", ensQcdatabaseGetIdentifier(qcdb)); ensBaseadaptorFetchAllbyConstraint(qcsa->Adaptor, constraint, (EnsPAssemblymapper) NULL, (EnsPSlice) NULL, qcss); ajStrDel(&constraint); return ajTrue; } /* @func ensQcsequenceadaptorFetchByAccession ********************************* ** ** Fetch an Ensembl Quality Check Sequence by its accession number and ** sequence version. ** ** The caller is responsible for deleting the Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] qcdbid [ajuint] Ensembl Quality Check Database identifier ** @param [r] accession [const AjPStr] ** Ensembl Quality Check Sequence accession number ** @param [rN] version [ajuint] ** Ensembl Quality Check Sequence version ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorFetchByAccession(EnsPQcsequenceadaptor qcsa, ajuint qcdbid, const AjPStr accession, ajuint version, EnsPQcsequence* Pqcs) { char* txtaccession = NULL; AjPList qcss = NULL; AjPStr constraint = NULL; EnsPQcsequence qcs = NULL; if(!qcsa) return ajFalse; if(!accession) return ajFalse; if(!Pqcs) return ajFalse; ensBaseadaptorEscapeC(qcsa->Adaptor, &txtaccession, accession); constraint = ajFmtStr("sequence.sequence_db_id = %u " "AND " "sequence.accession = '%s'", qcdbid, txtaccession); ajCharDel(&txtaccession); if(version) ajFmtPrintAppS(&constraint, " AND sequence.version = %u", version); qcss = ajListNew(); ensBaseadaptorFetchAllbyConstraint(qcsa->Adaptor, constraint, (EnsPAssemblymapper) NULL, (EnsPSlice) NULL, qcss); if(ajListGetLength(qcss) > 1) ajWarn("ensQcsequenceadaptorFetchByAccession got more than " "one Ensembl Quality Check Sequence for accession '%S' " "and Quality Check Database identifier %u.\n", accession, qcdbid); ajListPop(qcss, (void**) Pqcs); /* ** TODO: To implement? ** qcsequenceadaptorCacheInsert(qcsa, Pqcs); */ while(ajListPop(qcss, (void**) &qcs)) { /* ** TODO: To implement? ** qcsequenceadaptorCacheInsert(qcsa, &qcs); */ ensQcsequenceDel(&qcs); } ajListFree(&qcss); ajStrDel(&constraint); return ajTrue; } /* @func ensQcsequenceadaptorFetchByIdentifier ******************************** ** ** Fetch an Ensembl Quality Check Sequence via its ** SQL database-internal identifier. ** ** The caller is responsible for deleting the Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] identifier [ajuint] ** SQL database-internal Ensembl Quality Check Sequence identifier ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorFetchByIdentifier(EnsPQcsequenceadaptor qcsa, ajuint identifier, EnsPQcsequence* Pqcs) { if(!qcsa) return ajFalse; if(!identifier) return ajFalse; if(!Pqcs) return ajFalse; return ensBaseadaptorFetchByIdentifier(qcsa->Adaptor, identifier, (void**) Pqcs); } /* @func ensQcsequenceadaptorFetchByName ************************************** ** ** Fetch an Ensembl Quality Check Sequence by its name. ** ** The caller is responsible for deleting the Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] qcdbid [ajuint] Ensembl Quality Check Database identifier ** @param [r] name [const AjPStr] Ensembl Quality Check Sequence name ** @param [wP] Pqcs [EnsPQcsequence*] Ensembl Quality Check Sequence address ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorFetchByName(EnsPQcsequenceadaptor qcsa, ajuint qcdbid, const AjPStr name, EnsPQcsequence* Pqcs) { char* txtname = NULL; AjPList qcss = NULL; AjPStr constraint = NULL; EnsPQcsequence qcs = NULL; if(!qcsa) return ajFalse; if(!name) return ajFalse; if(!Pqcs) return ajFalse; ensBaseadaptorEscapeC(qcsa->Adaptor, &txtname, name); constraint = ajFmtStr("sequence.sequence_db_id = %u " "AND " "sequence.name = '%s'", qcdbid, txtname); ajCharDel(&txtname); qcss = ajListNew(); ensBaseadaptorFetchAllbyConstraint(qcsa->Adaptor, constraint, (EnsPAssemblymapper) NULL, (EnsPSlice) NULL, qcss); if(ajListGetLength(qcss) > 1) ajWarn("ensQcsequenceadaptorFetchByName got more than " "one Ensembl Quality Check Sequence for (UNIQUE) name '%S' " "and Quality Check Database identifier %u.\n", name, qcdbid); ajListPop(qcss, (void**) Pqcs); /* ** TODO: To implement? ** qcsequenceadaptorCacheInsert(qcsa, Pqcs); */ while(ajListPop(qcss, (void**) &qcs)) { /* ** TODO: To implement? ** qcsequenceadaptorCacheInsert(qcsa, &qcs); */ ensQcsequenceDel(&qcs); } ajListFree(&qcss); ajStrDel(&constraint); return ajTrue; } /* @section object access ***************************************************** ** ** Functions for accessing Ensembl Quality Check Sequence objects in an ** Ensembl SQL database. ** ** @fdata [EnsPQcsequenceadaptor] ** ** @nam3rule Delete Delete Ensembl Quality Check Sequence object(s) ** @nam3rule Store Store Ensembl Quality Check Sequence object(s) ** @nam3rule Update Update Ensembl Quality Check Sequence object(s) ** ** @argrule * qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @argrule Delete qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule Store qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** @argrule Update qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @valrule * [AjBool] ajTrue upon success, ajFalse otherwise ** ** @fcategory use ******************************************************************************/ /* @func ensQcsequenceadaptorDelete ******************************************* ** ** Delete an Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorDelete(EnsPQcsequenceadaptor qcsa, EnsPQcsequence qcs) { AjBool result = AJFALSE; AjPSqlstatement sqls = NULL; AjPStr statement = NULL; EnsPDatabaseadaptor dba = NULL; if(!qcsa) return ajFalse; if(!qcs) return ajFalse; if(!ensQcsequenceGetIdentifier(qcs)) return ajFalse; dba = ensBaseadaptorGetDatabaseadaptor(qcsa->Adaptor); statement = ajFmtStr("DELETE FROM " "sequence " "WHERE " "sequence.sequence_id = %u", qcs->Identifier); sqls = ensDatabaseadaptorSqlstatementNew(dba, statement); if(ajSqlstatementGetAffectedrows(sqls)) { qcs->Adaptor = (EnsPQcsequenceadaptor) NULL; qcs->Identifier = 0; result = ajTrue; } ensDatabaseadaptorSqlstatementDel(dba, &sqls); ajStrDel(&statement); return result; } /* @func ensQcsequenceadaptorStore ******************************************** ** ** Store an Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [u] qcs [EnsPQcsequence] Ensembl Quality Check Seqeunce ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorStore(EnsPQcsequenceadaptor qcsa, EnsPQcsequence qcs) { char* txtname = NULL; char* txtaccession = NULL; char* txtdescription = NULL; char* txttype = NULL; AjBool result = AJFALSE; AjPSqlstatement sqls = NULL; AjPStr statement = NULL; EnsPDatabaseadaptor dba = NULL; if(!qcsa) return ajFalse; if(!qcs) return ajFalse; if(ensQcsequenceGetAdaptor(qcs) && ensQcsequenceGetIdentifier(qcs)) return ajFalse; dba = ensBaseadaptorGetDatabaseadaptor(qcsa->Adaptor); ensDatabaseadaptorEscapeC(dba, &txtname, qcs->Name); ensDatabaseadaptorEscapeC(dba, &txtaccession, qcs->Accession); ensDatabaseadaptorEscapeC(dba, &txtdescription, qcs->Description); ensDatabaseadaptorEscapeC(dba, &txttype, qcs->Type); statement = ajFmtStr("INSERT IGNORE INTO " "sequence " "SET " "sequence.sequence_db_id = %u, " "sequence.name = '%s', " "sequence.accession = '%s', " "sequence.version = %u, " "sequence.description = '%s' " "sequence.molecule_type = '%s', " "sequence.length = %u, " "sequence.cds_start = %u, " "sequence.cds_end = %u, " "sequence.cds_strand = %d, " "sequence.poly_a = %u", ensQcsequenceGetQcdatabaseIdentifier(qcs), txtname, txtaccession, qcs->Version, txtdescription, txttype, qcs->Length, qcs->CdsStart, qcs->CdsEnd, qcs->CdsStrand, qcs->Polya); ajCharDel(&txtname); ajCharDel(&txtaccession); ajCharDel(&txtdescription); ajCharDel(&txttype); sqls = ensDatabaseadaptorSqlstatementNew(dba, statement); if(ajSqlstatementGetAffectedrows(sqls)) { ensQcsequenceSetIdentifier(qcs, ajSqlstatementGetIdentifier(sqls)); ensQcsequenceSetAdaptor(qcs, qcsa); result = ajTrue; } ensDatabaseadaptorSqlstatementDel(dba, &sqls); ajStrDel(&statement); return result; } /* @func ensQcsequenceadaptorUpdate ******************************************* ** ** Update an Ensembl Quality Check Sequence. ** ** @param [u] qcsa [EnsPQcsequenceadaptor] ** Ensembl Quality Check Sequence Adaptor ** @param [r] qcs [const EnsPQcsequence] Ensembl Quality Check Sequence ** ** @return [AjBool] ajTrue upon success, ajFalse otherwise ** @@ ******************************************************************************/ AjBool ensQcsequenceadaptorUpdate(EnsPQcsequenceadaptor qcsa, const EnsPQcsequence qcs) { char* txtname = NULL; char* txtaccession = NULL; char* txtdescription = NULL; char* txttype = NULL; AjBool result = AJFALSE; AjPSqlstatement sqls = NULL; AjPStr statement = NULL; EnsPDatabaseadaptor dba = NULL; if(!qcsa) return ajFalse; if(!qcs) return ajFalse; if(!ensQcsequenceGetIdentifier(qcs)) return ajFalse; dba = ensBaseadaptorGetDatabaseadaptor(qcsa->Adaptor); ensDatabaseadaptorEscapeC(dba, &txtname, qcs->Name); ensDatabaseadaptorEscapeC(dba, &txtaccession, qcs->Accession); ensDatabaseadaptorEscapeC(dba, &txtdescription, qcs->Description); ensDatabaseadaptorEscapeC(dba, &txttype, qcs->Type); statement = ajFmtStr("UPDATE IGNORE " "sequence " "SET " "sequence.sequence_db_id = %u, " "sequence.name = '%s', " "sequence.accession = '%s', " "sequence.version = %u, " "sequence.description = '%s' " "sequence.molecule_type = '%s', " "sequence.length = %u, " "sequence.cds_start = %u, " "sequence.cds_end = %u, " "sequence.cds_strand = %d, " "sequence.poly_a = %u " "WHERE " "sequence.sequence_id = %u", ensQcsequenceGetQcdatabaseIdentifier(qcs), txtname, txtaccession, qcs->Version, txtdescription, txttype, qcs->Length, qcs->CdsStart, qcs->CdsEnd, qcs->CdsStrand, qcs->Polya, qcs->Identifier); ajCharDel(&txtname); ajCharDel(&txtaccession); ajCharDel(&txtdescription); ajCharDel(&txttype); sqls = ensDatabaseadaptorSqlstatementNew(dba, statement); if(ajSqlstatementGetAffectedrows(sqls)) result = ajTrue; ensDatabaseadaptorSqlstatementDel(dba, &sqls); ajStrDel(&statement); return result; }