ignite-client 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e093caf963cfb87b79bbe650d161419f41557a90e024039ec395709fce977d3
4
- data.tar.gz: 796674a722547b1e38c2a2b0a31b3ded504b1db80cd5dc5d3334154b90ba050f
3
+ metadata.gz: a81b15f9a00bf89eb585f8065bd6e660ecb19e21e1b75a63b5e41df7302806dd
4
+ data.tar.gz: 2894eb97340f58a8f8f40aa67a1aa3f7e3d6a2932b565339e551ec6b1b593204
5
5
  SHA512:
6
- metadata.gz: e1962bc2a2da0242d76f2476c3555260a4bea3c9920449567ea454e4d3802c5656514d1aa4612bb801c9605db94c7cc10d586925f3dd6ff78670b5d240b37ed0
7
- data.tar.gz: c96ecb92666ae5ac5937a1a99b411a874def4c7879e5f7a59923c3079fc3278a847dd36fd0ba8bc1621bb9f07d5eacded85682c3bc69ae8e634b066272b93bb4
6
+ metadata.gz: 8813cce5db934323a6d32a922f85a2ab10b3acd0738d8b6899230ab261bedf2f95058bb6d40ae426581c75de635702a5bee42bef9ed7ac2ca54e7ab6c357f8f4
7
+ data.tar.gz: 3f5798dace62b573e02b7c6b11859e1d607f4ae85a859b9bde29169b5e1b55f0d59000dad14940be4763636b3b721d53ae1e330353163cf099c968dd0e193596
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.1.1 (2021-02-04)
2
+
3
+ - Added support for array types
4
+
1
5
  ## 0.1.0 (2021-02-02)
2
6
 
3
7
  - First release
data/README.md CHANGED
@@ -89,7 +89,7 @@ client.query("SELECT * FROM products WHERE name = ?", ["Ignite"])
89
89
 
90
90
  ## Connection Options
91
91
 
92
- Specify a host and port
92
+ Specify the host and port
93
93
 
