arangorb 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/ArangoRB.gemspec +18 -18
  3. data/Gemfile +8 -7
  4. data/LICENSE +21 -21
  5. data/README.md +906 -867
  6. data/lib/ArangoRB_AQL.rb +181 -160
  7. data/lib/ArangoRB_Cache.rb +174 -174
  8. data/lib/ArangoRB_Col.rb +526 -499
  9. data/lib/ArangoRB_DB.rb +363 -339
  10. data/lib/ArangoRB_Doc.rb +319 -298
  11. data/lib/ArangoRB_Edg.rb +184 -169
  12. data/lib/ArangoRB_Gra.rb +201 -180
  13. data/lib/ArangoRB_Index.rb +135 -115
  14. data/lib/ArangoRB_Replication.rb +261 -0
  15. data/lib/ArangoRB_Ser.rb +446 -441
  16. data/lib/ArangoRB_Task.rb +129 -113
  17. data/lib/ArangoRB_Tra.rb +169 -142
  18. data/lib/ArangoRB_Tran.rb +68 -53
  19. data/lib/ArangoRB_User.rb +149 -136
  20. data/lib/ArangoRB_Ver.rb +162 -147
  21. data/lib/arangorb.rb +16 -15
  22. data/spec/arangoRB_helper.rb +4 -4
  23. data/spec/arangoRestart_helper.rb +14 -14
  24. data/spec/lib/0.1.0/arangoAQL_helper.rb +64 -64
  25. data/spec/lib/0.1.0/arangoC_helper.rb +170 -170
  26. data/spec/lib/0.1.0/arangoDB_helper.rb +119 -119
  27. data/spec/lib/0.1.0/arangoDoc_helper.rb +79 -79
  28. data/spec/lib/0.1.0/arangoE_helper.rb +50 -50
  29. data/spec/lib/0.1.0/arangoG_helper.rb +78 -78
  30. data/spec/lib/0.1.0/arangoS_helper.rb +37 -37
  31. data/spec/lib/0.1.0/arangoT_helper.rb +48 -48
  32. data/spec/lib/0.1.0/arangoV_helper.rb +65 -65
  33. data/spec/lib/1.0.0/arangoC_helper.rb +73 -73
  34. data/spec/lib/1.0.0/arangoDB_helper.rb +48 -48
  35. data/spec/lib/1.0.0/arangoI_helper.rb +43 -43
  36. data/spec/lib/1.0.0/arangoS_helper.rb +192 -192
  37. data/spec/lib/1.0.0/arangoTa_helper.rb +49 -49
  38. data/spec/lib/1.0.0/arangoTr_helper.rb +15 -15
  39. data/spec/lib/1.0.0/arangoU_helper.rb +72 -72
  40. data/spec/lib/1.1.0/arangoRB_helper.rb +144 -144
  41. data/spec/lib/1.1.0/arangoRB_walks_helper.rb +19 -19
  42. data/spec/lib/1.2.0/arangoCache_helper.rb +66 -66
  43. data/spec/lib/1.3.0/arangoHash_helper.rb +30 -0
  44. data/spec/lib/arangoRB_0.1.0_helper.rb +9 -9
  45. data/spec/lib/arangoRB_1.0.0_helper.rb +6 -6
  46. data/spec/lib/arangoRB_1.1.0_helper.rb +2 -2
  47. data/spec/lib/arangoRB_1.2.0_helper.rb +2 -1
  48. data/spec/spec_helper.rb +41 -41
  49. metadata +6 -5
