From bc4faae536de08142cd427d3e8dae53feaf4a938 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Tue, 30 Oct 2012 21:03:53 -0400 Subject: [PATCH 01/21] began adding config_* --- lib/orient_db_client/protocols/protocol7.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 47a6016..bf3bafd 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -34,6 +34,9 @@ module Operations RECORD_DELETE = 33 RECORD_LOAD = 30 RECORD_UPDATE = 32 + CONFIG_GET = 70 + CONFIG_SET = 71 + CONFIG_LIST = 72 end module RecordTypes @@ -483,6 +486,9 @@ def self.db_size(socket, session) { :session => read_integer(socket), :message_content => read_db_size(socket) } end + + def self.config_get(socket, session) + end def self.record_create(socket, session, cluster_id, record) command = Commands::RecordCreate.new :session => session, From b491dbb8a22f93a19e2983f87a45804aa4bb32bd Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Tue, 30 Oct 2012 21:17:06 -0400 Subject: [PATCH 02/21] more config work --- lib/orient_db_client/protocols/protocol7.rb | 27 ++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index bf3bafd..33e26f1 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -105,6 +105,13 @@ class Command < BinData::Record protocol_string :command_serialized end + + class ConfigGet < BinData::Record + endian :big + int8 :operation, :value => Operations::CONFIG_GET + int32 :session + protocol_string :config_name + end class Connect < BinData::Record endian :big @@ -487,7 +494,25 @@ def self.db_size(socket, session) :message_content => read_db_size(socket) } end - def self.config_get(socket, session) + def self.config_get(socket, session, config_name) + + if options.is_a?(String) || options.is_a?(Symbol) + options = { :storage_type => options } + end + + options = { :storage_type => 'local' }.merge(options) + + options[:storage_type] = options[:storage_type].to_s + + config = Commands::ConfigGet.new :session => session, + :config_name => config_name + + config.write(socket) + + read_response(socket) + + { :value => read_string(socket) } + end def self.record_create(socket, session, cluster_id, record) From aa8b72d35ef9b9f34fe6f65d84bd8286f5adb391 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Tue, 30 Oct 2012 22:36:23 -0400 Subject: [PATCH 03/21] more work done with config_get --- lib/orient_db_client/connection.rb | 7 +++++++ lib/orient_db_client/protocols/protocol7.rb | 8 +------- test/integration/database_session_9_test.rb | 5 +++++ test/integration/server_session_test.rb | 2 ++ test/support/connection_helper.rb | 2 +- test/support/databases.yml | 2 +- test/unit/connection_test.rb | 2 ++ 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index b6c4e5c..e931850 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -11,8 +11,15 @@ def initialize(socket, protocol_version, options = {}) end def close + if @socket.closed? + puts "It was already closed!" + end @socket.close end + + def config_get(session, config_name) + @protocol.config_get(@socket, session, config_name) + end def close_database(session) @protocol.db_close(@socket, session) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 33e26f1..f6b552c 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -408,6 +408,7 @@ def self.datacluster_remove(socket, session, cluster_id) end def self.db_close(socket, session = NEW_SESSION) + return true if socket.closed? command = Commands::DbClose.new :session => session command.write(socket) @@ -496,14 +497,7 @@ def self.db_size(socket, session) def self.config_get(socket, session, config_name) - if options.is_a?(String) || options.is_a?(Symbol) - options = { :storage_type => options } - end - options = { :storage_type => 'local' }.merge(options) - - options[:storage_type] = options[:storage_type].to_s - config = Commands::ConfigGet.new :session => session, :config_name => config_name diff --git a/test/integration/database_session_9_test.rb b/test/integration/database_session_9_test.rb index 87b7070..d73f3f9 100644 --- a/test/integration/database_session_9_test.rb +++ b/test/integration/database_session_9_test.rb @@ -25,6 +25,11 @@ def test_close refute @connection.closed? end + + + def test_config_get + @session.config_get(@session, "cache") + end def test_query result = @session.query("SELECT FROM OUser") diff --git a/test/integration/server_session_test.rb b/test/integration/server_session_test.rb index 11ffd6d..fbc0873 100644 --- a/test/integration/server_session_test.rb +++ b/test/integration/server_session_test.rb @@ -16,6 +16,8 @@ def setup def teardown @connection.close if @connection end + + def test_database_exists_command assert @session.database_exists?(@options["database"]) diff --git a/test/support/connection_helper.rb b/test/support/connection_helper.rb index c25e0f2..fc9bbb5 100644 --- a/test/support/connection_helper.rb +++ b/test/support/connection_helper.rb @@ -1,6 +1,6 @@ module ConnectionHelper def connect_to_orientdb(options) - OrientDbClient.connect(options["host"], { + OrientDbClient.connect(options["host"], { port: options["port"] }) end diff --git a/test/support/databases.yml b/test/support/databases.yml index 4e295e9..b43c2a7 100644 --- a/test/support/databases.yml +++ b/test/support/databases.yml @@ -2,7 +2,7 @@ test: host: localhost port: 2424 server_user: root - server_password: 83CACE21A23DB46F93BFD58A3CE48C8D29926C6EF424D7DA9BD725AE070CCDC0 + server_password: orient123 database: temp user: admin password: admin diff --git a/test/unit/connection_test.rb b/test/unit/connection_test.rb index 77f6046..d0c8fa4 100644 --- a/test/unit/connection_test.rb +++ b/test/unit/connection_test.rb @@ -1,5 +1,7 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' +require 'pp' + class TestConnection < MiniTest::Unit::TestCase include ConnectionHelper include ServerConfig From 62bfe897d0a46a64fdc16a4356f6b87389b137c5 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Tue, 30 Oct 2012 23:10:02 -0400 Subject: [PATCH 04/21] closer to the truth... --- lib/orient_db_client/protocols/protocol7.rb | 24 ++++++++++++++++----- lib/orient_db_client/protocols/protocol9.rb | 2 +- test/integration/database_session_test.rb | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index f6b552c..3507a9b 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -603,12 +603,22 @@ def self.read_count(socket) def self.read_clusters(socket) clusters = [] - read_short(socket).times do - clusters << { + num_clusters = read_short(socket) + puts "We have this many clusters: #{num_clusters}" + num_clusters.times do |x| + print "Reading cluster: #{x}..." + + cluster = + { :name => read_string(socket), :id => read_short(socket), - :type => read_string(socket) + :type => read_string(socket), + :other => read_short(socket) } + clusters << cluster + puts "Cluster: #{cluster}" + puts "done!" + end clusters @@ -675,8 +685,12 @@ def self.read_db_exist(socket) end def self.read_db_open(socket) - { :session => read_integer(socket), - :clusters => read_clusters(socket), + session = read_integer(socket) + puts "Session is: #{session}" + clusters = read_clusters(socket) + puts "Clusters is: #{clusters}" + { :session => session, + :clusters => clusters, :cluster_config => read_string(socket) } end diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol9.rb index eb0eee9..a098e5d 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol9.rb @@ -6,7 +6,7 @@ module OrientDbClient module Protocols class Protocol9 < Protocol7 - VERSION = 9 + VERSION = 12 module Commands class DbCreate9 < BinData::Record diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index aa59a92..05208a7 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -1,4 +1,6 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' + +require 'debugger' class TestDatabaseSession < MiniTest::Unit::TestCase include ServerConfig @@ -6,12 +8,14 @@ class TestDatabaseSession < MiniTest::Unit::TestCase def setup @options = SERVER_OPTIONS + debugger @connection = connect_to_orientdb(SERVER_OPTIONS) @session = @connection.open_database(@options["database"], { :user => @options["user"], :password => @options["password"] }) + end def teardown From ba842f9d409384e1da93fb410edb3b7ce6a638a5 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Tue, 30 Oct 2012 23:23:07 -0400 Subject: [PATCH 05/21] stuck on orientdb bug with phantom clusters... --- lib/orient_db_client/protocols/protocol7.rb | 2 +- lib/orient_db_client/protocols/protocol9.rb | 1 + test/integration/database_session_test.rb | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 3507a9b..6a24d51 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -605,7 +605,7 @@ def self.read_clusters(socket) num_clusters = read_short(socket) puts "We have this many clusters: #{num_clusters}" - num_clusters.times do |x| + (num_clusters).times do |x| print "Reading cluster: #{x}..." cluster = diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol9.rb index a098e5d..dc28260 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol9.rb @@ -81,6 +81,7 @@ def self.db_create(socket, session, database, options = {}) end def self.db_open(socket, database, options = {}) + puts "Connecting to db ith version: #{self.version}" command = Commands::DbOpen9.new :protocol_version => self.version, :database_name => database, :database_type => options[:database_type] || 'document', diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index 05208a7..cdcbc8e 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -8,7 +8,6 @@ class TestDatabaseSession < MiniTest::Unit::TestCase def setup @options = SERVER_OPTIONS - debugger @connection = connect_to_orientdb(SERVER_OPTIONS) @session = @connection.open_database(@options["database"], { From 02a03edceff490dc74b8f5dc5b0ad390a61818ed Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 18:57:43 -0500 Subject: [PATCH 06/21] Closer to actually working... --- lib/orient_db_client/protocols/protocol7.rb | 9 +-------- lib/orient_db_client/protocols/protocol9.rb | 1 - test/integration/database_session_test.rb | 6 +++--- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 6a24d51..7d636ec 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -604,10 +604,7 @@ def self.read_clusters(socket) clusters = [] num_clusters = read_short(socket) - puts "We have this many clusters: #{num_clusters}" (num_clusters).times do |x| - print "Reading cluster: #{x}..." - cluster = { :name => read_string(socket), @@ -616,8 +613,6 @@ def self.read_clusters(socket) :other => read_short(socket) } clusters << cluster - puts "Cluster: #{cluster}" - puts "done!" end @@ -686,10 +681,8 @@ def self.read_db_exist(socket) def self.read_db_open(socket) session = read_integer(socket) - puts "Session is: #{session}" clusters = read_clusters(socket) - puts "Clusters is: #{clusters}" - { :session => session, + { :session => session, :clusters => clusters, :cluster_config => read_string(socket) } end diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol9.rb index dc28260..a098e5d 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol9.rb @@ -81,7 +81,6 @@ def self.db_create(socket, session, database, options = {}) end def self.db_open(socket, database, options = {}) - puts "Connecting to db ith version: #{self.version}" command = Commands::DbOpen9.new :protocol_version => self.version, :database_name => database, :database_type => options[:database_type] || 'document', diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index cdcbc8e..e6d96a1 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -62,7 +62,7 @@ def test_query result[0].tap do |record| assert_equal 0, record[:format] - assert_equal 4, record[:cluster_id] + assert_equal 5, record[:cluster_id] assert_equal 0, record[:cluster_position] record[:document].tap do |doc| @@ -93,7 +93,7 @@ def test_create_cluster new_cluster = @session.create_physical_cluster(cluster) - assert_equal 6, new_cluster + assert_equal 8, new_cluster assert @session.cluster_exists?(cluster) @@ -189,7 +189,7 @@ def test_load_record record[:document].tap do |doc| assert_equal 'admin', doc['name'] - assert_equal 'ACTIVE', doc['status'] + assert_equal 1, doc['mode'] doc['roles'].tap do |roles| assert roles.is_a?(Array), "expected Array, but got #{roles.class}" From 64f2ce0e09340badf3951e992bd20044c193f693 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 20:37:52 -0500 Subject: [PATCH 07/21] config_Get finally works... --- lib/orient_db_client/database_session.rb | 209 ++++++++++---------- lib/orient_db_client/protocols/protocol7.rb | 24 +-- lib/orient_db_client/protocols/protocol9.rb | 22 +++ lib/orient_db_client/server_session.rb | 4 + test/integration/database_session_9_test.rb | 5 - test/integration/server_session_test.rb | 5 + 6 files changed, 141 insertions(+), 128 deletions(-) diff --git a/lib/orient_db_client/database_session.rb b/lib/orient_db_client/database_session.rb index b485d91..fb9961c 100644 --- a/lib/orient_db_client/database_session.rb +++ b/lib/orient_db_client/database_session.rb @@ -1,107 +1,110 @@ require 'orient_db_client/session' module OrientDbClient - class DatabaseSession < Session - attr_reader :clusters - - def initialize(id, connection, clusters = []) - super id, connection - - store_clusters(clusters) - end - - def close - @connection.close_database(@id) - end - - def cluster_exists?(cluster_id) - @connection.cluster_exists?(@id, cluster_id) - end - - def count(cluster_name) - @connection.count(@id, cluster_name) - end - - def create_physical_cluster(name, options = {}) - options.merge!({ :name => name }) - - @connection.create_cluster(@id, :physical, options) - end - - def clusters - @clusters.values - end - - def create_record(cluster_id, record) - @connection.create_record(@id, cluster_id, record) - end - - def delete_cluster(cluster_id) - @connection.delete_cluster(@id, cluster_id) - end - - def delete_record(rid_or_cluster_id, cluster_position_or_version, version = nil) - if rid_or_cluster_id.is_a?(OrientDbClient::Rid) - rid = rid_or_cluster_id - version = cluster_position_or_version.to_i - else - rid = OrientDbClient::Rid.new(rid_or_cluster_id.to_i, cluster_position_or_version.to_i) - version = version - end - - @connection.delete_record(@id, rid, version) - end - - def get_cluster(id) - if id.kind_of?(Fixnum) - @clusters[id] - else - @clusters_by_name[id.downcase] - end - end - - def get_cluster_datarange(cluster_id) - @connection.get_cluster_datarange(@id, cluster_id) - end - - def load_record(rid_or_cluster_id, cluster_position = nil) - if rid_or_cluster_id.is_a?(Fixnum) - rid_or_cluster_id = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position) - end - - @connection.load_record(@id, rid_or_cluster_id)[:message_content] - end - - def query(text, options = {}) - @connection.query(@id, text, options) - end - - def reload - @connection.reload(@id) - end - - def update_record(record, rid_or_cluster_id, cluster_position_or_version, version = :none) - if rid_or_cluster_id.is_a?(Fixnum) - rid = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position_or_version) - version = version - else - rid = rid_or_cluster_id - version = cluster_position_or_version - end - - @connection.update_record(@id, rid, record, version) - end - - private - - def store_clusters(clusters) - @clusters = {} - @clusters_by_name = {} - - clusters.each do |cluster| - @clusters[cluster[:id]] = cluster - @clusters_by_name[cluster[:name].downcase] = cluster - end - end - end + class DatabaseSession < Session + attr_reader :clusters + def initialize(id, connection, clusters = []) + super id, connection + + store_clusters(clusters) + end + + def close + @connection.close_database(@id) + end + + def cluster_exists?(cluster_id) + @connection.cluster_exists?(@id, cluster_id) + end + + def config_get(value) + @connection.config_get(@id, value) + end + + def count(cluster_name) + @connection.count(@id, cluster_name) + end + + def create_physical_cluster(name, options = {}) + options.merge!({ :name => name }) + + @connection.create_cluster(@id, :physical, options) + end + + def clusters + @clusters.values + end + + def create_record(cluster_id, record) + @connection.create_record(@id, cluster_id, record) + end + + def delete_cluster(cluster_id) + @connection.delete_cluster(@id, cluster_id) + end + + def delete_record(rid_or_cluster_id, cluster_position_or_version, version = nil) + if rid_or_cluster_id.is_a?(OrientDbClient::Rid) + rid = rid_or_cluster_id + version = cluster_position_or_version.to_i + else + rid = OrientDbClient::Rid.new(rid_or_cluster_id.to_i, cluster_position_or_version.to_i) + version = version + end + + @connection.delete_record(@id, rid, version) + end + + def get_cluster(id) + if id.kind_of?(Fixnum) + @clusters[id] + else + @clusters_by_name[id.downcase] + end + end + + def get_cluster_datarange(cluster_id) + @connection.get_cluster_datarange(@id, cluster_id) + end + + def load_record(rid_or_cluster_id, cluster_position = nil) + if rid_or_cluster_id.is_a?(Fixnum) + rid_or_cluster_id = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position) + end + + @connection.load_record(@id, rid_or_cluster_id)[:message_content] + end + + def query(text, options = {}) + @connection.query(@id, text, options) + end + + def reload + @connection.reload(@id) + end + + def update_record(record, rid_or_cluster_id, cluster_position_or_version, version = :none) + if rid_or_cluster_id.is_a?(Fixnum) + rid = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position_or_version) + version = version + else + rid = rid_or_cluster_id + version = cluster_position_or_version + end + + @connection.update_record(@id, rid, record, version) + end + + private + + def store_clusters(clusters) + @clusters = {} + @clusters_by_name = {} + + clusters.each do |cluster| + @clusters[cluster[:id]] = cluster + @clusters_by_name[cluster[:name].downcase] = cluster + end + end + end end \ No newline at end of file diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 7d636ec..5b32f48 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -1,4 +1,5 @@ require 'orient_db_client/network_message' +require 'pry' require 'orient_db_client/version' require 'orient_db_client/deserializers/deserializer7' require 'orient_db_client/serializers/serializer7' @@ -105,13 +106,6 @@ class Command < BinData::Record protocol_string :command_serialized end - - class ConfigGet < BinData::Record - endian :big - int8 :operation, :value => Operations::CONFIG_GET - int32 :session - protocol_string :config_name - end class Connect < BinData::Record endian :big @@ -474,6 +468,8 @@ def self.db_open(socket, database, options = {}) { :session => read_integer(socket), :message_content => read_db_open(socket) } end + + def self.db_reload(socket, session) command = Commands::DbReload.new :session => session @@ -495,19 +491,7 @@ def self.db_size(socket, session) :message_content => read_db_size(socket) } end - def self.config_get(socket, session, config_name) - - - config = Commands::ConfigGet.new :session => session, - :config_name => config_name - - config.write(socket) - - read_response(socket) - - { :value => read_string(socket) } - - end + def self.record_create(socket, session, cluster_id, record) command = Commands::RecordCreate.new :session => session, diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol9.rb index a098e5d..f6a8059 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol9.rb @@ -9,6 +9,14 @@ class Protocol9 < Protocol7 VERSION = 12 module Commands + + class ConfigGet < BinData::Record + endian :big + int8 :operation, :value => Protocol7::Operations::CONFIG_GET + int32 :session + protocol_string :config_name + end + class DbCreate9 < BinData::Record endian :big @@ -93,6 +101,20 @@ def self.db_open(socket, database, options = {}) { :session => read_integer(socket), :message_content => read_db_open(socket) } end + + def self.config_get(socket, session, config_name) + # binding.pry + config = Commands::ConfigGet.new :session => session, + :config_name => config_name + + config.write(socket) + + response = read_response(socket) + puts "Response: #{response.to_s}" + { :session => read_integer(socket), + :value => read_string(socket) } + + end def self.record_load(socket, session, rid, options = {}) command = Commands::RecordLoad9.new :session => session, diff --git a/lib/orient_db_client/server_session.rb b/lib/orient_db_client/server_session.rb index da162a8..08d033d 100644 --- a/lib/orient_db_client/server_session.rb +++ b/lib/orient_db_client/server_session.rb @@ -13,6 +13,10 @@ def create_memory_database(database, options = {}) @connection.create_database(@id, database, options) end + + def config_get(config_name) + @connection.config_get(@id, config_name) + end def database_exists?(database) @connection.database_exists?(@id, database) diff --git a/test/integration/database_session_9_test.rb b/test/integration/database_session_9_test.rb index d73f3f9..87b7070 100644 --- a/test/integration/database_session_9_test.rb +++ b/test/integration/database_session_9_test.rb @@ -25,11 +25,6 @@ def test_close refute @connection.closed? end - - - def test_config_get - @session.config_get(@session, "cache") - end def test_query result = @session.query("SELECT FROM OUser") diff --git a/test/integration/server_session_test.rb b/test/integration/server_session_test.rb index fbc0873..a3beb30 100644 --- a/test/integration/server_session_test.rb +++ b/test/integration/server_session_test.rb @@ -23,6 +23,11 @@ def test_database_exists_command assert @session.database_exists?(@options["database"]) refute @session.database_exists?("InvalidDatabase") end + + def test_config_get + retval = @session.config_get("network.retry") + assert retval[:value] + end def test_create_and_delete_local_database_commands database = "test_create_local_database" From ed372db6d819de35783fec598dd193c634cea8a4 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 20:43:41 -0500 Subject: [PATCH 08/21] rules works now... --- lib/orient_db_client/protocols/protocol9.rb | 1 - test/integration/database_session_9_test.rb | 2 +- test/integration/database_session_test.rb | 12 +++--------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol9.rb index f6a8059..7f75fad 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol9.rb @@ -110,7 +110,6 @@ def self.config_get(socket, session, config_name) config.write(socket) response = read_response(socket) - puts "Response: #{response.to_s}" { :session => read_integer(socket), :value => read_string(socket) } diff --git a/test/integration/database_session_9_test.rb b/test/integration/database_session_9_test.rb index 87b7070..c059b8a 100644 --- a/test/integration/database_session_9_test.rb +++ b/test/integration/database_session_9_test.rb @@ -72,7 +72,7 @@ def test_load_record assert roles.is_a?(Array), "expected Array, but got #{roles.class}" assert roles[0].is_a?(OrientDbClient::Rid) - assert_equal 3, roles[0].cluster_id + assert_equal 4, roles[0].cluster_id assert_equal 0, roles[0].cluster_position end end diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index e6d96a1..902dc3f 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -73,7 +73,7 @@ def test_query assert roles.is_a?(Array), "expected Array, but got #{roles.class}" assert roles[0].is_a?(OrientDbClient::Rid) - assert_equal 3, roles[0].cluster_id + assert_equal 4, roles[0].cluster_id assert_equal 0, roles[0].cluster_position end end @@ -190,14 +190,8 @@ def test_load_record record[:document].tap do |doc| assert_equal 'admin', doc['name'] assert_equal 1, doc['mode'] - - doc['roles'].tap do |roles| - assert roles.is_a?(Array), "expected Array, but got #{roles.class}" - - assert roles[0].is_a?(OrientDbClient::Rid) - assert_equal 3, roles[0].cluster_id - assert_equal 0, roles[0].cluster_position - end + assert doc['rules'].is_a?(Hash), "expected Hash, but got #{doc['rules'].class}" + end end From 857cda810a6a3ae252bd29460432eb2ff625e6e8 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 20:47:33 -0500 Subject: [PATCH 09/21] refactored for protocol 12 --- lib/orient_db_client/protocol_factory.rb | 7 ++----- .../protocols/{protocol9.rb => protocol12.rb} | 2 +- ...abase_session_9_test.rb => database_session_12_test.rb} | 0 3 files changed, 3 insertions(+), 6 deletions(-) rename lib/orient_db_client/protocols/{protocol9.rb => protocol12.rb} (99%) rename test/integration/{database_session_9_test.rb => database_session_12_test.rb} (100%) diff --git a/lib/orient_db_client/protocol_factory.rb b/lib/orient_db_client/protocol_factory.rb index 5bede4b..006e0ac 100644 --- a/lib/orient_db_client/protocol_factory.rb +++ b/lib/orient_db_client/protocol_factory.rb @@ -1,5 +1,5 @@ require File.join(File.dirname(__FILE__), 'protocols', 'protocol7') -require File.join(File.dirname(__FILE__), 'protocols', 'protocol9') +require File.join(File.dirname(__FILE__), 'protocols', 'protocol12') module OrientDbClient class ProtocolFactory @@ -10,10 +10,7 @@ class ProtocolFactory PROTOCOLS = { '7' => Protocols::Protocol7, - '9' => Protocols::Protocol9, - '10' => Protocols::Protocol9, - '11' => Protocols::Protocol9, - '12' => Protocols::Protocol9 + '12' => Protocols::Protocol12 } def self.get_protocol(version) diff --git a/lib/orient_db_client/protocols/protocol9.rb b/lib/orient_db_client/protocols/protocol12.rb similarity index 99% rename from lib/orient_db_client/protocols/protocol9.rb rename to lib/orient_db_client/protocols/protocol12.rb index 7f75fad..1ab012e 100644 --- a/lib/orient_db_client/protocols/protocol9.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -5,7 +5,7 @@ module OrientDbClient module Protocols - class Protocol9 < Protocol7 + class Protocol12 < Protocol7 VERSION = 12 module Commands diff --git a/test/integration/database_session_9_test.rb b/test/integration/database_session_12_test.rb similarity index 100% rename from test/integration/database_session_9_test.rb rename to test/integration/database_session_12_test.rb From af3d67b6ff71ac227dfbd1a628cd8ea5bd0b3487 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 21:00:26 -0500 Subject: [PATCH 10/21] rolled back lousy commit --- lib/orient_db_client/database_session.rb | 209 +++++++++++------------ 1 file changed, 103 insertions(+), 106 deletions(-) diff --git a/lib/orient_db_client/database_session.rb b/lib/orient_db_client/database_session.rb index fb9961c..b485d91 100644 --- a/lib/orient_db_client/database_session.rb +++ b/lib/orient_db_client/database_session.rb @@ -1,110 +1,107 @@ require 'orient_db_client/session' module OrientDbClient - class DatabaseSession < Session - attr_reader :clusters - def initialize(id, connection, clusters = []) - super id, connection - - store_clusters(clusters) - end - - def close - @connection.close_database(@id) - end - - def cluster_exists?(cluster_id) - @connection.cluster_exists?(@id, cluster_id) - end - - def config_get(value) - @connection.config_get(@id, value) - end - - def count(cluster_name) - @connection.count(@id, cluster_name) - end - - def create_physical_cluster(name, options = {}) - options.merge!({ :name => name }) - - @connection.create_cluster(@id, :physical, options) - end - - def clusters - @clusters.values - end - - def create_record(cluster_id, record) - @connection.create_record(@id, cluster_id, record) - end - - def delete_cluster(cluster_id) - @connection.delete_cluster(@id, cluster_id) - end - - def delete_record(rid_or_cluster_id, cluster_position_or_version, version = nil) - if rid_or_cluster_id.is_a?(OrientDbClient::Rid) - rid = rid_or_cluster_id - version = cluster_position_or_version.to_i - else - rid = OrientDbClient::Rid.new(rid_or_cluster_id.to_i, cluster_position_or_version.to_i) - version = version - end - - @connection.delete_record(@id, rid, version) - end - - def get_cluster(id) - if id.kind_of?(Fixnum) - @clusters[id] - else - @clusters_by_name[id.downcase] - end - end - - def get_cluster_datarange(cluster_id) - @connection.get_cluster_datarange(@id, cluster_id) - end - - def load_record(rid_or_cluster_id, cluster_position = nil) - if rid_or_cluster_id.is_a?(Fixnum) - rid_or_cluster_id = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position) - end - - @connection.load_record(@id, rid_or_cluster_id)[:message_content] - end - - def query(text, options = {}) - @connection.query(@id, text, options) - end - - def reload - @connection.reload(@id) - end - - def update_record(record, rid_or_cluster_id, cluster_position_or_version, version = :none) - if rid_or_cluster_id.is_a?(Fixnum) - rid = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position_or_version) - version = version - else - rid = rid_or_cluster_id - version = cluster_position_or_version - end - - @connection.update_record(@id, rid, record, version) - end - - private - - def store_clusters(clusters) - @clusters = {} - @clusters_by_name = {} - - clusters.each do |cluster| - @clusters[cluster[:id]] = cluster - @clusters_by_name[cluster[:name].downcase] = cluster - end - end - end + class DatabaseSession < Session + attr_reader :clusters + + def initialize(id, connection, clusters = []) + super id, connection + + store_clusters(clusters) + end + + def close + @connection.close_database(@id) + end + + def cluster_exists?(cluster_id) + @connection.cluster_exists?(@id, cluster_id) + end + + def count(cluster_name) + @connection.count(@id, cluster_name) + end + + def create_physical_cluster(name, options = {}) + options.merge!({ :name => name }) + + @connection.create_cluster(@id, :physical, options) + end + + def clusters + @clusters.values + end + + def create_record(cluster_id, record) + @connection.create_record(@id, cluster_id, record) + end + + def delete_cluster(cluster_id) + @connection.delete_cluster(@id, cluster_id) + end + + def delete_record(rid_or_cluster_id, cluster_position_or_version, version = nil) + if rid_or_cluster_id.is_a?(OrientDbClient::Rid) + rid = rid_or_cluster_id + version = cluster_position_or_version.to_i + else + rid = OrientDbClient::Rid.new(rid_or_cluster_id.to_i, cluster_position_or_version.to_i) + version = version + end + + @connection.delete_record(@id, rid, version) + end + + def get_cluster(id) + if id.kind_of?(Fixnum) + @clusters[id] + else + @clusters_by_name[id.downcase] + end + end + + def get_cluster_datarange(cluster_id) + @connection.get_cluster_datarange(@id, cluster_id) + end + + def load_record(rid_or_cluster_id, cluster_position = nil) + if rid_or_cluster_id.is_a?(Fixnum) + rid_or_cluster_id = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position) + end + + @connection.load_record(@id, rid_or_cluster_id)[:message_content] + end + + def query(text, options = {}) + @connection.query(@id, text, options) + end + + def reload + @connection.reload(@id) + end + + def update_record(record, rid_or_cluster_id, cluster_position_or_version, version = :none) + if rid_or_cluster_id.is_a?(Fixnum) + rid = OrientDbClient::Rid.new(rid_or_cluster_id, cluster_position_or_version) + version = version + else + rid = rid_or_cluster_id + version = cluster_position_or_version + end + + @connection.update_record(@id, rid, record, version) + end + + private + + def store_clusters(clusters) + @clusters = {} + @clusters_by_name = {} + + clusters.each do |cluster| + @clusters[cluster[:id]] = cluster + @clusters_by_name[cluster[:name].downcase] = cluster + end + end + end end \ No newline at end of file From 4f56a05ce6c9f6f1c2711ed3552b0e96b8c776ac Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 21:11:12 -0500 Subject: [PATCH 11/21] removed unneeded requires... --- lib/orient_db_client/protocols/protocol7.rb | 3 +-- test/unit/connection_test.rb | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 5b32f48..120a334 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -1,5 +1,4 @@ require 'orient_db_client/network_message' -require 'pry' require 'orient_db_client/version' require 'orient_db_client/deserializers/deserializer7' require 'orient_db_client/serializers/serializer7' @@ -781,4 +780,4 @@ def self.read_string(socket) end end end -end \ No newline at end of file +end diff --git a/test/unit/connection_test.rb b/test/unit/connection_test.rb index d0c8fa4..a1f30da 100644 --- a/test/unit/connection_test.rb +++ b/test/unit/connection_test.rb @@ -1,7 +1,5 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' -require 'pp' - class TestConnection < MiniTest::Unit::TestCase include ConnectionHelper include ServerConfig @@ -83,4 +81,4 @@ def test_opening_a_database assert_instance_of OrientDbClient::DatabaseSession, session assert_equal @session, session.id end -end \ No newline at end of file +end From cedafee64c9cb210c7731708d09cb61f80d028c0 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 4 Nov 2012 21:14:34 -0500 Subject: [PATCH 12/21] removed more lousy debug stuff... --- lib/orient_db_client/connection.rb | 5 +---- lib/orient_db_client/protocols/protocol12.rb | 1 - test/integration/database_session_test.rb | 4 +--- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index e931850..ac8a228 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -11,10 +11,7 @@ def initialize(socket, protocol_version, options = {}) end def close - if @socket.closed? - puts "It was already closed!" - end - @socket.close + @socket.close end def config_get(session, config_name) diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index 1ab012e..8e898b5 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -103,7 +103,6 @@ def self.db_open(socket, database, options = {}) end def self.config_get(socket, session, config_name) - # binding.pry config = Commands::ConfigGet.new :session => session, :config_name => config_name diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index 902dc3f..b38a5ca 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -1,7 +1,5 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' - -require 'debugger' - + class TestDatabaseSession < MiniTest::Unit::TestCase include ServerConfig include ConnectionHelper From 25c158e3451c101b79e463f9f2e24963fe91ea3b Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sat, 10 Nov 2012 23:26:23 -0500 Subject: [PATCH 13/21] branched to 0.0.8 --- lib/orient_db_client/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/orient_db_client/version.rb b/lib/orient_db_client/version.rb index 6ab1397..9f11e2a 100644 --- a/lib/orient_db_client/version.rb +++ b/lib/orient_db_client/version.rb @@ -1,3 +1,3 @@ module OrientDbClient - VERSION = "0.0.6" + VERSION = "0.0.8" end From ad0b6aa6e154b7ffe9fc73f2fd8f55c752ce144b Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sat, 10 Nov 2012 23:58:25 -0500 Subject: [PATCH 14/21] further work on new protocol... --- lib/orient_db_client/protocols/protocol12.rb | 39 +++++++++++++++++--- test/integration/database_session_test.rb | 1 + 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index 8e898b5..03f152d 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -17,7 +17,7 @@ class ConfigGet < BinData::Record protocol_string :config_name end - class DbCreate9 < BinData::Record + class DbCreate < BinData::Record endian :big int8 :operation, :value => Protocol7::Operations::DB_CREATE @@ -28,7 +28,7 @@ class DbCreate9 < BinData::Record protocol_string :storage_type end - class DbOpen9 < BinData::Record + class DbOpen < BinData::Record endian :big int8 :operation, :value => Protocol7::Operations::DB_OPEN @@ -44,7 +44,7 @@ class DbOpen9 < BinData::Record protocol_string :user_password end - class RecordLoad9 < BinData::Record + class RecordLoad12 < BinData::Record endian :big int8 :operation, :value => Protocol7::Operations::RECORD_LOAD @@ -87,9 +87,36 @@ def self.db_create(socket, session, database, options = {}) super end + + def self.read_clusters(socket) + clusters = [] + + num_clusters = read_short(socket) + (num_clusters).times do |x| + cluster = + { + :name => read_string(socket), + :id => read_short(socket), + :type => read_string(socket), + :data_segment => read_short(socket) + } + clusters << cluster + + end + + clusters + end + + def self.read_db_open(socket) + session = read_integer(socket) + clusters = read_clusters(socket) + { :session => session, + :clusters => clusters, + :cluster_config => read_string(socket) } + end def self.db_open(socket, database, options = {}) - command = Commands::DbOpen9.new :protocol_version => self.version, + command = Commands::DbOpen.new :protocol_version => self.version, :database_name => database, :database_type => options[:database_type] || 'document', :user_name => options[:user], @@ -115,7 +142,7 @@ def self.config_get(socket, session, config_name) end def self.record_load(socket, session, rid, options = {}) - command = Commands::RecordLoad9.new :session => session, + command = Commands::RecordLoad12.new :session => session, :cluster_id => rid.cluster_id, :cluster_position => rid.cluster_position, :ignore_cache => options[:ignore_cache] === true ? 1 : 0 @@ -134,7 +161,7 @@ def self.make_db_create_command(*args) database = args.shift options = args.shift - Commands::DbCreate9.new :session => session, + Commands::DbCreate.new :session => session, :database => database, :database_type => options[:database_type].to_s, :storage_type => options[:storage_type] diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index b38a5ca..9e8b9f5 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -101,6 +101,7 @@ def test_create_cluster end def test_create_and_delete_record + return cluster = "OTest" ensure_cluster_exists(@session, cluster) From 18e40190bb5141af411a891563481173747046f4 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 11 Nov 2012 00:06:52 -0500 Subject: [PATCH 15/21] trying new record create --- lib/orient_db_client/protocols/protocol12.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index 03f152d..38553ee 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -55,6 +55,19 @@ class RecordLoad12 < BinData::Record protocol_string :fetch_plan int8 :ignore_cache, :initial_value => 0 end + + class RecordCreate < BinData::Record + endian :big + + int8 :operation, :value => Protocol7::Operations::RECORD_CREATE + # int32 :session + + int16 :cluster_id + protocol_string :record_content + int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT + int8 :mode, :value => Protocol7::SyncModes::SYNC + end + end def self.command(socket, session, command, options = {}) From 8883b743eacbffdceb9356c6dd4a861e00a4d1c7 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 11 Nov 2012 00:20:05 -0500 Subject: [PATCH 16/21] a little further towards protocol 12 implementation --- lib/orient_db_client/protocols/protocol12.rb | 12 ++++++++++++ lib/orient_db_client/version.rb | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index 38553ee..f1b047d 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -127,6 +127,18 @@ def self.read_db_open(socket) :clusters => clusters, :cluster_config => read_string(socket) } end + + def self.record_create(socket, session, cluster_id, record) + command = Commands::RecordCreate.new :session => session, + :cluster_id => cluster_id, + :record_content => serializer.serialize(record) + command.write(socket) + + read_response(socket) + + { :session => read_integer(socket), + :message_content => read_record_create(socket).merge({ :cluster_id => cluster_id }) } + end def self.db_open(socket, database, options = {}) command = Commands::DbOpen.new :protocol_version => self.version, diff --git a/lib/orient_db_client/version.rb b/lib/orient_db_client/version.rb index 9f11e2a..b67516b 100644 --- a/lib/orient_db_client/version.rb +++ b/lib/orient_db_client/version.rb @@ -1,3 +1,3 @@ module OrientDbClient - VERSION = "0.0.8" + VERSION = "0.0.9" end From 7af72cd1b58f465ab78557594af27eb657fb592b Mon Sep 17 00:00:00 2001 From: josh Date: Sun, 11 Nov 2012 12:07:13 -0500 Subject: [PATCH 17/21] added in correct record_create for protocol 12 --- lib/orient_db_client/protocols/protocol12.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index f1b047d..cbaf008 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -61,7 +61,7 @@ class RecordCreate < BinData::Record int8 :operation, :value => Protocol7::Operations::RECORD_CREATE # int32 :session - + int16 :datasegment_id, :value => -1 int16 :cluster_id protocol_string :record_content int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT From c5ebc9883978f9c8adea56039e6ffac773291a51 Mon Sep 17 00:00:00 2001 From: josh Date: Sun, 11 Nov 2012 14:29:21 -0500 Subject: [PATCH 18/21] found missing field in record_create --- lib/orient_db_client/connection.rb | 4 +- lib/orient_db_client/protocols/protocol12.rb | 193 +++++++++++-------- orient_db_client.gemspec | 1 + test/integration/database_session_12_test.rb | 49 +++++ test/integration/database_session_test.rb | 3 +- 5 files changed, 165 insertions(+), 85 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index ac8a228..7ed4527 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -97,6 +97,8 @@ def load_record(session, rid) result = @protocol.record_load(@socket, session, rid) + pp result + if result[:message_content] result[:message_content].tap do |r| r[:cluster_id] = rid.cluster_id @@ -119,7 +121,7 @@ def open_database(database, options = {}) response = @protocol.db_open(@socket, database, options) session = response[:session] message_content = response[:message_content] - + @sessions[session] = DatabaseSession.new(message_content[:session], self, message_content[:clusters]) end diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index cbaf008..0b88630 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -1,6 +1,5 @@ require 'orient_db_client/network_message' require 'orient_db_client/version' - require 'bindata' module OrientDbClient @@ -9,14 +8,13 @@ class Protocol12 < Protocol7 VERSION = 12 module Commands - class ConfigGet < BinData::Record endian :big int8 :operation, :value => Protocol7::Operations::CONFIG_GET - int32 :session + int32 :session protocol_string :config_name end - + class DbCreate < BinData::Record endian :big @@ -53,34 +51,34 @@ class RecordLoad12 < BinData::Record int16 :cluster_id int64 :cluster_position protocol_string :fetch_plan - int8 :ignore_cache, :initial_value => 0 + int8 :ignore_cache, :initial_value => 1 end - - class RecordCreate < BinData::Record - endian :big - - int8 :operation, :value => Protocol7::Operations::RECORD_CREATE - # int32 :session - int16 :datasegment_id, :value => -1 - int16 :cluster_id - protocol_string :record_content - int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT - int8 :mode, :value => Protocol7::SyncModes::SYNC + + class RecordCreate12 < BinData::Record + endian :big + + int8 :operation, :value => Protocol7::Operations::RECORD_CREATE + int32 :session + int32 :datasegment_id, :value => -1 + int16 :cluster_id + protocol_string :record_content + int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT + int8 :mode, :value => Protocol7::SyncModes::SYNC end - + end def self.command(socket, session, command, options = {}) options[:query_class_name].tap do |qcn| if qcn.is_a?(Symbol) qcn = case qcn - when :query then 'q' - when :command then 'c' + when :query then 'q' + when :command then 'c' end end if qcn.nil? || qcn == 'com.orientechnologies.orient.core.sql.query.OSQLSynchQuery' - qcn = 'q' + qcn = 'q' end options[:query_class_name] = qcn @@ -90,62 +88,87 @@ def self.command(socket, session, command, options = {}) end def self.db_create(socket, session, database, options = {}) - if options.is_a?(String) - options = { :storage_type => options } - end + if options.is_a?(String) + options = { :storage_type => options } + end - options = { - :database_type => 'document' - }.merge(options) + options = { + :database_type => 'document' + }.merge(options) - super + super end - + def self.read_clusters(socket) - clusters = [] - - num_clusters = read_short(socket) - (num_clusters).times do |x| - cluster = - { - :name => read_string(socket), - :id => read_short(socket), - :type => read_string(socket), - :data_segment => read_short(socket) - } - clusters << cluster - - end - - clusters + clusters = [] + + num_clusters = read_short(socket) + (num_clusters).times do |x| + cluster = + { + :name => read_string(socket), + :id => read_short(socket), + :type => read_string(socket), + :data_segment => read_short(socket) + } + clusters << cluster + + end + + clusters end - + + def self.read_record_load(socket) + result = nil + + status = read_byte(socket) + + while (status != PayloadStatuses::NO_RECORDS) + case status + when PayloadStatuses::RESULTSET + record = record || read_record(socket) + case record[:record_type] + when 'd'.ord + result = result || record + result[:document] = deserializer.deserialize(record[:bytes])[:document] + else + raise "Unsupported record type: #{record[:record_type]}" + end + else + raise "Unsupported payload status: #{status}" + end + status = read_byte(socket) + end + + result + end + def self.read_db_open(socket) - session = read_integer(socket) - clusters = read_clusters(socket) - { :session => session, - :clusters => clusters, - :cluster_config => read_string(socket) } + session = read_integer(socket) + clusters = read_clusters(socket) + { :session => session, + :clusters => clusters, + :cluster_config => read_string(socket) } end - + def self.record_create(socket, session, cluster_id, record) - command = Commands::RecordCreate.new :session => session, - :cluster_id => cluster_id, - :record_content => serializer.serialize(record) - command.write(socket) - - read_response(socket) - - { :session => read_integer(socket), - :message_content => read_record_create(socket).merge({ :cluster_id => cluster_id }) } - end + command = Commands::RecordCreate12.new :session => session, + :cluster_id => cluster_id, + :record_content => serializer.serialize(record) + command.write(socket) + + read_response(socket) + + { :session => read_integer(socket), + :message_content => read_record_create(socket).merge({ :cluster_id => cluster_id }) } + end def self.db_open(socket, database, options = {}) command = Commands::DbOpen.new :protocol_version => self.version, - :database_name => database, - :database_type => options[:database_type] || 'document', - :user_name => options[:user], - :user_password => options[:password] + :database_name => database, + :database_type => options[:database_type] || 'document', + :user_name => options[:user], + :user_password => options[:password] command.write(socket) read_response(socket) @@ -153,43 +176,49 @@ def self.db_open(socket, database, options = {}) { :session => read_integer(socket), :message_content => read_db_open(socket) } end - + def self.config_get(socket, session, config_name) config = Commands::ConfigGet.new :session => session, - :config_name => config_name - + :config_name => config_name + config.write(socket) - + response = read_response(socket) { :session => read_integer(socket), :value => read_string(socket) } - + end def self.record_load(socket, session, rid, options = {}) command = Commands::RecordLoad12.new :session => session, - :cluster_id => rid.cluster_id, - :cluster_position => rid.cluster_position, - :ignore_cache => options[:ignore_cache] === true ? 1 : 0 + :cluster_id => rid.cluster_id, + :cluster_position => rid.cluster_position + # :ignore_cache => options[:ignore_cache] === true ? 1 : 0 + command.write(socket) read_response(socket) - + { :session => read_integer(socket), :message_content => read_record_load(socket) } end + + def self.read_record_create(socket) + { :cluster_position => read_long(socket), + :record_version => read_integer(socket) } + end private def self.make_db_create_command(*args) - session = args.shift - database = args.shift - options = args.shift - - Commands::DbCreate.new :session => session, - :database => database, - :database_type => options[:database_type].to_s, - :storage_type => options[:storage_type] + session = args.shift + database = args.shift + options = args.shift + + Commands::DbCreate.new :session => session, + :database => database, + :database_type => options[:database_type].to_s, + :storage_type => options[:storage_type] end end diff --git a/orient_db_client.gemspec b/orient_db_client.gemspec index ecb7b2d..e0a23b0 100644 --- a/orient_db_client.gemspec +++ b/orient_db_client.gemspec @@ -23,4 +23,5 @@ Gem::Specification.new do |s| s.add_development_dependency "minitest", "~> 3.1.0" s.add_development_dependency "mocha", "~> 0.12.0" s.add_development_dependency "rake" + s.add_development_dependency "pry" end diff --git a/test/integration/database_session_12_test.rb b/test/integration/database_session_12_test.rb index c059b8a..d61f94a 100644 --- a/test/integration/database_session_12_test.rb +++ b/test/integration/database_session_12_test.rb @@ -1,5 +1,8 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' +require 'pp' +require 'pry' + class TestDatabaseSession < MiniTest::Unit::TestCase include ServerConfig include ConnectionHelper @@ -54,6 +57,52 @@ def test_query end end end + + def test_multi_create12 + cluster = "Test123" + + ensure_cluster_exists(@session, cluster) + @session.reload + + cluster_id = @session.get_cluster(cluster)[:id] + + record = { :this => "sucks" } + + rid = @session.create_record(cluster_id, record) + puts "Created rid: #{rid}" + binding.pry + rec = @session.load_record(rid) + pp rec + + end + + def test_create_and_delete_record12 + + cluster = "OTest" + + ensure_cluster_exists(@session, cluster) + @session.reload + + cluster_id = @session.get_cluster(cluster)[:id] + + record = { :key1 => "value1" } + + rid = @session.create_record(cluster_id, record) + created_record = @session.load_record(rid) + + assert_equal cluster_id, rid.cluster_id + assert_equal 0, rid.cluster_position + + refute_nil created_record + refute_nil created_record[:document]['key1'] + + assert_equal record[:key1], created_record[:document]['key1'] + + assert @session.delete_record(rid, created_record[:record_version]) + assert_nil @session.load_record(rid) + + ensure_cluster_does_not_exist(@session, cluster) + end def test_load_record result = @session.load_record("#4:0") diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index 9e8b9f5..be20ca1 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -101,7 +101,7 @@ def test_create_cluster end def test_create_and_delete_record - return + cluster = "OTest" ensure_cluster_exists(@session, cluster) @@ -112,7 +112,6 @@ def test_create_and_delete_record rid = @session.create_record(cluster_id, record) created_record = @session.load_record(rid) - assert_equal cluster_id, rid.cluster_id assert_equal 0, rid.cluster_position From 775c3406a417d5df7e54071816ec0cb621fbfcda Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 11 Nov 2012 14:31:10 -0500 Subject: [PATCH 19/21] found missing field in record_create --- lib/orient_db_client/connection.rb | 4 +- lib/orient_db_client/protocols/protocol12.rb | 193 +++++++++++-------- orient_db_client.gemspec | 1 + test/integration/database_session_12_test.rb | 49 +++++ test/integration/database_session_test.rb | 3 +- 5 files changed, 165 insertions(+), 85 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index ac8a228..7ed4527 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -97,6 +97,8 @@ def load_record(session, rid) result = @protocol.record_load(@socket, session, rid) + pp result + if result[:message_content] result[:message_content].tap do |r| r[:cluster_id] = rid.cluster_id @@ -119,7 +121,7 @@ def open_database(database, options = {}) response = @protocol.db_open(@socket, database, options) session = response[:session] message_content = response[:message_content] - + @sessions[session] = DatabaseSession.new(message_content[:session], self, message_content[:clusters]) end diff --git a/lib/orient_db_client/protocols/protocol12.rb b/lib/orient_db_client/protocols/protocol12.rb index cbaf008..0b88630 100644 --- a/lib/orient_db_client/protocols/protocol12.rb +++ b/lib/orient_db_client/protocols/protocol12.rb @@ -1,6 +1,5 @@ require 'orient_db_client/network_message' require 'orient_db_client/version' - require 'bindata' module OrientDbClient @@ -9,14 +8,13 @@ class Protocol12 < Protocol7 VERSION = 12 module Commands - class ConfigGet < BinData::Record endian :big int8 :operation, :value => Protocol7::Operations::CONFIG_GET - int32 :session + int32 :session protocol_string :config_name end - + class DbCreate < BinData::Record endian :big @@ -53,34 +51,34 @@ class RecordLoad12 < BinData::Record int16 :cluster_id int64 :cluster_position protocol_string :fetch_plan - int8 :ignore_cache, :initial_value => 0 + int8 :ignore_cache, :initial_value => 1 end - - class RecordCreate < BinData::Record - endian :big - - int8 :operation, :value => Protocol7::Operations::RECORD_CREATE - # int32 :session - int16 :datasegment_id, :value => -1 - int16 :cluster_id - protocol_string :record_content - int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT - int8 :mode, :value => Protocol7::SyncModes::SYNC + + class RecordCreate12 < BinData::Record + endian :big + + int8 :operation, :value => Protocol7::Operations::RECORD_CREATE + int32 :session + int32 :datasegment_id, :value => -1 + int16 :cluster_id + protocol_string :record_content + int8 :record_type, :value => Protocol7::RecordTypes::DOCUMENT + int8 :mode, :value => Protocol7::SyncModes::SYNC end - + end def self.command(socket, session, command, options = {}) options[:query_class_name].tap do |qcn| if qcn.is_a?(Symbol) qcn = case qcn - when :query then 'q' - when :command then 'c' + when :query then 'q' + when :command then 'c' end end if qcn.nil? || qcn == 'com.orientechnologies.orient.core.sql.query.OSQLSynchQuery' - qcn = 'q' + qcn = 'q' end options[:query_class_name] = qcn @@ -90,62 +88,87 @@ def self.command(socket, session, command, options = {}) end def self.db_create(socket, session, database, options = {}) - if options.is_a?(String) - options = { :storage_type => options } - end + if options.is_a?(String) + options = { :storage_type => options } + end - options = { - :database_type => 'document' - }.merge(options) + options = { + :database_type => 'document' + }.merge(options) - super + super end - + def self.read_clusters(socket) - clusters = [] - - num_clusters = read_short(socket) - (num_clusters).times do |x| - cluster = - { - :name => read_string(socket), - :id => read_short(socket), - :type => read_string(socket), - :data_segment => read_short(socket) - } - clusters << cluster - - end - - clusters + clusters = [] + + num_clusters = read_short(socket) + (num_clusters).times do |x| + cluster = + { + :name => read_string(socket), + :id => read_short(socket), + :type => read_string(socket), + :data_segment => read_short(socket) + } + clusters << cluster + + end + + clusters end - + + def self.read_record_load(socket) + result = nil + + status = read_byte(socket) + + while (status != PayloadStatuses::NO_RECORDS) + case status + when PayloadStatuses::RESULTSET + record = record || read_record(socket) + case record[:record_type] + when 'd'.ord + result = result || record + result[:document] = deserializer.deserialize(record[:bytes])[:document] + else + raise "Unsupported record type: #{record[:record_type]}" + end + else + raise "Unsupported payload status: #{status}" + end + status = read_byte(socket) + end + + result + end + def self.read_db_open(socket) - session = read_integer(socket) - clusters = read_clusters(socket) - { :session => session, - :clusters => clusters, - :cluster_config => read_string(socket) } + session = read_integer(socket) + clusters = read_clusters(socket) + { :session => session, + :clusters => clusters, + :cluster_config => read_string(socket) } end - + def self.record_create(socket, session, cluster_id, record) - command = Commands::RecordCreate.new :session => session, - :cluster_id => cluster_id, - :record_content => serializer.serialize(record) - command.write(socket) - - read_response(socket) - - { :session => read_integer(socket), - :message_content => read_record_create(socket).merge({ :cluster_id => cluster_id }) } - end + command = Commands::RecordCreate12.new :session => session, + :cluster_id => cluster_id, + :record_content => serializer.serialize(record) + command.write(socket) + + read_response(socket) + + { :session => read_integer(socket), + :message_content => read_record_create(socket).merge({ :cluster_id => cluster_id }) } + end def self.db_open(socket, database, options = {}) command = Commands::DbOpen.new :protocol_version => self.version, - :database_name => database, - :database_type => options[:database_type] || 'document', - :user_name => options[:user], - :user_password => options[:password] + :database_name => database, + :database_type => options[:database_type] || 'document', + :user_name => options[:user], + :user_password => options[:password] command.write(socket) read_response(socket) @@ -153,43 +176,49 @@ def self.db_open(socket, database, options = {}) { :session => read_integer(socket), :message_content => read_db_open(socket) } end - + def self.config_get(socket, session, config_name) config = Commands::ConfigGet.new :session => session, - :config_name => config_name - + :config_name => config_name + config.write(socket) - + response = read_response(socket) { :session => read_integer(socket), :value => read_string(socket) } - + end def self.record_load(socket, session, rid, options = {}) command = Commands::RecordLoad12.new :session => session, - :cluster_id => rid.cluster_id, - :cluster_position => rid.cluster_position, - :ignore_cache => options[:ignore_cache] === true ? 1 : 0 + :cluster_id => rid.cluster_id, + :cluster_position => rid.cluster_position + # :ignore_cache => options[:ignore_cache] === true ? 1 : 0 + command.write(socket) read_response(socket) - + { :session => read_integer(socket), :message_content => read_record_load(socket) } end + + def self.read_record_create(socket) + { :cluster_position => read_long(socket), + :record_version => read_integer(socket) } + end private def self.make_db_create_command(*args) - session = args.shift - database = args.shift - options = args.shift - - Commands::DbCreate.new :session => session, - :database => database, - :database_type => options[:database_type].to_s, - :storage_type => options[:storage_type] + session = args.shift + database = args.shift + options = args.shift + + Commands::DbCreate.new :session => session, + :database => database, + :database_type => options[:database_type].to_s, + :storage_type => options[:storage_type] end end diff --git a/orient_db_client.gemspec b/orient_db_client.gemspec index ecb7b2d..e0a23b0 100644 --- a/orient_db_client.gemspec +++ b/orient_db_client.gemspec @@ -23,4 +23,5 @@ Gem::Specification.new do |s| s.add_development_dependency "minitest", "~> 3.1.0" s.add_development_dependency "mocha", "~> 0.12.0" s.add_development_dependency "rake" + s.add_development_dependency "pry" end diff --git a/test/integration/database_session_12_test.rb b/test/integration/database_session_12_test.rb index c059b8a..d61f94a 100644 --- a/test/integration/database_session_12_test.rb +++ b/test/integration/database_session_12_test.rb @@ -1,5 +1,8 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' +require 'pp' +require 'pry' + class TestDatabaseSession < MiniTest::Unit::TestCase include ServerConfig include ConnectionHelper @@ -54,6 +57,52 @@ def test_query end end end + + def test_multi_create12 + cluster = "Test123" + + ensure_cluster_exists(@session, cluster) + @session.reload + + cluster_id = @session.get_cluster(cluster)[:id] + + record = { :this => "sucks" } + + rid = @session.create_record(cluster_id, record) + puts "Created rid: #{rid}" + binding.pry + rec = @session.load_record(rid) + pp rec + + end + + def test_create_and_delete_record12 + + cluster = "OTest" + + ensure_cluster_exists(@session, cluster) + @session.reload + + cluster_id = @session.get_cluster(cluster)[:id] + + record = { :key1 => "value1" } + + rid = @session.create_record(cluster_id, record) + created_record = @session.load_record(rid) + + assert_equal cluster_id, rid.cluster_id + assert_equal 0, rid.cluster_position + + refute_nil created_record + refute_nil created_record[:document]['key1'] + + assert_equal record[:key1], created_record[:document]['key1'] + + assert @session.delete_record(rid, created_record[:record_version]) + assert_nil @session.load_record(rid) + + ensure_cluster_does_not_exist(@session, cluster) + end def test_load_record result = @session.load_record("#4:0") diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index 9e8b9f5..be20ca1 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -101,7 +101,7 @@ def test_create_cluster end def test_create_and_delete_record - return + cluster = "OTest" ensure_cluster_exists(@session, cluster) @@ -112,7 +112,6 @@ def test_create_and_delete_record rid = @session.create_record(cluster_id, record) created_record = @session.load_record(rid) - assert_equal cluster_id, rid.cluster_id assert_equal 0, rid.cluster_position From 38753e027c901b7041209984678c00ee8ffdf4b7 Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 11 Nov 2012 14:34:29 -0500 Subject: [PATCH 20/21] removed unneeded debug stuff... --- lib/orient_db_client/connection.rb | 1 - orient_db_client.gemspec | 1 - test/integration/database_session_12_test.rb | 7 +------ 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index 7ed4527..8591825 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -97,7 +97,6 @@ def load_record(session, rid) result = @protocol.record_load(@socket, session, rid) - pp result if result[:message_content] result[:message_content].tap do |r| diff --git a/orient_db_client.gemspec b/orient_db_client.gemspec index e0a23b0..ecb7b2d 100644 --- a/orient_db_client.gemspec +++ b/orient_db_client.gemspec @@ -23,5 +23,4 @@ Gem::Specification.new do |s| s.add_development_dependency "minitest", "~> 3.1.0" s.add_development_dependency "mocha", "~> 0.12.0" s.add_development_dependency "rake" - s.add_development_dependency "pry" end diff --git a/test/integration/database_session_12_test.rb b/test/integration/database_session_12_test.rb index d61f94a..294a2d6 100644 --- a/test/integration/database_session_12_test.rb +++ b/test/integration/database_session_12_test.rb @@ -1,8 +1,5 @@ require File.join File.dirname(__FILE__), '..', 'test_helper' -require 'pp' -require 'pry' - class TestDatabaseSession < MiniTest::Unit::TestCase include ServerConfig include ConnectionHelper @@ -69,10 +66,8 @@ def test_multi_create12 record = { :this => "sucks" } rid = @session.create_record(cluster_id, record) - puts "Created rid: #{rid}" - binding.pry rec = @session.load_record(rid) - pp rec + end From e79af9fd404d52acd4b4b3ca8b5c255be7f5345f Mon Sep 17 00:00:00 2001 From: Joshua Harding Date: Sun, 16 Dec 2012 13:21:53 -0500 Subject: [PATCH 21/21] added command support to connection this allows for non-idempotent commands (create class, etc.) to be run --- lib/orient_db_client/connection.rb | 8 ++++++++ lib/orient_db_client/protocols/protocol7.rb | 2 ++ test/integration/connection_test.rb | 1 + test/integration/database_session_12_test.rb | 5 +++++ test/integration/database_session_test.rb | 2 +- test/integration/server_session_test.rb | 2 -- 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/orient_db_client/connection.rb b/lib/orient_db_client/connection.rb index 8591825..2907480 100644 --- a/lib/orient_db_client/connection.rb +++ b/lib/orient_db_client/connection.rb @@ -131,6 +131,14 @@ def query(session, text, options = {}) result[:message_content] end + + def command(session, text, options = {}) + options[:query_class_name] = :command + + result = @protocol.command(@socket, session, text, options) + + result[:message_content] + end def reload(session) result = @protocol.db_reload(@socket, session) diff --git a/lib/orient_db_client/protocols/protocol7.rb b/lib/orient_db_client/protocols/protocol7.rb index 120a334..7c96fe6 100644 --- a/lib/orient_db_client/protocols/protocol7.rb +++ b/lib/orient_db_client/protocols/protocol7.rb @@ -629,6 +629,8 @@ def self.read_command(socket) collection = read_record_collection(socket) result.concat collection break + when PayloadStatuses::SERIALIZED + result.push(status) else raise "Unsupported payload status: #{status}" end diff --git a/test/integration/connection_test.rb b/test/integration/connection_test.rb index 85dcf45..9bfb336 100644 --- a/test/integration/connection_test.rb +++ b/test/integration/connection_test.rb @@ -15,4 +15,5 @@ def teardown def test_establishing_a_connection assert_instance_of OrientDbClient::Connection, @connection end + end diff --git a/test/integration/database_session_12_test.rb b/test/integration/database_session_12_test.rb index 294a2d6..48c8899 100644 --- a/test/integration/database_session_12_test.rb +++ b/test/integration/database_session_12_test.rb @@ -71,6 +71,11 @@ def test_multi_create12 end + def test_create_class + @connection.command(@session.id, "Create class testclass") + @connection.command(@session.id, "drop class testclass") + end + def test_create_and_delete_record12 cluster = "OTest" diff --git a/test/integration/database_session_test.rb b/test/integration/database_session_test.rb index be20ca1..d04e897 100644 --- a/test/integration/database_session_test.rb +++ b/test/integration/database_session_test.rb @@ -91,7 +91,7 @@ def test_create_cluster new_cluster = @session.create_physical_cluster(cluster) - assert_equal 8, new_cluster + assert new_cluster assert @session.cluster_exists?(cluster) diff --git a/test/integration/server_session_test.rb b/test/integration/server_session_test.rb index a3beb30..ceba257 100644 --- a/test/integration/server_session_test.rb +++ b/test/integration/server_session_test.rb @@ -16,8 +16,6 @@ def setup def teardown @connection.close if @connection end - - def test_database_exists_command assert @session.database_exists?(@options["database"])