1 | # Nom fichier : ConnexionODBC (classe) |
---|
2 | # Auteur : Cedric Briand |
---|
3 | |
---|
4 | #********************************************************************** |
---|
5 | |
---|
6 | #fonction pour valider les acces ODBC |
---|
7 | validite_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 |
---|
34 | setClass(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) |
---|
47 | setMethod("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} |
---|
81 | killfactor=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 | } |
---|