orientdb4r 0.5.0 → 0.5.1
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.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.travis.yml +18 -0
- data/Gemfile +7 -1
- data/README.rdoc +14 -2
- data/Rakefile +1 -1
- data/changelog.txt +2 -2
- data/ci/initialize-ci.sh +36 -0
- data/lib/orientdb4r.rb +5 -2
- data/lib/orientdb4r/bin/client.rb +85 -41
- data/lib/orientdb4r/rest/client.rb +23 -1
- data/lib/orientdb4r/version.rb +4 -0
- data/test/test_client.rb +9 -5
- data/test/test_database.rb +23 -19
- data/test/test_ddo.rb +1 -4
- data/test/test_dmo.rb +1 -5
- data/test/test_document_crud.rb +44 -5
- data/test/test_gremlin.rb +52 -0
- data/test/test_helper.rb +10 -0
- data/test/test_loadbalancing.rb +1 -6
- data/test/test_utils.rb +1 -3
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef3c2e518a837fac1f341da1ffca84fd1ee7f877
|
4
|
+
data.tar.gz: 20ee3236031b5646d5d78c9e7b9f791c2fd6d87a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 846e581d9549b7e4222defcb53927b4e18f3e2ae04167d512105c98a31ae5d5fdfdfb8f3c51c6e096d1b14457bf9f6436db335a62d653f4384e9a2a5b7b7d13d
|
7
|
+
data.tar.gz: ba76c836fbab42889d172f26ea380ff2977fb34cf51caff38e1893fb66e6628a2ea449e53f49b546aca41a27acac26e1d0787eab5f4421cdd105a0ec166b5509
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
repo_token: qXflXiEwfGyJ5xCCGo8z0xloVYmUCZoyM
|
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.2.0
|
4
|
+
|
5
|
+
before_script:
|
6
|
+
- chmod +x ./ci/initialize-ci.sh
|
7
|
+
- ./ci/initialize-ci.sh $ORIENTDB_VERSION
|
8
|
+
- bundle exec rake db:setup4test
|
9
|
+
|
10
|
+
env:
|
11
|
+
- ORIENTDB_VERSION=2.0.4
|
12
|
+
|
13
|
+
notifications:
|
14
|
+
email:
|
15
|
+
recipients:
|
16
|
+
- vaclav.sykora@gmail.com
|
17
|
+
on_success: change
|
18
|
+
on_failure: change
|
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -9,6 +9,10 @@
|
|
9
9
|
|
10
10
|
A Ruby client for the NoSQL Graph/Document database Orient DB (http://orientdb.org).
|
11
11
|
|
12
|
+
{<img src="https://badge.fury.io/rb/orientdb4r.svg" alt="Gem Version" />}[http://badge.fury.io/rb/orientdb4r]
|
13
|
+
{<img src="https://secure.travis-ci.org/veny/orientdb4r.png" alt="Build Status" />}[http://travis-ci.org/veny/orientdb4r]
|
14
|
+
{<img src="https://coveralls.io/repos/veny/orientdb4r/badge.svg?branch=master" alt="Coverage Status" />}[https://coveralls.io/r/veny/orientdb4r?branch=master]
|
15
|
+
|
12
16
|
== USAGE
|
13
17
|
|
14
18
|
see Wiki page for more sample at https://github.com/veny/orientdb4r/wiki
|
@@ -75,7 +79,7 @@ see Wiki page for more sample at https://github.com/veny/orientdb4r/wiki
|
|
75
79
|
|
76
80
|
=== Important Upgrade Notice
|
77
81
|
|
78
|
-
* see changelog.txt
|
82
|
+
* see +changelog.txt+
|
79
83
|
|
80
84
|
|
81
85
|
== FEATURES/PROBLEMS
|
@@ -98,7 +102,7 @@ see Wiki page for more sample at https://github.com/veny/orientdb4r/wiki
|
|
98
102
|
|
99
103
|
Make sure before starting the tests:
|
100
104
|
* database server is running on localhost:2480
|
101
|
-
* there is a root account with username=root and password=root
|
105
|
+
* there is a root account with username=root and password=root; if your password is different, specify it with an `ORIENTDB_ROOT_PASS` environment variable
|
102
106
|
|
103
107
|
|
104
108
|
== AUTHOR
|
@@ -110,3 +114,11 @@ Make sure before starting the tests:
|
|
110
114
|
|
111
115
|
* Apache License, Version 2.0, http://www.apache.org/licenses/
|
112
116
|
* see LICENSE file for more details...
|
117
|
+
|
118
|
+
== CONTRIBUTING
|
119
|
+
|
120
|
+
1. Fork it ( https://github.com/veny/orientdb4r/fork )
|
121
|
+
1. Create your feature branch ( <tt>git checkout -b my-new-feature</tt> )
|
122
|
+
1. Commit your changes ( <tt>git commit -am 'Add some feature'</tt> )
|
123
|
+
1. Push to the branch ( <tt>git push origin my-new-feature</tt> )
|
124
|
+
1. Create a new Pull Request
|
data/Rakefile
CHANGED
data/changelog.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
0.5.0 2015-03-02
|
2
2
|
- Provides fixes to be fully compatible with OrientDb v2.x.
|
3
|
-
- No more backward compatible with OrientDb v1.5.x and lesser
|
3
|
+
- No more backward compatible with OrientDb v1.5.x and lesser
|
4
4
|
- Pull Request #31 : rest-client 1.6.7 => 1.7.x
|
5
5
|
- Pull Request #32 : Add Gemfile & rake as a dev dependency
|
6
6
|
- Pull Request #33 : Fix content type header for rest-client
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
0.4.0 2013-08-14
|
16
16
|
- Closes gap between this driver and OrientDb v1.4.0+ which introduced some changes on REST API (connect & create_document).
|
17
|
-
- No more backward compatible with OrientDb v1.3.x and lesser
|
17
|
+
- No more backward compatible with OrientDb v1.3.x and lesser
|
18
18
|
- Enhancement #20 : Method 'compare_versions' accepts a block now
|
19
19
|
- Bug Fix #25
|
20
20
|
|
data/ci/initialize-ci.sh
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
PARENT_DIR=$(dirname $(cd "$(dirname "$0")"; pwd))
|
4
|
+
CI_DIR="$PARENT_DIR/ci/environment"
|
5
|
+
#CI_DIR=/tmp/travis
|
6
|
+
|
7
|
+
ODB_VERSION=${1:-"2.0.4"}
|
8
|
+
ODB_DIR="${CI_DIR}/orientdb-community-${ODB_VERSION}"
|
9
|
+
ODB_LAUNCHER="${ODB_DIR}/bin/server.sh"
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
echo "=== Initializing CI environment ==="
|
14
|
+
cd "$PARENT_DIR"
|
15
|
+
mkdir -p $CI_DIR
|
16
|
+
|
17
|
+
echo "--- Downloading OrientDB v${ODB_VERSION} ---"
|
18
|
+
wget -q -O "$CI_DIR/orientdb-community-${ODB_VERSION}.tar.gz" "http://www.orientechnologies.com/download.php?email=unknown@unknown.com&file=orientdb-community-${ODB_VERSION}.tar.gz&os=linux"
|
19
|
+
|
20
|
+
echo "--- Unpacking ---------------------"
|
21
|
+
tar xf $CI_DIR/orientdb-community-${ODB_VERSION}.tar.gz -C $CI_DIR
|
22
|
+
|
23
|
+
echo "--- Setting up --------------------"
|
24
|
+
chmod +x $ODB_LAUNCHER
|
25
|
+
chmod -R +rw "${ODB_DIR}/config/"
|
26
|
+
ODB_ADMIN="<users><user resources=\"*\" password=\"root\" name=\"root\"/></users>"
|
27
|
+
sed "s:^[ \t]*<users.*$: $ODB_ADMIN:" -i ${ODB_DIR}/config/orientdb-server-config.xml
|
28
|
+
sed "s:^[ \t]*<\/users.*$: <!-- \/users -->:" -i ${ODB_DIR}/config/orientdb-server-config.xml
|
29
|
+
sed "s:^handlers = .*$:handlers = java.util.logging.ConsoleHandler:" -i ${ODB_DIR}/config/orientdb-server-log.properties
|
30
|
+
|
31
|
+
echo "--- Starting server ---------------"
|
32
|
+
sh -c $ODB_LAUNCHER </dev/null &>/dev/null &
|
33
|
+
|
34
|
+
# Wait a bit for OrientDB to finish the initialization phase.
|
35
|
+
sleep 5
|
36
|
+
printf "=== The CI environment has been initialized ===\n"
|
data/lib/orientdb4r.rb
CHANGED
@@ -31,14 +31,17 @@ module Orientdb4r
|
|
31
31
|
# Gets a new database client or an existing for the current thread.
|
32
32
|
# === options
|
33
33
|
# * :instance => :new
|
34
|
+
# * :binary => true
|
35
|
+
# * :connection_library => :restclient | :excon
|
34
36
|
def client options={}
|
35
37
|
if :new == options[:instance]
|
36
38
|
options.delete :instance
|
37
|
-
return RestClient.new
|
39
|
+
return options.delete(:binary) ? BinClient.new(options) : RestClient.new(options)
|
38
40
|
end
|
39
41
|
|
40
42
|
Thread.exclusive {
|
41
|
-
|
43
|
+
client = options.delete(:binary) ? BinClient.new(options) : RestClient.new(options)
|
44
|
+
Thread.current[:orientdb_client] ||= client
|
42
45
|
#Thread.current[:orientdb_client] ||= BinClient.new options
|
43
46
|
}
|
44
47
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'bindata'
|
3
|
+
require 'orientdb4r/bin/constants'
|
4
|
+
require 'orientdb4r/bin/protocol_factory'
|
3
5
|
|
4
6
|
module Orientdb4r
|
5
7
|
|
6
8
|
###
|
7
9
|
# This client implements the binary protocol.
|
8
10
|
class BinClient < Client
|
9
|
-
|
11
|
+
include BinConstants
|
10
12
|
|
11
13
|
def initialize(options) #:nodoc:
|
12
14
|
super()
|
@@ -30,19 +32,28 @@ module Orientdb4r
|
|
30
32
|
@password = options[:password]
|
31
33
|
|
32
34
|
socket = TCPSocket.open(@host, @port)
|
33
|
-
|
35
|
+
protocol_version = BinData::Int16be.read(socket).to_i
|
36
|
+
|
37
|
+
Orientdb4r::logger.info "Binary protocol version: #{protocol_version}"
|
34
38
|
|
35
|
-
|
39
|
+
# check minimal protocol version which is supported
|
40
|
+
#raise ConnectionError, "Protocols >= #{MINIMAL_PROTOCOL_VERSION} are supported. Please upgrade your OrientDb server." if protocol_version < MINIMAL_PROTOCOL_VERSION
|
41
|
+
protocol = ProtocolFactory.get_protocol(protocol_version)
|
36
42
|
|
37
|
-
command = DbOpen.new
|
38
|
-
command.
|
39
|
-
command.
|
40
|
-
command.user =
|
41
|
-
command.password =
|
43
|
+
command = protocol::DbOpen.new
|
44
|
+
command.protocol_version = protocol_version
|
45
|
+
command.db_name = @database
|
46
|
+
command.user = @user
|
47
|
+
command.password = @password
|
42
48
|
command.write(socket)
|
43
49
|
|
44
|
-
|
45
|
-
|
50
|
+
read_response(socket)
|
51
|
+
|
52
|
+
resp = { :session => read_integer(socket) }
|
53
|
+
|
54
|
+
# status = BinData::Int8.read(socket)
|
55
|
+
# session = BinData::Int32be.read(socket).to_i
|
56
|
+
puts "EE resp = #{resp.inspect}"
|
46
57
|
|
47
58
|
socket.close
|
48
59
|
end
|
@@ -56,42 +67,75 @@ module Orientdb4r
|
|
56
67
|
raise NotImplementedError, 'this should be overridden by concrete client'
|
57
68
|
end
|
58
69
|
|
59
|
-
class ProtocolString < BinData::Primitive
|
60
|
-
endian :big
|
61
70
|
|
62
|
-
|
63
|
-
|
71
|
+
# class Connect < BinData::Record
|
72
|
+
# endian :big
|
73
|
+
|
74
|
+
# int8 :operation, :value => 2
|
75
|
+
# int32 :session, :value => -1
|
76
|
+
# protocol_string :driver, :value => 'Orientdb4r Ruby Client'
|
77
|
+
# protocol_string :driver_version, :value => Orientdb4r::VERSION
|
78
|
+
# int16 :version
|
79
|
+
# protocol_string :client_id
|
80
|
+
# protocol_string :user
|
81
|
+
# protocol_string :password
|
82
|
+
# end
|
83
|
+
# class DbOpen < BinData::Record
|
84
|
+
# endian :big
|
85
|
+
|
86
|
+
# int8 :operation, :value => 3 #Orientdb4r::BinConstants::REQUEST_DB_OPEN
|
87
|
+
# int32 :session, :value => -1
|
88
|
+
|
89
|
+
# protocol_string :driver_name, :value => Orientdb4r::DRIVER_NAME
|
90
|
+
# protocol_string :driver_version, :value => Orientdb4r::VERSION
|
91
|
+
# int16 :protocol_version
|
92
|
+
# protocol_string :client_id
|
93
|
+
# protocol_string :serialization_impl, :value => 'ORecordDocument2csv'
|
94
|
+
# int8 :token_based, :value => 0
|
95
|
+
# protocol_string :db_name
|
96
|
+
# protocol_string :db_type, :value => 'document'
|
97
|
+
# protocol_string :user
|
98
|
+
# protocol_string :password
|
99
|
+
# end
|
100
|
+
# ------------------------------------------------------------------ Helpers
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# Gets a hash of parameters.
|
105
|
+
def params(args = {})
|
106
|
+
args.merge({ session: connection.session })
|
107
|
+
end
|
64
108
|
|
65
|
-
|
66
|
-
|
109
|
+
def read_response(socket)
|
110
|
+
result = BinData::Int8.read(socket).to_i
|
111
|
+
raise_response_error(socket) unless result == Status::OK
|
67
112
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
protocol_string :client_id
|
78
|
-
protocol_string :database
|
79
|
-
protocol_string :user
|
80
|
-
protocol_string :password
|
81
|
-
end
|
82
|
-
class Connect < BinData::Record
|
83
|
-
endian :big
|
84
|
-
|
85
|
-
int8 :operation, :value => 2
|
86
|
-
int32 :session, :value => -1 #NEW_SESSION
|
87
|
-
protocol_string :driver, :value => 'Orientdb4r Ruby Client'
|
88
|
-
protocol_string :driver_version, :value => Orientdb4r::VERSION
|
89
|
-
int16 :version
|
90
|
-
protocol_string :client_id
|
91
|
-
protocol_string :user
|
92
|
-
protocol_string :password
|
113
|
+
def raise_response_error(socket)
|
114
|
+
session = read_integer(socket)
|
115
|
+
exceptions = []
|
116
|
+
|
117
|
+
while (result = read_byte(socket)) == Status::ERROR
|
118
|
+
exceptions << {
|
119
|
+
:exception_class => read_string(socket),
|
120
|
+
:exception_message => read_string(socket)
|
121
|
+
}
|
93
122
|
end
|
94
123
|
|
124
|
+
Orientdb4r::logger.error "exception(s): #{exceptions}"
|
125
|
+
|
126
|
+
# if exceptions[0] && exceptions[0][:exception_class] == "com.orientechnologies.orient.core.exception.ORecordNotFoundException"
|
127
|
+
# raise RecordNotFound.new(session)
|
128
|
+
# else
|
129
|
+
# raise ServerError.new(session, *exceptions)
|
130
|
+
# end
|
131
|
+
end
|
132
|
+
def read_integer(socket)
|
133
|
+
BinData::Int32be.read(socket).to_i
|
134
|
+
end
|
135
|
+
def read_byte(socket)
|
136
|
+
BinData::Int8.read(socket).to_i
|
137
|
+
end
|
138
|
+
|
95
139
|
end
|
96
140
|
|
97
141
|
end
|
@@ -4,7 +4,7 @@ module Orientdb4r
|
|
4
4
|
include Aop2
|
5
5
|
|
6
6
|
|
7
|
-
before [:query, :command], :assert_connected
|
7
|
+
before [:query, :command, :gremlin, :batch], :assert_connected
|
8
8
|
before [:create_class, :get_class, :class_exists?, :drop_class, :create_property], :assert_connected
|
9
9
|
before [:create_document, :get_document, :update_document, :delete_document], :assert_connected
|
10
10
|
around [:query, :command], :time_around
|
@@ -290,6 +290,20 @@ module Orientdb4r
|
|
290
290
|
rslt
|
291
291
|
end
|
292
292
|
|
293
|
+
###
|
294
|
+
# Executes a Gremlin command against the database.
|
295
|
+
def gremlin(gremlin)
|
296
|
+
raise ArgumentError, 'gremlin query is blank' if blank? gremlin
|
297
|
+
response = call_server(:method => :post, :uri => "command/#{@database}/gremlin/#{CGI::escape(gremlin)}")
|
298
|
+
entries = process_response(response) do
|
299
|
+
raise NotFoundError, 'record not found' if response.body =~ /ORecordNotFoundException/
|
300
|
+
end
|
301
|
+
|
302
|
+
rslt = entries['result']
|
303
|
+
# mixin all document entries (they have '@class' attribute)
|
304
|
+
rslt.each { |doc| doc.extend Orientdb4r::DocumentMetadata unless doc['@class'].nil? }
|
305
|
+
rslt
|
306
|
+
end
|
293
307
|
|
294
308
|
def command(sql) #:nodoc:
|
295
309
|
raise ArgumentError, 'command is blank' if blank? sql
|
@@ -297,6 +311,14 @@ module Orientdb4r
|
|
297
311
|
process_response(response)
|
298
312
|
end
|
299
313
|
|
314
|
+
###
|
315
|
+
# Executes a batch of operations in a single call.
|
316
|
+
def batch(operations)
|
317
|
+
response = call_server(:method => :post, :uri => "batch/#{@database}", \
|
318
|
+
:content_type => 'application/json', :data => operations.to_json)
|
319
|
+
process_response(response)
|
320
|
+
end
|
321
|
+
|
300
322
|
|
301
323
|
# -------------------------------------------------------------------- CLASS
|
302
324
|
|
data/lib/orientdb4r/version.rb
CHANGED
@@ -2,6 +2,7 @@ module Orientdb4r
|
|
2
2
|
|
3
3
|
# Version history.
|
4
4
|
VERSION_HISTORY = [
|
5
|
+
['0.5.1', '2015-03-26', "Enh #39, PR #40"],
|
5
6
|
['0.5.0', '2015-03-03', "Compatible with OrientDB v2.x, PR #31, PR #32, PR #33"],
|
6
7
|
['0.4.1', '2013-09-03', "Enh #24, Enh #26, Enh #27"],
|
7
8
|
['0.4.0', '2013-08-14', "Closed gap between this driver and OrientDB v1.4.0+; Enh #20, BF #25"],
|
@@ -31,4 +32,7 @@ module Orientdb4r
|
|
31
32
|
# Current version.
|
32
33
|
VERSION = VERSION_HISTORY[0][0]
|
33
34
|
|
35
|
+
# Driver identification.
|
36
|
+
DRIVER_NAME = 'Orientdb4r Ruby Client'
|
37
|
+
|
34
38
|
end
|
data/test/test_client.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests communication with OrientDB cluster and load balancing.
|
7
5
|
class TestClient < Test::Unit::TestCase
|
8
6
|
|
9
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
10
|
-
|
11
7
|
PROXY_URL = 'http://bad.domain.com'
|
12
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::BinClient, client
|
16
|
+
end
|
13
17
|
|
14
18
|
###
|
15
19
|
# Test inintialization of single node.
|
data/test/test_database.rb
CHANGED
@@ -1,18 +1,22 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests DB management.
|
7
5
|
class TestDatabase < Test::Unit::TestCase
|
8
6
|
|
9
7
|
DB = 'temp'
|
10
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
11
8
|
|
12
9
|
def setup
|
13
10
|
@client = Orientdb4r.client
|
14
11
|
end
|
15
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
|
+
|
16
20
|
###
|
17
21
|
# CONNECT
|
18
22
|
def test_connect
|
@@ -43,9 +47,6 @@ class TestDatabase < Test::Unit::TestCase
|
|
43
47
|
assert_raise Orientdb4r::UnauthorizedError do
|
44
48
|
@client.connect :database => DB, :user => 'admin1', :password => 'admin'
|
45
49
|
end
|
46
|
-
|
47
|
-
# clean up
|
48
|
-
@client.disconnect
|
49
50
|
end
|
50
51
|
|
51
52
|
|
@@ -73,14 +74,14 @@ class TestDatabase < Test::Unit::TestCase
|
|
73
74
|
assert_raise ArgumentError do @client.create_database(:database => 'UniT', :type => :foo); end
|
74
75
|
|
75
76
|
assert_nothing_thrown do
|
76
|
-
@client.create_database :database => 'UniT', :user => 'root', :password =>
|
77
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
77
78
|
end
|
78
79
|
assert_nothing_thrown do
|
79
80
|
@client.get_database :database => 'UniT', :user => 'admin', :password => 'admin'
|
80
81
|
end
|
81
82
|
# creating an existing DB
|
82
83
|
assert_raise Orientdb4r::ServerError do
|
83
|
-
@client.create_database :database => 'UniT', :user => 'root', :password =>
|
84
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
84
85
|
end
|
85
86
|
# insufficient rights
|
86
87
|
assert_raise Orientdb4r::UnauthorizedError do
|
@@ -92,12 +93,12 @@ class TestDatabase < Test::Unit::TestCase
|
|
92
93
|
assert_nothing_thrown do
|
93
94
|
@client.connect :database => 'UniT', :user => 'admin', :password => 'admin'
|
94
95
|
end
|
95
|
-
@client.delete_database({:database => 'UniT', :user => 'root', :password =>
|
96
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => DB_ROOT_PASS})
|
96
97
|
|
97
98
|
# create non-default DB: storage=local;type=graph
|
98
99
|
assert_nothing_thrown do
|
99
|
-
@client.create_database :database => 'UniT', :user => 'root', :password =>
|
100
|
-
@client.delete_database :database => 'UniT', :user => 'root', :password =>
|
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
|
101
102
|
end
|
102
103
|
end
|
103
104
|
|
@@ -142,11 +143,11 @@ class TestDatabase < Test::Unit::TestCase
|
|
142
143
|
###
|
143
144
|
# DELETE DATABASE
|
144
145
|
def test_delete_database
|
145
|
-
@client.create_database :database => 'UniT', :user => 'root', :password =>
|
146
|
+
@client.create_database :database => 'UniT', :user => 'root', :password => DB_ROOT_PASS
|
146
147
|
|
147
148
|
# deleting non-existing DB
|
148
149
|
assert_raise Orientdb4r::ServerError do
|
149
|
-
@client.delete_database :database => 'UniT1', :user => 'root', :password =>
|
150
|
+
@client.delete_database :database => 'UniT1', :user => 'root', :password => DB_ROOT_PASS
|
150
151
|
end
|
151
152
|
# insufficient rights
|
152
153
|
assert_raise Orientdb4r::UnauthorizedError do
|
@@ -154,7 +155,7 @@ class TestDatabase < Test::Unit::TestCase
|
|
154
155
|
end
|
155
156
|
|
156
157
|
assert_nothing_thrown do
|
157
|
-
@client.delete_database({:database => 'UniT', :user => 'root', :password =>
|
158
|
+
@client.delete_database({:database => 'UniT', :user => 'root', :password => DB_ROOT_PASS})
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|
@@ -165,8 +166,8 @@ class TestDatabase < Test::Unit::TestCase
|
|
165
166
|
# admin/admin has not 'server.info' resource access in standard installation
|
166
167
|
assert_raise Orientdb4r::OrientdbError do @client.server :user => 'admin', :password => 'admin'; end
|
167
168
|
|
168
|
-
assert_nothing_thrown do @client.server :user => 'root', :password =>
|
169
|
-
rslt = @client.server :user => 'root', :password =>
|
169
|
+
assert_nothing_thrown do @client.server :user => 'root', :password => DB_ROOT_PASS; end
|
170
|
+
rslt = @client.server :user => 'root', :password => DB_ROOT_PASS
|
170
171
|
assert_instance_of Hash, rslt
|
171
172
|
assert rslt.include? 'connections'
|
172
173
|
assert_not_nil rslt['connections']
|
@@ -177,7 +178,7 @@ class TestDatabase < Test::Unit::TestCase
|
|
177
178
|
# GET List Databases
|
178
179
|
# Retrieves the available databases.
|
179
180
|
def test_list_databases
|
180
|
-
dbs = @client.list_databases :user => 'root', :password =>
|
181
|
+
dbs = @client.list_databases :user => 'root', :password => DB_ROOT_PASS
|
181
182
|
assert_not_nil dbs
|
182
183
|
assert_instance_of Array, dbs
|
183
184
|
assert !dbs.empty?
|
@@ -188,8 +189,11 @@ class TestDatabase < Test::Unit::TestCase
|
|
188
189
|
###
|
189
190
|
# Test of :assert_connected before advice.
|
190
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
|
191
193
|
assert_raise Orientdb4r::ConnectionError do @client.query 'SELECT FROM OUser'; end
|
192
|
-
assert_raise Orientdb4r::ConnectionError do @client.
|
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
|
193
197
|
#BF #21 assert_raise Orientdb4r::ConnectionError do @client.create_class 'x'; end
|
194
198
|
assert_raise Orientdb4r::ConnectionError do @client.create_property 'x', 'prop', :boolean; end
|
195
199
|
assert_raise Orientdb4r::ConnectionError do @client.class_exists? 'x'; end
|
data/test/test_ddo.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests Data Definition Operarions.
|
@@ -8,7 +6,6 @@ class TestDdo < Test::Unit::TestCase
|
|
8
6
|
|
9
7
|
CLASS = 'testing'
|
10
8
|
DB = 'temp'
|
11
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
12
9
|
|
13
10
|
def initialize(params)
|
14
11
|
super params
|
data/test/test_dmo.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests Data Manipulation Operarions.
|
@@ -9,8 +7,6 @@ class TestDmo < Test::Unit::TestCase
|
|
9
7
|
|
10
8
|
CLASS = 'testing'
|
11
9
|
DB = 'temp'
|
12
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
13
|
-
|
14
10
|
|
15
11
|
def setup
|
16
12
|
@client = Orientdb4r.client
|
data/test/test_document_crud.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests CRUD operarions on document.
|
@@ -9,8 +7,6 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
9
7
|
|
10
8
|
CLASS = 'testing'
|
11
9
|
DB = 'temp'
|
12
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
13
|
-
|
14
10
|
|
15
11
|
def setup
|
16
12
|
@client = Orientdb4r.client
|
@@ -142,4 +138,47 @@ class TestDocumentCrud < Test::Unit::TestCase
|
|
142
138
|
assert_raise ArgumentError do @client.delete_document 'xx'; end
|
143
139
|
end
|
144
140
|
|
141
|
+
|
142
|
+
#######################
|
143
|
+
# BATCH
|
144
|
+
#######################
|
145
|
+
|
146
|
+
def test_batch_ok
|
147
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
148
|
+
rslt = @client.batch({:transaction => true, :operations => [
|
149
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
150
|
+
{:type => :d, :record => {'@rid' => doc.doc_rid}}
|
151
|
+
]})
|
152
|
+
assert_instance_of Hash, rslt
|
153
|
+
assert_equal 1, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_batch_bad_params
|
157
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
158
|
+
assert_raise Orientdb4r::ServerError do @client.batch(nil); end
|
159
|
+
assert_raise Orientdb4r::ServerError do @client.batch({:foo => :baz, :bar => :alfa}); end # bad structure
|
160
|
+
assert_raise Orientdb4r::ServerError do @client.batch({:operations => [{:type => :d, :record => {'@rid' => '#123:456'}}]}); end # bad cluster
|
161
|
+
assert_nothing_thrown do puts @client.batch({:operations => [{:type => :d, :record => {'@rid' => "##{doc.doc_rid.cluster_id}:678"}}]}); end # bad RID is not problem
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_batch_transaction
|
165
|
+
doc = @client.create_document( { '@class' => CLASS, 'prop1' => 1, 'prop2' => 'text' })
|
166
|
+
|
167
|
+
assert_raise Orientdb4r::ServerError do # will fail on update => tx on => create must be rollbacked
|
168
|
+
rslt = @client.batch({:transaction => true, :operations => [
|
169
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
170
|
+
{:type => :u, :record => {'@rid' => doc.doc_rid}},
|
171
|
+
]})
|
172
|
+
end
|
173
|
+
assert_equal 1, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
174
|
+
|
175
|
+
assert_raise Orientdb4r::ServerError do # will fail on update => tx off => create must be done
|
176
|
+
rslt = @client.batch({:transaction => false, :operations => [
|
177
|
+
{:type => :c, :record => {'@class' => CLASS, :prop2 => 'foo'}},
|
178
|
+
{:type => :u, :record => {'@rid' => doc.doc_rid}},
|
179
|
+
]})
|
180
|
+
end
|
181
|
+
assert_equal 2, @client.query("SELECT count(*) FROM #{CLASS}")[0]['count']
|
182
|
+
end
|
183
|
+
|
145
184
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
###
|
4
|
+
# This class tests Data Manipulation Operarions.
|
5
|
+
class TestGremlin < Test::Unit::TestCase
|
6
|
+
include Orientdb4r::Utils
|
7
|
+
|
8
|
+
CLASS = 'testing'
|
9
|
+
DB = 'temp'
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@client = Orientdb4r.client
|
13
|
+
@client.connect :database => DB, :user => 'admin', :password => 'admin'
|
14
|
+
@client.gremlin("g.V.has('@class','#{CLASS}').remove()")
|
15
|
+
@client.drop_class(CLASS) # just to be sure if the previous test failed
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
# remove the testing class after each test
|
20
|
+
@client.gremlin("g.V.has('@class','#{CLASS}').remove()")
|
21
|
+
@client.drop_class(CLASS)
|
22
|
+
@client.disconnect
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_gremlin
|
26
|
+
|
27
|
+
1.upto(25) do |i|
|
28
|
+
result = @client.gremlin("g.addVertex('class:#{CLASS}', 'prop1', 1, 'prop2', 'string1')")
|
29
|
+
end
|
30
|
+
|
31
|
+
entries = @client.gremlin("g.V.has('@class','#{CLASS}')[0..<20]")
|
32
|
+
assert_not_nil entries
|
33
|
+
assert_instance_of Array, entries
|
34
|
+
assert_equal 20, entries.size # no limit20 is default limit
|
35
|
+
entries.each { |doc| assert doc.kind_of? Orientdb4r::DocumentMetadata }
|
36
|
+
entries.each { |doc| assert_instance_of Orientdb4r::Rid, doc.doc_rid }
|
37
|
+
# limit
|
38
|
+
assert_equal 5, @client.gremlin("g.V.has('@class', '#{CLASS}')[0..<5]").size
|
39
|
+
entries = @client.gremlin("g.V.has('@class', '#{CLASS}')[0..<100]")
|
40
|
+
assert_equal 25, entries.size
|
41
|
+
|
42
|
+
assert_equal 25, @client.gremlin("g.V.has('@class', '#{CLASS}').has('prop1', 1)").size
|
43
|
+
assert_equal 0, @client.gremlin("g.V.has('@class', '#{CLASS}').has('prop1', -1)").size
|
44
|
+
|
45
|
+
entries = @client.gremlin "g.v(0:1111)"
|
46
|
+
assert_not_nil entries
|
47
|
+
assert_instance_of Array, entries
|
48
|
+
|
49
|
+
assert entries.empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
data/test/test_helper.rb
ADDED
data/test/test_loadbalancing.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
|
-
require '
|
2
|
-
$: << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
|
-
require 'orientdb4r'
|
1
|
+
require 'test_helper'
|
4
2
|
|
5
3
|
###
|
6
4
|
# This class tests communication with OrientDB cluster and load balancing.
|
7
5
|
class TestLoadBalancing < Test::Unit::TestCase
|
8
6
|
|
9
|
-
Orientdb4r::logger.level = Logger::DEBUG
|
10
|
-
|
11
|
-
|
12
7
|
###
|
13
8
|
# Test default Sequence strategy.
|
14
9
|
def test_sequence_loadbalancing
|
data/test/test_utils.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orientdb4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vaclav Sykora
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -47,12 +47,15 @@ extra_rdoc_files:
|
|
47
47
|
- LICENSE
|
48
48
|
- README.rdoc
|
49
49
|
files:
|
50
|
+
- ".coveralls.yml"
|
50
51
|
- ".gitignore"
|
52
|
+
- ".travis.yml"
|
51
53
|
- Gemfile
|
52
54
|
- LICENSE
|
53
55
|
- README.rdoc
|
54
56
|
- Rakefile
|
55
57
|
- changelog.txt
|
58
|
+
- ci/initialize-ci.sh
|
56
59
|
- fstudy/design_v1.dia
|
57
60
|
- fstudy/design_v1.png
|
58
61
|
- fstudy/domain_model.dia
|
@@ -83,6 +86,8 @@ files:
|
|
83
86
|
- test/test_ddo.rb
|
84
87
|
- test/test_dmo.rb
|
85
88
|
- test/test_document_crud.rb
|
89
|
+
- test/test_gremlin.rb
|
90
|
+
- test/test_helper.rb
|
86
91
|
- test/test_loadbalancing.rb
|
87
92
|
- test/test_utils.rb
|
88
93
|
homepage: http://github.com/veny/orientdb4r
|
@@ -106,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
111
|
version: 1.3.1
|
107
112
|
requirements: []
|
108
113
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
114
|
+
rubygems_version: 2.4.6
|
110
115
|
signing_key:
|
111
116
|
specification_version: 4
|
112
117
|
summary: Ruby binding for Orient DB.
|
@@ -117,5 +122,7 @@ test_files:
|
|
117
122
|
- test/test_ddo.rb
|
118
123
|
- test/test_dmo.rb
|
119
124
|
- test/test_document_crud.rb
|
125
|
+
- test/test_gremlin.rb
|
126
|
+
- test/test_helper.rb
|
120
127
|
- test/test_loadbalancing.rb
|
121
128
|
- test/test_utils.rb
|