Cookbook ODBC: ConnexionODBC.r

File ConnexionODBC.r, 3.1 KB (added by cedric, 15 years ago)

Simple connection without closing the ODBC, mother class

Line 
1# Nom fichier :        ConnexionODBC (classe)
2# Auteur :             Cedric Briand
3
4#**********************************************************************
5
6#fonction pour valider les acces ODBC
7validite_ODBC=function(object)
8{
9        rep1= class(object@baseODBC[1])=="Character"
10        rep2=class(object@baseODBC[2])=="Character"
11        rep3=class(object@baseODBC[3])=="ANY"
12        rep4=length(object@baseODBC)==3
13        return(ifelse(rep1 & rep2 & rep3 & rep4,TRUE,c(1:4)[!c(rep1, rep2, rep3, rep4)]))
14}
15
16#' @title ConnexionODBC class
17#' @note Mother class for connection, opens the connection but does not shut it
18#' @author Cedric Briand \email{cedric.briand@@lavilaine.com}
19#' @slot baseODBC="vector" (of length 3, character)
20#' @slot silent="logical"
21#' @slot etat="ANY" # can be -1 or string
22#' @slot connexion="ANY" # could be both string or S3
23#' @slot sql="character"
24#' @slot query="data.frame"
25#' @return connexionODBC an S4 object of class connexionODBC
26#' @example
27#' objet=new("ConnexionODBC")
28#' objet@baseODBC=baseODBC"
29#' objet@silent=FALSE
30#' objet<-connect(objet)
31#' # odbcCloseAll()
32#' odbcClose(objet@connexion)
33#' @exportClass
34setClass(Class="ConnexionODBC",
35                representation= representation(baseODBC="vector",silent="logical",etat="ANY",connexion="ANY"),
36                prototype = list(silent=TRUE),
37                validity=validite_ODBC)
38
39
40#' connect method for ConnexionODBC class
41#' @returnType ConnectionODBC S4 object
42#' @return a connexion with slot filled
43#' @author Cedric Briand \email{cedric.briand@@lavilaine.com}
44#' @example objet=new("ConnexionODBC")
45#' objet@baseODBC=baseODBC
46#' connect(objet)
47setMethod("connect",signature=signature("ConnexionODBC"),definition=function(objet) {     
48                      if (length(objet@baseODBC)!=3)  {
49       if (exists("baseODBC",envir=.GlobalEnv)){ 
50        objet@baseODBC<-get("baseODBC",envir=.GlobalEnv) 
51        } else {
52          stop("Il faut definir un vecteur baseODBC avec le lien ODBC, l'utilistateur et le mot de passe")
53        }
54      }
55      e=expression(channel <-odbcConnect(objet@baseODBC[1],
56                                                        uid = objet@baseODBC[2],
57                                                        pwd = objet@baseODBC[3],
58                                                        case = "tolower",
59                                                        believeNRows = FALSE))
60                        if (!exists("odbcConnect")) stop("La librairie RODBC est necessaire, chargez le package ! \n")
61                        if (!objet@silent) print(paste("Essai de connexion :",objet@baseODBC[1]))
62                        # renvoit du resultat d'un try catch expression dans
63                        #l'ojet Connexion courante, soit un vecteur caractere
64                        connexionCourante<-tryCatch(eval(e), error=paste("Connexion impossible :",objet@baseODBC[1])) 
65                        if (class(connexionCourante)=="RODBC") {
66                                if (!objet@silent) print("Connexion établie")
67                                objet@connexion=connexionCourante  # un objet S3 RODBC
68                                objet@etat="Connexion en cours"
69                        } else {
70                                print(connexionCourante)
71                                objet@etat=connexionCourante # report de l'erreur
72                        }
73                        return(objet)
74                })
75
76#' utility function allowing to remove factors from ODBC queries
77#' @param df
78#' @returnType df
79#' @return df
80#' @author Cedric Briand \email{cedric.briand@@lavilaine.com}
81killfactor=function(df){
82        for (i in 1:ncol(df))
83        {
84                if(is.factor(df[,i])) df[,i]=as.character(df[,i])
85        }
86        return(df)
87}