sakai-info 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +12 -6
- data/README.md +50 -78
- data/ROADMAP.md +19 -17
- data/bin/sakai-info +94 -43
- data/lib/sakai-info.rb +32 -5
- data/lib/sakai-info/announcement.rb +30 -34
- data/lib/sakai-info/assignment.rb +45 -80
- data/lib/sakai-info/authz.rb +77 -94
- data/lib/sakai-info/cli.rb +1 -23
- data/lib/sakai-info/cli/help.rb +45 -35
- data/lib/sakai-info/content.rb +28 -49
- data/lib/sakai-info/database.rb +114 -0
- data/lib/sakai-info/gradebook.rb +48 -50
- data/lib/sakai-info/group.rb +21 -32
- data/lib/sakai-info/message.rb +16 -25
- data/lib/sakai-info/sakai_object.rb +11 -4
- data/lib/sakai-info/samigo.rb +38 -61
- data/lib/sakai-info/site.rb +128 -186
- data/lib/sakai-info/user.rb +77 -68
- data/lib/sakai-info/version.rb +1 -1
- metadata +36 -11
- data/lib/sakai-info/configuration.rb +0 -288
- data/lib/sakai-info/db.rb +0 -19
- data/lib/sakai-info/instance.rb +0 -122
data/lib/sakai-info/user.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# SakaiInfo::User library
|
3
3
|
#
|
4
4
|
# Created 2012-02-17 daveadams@gmail.com
|
5
|
-
# Last updated 2012-02-
|
5
|
+
# Last updated 2012-02-24 daveadams@gmail.com
|
6
6
|
#
|
7
7
|
# https://github.com/daveadams/sakai-info
|
8
8
|
#
|
@@ -17,31 +17,50 @@ module SakaiInfo
|
|
17
17
|
@@cache = {}
|
18
18
|
def self.find(id)
|
19
19
|
if @@cache[id].nil?
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
user_id = row[0]
|
24
|
-
eid = row[1]
|
25
|
-
end
|
26
|
-
if user_id.nil? or eid.nil?
|
20
|
+
eid = User.get_eid(id)
|
21
|
+
user_id = User.get_user_id(id)
|
22
|
+
if eid.nil? or user_id.nil?
|
27
23
|
raise ObjectNotFoundException.new(User, id)
|
28
24
|
end
|
29
25
|
|
30
|
-
DB.connect.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
last_name ||= ""
|
37
|
-
@@cache[eid] =
|
38
|
-
@@cache[user_id] =
|
39
|
-
User.new(user_id, eid, (first_name+' '+last_name), type, created_at, modified_at)
|
26
|
+
row = DB.connect.fetch("select first_name, last_name, type, " +
|
27
|
+
"to_char(createdon,'YYYY-MM-DD HH24:MI:SS') as created_at, " +
|
28
|
+
"to_char(modifiedon,'YYYY-MM-DD HH24:MI:SS') as modified_at " +
|
29
|
+
"from sakai_user where user_id=?", user_id).first
|
30
|
+
if row.nil?
|
31
|
+
raise ObjectNotFoundException.new(User, id)
|
40
32
|
end
|
33
|
+
@@cache[eid] =
|
34
|
+
@@cache[user_id] =
|
35
|
+
User.new(user_id, eid,
|
36
|
+
((row[:first_name] || "") + " " + (row[:last_name] || "")).strip,
|
37
|
+
row[:type], row[:created_at], row[:modified_at])
|
41
38
|
end
|
42
39
|
@@cache[id]
|
43
40
|
end
|
44
41
|
|
42
|
+
@@id_cache = {}
|
43
|
+
def self.get_ids(id)
|
44
|
+
@@id_cache[id] ||=
|
45
|
+
DB.connect[:sakai_user_id_map].where({:user_id => id, :eid => id}.sql_or).first
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_eid(id)
|
49
|
+
if ids = User.get_ids(id)
|
50
|
+
ids[:eid]
|
51
|
+
else
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.get_user_id(id)
|
57
|
+
if ids = User.get_ids(id)
|
58
|
+
ids[:user_id]
|
59
|
+
else
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
45
64
|
def initialize(id, eid, name, type, created_at, modified_at)
|
46
65
|
@id = id
|
47
66
|
@eid = eid
|
@@ -102,56 +121,46 @@ module SakaiInfo
|
|
102
121
|
|
103
122
|
def preferences_xml
|
104
123
|
if @preferences_xml.nil?
|
105
|
-
db = DB.connect
|
106
124
|
@preferences_xml = ""
|
107
|
-
|
108
|
-
|
109
|
-
REXML::Document.new(row[
|
125
|
+
row = DB.connect[:sakai_preferences].filter(:preferences_id => @user_id).first
|
126
|
+
if not row.nil?
|
127
|
+
REXML::Document.new(row[:xml].read).write(@preferences_xml, 2)
|
110
128
|
end
|
111
129
|
end
|
112
130
|
@preferences_xml
|
113
131
|
end
|
114
132
|
|
115
133
|
# finders/counters
|
116
|
-
@@total_user_count = nil
|
117
134
|
def self.count
|
118
|
-
|
119
|
-
@@total_user_count = 0
|
120
|
-
DB.connect.exec("select count(*) from sakai_user") do |row|
|
121
|
-
@@total_user_count = row[0].to_i
|
122
|
-
end
|
123
|
-
end
|
124
|
-
@@total_user_count
|
135
|
+
DB.connect[:sakai_user].count
|
125
136
|
end
|
126
137
|
|
127
138
|
def self.count_by_realm_id_and_role_id(realm_id, role_id)
|
128
|
-
|
129
|
-
|
130
|
-
"where realm_key = :realm_id " +
|
131
|
-
"and role_key = :role_id", realm_id, role_id) do |row|
|
132
|
-
count = row[0].to_i
|
133
|
-
end
|
134
|
-
count
|
139
|
+
DB.connect[:sakai_realm_rl_gr].
|
140
|
+
filter(:realm_key => realm_id, :role_key => role_id).count
|
135
141
|
end
|
136
142
|
|
137
143
|
def self.find_by_realm_id_and_role_id(realm_id, role_id)
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
users
|
144
|
+
# TODO: implement this correctly
|
145
|
+
# (code below isn't going to work)
|
146
|
+
# users = []
|
147
|
+
# DB.connect.fetch("select first_name, last_name, type, " +
|
148
|
+
# "to_char(createdon,'YYYY-MM-DD HH24:MI:SS') as created_at, " +
|
149
|
+
# "to_char(modifiedon,'YYYY-MM-DD HH24:MI:SS') as modified_at " +
|
150
|
+
# "from sakai_user where user_id in " +
|
151
|
+
# "(select user_id from sakai_realm_rl_gr " +
|
152
|
+
# "where realm_key = ? " +
|
153
|
+
# "and role_key = ?)", realm_id, role_id) do |row|
|
154
|
+
# first_name, last_name, type, created_at, modified_at = *row
|
155
|
+
# first_name ||= ""
|
156
|
+
# last_name ||= ""
|
157
|
+
# @@cache[eid] =
|
158
|
+
# @@cache[user_id] =
|
159
|
+
# User.new(user_id, eid, (first_name+' '+last_name), type, created_at, modified_at)
|
160
|
+
# users << @@cache[eid]
|
161
|
+
# end
|
162
|
+
# users
|
163
|
+
nil
|
155
164
|
end
|
156
165
|
|
157
166
|
# yaml/json serialization
|
@@ -177,13 +186,13 @@ module SakaiInfo
|
|
177
186
|
}
|
178
187
|
end
|
179
188
|
|
180
|
-
def
|
189
|
+
def sites_serialization
|
181
190
|
{
|
182
191
|
"sites" => self.membership.collect { |sm| sm.serialize(:user_summary) }
|
183
192
|
}
|
184
193
|
end
|
185
194
|
|
186
|
-
def
|
195
|
+
def pools_serialization
|
187
196
|
if self.question_pool_count > 0
|
188
197
|
{
|
189
198
|
"question_pools" => self.question_pools.collect { |qp| qp.serialize(:user_summary) }
|
@@ -192,27 +201,27 @@ module SakaiInfo
|
|
192
201
|
{}
|
193
202
|
end
|
194
203
|
end
|
204
|
+
|
205
|
+
def self.all_serializations
|
206
|
+
[:default, :sites, :pools]
|
207
|
+
end
|
195
208
|
end
|
196
209
|
|
197
210
|
class UserProperty
|
198
211
|
def self.get(user_id, property_name)
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
212
|
+
row = DB.connect[:sakai_user_property].
|
213
|
+
filter(:user_id => user_id, :name => property_name).first
|
214
|
+
if row.nil?
|
215
|
+
nil
|
216
|
+
else
|
217
|
+
row[:value].read
|
204
218
|
end
|
205
|
-
return value
|
206
219
|
end
|
207
220
|
|
208
221
|
def self.find_by_user_id(user_id)
|
209
|
-
db = DB.connect
|
210
222
|
properties = {}
|
211
|
-
|
212
|
-
|
213
|
-
name = row[0]
|
214
|
-
value = row[1].read
|
215
|
-
properties[name] = value
|
223
|
+
DB.connect[:sakai_user_property].where(:user_id => user_id).all.each do |row|
|
224
|
+
properties[row[:name]] = row[:value].read
|
216
225
|
end
|
217
226
|
return properties
|
218
227
|
end
|
data/lib/sakai-info/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sakai-info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Adams
|
@@ -15,10 +15,37 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-02-
|
18
|
+
date: 2012-02-24 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: sequel
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: sqlite3
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
22
49
|
description: A command line tool and a suite of libraries for representing the objects and relationships defined by a Sakai CLE database.
|
23
50
|
email: daveadams@gmail.com
|
24
51
|
executables:
|
@@ -40,12 +67,10 @@ files:
|
|
40
67
|
- lib/sakai-info/user.rb
|
41
68
|
- lib/sakai-info/version.rb
|
42
69
|
- lib/sakai-info/announcement.rb
|
70
|
+
- lib/sakai-info/database.rb
|
43
71
|
- lib/sakai-info/cli.rb
|
44
|
-
- lib/sakai-info/instance.rb
|
45
|
-
- lib/sakai-info/configuration.rb
|
46
72
|
- lib/sakai-info/message.rb
|
47
73
|
- lib/sakai-info/content.rb
|
48
|
-
- lib/sakai-info/db.rb
|
49
74
|
- lib/sakai-info/sakai_xml_entity.rb
|
50
75
|
- bin/sakai-info
|
51
76
|
- README.md
|
@@ -54,8 +79,8 @@ files:
|
|
54
79
|
- ROADMAP.md
|
55
80
|
has_rdoc: true
|
56
81
|
homepage: https://github.com/daveadams/sakai-info
|
57
|
-
licenses:
|
58
|
-
|
82
|
+
licenses:
|
83
|
+
- Public Domain
|
59
84
|
post_install_message:
|
60
85
|
rdoc_options: []
|
61
86
|
|
@@ -1,288 +0,0 @@
|
|
1
|
-
# sakai-info/configuration.rb
|
2
|
-
# SakaiInfo::Configuration library
|
3
|
-
#
|
4
|
-
# Created 2012-02-15 daveadams@gmail.com
|
5
|
-
# Last updated 2012-02-19 daveadams@gmail.com
|
6
|
-
#
|
7
|
-
# https://github.com/daveadams/sakai-info
|
8
|
-
#
|
9
|
-
# This software is public domain.
|
10
|
-
#
|
11
|
-
|
12
|
-
module SakaiInfo
|
13
|
-
class NoConfigFoundException < SakaiException; end
|
14
|
-
class AlreadyConfiguredException < SakaiException; end
|
15
|
-
class InvalidInstanceNameException < SakaiException; end
|
16
|
-
class InvalidConfigException < SakaiException; end
|
17
|
-
class UnsupportedConfigException < InvalidConfigException; end
|
18
|
-
class MultipleConfigException < InvalidConfigException
|
19
|
-
def initialize
|
20
|
-
@exceptions = []
|
21
|
-
end
|
22
|
-
|
23
|
-
def add(instance_name, exception)
|
24
|
-
@exceptions << [instance_name, exception]
|
25
|
-
end
|
26
|
-
|
27
|
-
def count
|
28
|
-
@exceptions.length
|
29
|
-
end
|
30
|
-
|
31
|
-
def message
|
32
|
-
"Multiple config exceptions were found:\n " +
|
33
|
-
@exceptions.collect{ |e| "#{e[0]}: #{e[1].message}" }.join("\n ")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# config format assumptions:
|
38
|
-
# a YAML string containing one of the following options:
|
39
|
-
# - a single database connection spec
|
40
|
-
# - eg:
|
41
|
-
# ---
|
42
|
-
# dbtype: oracle
|
43
|
-
# dbsid: PROD
|
44
|
-
# username: sakai
|
45
|
-
# password: Sekrit1
|
46
|
-
# OR:
|
47
|
-
# - an "instances" key containing a hash of named connection specs
|
48
|
-
# - with a "default" key naming the spec to use if none is specified
|
49
|
-
# - eg:
|
50
|
-
# ---
|
51
|
-
# default: production
|
52
|
-
# instances:
|
53
|
-
# production:
|
54
|
-
# dbtype: oracle
|
55
|
-
# service: PROD
|
56
|
-
# username: sakai
|
57
|
-
# password: prodpass
|
58
|
-
# test:
|
59
|
-
# dbtype: oracle
|
60
|
-
# service: TEST
|
61
|
-
# host: testdb.host
|
62
|
-
# port: 1521
|
63
|
-
# username: sakai
|
64
|
-
# password: testpass
|
65
|
-
# dev:
|
66
|
-
# dbtype: mysql
|
67
|
-
# host: dbserver.hostname.int
|
68
|
-
# port: 3306
|
69
|
-
# username: sakai
|
70
|
-
# password: ironchef
|
71
|
-
# dbname: sakaidev
|
72
|
-
# localdev:
|
73
|
-
# dbtype: mysql
|
74
|
-
# host: localhost
|
75
|
-
# port: 3306
|
76
|
-
# username: sakai
|
77
|
-
# password: ironchef
|
78
|
-
# dbname: sakailocal
|
79
|
-
#
|
80
|
-
#
|
81
|
-
# NOTES:
|
82
|
-
# - Oracle connections should use either an alias defined in the
|
83
|
-
# driver's tnsnames.ora file, or specify the host and port as the
|
84
|
-
# test instance example above does
|
85
|
-
#
|
86
|
-
class Configuration
|
87
|
-
@@config = nil
|
88
|
-
|
89
|
-
# validate just a single database connection configuration hash
|
90
|
-
def self.validate_single_connection_config(config)
|
91
|
-
if config.nil?
|
92
|
-
raise InvalidConfigException.new("The config provided was nil")
|
93
|
-
end
|
94
|
-
|
95
|
-
if not config.is_a? Hash
|
96
|
-
raise InvalidConfigException.new("The config provided must be a Hash")
|
97
|
-
end
|
98
|
-
|
99
|
-
# we have to have a dbtype value or we can't validate
|
100
|
-
if config["dbtype"].nil?
|
101
|
-
raise InvalidConfigException.new("The config does not specify 'dbtype'")
|
102
|
-
end
|
103
|
-
|
104
|
-
# force lowercase to simplify comparisons
|
105
|
-
dbtype = config["dbtype"].downcase
|
106
|
-
|
107
|
-
if not %w(oracle mysql).include? dbtype
|
108
|
-
raise UnsupportedConfigException.new("Database type '#{dbtype}' is not supported.")
|
109
|
-
end
|
110
|
-
|
111
|
-
# now check per-dbtype requirements
|
112
|
-
if dbtype == "oracle"
|
113
|
-
%w(service username password).each do |required_key|
|
114
|
-
if config[required_key].nil? or config[required_key] == ""
|
115
|
-
raise InvalidConfigException.new("Oracle config requires values for 'service', 'username', and 'password'.")
|
116
|
-
end
|
117
|
-
end
|
118
|
-
elsif dbtype == "mysql"
|
119
|
-
%w(host username password dbname).each do |required_key|
|
120
|
-
if config[required_key].nil? or config[required_key] == ""
|
121
|
-
raise InvalidConfigException.new("MySQL config requires values for 'host', 'username', 'password', and 'dbname'.")
|
122
|
-
end
|
123
|
-
end
|
124
|
-
else
|
125
|
-
# we should never have made it here
|
126
|
-
raise UnsupportedConfigException.new("Database type '#{dbtype}' is not supported.")
|
127
|
-
end
|
128
|
-
|
129
|
-
# for both types, 'port' is optional but if it exists it must be a valid TCP port
|
130
|
-
if not config["port"].nil?
|
131
|
-
begin
|
132
|
-
port = config["port"].to_i
|
133
|
-
if port < 1 or port > 65535
|
134
|
-
raise
|
135
|
-
end
|
136
|
-
rescue
|
137
|
-
raise InvalidConfigException.new("Config value 'port' must be a valid TCP port number.")
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
# if we made it here the config is complete and well-formed
|
142
|
-
return true
|
143
|
-
end
|
144
|
-
|
145
|
-
# validate that configuration is complete and well-formed
|
146
|
-
def self.validate_config(config)
|
147
|
-
if config.nil?
|
148
|
-
raise InvalidConfigException.new("The config provided was nil")
|
149
|
-
end
|
150
|
-
|
151
|
-
if not config.is_a? Hash
|
152
|
-
raise InvalidConfigException.new("The config provided must be a Hash")
|
153
|
-
end
|
154
|
-
|
155
|
-
# if 'dbtype' exists, it will be a single database configuration
|
156
|
-
if config["dbtype"]
|
157
|
-
self.validate_single_connection_config(config)
|
158
|
-
else
|
159
|
-
# otherwise both 'default' and 'instances' keys are required
|
160
|
-
if config.keys.sort != ["default","instances"]
|
161
|
-
raise InvalidConfigException.new("The config must specify either 'dbtype' or both 'default' and 'instances'.")
|
162
|
-
end
|
163
|
-
|
164
|
-
# enforce types on the values of 'default' and 'instances'
|
165
|
-
if not config["default"].is_a? String
|
166
|
-
raise InvalidConfigException.new("The value of 'default' must be a String.")
|
167
|
-
end
|
168
|
-
if not config["instances"].is_a? Hash
|
169
|
-
raise InvalidConfigException.new("The value of 'instances' must be a Hash.")
|
170
|
-
end
|
171
|
-
|
172
|
-
# 'default' must be a string pointing to one of the 'instances' keys
|
173
|
-
if not config["instances"].keys.include? config["default"]
|
174
|
-
raise InvalidConfigException.new("The default instance '#{config["default"]}' was not among the instance names given: #{config["instances"].keys.inspect}")
|
175
|
-
end
|
176
|
-
|
177
|
-
# check the validity of each instance, collecting exceptions as we go
|
178
|
-
multi_exceptions = nil
|
179
|
-
config["instances"].keys.each do |instance_name|
|
180
|
-
begin
|
181
|
-
self.validate_single_connection_config(config["instances"][instance_name])
|
182
|
-
rescue InvalidConfigException => e
|
183
|
-
# create the object if it doesn't already exist
|
184
|
-
multi_exceptions ||= MultipleConfigException.new
|
185
|
-
|
186
|
-
# add this exception to the list
|
187
|
-
multi_exceptions.add(instance_name, e)
|
188
|
-
end
|
189
|
-
# continue the loop no matter what
|
190
|
-
end
|
191
|
-
|
192
|
-
# if this object was created, the exception needs to be raised
|
193
|
-
if not multi_exceptions.nil?
|
194
|
-
raise multi_exceptions
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# if we've made it this far, the configuration must be fine
|
199
|
-
return true
|
200
|
-
end
|
201
|
-
|
202
|
-
def initialize(config)
|
203
|
-
begin
|
204
|
-
if config.is_a? Hash
|
205
|
-
@config = config
|
206
|
-
elsif config.is_a? String and File.exist?(config)
|
207
|
-
# try to parse as a filename first
|
208
|
-
if File.exist?(config)
|
209
|
-
@config = YAML::load_file(config)
|
210
|
-
end
|
211
|
-
else
|
212
|
-
# otherwise try to parse it generically
|
213
|
-
@config = YAML::load(config)
|
214
|
-
end
|
215
|
-
rescue Exception => e
|
216
|
-
raise InvalidConfigException.new("Unable to parse configuration: #{e}")
|
217
|
-
end
|
218
|
-
|
219
|
-
# check that the configuration specified is well formed
|
220
|
-
if not Configuration.validate_config(@config)
|
221
|
-
raise InvalidConfigException.new("Config provided is either incomplete or poorly formed.")
|
222
|
-
end
|
223
|
-
|
224
|
-
# create instance objects
|
225
|
-
@instances = {}
|
226
|
-
if not @config["instances"].nil?
|
227
|
-
@config["instances"].keys.each do |instance_name|
|
228
|
-
@instances[instance_name] = Instance.create(@config["instances"][instance_name])
|
229
|
-
if instance_name == @config["default"]
|
230
|
-
@instances[:default] = @instances[instance_name]
|
231
|
-
end
|
232
|
-
end
|
233
|
-
else
|
234
|
-
@instances[:default] = Instance.create(@config)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
# instance accessibility
|
239
|
-
def get_instance(instance_name)
|
240
|
-
@instances[instance_name] or raise InvalidInstanceNameException
|
241
|
-
end
|
242
|
-
|
243
|
-
def default_instance
|
244
|
-
@instances[:default]
|
245
|
-
end
|
246
|
-
|
247
|
-
DEFAULT_CONFIG_FILE = File.expand_path("~/.sakai-info")
|
248
|
-
# check to see if configuration file exists
|
249
|
-
# by default ~/.sakai-info
|
250
|
-
def self.config_file_path
|
251
|
-
if File.readable? DEFAULT_CONFIG_FILE
|
252
|
-
DEFAULT_CONFIG_FILE
|
253
|
-
else
|
254
|
-
nil
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
# are we already configured?
|
259
|
-
def self.configured?
|
260
|
-
not @@config.nil?
|
261
|
-
end
|
262
|
-
|
263
|
-
# load configuration as a class variable (and return it as well)
|
264
|
-
def self.load_config(alternate_config_file = nil)
|
265
|
-
if Configuration.configured?
|
266
|
-
raise AlreadyConfiguredException
|
267
|
-
end
|
268
|
-
|
269
|
-
unless(config_file = alternate_config_file || Configuration.config_file_path)
|
270
|
-
raise NoConfigFoundException
|
271
|
-
end
|
272
|
-
|
273
|
-
@@config = Configuration.new(config_file)
|
274
|
-
end
|
275
|
-
|
276
|
-
# return specified database connection configuration
|
277
|
-
def self.get_instance(instance_name = nil)
|
278
|
-
Configuration.load_config unless Configuration.configured?
|
279
|
-
|
280
|
-
if instance_name.nil?
|
281
|
-
@@config.default_instance
|
282
|
-
else
|
283
|
-
@@config.get_instance(instance_name)
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
287
|
-
end
|
288
|
-
|