arangorb 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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