94
94
  ```ruby
95
95
  Ignite::Client.new(host: "localhost", port: 10800)
@@ -117,7 +117,6 @@ For [SSL/TLS](https://ignite.apache.org/docs/latest/security/ssl-tls#ssl-for-cli
117
117
  Ignite::Client.new(
118
118
  use_ssl: true,
119
119
  ssl_params: {
120
- verify_mode: OpenSSL::SSL::VERIFY_PEER,
121
120
  ca_file: "ca.pem"
122
121
  }
123
122
  )
data/lib/ignite.rb CHANGED
@@ -7,8 +7,10 @@ require "socket"
7
7
  # modules
8
8
  require "ignite/cache"
9
9
  require "ignite/op_codes"
10
+ require "ignite/pack_formats"
10
11
  require "ignite/request"
11
12
  require "ignite/response"
13
+ require "ignite/type_codes"
12
14
  require "ignite/version"
13
15
 
14
16
  module Ignite
@@ -0,0 +1,17 @@
1
+ module Ignite
2
+ PACK_BYTE = "C"
3
+ PACK_CHAR = "c"
4
+ PACK_SHORT = "s!<"
5
+ PACK_INT = "i!<"
6
+ PACK_LONG = "l!<"
7
+ PACK_FLOAT = "e"
8
+ PACK_DOUBLE = "E"
9
+
10
+ SIZE_BYTE = 1
11
+ SIZE_CHAR = 1
12
+ SIZE_SHORT = 2
13
+ SIZE_INT = 4
14
+ SIZE_LONG = 8
15
+ SIZE_FLOAT = 4
16
+ SIZE_DOUBLE = 8
17
+ end
@@ -4,7 +4,9 @@ module Ignite
4
4
  MAX_LONG = 9223372036854775807 # 2**63-1
5
5
 
6
6
  def initialize(op_code)
7
- @buffer = String.new
7
+ @format = String.new
8
+ @values = []
9
+
8
10
  int 0 # length placeholder
9
11
 
10
12
  if op_code != OP_HANDSHAKE
@@ -13,10 +15,14 @@ module Ignite
13
15
  end
14
16
  end
15
17
 
18
+ # reduce allocations by packing together
19
+ # but need to make sure values aren't modified
20
+ # between when they are added and packed
16
21
  def to_bytes
22
+ buffer = @values.pack(@format)
17
23
  # update length
18
- @buffer[0..3] = [@buffer.bytesize - 4].pack("i!<")
19
- @buffer
24
+ buffer[0..3] = [buffer.bytesize - 4].pack(PACK_INT)
25
+ buffer
20
26
  end
21
27
 
22
28
  def bool(value)
@@ -24,61 +30,90 @@ module Ignite
24
30
  end
25
31
 
26
32
  def byte(value)
27
- [value].pack("C", buffer: @buffer)
33
+ @format << PACK_BYTE
34
+ @values << value
28
35
  end
29
36
 
30
37
  def short(value)
31
- [value].pack("s!<", buffer: @buffer)
38
+ @format << PACK_SHORT
39
+ @values << value
32
40
  end
33
41
 
34
42
  def int(value)
35
- [value].pack("i!<", buffer: @buffer)
43
+ @format << PACK_INT
44
+ @values << value
36
45
  end
37
46
 
38
47
  def long(value)
39
- [value].pack("l!<", buffer: @buffer)
48
+ @format << PACK_LONG
49
+ @values << value
40
50
  end
41
51
 
42
52
  def float(value)
43
- [value].pack("e", buffer: @buffer)
53
+ @format << PACK_FLOAT
54
+ @values << value
44
55
  end
45
56
 
46
57
  def double(value)
47
- [value].pack("E", buffer: @buffer)
58
+ @format << PACK_DOUBLE
59
+ @values << value
48
60
  end
49
61
 
50
62
  def string(value)
51
- byte 9
63
+ byte TYPE_STRING
52
64
  int value.bytesize
53
- @buffer << value
65
+ @format << "a#{value.bytesize}"
66
+ @values << value
54
67
  end
55
68
 
56
69
  def data_object(value)
57
70
  case value
58
71
  when Integer
59
- byte 4
72
+ byte TYPE_LONG
60
73
  long value
61
74
  when Float
62
- byte 6
75
+ byte TYPE_DOUBLE
63
76
  double value
64
77
  when TrueClass, FalseClass
65
- byte 8
78
+ byte TYPE_BOOL
66
79
  bool value
67
80
  when String
68
81
  string value
69
82
  when Date
70
- byte 11
83
+ byte TYPE_DATE
71
84
  time = value.to_time
72
85
  long(time.to_i * 1000 + (time.nsec / 1000000))
86
+ when Array
87
+ array_object(value)
73
88
  when Time
74
- byte 33
89
+ byte TYPE_TIMESTAMP
75
90
  long(value.to_i * 1000 + (value.nsec / 1000000))
76
91
  int value.nsec % 1000000
77
92
  when NilClass
78
- byte 101
93
+ byte TYPE_NULL
79
94
  else
80
- raise "Unknown type: #{value.class.name}"
95
+ raise Error, "Unable to cache #{value.class.name}"
81
96
  end
82
97
  end
98
+
99
+ def array_object(value)
100
+ # empty arrays take first path for now
101
+ if value.all? { |v| v.is_a?(Integer) }
102
+ array(TYPE_LONG_ARRAY, value, PACK_LONG)
103
+ elsif value.all? { |v| v.is_a?(Float) }
104
+ array(TYPE_DOUBLE_ARRAY, value, PACK_DOUBLE)
105
+ elsif value.all? { |v| v == true || v == false }
106
+ array(TYPE_BOOL_ARRAY, value.map { |v| v ? 1 : 0 }, PACK_CHAR)
107
+ else
108
+ raise Error, "Unable to cache array of #{value.map { |v| v.class.name }.uniq.join(", ")}"
109
+ end
110
+ end
111
+
112
+ def array(type_code, value, pack)
113
+ byte type_code
114
+ int value.size
115
+ @format << "#{pack}#{value.size}"
116
+ @values.concat(value)
117
+ end
83
118
  end
84
119
  end
@@ -6,7 +6,7 @@ module Ignite
6
6
  @client = client
7
7
 
8
8
  # use buffer so errors don't leave unread data on socket
9
- len = client.read(4).unpack1("i!<")
9
+ len = client.read(SIZE_INT).unpack1(PACK_INT)
10
10
  @buffer = StringIO.new(client.read(len))
11
11
  end
12
12
 
@@ -15,31 +15,31 @@ module Ignite
15
15
  end
16
16
 
17
17
  def read_byte
18
- read(1).unpack1("C")
18
+ read(SIZE_BYTE).unpack1(PACK_BYTE)
19
19
  end
20
20
 
21
21
  def read_short
22
- read(2).unpack1("s!<")
22
+ read(SIZE_SHORT).unpack1(PACK_SHORT)
23
23
  end
24
24
 
25
25
  def read_int
26
- read(4).unpack1("i!<")
26
+ read(SIZE_INT).unpack1(PACK_INT)
27
27
  end
28
28
 
29
29
  def read_long
30
- read(8).unpack1("l!<")
30
+ read(SIZE_LONG).unpack1(PACK_LONG)
31
31
  end
32
32
 
33
33
  def read_float
34
- read(4).unpack1("e")
34
+ read(SIZE_FLOAT).unpack1(PACK_FLOAT)
35
35
  end
36
36
 
37
37
  def read_double
38
- read(8).unpack1("E")
38
+ read(SIZE_DOUBLE).unpack1(PACK_DOUBLE)
39
39
  end
40
40
 
41
41
  def read_char
42
- read(1).unpack1("c")
42
+ read(SIZE_CHAR).unpack1(PACK_CHAR)
43
43
  end
44
44
 
45
45
  def read_bool
@@ -53,7 +53,7 @@ module Ignite
53
53
 
54
54
  def read_string_object
55
55
  type = read_byte
56
- raise "Expected string, not type #{type}" unless type == 9
56
+ raise Error, "Expected string, not type #{type}" unless type == TYPE_STRING
57
57
  read_string
58
58
  end
59
59
 
@@ -63,6 +63,22 @@ module Ignite
63
63
  Time.at(sec).to_date
64
64
  end
65
65
 
66
+ def read_byte_array
67
+ read_array(SIZE_BYTE, PACK_BYTE)
68
+ end
69
+
70
+ def read_long_array
71
+ read_array(SIZE_LONG, PACK_LONG)
72
+ end
73
+
74
+ def read_double_array
75
+ read_array(SIZE_DOUBLE, PACK_DOUBLE)
76
+ end
77
+
78
+ def read_bool_array
79
+ read_byte_array.map { |v| v != 0 }
80
+ end
81
+
66
82
  # same as Python
67
83
  def read_decimal
68
84
  scale = read_int
@@ -93,35 +109,50 @@ module Ignite
93
109
  def read_data_object
94
110
  type_code = read_byte
95
111
  case type_code
96
- when 1
112
+ when TYPE_BYTE
97
113
  read_byte
98
- when 2
114
+ when TYPE_SHORT
99
115
  read_short
100
- when 3
116
+ when TYPE_INT
101
117
  read_int
102
- when 4
118
+ when TYPE_LONG
103
119
  read_long
104
- when 5
120
+ when TYPE_FLOAT
105
121
  read_float
106
- when 6
122
+ when TYPE_DOUBLE
107
123
  read_double
108
- when 7
124
+ when TYPE_CHAR
109
125
  read_char
110
- when 8
126
+ when TYPE_BOOL
111
127
  read_bool
112
- when 9
128
+ when TYPE_STRING
113
129
  read_string
114
- when 11
130
+ when TYPE_DATE
115
131
  read_date
116
- when 30
132
+ when TYPE_BYTE_ARRAY
133
+ read_byte_array
134
+ when TYPE_LONG_ARRAY
135
+ read_long_array
136
+ when TYPE_DOUBLE_ARRAY
137
+ read_double_array
138
+ when TYPE_BOOL_ARRAY
139
+ read_bool_array
140
+ when TYPE_DECIMAL
117
141
  read_decimal
118
- when 33
142
+ when TYPE_TIMESTAMP
119
143
  read_timestamp
120
- when 101
144
+ when TYPE_NULL
121
145
  nil
122
146
  else
123
147
  raise Error, "Type not supported yet: #{type_code}. Please create an issue."
124
148
  end
125
149
  end
150
+
151
+ private
152
+
153
+ def read_array(size, pack)
154
+ len = read_int
155
+ read(len * size).unpack("#{pack}*")
156
+ end
126
157
  end
127
158
  end
@@ -0,0 +1,28 @@
1
+ module Ignite
2
+ TYPE_BYTE = 1
3
+ TYPE_SHORT = 2
4
+ TYPE_INT = 3
5
+ TYPE_LONG = 4
6
+ TYPE_FLOAT = 5
7
+ TYPE_DOUBLE = 6
8
+ TYPE_CHAR = 7
9
+ TYPE_BOOL = 8
10
+ TYPE_STRING = 9
11
+ TYPE_UUID = 10
12
+ TYPE_DATE = 11
13
+
14
+ TYPE_BYTE_ARRAY = 12
15
+ TYPE_INT_ARRAY = 14
16
+ TYPE_LONG_ARRAY = 15
17
+ TYPE_FLOAT_ARRAY = 16
18
+ TYPE_DOUBLE_ARRAY = 17
19
+ TYPE_CHAR_ARRAY = 18
20
+ TYPE_BOOL_ARRAY = 19
21
+
22
+ TYPE_ENUM = 28
23
+ TYPE_DECIMAL = 30
24
+ TYPE_TIMESTAMP = 33
25
+ TYPE_TIME = 36
26
+
27
+ TYPE_NULL = 101
28
+ end
@@ -1,3 +1,3 @@
1
1
  module Ignite
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ignite-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2021-02-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: andrew@ankane.org
@@ -23,8 +23,10 @@ files:
23
23
  - lib/ignite/cache.rb
24
24
  - lib/ignite/client.rb
25
25
  - lib/ignite/op_codes.rb
26
+ - lib/ignite/pack_formats.rb
26
27
  - lib/ignite/request.rb
27
28
  - lib/ignite/response.rb
29
+ - lib/ignite/type_codes.rb
28
30
  - lib/ignite/version.rb
29
31
  homepage: https://github.com/ankane/ignite-ruby
30
32
  licenses: