arango-driver 3.5.0.alpha0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +1073 -0
- data/arango_opal.js +15 -0
- data/lib/arango-driver.rb +61 -0
- data/lib/arango.rb +96 -0
- data/lib/arango/aql.rb +188 -0
- data/lib/arango/collection.rb +575 -0
- data/lib/arango/collection/documents.rb +122 -0
- data/lib/arango/collection/edges.rb +149 -0
- data/lib/arango/collection/importing.rb +57 -0
- data/lib/arango/collection/indexes.rb +53 -0
- data/lib/arango/collection/replication.rb +24 -0
- data/lib/arango/collection/user.rb +28 -0
- data/lib/arango/cursor.rb +67 -0
- data/lib/arango/database.rb +188 -0
- data/lib/arango/database/analyzer.rb +21 -0
- data/lib/arango/database/aql_functions.rb +54 -0
- data/lib/arango/database/aql_queries.rb +114 -0
- data/lib/arango/database/aql_query_cache.rb +27 -0
- data/lib/arango/database/collections.rb +100 -0
- data/lib/arango/database/foxx_services.rb +103 -0
- data/lib/arango/database/graph_access.rb +27 -0
- data/lib/arango/database/http_route.rb +9 -0
- data/lib/arango/database/replication.rb +96 -0
- data/lib/arango/database/stream_transactions.rb +25 -0
- data/lib/arango/database/tasks.rb +67 -0
- data/lib/arango/database/transactions.rb +15 -0
- data/lib/arango/database/user.rb +26 -0
- data/lib/arango/database/view_access.rb +37 -0
- data/lib/arango/document.rb +443 -0
- data/lib/arango/edge.rb +164 -0
- data/lib/arango/error.rb +97 -0
- data/lib/arango/error_db.rb +27 -0
- data/lib/arango/foxx.rb +255 -0
- data/lib/arango/graph.rb +202 -0
- data/lib/arango/graph/basics.rb +39 -0
- data/lib/arango/graph/edge_access.rb +56 -0
- data/lib/arango/graph/vertex_access.rb +33 -0
- data/lib/arango/helper/collection_assignment.rb +13 -0
- data/lib/arango/helper/database_assignment.rb +14 -0
- data/lib/arango/helper/request_method.rb +45 -0
- data/lib/arango/helper/return.rb +21 -0
- data/lib/arango/helper/satisfaction.rb +28 -0
- data/lib/arango/helper/server_assignment.rb +13 -0
- data/lib/arango/helper/traversal.rb +12 -0
- data/lib/arango/index.rb +103 -0
- data/lib/arango/replication.rb +231 -0
- data/lib/arango/request.rb +92 -0
- data/lib/arango/request_batch.rb +174 -0
- data/lib/arango/result.rb +130 -0
- data/lib/arango/search_view.rb +23 -0
- data/lib/arango/server.rb +68 -0
- data/lib/arango/server/administration.rb +296 -0
- data/lib/arango/server/agency.rb +23 -0
- data/lib/arango/server/async.rb +51 -0
- data/lib/arango/server/batch.rb +35 -0
- data/lib/arango/server/config.rb +76 -0
- data/lib/arango/server/databases.rb +71 -0
- data/lib/arango/server/monitoring.rb +17 -0
- data/lib/arango/server/opal_support.rb +95 -0
- data/lib/arango/server/tasks.rb +69 -0
- data/lib/arango/server/user.rb +22 -0
- data/lib/arango/task.rb +223 -0
- data/lib/arango/transaction.rb +113 -0
- data/lib/arango/traversal.rb +212 -0
- data/lib/arango/user.rb +174 -0
- data/lib/arango/version.rb +3 -0
- data/lib/arango/vertex.rb +112 -0
- data/lib/arango/view.rb +124 -0
- data/lib/arango/view/basics.rb +25 -0
- metadata +296 -0
@@ -0,0 +1,174 @@
|
|
1
|
+
module Arango
|
2
|
+
class RequestBatch
|
3
|
+
include Arango::Helper::Satisfaction
|
4
|
+
include Arango::Helper::Return
|
5
|
+
include Arango::Helper::DatabaseAssignment
|
6
|
+
include Arango::Helper::ServerAssignment
|
7
|
+
|
8
|
+
# Initialize a new request batch.
|
9
|
+
# Request must be a Hash with the keys:
|
10
|
+
# - :id, optional
|
11
|
+
# - :action, required
|
12
|
+
# - :url, required
|
13
|
+
# - :body, optional
|
14
|
+
# @param server [Arango::Server] The server the requests should be run on. One of server or database must be given.
|
15
|
+
# @param database [Arango::Database] The database the requests should be run on. One of server or database must be given.
|
16
|
+
# @param requests [Array<Hash>, Hash] Array of requests or a single request as Hash, optional.
|
17
|
+
# @return [Arango::RequestBatch]
|
18
|
+
def initialize(server: nil, database: nil, requests: [])
|
19
|
+
@id = 1
|
20
|
+
if database
|
21
|
+
assign_database(database)
|
22
|
+
elsif server
|
23
|
+
assign_server(server)
|
24
|
+
else
|
25
|
+
raise Arango::Error.new(err: :server_or_database_must_be_given)
|
26
|
+
end
|
27
|
+
send(:requests=, requests)
|
28
|
+
@boundary = "ArangoDriverRequestPart"
|
29
|
+
@headers = { 'Content-Type' => "multipart/form-data; boundary=#{@boundary}" }
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_reader :database, :requests, :server
|
33
|
+
|
34
|
+
# Assign a bunch of requests.
|
35
|
+
# @param requests [Array<Hash>, Hash] Array of requests or a single request as Hash, optional.
|
36
|
+
# @return [Array<Hash>]
|
37
|
+
def requests=(requests)
|
38
|
+
requests = [requests] unless requests.is_a?(Array)
|
39
|
+
@requests = {}
|
40
|
+
requests.each do |request|
|
41
|
+
add_request(**request)
|
42
|
+
end
|
43
|
+
return @requests
|
44
|
+
end
|
45
|
+
|
46
|
+
# Add a single request
|
47
|
+
# @param id [String] optional
|
48
|
+
# @param action [String]
|
49
|
+
# @param url [String]
|
50
|
+
# @param body [Hash] optional
|
51
|
+
def add_request(get: nil, head: nil, patch: nil, post: nil, put: nil, delete: nil, body: nil, query: nil, headers: nil, block: nil, promise: nil)
|
52
|
+
id = @id.to_s
|
53
|
+
@id += 1
|
54
|
+
@requests[id] = {
|
55
|
+
id: id,
|
56
|
+
body: body,
|
57
|
+
query: query,
|
58
|
+
block: block,
|
59
|
+
headers: headers,
|
60
|
+
promise: promise
|
61
|
+
}.delete_if{|_,v| v.nil?}
|
62
|
+
@requests[id][:action] = if get then @requests[id][:url] = get; 'GET'
|
63
|
+
elsif head then @requests[id][:url] = head; 'HEAD'
|
64
|
+
elsif patch then @requests[id][:url] = patch; 'PATCH'
|
65
|
+
elsif post then @requests[id][:url] = post; 'POST'
|
66
|
+
elsif put then @requests[id][:url] = put; 'PUT'
|
67
|
+
elsif delete then @requests[id][:url] = delete; 'DELETE'
|
68
|
+
end
|
69
|
+
@requests[id]
|
70
|
+
end
|
71
|
+
alias modify_request add_request
|
72
|
+
|
73
|
+
def delete_request(id)
|
74
|
+
@requests.delete(id)
|
75
|
+
@requests
|
76
|
+
end
|
77
|
+
|
78
|
+
# Execute the request batch.
|
79
|
+
# @return [Hash<Arango::Result]
|
80
|
+
def execute
|
81
|
+
body = ""
|
82
|
+
@requests.each do |id, request|
|
83
|
+
body << "--#{@boundary}\r\n"
|
84
|
+
body << "Content-Type: application/x-arango-batchpart\r\n"
|
85
|
+
body << "Content-Id: #{id}\r\n\r\n"
|
86
|
+
url = "/#{request[:url]}"
|
87
|
+
if request.key?(:query)
|
88
|
+
url << '?'
|
89
|
+
url << URI.encode_www_form(request[:query])
|
90
|
+
end
|
91
|
+
body << "#{request[:action]} #{url} HTTP/1.1\r\n"
|
92
|
+
if request.key?(:headers)
|
93
|
+
request[:headers].each do |header, value|
|
94
|
+
body << "#{header}: #{value}\r\n"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
body << "\r\n"
|
98
|
+
unless request[:body].nil?
|
99
|
+
request[:body].delete_if{|_,v| v.nil?}
|
100
|
+
body << "#{Oj.dump(request[:body], mode: :json)}\r\n"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
body << "--#{@boundary}--\r\n\r\n" if @requests.length > 0
|
104
|
+
result = if @database
|
105
|
+
@database.request(post: '_api/batch', body: body, headers: @headers)
|
106
|
+
else
|
107
|
+
@server.request(post: '_api/batch', body: body, headers: @headers)
|
108
|
+
end
|
109
|
+
result_hash = _parse_result(result)
|
110
|
+
_check_for_errors(result_hash)
|
111
|
+
final_result = result_hash
|
112
|
+
result_hash.each_key do |id|
|
113
|
+
request = @requests[id.to_s]
|
114
|
+
if request.key?(:block)
|
115
|
+
result = result_hash[id]
|
116
|
+
if request.key?(:promise)
|
117
|
+
block_result = request[:block].call(result)
|
118
|
+
final_result = request[:promise].resolve(block_result)
|
119
|
+
else
|
120
|
+
final_result = request[:block].call(result)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
final_result
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def _check_for_errors(result_hash)
|
130
|
+
result_hash.each do |k, result|
|
131
|
+
if !result.is_array? && result.error?
|
132
|
+
raise Arango::ErrorDB.new(message: result.error_message, code: result.code, data: result.to_h, error_num: result.error_num,
|
133
|
+
action: '', url: '', request: { request_part: k })
|
134
|
+
end
|
135
|
+
end
|
136
|
+
result_hash
|
137
|
+
end
|
138
|
+
|
139
|
+
def _parse_result(result)
|
140
|
+
parts = result.split("--#{@boundary}")
|
141
|
+
result_hash = {}
|
142
|
+
parts.each do |part|
|
143
|
+
if part == "" || part == "--"
|
144
|
+
false
|
145
|
+
else
|
146
|
+
key = nil
|
147
|
+
is_json = false
|
148
|
+
body = nil
|
149
|
+
code = 0
|
150
|
+
lines = part.split("\r\n")
|
151
|
+
lines.each do |line|
|
152
|
+
if line.start_with?('Content-Id: ')
|
153
|
+
key = line[12..-1]
|
154
|
+
elsif line.start_with?('HTTP/1.1 ')
|
155
|
+
code = line[9..12].to_i
|
156
|
+
elsif line.start_with?('Content-Type: application/json')
|
157
|
+
is_json = true
|
158
|
+
elsif line.start_with?('{') || line.start_with?('[')
|
159
|
+
if is_json
|
160
|
+
body = Oj.load(line, mode: :json, smybol_keys: true)
|
161
|
+
else
|
162
|
+
body = line
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
res = Arango::Result.new(is_json ? body : { body: body })
|
167
|
+
res.response_code = code
|
168
|
+
result_hash[key.to_sym] = res
|
169
|
+
end
|
170
|
+
end
|
171
|
+
result_hash
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module Arango
|
2
|
+
class Result
|
3
|
+
def initialize(result)
|
4
|
+
@result = result ? result : {}
|
5
|
+
@is_array = @result.class == Array
|
6
|
+
@result.transform_keys!(&:to_sym) unless @is_array
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor :response_code
|
10
|
+
|
11
|
+
# standard fields
|
12
|
+
def code
|
13
|
+
return @result[:code] if @result.key?(:code)
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def error?
|
18
|
+
return @result[:error] if @result.key?(:error)
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def error_message
|
23
|
+
return @result[:errorMessage] if @result.key?(:errorMessage)
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
alias errorMessage error_message
|
27
|
+
|
28
|
+
def error_num
|
29
|
+
return @result[:errorNum] if @result.key?(:errorNum)
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
alias errorNum error_num
|
33
|
+
|
34
|
+
# access to all other fields
|
35
|
+
def [](field_name_or_index)
|
36
|
+
return @result[field_name_or_index] if @is_array
|
37
|
+
field_name_y = field_name_or_index.to_sym
|
38
|
+
return @result[field_name_y] if @result.key?(field_name_y)
|
39
|
+
field_name_s = field_name_or_index.to_s
|
40
|
+
field_name_lcy = field_name_s.camelize(:lower).to_sym
|
41
|
+
return @result[field_name_lcy] if @result.key?(field_name_lcy)
|
42
|
+
field_name_ucy = field_name_s.camelize(:upper).to_sym
|
43
|
+
return @result[field_name_ucy] if @result.key?(field_name_ucy)
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def []=(field_name_or_index, value)
|
48
|
+
return @result[field_name_or_index] = value if @is_array
|
49
|
+
field_name_y = field_name_or_index.to_sym
|
50
|
+
return @result[field_name_y] = value if @result.key?(field_name_y)
|
51
|
+
field_name_s = field_name_or_index.to_s
|
52
|
+
field_name_lcy = field_name_s.camelize(:lower).to_sym
|
53
|
+
return @result[field_name_lcy] = value if @result.key?(field_name_lcy)
|
54
|
+
field_name_ucy = field_name_s.camelize(:upper).to_sym
|
55
|
+
return @result[field_name_ucy] = value if @result.key?(field_name_ucy)
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def method_missing(field_name_or_index, *args, &block)
|
60
|
+
return self[field_name_or_index] = args[0] if field_name_or_index.to_s.end_with?('=')
|
61
|
+
return self[field_name_or_index] if @is_array
|
62
|
+
field_name_or_index = field_name_or_index.to_sym
|
63
|
+
return self[field_name_or_index] if key?(field_name_or_index)
|
64
|
+
@result.send(field_name_or_index, *args, &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
# convenience
|
68
|
+
def delete_if(*args, &block)
|
69
|
+
@result.delete_if(*args, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
def empty?
|
73
|
+
@result.empty?
|
74
|
+
end
|
75
|
+
|
76
|
+
def first
|
77
|
+
@result.first
|
78
|
+
end
|
79
|
+
|
80
|
+
def is_array?
|
81
|
+
@is_array
|
82
|
+
end
|
83
|
+
|
84
|
+
def key?(key)
|
85
|
+
return false if @is_array
|
86
|
+
field_name_y = key.to_sym
|
87
|
+
return true if @result.key?(field_name_y)
|
88
|
+
field_name_s = key.to_s
|
89
|
+
field_name_lcy = field_name_s.camelize(:lower).to_sym
|
90
|
+
return true if @result.key?(field_name_lcy)
|
91
|
+
field_name_ucy = field_name_s.camelize(:upper).to_sym
|
92
|
+
return true if @result.key?(field_name_ucy)
|
93
|
+
false
|
94
|
+
end
|
95
|
+
alias has_key? key?
|
96
|
+
|
97
|
+
def map(*args, &block)
|
98
|
+
@result.map(*args, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
def raw_result
|
102
|
+
@result
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_underscored_h
|
106
|
+
hash = to_h
|
107
|
+
hash.transform_keys { |k| k.to_s.underscore }
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_h
|
111
|
+
return @result unless @is_array
|
112
|
+
@result.to_h
|
113
|
+
end
|
114
|
+
alias to_hash to_h
|
115
|
+
|
116
|
+
def to_a
|
117
|
+
return @result if @is_array
|
118
|
+
@result.to_a
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_ary
|
122
|
+
return @result.to_ary if @is_array
|
123
|
+
to_a
|
124
|
+
end
|
125
|
+
|
126
|
+
def to_s
|
127
|
+
@result.to_s
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# === SERVER ===
|
2
|
+
|
3
|
+
module Arango
|
4
|
+
class Server
|
5
|
+
include Arango::Helper::Satisfaction
|
6
|
+
|
7
|
+
include Arango::Server::Administration
|
8
|
+
include Arango::Server::Config
|
9
|
+
include Arango::Server::Databases
|
10
|
+
include Arango::Server::Monitoring
|
11
|
+
include Arango::Server::Tasks
|
12
|
+
include Arango::Server::OpalSupport
|
13
|
+
|
14
|
+
# Connect to a ArangoDB server.
|
15
|
+
# @param username [String]
|
16
|
+
# @param password [String]
|
17
|
+
# @param host [String]
|
18
|
+
# @param port [String]
|
19
|
+
# @param tls [Boolean] Use TLS for the connection, optional, default: false.
|
20
|
+
# @return [Arango::Server]
|
21
|
+
def initialize(username: "root", password:, host: "localhost", warning: true, port: "8529", return_output: false, timeout: 5, tls: false)
|
22
|
+
@tls = tls
|
23
|
+
@host = host
|
24
|
+
@port = port
|
25
|
+
@username = username
|
26
|
+
@password = password
|
27
|
+
@options = { body: {}, headers: {}, query: {}, userpwd: "#{username}:#{password}" }
|
28
|
+
@return_output = return_output
|
29
|
+
@warning = warning
|
30
|
+
@active_cache = active_cache
|
31
|
+
@timeout = timeout
|
32
|
+
set_base_uri
|
33
|
+
@request = Arango::Request.new(base_uri: @base_uri, options: @options)
|
34
|
+
end
|
35
|
+
|
36
|
+
def endpoint
|
37
|
+
"tcp://#{@host}:#{@port}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def request(*args)
|
41
|
+
@request.request(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns information about the currently running transactions.
|
45
|
+
# @return [Arango::Result]
|
46
|
+
def transactions
|
47
|
+
request(get: '_admin/wal/transactions')
|
48
|
+
end
|
49
|
+
|
50
|
+
# Check if transactions are running on server.
|
51
|
+
# @return [Boolean]
|
52
|
+
def transactions_running?
|
53
|
+
transactions.running_transactions > 0
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def download(*args)
|
59
|
+
@request.download(*args)
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_base_uri
|
63
|
+
@base_uri = "http"
|
64
|
+
@base_uri += "s" if @tls
|
65
|
+
@base_uri += "://#{@host}:#{@port}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,296 @@
|
|
1
|
+
module Arango
|
2
|
+
class Server
|
3
|
+
module Administration
|
4
|
+
# Check availability of the server.
|
5
|
+
# @return [Boolean]
|
6
|
+
def available?
|
7
|
+
200 == request(get: '_admin/server/availability').code
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns information about all coordinator endpoints (cluster only).
|
11
|
+
# @return [Array<String>]
|
12
|
+
def cluster_endpoints
|
13
|
+
if in_cluster?
|
14
|
+
endpoints = request(get: "_api/cluster/endpoints").endpoints
|
15
|
+
endpoints.map { |e| e[:endpoint] }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns information about all server endpoints.
|
20
|
+
# @return [Array<String>]
|
21
|
+
def endpoints
|
22
|
+
endpoints = request(get: "_api/endpoint")
|
23
|
+
endpoints.map { |e| e[:endpoint] }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Send back what was sent in, headers, post body etc.
|
27
|
+
# @param request_hash [Hash] The request body.
|
28
|
+
# @return [Hash]
|
29
|
+
def echo(request_hash)
|
30
|
+
result = request(post: "_admin/echo", body: request_hash)
|
31
|
+
Oj.load(result.requestBody, symbol_keys: true)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return server database engine information
|
35
|
+
# @return [Arango::Result]
|
36
|
+
def engine
|
37
|
+
@engine ||= request(get: '_api/engine')
|
38
|
+
end
|
39
|
+
|
40
|
+
# Return true if the server uses the mmfiles engine.
|
41
|
+
# @return [Boolean]
|
42
|
+
def mmfiles?
|
43
|
+
'mmfiles' == engine.name
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return true if the server uses the rocksdb engine.
|
47
|
+
# @return [Boolean]
|
48
|
+
def rocksdb?
|
49
|
+
'rocksdb' == engine.name
|
50
|
+
end
|
51
|
+
|
52
|
+
# Read global logs from the server.
|
53
|
+
# Log levels for the upto and level params:
|
54
|
+
# - fatal or 0
|
55
|
+
# - error or 1
|
56
|
+
# - warning or 2
|
57
|
+
# - info or 3
|
58
|
+
# - debug or 4
|
59
|
+
# The parameters upto and level are mutually exclusive.
|
60
|
+
# All params are optional.
|
61
|
+
# @param upto [Symbol, String, Integer] Returns all log entries up to log level upto. The default value is info.
|
62
|
+
# @param level [Symbol, String, Integer]Returns all log entries of log level level.
|
63
|
+
# @param start Returns all log entries such that their log entry identifier (lid value) is greater or equal to start.
|
64
|
+
# @param size [Integer] Restricts the result to at most size log entries.
|
65
|
+
# @param offset [Integer] Starts to return log entries skipping the first offset log entries. offset and size can be used for pagination.
|
66
|
+
# @param search [String] Only return the log entries containing the text specified in search.
|
67
|
+
# @param sort [Symbol, String] Sort the log entries either ascending (if sort is :asc) or descending (if sort is :desc) according to their lid values.
|
68
|
+
# @return [Arango::Result]
|
69
|
+
def log(upto: nil, level: nil, start: nil, size: nil, offset: nil, search: nil, sort: nil)
|
70
|
+
sort = sort.to_s if sort
|
71
|
+
satisfy_category?(sort, [nil, "asc", "desc"])
|
72
|
+
query = { start: start, size: size, offset: offset, search: search, sort: sort }
|
73
|
+
if upto
|
74
|
+
upto = upto.to_s
|
75
|
+
satisfy_category?(upto, [nil, "fatal", 0, "error", 1, "warning", 2, "info", 3, "debug", 4])
|
76
|
+
query[:upto] = upto
|
77
|
+
elsif level
|
78
|
+
level = level.to_s
|
79
|
+
satisfy_category?(level, [nil, "fatal", 0, "error", 1, "warning", 2, "info", 3, "debug", 4])
|
80
|
+
query[:level] = level
|
81
|
+
end
|
82
|
+
request(get: "_admin/log", query: query)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns the current log level settings
|
86
|
+
# @return [Arango::Result]
|
87
|
+
def log_level
|
88
|
+
request(get: "_admin/log/level")
|
89
|
+
end
|
90
|
+
|
91
|
+
# Modifies the current log level settings
|
92
|
+
# @param log_level_object [Arango::Result, Hash] Must contain all keys as obtained by log_level. Best is to get the object by calling log_level,
|
93
|
+
# modifying it, and passing it here.
|
94
|
+
# @return Arango::Result
|
95
|
+
def log_level=(log_level_object)
|
96
|
+
body = if log_level_object.class == Arango::Result
|
97
|
+
log_level_object.to_h
|
98
|
+
else
|
99
|
+
log_level_object
|
100
|
+
end
|
101
|
+
request(put: "_admin/log/level", body: body)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Return mode information about a server.
|
105
|
+
# @return [Symbol] one of :default or :readonly
|
106
|
+
def mode
|
107
|
+
request(get: "_admin/server/mode").mode.to_sym
|
108
|
+
end
|
109
|
+
|
110
|
+
# Set server mode.
|
111
|
+
# @param mode [String, Symbol] one of :default or :readonly
|
112
|
+
# @return [Symbol] one of :default or :readonly
|
113
|
+
def mode=(mode)
|
114
|
+
satisfy_category?(mode, ["default", "readonly", :default, :readonly])
|
115
|
+
body = { mode: mode.to_s }
|
116
|
+
request(put: "_admin/server/mode", body: body).mode
|
117
|
+
end
|
118
|
+
|
119
|
+
# Check if server is read only.
|
120
|
+
# @return [Boolean]
|
121
|
+
def read_only?
|
122
|
+
:readonly == mode
|
123
|
+
end
|
124
|
+
|
125
|
+
# Reloads the routing information from the collection routing.
|
126
|
+
# @return true
|
127
|
+
def reload_routing
|
128
|
+
request(get: "_admin/routing/reload")
|
129
|
+
true
|
130
|
+
end
|
131
|
+
|
132
|
+
# Returns the role of a server in a cluster.
|
133
|
+
# SINGLE: the server is a standalone server without clustering
|
134
|
+
# COORDINATOR: the server is a Coordinator in a cluster
|
135
|
+
# PRIMARY: the server is a DBServer in a cluster
|
136
|
+
# SECONDARY: this role is not used anymore
|
137
|
+
# AGENT: the server is an Agency node in a cluster
|
138
|
+
# UNDEFINED: in a cluster, UNDEFINED is returned if the server role cannot be
|
139
|
+
# determined.
|
140
|
+
# @return [String]
|
141
|
+
def role
|
142
|
+
@role ||= request(get: '_admin/server/role').role
|
143
|
+
end
|
144
|
+
|
145
|
+
# Check if server role is AGENT.
|
146
|
+
# @return [Boolean]
|
147
|
+
def agent?
|
148
|
+
role == 'AGENT'
|
149
|
+
end
|
150
|
+
|
151
|
+
# Check if server role is COORDINATOR.
|
152
|
+
# @return [Boolean]
|
153
|
+
def coordinator?
|
154
|
+
role == 'COORDINATOR'
|
155
|
+
end
|
156
|
+
|
157
|
+
# Check if server role is PRIMARY.
|
158
|
+
# @return [Boolean]
|
159
|
+
def primary?
|
160
|
+
role == 'PRIMARY'
|
161
|
+
end
|
162
|
+
|
163
|
+
# Check if server role is SECONDARY.
|
164
|
+
# @return [Boolean]
|
165
|
+
def secondary?
|
166
|
+
role == 'SECONDARY'
|
167
|
+
end
|
168
|
+
|
169
|
+
# Check if server role is SINGLE.
|
170
|
+
# @return [Boolean]
|
171
|
+
def single?
|
172
|
+
role == 'SINGLE'
|
173
|
+
end
|
174
|
+
|
175
|
+
# Check if server is part of a cluster.
|
176
|
+
# @return [Boolean]
|
177
|
+
def in_cluster?
|
178
|
+
coordinator? || primary? || agent? || secondary?
|
179
|
+
end
|
180
|
+
|
181
|
+
# Returns the id of a server in a cluster.
|
182
|
+
# @return [Boolean]
|
183
|
+
def server_id
|
184
|
+
request(get: "_admin/server/id").serverId if in_cluster?
|
185
|
+
end
|
186
|
+
|
187
|
+
# Returns the statistics information.
|
188
|
+
# @return [Arango::Result]
|
189
|
+
def statistics
|
190
|
+
request(get: "_admin/statistics")
|
191
|
+
end
|
192
|
+
|
193
|
+
# Returns a description of the statistics returned by /_admin/statistics.
|
194
|
+
# @return [Arango::Result]
|
195
|
+
def statistics_description
|
196
|
+
request(get: "_admin/statistics-description")
|
197
|
+
end
|
198
|
+
|
199
|
+
# Returns status information about the server.
|
200
|
+
# @return [Arango::Result]
|
201
|
+
def status
|
202
|
+
request(get: "_admin/status")
|
203
|
+
end
|
204
|
+
|
205
|
+
# Check if the server has the enterprise license.
|
206
|
+
# @return [Boolean]
|
207
|
+
def enterprise?
|
208
|
+
@enterprise ||= (status.license == 'enterprise')
|
209
|
+
end
|
210
|
+
|
211
|
+
# The servers current system time as a Unix timestamp with microsecond precision of the server
|
212
|
+
# @return [Float]
|
213
|
+
def time
|
214
|
+
request(get: "_admin/time").time
|
215
|
+
end
|
216
|
+
|
217
|
+
# Return server version details.
|
218
|
+
# The response will contain a details attribute with additional information about included components
|
219
|
+
# and their versions. The attribute names and internals of the details object may vary depending on platform and ArangoDB version.
|
220
|
+
# @return [Arango::Result]
|
221
|
+
def detailed_version
|
222
|
+
request(get: "_api/version", query: { details: true })
|
223
|
+
end
|
224
|
+
|
225
|
+
# The server version string. The string has the format “major.minor.sub”. major and minor will be numeric, and sub may contain a number or
|
226
|
+
# a textual version.
|
227
|
+
# @return [String]
|
228
|
+
def version
|
229
|
+
request(get: "_api/version").version
|
230
|
+
end
|
231
|
+
|
232
|
+
# Returns the database version that this server requires.
|
233
|
+
# @return [String]
|
234
|
+
def target_version
|
235
|
+
request(get: "_admin/database/target-version").version
|
236
|
+
end
|
237
|
+
|
238
|
+
# Flushes the write-ahead log. By flushing the currently active write-ahead
|
239
|
+
# logfile, the data in it can be transferred to collection journals and
|
240
|
+
# datafiles. This is useful to ensure that all data for a collection is
|
241
|
+
# present in the collection journals and datafiles, for example, when dumping
|
242
|
+
# the data of a collection.
|
243
|
+
# @param wait_for_sync [Boolean] Whether or not the operation should block until the not-yet synchronized data in the write-ahead log was
|
244
|
+
# synchronized to disk.
|
245
|
+
# @param wait_for_collector [Boolean] Whether or not the operation should block until the data in the flushed log has been collected by the
|
246
|
+
# write-ahead log garbage collector. Note that setting this option to true might block for a long time if
|
247
|
+
# there are long-running transactions and the write-ahead log garbage collector cannot
|
248
|
+
# finish garbage collection.
|
249
|
+
def flush_wal(wait_for_sync: nil, wait_for_collector: nil)
|
250
|
+
body = {
|
251
|
+
waitForSync: wait_for_sync,
|
252
|
+
waitForCollector: wait_for_collector
|
253
|
+
}
|
254
|
+
!!request(put: "_admin/wal/flush", body: body)
|
255
|
+
end
|
256
|
+
|
257
|
+
# Retrieves the configuration of the write-ahead log. Properties:
|
258
|
+
# - allow_oversize_entries: whether or not operations that are bigger than a single logfile can be executed and stored
|
259
|
+
# - log_file_size: the size of each write-ahead logfile
|
260
|
+
# - historic_logfiles: the maximum number of historic logfiles to keep
|
261
|
+
# - reserve_logfiles: the maximum number of reserve logfiles that ArangoDB allocates in the background
|
262
|
+
# - throttle_wait: the maximum wait time that operations will wait before they get aborted if case of write-throttling (in milliseconds)
|
263
|
+
# - throttle_when_pending: the number of unprocessed garbage-collection operations that, when reached, will activate write-throttling.
|
264
|
+
# A value of 0 means that write-throttling will not be triggered.
|
265
|
+
# return [Arango::Result]
|
266
|
+
def wal_properties
|
267
|
+
result = request(get: "_admin/wal/properties")
|
268
|
+
raise "WAL properties not available." if result.response_code >= 500
|
269
|
+
result
|
270
|
+
end
|
271
|
+
|
272
|
+
# Configures the behavior of the write-ahead log.
|
273
|
+
# @param properties_object [Arango::Result] Obtain the object with wal_properties, modify and pass here.
|
274
|
+
#
|
275
|
+
def wal_properties=(properties_object)
|
276
|
+
body = {
|
277
|
+
allowOversizeEntries: properties_object.allow_oversize_entries,
|
278
|
+
logfileSize: properties_object.logfile_size,
|
279
|
+
historicLogfiles: properties_object.historic_logfiles,
|
280
|
+
reserveLogfiles: properties_object.reserve_logfiles,
|
281
|
+
throttleWait: properties_object.throttle_wait,
|
282
|
+
throttleWhenPending: properties_object.throttle_when_pending
|
283
|
+
}
|
284
|
+
result = request(put: "_admin/wal/properties", body: body)
|
285
|
+
raise "WAL properties not available." if result.response_code >= 500
|
286
|
+
result
|
287
|
+
end
|
288
|
+
|
289
|
+
# Shutdown the server.
|
290
|
+
# @return [Boolean] True if request was successful.
|
291
|
+
def shutdown
|
292
|
+
200 == request(delete: "_admin/shutdown").response_code
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|