/* @include ensdatabaseadaptor ************************************************
**
** Ensembl Database Adaptor functions
**
** @author Copyright (C) 1999 Ensembl Developers
** @author Copyright (C) 2006 Michael K. Schuster
** @version $Revision: 1.28 $
** @modified 2009 by Alan Bleasby for incorporation into EMBOSS core
** @modified $Date: 2012/08/05 10:37:32 $ by $Author: mks $
** @@
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either
** version 2.1 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
** Lesser General Public License for more details.
**
** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
** MA  02110-1301,  USA.
**
******************************************************************************/

#ifndef ENSDATABASEADAPTOR_H
#define ENSDATABASEADAPTOR_H

/* ========================================================================= */
/* ============================= include files ============================= */
/* ========================================================================= */

#include "ensdatabaseconnection.h"

AJ_BEGIN_DECLS




/* ========================================================================= */
/* =============================== constants =============================== */
/* ========================================================================= */

extern const char *ensKDatabaseadaptorRegCollection;
extern const char *ensKDatabaseadaptorRegMulti;
extern const char *ensKDatabaseadaptorRegSpecies;




/* @const EnsMDatabaseadaptorGroups *******************************************
**
** Number of Ensembl Database Adaptor groups
**
** The number of Ensembl Database Adaptor groups has to correlate with the
** EnsEDatabaseadaptorGroup enumeration list and the
** static const char *databaseadaptorGroup[] array. It is used by the
** ensregistry.[ch] module.
**
******************************************************************************/

#define EnsMDatabaseadaptorGroups 17




/* @enum EnsEDatabaseadaptorGroup *********************************************
**
** Ensembl Database Adaptor Group enumeration
**
** @value ensEDatabaseadaptorGroupNULL Null
** @value ensEDatabaseadaptorGroupCore Core
** @value ensEDatabaseadaptorGroupVega Vega
** @value ensEDatabaseadaptorGroupOtherFeatures Other features
** @value ensEDatabaseadaptorGroupCopyDNA DNA reference
** @value ensEDatabaseadaptorGroupGeneticVariation Genetic variation
** @value ensEDatabaseadaptorGroupFunctionalGenomics Functional genomics
** @value ensEDatabaseadaptorGroupComparativeGenomics Comparative genomics
** @value ensEDatabaseadaptorGroupOntology Ontology
** @value ensEDatabaseadaptorGroupQualityCheck Quality check
** @value ensEDatabaseadaptorGroupPipeline Pipleine
** @value ensEDatabaseadaptorGroupHive Hive
** @value ensEDatabaseadaptorGroupCoreExpressionEST Core expression EST
** @value ensEDatabaseadaptorGroupCoreExpressionGNF Core expression GNF
** @value ensEDatabaseadaptorGroupAncestral Ancestral
** @value ensEDatabaseadaptorGroupWebsite Webiste
** @value ensEDatabaseadaptorGroupProduction Production
** @@
******************************************************************************/

typedef enum EnsODatabaseadaptorGroup
{
    ensEDatabaseadaptorGroupNULL,
    ensEDatabaseadaptorGroupCore,
    ensEDatabaseadaptorGroupVega,
    ensEDatabaseadaptorGroupOtherFeatures,
    ensEDatabaseadaptorGroupCopyDNA,
    ensEDatabaseadaptorGroupGeneticVariation,
    ensEDatabaseadaptorGroupFunctionalGenomics,
    ensEDatabaseadaptorGroupComparativeGenomics,
    ensEDatabaseadaptorGroupOntology,
    ensEDatabaseadaptorGroupQualityCheck,
    ensEDatabaseadaptorGroupPipeline,
    ensEDatabaseadaptorGroupHive,
    ensEDatabaseadaptorGroupCoreExpressionEST,
    ensEDatabaseadaptorGroupCoreExpressionGNF,
    ensEDatabaseadaptorGroupAncestral,
    ensEDatabaseadaptorGroupWebsite,
    ensEDatabaseadaptorGroupProduction
} EnsEDatabaseadaptorGroup;




/* ========================================================================= */
/* ============================== public data ============================== */
/* ========================================================================= */

/* @data EnsPDatabaseadaptor **************************************************
**
** Ensembl Database Adaptor.
**
** Holds the Ensembl Database Group, the species name and the Ensembl
** Database Connection object connected to this SQL database.
**
** @alias EnsSDatabaseadaptor
** @alias EnsODatabaseadaptor
**
** @alias EnsPAttributeadaptor
** @alias EnsPDatabaseentryadaptor
** @alias EnsPGvgenotypeadaptor
** @alias EnsPGvsynonymadaptor
** @alias EnsPMarkermaplocationadaptor
** @alias EnsPMarkersynonymadaptor
** @alias EnsPSupportingfeatureadaptor
**
** @attr Databaseconnection [EnsPDatabaseconnection]
** Ensembl Database Connection
** @attr Species [AjPStr] Species
** @attr SpeciesNames [AjPList]
** AJAX List of AJAX String (species name) objects
** @attr Group [EnsEDatabaseadaptorGroup]
** Ensembl Database Adaptor Group enumeration
** @attr Multispecies [AjBool] Multi-species database
** @attr Identifier [ajuint] Species identifier, defaults to 1U
** @attr Padding [ajuint] Padding to alignment boundary
** @@
******************************************************************************/

