chunkio 0.1.2 → 0.1.3

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: 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