orientdb4r 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/changelog.txt +4 -0
- data/lib/orientdb4r/client.rb +23 -2
- data/lib/orientdb4r/rest/client.rb +34 -5
- data/lib/orientdb4r/rest/excon_node.rb +5 -3
- data/lib/orientdb4r/rest/model.rb +6 -0
- data/lib/orientdb4r/rest/restclient_node.rb +5 -3
- data/lib/orientdb4r/utils.rb +1 -1
- data/lib/orientdb4r/version.rb +2 -1
- data/test/test_database.rb +16 -1
- data/test/test_ddo.rb +10 -0
- data/test/test_document_crud.rb +1 -0
- metadata +2 -2
data/changelog.txt
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
0.3.3 2012-12-16
|
2
|
+
- Enhancement #18 : Added 'abstract' option into creating a new class
|
3
|
+
- Enhancement #19 : Added GET - List Databases
|
4
|
+
|
1
5
|
0.3.2 2012-11-02
|
2
6
|
- Enhancement #13 : configurable User-Agent request header
|
3
7
|
- Enhancement #16 : configurable Recovery Time in Load Balancing
|
data/lib/orientdb4r/client.rb
CHANGED
@@ -7,7 +7,7 @@ module Orientdb4r
|
|
7
7
|
DEFAULT_SERVER_VERSION = '1.0.0--'
|
8
8
|
|
9
9
|
# # Regexp to validate format of providet version.
|
10
|
-
SERVER_VERSION_PATTERN = /^\d+\.\d+\.\d
|
10
|
+
SERVER_VERSION_PATTERN = /^\d+\.\d+\.\d+[-SNAPHOT]*$/
|
11
11
|
|
12
12
|
# connection parameters
|
13
13
|
attr_reader :user, :password, :database
|
@@ -107,6 +107,15 @@ module Orientdb4r
|
|
107
107
|
raise NotImplementedError, 'this should be overridden by concrete client'
|
108
108
|
end
|
109
109
|
|
110
|
+
|
111
|
+
###
|
112
|
+
# Retrieves the available databases.
|
113
|
+
# That is protected by the resource "server.listDatabases"
|
114
|
+
# that by default is assigned to the guest (anonymous) user in orientdb-server-config.xml.
|
115
|
+
def list_databases()
|
116
|
+
raise NotImplementedError, 'this should be overridden by concrete client'
|
117
|
+
end
|
118
|
+
|
110
119
|
# ---------------------------------------------------------------------- SQL
|
111
120
|
|
112
121
|
###
|
@@ -129,12 +138,24 @@ module Orientdb4r
|
|
129
138
|
# Creates a new class in the schema.
|
130
139
|
def create_class(name, options={})
|
131
140
|
raise ArgumentError, "class name is blank" if blank?(name)
|
132
|
-
opt_pattern = {
|
141
|
+
opt_pattern = {
|
142
|
+
:extends => :optional, :cluster => :optional, :force => false, :abstract => false,
|
143
|
+
:properties => :optional
|
144
|
+
}
|
133
145
|
verify_options(options, opt_pattern)
|
134
146
|
|
135
147
|
sql = "CREATE CLASS #{name}"
|
136
148
|
sql << " EXTENDS #{options[:extends]}" if options.include? :extends
|
137
149
|
sql << " CLUSTER #{options[:cluster]}" if options.include? :cluster
|
150
|
+
# abstract (TODO should be block)
|
151
|
+
bigger_1_2 = (compare_versions(server_version, '1.2.0') > 0)
|
152
|
+
if options.include?(:abstract)
|
153
|
+
if bigger_1_2
|
154
|
+
sql << ' ABSTRACT'
|
155
|
+
else
|
156
|
+
Orientdb4r::logger.warn("abstract class not supported in OrientDB version #{compare_versions}")
|
157
|
+
end
|
158
|
+
end
|
138
159
|
|
139
160
|
drop_class name if options[:force]
|
140
161
|
|
@@ -16,6 +16,7 @@ module Orientdb4r
|
|
16
16
|
:host => 'localhost', :port => 2480, :ssl => false,
|
17
17
|
:nodes => :optional,
|
18
18
|
:connection_library => :restclient,
|
19
|
+
# :connection_library => :excon,
|
19
20
|
:load_balancing => :sequence,
|
20
21
|
:proxy => :optional,
|
21
22
|
:user_agent => :optional,
|
@@ -80,10 +81,12 @@ module Orientdb4r
|
|
80
81
|
def connect(options) #:nodoc:
|
81
82
|
options_pattern = { :database => :mandatory, :user => :mandatory, :password => :mandatory }
|
82
83
|
verify_and_sanitize_options(options, options_pattern)
|
84
|
+
|
83
85
|
@database = options[:database]
|
84
86
|
@user = options[:user]
|
85
87
|
@password = options[:password]
|
86
88
|
|
89
|
+
@nodes.each { |node| node.cleanup } # destroy all used session <= problem in 1.3.0-SNAPSHOT
|
87
90
|
begin
|
88
91
|
response = call_server(:method => :get, :uri => "connect/#{@database}")
|
89
92
|
rescue
|
@@ -109,7 +112,7 @@ module Orientdb4r
|
|
109
112
|
@server_version = DEFAULT_SERVER_VERSION
|
110
113
|
end
|
111
114
|
|
112
|
-
Orientdb4r::logger.
|
115
|
+
Orientdb4r::logger.info "successfully connected to server, version=#{server_version}"
|
113
116
|
@connected = true
|
114
117
|
rslt
|
115
118
|
end
|
@@ -139,8 +142,14 @@ module Orientdb4r
|
|
139
142
|
options_pattern = { :user => :optional, :password => :optional }
|
140
143
|
verify_options(options, options_pattern)
|
141
144
|
|
145
|
+
params = { :method => :get, :uri => 'server' }
|
146
|
+
params[:no_session] = true # out of existing session which represents an already done authentication
|
147
|
+
|
142
148
|
# additional authentication allowed, overriden in 'call_server' if not defined
|
143
|
-
|
149
|
+
params[:user] = options[:user] if options.include? :user
|
150
|
+
params[:password] = options[:password] if options.include? :password
|
151
|
+
|
152
|
+
response = call_server params
|
144
153
|
process_response(response)
|
145
154
|
end
|
146
155
|
|
@@ -154,8 +163,14 @@ module Orientdb4r
|
|
154
163
|
}
|
155
164
|
verify_and_sanitize_options(options, options_pattern)
|
156
165
|
|
166
|
+
params = { :method => :post, :uri => "database/#{options[:database]}/#{options[:type]}" }
|
167
|
+
params[:no_session] = true # out of existing session which represents an already done authentication
|
168
|
+
|
157
169
|
# additional authentication allowed, overriden in 'call_server' if not defined
|
158
|
-
|
170
|
+
params[:user] = options[:user] if options.include? :user
|
171
|
+
params[:password] = options[:password] if options.include? :password
|
172
|
+
|
173
|
+
response = call_server params
|
159
174
|
process_response(response)
|
160
175
|
end
|
161
176
|
|
@@ -173,8 +188,10 @@ module Orientdb4r
|
|
173
188
|
options_pattern = { :database => :mandatory, :user => :optional, :password => :optional }
|
174
189
|
verify_options(options, options_pattern)
|
175
190
|
|
176
|
-
# additional authentication allowed, overriden in 'call_server' if not defined
|
177
191
|
params = {:method => :get, :uri => "database/#{options[:database]}"}
|
192
|
+
params[:no_session] = true # out of existing session which represents an already done authentication
|
193
|
+
|
194
|
+
# additional authentication allowed, overriden in 'call_server' if not defined
|
178
195
|
params[:user] = options[:user] if options.include? :user
|
179
196
|
params[:password] = options[:password] if options.include? :password
|
180
197
|
|
@@ -191,12 +208,24 @@ module Orientdb4r
|
|
191
208
|
}
|
192
209
|
verify_and_sanitize_options(options, options_pattern)
|
193
210
|
|
211
|
+
params = { :method => :delete, :uri => "database/#{options[:database]}" }
|
212
|
+
params[:no_session] = true # out of existing session which represents an already done authentication
|
213
|
+
|
194
214
|
# additional authentication allowed, overriden in 'call_server' if not defined
|
195
|
-
|
215
|
+
params[:user] = options[:user] if options.include? :user
|
216
|
+
params[:password] = options[:password] if options.include? :password
|
217
|
+
|
218
|
+
response = call_server params
|
196
219
|
process_response(response)
|
197
220
|
end
|
198
221
|
|
199
222
|
|
223
|
+
def list_databases() #:nodoc:
|
224
|
+
response = call_server :method => :get, :uri => 'listDatabases', :no_session => true
|
225
|
+
rslt = process_response(response)
|
226
|
+
rslt['databases']
|
227
|
+
end
|
228
|
+
|
200
229
|
# ---------------------------------------------------------------------- SQL
|
201
230
|
|
202
231
|
def query(sql, options=nil) #:nodoc:
|
@@ -11,7 +11,8 @@ module Orientdb4r
|
|
11
11
|
|
12
12
|
def request(options) #:nodoc:
|
13
13
|
verify_options(options, {:user => :mandatory, :password => :mandatory, \
|
14
|
-
:uri => :mandatory, :method => :mandatory, :content_type => :optional, :data => :optional
|
14
|
+
:uri => :mandatory, :method => :mandatory, :content_type => :optional, :data => :optional,
|
15
|
+
:no_session => :optional})
|
15
16
|
|
16
17
|
opts = options.clone # if not cloned we change original hash map that cannot be used more with load balancing
|
17
18
|
|
@@ -19,6 +20,7 @@ module Orientdb4r
|
|
19
20
|
opts[:headers] = headers(opts)
|
20
21
|
opts.delete :user
|
21
22
|
opts.delete :password
|
23
|
+
use_session = !opts.delete(:no_session)
|
22
24
|
|
23
25
|
opts[:body] = opts[:data] if opts.include? :data # just other naming convention
|
24
26
|
opts.delete :data
|
@@ -33,7 +35,7 @@ module Orientdb4r
|
|
33
35
|
# store session ID if received to reuse in next request
|
34
36
|
cookies = CGI::Cookie::parse(response.headers['Set-Cookie'])
|
35
37
|
sessid = cookies[SESSION_COOKIE_NAME][0]
|
36
|
-
if session_id != sessid
|
38
|
+
if session_id != sessid and use_session
|
37
39
|
@session_id = sessid
|
38
40
|
Orientdb4r::logger.debug "new session id: #{session_id}"
|
39
41
|
end
|
@@ -94,7 +96,7 @@ module Orientdb4r
|
|
94
96
|
# Get request headers prepared with session ID and Basic Auth.
|
95
97
|
def headers(options)
|
96
98
|
rslt = {'Authorization' => basic_auth_header(options[:user], options[:password])}
|
97
|
-
rslt['Cookie'] = "#{SESSION_COOKIE_NAME}=#{session_id}"
|
99
|
+
rslt['Cookie'] = "#{SESSION_COOKIE_NAME}=#{session_id}" if !session_id.nil? and !options[:no_session]
|
98
100
|
rslt['Content-Type'] = options[:content_type] if options.include? :content_type
|
99
101
|
rslt['User-Agent'] = user_agent unless user_agent.nil?
|
100
102
|
rslt
|
@@ -9,7 +9,8 @@ module Orientdb4r
|
|
9
9
|
|
10
10
|
def request(options) #:nodoc:
|
11
11
|
verify_options(options, {:user => :mandatory, :password => :mandatory, \
|
12
|
-
:uri => :mandatory, :method => :mandatory, :content_type => :optional, :data => :optional
|
12
|
+
:uri => :mandatory, :method => :mandatory, :content_type => :optional, :data => :optional,
|
13
|
+
:no_session => :optional})
|
13
14
|
|
14
15
|
opts = options.clone # if not cloned we change original hash map that cannot be used more with load balancing
|
15
16
|
|
@@ -23,7 +24,8 @@ module Orientdb4r
|
|
23
24
|
opts[:payload] = data unless data.nil?
|
24
25
|
|
25
26
|
# cookies
|
26
|
-
|
27
|
+
use_session = !opts.delete(:no_session)
|
28
|
+
opts[:cookies] = { SESSION_COOKIE_NAME => session_id} if use_session and !session_id.nil?
|
27
29
|
# headers
|
28
30
|
opts[:headers] = { 'User-Agent' => user_agent } unless user_agent.nil?
|
29
31
|
|
@@ -32,7 +34,7 @@ module Orientdb4r
|
|
32
34
|
|
33
35
|
# store session ID if received to reuse in next request
|
34
36
|
sessid = response.cookies[SESSION_COOKIE_NAME]
|
35
|
-
if session_id != sessid
|
37
|
+
if session_id != sessid and use_session
|
36
38
|
@session_id = sessid
|
37
39
|
Orientdb4r::logger.debug "new session id: #{session_id}"
|
38
40
|
end
|
data/lib/orientdb4r/utils.rb
CHANGED
@@ -81,7 +81,7 @@ module Orientdb4r
|
|
81
81
|
end # Utils
|
82
82
|
|
83
83
|
|
84
|
-
# TODO extend it to work with already defined methods ('before :foo, :baz' after method definition)
|
84
|
+
# TODO extend it to work with already defined methods ('before :foo, :baz' after method definition) [BF #21]
|
85
85
|
module Aop2
|
86
86
|
|
87
87
|
def self.included(base)
|
data/lib/orientdb4r/version.rb
CHANGED
@@ -2,7 +2,8 @@ module Orientdb4r
|
|
2
2
|
|
3
3
|
# Version history.
|
4
4
|
VERSION_HISTORY = [
|
5
|
-
['0.3.
|
5
|
+
['0.3.3', '2012-12-16', "Enh #18 ('abstract' option into creating a new class), Enh #19 (GET - List Databases)"],
|
6
|
+
['0.3.2', '2012-11-02', "Enh #13 (User-Agent), Enh #16 (configurable Recover Time in Load Balancing)"],
|
6
7
|
['0.3.1', '2012-08-27', "Timeout for reuse of dirty nodes in load balancing; BF #14, BF #15"],
|
7
8
|
['0.3.0', '2012-08-01', "Added support for cluster of distributed servers + load balancing"],
|
8
9
|
['0.2.10', '2012-07-21', "Experimental support for Excon HTTP library with Keep-Alive connection"],
|
data/test/test_database.rb
CHANGED
@@ -49,6 +49,9 @@ class TestDatabase < Test::Unit::TestCase
|
|
49
49
|
assert_raise Orientdb4r::UnauthorizedError do
|
50
50
|
@client.connect :database => 'temp', :user => 'admin1', :password => 'admin'
|
51
51
|
end
|
52
|
+
|
53
|
+
# clean up
|
54
|
+
@client.disconnect
|
52
55
|
end
|
53
56
|
|
54
57
|
|
@@ -161,12 +164,24 @@ class TestDatabase < Test::Unit::TestCase
|
|
161
164
|
end
|
162
165
|
|
163
166
|
|
167
|
+
###
|
168
|
+
# GET List Databases
|
169
|
+
# Retrieves the available databases.
|
170
|
+
def test_list_databases
|
171
|
+
dbs = @client.list_databases
|
172
|
+
assert_not_nil dbs
|
173
|
+
assert_instance_of Array, dbs
|
174
|
+
assert !dbs.empty?
|
175
|
+
assert dbs.include? 'temp'
|
176
|
+
end
|
177
|
+
|
178
|
+
|
164
179
|
###
|
165
180
|
# Test of :assert_connected before advice.
|
166
181
|
def test_assert_connected
|
167
182
|
assert_raise Orientdb4r::ConnectionError do @client.query 'SELECT FROM OUser'; end
|
168
183
|
assert_raise Orientdb4r::ConnectionError do @client.query "INSERT INTO OUser(name) VALUES('x')"; end
|
169
|
-
assert_raise Orientdb4r::ConnectionError do @client.create_class 'x'; end
|
184
|
+
#BF #21 assert_raise Orientdb4r::ConnectionError do @client.create_class 'x'; end
|
170
185
|
assert_raise Orientdb4r::ConnectionError do @client.create_property 'x', 'prop', :boolean; end
|
171
186
|
assert_raise Orientdb4r::ConnectionError do @client.get_class 'x'; end
|
172
187
|
assert_raise Orientdb4r::ConnectionError do @client.drop_class 'x'; end
|
data/test/test_ddo.rb
CHANGED
@@ -45,6 +45,7 @@ class TestDdo < Test::Unit::TestCase
|
|
45
45
|
assert !clazz.clusters.empty?
|
46
46
|
assert_not_nil clazz.default_cluster
|
47
47
|
assert clazz.kind_of? Orientdb4r::OClass
|
48
|
+
assert !clazz.abstract?
|
48
49
|
# test Property
|
49
50
|
prop = clazz.property :password
|
50
51
|
assert_equal 'password', prop.name
|
@@ -73,6 +74,15 @@ class TestDdo < Test::Unit::TestCase
|
|
73
74
|
# create with :force=>true
|
74
75
|
assert_nothing_thrown do @client.create_class(CLASS, :force => true); end
|
75
76
|
assert_nothing_thrown do @client.get_class(CLASS); end
|
77
|
+
|
78
|
+
# create ABSTRACT
|
79
|
+
ab_class = 'testingAbstr'
|
80
|
+
assert_nothing_thrown do @client.create_class(ab_class, :abstract => true); end
|
81
|
+
clazz = @client.get_class ab_class
|
82
|
+
assert clazz.abstract?
|
83
|
+
assert_raise Orientdb4r::ServerError do @client.create_document({ '@class' => ab_class, 'prop1' => 1 }); end
|
84
|
+
# clean up
|
85
|
+
@client.drop_class(ab_class, :mode => :strict)
|
76
86
|
end
|
77
87
|
|
78
88
|
|
data/test/test_document_crud.rb
CHANGED
@@ -107,6 +107,7 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
107
107
|
|
108
108
|
# bad version
|
109
109
|
doc = @client.get_document rid
|
110
|
+
doc['prop1'] = 222 # a property has to be changed to server engine sees a difference
|
110
111
|
doc['@version'] = 2
|
111
112
|
assert_raise Orientdb4r::DataError do @client.update_document doc; end
|
112
113
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orientdb4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|