fastdfs-client 1.0.2 → 1.2.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/.DS_Store +0 -0
- data/fastdfs-client.gemspec +3 -3
- data/lib/fastdfs-client/client_proxy.rb +21 -16
- data/lib/fastdfs-client/socket.rb +3 -2
- data/lib/fastdfs-client/storage.rb +11 -25
- data/lib/fastdfs-client/tracker.rb +4 -4
- data/lib/fastdfs-client/version.rb +1 -1
- data/spec/.DS_Store +0 -0
- data/spec/mock_tcp_socket.rb +2 -2
- data/spec/page.png +0 -0
- data/spec/tracker_spec.rb +13 -6
- metadata +13 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 564b4fc72139a1d9bc1faeba24ecf21394bf9e4b
|
4
|
+
data.tar.gz: ef2717e16860af59cfaeccc0b99d1ad0284d1972
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afec497233fb8ecc7736dff565ea90db045376381d012cbede8f7f47e69f156410ab0fb87e017085066f03e55be2b049b41304fb105e6efd48dfc78745157a15
|
7
|
+
data.tar.gz: fc7979eb1bf964b0bc5ee5942535f264d4518453191ab76d9eecb73e7b56cafcbb508e464be17ad55337cb1cd5bd7391c3ac8ace7120d998c3ca08d23bf827a0
|
data/.DS_Store
ADDED
Binary file
|
data/fastdfs-client.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.
|
23
|
-
spec.add_development_dependency "rspec", "~> 3.4
|
24
|
-
spec.add_development_dependency "debugger", "~> 1.6
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.4"
|
24
|
+
spec.add_development_dependency "debugger", "~> 1.6"
|
25
25
|
|
26
26
|
end
|
@@ -1,28 +1,33 @@
|
|
1
|
+
require 'monitor'
|
2
|
+
|
1
3
|
module Fastdfs
|
2
4
|
module Client
|
3
5
|
|
4
6
|
class ClientProxy
|
5
|
-
|
7
|
+
include MonitorMixin
|
6
8
|
|
7
|
-
|
8
|
-
@cmd = cmd
|
9
|
-
socket.connection
|
10
|
-
@socket = socket
|
11
|
-
@header = ProtoCommon.header_bytes(cmd, content_len) + header
|
12
|
-
@content = []
|
13
|
-
end
|
9
|
+
attr_accessor :host, :port, :socket
|
14
10
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
11
|
+
def initialize(host, port, options = {})
|
12
|
+
super()
|
13
|
+
options ||= {}
|
14
|
+
@host = host
|
15
|
+
@port = port
|
16
|
+
|
17
|
+
@socket = Socket.new(host, port, options[:socket])
|
18
18
|
end
|
19
19
|
|
20
|
-
def dispose(&block)
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
def dispose(cmd, content_len, header = [], content = [], &block)
|
21
|
+
synchronize do
|
22
|
+
@socket.connection do
|
23
|
+
full_header = ProtoCommon.header_bytes(cmd, content_len) + header
|
24
|
+
@socket.write(cmd, full_header)
|
25
|
+
Array(@content).each do |c|
|
26
|
+
@socket.write(cmd, c)
|
27
|
+
end
|
28
|
+
@socket.receive &block
|
29
|
+
end
|
24
30
|
end
|
25
|
-
@socket.receive &block
|
26
31
|
ensure
|
27
32
|
@socket.close
|
28
33
|
end
|
@@ -29,12 +29,13 @@ module Fastdfs
|
|
29
29
|
@socket.close if connected
|
30
30
|
end
|
31
31
|
|
32
|
-
def connection
|
32
|
+
def connection(&block)
|
33
33
|
if @socket.nil? || !connected
|
34
34
|
@socket = Timeout.timeout(@connection_timeout) do
|
35
35
|
TCPSocket.new(@host, @port)
|
36
36
|
end
|
37
37
|
end
|
38
|
+
yield if block_given?
|
38
39
|
end
|
39
40
|
|
40
41
|
def connected
|
@@ -58,7 +59,7 @@ module Fastdfs
|
|
58
59
|
def parseHeader
|
59
60
|
err_msg = nil
|
60
61
|
err_msg = "recv package size #{@header} is not equal #{@header_len}, cmd: #{@cmd}" unless @header.length == @header_len || err_msg
|
61
|
-
err_msg = "recv cmd: #{@header[8]} is not correct, expect
|
62
|
+
err_msg = "recv cmd: #{@header[8]} is not correct, expect recv code: #{CMD::RESP_CODE}, cmd: #{@cmd}" unless @header[8] == CMD::RESP_CODE || err_msg
|
62
63
|
err_msg = "recv erron #{@header[9]}, 0 is correct cmd: #{@cmd}" unless @header[9] == 0 || err_msg
|
63
64
|
{status: err_msg.nil?, err_msg: err_msg}
|
64
65
|
end
|
@@ -4,14 +4,14 @@ module Fastdfs
|
|
4
4
|
module Client
|
5
5
|
|
6
6
|
class Storage
|
7
|
-
attr_accessor :
|
7
|
+
attr_accessor :group_name, :store_path, :proxy, :options, :socket
|
8
8
|
|
9
9
|
def initialize(host, port, store_path = nil, options = {})
|
10
|
-
@host = host
|
11
|
-
@port = port
|
12
10
|
@options = options || {}
|
13
11
|
@options = store_path if store_path.is_a?(Hash)
|
14
|
-
|
12
|
+
|
13
|
+
@proxy = ClientProxy.new(host, port, @options[:socket])
|
14
|
+
@socket = @proxy.socket
|
15
15
|
@extname_len = ProtoCommon::EXTNAME_LEN
|
16
16
|
@size_len = ProtoCommon::SIZE_LEN
|
17
17
|
@store_path = store_path || 0
|
@@ -22,9 +22,7 @@ module Fastdfs
|
|
22
22
|
size_byte = ([@store_path] + Utils.number_to_buffer(file.size)).full_fill(0, @size_len)
|
23
23
|
content_len = (@size_len + @extname_len + file.size)
|
24
24
|
|
25
|
-
|
26
|
-
client.push_content{ IO.read(file) }
|
27
|
-
client.dispose do |body|
|
25
|
+
@proxy.dispose(CMD::UPLOAD_FILE, content_len, size_byte + ext_name_bs, IO.read(file)) do |body|
|
28
26
|
group_name_max_len = ProtoCommon::GROUP_NAME_MAX_LEN
|
29
27
|
|
30
28
|
res = {group_name: body[0...group_name_max_len].strip, path: body[group_name_max_len..-1]}
|
@@ -35,14 +33,12 @@ module Fastdfs
|
|
35
33
|
|
36
34
|
def delete(path, group_name = nil)
|
37
35
|
path_bytes = group_path_bytes(path, group_name).flatten
|
38
|
-
|
39
|
-
client.dispose
|
36
|
+
@proxy.dispose(CMD::DELETE_FILE, path_bytes.length, path_bytes)
|
40
37
|
end
|
41
38
|
|
42
39
|
def get_metadata(path, group_name = nil)
|
43
40
|
path_bytes = group_path_bytes(path, group_name).flatten
|
44
|
-
|
45
|
-
client.dispose do |body|
|
41
|
+
@proxy.dispose(CMD::GET_METADATA, path_bytes.length, path_bytes) do |body|
|
46
42
|
res = body.split(ProtoCommon::RECORD_SEPERATOR).map do |c|
|
47
43
|
c.split(ProtoCommon::FILE_SEPERATOR)
|
48
44
|
end.flatten
|
@@ -51,15 +47,8 @@ module Fastdfs
|
|
51
47
|
end
|
52
48
|
|
53
49
|
def set_metadata(path, group_name = nil, options = {}, flag = :cover)
|
54
|
-
unless options.is_a?(Hash)
|
55
|
-
|
56
|
-
options = {}
|
57
|
-
end
|
58
|
-
|
59
|
-
if group_name.is_a?(Hash)
|
60
|
-
options = group_name
|
61
|
-
group_name = nil
|
62
|
-
end
|
50
|
+
flag, options = options, {} unless options.is_a?(Hash)
|
51
|
+
options, group_name = group_name, nil if group_name.is_a?(Hash)
|
63
52
|
_set_metadata(path, group_name, options, flag)
|
64
53
|
end
|
65
54
|
|
@@ -67,8 +56,7 @@ module Fastdfs
|
|
67
56
|
path_bytes = group_path_bytes(path, group_name).flatten
|
68
57
|
download_bytes = Utils.number_to_buffer(0) + Utils.number_to_buffer(0)
|
69
58
|
data = download_bytes + path_bytes
|
70
|
-
|
71
|
-
client.dispose do |body|
|
59
|
+
@proxy.dispose(CMD::DOWNLOAD_FILE, data.length, data) do |body|
|
72
60
|
create_tempfile(path, body) if body
|
73
61
|
end
|
74
62
|
end
|
@@ -103,9 +91,7 @@ module Fastdfs
|
|
103
91
|
size_bytes = (size_bytes).full_fill(0, 16)
|
104
92
|
total = size_bytes.length + flag.length + group_bytes.length + path_bytes.length + meta_bytes.length
|
105
93
|
|
106
|
-
|
107
|
-
client.push_content{ meta_bytes }
|
108
|
-
client.dispose
|
94
|
+
@proxy.dispose(CMD::SET_METADATA, total, (size_bytes + flag.bytes + group_bytes + path_bytes), meta_bytes)
|
109
95
|
end
|
110
96
|
|
111
97
|
def convert_meta_flag(flag)
|
@@ -5,17 +5,17 @@ module Fastdfs
|
|
5
5
|
|
6
6
|
class Tracker
|
7
7
|
|
8
|
-
attr_accessor :socket, :cmd, :options
|
8
|
+
attr_accessor :socket, :cmd, :options, :socket
|
9
9
|
|
10
10
|
def initialize(host, port, options = {})
|
11
11
|
@options = options
|
12
|
-
@
|
12
|
+
@proxy = ClientProxy.new(host, port, @options[:socket])
|
13
|
+
@socket = @proxy.socket
|
13
14
|
@cmd = CMD::STORE_WITHOUT_GROUP_ONE
|
14
15
|
end
|
15
16
|
|
16
17
|
def get_storage
|
17
|
-
|
18
|
-
res = client.dispose do |body|
|
18
|
+
res = @proxy.dispose(@cmd, 0) do |body|
|
19
19
|
storage_ip = body[ProtoCommon::IPADDR].strip
|
20
20
|
storage_port = body[ProtoCommon::PORT].unpack("C*").to_pack_long
|
21
21
|
store_path = body[ProtoCommon::TRACKER_BODY_LEN-1].unpack("C*")[0]
|
data/spec/.DS_Store
ADDED
Binary file
|
data/spec/mock_tcp_socket.rb
CHANGED
data/spec/page.png
ADDED
Binary file
|
data/spec/tracker_spec.rb
CHANGED
@@ -13,7 +13,7 @@ describe Fastdfs::Client::Tracker do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should have access to the storage connection" do
|
16
|
-
expect(tracker.socket).to receive(:connection)
|
16
|
+
expect(tracker.socket).to receive(:connection).and_return({})
|
17
17
|
expect(tracker.socket).to receive(:close)
|
18
18
|
tracker.get_storage
|
19
19
|
end
|
@@ -23,9 +23,9 @@ describe Fastdfs::Client::Tracker do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "verify the server address and port" do
|
26
|
-
expect(tracker.get_storage.host).to eq(TestConfig::STORAGE_IP)
|
26
|
+
expect(tracker.get_storage.socket.host).to eq(TestConfig::STORAGE_IP)
|
27
27
|
#[0, 0, 0, 0, 0, 89, 216, 0]
|
28
|
-
expect(tracker.get_storage.port.to_s).to eq(TestConfig::STORAGE_PORT)
|
28
|
+
expect(tracker.get_storage.socket.port.to_s).to eq(TestConfig::STORAGE_PORT)
|
29
29
|
expect(tracker.get_storage.store_path).to eq(TestConfig::STORE_PATH)
|
30
30
|
end
|
31
31
|
|
@@ -37,13 +37,20 @@ describe Fastdfs::Client::Tracker do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "run server flow" do
|
40
|
-
|
41
|
-
|
40
|
+
items = 5.times.map do
|
41
|
+
Thread.new do
|
42
|
+
storage = tracker.get_storage
|
43
|
+
results = storage.upload(File.open(File.expand_path("../page.png", __FILE__)))[:result]
|
44
|
+
puts results
|
45
|
+
puts storage.delete(results[:path], results[:group_name])
|
46
|
+
end
|
42
47
|
end
|
43
48
|
|
49
|
+
items.each{|item| item.join }
|
50
|
+
|
44
51
|
# storage = tracker.get_storage
|
45
52
|
# puts "#{storage.host}, #{storage.port}"
|
46
|
-
# results = storage.upload(File.open("
|
53
|
+
# results = storage.upload(File.open("page.png"))
|
47
54
|
# puts results
|
48
55
|
# puts storage.delete(results[:path], results[:group_name])
|
49
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastdfs-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ka Ka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.6'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.4
|
33
|
+
version: '3.4'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 3.4
|
40
|
+
version: '3.4'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: debugger
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.6
|
47
|
+
version: '1.6'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.6
|
54
|
+
version: '1.6'
|
55
55
|
description: fastdfs upload file client for ruby
|
56
56
|
email:
|
57
57
|
- huxinghai1988@gmail.com
|
@@ -59,6 +59,7 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
+
- ".DS_Store"
|
62
63
|
- ".gitignore"
|
63
64
|
- Gemfile
|
64
65
|
- README.md
|
@@ -73,7 +74,9 @@ files:
|
|
73
74
|
- lib/fastdfs-client/tracker.rb
|
74
75
|
- lib/fastdfs-client/utils.rb
|
75
76
|
- lib/fastdfs-client/version.rb
|
77
|
+
- spec/.DS_Store
|
76
78
|
- spec/mock_tcp_socket.rb
|
79
|
+
- spec/page.png
|
77
80
|
- spec/spec_helper.rb
|
78
81
|
- spec/storage_spec.rb
|
79
82
|
- spec/test_config.rb
|
@@ -103,7 +106,9 @@ signing_key:
|
|
103
106
|
specification_version: 4
|
104
107
|
summary: fastdfs upload file client for ruby
|
105
108
|
test_files:
|
109
|
+
- spec/.DS_Store
|
106
110
|
- spec/mock_tcp_socket.rb
|
111
|
+
- spec/page.png
|
107
112
|
- spec/spec_helper.rb
|
108
113
|
- spec/storage_spec.rb
|
109
114
|
- spec/test_config.rb
|