chunkio 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 139f7e476d3ecb148f675198f0affafc0920f9cbc4ea9b2e5cb3b3b1e9ef6cd5
4
- data.tar.gz: 9e878c73d0cf18becd1167b5b86f8b29f25b4ca20047d30ad00a242b28ee9733
3
+ metadata.gz: 460315c74fc22187a8a9256c91bc84e51f10f965bf3b8099afed88cbff4b34ee
4
+ data.tar.gz: 7a835dbbf371b8fbab4e60005807f03cb231f7a0f279c59539dbc36135170d4a
5
5
  SHA512:
6
- metadata.gz: 7d3569ba99d80cd2f9ccae8d945479e22ec3edca7782f361ed5c2d3e08b0a63cd709c31407ac7b1469918e32c3ffd3c5e4201cd6ba2652cc0800e44be5465f72
7
- data.tar.gz: c2018918a915bdd90615dd1276d51cf607aa2b6749b2f9017e8c31b0a2fd415a16712a9e7c57ba647fc38d0600a929fdf7a3126b298833e53761b550640583ee
6
+ metadata.gz: 147c6a423b0cd1ba99d8e2449516aa28fa0b8419a5781f0f68a95e9cebbaccf5b7260fe9d1b0d983af5e5b7afc4e5ed31f500d42bbbc2e658ceea8ed8da8b8cb
7
+ data.tar.gz: 1de878786e978061335001e18ec311e0b2708ec55099d8fa1afbb072e341bbe276baa1ffd9e57883446042f433e021274bde67cf5a4cd1380477df937cf5a78c
@@ -0,0 +1,17 @@
1
+ name: Run specs
2
+ on: [push]
3
+ jobs:
4
+ build:
5
+ runs-on: ubuntu-latest
6
+ steps:
7
+ - uses: actions/checkout@v1
8
+ - name: Set up Ruby 2.6
9
+ uses: actions/setup-ruby@v1
10
+ with:
11
+ ruby-version: 2.6.x
12
+ - name: Build and test with Rake
13
+ run: |
14
+ gem install bundler
15
+ bundle install --jobs 4 --retry 3
16
+ bundle exec rake compile
17
+ bundle exec rspec
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # Chunkio
1
+ # ChunkI/O
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/chunkio`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![](https://github.com/ganmacs/chunkio-rb/workflows/Run%20specs/badge.svg)](https://github.com/ganmacs/chunkio-rb/actions)
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ This gem is wrapper around [ChunkI/O](https://github.com/edsiper/chunkio).
6
6
 
7
7
  ## Installation
8
8
 
@@ -22,7 +22,13 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ ```rb
26
+ require 'chunkio'
27
+ c = ChunkIO.new
28
+ c.write("test")
29
+ c.set_metadata("this is metadata")
30
+ c.close
31
+ ```
26
32
 
27
33
  ## Development
28
34
 
@@ -32,4 +38,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
38
 
33
39
  ## Contributing
34
40
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/chunkio.
41
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ganmacs/chunkio.
@@ -8,6 +8,7 @@
8
8
  typedef struct chunkio_chunk {
9
9
  struct cio_chunk* inner;
10
10
  int closed;
11
+ int sync_mode; /* 0 is false, 1 is true */
11
12
  } chunkio_chunk;
12
13
 
13
14
 
@@ -4,7 +4,7 @@ VALUE cCIO_Chunk;
4
4
 
5
5
  void *chunkio_chunk_free(chunkio_chunk *ch)
6
6
  {
7
- if (ch->inner) {
7
+ if (ch->inner != NULL) {
8
8
  cio_chunk_sync(ch->inner);
9
9
  cio_chunk_close(ch->inner, CIO_FALSE);
10
10
  ch->inner = NULL;
@@ -16,7 +16,9 @@ void *chunkio_chunk_free(chunkio_chunk *ch)
16
16
  static VALUE chunkio_chunk_allocate_context(VALUE klass)
17
17
  {
18
18
  chunkio_chunk *c = (chunkio_chunk *)xmalloc(sizeof(chunkio_chunk));
19
+ c->inner = NULL;
19
20
  c->closed = 0;
21
+ c->sync_mode = 0;
20
22
  return TypedData_Wrap_Struct(klass, &chunkio_chunk_type, c);
21
23
  }
22
24
 
@@ -24,9 +26,15 @@ static VALUE chunkio_chunk_initialize(VALUE self, VALUE context, VALUE stream, V
24
26
  {
25
27
  struct cio_ctx *ctx = UnwrapChunkIOContext(context);
26
28
  struct cio_stream *st = UnwrapChunkIOStream(stream);
27
- const char *c_name = RSTRING_PTR(name);
29
+ const char *c_name = StringValuePtr(name);
30
+ if (strlen(c_name) == 0) {
31
+ rb_raise(rb_eStandardError, "chunk name is not allowed empty string");
32
+ }
28
33
 
29
34
  struct cio_chunk *chunk = cio_chunk_open(ctx, st, c_name, CIO_OPEN, 1000);
35
+ if (chunk == NULL) {
36
+ rb_raise(rb_eStandardError, "Failed to create chunk");
37
+ }
30
38
 
31
39
  ((chunkio_chunk*)DATA_PTR(self))->inner = chunk;
32
40
  return self;
@@ -77,12 +85,20 @@ static VALUE chunkio_chunk_write(VALUE self, VALUE buf)
77
85
  {
78
86
  chunkio_chunk *chunk = NULL;
79
87
  TypedData_Get_Struct(self, chunkio_chunk, &chunkio_chunk_type, chunk);
80
- ssize_t len = RSTRING_LEN(buf);
81
88
  if (chunk->closed) {
82
89
  rb_raise(rb_eIOError, "IO was already closed");
83
90
  }
91
+ Check_Type(buf, T_STRING);
84
92
 
93
+ ssize_t len = RSTRING_LEN(buf);
85
94
  cio_chunk_write(chunk->inner, (void *)RSTRING_PTR(buf), len);
95
+
96
+ if (chunk->sync_mode) {
97
+ int ret = cio_chunk_sync(chunk->inner);
98
+ if (ret == -1) {
99
+ rb_raise(rb_eStandardError, "failed to sync");
100
+ }
101
+ }
86
102
  return INT2NUM(len);
87
103
  }
88
104
 
@@ -114,11 +130,19 @@ static VALUE chunkio_chunk_set_metadata(VALUE self, VALUE buf)
114
130
  rb_raise(rb_eIOError, "IO was already closed");
115
131
  }
116
132
 
133
+ Check_Type(buf, T_STRING);
117
134
  ssize_t len = RSTRING_LEN(buf);
118
135
  int ret = cio_meta_write(chunk->inner, (void *)RSTRING_PTR(buf), len);
119
136
  if (ret == -1) {
120
137
  rb_raise(rb_eStandardError, "failed to set metadata");
121
138
  }
139
+
140
+ if (chunk->sync_mode) {
141
+ int ret = cio_chunk_sync(chunk->inner);
142
+ if (ret == -1) {
143
+ rb_raise(rb_eStandardError, "failed to sync");
144
+ }
145
+ }
122
146
  return INT2NUM(len);
123
147
  }
124
148
 
@@ -139,9 +163,6 @@ static VALUE chunkio_chunk_metadata(VALUE self)
139
163
  }
140
164
 
141
165
  int ret = cio_meta_read(chunk->inner, &buf, &size);
142
- if (ret == -1) {
143
- rb_raise(rb_eStandardError, "failed to get metadata");
144
- }
145
166
 
146
167
  return rb_str_new(buf, size);
147
168
  }
@@ -198,7 +219,7 @@ static VALUE chunkio_chunk_tx_begin(VALUE self)
198
219
 
199
220
  int ret = cio_chunk_tx_begin(chunk->inner);
200
221
  if (ret == -1) {
201
- rb_raise(rb_eStandardError, "failed to begin transaction");
222
+ rb_raise(rb_eStandardError, "Failed to begin transaction");
202
223
  }
203
224
 
204
225
  return Qnil;
@@ -216,6 +237,13 @@ static VALUE chunkio_chunk_tx_commit(VALUE self)
216
237
  if (ret == -1) {
217
238
  rb_raise(rb_eStandardError, "failed to commit transaction");
218
239
  }
240
+
241
+ if (chunk->sync_mode) {
242
+ int ret = cio_chunk_sync(chunk->inner);
243
+ if (ret == -1) {
244
+ rb_raise(rb_eStandardError, "failed to sync");
245
+ }
246
+ }
219
247
  return Qnil;
220
248
  }
221
249
 
@@ -229,11 +257,32 @@ static VALUE chunkio_chunk_tx_rollback(VALUE self)
229
257
 
230
258
  int ret = cio_chunk_tx_rollback(chunk->inner);
231
259
  if (ret == -1) {
232
- rb_raise(rb_eStandardError, "failed to rollback transaction");
260
+ rb_raise(rb_eStandardError, "Failed to rollback transaction");
233
261
  }
234
262
  return Qnil;
235
263
  }
236
264
 
265
+ static VALUE chunkio_chunk_sync_mode(VALUE self) {
266
+ chunkio_chunk *chunk;
267
+ TypedData_Get_Struct(self, chunkio_chunk, &chunkio_chunk_type, chunk);
268
+ return chunk->sync_mode == 1 ? Qtrue : Qfalse;
269
+ }
270
+
271
+ static VALUE chunkio_chunk_sync_mode_assign(VALUE self, VALUE bool) {
272
+ chunkio_chunk *chunk;
273
+ TypedData_Get_Struct(self, chunkio_chunk, &chunkio_chunk_type, chunk);
274
+
275
+ if (bool == Qtrue) {
276
+ chunk->sync_mode = 1;
277
+ } else if (bool == Qfalse){
278
+ chunk->sync_mode = 0;
279
+ } else {
280
+ rb_raise(rb_eTypeError, "expected true or false");
281
+ }
282
+
283
+ return Qnil;
284
+ }
285
+
237
286
  void Init_chunkio_chunk(VALUE mChunkIO)
238
287
  {
239
288
  cCIO_Chunk = rb_define_class_under(mChunkIO, "Chunk", rb_cObject);
@@ -251,5 +300,7 @@ void Init_chunkio_chunk(VALUE mChunkIO)
251
300
  rb_define_method(cCIO_Chunk, "tx_begin", chunkio_chunk_tx_begin, 0);
252
301
  rb_define_method(cCIO_Chunk, "tx_commit", chunkio_chunk_tx_commit, 0);
253
302
  rb_define_method(cCIO_Chunk, "tx_rollback", chunkio_chunk_tx_rollback, 0);
303
+ rb_define_method(cCIO_Chunk, "sync_mode", chunkio_chunk_sync_mode, 0);
304
+ rb_define_method(cCIO_Chunk, "sync_mode=", chunkio_chunk_sync_mode_assign, 1);
254
305
  /* rb_define_method(cCIO_Chunk, "write_at", chunkio_chunk_write_at, 2); */
255
306
  }
@@ -39,9 +39,16 @@ static VALUE allocate_context(VALUE klass)
39
39
 
40
40
  static VALUE chunkio_context_initialize(VALUE self, VALUE root)
41
41
  {
42
- char *p = RSTRING_PTR(root);
43
- /* struct cio_ctx *ctx = cio_create(p, log_cb, CIO_DEBUG, 0); /\* TODO: flags, LOG *\/ */
44
- struct cio_ctx *ctx = cio_create(p, NULL, CIO_DEBUG, 0); /* TODO: flags, LOG */
42
+ char *p = StringValuePtr(root);
43
+ if (strlen(p) == 0) {
44
+ rb_raise(rb_eStandardError, "Context root path is not allowed empty string");
45
+ }
46
+
47
+ /* permission is fixed for now */
48
+ rb_funcall(rb_const_get(rb_cObject, rb_intern("FileUtils")), rb_intern("mkdir_p"), 1, root);
49
+
50
+ /* struct cio_ctx *ctx = cio_create(p, log_cb, CIO_DEBUG, 0); /\* flag *\/ */
51
+ struct cio_ctx *ctx = cio_create(p, 0, CIO_DEBUG, 0); /* flag */
45
52
  if (!ctx) {
46
53
  rb_raise(rb_eStandardError, "failed to create cio_ctx");
47
54
  }
@@ -4,7 +4,6 @@ VALUE cCIO_Stream;
4
4
 
5
5
  void *chunkio_stream_free(struct cio_stream *st)
6
6
  {
7
-
8
7
  /*
9
8
  Don't call cio_chunk_close_stream(st).
10
9
  cio_chunk is freed by chunkio_chunk.
@@ -33,7 +32,11 @@ static VALUE allocate_stream(VALUE klass)
33
32
 
34
33
  static VALUE chunkio_stream_initialize(VALUE self, VALUE context, VALUE name)
35
34
  {
36
- char *stream_name = RSTRING_PTR(name);
35
+ char *stream_name = StringValuePtr(name);
36
+ if (strlen(stream_name) == 0) {
37
+ rb_raise(rb_eStandardError, "stream_name is not allowed empty string");
38
+ }
39
+
37
40
  struct cio_ctx *ctx = UnwrapChunkIOContext(context);
38
41
  struct cio_stream *st = cio_stream_create(ctx, stream_name, CIO_STORE_FS); /* TODO CIO_STORE_FS */
39
42
  if (!st) {
@@ -9,7 +9,7 @@ message "Building chunkio\n"
9
9
  recipe = MiniPortileCMake.new('chunkio', 'v0.0.1')
10
10
 
11
11
  recipe.files << {
12
- url: 'https://github.com/ganmacs/chunkio/tarball/6a1bd00a455b410085dbae7bbf29edc6139b3e29',
12
+ url: 'https://github.com/ganmacs/chunkio/tarball/612777c764057c53988db3899d88adce6fe742a1',
13
13
  }
14
14
 
15
15
  class << recipe
@@ -5,22 +5,6 @@ require 'chunkio.so'
5
5
  module ChunkIO
6
6
  class ChunkIO
7
7
  def initialize(context_path:, stream_name:)
8
- unless context_path
9
- raise 'invalid'
10
- end
11
-
12
- unless stream_name
13
- raise 'stream'
14
- end
15
-
16
- if context_path.empty?
17
- raise 'context_path should be at least one char'
18
- end
19
-
20
- if stream_name.empty?
21
- raise 'stream_name should be at least one char'
22
- end
23
-
24
8
  @ctx = ::ChunkIO::Context.new(context_path)
25
9
  @stream = ::ChunkIO::Stream.new(@ctx, stream_name)
26
10
  @chunks = []
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChunkIO
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chunkio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuta Iwama
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-10 00:00:00.000000000 Z
11
+ date: 2019-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mini_portile2
@@ -103,10 +103,10 @@ extensions:
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - ".editorconfig"
106
+ - ".github/workflows/run_rspec.yml"
106
107
  - ".gitignore"
107
108
  - ".rspec"
108
109
  - ".rubocop.yml"
109
- - ".travis.yml"
110
110
  - Gemfile
111
111
  - LICENSE
112
112
  - README.md
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6.3
7
- before_install: gem install bundler -v 2.0.1