@@ -1,441 +1,446 @@
1
- # === SERVER ===
2
-
3
- class ArangoServer
4
- include HTTParty
5
-
6
- @@verbose = false
7
- @@async = false
8
- @@database = "_system"
9
- @@graph = nil
10
- @@collection = nil
11
- @@user = nil
12
- @@request = {:body => {}, :headers => {}, :query => {}}
13
- @@password = ""
14
- @@username = "root"
15
- @@server = "localhost"
16
- @@port = "8529"
17
- @@cluster = "cluster-test"
18
-
19
- def self.default_server(user: @@username, password: @@password, server: @@server, port: @@port) # TESTED
20
- base_uri "http://#{server}:#{port}"
21
- basic_auth user, password
22
- @@username = user
23
- @@password = password
24
- @@server = server
25
- @@port = port
26
- end
27
-
28
- def self.address # TESTED
29
- "#{@@server}:#{@@port}"
30
- end
31
-
32
- def self.username # TESTED
33
- @@username
34
- end
35
-
36
- def self.verbose=(verbose) # TESTED
37
- @@verbose = verbose
38
- end
39
-
40
- def self.verbose # TESTED
41
- @@verbose
42
- end
43
-
44
- def self.async=(async) # TESTED
45
- @@async = async
46
- if async == true || async == "true"
47
- @@request[:headers] = {"x-arango-async" => "true"}
48
- elsif async == "store"
49
- @@request[:headers] = {"x-arango-async" => "store"}
50
- else
51
- @@request[:headers] = {}
52
- end
53
- end
54
-
55
- def self.async # TESTED
56
- @@async
57
- end
58
-
59
- def self.database=(database) # TESTED
60
- if database.is_a? String
61
- @@database = database
62
- elsif database.is_a? ArangoDatabase
63
- @@database = database.database
64
- else
65
- raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
66
- end
67
- ArangoDatabase.new(database: @@database)
68
- end
69
-
70
- def self.database # TESTED
71
- ArangoDatabase.new(database: @@database)
72
- end
73
-
74
- def self.graph=(graph) # TESTED
75
- if graph.is_a? String
76
- @@graph = graph
77
- elsif graph.is_a? ArangoGraph
78
- @@graph = graph.graph
79
- else
80
- raise "graph should be a String or an ArangoGraph instance, not a #{graph.class}"
81
- end
82
- ArangoGraph.new(database: @@database, graph: @@graph)
83
- end
84
-
85
- def self.graph # TESTED
86
- ArangoGraph.new(database: @@database, graph: @@graph)
87
- end
88
-
89
- def self.collection=(collection) # TESTED
90
- if collection.is_a? String
91
- @@collection = collection
92
- elsif collection.is_a? ArangoCollection
93
- @@collection = collection.collection
94
- else
95
- raise "graph should be a String or an ArangoCollection instance, not a #{collection.class}"
96
- end
97
- ArangoCollection.new(database: @@database, collection: @@collection)
98
- end
99
-
100
- def self.collection # TESTED
101
- ArangoCollection.new(database: @@database, collection: @@collection)
102
- end
103
-
104
- def self.user=(user)
105
- if user.is_a? String
106
- @@user = user
107
- elsif user.is_a? ArangoUser
108
- @@user = user.user
109
- else
110
- raise "graph should be a String or an ArangoUser instance, not a #{user.class}"
111
- end
112
- ArangoUser.new(user: @@user)
113
- end
114
-
115
- def self.user # TESTED
116
- ArangoUser.new(user: @@user)
117
- end
118
-
119
- def self.request # TESTED
120
- @@request
121
- end
122
-
123
- def self.cluster
124
- @@cluster
125
- end
126
-
127
- def self.cluster=(cluster)
128
- @@cluster = cluster
129
- end
130
-
131
- # === MONITORING ===
132
-
133
- def self.log # TESTED
134
- result = get("/_admin/log", @@request)
135
- return_result result: result
136
- end
137
-
138
- def self.reload # TESTED
139
- result = post("/_admin/routing/reload", @@request)
140
- return_result result: result, caseTrue: true
141
- end
142
-
143
- def self.statistics description: false # TESTED
144
- if description
145
- result = get("/_admin/statistics-description", @@request)
146
- else
147
- result = get("/_admin/statistics", @@request)
148
- end
149
- return_result result: result
150
- end
151
-
152
- def self.role # TESTED
153
- result = get("/_admin/server/role", @@request)
154
- return_result result: result, key: "role"
155
- end
156
-
157
- def self.server
158
- result = get("/_admin/server/id", @@request)
159
- return_result result: result
160
- end
161
-
162
- def self.clusterStatistics dbserver:
163
- query = {"DBserver": dbserver}
164
- request = @@request.merge({ :query => query })
165
- result = get("/_admin/clusterStatistics", request)
166
- return_result result: result
167
- end
168
-
169
- # === LISTS ===
170
-
171
- def self.endpoints # TESTED
172
- result = get("/_api/endpoint", @@request)
173
- return_result result: result
174
- end
175
-
176
- def self.users # TESTED
177
- result = get("/_api/user", @@request)
178
- return result.headers["x-arango-async-id"] if @@async == "store"
179
- result = result.parsed_response
180
- @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoUser.new(user: x["user"], active: x["active"], extra: x["extra"])}
181
- end
182
-
183
- def self.databases(user: nil) # TESTED
184
- ArangoDatabase.databases user: user
185
- end
186
-
187
-
188
- def self.tasks # TESTED
189
- result = get("/_api/tasks", @@request)
190
- return result.headers["x-arango-async-id"] if @@async == "store"
191
- result = result.parsed_response
192
- @@verbose ? result : (result.is_a?(Hash) && result["error"]) ? result["errorMessage"] : result.map{|x| ArangoTask.new(id: x["id"], name: x["name"], type: x["type"], period: x["period"], created: x["created"], command: x["command"], database: x["database"])}
193
- end
194
-
195
- # === ASYNC ===
196
-
197
- def self.pendingAsync # TESTED
198
- result = get("/_api/job/pending")
199
- return_result_async result: result
200
- end
201
-
202
- def self.fetchAsync(id:) # TESTED
203
- result = put("/_api/job/#{id}")
204
- return_result_async result: result
205
- end
206
-
207
- def self.retrieveAsync(type: nil, id: nil) # TESTED
208
- result = id.nil? ? get("/_api/job/#{type}") : get("/_api/job/#{id}")
209
- return_result_async result: result
210
- end
211
-
212
- def self.retrieveDoneAsync # TESTED
213
- retrieveAsync(type: "done")
214
- end
215
-
216
- def self.retrievePendingAsync # TESTED
217
- retrieveAsync(type: "pending")
218
- end
219
-
220
- def self.cancelAsync(id:) # TESTED
221
- result = put("/_api/job/#{id}/cancel")
222
- return_result_async result: result
223
- end
224
-
225
- def self.destroyAsync(type: nil, id: nil) # TESTED
226
- result = id.nil? ? delete("/_api/job/#{type}") : delete("/_api/job/#{id}")
227
- return_result_async result: result, caseTrue: true
228
- end
229
-
230
- def self.destroyAllAsync # TESTED
231
- destroyAsync(type: "all")
232
- end
233
-
234
- def self.destroyExpiredAsync # TESTED
235
- destroyAsync(type: "expired")
236
- end
237
-
238
- # === BATCH ===
239
-
240
- def self.batch(queries:) # TESTED
241
- headers = {
242
- "Content-Type": "multipart/form-data",
243
- "boundary": "XboundaryX"
244
- }
245
- body = ""
246
- queries.each{|query|
247
- body += "--XboundaryX\n"
248
- body += "Content-Type: application/x-arango-batchpart\n"
249
- body += "Content-Id: #{query[:id]}\n" unless query[:id].nil?
250
- body += "\n"
251
- body += "#{query[:type]} "
252
- body += "#{query[:address]} HTTP/1.1\n"
253
- body += "\n#{query[:body].to_json}\n" unless query[:body].nil?
254
- }
255
- body += "--XboundaryX--\n" if queries.length > 0
256
- request = @@request.merge({ :body => body, :headers => headers })
257
- result = post("/_api/batch", request)
258
- return_result result: result
259
- end
260
-
261
- def self.destroyDumpBatch(id:, dbserver: nil) # TESTED
262
- query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
263
- request = @@request.merge({ :query => query })
264
- result = delete("/_api/replication/batch/#{id}", request)
265
- return true if result.nil?
266
- return result["errorMessage"] if result["error"]
267
- end
268
-
269
- def self.createDumpBatch(ttl:, dbserver: nil) # TESTED
270
- query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
271
- body = { "ttl" => ttl }
272
- request = @@request.merge({ :body => body.to_json, :query => query })
273
- result = post("/_api/replication/batch", request)
274
- return_result result: result, key: "id"
275
- end
276
-
277
- def self.prolongDumpBatch(id:, ttl:, dbserver: nil) # TESTED
278
- query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
279
- body = { "ttl" => ttl }
280
- request = @@request.merge({ :body => body.to_json, :query => query })
281
- result = post("/_api/replication/batch/#{id}", request)
282
- return_result result: result, key: "id"
283
- end
284
-
285
- # === REPLICATION ===
286
-
287
- def self.serverId # TESTED
288
- result = get("/_api/replication/server-id", @@request)
289
- return_result result: result, key: "serverId"
290
- end
291
-
292
- # === SHARDING ===
293
-
294
- def self.clusterRoundtrip(cluster: @@cluster)
295
- result = get("/_admin/#{cluster}", @@request)
296
- return_result result: result
297
- end
298
-
299
- def self.executeCluster(body:, cluster: @@cluster)
300
- request = @@request.merge({ "body" => body.to_json })
301
- result = post("/_admin/#{cluster}", request)
302
- return_result result: result
303
- end
304
-
305
- def self.executeClusterPut(body:, cluster: @@cluster)
306
- request = @@request.merge({ "body" => body.to_json })
307
- result = put("/_admin/#{cluster}", request)
308
- return_result result: result
309
- end
310
-
311
- def self.destroyCluster(cluster: @@cluster)
312
- result = delete("/_admin/#{cluster}", @@request)
313
- return_result result: result, caseTrue: true
314
- end
315
-
316
- def self.updateCluster(body:, cluster: @@cluster)
317
- request = @@request.merge({ "body" => body.to_json })
318
- result = patch("/_admin/#{cluster}", request)
319
- return_result result: result, caseTrue: true
320
- end
321
-
322
- def self.executeClusterHead(body:, cluster: @@cluster)
323
- result = head("/_admin/#{cluster}", @@request)
324
- return_result result: result
325
- end
326
-
327
- def self.checkPort(port:)
328
- query = {"port": port}
329
- request = @@request.merge({ "query" => query })
330
- result = get("/_admin/clusterCheckPort", request)
331
- return_result result: result
332
- end
333
-
334
- # === MISCELLANEOUS FUNCTIONS ===
335
-
336
- def self.version(details: nil) # TESTED
337
- query = {"details": details}
338
- request = @@request.merge({ "query" => query })
339
- result = get("/_api/version", request)
340
- return_result result: result
341
- end
342
-
343
- def self.flushWAL(waitForSync: nil, waitForCollector: nil) # TESTED
344
- body = {
345
- "waitForSync" => waitForSync,
346
- "waitForCollector" => waitForCollector
347
- }.delete_if{|k,v| v.nil?}.to_json
348
- request = @@request.merge({ :body => body })
349
- result = put("/_admin/wal/flush", request)
350
- return_result result: result, caseTrue: true
351
- end
352
-
353
- def self.propertyWAL # TESTED
354
- result = put("/_admin/wal/properties", @@request)
355
- return_result result: result
356
- end
357
-
358
- def self.changePropertyWAL(allowOversizeEntries: nil, logfileSize: nil, historicLogfiles: nil, reserveLogfiles: nil, throttleWait: nil, throttleWhenPending: nil) # TESTED
359
- body = {
360
- "allowOversizeEntries" => allowOversizeEntries,
361
- "logfileSize" => allowOversizeEntries,
362
- "historicLogfiles" => historicLogfiles,
363
- "reserveLogfiles" => reserveLogfiles,
364
- "throttleWait" => throttleWait,
365
- "throttleWhenPending" => throttleWhenPending
366
- }.delete_if{|k,v| v.nil?}.to_json
367
- request = @@request.merge({ :body => body })
368
- result = put("/_admin/wal/properties", request)
369
- return_result result: result
370
- end
371
-
372
- def self.transactions # TESTED
373
- result = get("/_admin/wal/transactions", @@request)
374
- return_result result: result
375
- end
376
-
377
- def self.time # TESTED
378
- result = get("/_admin/time", @@request)
379
- return_result result: result, key: "time"
380
- end
381
-
382
- def self.echo # TESTED
383
- result = get("/_admin/echo", @@request)
384
- return_result result: result
385
- end
386
-
387
- # def self.longEcho body: {}
388
- # request = @@request.merge({ :body => body.to_json })
389
- # result = get("/_admin/long_echo", request)
390
- # return_result result: result
391
- # end
392
-
393
- def self.databaseVersion # TESTED
394
- result = get("/_admin/database/target-version", @@request)
395
- return_result result: result, key: "version"
396
- end
397
-
398
- def self.sleep(duration:) # TESTED
399
- query = {"duration": duration}
400
- request = @@request.merge({ "query" => query })
401
- result = get("/_admin/sleep", request)
402
- return_result result: result, key: "duration"
403
- end
404
-
405
- def self.shutdown # TESTED
406
- result = delete("/_admin/shutdown", @@request)
407
- return_result result: result, caseTrue: true
408
- end
409
-
410
- def self.restart
411
- `sudo service arangodb restart`
412
- end
413
-
414
- def self.test(body:)
415
- request = @@request.merge({ "body" => body.to_json })
416
- result = post("/_admin/test", request)
417
- return_result result: result
418
- end
419
-
420
- def self.execute(body:)
421
- request = @@request.merge({ "body" => body.to_json })
422
- result = post("/_admin/execute", request)
423
- return_result result: result
424
- end
425
-
426
- # === UTILITY ===
427
-
428
- def self.return_result(result:, caseTrue: false, key: nil)
429
- return result.headers["x-arango-async-id"] if @@async == "store"
430
- result = result.parsed_response
431
- return result if @@verbose || !result.is_a?(Hash)
432
- return result["errorMessage"] if result["error"]
433
- return true if caseTrue
434
- return key.nil? ? result.delete_if{|k,v| k == "error" || k == "code"} : result[key]
435
- end
436
-
437
- def self.return_result_async(result:, caseTrue: false)
438
- result = result.parsed_response
439
- (@@verbose || !result.is_a?(Hash)) ? result : result["error"] ? result["errorMessage"] : caseTrue ? true : result.delete_if{|k,v| k == "error" || k == "code"}
440
- end
441
- end
1
+ # === SERVER ===
2
+
3
+ class ArangoServer
4
+ include HTTParty
5
+
6
+ @@verbose = false
7
+ @@async = false
8
+ @@database = "_system"
9
+ @@graph = nil
10
+ @@collection = nil
11
+ @@user = nil
12
+ @@request = {:body => {}, :headers => {}, :query => {}}
13
+ @@password = ""
14
+ @@username = "root"
15
+ @@server = "localhost"
16
+ @@port = "8529"
17
+ @@cluster = "cluster-test"
18
+
19
+ def self.default_server(user: @@username, password: @@password, server: @@server, port: @@port) # TESTED
20
+ base_uri "http://#{server}:#{port}"
21
+ basic_auth user, password
22
+ @@username = user
23
+ @@password = password
24
+ @@server = server
25
+ @@port = port
26
+ end
27
+
28
+ def self.address # TESTED
29
+ "#{@@server}:#{@@port}"
30
+ end
31
+
32
+ def self.username # TESTED
33
+ @@username
34
+ end
35
+
36
+ def self.verbose=(verbose) # TESTED
37
+ @@verbose = verbose
38
+ end
39
+
40
+ def self.verbose # TESTED
41
+ @@verbose
42
+ end
43
+
44
+ def self.async=(async) # TESTED
45
+ if async == true || async == "true"
46
+ @@request[:headers] = {"x-arango-async" => "true"}
47
+ @@async = true
48
+ elsif async == "store"
49
+ @@request[:headers] = {"x-arango-async" => "store"}
50
+ @@async = "store"
51
+ else
52
+ @@request[:headers] = {}
53
+ @@async = false
54
+ end
55
+ end
56
+
57
+ def self.async # TESTED
58
+ @@async
59
+ end
60
+
61
+ def self.database=(database) # TESTED
62
+ if database.is_a? String
63
+ @@database = database
64
+ elsif database.is_a? ArangoDatabase
65
+ @@database = database.database
66
+ else
67
+ raise "database should be a String or an ArangoDatabase instance, not a #{database.class}"
68
+ end
69
+ ArangoDatabase.new(database: @@database)
70
+ end
71
+
72
+ def self.database # TESTED
73
+ ArangoDatabase.new(database: @@database)
74
+ end
75
+
76
+ def self.graph=(graph) # TESTED
77
+ if graph.is_a? String
78
+ @@graph = graph
79
+ elsif graph.is_a? ArangoGraph
80
+ @@graph = graph.graph
81
+ else
82
+ raise "graph should be a String or an ArangoGraph instance, not a #{graph.class}"
83
+ end
84
+ ArangoGraph.new(database: @@database, graph: @@graph)
85
+ end
86
+
87
+ def self.graph # TESTED
88
+ ArangoGraph.new(database: @@database, graph: @@graph)
89
+ end
90
+
91
+ def self.collection=(collection) # TESTED
92
+ if collection.is_a? String
93
+ @@collection = collection
94
+ elsif collection.is_a? ArangoCollection
95
+ @@collection = collection.collection
96
+ else
97
+ raise "graph should be a String or an ArangoCollection instance, not a #{collection.class}"
98
+ end
99
+ ArangoCollection.new(database: @@database, collection: @@collection)
100
+ end
101
+
102
+ def self.collection # TESTED
103
+ ArangoCollection.new(database: @@database, collection: @@collection)
104
+ end
105
+
106
+ def self.user=(user)
107
+ if user.is_a? String
108
+ @@user = user
109
+ elsif user.is_a? ArangoUser
110
+ @@user = user.user
111
+ else
112
+ raise "graph should be a String or an ArangoUser instance, not a #{user.class}"
113
+ end
114
+ ArangoUser.new(user: @@user)
115
+ end
116
+
117
+ def self.user # TESTED
118
+ ArangoUser.new(user: @@user)
119
+ end
120
+
121
+ def self.request # TESTED
122
+ @@request
123
+ end
124
+
125
+ def self.cluster
126
+ @@cluster
127
+ end
128
+
129
+ def self.cluster=(cluster)
130
+ @@cluster = cluster
131
+ end
132
+
133
+ # === MONITORING ===
134
+
135
+ def self.log # TESTED
136
+ result = get("/_admin/log", @@request)
137
+ return_result result: result
138
+ end
139
+
140
+ def self.reload # TESTED
141
+ result = post("/_admin/routing/reload", @@request)
142
+ return_result result: result, caseTrue: true
143
+ end
144
+
145
+ def self.statistics description: false # TESTED
146
+ if description
147
+ result = get("/_admin/statistics-description", @@request)
148
+ else
149
+ result = get("/_admin/statistics", @@request)
150
+ end
151
+ return_result result: result
152
+ end
153
+
154
+ def self.role # TESTED
155
+ result = get("/_admin/server/role", @@request)
156
+ return_result result: result, key: "role"
157
+ end
158
+
159
+ def self.server
160
+ result = get("/_admin/server/id", @@request)
161
+ return_result result: result
162
+ end
163
+
164
+ def self.clusterStatistics dbserver:
165
+ query = {"DBserver": dbserver}
166
+ request = @@request.merge({ :query => query })
167
+ result = get("/_admin/clusterStatistics", request)
168
+ return_result result: result
169
+ end
170
+
171
+ # === LISTS ===
172
+
173
+ def self.endpoints # TESTED
174
+ result = get("/_api/endpoint", @@request)
175
+ return_result result: result
176
+ end
177
+
178
+ def self.users # TESTED
179
+ result = get("/_api/user", @@request)
180
+ return result.headers["x-arango-async-id"] if @@async == "store"
181
+ return true if @@async
182
+ result = result.parsed_response
183
+ @@verbose ? result : result["error"] ? result["errorMessage"] : result["result"].map{|x| ArangoUser.new(user: x["user"], active: x["active"], extra: x["extra"])}
184
+ end
185
+
186
+ def self.databases(user: nil) # TESTED
187
+ ArangoDatabase.databases user: user
188
+ end
189
+
190
+
191
+ def self.tasks # TESTED
192
+ result = get("/_api/tasks", @@request)
193
+ return result.headers["x-arango-async-id"] if @@async == "store"
194
+ return true if @@async
195
+ result = result.parsed_response
196
+ @@verbose ? result : (result.is_a?(Hash) && result["error"]) ? result["errorMessage"] : result.map{|x| ArangoTask.new(id: x["id"], name: x["name"], type: x["type"], period: x["period"], created: x["created"], command: x["command"], database: x["database"])}
197
+ end
198
+
199
+ # === ASYNC ===
200
+
201
+ def self.pendingAsync # TESTED
202
+ result = get("/_api/job/pending")
203
+ return_result_async result: result
204
+ end
205
+
206
+ def self.fetchAsync(id:) # TESTED
207
+ result = put("/_api/job/#{id}")
208
+ return_result_async result: result
209
+ end
210
+
211
+ def self.retrieveAsync(type: nil, id: nil) # TESTED
212
+ result = id.nil? ? get("/_api/job/#{type}") : get("/_api/job/#{id}")
213
+ return_result_async result: result
214
+ end
215
+
216
+ def self.retrieveDoneAsync # TESTED
217
+ retrieveAsync(type: "done")
218
+ end
219
+
220
+ def self.retrievePendingAsync # TESTED
221
+ retrieveAsync(type: "pending")
222
+ end
223
+
224
+ def self.cancelAsync(id:) # TESTED
225
+ result = put("/_api/job/#{id}/cancel")
226
+ return_result_async result: result
227
+ end
228
+
229
+ def self.destroyAsync(type: nil, id: nil) # TESTED
230
+ result = id.nil? ? delete("/_api/job/#{type}") : delete("/_api/job/#{id}")
231
+ return_result_async result: result, caseTrue: true
232
+ end
233
+
234
+ def self.destroyAllAsync # TESTED
235
+ destroyAsync(type: "all")
236
+ end
237
+
238
+ def self.destroyExpiredAsync # TESTED
239
+ destroyAsync(type: "expired")
240
+ end
241
+
242
+ # === BATCH ===
243
+
244
+ def self.batch(queries:) # TESTED
245
+ headers = {
246
+ "Content-Type": "multipart/form-data",
247
+ "boundary": "XboundaryX"
248
+ }
249
+ body = ""
250
+ queries.each{|query|
251
+ body += "--XboundaryX\n"
252
+ body += "Content-Type: application/x-arango-batchpart\n"
253
+ body += "Content-Id: #{query[:id]}\n" unless query[:id].nil?
254
+ body += "\n"
255
+ body += "#{query[:type]} "
256
+ body += "#{query[:address]} HTTP/1.1\n"
257
+ body += "\n#{query[:body].to_json}\n" unless query[:body].nil?
258
+ }
259
+ body += "--XboundaryX--\n" if queries.length > 0
260
+ request = @@request.merge({ :body => body, :headers => headers })
261
+ result = post("/_api/batch", request)
262
+ return_result result: result
263
+ end
264
+
265
+ def self.destroyDumpBatch(id:, dbserver: nil) # TESTED
266
+ query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
267
+ request = @@request.merge({ :query => query })
268
+ result = delete("/_api/replication/batch/#{id}", request)
269
+ return true if result.nil?
270
+ return result["errorMessage"] if result["error"]
271
+ end
272
+
273
+ def self.createDumpBatch(ttl:, dbserver: nil) # TESTED
274
+ query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
275
+ body = { "ttl" => ttl }
276
+ request = @@request.merge({ :body => body.to_json, :query => query })
277
+ result = post("/_api/replication/batch", request)
278
+ return_result result: result, key: "id"
279
+ end
280
+
281
+ def self.prolongDumpBatch(id:, ttl:, dbserver: nil) # TESTED
282
+ query = {"DBserver" => dbserver}.delete_if{|k,v| v.nil?}
283
+ body = { "ttl" => ttl }
284
+ request = @@request.merge({ :body => body.to_json, :query => query })
285
+ result = post("/_api/replication/batch/#{id}", request)
286
+ return_result result: result, key: "id"
287
+ end
288
+
289
+ # === REPLICATION ===
290
+
291
+ def self.serverId # TESTED
292
+ result = get("/_api/replication/server-id", @@request)
293
+ return_result result: result, key: "serverId"
294
+ end
295
+
296
+ # === SHARDING ===
297
+
298
+ def self.clusterRoundtrip(cluster: @@cluster)
299
+ result = get("/_admin/#{cluster}", @@request)
300
+ return_result result: result
301
+ end
302
+
303
+ def self.executeCluster(body:, cluster: @@cluster)
304
+ request = @@request.merge({ "body" => body.to_json })
305
+ result = post("/_admin/#{cluster}", request)
306
+ return_result result: result
307
+ end
308
+
309
+ def self.executeClusterPut(body:, cluster: @@cluster)
310
+ request = @@request.merge({ "body" => body.to_json })
311
+ result = put("/_admin/#{cluster}", request)
312
+ return_result result: result
313
+ end
314
+
315
+ def self.destroyCluster(cluster: @@cluster)
316
+ result = delete("/_admin/#{cluster}", @@request)
317
+ return_result result: result, caseTrue: true
318
+ end
319
+
320
+ def self.updateCluster(body:, cluster: @@cluster)
321
+ request = @@request.merge({ "body" => body.to_json })
322
+ result = patch("/_admin/#{cluster}", request)
323
+ return_result result: result, caseTrue: true
324
+ end
325
+
326
+ def self.executeClusterHead(body:, cluster: @@cluster)
327
+ result = head("/_admin/#{cluster}", @@request)
328
+ return_result result: result
329
+ end
330
+
331
+ def self.checkPort(port:)
332
+ query = {"port": port}
333
+ request = @@request.merge({ "query" => query })
334
+ result = get("/_admin/clusterCheckPort", request)
335
+ return_result result: result
336
+ end
337
+
338
+ # === MISCELLANEOUS FUNCTIONS ===
339
+
340
+ def self.version(details: nil) # TESTED
341
+ query = {"details": details}
342
+ request = @@request.merge({ "query" => query })
343
+ result = get("/_api/version", request)
344
+ return_result result: result
345
+ end
346
+
347
+ def self.flushWAL(waitForSync: nil, waitForCollector: nil) # TESTED
348
+ body = {
349
+ "waitForSync" => waitForSync,
350
+ "waitForCollector" => waitForCollector
351
+ }.delete_if{|k,v| v.nil?}.to_json
352
+ request = @@request.merge({ :body => body })
353
+ result = put("/_admin/wal/flush", request)
354
+ return_result result: result, caseTrue: true
355
+ end
356
+
357
+ def self.propertyWAL # TESTED
358
+ result = put("/_admin/wal/properties", @@request)
359
+ return_result result: result
360
+ end
361
+
362
+ def self.changePropertyWAL(allowOversizeEntries: nil, logfileSize: nil, historicLogfiles: nil, reserveLogfiles: nil, throttleWait: nil, throttleWhenPending: nil) # TESTED
363
+ body = {
364
+ "allowOversizeEntries" => allowOversizeEntries,
365
+ "logfileSize" => allowOversizeEntries,
366
+ "historicLogfiles" => historicLogfiles,
367
+ "reserveLogfiles" => reserveLogfiles,
368
+ "throttleWait" => throttleWait,
369
+ "throttleWhenPending" => throttleWhenPending
370
+ }.delete_if{|k,v| v.nil?}.to_json
371
+ request = @@request.merge({ :body => body })
372
+ result = put("/_admin/wal/properties", request)
373
+ return_result result: result
374
+ end
375
+
376
+ def self.transactions # TESTED
377
+ result = get("/_admin/wal/transactions", @@request)
378
+ return_result result: result
379
+ end
380
+
381
+ def self.time # TESTED
382
+ result = get("/_admin/time", @@request)
383
+ return_result result: result, key: "time"
384
+ end
385
+
386
+ def self.echo # TESTED
387
+ result = get("/_admin/echo", @@request)
388
+ return_result result: result
389
+ end
390
+
391
+ # def self.longEcho body: {}
392
+ # request = @@request.merge({ :body => body.to_json })
393
+ # result = get("/_admin/long_echo", request)
394
+ # return_result result: result
395
+ # end
396
+
397
+ def self.databaseVersion # TESTED
398
+ result = get("/_admin/database/target-version", @@request)
399
+ return_result result: result, key: "version"
400
+ end
401
+
402
+ def self.sleep(duration:) # TESTED
403
+ query = {"duration": duration}
404
+ request = @@request.merge({ "query" => query })
405
+ result = get("/_admin/sleep", request)
406
+ return_result result: result, key: "duration"
407
+ end
408
+
409
+ def self.shutdown # TESTED
410
+ result = delete("/_admin/shutdown", @@request)
411
+ return_result result: result, caseTrue: true
412
+ end
413
+
414
+ def self.restart
415
+ `sudo service arangodb restart`
416
+ end
417
+
418
+ def self.test(body:)
419
+ request = @@request.merge({ "body" => body.to_json })
420
+ result = post("/_admin/test", request)
421
+ return_result result: result
422
+ end
423
+
424
+ def self.execute(body:)
425
+ request = @@request.merge({ "body" => body.to_json })
426
+ result = post("/_admin/execute", request)
427
+ return_result result: result
428
+ end
429
+
430
+ # === UTILITY ===
431
+
432
+ def self.return_result(result:, caseTrue: false, key: nil)
433
+ return result.headers["x-arango-async-id"] if @@async == "store"
434
+ return true if @@async
435
+ result = result.parsed_response
436
+ return result if @@verbose || !result.is_a?(Hash)
437
+ return result["errorMessage"] if result["error"]
438
+ return true if caseTrue
439
+ return key.nil? ? result.delete_if{|k,v| k == "error" || k == "code"} : result[key]
440
+ end
441
+
442
+ def self.return_result_async(result:, caseTrue: false)
443
+ result = result.parsed_response
444
+ (@@verbose || !result.is_a?(Hash)) ? result : result["error"] ? result["errorMessage"] : caseTrue ? true : result.delete_if{|k,v| k == "error" || k == "code"}
445
+ end
446
+ end