vagas-orientdb4r 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +26 -0
- data/.travis.yml +18 -0
- data/Gemfile +9 -0
- data/LICENSE +202 -0
- data/README.rdoc +124 -0
- data/Rakefile +43 -0
- data/changelog.txt +60 -0
- data/ci/initialize-ci.sh +36 -0
- data/fstudy/design_v1.dia +0 -0
- data/fstudy/design_v1.png +0 -0
- data/fstudy/domain_model.dia +0 -0
- data/fstudy/domain_model.png +0 -0
- data/fstudy/flat_class_perf.rb +56 -0
- data/fstudy/sample1_object_diagram.dia +0 -0
- data/fstudy/sample1_object_diagram.png +0 -0
- data/fstudy/study_case.rb +87 -0
- data/fstudy/technical_feasibility.rb +256 -0
- data/lib/orientdb4r.rb +115 -0
- data/lib/orientdb4r/bin/client.rb +86 -0
- data/lib/orientdb4r/bin/connection.rb +29 -0
- data/lib/orientdb4r/bin/constants.rb +20 -0
- data/lib/orientdb4r/bin/io.rb +38 -0
- data/lib/orientdb4r/bin/protocol28.rb +101 -0
- data/lib/orientdb4r/bin/protocol_factory.rb +25 -0
- data/lib/orientdb4r/chained_error.rb +37 -0
- data/lib/orientdb4r/client.rb +364 -0
- data/lib/orientdb4r/load_balancing.rb +113 -0
- data/lib/orientdb4r/node.rb +42 -0
- data/lib/orientdb4r/rest/client.rb +517 -0
- data/lib/orientdb4r/rest/excon_node.rb +115 -0
- data/lib/orientdb4r/rest/model.rb +159 -0
- data/lib/orientdb4r/rest/node.rb +43 -0
- data/lib/orientdb4r/rest/restclient_node.rb +77 -0
- data/lib/orientdb4r/rid.rb +54 -0
- data/lib/orientdb4r/utils.rb +203 -0
- data/lib/orientdb4r/version.rb +39 -0
- data/orientdb4r.gemspec +37 -0
- data/test/bin/test_client.rb +21 -0
- data/test/readme_sample.rb +38 -0
- data/test/test_client.rb +93 -0
- data/test/test_database.rb +261 -0
- data/test/test_ddo.rb +237 -0
- data/test/test_dmo.rb +115 -0
- data/test/test_document_crud.rb +184 -0
- data/test/test_gremlin.rb +52 -0
- data/test/test_helper.rb +10 -0
- data/test/test_loadbalancing.rb +81 -0
- data/test/test_utils.rb +67 -0
- metadata +136 -0
@@ -0,0 +1,203 @@
|
|
1
|
+
module Orientdb4r
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
def verify_options(options, pattern)
|
6
|
+
raise ArgumentError, 'options cannot be nil' if options.nil?
|
7
|
+
|
8
|
+
# unknown key?
|
9
|
+
options.keys.each do |k|
|
10
|
+
raise ArgumentError, "unknow option: #{k}" unless pattern.keys.include? k
|
11
|
+
end
|
12
|
+
# missing mandatory option?
|
13
|
+
pattern.each do |k,v|
|
14
|
+
raise ArgumentError, "missing mandatory option: #{k}" if v == :mandatory and !options.keys.include? k
|
15
|
+
end
|
16
|
+
# option in a set of allowed values
|
17
|
+
pattern.each do |k,v|
|
18
|
+
if v.instance_of? Array
|
19
|
+
raise ArgumentError, "value '#{options[k]}' not in #{v.inspect}, key=#{k}" unless v.include?(options[k])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
options
|
24
|
+
end
|
25
|
+
|
26
|
+
def verify_and_sanitize_options(options, pattern)
|
27
|
+
verify_options(options, pattern)
|
28
|
+
|
29
|
+
# set default values if missing in options
|
30
|
+
pattern.each do |k,v|
|
31
|
+
options[k] = v if !v.nil? and :optional != v and !options.keys.include? k
|
32
|
+
end
|
33
|
+
options
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
###
|
38
|
+
# Checks if a given string is either 'nil' or empty string.
|
39
|
+
def blank?(str)
|
40
|
+
str.nil? or (str.is_a? String and str.strip.empty?)
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
# Generates a random string with given length.
|
45
|
+
def random_string(len=8)
|
46
|
+
(0...len).map{65.+(rand(25)).chr}.join
|
47
|
+
end
|
48
|
+
|
49
|
+
###
|
50
|
+
# Compares two given versions.
|
51
|
+
# ==== Returns
|
52
|
+
# * 1 if first > second
|
53
|
+
# * 0 if first == second
|
54
|
+
# * -1 if first < second
|
55
|
+
def compare_versions(first, second)
|
56
|
+
raise ArgumentError, "bad version format, version=#{first}" unless first =~ Orientdb4r::Client::SERVER_VERSION_PATTERN
|
57
|
+
raise ArgumentError, "bad version format, version=#{second}" unless second =~ Orientdb4r::Client::SERVER_VERSION_PATTERN
|
58
|
+
|
59
|
+
firstv = /^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)/.match(first)[0]
|
60
|
+
secondv = /^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)/.match(second)[0]
|
61
|
+
|
62
|
+
rslt = 0
|
63
|
+
rslt = 1 if firstv > secondv
|
64
|
+
rslt = -1 if firstv < secondv
|
65
|
+
|
66
|
+
yield rslt if block_given?
|
67
|
+
|
68
|
+
rslt
|
69
|
+
end
|
70
|
+
|
71
|
+
class Proxy
|
72
|
+
|
73
|
+
attr_reader :target, :context
|
74
|
+
|
75
|
+
def initialize(target, context)
|
76
|
+
@target = target
|
77
|
+
@context = context
|
78
|
+
end
|
79
|
+
|
80
|
+
def proxy(&block)
|
81
|
+
block.call
|
82
|
+
end
|
83
|
+
|
84
|
+
end # Proxy
|
85
|
+
|
86
|
+
end # Utils
|
87
|
+
|
88
|
+
|
89
|
+
# TODO extend it to work with already defined methods ('before :foo, :baz' after method definition) [BF #21]
|
90
|
+
module Aop2
|
91
|
+
|
92
|
+
def self.included(base)
|
93
|
+
base.extend ClassMethods2
|
94
|
+
base.init_aop_extension
|
95
|
+
end
|
96
|
+
|
97
|
+
def aop_context
|
98
|
+
Thread.current[:aop2_context]
|
99
|
+
end
|
100
|
+
def aop_context=(ctx={})
|
101
|
+
Thread.current[:aop2_context] = ctx
|
102
|
+
end
|
103
|
+
|
104
|
+
module ClassMethods2
|
105
|
+
|
106
|
+
def init_aop_extension
|
107
|
+
@hooks = {}
|
108
|
+
[:before, :after, :around].each { |where| @hooks[where] = Hash.new { |hash, key| hash[key] = [] }}
|
109
|
+
# will be like this:
|
110
|
+
# {:before=>{:disconnect=>[:assert_connected], :query=>[:assert_connected], :command=>[:assert_connected]}, :after=>{}, :around=>{}}
|
111
|
+
class << self
|
112
|
+
attr_reader :hooks
|
113
|
+
end
|
114
|
+
@@redefining = false # flag whether the process of method redefining is running
|
115
|
+
end
|
116
|
+
def method_added(method)
|
117
|
+
unless @@redefining # avoid recursion
|
118
|
+
redefine_method(method) if is_hooked?(method)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
#----------------------------------------------------------------- Helpers
|
123
|
+
|
124
|
+
def is_hooked?(method)
|
125
|
+
# look into array of keys (method names) in 2nd level hashs (see above)
|
126
|
+
hooks.values.map(&:keys).flatten.uniq.include? method
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
def before(original_method, *hooks)
|
132
|
+
add_hook(:before, original_method, *hooks)
|
133
|
+
end
|
134
|
+
def after(original_method, *hooks)
|
135
|
+
add_hook(:after, original_method, *hooks)
|
136
|
+
end
|
137
|
+
def around(original_method, *hooks)
|
138
|
+
add_hook(:around, original_method, *hooks)
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
def add_hook(type, original_method, *hooks) #!!
|
143
|
+
Array(original_method).each do |method|
|
144
|
+
store_hook(type, method, *hooks)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
def store_hook(type, method_name, *hook_methods) #!!
|
148
|
+
hooks[type.to_sym][method_name.to_sym] += hook_methods.flatten.map(&:to_sym)
|
149
|
+
end
|
150
|
+
|
151
|
+
def redefine_method(orig_method)
|
152
|
+
@@redefining = true
|
153
|
+
|
154
|
+
arity = instance_method(orig_method.to_sym).arity
|
155
|
+
params = ''
|
156
|
+
fixed_cnt = arity.abs
|
157
|
+
fixed_cnt -= 1 if arity < 0
|
158
|
+
# build up a list of params
|
159
|
+
1.upto(fixed_cnt).each {|x| params << "p#{x},"}
|
160
|
+
params << "*argv" if arity < 0
|
161
|
+
params.gsub!(/,$/, '') # remove last ','
|
162
|
+
|
163
|
+
alias_method "#{orig_method}_aop2_orig".to_sym, orig_method.to_sym
|
164
|
+
|
165
|
+
class_eval <<-FILTER,__FILE__,__LINE__ + 1
|
166
|
+
def #{orig_method}(#{params})
|
167
|
+
self.aop_context = { :method => '#{orig_method}', :class => self.class }
|
168
|
+
begin
|
169
|
+
self.class.invoke_hooks(self, :before, :#{orig_method})
|
170
|
+
rslt = self.class.invoke_arround_hooks(self, :#{orig_method}, self.class.hooks[:around][:#{orig_method}].clone) {
|
171
|
+
#{orig_method}_aop2_orig(#{params})
|
172
|
+
}
|
173
|
+
self.class.invoke_hooks(self, :after, :#{orig_method})
|
174
|
+
# rescue Exception => e
|
175
|
+
# # TODO use logging
|
176
|
+
# $stderr.puts '' << e.class.name << ': ' << e.message
|
177
|
+
# $stderr.puts e.backtrace.inspect
|
178
|
+
# raise e
|
179
|
+
ensure
|
180
|
+
self.aop_context = nil
|
181
|
+
end
|
182
|
+
rslt
|
183
|
+
end
|
184
|
+
FILTER
|
185
|
+
|
186
|
+
@@redefining = false
|
187
|
+
end
|
188
|
+
|
189
|
+
def invoke_hooks(obj, hook_type, method_name)
|
190
|
+
hooks[hook_type][method_name.to_sym].each { |hook| obj.send hook }
|
191
|
+
end
|
192
|
+
def invoke_arround_hooks(obj, method_name, hooks, &block)
|
193
|
+
hook = hooks.slice! 0
|
194
|
+
return block.call if hook.nil? # call original method if no more hook
|
195
|
+
|
196
|
+
# invoke the hook with lambda containing recursion
|
197
|
+
obj.send(hook.to_sym) { invoke_arround_hooks(obj, method_name, hooks, &block); }
|
198
|
+
end
|
199
|
+
|
200
|
+
end # ClassMethods2
|
201
|
+
end # Aop2
|
202
|
+
|
203
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Orientdb4r
|
2
|
+
|
3
|
+
# Version history.
|
4
|
+
VERSION_HISTORY = [
|
5
|
+
['0.5.2', '2016-09-17', "Compatible with OrientDB v2.2.x, PR #44, PR #45"],
|
6
|
+
['0.5.1', '2015-03-26', "Enh #39, PR #40"],
|
7
|
+
['0.5.0', '2015-03-03', "Compatible with OrientDB v2.x, PR #31, PR #32, PR #33"],
|
8
|
+
['0.4.1', '2013-09-03', "Enh #24, Enh #26, Enh #27"],
|
9
|
+
['0.4.0', '2013-08-14', "Closed gap between this driver and OrientDB v1.4.0+; Enh #20, BF #25"],
|
10
|
+
['0.3.3', '2012-12-16', "Enh #18, Enh #19"],
|
11
|
+
['0.3.2', '2012-11-02', "Enh #13, Enh #16"],
|
12
|
+
['0.3.1', '2012-08-27', "Timeout for reuse of dirty nodes in load balancing; BF #14, BF #15"],
|
13
|
+
['0.3.0', '2012-08-01', "Added support for cluster of distributed servers + load balancing"],
|
14
|
+
['0.2.10', '2012-07-21', "Experimental support for Excon HTTP library with Keep-Alive connection"],
|
15
|
+
['0.2.9', '2012-07-18', "Added feature Client#delete_database, New class Rid"],
|
16
|
+
['0.2.8', '2012-07-16', "New exception handling, added feature Client#create_class(:properties)"],
|
17
|
+
['0.2.7', '2012-07-07', "Added method Client#class_exists?"],
|
18
|
+
['0.2.6', '2012-07-03', "BF #8, BF #6"],
|
19
|
+
['0.2.5', '2012-07-01', "Added 'get_database' into database CRUD"],
|
20
|
+
# v-- https://groups.google.com/forum/?fromgroups#!topic/orient-database/5MAMCvFavTc
|
21
|
+
['0.2.4', '2012-06-26', "Added session management"],
|
22
|
+
['0.2.3', '2012-06-24', "Documents received by a query are kind of Orientdb4r::DocumentMetadata"],
|
23
|
+
# v-- https://groups.google.com/forum/?fromgroups#!topic/orient-database/jK4EZd068AE
|
24
|
+
# v-- https://groups.google.com/forum/?fromgroups#!topic/orient-database/nJOAsgwSnKI
|
25
|
+
['0.2.2', '2012-06-23', "Added support for server version detection [r5913]"],
|
26
|
+
['0.2.1', '2012-06-19', "Fixed linked property definition"],
|
27
|
+
['0.2.0', '2012-06-12', "Introduces document's CRUD operations"],
|
28
|
+
['0.1.2', '2012-06-10', 'Introduces new OClass module'],
|
29
|
+
['0.1.1', '2012-06-08', 'First working version (including unit tests) released at github.com'],
|
30
|
+
['0.1.0', '2012-06-02', 'Initial version on Ruby-1.9.3p194 and OrientDB-1.0.0']
|
31
|
+
]
|
32
|
+
|
33
|
+
# Current version.
|
34
|
+
VERSION = VERSION_HISTORY[0][0]
|
35
|
+
|
36
|
+
# Driver identification.
|
37
|
+
DRIVER_NAME = 'Orientdb4r Ruby Client'
|
38
|
+
|
39
|
+
end
|
data/orientdb4r.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'orientdb4r/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
|
8
|
+
s.name = %q{vagas-orientdb4r}
|
9
|
+
s.version = Orientdb4r::VERSION
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
|
12
|
+
s.authors = ['Vaclav Sykora', 'Ronie Uliana']
|
13
|
+
s.date = Orientdb4r::VERSION_HISTORY[0][1]
|
14
|
+
s.description = %q{Orientdb4r provides a simple interface on top of OrientDB's RESTful HTTP API (VAGAS.com version)}
|
15
|
+
s.email = %q{vaclav.sykora@gmail.com ronie.uliana@gmail.com}
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.extra_rdoc_files = [
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc"
|
25
|
+
]
|
26
|
+
s.homepage = %q{http://github.com/vagascom/orientdb4r}
|
27
|
+
s.rdoc_options = ['--charset=UTF-8']
|
28
|
+
s.require_paths = ['lib']
|
29
|
+
s.rubygems_version = %q{1.3.7}
|
30
|
+
s.summary = %q{Ruby binding for Orient DB.}
|
31
|
+
s.license = 'Apache License, v2.0'
|
32
|
+
|
33
|
+
s.add_dependency(%q<rest-client>, ["~> 1.7"])
|
34
|
+
|
35
|
+
s.add_development_dependency "rake", "~> 10.3"
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
###
|
4
|
+
# This class tests communication with OrientDB cluster and load balancing.
|
5
|
+
# Note: Test of binary communication.
|
6
|
+
class TestBinDatabase < Test::Unit::TestCase
|
7
|
+
|
8
|
+
DB = 'temp'
|
9
|
+
#Orientdb4r::logger.level = Logger::DEBUG
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@client = Orientdb4r.client :binary => true
|
13
|
+
end
|
14
|
+
|
15
|
+
###
|
16
|
+
# CONNECT
|
17
|
+
def test_connect
|
18
|
+
assert_nothing_thrown do @client.connect :database => DB, :user => 'admin', :password => 'admin'; end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
2
|
+
require 'orientdb4r'
|
3
|
+
|
4
|
+
CLASS = 'myclass'
|
5
|
+
|
6
|
+
client = Orientdb4r.client # equivalent for :host => 'localhost', :port => 2480, :ssl => false
|
7
|
+
|
8
|
+
client.connect :database => 'temp', :user => 'admin', :password => 'admin'
|
9
|
+
|
10
|
+
unless client.class_exists? CLASS
|
11
|
+
client.create_class(CLASS) do |c|
|
12
|
+
c.property 'prop1', :integer, :notnull => true, :min => 1, :max => 99
|
13
|
+
c.property 'prop2', :string, :mandatory => true
|
14
|
+
c.link 'users', :linkset, 'OUser' # by default: :mandatory => false, :notnull => false
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
admin = client.query("SELECT FROM OUser WHERE name = 'admin'")[0]
|
19
|
+
1.upto(5) do |i|
|
20
|
+
# insert link to admin only to first two
|
21
|
+
client.command "INSERT INTO #{CLASS} (prop1, prop2, users) VALUES (#{i}, 'text#{i}', [#{admin['@rid'] if i<3}])"
|
22
|
+
end
|
23
|
+
|
24
|
+
puts client.query "SELECT FROM #{CLASS}"
|
25
|
+
#>
|
26
|
+
|
27
|
+
puts client.query "SELECT count(*) FROM #{CLASS}"
|
28
|
+
#>
|
29
|
+
|
30
|
+
puts client.query "SELECT max(prop1) FROM #{CLASS}"
|
31
|
+
#>
|
32
|
+
|
33
|
+
puts client.query "TRAVERSE any() FROM (SELECT FROM #{CLASS} WHERE prop1 = 1)"
|
34
|
+
#>
|
35
|
+
|
36
|
+
|
37
|
+
client.drop_class CLASS
|
38
|
+
client.disconnect
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
###
|
4
|
+
# This class tests communication with OrientDB cluster and load balancing.
|
5
|
+
class TestClient < Test::Unit::TestCase
|
6
|
+
|
7
|
+
PROXY_URL = 'http://bad.domain.com'
|
8
|
+
|
9
|
+
###
|
10
|
+
# Test inintialization of corresponding client type
|
11
|
+
def test_client_type
|
12
|
+
client = Orientdb4r.client :instance => :new
|
13
|
+
assert_instance_of Orientdb4r::RestClient, client
|
14
|
+
client = Orientdb4r.client :instance => :new, :binary => true
|
15
|
+
assert_instance_of Orientdb4r::Binary::BinClient, client
|
16
|
+
end
|
17
|
+
|
18
|
+
###
|
19
|
+
# Test inintialization of single node.
|
20
|
+
def test_one_node_initialization
|
21
|
+
client = Orientdb4r.client :instance => :new
|
22
|
+
assert_not_nil client.nodes
|
23
|
+
assert_instance_of Array, client.nodes
|
24
|
+
assert_equal 1, client.nodes.size
|
25
|
+
assert_equal 2480, client.nodes[0].port
|
26
|
+
assert_equal false, client.nodes[0].ssl
|
27
|
+
end
|
28
|
+
|
29
|
+
###
|
30
|
+
# Test inintialization of more nodes.
|
31
|
+
def test_nodes_initialization
|
32
|
+
client = Orientdb4r.client :nodes => [{}, {:port => 2481}], :instance => :new
|
33
|
+
assert_not_nil client.nodes
|
34
|
+
assert_instance_of Array, client.nodes
|
35
|
+
assert_equal 2, client.nodes.size
|
36
|
+
assert_equal 2480, client.nodes[0].port
|
37
|
+
assert_equal 2481, client.nodes[1].port
|
38
|
+
assert_equal false, client.nodes[0].ssl
|
39
|
+
assert_equal false, client.nodes[1].ssl
|
40
|
+
|
41
|
+
client = Orientdb4r.client :nodes => [{}, {:port => 2481}, {:port => 2482}], :instance => :new
|
42
|
+
assert_equal 3, client.nodes.size
|
43
|
+
end
|
44
|
+
|
45
|
+
###
|
46
|
+
# Tests initialization of connection library.
|
47
|
+
def test_connection_library
|
48
|
+
# restclient
|
49
|
+
client = Orientdb4r.client :instance => :new
|
50
|
+
assert_equal :restclient, client.connection_library
|
51
|
+
assert_instance_of Orientdb4r::RestClientNode, client.nodes[0]
|
52
|
+
|
53
|
+
# excon
|
54
|
+
if Gem::Specification::find_all_by_name('excon').any?
|
55
|
+
client = Orientdb4r.client :connection_library => :excon, :instance => :new
|
56
|
+
assert_equal :excon, client.connection_library
|
57
|
+
assert_instance_of Orientdb4r::ExconNode, client.nodes[0]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
###
|
62
|
+
# Tests initialization of proxy.
|
63
|
+
def test_proxy
|
64
|
+
# no proxy - resclient
|
65
|
+
client = Orientdb4r.client :instance => :new
|
66
|
+
assert_nil client.proxy
|
67
|
+
assert_nil RestClient.proxy
|
68
|
+
|
69
|
+
# proxy - restclient
|
70
|
+
client = Orientdb4r.client :proxy => PROXY_URL, :instance => :new
|
71
|
+
assert_equal PROXY_URL, client.proxy
|
72
|
+
assert_equal PROXY_URL, RestClient.proxy
|
73
|
+
assert_raise Orientdb4r::ConnectionError do
|
74
|
+
client.connect :database => 'temp', :user => 'admin', :password => 'admin'
|
75
|
+
end
|
76
|
+
RestClient.proxy = nil # restore no setting
|
77
|
+
|
78
|
+
if Gem::Specification::find_all_by_name('excon').any?
|
79
|
+
# no proxy - excon
|
80
|
+
client = Orientdb4r.client :connection_library => :excon, :instance => :new
|
81
|
+
assert_nil client.proxy
|
82
|
+
assert_nil client.nodes[0].proxy
|
83
|
+
|
84
|
+
# proxy - excon
|
85
|
+
client = Orientdb4r.client :connection_library => :excon, :proxy => PROXY_URL, :instance => :new
|
86
|
+
assert_equal PROXY_URL, client.proxy
|
87
|
+
assert_equal PROXY_URL, client.nodes[0].proxy
|
88
|
+
assert_raise Orientdb4r::ConnectionError do
|
89
|
+
client.connect :database => 'temp', :user => 'admin', :password => 'admin'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
###
|
4
|
+
# This class tests DB management.
|
5
|
+
class TestDatabase < Test::Unit::TestCase
|
6
|
+
|
7
|
+
DB = 'temp'
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@client = Orientdb4r.client
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
if @client.database_exists? :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
15
|
+
@client.delete_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
16
|
+
end
|
17
|
+
@client.disconnect
|
18
|
+
end
|
19
|
+
|
20
|
+
###
|
21
|
+
# CONNECT
|
22
|
+
def test_connect
|
23
|
+
assert_nothing_thrown do @client.connect :database => DB, :user => 'admin', :password => 'admin'; end
|
24
|
+
rslt = @client.connect :database => DB, :user => 'admin', :password => 'admin'
|
25
|
+
assert_instance_of TrueClass, rslt
|
26
|
+
|
27
|
+
assert_equal 'admin', @client.user
|
28
|
+
assert_equal 'admin', @client.password
|
29
|
+
assert_equal DB, @client.database
|
30
|
+
|
31
|
+
# connection refused
|
32
|
+
client = Orientdb4r.client :port => 2840, :instance => :new
|
33
|
+
assert_raise Orientdb4r::ConnectionError do
|
34
|
+
client.connect :database => DB, :user => 'admin', :password => 'admin'
|
35
|
+
end
|
36
|
+
|
37
|
+
# bad DB name
|
38
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
39
|
+
@client.connect :database => 'unknown_db', :user => 'admin', :password => 'admin'
|
40
|
+
end
|
41
|
+
# !!! curl -v --user admin:adminX http://localhost:2480/connect/foo/bar
|
42
|
+
# # bad DB name with '/' => wrong REST resource
|
43
|
+
# assert_raise Orientdb4r::ServerError do
|
44
|
+
# @client.connect :database => 'temp/temp', :user => 'admin', :password => 'admin'
|
45
|
+
# end
|
46
|
+
# bad credentials
|
47
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
48
|
+
@client.connect :database => DB, :user => 'admin1', :password => 'admin'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
###
|
54
|
+
# DISCONNECT
|
55
|
+
def test_disconnect
|
56
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
57
|
+
assert @client.connected?
|
58
|
+
assert_nothing_thrown do @client.disconnect; end
|
59
|
+
assert !@client.connected?
|
60
|
+
# unable to query after disconnect
|
61
|
+
assert_raise Orientdb4r::ConnectionError do @client.query 'SELECT FROM OUser'; end
|
62
|
+
|
63
|
+
assert_nil @client.user
|
64
|
+
assert_nil @client.password
|
65
|
+
assert_nil @client.database
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
###
|
70
|
+
# CREATE DATABASE
|
71
|
+
def test_create_database
|
72
|
+
# bad options
|
73
|
+
assert_raise ArgumentError do @client.create_database(:database => 'UniT', :storage => :foo); end
|
74
|
+
assert_raise ArgumentError do @client.create_database(:database => 'UniT', :type => :foo); end
|
75
|
+
|
76
|
+
assert_nothing_thrown do
|
77
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
78
|
+
end
|
79
|
+
assert_nothing_thrown do
|
80
|
+
@client.get_database :database => 'UniT', :user => 'admin', :password => 'admin'
|
81
|
+
end
|
82
|
+
# creating an existing DB
|
83
|
+
assert_raise Orientdb4r::StateConflictError do
|
84
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
85
|
+
end
|
86
|
+
# insufficient rights
|
87
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
88
|
+
@client.create_database :database => 'UniT1', :user => 'admin', :password => 'admin'
|
89
|
+
end
|
90
|
+
|
91
|
+
# By convention 3 users are always created by default every time you create a new database.
|
92
|
+
# Default users are: admin, reader, writer
|
93
|
+
assert_nothing_thrown do
|
94
|
+
@client.connect :database => 'UniT', :user => 'admin', :password => 'admin'
|
95
|
+
end
|
96
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => DB_ROOT_PASS})
|
97
|
+
|
98
|
+
# create non-default DB: storage=local;type=graph
|
99
|
+
assert_nothing_thrown do
|
100
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS, :storage => :plocal, :type => :graph
|
101
|
+
@client.delete_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
###
|
107
|
+
# GET DATABASE
|
108
|
+
def test_get_database
|
109
|
+
# not connected - allowed with additional authentication
|
110
|
+
assert_nothing_thrown do @client.get_database :database => DB, :user => 'admin', :password => 'admin' ; end
|
111
|
+
assert_raise Orientdb4r::ConnectionError do @client.get_database; end
|
112
|
+
# connected
|
113
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
114
|
+
assert_nothing_thrown do @client.get_database; end # gets info about connected DB
|
115
|
+
|
116
|
+
rslt = @client.get_database
|
117
|
+
assert_not_nil rslt
|
118
|
+
assert_instance_of Hash, rslt
|
119
|
+
assert !rslt.empty?
|
120
|
+
# server
|
121
|
+
assert rslt.include? 'server'
|
122
|
+
assert_instance_of Hash, rslt['server']
|
123
|
+
assert !rslt['server'].empty?
|
124
|
+
assert rslt['server'].include? 'version'
|
125
|
+
# classes
|
126
|
+
assert rslt.include? 'classes'
|
127
|
+
assert_instance_of Array, rslt['classes']
|
128
|
+
assert !rslt['classes'].empty?
|
129
|
+
|
130
|
+
# bad databases
|
131
|
+
assert_raise Orientdb4r::UnauthorizedError do @client.get_database :database => 'UnknownDB'; end
|
132
|
+
assert_raise Orientdb4r::ServerError do @client.get_database :database => 'temp/admin'; end # bad REST resource
|
133
|
+
|
134
|
+
|
135
|
+
# database_exists?
|
136
|
+
assert @client.database_exists?(:database => DB, :user => 'admin', :password => 'admin')
|
137
|
+
assert @client.database_exists?(:database => DB) # use credentials of logged in user
|
138
|
+
assert !@client.database_exists?(:database => 'UnknownDB')
|
139
|
+
assert !@client.database_exists?(:database => 'temp/admin')
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
###
|
144
|
+
# DELETE DATABASE
|
145
|
+
def test_delete_database
|
146
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
147
|
+
|
148
|
+
# deleting non-existing DB
|
149
|
+
assert_raise Orientdb4r::ServerError do
|
150
|
+
@client.delete_database :database => 'UniT1', :user => 'root', :password => DB_ROOT_PASS
|
151
|
+
end
|
152
|
+
# insufficient rights
|
153
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
154
|
+
@client.delete_database :database => 'UniT', :user => 'admin', :password => 'admin'
|
155
|
+
end
|
156
|
+
|
157
|
+
assert_nothing_thrown do
|
158
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => DB_ROOT_PASS})
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
###
|
164
|
+
# SERVER info
|
165
|
+
def xtest_server
|
166
|
+
# admin/admin has not 'server.info' resource access in standard installation
|
167
|
+
assert_raise Orientdb4r::OrientdbError do @client.server :user => 'admin', :password => 'admin'; end
|
168
|
+
|
169
|
+
assert_nothing_thrown do @client.server :user => 'root', :password => DB_ROOT_PASS; end
|
170
|
+
rslt = @client.server :user => 'root', :password => DB_ROOT_PASS
|
171
|
+
assert_instance_of Hash, rslt
|
172
|
+
assert rslt.include? 'connections'
|
173
|
+
assert_not_nil rslt['connections']
|
174
|
+
end
|
175
|
+
|
176
|
+
|
177
|
+
###
|
178
|
+
# GET List Databases
|
179
|
+
# Retrieves the available databases.
|
180
|
+
def test_list_databases
|
181
|
+
dbs = @client.list_databases :user => 'root', :password => DB_ROOT_PASS
|
182
|
+
assert_not_nil dbs
|
183
|
+
assert_instance_of Array, dbs
|
184
|
+
assert !dbs.empty?
|
185
|
+
assert dbs.include? DB
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
###
|
190
|
+
# Test of :assert_connected before advice.
|
191
|
+
def test_assert_connected
|
192
|
+
@client.disconnect if @client.connected? # to be sure it this method is called as first in this TestCase and thread local client is still connected
|
193
|
+
assert_raise Orientdb4r::ConnectionError do @client.query 'SELECT FROM OUser'; end
|
194
|
+
assert_raise Orientdb4r::ConnectionError do @client.command "INSERT INTO OUser(name) VALUES('x')"; end
|
195
|
+
assert_raise Orientdb4r::ConnectionError do @client.gremlin("g.addVertex('class:X', 'prop1', 1, 'prop2', 'string1')"); end
|
196
|
+
assert_raise Orientdb4r::ConnectionError do @client.batch({:transaction => true, :operations => []}); end
|
197
|
+
#BF #21 assert_raise Orientdb4r::ConnectionError do @client.create_class 'x'; end
|
198
|
+
assert_raise Orientdb4r::ConnectionError do @client.create_property 'x', 'prop', :boolean; end
|
199
|
+
assert_raise Orientdb4r::ConnectionError do @client.class_exists? 'x'; end
|
200
|
+
assert_raise Orientdb4r::ConnectionError do @client.get_class 'x'; end
|
201
|
+
assert_raise Orientdb4r::ConnectionError do @client.drop_class 'x'; end
|
202
|
+
assert_raise Orientdb4r::ConnectionError do @client.create_document({ '@class' => 'x', :prop => 1 }); end
|
203
|
+
assert_raise Orientdb4r::ConnectionError do @client.get_document('#1:0'); end
|
204
|
+
assert_raise Orientdb4r::ConnectionError do @client.update_document({}); end
|
205
|
+
assert_raise Orientdb4r::ConnectionError do @client.delete_document('#1:0'); end
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
###
|
210
|
+
# Tests using of session ID.
|
211
|
+
def test_session_id
|
212
|
+
client = Orientdb4r.client :instance => :new
|
213
|
+
assert_nil client.nodes[0].session_id
|
214
|
+
client.connect :database => DB, :user => 'admin', :password => 'admin'
|
215
|
+
session_id = client.nodes[0].session_id
|
216
|
+
assert_not_nil session_id
|
217
|
+
client.query 'SELECT count(*) FROM OUser'
|
218
|
+
assert_equal session_id, client.nodes[0].session_id
|
219
|
+
client.get_class 'OUser'
|
220
|
+
assert_equal session_id, client.nodes[0].session_id
|
221
|
+
client.disconnect
|
222
|
+
assert_nil client.nodes[0].session_id
|
223
|
+
end
|
224
|
+
|
225
|
+
|
226
|
+
###
|
227
|
+
# EXPORT
|
228
|
+
def test_export
|
229
|
+
client = Orientdb4r.client :instance => :new
|
230
|
+
|
231
|
+
# export of connected database
|
232
|
+
client.connect :database => DB, :user => 'admin', :password => 'admin'
|
233
|
+
rslt = client.export
|
234
|
+
assert File.exist? './temp.gz'
|
235
|
+
assert File.file? './temp.gz'
|
236
|
+
assert 'temp.gz', rslt
|
237
|
+
File.delete './temp.gz'
|
238
|
+
|
239
|
+
# export with given file
|
240
|
+
given_filename = "#{Dir.tmpdir}/TEMP.gz"
|
241
|
+
client.export :file => given_filename
|
242
|
+
assert File.exist? given_filename
|
243
|
+
assert File.file? given_filename
|
244
|
+
assert given_filename, rslt
|
245
|
+
|
246
|
+
# explicit given DB
|
247
|
+
client.disconnect
|
248
|
+
assert_nothing_thrown do
|
249
|
+
client.export :database => DB, :user => 'admin', :password => 'admin', :file => given_filename
|
250
|
+
end
|
251
|
+
# unknow DB
|
252
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
253
|
+
client.export :database => 'unknown', :user => 'admin', :password => 'admin'
|
254
|
+
end
|
255
|
+
# bad password
|
256
|
+
assert_raise Orientdb4r::UnauthorizedError do
|
257
|
+
client.export :database => DB, :user => 'admin', :password => 'unknown'
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|