.packageName <- "PFAM"
PFAM <- function() cat(PFAMQC)
.no_S3_generics = TRUE
ns <- asNamespace("PFAM")
PFAMLOCUSIDfunc <- function() {
	PFAMLOCUSID <- function(){
		.Deprecated("PFAMENTREZID")
	}
	PFAMLOCUSID()
	PFAMENTREZID
}
makeActiveBinding("PFAMLOCUSID", PFAMLOCUSIDfunc, ns)

pfamAC2CAZY <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="CAZY", TABLE="CAZY", FOR=ac)
}
pfamAC2DE <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="DE", TABLE="basicInfo", FOR=ac)
}
pfamAC2HOMSTRAD <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="HOMSTRAD", TABLE="HOMSTRAD", FOR=ac)
}
pfamAC2ID <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="ID", TABLE="basicInfo", FOR=ac)
}
pfamAC2INTERPRO <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="INTERPRO", TABLE="INTERPRO", FOR=ac)
}
pfamAC2LOAD <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="LOAD", TABLE="LOAD", FOR=ac)
}
pfamAC2MEROPS <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="MEROPS", TABLE="MEROPS", FOR=ac)
}
pfamAC2MIM <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="MIM", TABLE="MIM", FOR=ac)
}
pfamAC2PFAMB <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="PFAMB", TABLE="PFAMB", FOR=ac)
}
pfamAC2PRINTS <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="PRINTS", TABLE="PRINTS", FOR=ac)
}
pfamAC2PROSITE <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="PROSITE", TABLE="PROSITE", FOR=ac)
}
pfamAC2PROSITEPROFILE <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="PROSITE_PROFILE", TABLE="PROSITE_PROFILE", FOR=ac)
}
pfamAC2RM <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="RM", TABLE="RM", FOR=ac)
}
pfamAC2SMART <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="SMART", TABLE="SMART", FOR=ac)
}
pfamAC2TC <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="TC", TABLE="TC", FOR=ac)
}
pfamAC2TP <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="TP", TABLE="basicInfo", FOR=ac)
}
pfamAC2URL <- function(ac=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="AC", TO="URL", TABLE="URL", FOR=ac)
}
pfamCAZY2AC <- function(cazy=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="CAZY", TO="AC", TABLE="CAZY", FOR=cazy)
}
pfam_globals <- new.env()

getPfamDb  <- function(){
    dbCon <- try(get("dbCon", pfam_globals))
    if(inherits(dbCon, "try-error") || is.null(dbCon)){
        SQLiteDriver <- dbDriver("SQLite")
        pfamSQLiteDbmsName <- system.file("data", "pfam.sqlite", package="PFAM")
        pfam_globals$dbCon <- dbConnect(SQLiteDriver, dbname=pfamSQLiteDbmsName)
        return(pfam_globals$dbCon)
    }else{
        return(dbCon)
    }
}

closePfamDb <- function(){
    dbDisconnect(pfam_globals$dbCon)
    pfam_globals$dbCon <- NULL
}

setPfamDb <- function(con){
    pfamCon <- try(get("dbCon", pfam_globals))
    if(!inherits(pfamCon, "try-error")){
        closePfamDb()
    }
    pfam_globals$dbCon <- con
}

getPfam <- function(pfamCon, FROM, TO, TABLE, FOR){
    if(length(FROM)!=1){
        stop("Argument \"FROM\" must be of length 1.")
    }

    TO2 <- paste(TO, sep="", collapse=", ")

    if(sum(duplicated(FOR))!=0){
        warning("Argument \"FOR\" is not unique!")
        FOR <- unique(FOR)
    }
    
    if(is.null(FOR)){
        query <- paste("select ", FROM, ", ", TO2, " from ", TABLE, ";", sep="")
    }else{
        FOR <- paste("\"", FOR, "\"", sep="", collapse=", ")
        query <- paste("select ", FROM, ", ", TO2, " from ", TABLE, " where ", FROM, " in (", FOR, ");", sep="")
    }
    tmpResult <- dbGetQuery(pfamCon, query)
    tmpResult[, FROM][is.na(tmpResult[, FROM])] <- "NA"
    result <- split(tmpResult[, TO], tmpResult[, FROM])
    if(length(TO)>1){
        result <- lapply(result, as.list)
    }
    return(result)
}
pfamDE2AC <- function(de=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="DE", TO="AC", TABLE="basicInfo", FOR=de)
}
pfamHOMSTRAD2AC <- function(homstrad=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="HOMSTRAD", TO="AC", TABLE="HOMSTRAD", FOR=homstrad)
}
pfamID2AC <- function(id=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="ID", TO="AC", TABLE="basicInfo", FOR=id)
}
pfamINTERPRO2AC <- function(interpro=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="INTERPRO", TO="AC", TABLE="INTERPRO", FOR=interpro)
}
pfamLOAD2AC <- function(load=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="LOAD", TO="AC", TABLE="LOAD", FOR=load)
}
pfamMEROPS2AC <- function(merops=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="MEROPS", TO="AC", TABLE="MEROPS", FOR=merops)
}
pfamMIM2AC <- function(mim=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="MIM", TO="AC", TABLE="MIM", FOR=mim)
}
pfamPFAMB2AC <- function(pfamb=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="PFAMB", TO="AC", TABLE="PFAMB", FOR=pfamb)
}
pfamPRINTS2AC <- function(prints=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="PRINTS", TO="AC", TABLE="PRINTS", FOR=prints)
}
pfamPROSITE2AC <- function(prosite=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="PROSITE", TO="AC", TABLE="PROSITE", FOR=prosite)
}
pfamPROSITEPROFILE2AC <- function(prositeprofile=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="PROSITE_PROFILE", TO="AC", TABLE="PROSITE_PROFILE", FOR=prositeprofile)
}
pfamRM2AC <- function(rm=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="RM", TO="AC", TABLE="RM", FOR=rm)
}
pfamSMART2AC <- function(smart=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="SMART", TO="AC", TABLE="SMART", FOR=smart)
}
pfamAC2SCOP <- function(ac=NULL){
    getPfam(pfamCon=getPfamDb(), FROM="AC", TO=c("SCOP", "PLACEMENT"), TABLE="SCOP", FOR=ac)
}
pfamSCOP2AC <- function(scop=NULL){
    getPfam(pfamCon=getPfamDb(), FROM="SCOP", TO="AC", TABLE="SCOP", FOR=scop)
}

pfamAC2PDB <- function(ac=NULL){
    getPfam(pfamCon=getPfamDb(), FROM="AC", TO=c("PDB", "startPoint", "endPoint"), TABLE="PDB", FOR=ac)
}
pfamPDB2AC <- function(pdb=NULL){
    getPfam(pfamCon=getPfamDb(), FROM="PDB", TO="AC", TABLE="PDB", FOR=pdb)
}
pfamTC2AC <- function(tc=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="TC", TO="AC", TABLE="TC", FOR=tc)
}
pfamTP2AC <- function(tp=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="TP", TO="AC", TABLE="basicInfo", FOR=tp)
}
pfamURL2AC <- function(url=NULL){
	getPfam(pfamCon=getPfamDb(), FROM="URL", TO="AC", TABLE="URL", FOR=url)
}
.onLoad <- function(libname, pkgname){
    options(show.error.messages=FALSE)
    getPfamDb()
    options(show.error.messages=TRUE)    
}

.onUnload <- function(libpath){
    closePfamDb()
}
