arcadedb 0.4 → 0.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -1
- data/Gemfile.lock +2 -36
- data/README.md +105 -30
- data/arcade.yml +4 -4
- data/bin/console +16 -16
- data/iruby/.ipynb_checkpoints/01-start-and-end-of-datarows-checkpoint.ipynb +258 -0
- data/iruby/01-start-and-end-of-datarows.ipynb +203 -0
- data/iruby/db-console.rb +73 -0
- data/lib/arcade/api/operations.rb +26 -65
- data/lib/arcade/api/primitives.rb +57 -29
- data/lib/arcade/base.rb +72 -39
- data/lib/{config.rb → arcade/config.rb} +5 -6
- data/lib/arcade/database.rb +104 -154
- data/lib/arcade/errors.rb +8 -0
- data/lib/arcade/match.rb +162 -0
- data/lib/{query.rb → arcade/query.rb} +34 -18
- data/lib/{support → arcade/support}/conversions.rb +1 -0
- data/lib/{support → arcade/support}/model.rb +20 -15
- data/lib/arcade/version.rb +1 -1
- data/lib/arcade.rb +11 -11
- data/lib/model/document.rb +22 -0
- data/lib/model/edge.rb +12 -0
- data/lib/model/vertex.rb +67 -48
- metadata +15 -12
- data/lib/match.rb +0 -216
- /data/lib/{init.rb → arcade/init.rb} +0 -0
- /data/lib/{support → arcade/support}/class.rb +0 -0
- /data/lib/{support → arcade/support}/object.rb +0 -0
- /data/lib/{support → arcade/support}/sql.rb +0 -0
- /data/lib/{support → arcade/support}/string.rb +0 -0
@@ -9,7 +9,7 @@ module Arcade
|
|
9
9
|
$ Arcade::Api.drop_database <a string> # returns true if successfull
|
10
10
|
|
11
11
|
$ Arcade::Api.create_document <database>, <type>, attributes
|
12
|
-
$ Arcade::Api.execute( <database> ) { <query> }
|
12
|
+
$ Arcade::Api.execute( <database> [, session_id: some_session_id ]) { <query> }
|
13
13
|
$ Arcade::Api.query( <database> ) { <query> }
|
14
14
|
$ Arcade::Api.get_record <database>, rid # returns a hash
|
15
15
|
|
@@ -38,7 +38,7 @@ module Arcade
|
|
38
38
|
return if databases.include?( name.to_s )
|
39
39
|
payload = { "command" => "create database #{name}" }
|
40
40
|
post_data "server", payload
|
41
|
-
rescue
|
41
|
+
rescue Arcade::QueryError => e
|
42
42
|
logger.fatal "Create database #{name} through \"POST create/#{name}\" failed"
|
43
43
|
logger.fatal e
|
44
44
|
raise
|
@@ -50,7 +50,7 @@ module Arcade
|
|
50
50
|
return unless databases.include?( name.to_s )
|
51
51
|
payload = {"command" => "drop database #{name}" }
|
52
52
|
post_data "server", payload
|
53
|
-
rescue
|
53
|
+
rescue Arcade::QueryError => e
|
54
54
|
logger.fatal "Drop database #{name} through \"POST drop database/#{name}\" failed"
|
55
55
|
raise
|
56
56
|
end
|
@@ -63,15 +63,13 @@ module Arcade
|
|
63
63
|
#
|
64
64
|
# returns the rid of the inserted dataset
|
65
65
|
#
|
66
|
-
def self.create_document database, type, **attributes
|
66
|
+
def self.create_document database, type, session_id: nil, **attributes
|
67
67
|
payload = { "@type" => type }.merge( attributes )
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
post_data "document/#{database}", options
|
68
|
+
if session_id.nil?
|
69
|
+
post_data "document/#{database}", payload
|
70
|
+
else
|
71
|
+
post_transaction "document/#{database}", payload, session_id: session_id
|
72
|
+
end
|
75
73
|
end
|
76
74
|
|
77
75
|
# ------------------------------ execute ------------------------------------------------- #
|
@@ -84,19 +82,23 @@ module Arcade
|
|
84
82
|
# Arcade::Api.execute( "devel" ) { 'select from test ' }
|
85
83
|
# =y [{"@rid"=>"#57:0", "@type"=>"test", "name"=>"Hugo"}, {"@rid"=>"#60:0", "@type"=>"test", "name"=>"Hubert"}]
|
86
84
|
#
|
87
|
-
def self.execute database,
|
88
|
-
pl =
|
89
|
-
if session_id.nil?
|
85
|
+
def self.execute database, session_id: nil
|
86
|
+
pl = provide_payload(yield)
|
87
|
+
if session_id.nil?
|
90
88
|
post_data "command/#{database}" , pl
|
91
89
|
else
|
92
|
-
post_transaction "command/#{database}" , pl, session_id
|
90
|
+
post_transaction "command/#{database}" , pl, session_id: session_id
|
93
91
|
end
|
94
92
|
end
|
95
93
|
|
96
94
|
# ------------------------------ query ------------------------------------------------- #
|
97
95
|
# same for idempotent queries
|
98
|
-
def self.query database, query
|
99
|
-
|
96
|
+
def self.query database, query, session_id: nil
|
97
|
+
if session_id.nil?
|
98
|
+
post_data "query/#{database}" , provide_payload(query)
|
99
|
+
else
|
100
|
+
post_transaction "query/#{database}" , provide_payload(query), session_id: session_id
|
101
|
+
end
|
100
102
|
end
|
101
103
|
|
102
104
|
# ------------------------------ get_record ------------------------------------------------- #
|
@@ -133,21 +135,17 @@ module Arcade
|
|
133
135
|
#
|
134
136
|
def self.property database, type, **args
|
135
137
|
|
136
|
-
begin_transaction database
|
138
|
+
s= begin_transaction database
|
137
139
|
success = args.map do | name, format |
|
138
|
-
r= execute(database) {" create property #{type.to_s}.#{name.to_s} #{format.to_s} " } &.first
|
139
|
-
|
140
|
-
if r.nil?
|
141
|
-
false
|
142
|
-
else
|
143
|
-
r[:operation] == 'create property'
|
144
|
-
end
|
140
|
+
r= execute(database, session_id: s) {" create property #{type.to_s}.#{name.to_s} #{format.to_s} " } &.first
|
141
|
+
r.nil? ? false : r[:operation] == 'create property'
|
145
142
|
end.uniq
|
146
143
|
if success == [true]
|
147
|
-
commit database
|
144
|
+
commit database, session_id: s
|
148
145
|
true
|
149
146
|
else
|
150
|
-
rollback database
|
147
|
+
rollback database log: false, session_id: s
|
148
|
+
false
|
151
149
|
end
|
152
150
|
|
153
151
|
|
@@ -160,9 +158,6 @@ module Arcade
|
|
160
158
|
unique_requested = "notunique" if properties.delete("notunique" )
|
161
159
|
automatic = true if
|
162
160
|
properties << name if properties.empty?
|
163
|
-
# puts " create index #{type.to_s}[#{name.to_s}] on #{type} ( #{properties.join(',')} ) #{unique_requested}"
|
164
|
-
# VV 22.10: providing an index-name raises an Error ( Encountered " "(" "( "" at line 1, column 44. Was expecting one of: <EOF> <SCHEMA> ... <NULL_STRATEGY> ... ";" ... "," ... )) )
|
165
|
-
# named indices droped for now
|
166
161
|
success = execute(database) {" create index IF NOT EXISTS on #{type} (#{properties.join(', ')}) #{unique_requested}" } &.first
|
167
162
|
# puts "success: #{success}"
|
168
163
|
success[:operation] == 'create index'
|
@@ -176,9 +171,6 @@ module Arcade
|
|
176
171
|
Database.logger
|
177
172
|
end
|
178
173
|
|
179
|
-
def self.session
|
180
|
-
@session_id
|
181
|
-
end
|
182
174
|
|
183
175
|
def self. provide_payload( the_yield, action: :post )
|
184
176
|
unless the_yield.is_a? Hash
|
@@ -207,7 +199,7 @@ module Arcade
|
|
207
199
|
[ :serializer, value.to_sym ]
|
208
200
|
end
|
209
201
|
when :language
|
210
|
-
if [:sql, :cypher, :gremlin, :neo4j ].include? value.to_sym
|
202
|
+
if [:sql, :cypher, :gremlin, :neo4j, :sqlscript, :graphql, :mongo ].include? value.to_sym
|
211
203
|
[ :language, value.to_sym ]
|
212
204
|
end
|
213
205
|
end # case
|
@@ -216,42 +208,11 @@ module Arcade
|
|
216
208
|
|
217
209
|
|
218
210
|
|
219
|
-
# returns the json-response ## retiered
|
220
|
-
def self.analyse_result r, command
|
221
|
-
if r.success?
|
222
|
-
return nil if r.status == 204 # no content
|
223
|
-
result = JSON.parse( r.response_body, symbolize_names: true )[:result]
|
224
|
-
if result == [{}]
|
225
|
-
[]
|
226
|
-
else
|
227
|
-
result
|
228
|
-
end
|
229
|
-
elsif r.timed_out?
|
230
|
-
raise Error "Timeout Error", caller
|
231
|
-
[]
|
232
|
-
elsif r.response_code > 0
|
233
|
-
logger.error "Execution Failure – Code: #{ r.response_code } – #{r.status_message} "
|
234
|
-
error_message = JSON.parse( r.response_body, symbolize_names: true )
|
235
|
-
logger.error "ErrorMessage: #{ error_message[:detail]} "
|
236
|
-
if error_message[:detail] =~ /Duplicated key/
|
237
|
-
raise IndexError, error_message[:detail]
|
238
|
-
else
|
239
|
-
# available fields: :detail, :exception, error
|
240
|
-
puts error_message[:detail]
|
241
|
-
#raise error_message[:detail], caller
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
211
|
def self.auth
|
246
212
|
@a ||= { httpauth: :basic,
|
247
213
|
username: Config.admin[:user],
|
248
214
|
password: Config.admin[:pass] }
|
249
215
|
end
|
250
216
|
|
251
|
-
# not tested
|
252
|
-
def self.delete_data command
|
253
|
-
result = HTTPX.delete Config.base_uri + command, auth
|
254
|
-
analyse_result(result, command)
|
255
|
-
end
|
256
217
|
end
|
257
218
|
end
|
@@ -8,7 +8,7 @@ module Arcade
|
|
8
8
|
# persistent http handle to the database
|
9
9
|
|
10
10
|
def http
|
11
|
-
|
11
|
+
# break_on = -> (response) { response.status == 500 }
|
12
12
|
@http ||= HTTPX.plugin(:basic_auth).basic_auth(auth[:username], auth[:password])
|
13
13
|
.plugin(:persistent)
|
14
14
|
.plugin(:circuit_breaker)
|
@@ -17,8 +17,16 @@ module Arcade
|
|
17
17
|
|
18
18
|
# ------------------------------ get data -------------------------------------------------------- #
|
19
19
|
def get_data command
|
20
|
-
response = http.get( Config.base_uri + command )
|
21
|
-
|
20
|
+
case response = http.get( Config.base_uri + command )
|
21
|
+
in {status: 200..299}
|
22
|
+
# success
|
23
|
+
JSON.parse( response.body, symbolize_names: true )[:result]
|
24
|
+
in {status: 400..}
|
25
|
+
raise Arcade::QueryError.new **response.json( symbolize_names: true )
|
26
|
+
else
|
27
|
+
# # http error
|
28
|
+
raise response
|
29
|
+
end
|
22
30
|
|
23
31
|
JSON.parse( response.body, symbolize_names: true )[:result]
|
24
32
|
# alternative to `raise for status `
|
@@ -41,56 +49,76 @@ module Arcade
|
|
41
49
|
|
42
50
|
# ------------------------------ post data -------------------------------------------------------- #
|
43
51
|
def post_data command, payload
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
52
|
+
case response = http.post( Config.base_uri + command, json: payload )
|
53
|
+
in {status: 200..299}
|
54
|
+
# success
|
55
|
+
JSON.parse( response.body, symbolize_names: true )[:result]
|
56
|
+
in {status: 400..}
|
57
|
+
detail = response.json( symbolize_names: true )[:detail]
|
58
|
+
if detail =~ /Please retry the operation/
|
59
|
+
logger.error "--------------------------------"
|
60
|
+
logger.error " ----> Operation repeated <---- "
|
61
|
+
logger.error detail
|
62
|
+
logger.error "The query --> #{payload.inspect}"
|
63
|
+
logger.error "--------------------------------"
|
64
|
+
sleep 1
|
65
|
+
post_data command, payload
|
66
|
+
else
|
67
|
+
raise Arcade::QueryError.new **response.json( symbolize_names: true )
|
68
|
+
end
|
69
|
+
else
|
70
|
+
# # http error
|
71
|
+
raise response
|
72
|
+
end
|
73
|
+
# response.raise_for_status
|
49
74
|
end
|
50
75
|
|
51
76
|
# ------------------------------ transaction ------------------------------------------------- #
|
52
77
|
#
|
78
|
+
# The payload, optional as a JSON, accepts the following parameters:
|
79
|
+
# isolationLevel: READ_COMMITTED (default) or REPEATABLE_READ. (not implemented)
|
80
|
+
#
|
53
81
|
def begin_transaction database
|
54
82
|
result = http.post Config.base_uri + "begin/#{database}"
|
55
|
-
@session_id = result.headers["arcadedb-session-id"]
|
56
83
|
# returns the session-id
|
84
|
+
result.headers["arcadedb-session-id"]
|
57
85
|
end
|
58
86
|
|
59
87
|
# ------------------------------ post transaction ------------------------------------------------- #
|
60
|
-
def post_transaction command, params, session_id
|
61
|
-
# http = HTTPX.plugin(:basic_auth)
|
62
|
-
# .basic_auth(auth[:username], auth[:password])
|
63
|
-
# .with( headers: { "arcadedb-session-id"=>session }, debug_level: 1)
|
88
|
+
def post_transaction command, params, session_id:
|
64
89
|
http_a = http.with( headers: { "arcadedb-session-id" => session_id } , debug_level: 1)
|
65
|
-
response = http_a.post( Config.base_uri + command, json: params )
|
66
|
-
|
67
|
-
|
68
|
-
|
90
|
+
case response = http_a.post( Config.base_uri + command, json: params )
|
91
|
+
in {status: 200..299}
|
92
|
+
# success
|
93
|
+
JSON.parse( response.body, symbolize_names: true )[:result]
|
94
|
+
in {status: 400..}
|
95
|
+
## debug
|
96
|
+
# puts "Command: #{command}"
|
97
|
+
# puts "params: #{params}"
|
98
|
+
# puts response.json( symbolize_names: true )
|
99
|
+
raise Arcade::QueryError.new **response.json( symbolize_names: true )
|
100
|
+
else
|
101
|
+
# # http error
|
102
|
+
raise response
|
103
|
+
end
|
69
104
|
end
|
70
105
|
|
71
106
|
# ------------------------------ commit ------------------------------------------------- #
|
72
|
-
def commit database, session_id
|
107
|
+
def commit database, session_id:
|
73
108
|
http_a = http.with( headers: { "arcadedb-session-id" => session_id } , debug_level: 1)
|
74
109
|
response = http_a.post( Config.base_uri + "commit/#{database}" )
|
75
|
-
response.raise_for_status
|
76
|
-
@session_id = nil
|
77
110
|
response.status # returns 204 --> success
|
78
|
-
# 403 -->
|
111
|
+
# 403 --> invalid credentials
|
79
112
|
# 500 --> Transaction not begun
|
80
113
|
|
81
114
|
end
|
82
115
|
|
83
116
|
# ------------------------------ rollback ------------------------------------------------- #
|
84
|
-
def rollback database, session_id
|
85
|
-
# http = HTTPX.plugin(:basic_auth)
|
86
|
-
# .basic_auth(auth[:username], auth[:password])
|
87
|
-
# .with( headers: { "arcadedb-session-id"=>session_id }, debug_level: 1)
|
117
|
+
def rollback database, session_id: , log: true
|
88
118
|
http_a = http.with( headers: { "arcadedb-session-id" => session_id } , debug_level: 1)
|
89
119
|
response = http_a.post( Config.base_uri + "rollback/#{database}" )
|
90
|
-
|
91
|
-
|
92
|
-
logger.error "A Transaction has been rolled back" # if publish_error
|
93
|
-
response.status
|
120
|
+
logger.info "A Transaction has been rolled back" if log
|
121
|
+
response.status # returns 500 !
|
94
122
|
end
|
95
123
|
end
|
96
124
|
end
|
data/lib/arcade/base.rb
CHANGED
@@ -27,6 +27,16 @@ module Arcade
|
|
27
27
|
self.name.snake_case
|
28
28
|
end
|
29
29
|
|
30
|
+
def begin_transaction
|
31
|
+
db.begin_transaction
|
32
|
+
end
|
33
|
+
def commit
|
34
|
+
db.commit
|
35
|
+
end
|
36
|
+
def rollback
|
37
|
+
db.rollback
|
38
|
+
end
|
39
|
+
|
30
40
|
def create_type
|
31
41
|
the_class = nil # declare as local var
|
32
42
|
parent_present = ->(cl){ db.hierarchy.flatten.include? cl }
|
@@ -67,7 +77,7 @@ module Arcade
|
|
67
77
|
the_command = command[0 .. -2] # remove '\n'
|
68
78
|
next if the_command == ''
|
69
79
|
# db.logger.info "Custom Setup:: #{the_command}"
|
70
|
-
db.
|
80
|
+
db.transmit { the_command }
|
71
81
|
end unless custom_setup.nil?
|
72
82
|
|
73
83
|
rescue RollbackError => e
|
@@ -118,9 +128,11 @@ module Arcade
|
|
118
128
|
# (not supported (jet): [RETURN <expression>] [FROM <query>] )
|
119
129
|
|
120
130
|
def insert **attributes
|
121
|
-
db.insert type: database_name, **attributes
|
131
|
+
db.insert type: database_name, session_id: attributes.delete(:session_id), **attributes
|
122
132
|
end
|
123
133
|
|
134
|
+
alias create insert
|
135
|
+
|
124
136
|
## ----------------------------------------- create ---------------------------------- ##
|
125
137
|
#
|
126
138
|
# Adds a record to the database
|
@@ -128,21 +140,21 @@ module Arcade
|
|
128
140
|
# returns the model dataset
|
129
141
|
# ( depreciated )
|
130
142
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
143
|
+
# def create **attributes
|
144
|
+
# s = Api.begin_transaction db.database
|
145
|
+
# attributes.merge!( created: DateTime.now ) if timestamps
|
146
|
+
# record = insert **attributes
|
147
|
+
# Api.commit db.database, s
|
148
|
+
# record
|
149
|
+
# rescue HTTPX::HTTPError => e
|
150
|
+
# db.logger.error "Dataset NOT created"
|
151
|
+
# db.logger.error "Provided Attributes: #{ attributes.inspect }"
|
152
|
+
# Api.rollback db.database # ---> raises "transactgion not begun"
|
153
|
+
# rescue Dry::Struct::Error => e
|
154
|
+
# Api.rollback db.database
|
155
|
+
# db.logger.error "#{ rid } :: Validation failed, record deleted."
|
156
|
+
# db.logger.error e.message
|
157
|
+
# end
|
146
158
|
|
147
159
|
def count **args
|
148
160
|
command = "count(*)"
|
@@ -219,9 +231,9 @@ module Arcade
|
|
219
231
|
# is equivalent to
|
220
232
|
# Strategie.all.find{|y| y.symbol == 'Still' }
|
221
233
|
def find **args
|
222
|
-
|
223
|
-
f= where( "#{ args.keys.first } like #{ args.values.first.to_or }" ).first if f.nil? || f.empty?
|
224
|
-
f
|
234
|
+
where(**args).first
|
235
|
+
# f= where( "#{ args.keys.first } like #{ args.values.first.to_or }" ).first if f.nil? || f.empty?
|
236
|
+
# f
|
225
237
|
end
|
226
238
|
# update returns a list of updated records
|
227
239
|
#
|
@@ -367,6 +379,9 @@ module Arcade
|
|
367
379
|
end
|
368
380
|
"%s : %s" % [ attr, v] unless v.nil?
|
369
381
|
end.compact.sort.join(', ') + ">".gsub('"' , ' ')
|
382
|
+
|
383
|
+
rescue TypeError => e
|
384
|
+
attributes
|
370
385
|
end
|
371
386
|
|
372
387
|
|
@@ -376,23 +391,41 @@ module Arcade
|
|
376
391
|
to_human
|
377
392
|
end
|
378
393
|
|
394
|
+
|
395
|
+
def html_attributes
|
396
|
+
invariant_attributes
|
397
|
+
end
|
398
|
+
|
399
|
+
def in_and_out_attributes
|
400
|
+
_modul, _class = self.class.to_s.split "::"
|
401
|
+
the_class = _modul == 'Arcade' ? _class : self.class.to_s
|
402
|
+
the_attributes = { :"CLASS" => the_class, :"IN" => self.in.count, :"OUT" => self.out.count, :"RID" => rid }
|
403
|
+
end
|
404
|
+
|
379
405
|
def to_html # iruby
|
406
|
+
in_and_out = ->(r) { "[#{r}] : {#{self.in.count}->}{->#{self.out.count }}" }
|
407
|
+
the_rid = rid? && rid != "0:0" ? in_and_out[rid] : ""
|
380
408
|
_modul, _class = self.class.to_s.split "::"
|
381
409
|
the_class = _modul == 'Arcade' ? _class : self.class.to_s
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
410
|
+
# the_attribute = ->(v) do
|
411
|
+
# case v
|
412
|
+
# when Base
|
413
|
+
# "< #{ self.class.to_s.snake_case }: #{ v.rid } >"
|
414
|
+
# when Array
|
415
|
+
# v.map{|x| x.to_s}
|
416
|
+
# else
|
417
|
+
# v.to_s
|
418
|
+
# end
|
419
|
+
# end
|
420
|
+
# last_part = invariant_attributes.map do |attr, value|
|
421
|
+
# [ attr, the_attribute[value] ].join(": ")
|
422
|
+
# end.join(', ')
|
423
|
+
|
424
|
+
# IRuby.display( [IRuby.html("<span style=\"color: #50953DFF\"><b>#{the_class}</b><#{ the_class }</b>#{the_rid}</span><br/> ") , IRuby.table(html_attributes) ] )
|
425
|
+
IRuby.display IRuby.html("<span style=\"color: #50953DFF\"><b>#{the_class}</b><#{ the_class }</b>#{the_rid}</span>< #{ html_attributes.map{|_,v| v }.join(', ') } >")
|
394
426
|
end
|
395
427
|
|
428
|
+
|
396
429
|
def update **args
|
397
430
|
Query.new( from: rid , kind: :update, set: args).execute
|
398
431
|
refresh
|
@@ -406,13 +439,13 @@ module Arcade
|
|
406
439
|
obj.to_or
|
407
440
|
end
|
408
441
|
# if send( name ).nil? || send( name ).empty?
|
409
|
-
db.
|
442
|
+
db.transmit { "update #{ rid } set #{ name } = #{ value }" }.first[:count]
|
410
443
|
# end
|
411
444
|
end
|
412
445
|
|
413
446
|
# updates a single property in an embedded document
|
414
447
|
def update_embedded embedded, embedded_property, value
|
415
|
-
db.
|
448
|
+
db.transmit { " update #{rid} set `#{embedded}`.`#{embedded_property}` = #{value.to_or}" }
|
416
449
|
end
|
417
450
|
|
418
451
|
def update_list list, value
|
@@ -422,9 +455,9 @@ module Arcade
|
|
422
455
|
value.to_or
|
423
456
|
end
|
424
457
|
if send( list ).nil? || send( list ).empty?
|
425
|
-
db.
|
458
|
+
db.transmit { "update #{ rid } set #{ list } = [#{ value }]" }
|
426
459
|
else
|
427
|
-
db.
|
460
|
+
db.transmit { "update #{ rid } set #{ list } += #{ value }" }
|
428
461
|
end
|
429
462
|
refresh
|
430
463
|
end
|
@@ -432,14 +465,14 @@ module Arcade
|
|
432
465
|
# updates a map property , actually adds the key-value pair to the property
|
433
466
|
def update_map m, key, value
|
434
467
|
if send( m ).nil?
|
435
|
-
db.
|
468
|
+
db.transmit { "update #{ rid } set #{ m } = MAP ( #{ key.to_s.to_or } , #{ value.to_or } ) " }
|
436
469
|
else
|
437
|
-
db.
|
470
|
+
db.transmit { "update #{ rid } set #{ m }.`#{ key.to_s }` = #{ value.to_or }" }
|
438
471
|
end
|
439
472
|
refresh
|
440
473
|
end
|
441
474
|
def delete
|
442
|
-
response = db.
|
475
|
+
response = db.transmit { "delete from #{ rid }" }
|
443
476
|
true if response == [{ count: 1 }]
|
444
477
|
end
|
445
478
|
def == arg
|
@@ -3,11 +3,11 @@ module Arcade
|
|
3
3
|
extend Dry::Configurable
|
4
4
|
# central place to initialize constants
|
5
5
|
#
|
6
|
-
# ProjectRoot
|
6
|
+
# ProjectRoot should to be a Pathname-Object and has to be defined before `arcadedb` is required
|
7
7
|
#
|
8
8
|
#puts "expand: #{File.expand_path(__dir__)}"
|
9
|
-
unless
|
10
|
-
|
9
|
+
unless Object.const_defined?( :ProjectRoot )
|
10
|
+
::ProjectRoot = if defined?( Rails.env )
|
11
11
|
Rails.root
|
12
12
|
else
|
13
13
|
STDERR.puts "Using default (arcadedb gem) database credentials and settings"
|
@@ -15,10 +15,9 @@ module Arcade
|
|
15
15
|
Pathname.new( File.expand_path( "../../", __FILE__ ))
|
16
16
|
end
|
17
17
|
else
|
18
|
-
STDERR.puts "Using provided database credentials and settings
|
18
|
+
STDERR.puts "Using provided database credentials and settings from #{::ProjectRoot}"
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
21
|
# initialised a hash { environment => property }
|
23
22
|
setting :username, default: :user, reader: true,
|
24
23
|
constructor: ->(v) { yml(:environment).map{|x,y| [x , y[v.to_s]] }.to_h }
|
@@ -53,7 +52,7 @@ module Arcade
|
|
53
52
|
def self.config_file
|
54
53
|
|
55
54
|
configdir = -> do
|
56
|
-
pr = ProjectRoot.is_a?(Pathname)? ProjectRoot : Pathname.new( ProjectRoot )
|
55
|
+
pr = ::ProjectRoot.is_a?(Pathname)? ::ProjectRoot : Pathname.new( ::ProjectRoot )
|
57
56
|
( cd = pr + 'arcade.yml' ).exist? || ( cd = pr + 'config' + 'arcade.yml' ).exist? || ( cd = pr + 'config.yml' )
|
58
57
|
cd
|
59
58
|
end
|