midb 1.1.1 → 2.0.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/lib/midb/dbengine_model.rb +23 -13
- data/lib/midb/errors_view.rb +8 -0
- data/lib/midb/server_controller.rb +45 -0
- data/lib/midb/server_model.rb +125 -3
- data/lib/midb/server_view.rb +6 -10
- data/lib/midb/serverengine_controller.rb +71 -22
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 644f4e1de9aa34f81c03df7a4632ed0c809c2347
|
4
|
+
data.tar.gz: ba52f668994e64f7425ed9d001dd86083c3dec7e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d05f26de94df71818137d79bef6cb23b79e9ad68d4fa3c853494959d75e670177d8b0065ae24a34fd767c145a5066df37548a666c912f58dfd54d12ff540063a
|
7
|
+
data.tar.gz: 82b54f559776bcb5a7dc5bc19a437e8a804c12703cde686bdc57f37048d85a70ea0e8ab0967ea954e96d7905f5b6270455cbf1a02641cdfa0b1f59467daf2cd6
|
data/lib/midb/dbengine_model.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'sqlite3'
|
2
2
|
require 'mysql2'
|
3
|
-
|
3
|
+
require 'midb/errors_view'
|
4
4
|
module MIDB
|
5
5
|
module API
|
6
6
|
# @author unrar
|
@@ -38,14 +38,19 @@ module MIDB
|
|
38
38
|
#
|
39
39
|
# @return [SQLite3::Database, Mysql2::Client] A resource referencing to the database
|
40
40
|
def connect()
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
begin
|
42
|
+
# Connect to an SQLite3 database
|
43
|
+
if @engine == :sqlite3
|
44
|
+
sq = SQLite3::Database.open("./db/#{@db}.db")
|
45
|
+
sq.results_as_hash = true
|
46
|
+
return sq
|
47
|
+
# Connect to a MySQL database
|
48
|
+
elsif @engine == :mysql
|
49
|
+
return Mysql2::Client.new(:host => @host, :username => @uname, :password => @pwd, :database => @db)
|
50
|
+
end
|
51
|
+
rescue
|
52
|
+
MIDB::Interface::Errors.exception(:database_error, $!)
|
53
|
+
return false
|
49
54
|
end
|
50
55
|
end
|
51
56
|
|
@@ -56,10 +61,15 @@ module MIDB
|
|
56
61
|
#
|
57
62
|
# @return [Array, Hash] Returns an array of hashes for SQLite3 or a hash for MySQL
|
58
63
|
def query(res, query)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
64
|
+
begin
|
65
|
+
if @engine == :sqlite3
|
66
|
+
return res.execute(query)
|
67
|
+
elsif @engine == :mysql
|
68
|
+
return res.query(query)
|
69
|
+
end
|
70
|
+
rescue
|
71
|
+
MIDB::Interface::Errors.exception(:query_error, $!)
|
72
|
+
return false
|
63
73
|
end
|
64
74
|
end
|
65
75
|
|
data/lib/midb/errors_view.rb
CHANGED
@@ -25,6 +25,14 @@ module MIDB
|
|
25
25
|
end
|
26
26
|
abort("Fatal error: #{errmsg}")
|
27
27
|
end
|
28
|
+
def self.exception(exc, more="")
|
29
|
+
excmsg = case exc
|
30
|
+
when :database_error then "An error occurred when trying to connect to the database. #{more}"
|
31
|
+
when :query_error then "An error occurred when trying to query the database. #{more}"
|
32
|
+
else "Unknown exception: #{exc.to_s} #{more}"
|
33
|
+
end
|
34
|
+
puts "(exception)\t#{excmsg}"
|
35
|
+
end
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|
@@ -31,6 +31,19 @@ module MIDB
|
|
31
31
|
# @return [Object] MIDB::API::Hooks instance
|
32
32
|
attr_accessor :args, :config, :db, :http_status, :port, :hooks
|
33
33
|
|
34
|
+
# Convert an on/off string to a boolean
|
35
|
+
#
|
36
|
+
# @param text [String] Text to convert to bool
|
37
|
+
def to_bool(text)
|
38
|
+
if text == "on" || text == "true" || text == "yes"
|
39
|
+
return true
|
40
|
+
elsif text == "off" || text == "false" || text == "no"
|
41
|
+
return false
|
42
|
+
else
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
34
47
|
# Constructor for this controller.
|
35
48
|
#
|
36
49
|
# @param args [Array<String>] Arguments passed to the binary.
|
@@ -92,12 +105,20 @@ module MIDB
|
|
92
105
|
@config["serves"] = []
|
93
106
|
@config["status"] = :asleep # The server is initially asleep
|
94
107
|
@config["apikey"] = "midb-api" # This should be changed, it's the private API key
|
108
|
+
# Optional API key for GET methods (void by default)
|
109
|
+
@config["apigetkey"] = nil
|
95
110
|
@config["dbengine"] = :sqlite3 # SQLite is the default engine
|
96
111
|
# Default DB configuration for MySQL and other engines
|
97
112
|
@config["dbhost"] = "localhost"
|
98
113
|
@config["dbport"] = 3306
|
99
114
|
@config["dbuser"] = "nobody"
|
100
115
|
@config["dbpassword"] = "openaccess"
|
116
|
+
# New settings - privacy
|
117
|
+
@config["privacyget"] = false
|
118
|
+
@config["privacypost"] = true
|
119
|
+
@config["privacyput"] = true
|
120
|
+
@config["privacydelete"] = true
|
121
|
+
|
101
122
|
File.open(".midb.yaml", 'w') do |l|
|
102
123
|
l.write @config.to_yaml
|
103
124
|
end
|
@@ -155,6 +176,30 @@ module MIDB
|
|
155
176
|
when "key"
|
156
177
|
@config["apikey"] = setter if set
|
157
178
|
MIDB::Interface::Server.out_config(:apikey, @config)
|
179
|
+
when "getkey"
|
180
|
+
if setter == "nil"
|
181
|
+
@config["apigetkey"] = nil if set
|
182
|
+
else
|
183
|
+
@config["apigetkey"] = setter if set
|
184
|
+
end
|
185
|
+
MIDB::Interface::Server.out_config(:apigetkey, @config)
|
186
|
+
end
|
187
|
+
when "privacy"
|
188
|
+
case subcmd
|
189
|
+
when "get"
|
190
|
+
@config["privacyget"] = self.to_bool(setter) if set
|
191
|
+
MIDB::Interface::Server.out_config(:privacyget, @config)
|
192
|
+
when "post"
|
193
|
+
@config["privacypost"] = self.to_bool(setter) if set
|
194
|
+
MIDB::Interface::Server.out_config(:privacypost, @config)
|
195
|
+
when "put"
|
196
|
+
@config["privacyput"] = self.to_bool(setter) if set
|
197
|
+
MIDB::Interface::Server.out_config(:privacyput, @config)
|
198
|
+
when "delete"
|
199
|
+
@config["privacydelete"] = self.to_bool(setter) if set
|
200
|
+
MIDB::Interface::Server.out_config(:privacydelete, @config)
|
201
|
+
else
|
202
|
+
MIDB::Interface::Errors.die(:syntax)
|
158
203
|
end
|
159
204
|
else
|
160
205
|
MIDB::Interface::Errors.die(:syntax)
|
data/lib/midb/server_model.rb
CHANGED
@@ -247,10 +247,12 @@ module MIDB
|
|
247
247
|
dbe = MIDB::API::Dbengine.new(@engine.config, @db)
|
248
248
|
dblink = dbe.connect()
|
249
249
|
rows = dbe.query(dblink, "SELECT * FROM #{self.get_structure.values[0].split('/')[0]} WHERE id=#{id};")
|
250
|
+
if rows == false
|
251
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
252
|
+
end
|
250
253
|
if dbe.length(rows) > 0
|
251
254
|
rows.each do |row|
|
252
255
|
jso[row["id"]] = self.get_structure
|
253
|
-
|
254
256
|
self.get_structure.each do |name, dbi|
|
255
257
|
table = dbi.split("/")[0]
|
256
258
|
field = dbi.split("/")[1]
|
@@ -263,6 +265,9 @@ module MIDB
|
|
263
265
|
else
|
264
266
|
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
265
267
|
end
|
268
|
+
if query == false
|
269
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
270
|
+
end
|
266
271
|
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
267
272
|
jso[row["id"]][name] = @hooks.format_field(name, jso[row["id"]][name])
|
268
273
|
end
|
@@ -284,10 +289,124 @@ module MIDB
|
|
284
289
|
dbe = MIDB::API::Dbengine.new(@engine.config, @db)
|
285
290
|
dblink = dbe.connect()
|
286
291
|
rows = dbe.query(dblink, "SELECT * FROM #{self.get_structure.values[0].split('/')[0]};")
|
292
|
+
if rows == false
|
293
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
294
|
+
end
|
295
|
+
# Iterate over all rows of this table
|
296
|
+
rows.each do |row|
|
297
|
+
jso[row["id"]] = self.get_structure
|
298
|
+
self.get_structure.each do |name, dbi|
|
299
|
+
table = dbi.split("/")[0]
|
300
|
+
field = dbi.split("/")[1]
|
301
|
+
# Must-match relations ("table2/field/table2-field->row-field")
|
302
|
+
if dbi.split("/").length > 2
|
303
|
+
match = dbi.split("/")[2]
|
304
|
+
matching_field = match.split("->")[0]
|
305
|
+
row_field = match.split("->")[1]
|
306
|
+
query = dbe.query(dblink, "SELECT #{field} FROM #{table} WHERE #{matching_field}=#{row[row_field]};")
|
307
|
+
else
|
308
|
+
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
309
|
+
end
|
310
|
+
if query == false
|
311
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
312
|
+
end
|
313
|
+
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
314
|
+
jso[row["id"]][name] = @hooks.format_field(name, jso[row["id"]][name])
|
315
|
+
end
|
316
|
+
end
|
317
|
+
@hooks.after_get_all_entries(dbe.length(rows))
|
318
|
+
return jso
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
# Get all the entries from the database belonging to a column
|
323
|
+
def get_column_entries(column)
|
324
|
+
jso = Hash.new()
|
325
|
+
jss = self.get_structure()
|
326
|
+
db_column = nil
|
327
|
+
# Is the column recognized?
|
328
|
+
if jss.has_key? column then
|
329
|
+
db_column = jss[column].split("/")[1]
|
330
|
+
else
|
331
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
332
|
+
end
|
333
|
+
|
334
|
+
# Connect to database
|
335
|
+
dbe = MIDB::API::Dbengine.new(@engine.config, @db)
|
336
|
+
dblink = dbe.connect()
|
337
|
+
rows = dbe.query(dblink, "SELECT * FROM #{self.get_structure.values[0].split('/')[0]};")
|
338
|
+
if rows == false
|
339
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
340
|
+
end
|
341
|
+
# Iterate over all rows of this table
|
342
|
+
rows.each do |row|
|
343
|
+
|
344
|
+
name = column
|
345
|
+
dbi = jss[name]
|
346
|
+
table = dbi.split("/")[0]
|
347
|
+
field = dbi.split("/")[1]
|
348
|
+
# Must-match relations ("table2/field/table2-field->row-field")
|
349
|
+
if dbi.split("/").length > 2
|
350
|
+
match = dbi.split("/")[2]
|
351
|
+
matching_field = match.split("->")[0]
|
352
|
+
row_field = match.split("->")[1]
|
353
|
+
query = dbe.query(dblink, "SELECT #{field} FROM #{table} WHERE #{matching_field}=#{row[row_field]};")
|
354
|
+
else
|
355
|
+
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
356
|
+
end
|
357
|
+
if query == false
|
358
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
359
|
+
end
|
360
|
+
jso[row["id"]] = {}
|
361
|
+
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
362
|
+
jso[row["id"]][name] = @hooks.format_field(name, jso[row["id"]][name])
|
363
|
+
end
|
364
|
+
@hooks.after_get_all_entries(dbe.length(rows))
|
365
|
+
return jso
|
366
|
+
end
|
287
367
|
|
368
|
+
# Get all the entries from the database belonging to a column matching a pattern
|
369
|
+
def get_matching_rows(column, pattern)
|
370
|
+
jso = Hash.new()
|
371
|
+
jss = self.get_structure()
|
372
|
+
db_column = nil
|
373
|
+
# Is the column recognized?
|
374
|
+
if jss.has_key? column then
|
375
|
+
db_column = jss[column].split("/")[1]
|
376
|
+
else
|
377
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
378
|
+
end
|
379
|
+
|
380
|
+
# Connect to database
|
381
|
+
dbe = MIDB::API::Dbengine.new(@engine.config, @db)
|
382
|
+
dblink = dbe.connect()
|
383
|
+
rows = dbe.query(dblink, "SELECT * FROM #{self.get_structure.values[0].split('/')[0]};")
|
384
|
+
if rows == false
|
385
|
+
return MIDB::Interface::Server.json_error(400, "Bad Request")
|
386
|
+
end
|
288
387
|
# Iterate over all rows of this table
|
289
388
|
rows.each do |row|
|
290
|
-
#
|
389
|
+
# Does this row match?
|
390
|
+
bufd = jss[column]
|
391
|
+
b_table = bufd.split("/")[0]
|
392
|
+
b_field = bufd.split("/")[1]
|
393
|
+
# The column is in another table, let's find it
|
394
|
+
if bufd.split("/").length > 2
|
395
|
+
b_match = bufd.split("/")[2]
|
396
|
+
b_m_field = b_match.split("->")[0]
|
397
|
+
b_r_field = b_match.split("->")[1]
|
398
|
+
|
399
|
+
bquery = dbe.query(dblink, "SELECT #{b_field} FROM #{b_table} WHERE (#{b_m_field}=#{row[b_r_field]} AND #{db_column} LIKE '%#{pattern}%');")
|
400
|
+
else
|
401
|
+
# It's in the same main table, let's see if it matches
|
402
|
+
bquery = dbe.query(dblink, "SELECT #{b_field} FROM #{b_table} WHERE (id=#{row['id']} AND #{db_column} LIKE '%#{pattern}%');")
|
403
|
+
end
|
404
|
+
|
405
|
+
# Unless the query has been successful (thus this row matches), skip to the next row
|
406
|
+
unless dbe.length(bquery) > 0
|
407
|
+
next
|
408
|
+
end
|
409
|
+
|
291
410
|
jso[row["id"]] = self.get_structure
|
292
411
|
|
293
412
|
self.get_structure.each do |name, dbi|
|
@@ -302,11 +421,14 @@ module MIDB
|
|
302
421
|
else
|
303
422
|
query = dbe.query(dblink, "SELECT #{field} from #{table} WHERE id=#{row['id']};")
|
304
423
|
end
|
424
|
+
if query == false
|
425
|
+
next
|
426
|
+
end
|
305
427
|
jso[row["id"]][name] = dbe.length(query) > 0 ? dbe.extract(query,field) : "unknown"
|
306
428
|
jso[row["id"]][name] = @hooks.format_field(name, jso[row["id"]][name])
|
307
429
|
end
|
308
430
|
end
|
309
|
-
@hooks.after_get_all_entries(
|
431
|
+
@hooks.after_get_all_entries(dbe.length(rows))
|
310
432
|
return jso
|
311
433
|
end
|
312
434
|
end
|
data/lib/midb/server_view.rb
CHANGED
@@ -47,6 +47,7 @@ module MIDB
|
|
47
47
|
when :no_auth then ">> No authentication header - sending a 401 error."
|
48
48
|
when :auth_success then ">> Successfully authenticated the request."
|
49
49
|
when :bootstrap then "> Successfully bootstraped!"
|
50
|
+
when :fetch then ">> Fetching response... [#{info}]"
|
50
51
|
end
|
51
52
|
puts msg
|
52
53
|
end
|
@@ -56,16 +57,11 @@ module MIDB
|
|
56
57
|
# @param what [Symbol] What to show the config for.
|
57
58
|
# @param cnf [Array<String>] The array for the config.
|
58
59
|
def self.out_config(what, cnf)
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
when :dbpassword then "Database server password: #{cnf['dbpassword']}."
|
65
|
-
when :apikey then "Private API key: #{cnf['apikey']}"
|
66
|
-
else "Error??"
|
67
|
-
end
|
68
|
-
puts msg
|
60
|
+
if cnf.has_key? what.to_s
|
61
|
+
puts "#{what.to_s} set to #{cnf[what.to_s]}"
|
62
|
+
else
|
63
|
+
puts "Unknown setting."
|
64
|
+
end
|
69
65
|
end
|
70
66
|
|
71
67
|
# Shows the help
|
@@ -27,6 +27,12 @@ module MIDB
|
|
27
27
|
# @return [Object] MIDB::API::Hooks instance
|
28
28
|
attr_accessor :config, :db, :http_status, :hooks
|
29
29
|
|
30
|
+
# Handle an unauthorized request
|
31
|
+
def unauth_request
|
32
|
+
@http_status = "401 Unauthorized"
|
33
|
+
MIDB::Interface::Server.info(:no_auth)
|
34
|
+
MIDB::Interface::Server.json_error(401, "Unauthorized").to_json
|
35
|
+
end
|
30
36
|
|
31
37
|
# Constructor
|
32
38
|
#
|
@@ -72,7 +78,11 @@ module MIDB
|
|
72
78
|
|
73
79
|
# Endpoint syntax: ["", FILE, ID, (ACTION)]
|
74
80
|
endpoint = request[1].split("/")
|
75
|
-
|
81
|
+
if endpoint.length >= 2
|
82
|
+
ep_file = endpoint[1].split("?")[0]
|
83
|
+
else
|
84
|
+
ep_file = ""
|
85
|
+
end
|
76
86
|
|
77
87
|
method = request[0]
|
78
88
|
endpoints = [] # Valid endpoints
|
@@ -92,35 +102,74 @@ module MIDB
|
|
92
102
|
# Create the model
|
93
103
|
dbop = MIDB::API::Model.new(ep, @db, self)
|
94
104
|
# Analyze the request and pass it to the model
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
response_json = dbop.get_all_entries().to_json
|
101
|
-
when 3
|
102
|
-
# An ID has been specified. Should it exist, return all of its entries.
|
103
|
-
response_json = dbop.get_entries(endpoint[2]).to_json
|
104
|
-
end
|
105
|
+
# Is the method accepted?
|
106
|
+
accepted_methods = ["GET", "POST", "PUT", "DELETE"]
|
107
|
+
unless accepted_methods.include? method
|
108
|
+
@http_status = "405 Method Not Allowed"
|
109
|
+
response_json = MIDB::Interface::Server.json_error(405, "Method Not Allowed").to_json
|
105
110
|
else
|
106
|
-
#
|
107
|
-
|
108
|
-
|
109
|
-
if
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
111
|
+
# Do we need authentication?
|
112
|
+
auth_req = false
|
113
|
+
unauthenticated = false
|
114
|
+
if @config["privacy#{method.downcase}"] == true
|
115
|
+
MIDB::Interface::Server.info(:auth_required)
|
116
|
+
auth_req = true
|
117
|
+
|
118
|
+
# For GET and DELETE requests, the object of the digest is the endpoint
|
119
|
+
if (method == "GET") || (method == "DELETE")
|
120
|
+
data = ep_file
|
121
|
+
end
|
114
122
|
|
123
|
+
# If it's a GET request and we have a different key for GET methods...
|
124
|
+
if (@config["apigetkey"] != nil) && (method == "GET")
|
125
|
+
unauthenticated = (not headers.has_key? "Authentication") ||
|
126
|
+
(not MIDB::API::Security.check?(headers["Authentication"], data, @config["apigetkey"]))
|
127
|
+
else
|
128
|
+
unauthenticated = (not headers.has_key? "Authentication") ||
|
129
|
+
(not MIDB::API::Security.check?(headers["Authentication"], data, @config["apikey"]))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
# Proceed to handle the request
|
133
|
+
if unauthenticated
|
134
|
+
response_json = self.unauth_request
|
135
|
+
puts ">> has header: #{headers.has_key? "Authentication"}"
|
115
136
|
else
|
116
|
-
MIDB::Interface::Server.info(:auth_success)
|
117
|
-
if method == "
|
137
|
+
MIDB::Interface::Server.info(:auth_success) if (not unauthenticated) && auth_req
|
138
|
+
if method == "GET"
|
139
|
+
case endpoint.length
|
140
|
+
when 2
|
141
|
+
# No ID has been specified. Return all the entries
|
142
|
+
# Pass it to the model and get the JSON
|
143
|
+
MIDB::Interface::Server.info(:fetch, "get_all_entries()")
|
144
|
+
response_json = dbop.get_all_entries().to_json
|
145
|
+
when 3
|
146
|
+
# This regular expression checks if it contains an integer
|
147
|
+
if /\A[-+]?\d+\z/ === endpoint[2]
|
148
|
+
# An ID has been specified. Should it exist, return all of its entries.
|
149
|
+
MIDB::Interface::Server.info(:fetch, "get_entries(#{endpoint[2]})")
|
150
|
+
response_json = dbop.get_entries(endpoint[2].to_i).to_json
|
151
|
+
else
|
152
|
+
# A row has been specified, but no pattern
|
153
|
+
MIDB::Interface::Server.info(:fetch, "get_column_entries(#{endpoint[2]})")
|
154
|
+
response_json = dbop.get_column_entries(endpoint[2]).to_json
|
155
|
+
end
|
156
|
+
when 4
|
157
|
+
if (endpoint[2].is_a? String) && (endpoint[3].is_a? String) then
|
158
|
+
# A row and a pattern have been specified
|
159
|
+
MIDB::Interface::Server.info(:fetch, "get_matching_rows(#{endpoint[2]}, #{endpoint[3]})")
|
160
|
+
response_json = dbop.get_matching_rows(endpoint[2], endpoint[3]).to_json
|
161
|
+
end
|
162
|
+
end
|
163
|
+
elsif method == "POST"
|
164
|
+
MIDB::Interface::Server.info(:fetch, "post(#{data})")
|
118
165
|
response_json = dbop.post(data).to_json
|
119
166
|
else
|
120
167
|
if endpoint.length >= 3
|
121
168
|
if method == "DELETE"
|
169
|
+
MIDB::Interface::Server.info(:fetch, "delete(#{endpoint[2]})")
|
122
170
|
response_json = dbop.delete(endpoint[2]).to_json
|
123
171
|
elsif method == "PUT"
|
172
|
+
MIDB::Interface::Server.info(:fetch, "put(#{endpoint[2]}, data)")
|
124
173
|
response_json = dbop.put(endpoint[2], data).to_json
|
125
174
|
end
|
126
175
|
else
|
@@ -129,7 +178,7 @@ module MIDB
|
|
129
178
|
end
|
130
179
|
end
|
131
180
|
end
|
132
|
-
end
|
181
|
+
end
|
133
182
|
MIDB::Interface::Server.info(:response, response_json)
|
134
183
|
# Return the results via HTTP
|
135
184
|
socket.print "HTTP/1.1 #{@http_status}\r\n" +
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: midb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unrar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mysql2
|