typedef struct EnsSDatabaseadaptor
{
    EnsPDatabaseconnection Databaseconnection;
    AjPStr Species;
    AjPList SpeciesNames;
    EnsEDatabaseadaptorGroup Group;
    AjBool Multispecies;
    ajuint Identifier;
    ajuint Padding;
} EnsODatabaseadaptor;

#define EnsPDatabaseadaptor EnsODatabaseadaptor*




/* ========================================================================= */
/* =========================== public functions ============================ */
/* ========================================================================= */

/*
** Prototype definitions
*/

/* Ensembl Database Adaptor */

EnsPDatabaseadaptor ensRegistryGetDatabaseadaptor(
    EnsEDatabaseadaptorGroup dbag,
    AjPStr alias);

EnsPDatabaseadaptor ensRegistryGetReferenceadaptor(EnsPDatabaseadaptor dba);

EnsPDatabaseadaptor ensDatabaseadaptorNewDatabasename(
    EnsPDatabaseconnection dbc,
    AjPStr database);

EnsPDatabaseadaptor ensDatabaseadaptorNewIni(EnsPDatabaseconnection dbc,
                                             AjPStr database,
                                             AjPStr species,
                                             EnsEDatabaseadaptorGroup dbag,
                                             AjBool multi,
                                             ajuint identifier);

EnsPDatabaseadaptor ensDatabaseadaptorNewUrl(const AjPStr url);

void ensDatabaseadaptorDel(EnsPDatabaseadaptor *Pdba);

EnsPDatabaseconnection ensDatabaseadaptorGetDatabaseconnection(
    const EnsPDatabaseadaptor dba);

EnsEDatabaseadaptorGroup ensDatabaseadaptorGetGroup(
    const EnsPDatabaseadaptor dba);

ajuint ensDatabaseadaptorGetIdentifier(
    const EnsPDatabaseadaptor dba);

AjBool ensDatabaseadaptorGetMultispecies(
    const EnsPDatabaseadaptor dba);

AjPStr ensDatabaseadaptorGetSpecies(
    const EnsPDatabaseadaptor dba);

const AjPList ensDatabaseadaptorLoadSpeciesnames(EnsPDatabaseadaptor dba);

AjBool ensDatabaseadaptorSetDatabaseconnection(EnsPDatabaseadaptor dba,
                                               EnsPDatabaseconnection dbc);

AjBool ensDatabaseadaptorSetGroup(EnsPDatabaseadaptor dba,
                                  EnsEDatabaseadaptorGroup dbag);

AjBool ensDatabaseadaptorSetIdentifier(EnsPDatabaseadaptor dba,
                                       ajuint identifier);

AjBool ensDatabaseadaptorSetMultispecies(EnsPDatabaseadaptor dba,
                                         AjBool multi);

AjBool ensDatabaseadaptorSetSpecies(EnsPDatabaseadaptor dba, AjPStr species);

AjBool ensDatabaseadaptorTrace(const EnsPDatabaseadaptor dba, ajuint level);

AjBool ensDatabaseadaptorMatch(const EnsPDatabaseadaptor dba1,
                               const EnsPDatabaseadaptor dba2);

AjBool ensDatabaseadaptorMatchcomponents(const EnsPDatabaseadaptor dba,
                                         const EnsPDatabaseconnection dbc,
                                         const AjPStr species,
                                         EnsEDatabaseadaptorGroup dbag,
                                         AjBool multi,
                                         ajuint identifier);

AjBool ensDatabaseadaptorDisconnect(EnsPDatabaseadaptor dba);

AjBool ensDatabaseadaptorEscapeC(EnsPDatabaseadaptor dba,
                                 char **Ptxt,
                                 const AjPStr str);

AjBool ensDatabaseadaptorEscapeS(EnsPDatabaseadaptor dba,
                                 AjPStr *Pstr,
                                 const AjPStr str);

AjBool ensDatabaseadaptorSqlstatementDel(EnsPDatabaseadaptor dba,
                                         AjPSqlstatement *Psqls);

AjPSqlstatement ensDatabaseadaptorSqlstatementNew(EnsPDatabaseadaptor dba,
                                                  const AjPStr statement);

AjBool ensDatabaseadaptorFetchSchemabuild(EnsPDatabaseadaptor dba,
                                          AjPStr *Pbuild);

EnsEDatabaseadaptorGroup ensDatabaseadaptorGroupFromStr(const AjPStr group);

const char *ensDatabaseadaptorGroupToChar(EnsEDatabaseadaptorGroup dbag);

/*
** End of prototype definitions
*/




AJ_END_DECLS

#endif /* !ENSDATABASEADAPTOR_H */
