-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDatasourceMgr.cfc
152 lines (118 loc) · 4.6 KB
/
DatasourceMgr.cfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<cfcomponent displayname="Datasource Manager" output="no">
<cffunction name="init" access="public" returntype="any" output="no" hint="I instantiate and return this component.">
<cfargument name="DataMgr" type="any" required="no">
<cfargument name="Factory" type="any" required="no">
<cfset variables.DataMgr = arguments.DataMgr>
<cfif StructKeyExists(arguments,"Factory")>
<cfset variables.Factory = arguments.Factory>
</cfif>
<cfreturn this>
</cffunction>
<cffunction name="getDatabase" access="public" returntype="string" output="no" hint="I get the database engine of the given datasource.">
<cfargument name="datasource" type="string" required="yes">
<cfset var qDatasources = getDatasources()>
<cfset var result = "">
<cfquery name="qDatasources" dbtype="query">
SELECT name,type
FROM qDatasources
WHERE name = '#arguments.datasource#'
</cfquery>
<cfif qDatasources.RecordCount eq 1>
<cfset result = qDatasources.type>
</cfif>
<cfreturn result>
</cffunction>
<cffunction name="getDatabases" access="public" returntype="query" output="no" hint="I get the available databases.">
<cfset var qDatabases = 0>
<cfif StructKeyExists(variables,"databases")>
<cfset qDatabases = variables.databases>
<cfelse>
<cfset qDatabases = variables.DataMgr.getSupportedDatabases()>
<cfset variables.databases = qDatabases>
</cfif>
<cfreturn qDatabases>
</cffunction>
<cffunction name="getDatasources" access="public" returntype="query" output="no" hint="I get the available datasources.">
<cfset var qDatasources = QueryNew("name,type,nameu")>
<cfif StructKeyExists(variables,"Factory")>
<cfset qDatasources = getDatasources_7()>
<cfelse>
<!--- Do a try/catch in case the undocumented service factory isn't available (resulting in no databasources in query) --->
<cftry>
<cfset qDatasources = getDatasources_6()>
<cfcatch>
</cfcatch>
</cftry>
</cfif>
<cfreturn qDatasources>
</cffunction>
<cffunction name="getDatasources_6" access="public" returntype="query" output="no" hint="I get the available datasources on CFMX prior to CFMX7.">
<cfset var dsService = CreateObject("java", "coldfusion.server.ServiceFactory").DataSourceService>
<cfset var qDataMgrDatabases = variables.DataMgr.getSupportedDatabases()>
<cfset var sDatasources = dsService.getDatasources()>
<cfset var qDatasources = QueryNew("name,uname")>
<cfset var name = "">
<cfloop collection="#sDatasources#" item="name">
<cfloop query="qDataMgrDatabases">
<cfif sDatasources[name].Driver CONTAINS Driver>
<cfset QueryAddRow(qDatasources)>
<cfset QuerySetCell(qDatasources,"name",name)>
<cfset QuerySetCell(qDatasources,"uname",UCase(name))>
<cfbreak>
</cfif>
</cfloop>
</cfloop>
<cfquery name="qDatasources" dbtype="query">
SELECT name
FROM qDatasources
ORDER BY uname
</cfquery>
<cfreturn qDatasources>
</cffunction>
<cffunction name="getDatasources_7" access="private" returntype="query" output="no" hint="I get the available datasources on CFMX7 (and above).">
<cfset var qDatasources = QueryNew("name,driver,type,nameu")>
<cfset var Datasources = variables.Factory.DataSourceService.getDatasources()>
<cfset var dsn = "">
<cfset var driver = "">
<cfset var type = "">
<cfloop collection="#Datasources#" item="dsn">
<cfset driver = Datasources[dsn].Driver>
<cfset type = getDriverDatabase(driver)>
<cfif Len(type)>
<cfset QueryAddRow(qDatasources)>
<cfset QuerySetCell(qDatasources,"name",dsn)>
<cfset QuerySetCell(qDatasources,"driver",driver)>
<cfset QuerySetCell(qDatasources,"type",type)>
<cfset QuerySetCell(qDatasources,"nameu",UCase(dsn))>
</cfif>
</cfloop>
<cfquery name="qDatasources" dbtype="query">
SELECT name
FROM qDatasources
ORDER BY nameu
</cfquery>
<cfreturn qDatasources>
</cffunction>
<cffunction name="getDriverDatabase" access="private" returntype="string" output="no" hint="I get the database engine from the driver.">
<cfargument name="driver" type="string" required="yes">
<cfset var qDatabases = getDatabases()>
<cfset var result = "">
<cfloop query="qDatabases">
<cfif arguments.driver CONTAINS ShortString>
<cfset result = Database>
</cfif>
</cfloop>
<cfreturn result>
</cffunction>
<cffunction name="getJdbcUrlDatabase" access="private" returntype="string" output="no" hint="I get the database engine from the JDBC URL.">
<cfargument name="JdbcUrl" type="string" required="yes">
<cfset var qDatabases = getDatabases()>
<cfset var result = "">
<cfloop query="qDatabases">
<cfif arguments.driver CONTAINS ShortString>
<cfset result = Database>
</cfif>
</cfloop>
<cfreturn result>
</cffunction>
</cfcomponent>