glyr 0.9.9.2 → 0.9.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/glyr.rb CHANGED
@@ -12,6 +12,7 @@ require 'glyr/c'
12
12
 
13
13
  require 'glyr/version'
14
14
  require 'glyr/query'
15
+ require 'glyr/database'
15
16
  require 'glyr/results'
16
17
  require 'glyr/providers'
17
18
  require 'glyr/sources'
@@ -25,4 +26,14 @@ module Glyr
25
26
  def self.providers
26
27
  @providers ||= Providers.create
27
28
  end
29
+
30
+ def self.cache_at (path = nil)
31
+ if path
32
+ @database = Database.create(path).write!.read!
33
+
34
+ self
35
+ else
36
+ @database
37
+ end
38
+ end
28
39
  end
@@ -80,4 +80,14 @@ attach_function :glyr_get_requirements, [GetType], :int
80
80
 
81
81
  attach_function :glyr_type_is_image, [GetType], :bool
82
82
 
83
+ attach_function :glyr_db_init, [:string], :pointer
84
+ attach_function :glyr_db_destroy, [:pointer], :void
85
+ attach_function :glyr_db_lookup, [:pointer, :pointer], :pointer
86
+ attach_function :glyr_db_insert, [:pointer, :pointer, :pointer], :void
87
+ attach_function :glyr_db_delete, [:pointer, :pointer], :int
88
+ attach_function :glyr_db_edit, [:pointer, :pointer, :pointer], :int
89
+ attach_function :glyr_db_replace, [:pointer, :pointer, :pointer, :pointer], :void
90
+ attach_function :glyr_db_foreach, [:pointer, :glyr_foreach_callback, :pointer], :void
91
+ attach_function :glyr_db_make_dummy, [], :pointer
92
+
83
93
  end; end
data/lib/glyr/c/types.rb CHANGED
@@ -98,9 +98,11 @@ class MemCache < FFI::Struct
98
98
  :prev, :pointer
99
99
  end
100
100
 
101
+ callback :glyr_foreach_callback, [:pointer, :pointer, :pointer], :int
102
+
101
103
  class Database < FFI::Struct
102
104
  layout \
103
- :root_path, :string,
105
+ :root_path, :pointer,
104
106
  :db_handle, :pointer
105
107
  end
106
108
 
@@ -0,0 +1,99 @@
1
+ #--
2
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
3
+ # Version 2, December 2004
4
+ #
5
+ # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
6
+ # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
7
+ #
8
+ # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
+ #++
10
+
11
+ module Glyr
12
+
13
+ class Database
14
+ # create a Query object with the passed options
15
+ def self.create (path)
16
+ pointer = C.glyr_db_init(path)
17
+
18
+ if pointer.null?
19
+ raise ArgumentError, "could not open/create database at #{path}"
20
+ end
21
+
22
+ wrap(pointer)
23
+ end
24
+
25
+ def self.wrap (pointer)
26
+ new(pointer).tap {|x|
27
+ ObjectSpace.define_finalizer x, finalizer(pointer)
28
+ }
29
+ end
30
+
31
+ def self.finalizer (pointer) # :nodoc:
32
+ proc {
33
+ C.glyr_db_destroy(pointer)
34
+ }
35
+ end
36
+
37
+ include Enumerable
38
+
39
+ def initialize (pointer)
40
+ @internal = pointer.is_a?(FFI::Pointer) ? C::Database.new(pointer) : pointer
41
+ end
42
+
43
+ def path
44
+ to_native[:root_path]
45
+ end
46
+
47
+ def write?; !!@write; end
48
+ def read?; !!@read; end
49
+
50
+ def write!
51
+ @write = true
52
+
53
+ self
54
+ end
55
+
56
+ def read!
57
+ @read = true
58
+
59
+ self
60
+ end
61
+
62
+ def lookup (query)
63
+ Results.wrap(C.glyr_db_lookup(to_native, query.to_native))
64
+ end
65
+
66
+ def insert (query, results)
67
+ C.glyr_db_insert(to_native, query.to_native, results.to_native)
68
+
69
+ self
70
+ end
71
+
72
+ def delete (query)
73
+ C.glyr_db_delete(to_native, query.to_native)
74
+ end
75
+
76
+ def replace (query, results)
77
+ C.glyr_db_edit(to_native, query.to_native, results.to_native)
78
+ end
79
+
80
+ def swap (query, a, b)
81
+ C.glyr_db_replace(to_native, a.respond_to?(:md5) ? a.md5 : a.to_s, query.to_native, b.to_native)
82
+
83
+ self
84
+ end
85
+
86
+ def each (&block)
87
+ C.glyr_db_foreach(to_native, proc {|query, item|
88
+ block.call [Query.new(query), Result.new(item)]
89
+ }, nil)
90
+
91
+ self
92
+ end
93
+
94
+ def to_native
95
+ @internal
96
+ end
97
+ end
98
+
99
+ end
data/lib/glyr/query.rb CHANGED
@@ -197,6 +197,14 @@ class Query
197
197
  end
198
198
  end
199
199
 
200
+ def cache (value = nil)
201
+ if value
202
+ @cache = Database.create(value)
203
+ else
204
+ @cache
205
+ end
206
+ end
207
+
200
208
  def download?
201
209
  to_native[:download]
202
210
  end
@@ -273,7 +281,13 @@ class Query
273
281
  end
274
282
  }, nil)
275
283
  else
276
- C.glyr_opt_dlcallback(to_native, nil, nil)
284
+ raise_if_error C.glyr_opt_dlcallback(to_native, nil, nil)
285
+ end
286
+
287
+ if db = cache || Glyr.cache_at
288
+ raise_if_error C.glyr_opt_lookup_db(to_native, db.to_native)
289
+ raise_if_error C.glyr_opt_db_autoread(to_native, true) if db.read?
290
+ raise_if_error C.glyr_opt_db_autowrite(to_native, true) if db.write?
277
291
  end
278
292
 
279
293
  result = C.glyr_get(to_native, error, length)
data/lib/glyr/results.rb CHANGED
@@ -29,7 +29,19 @@ class Results
29
29
 
30
30
  def initialize (pointer, length = nil)
31
31
  @internal = pointer.is_a?(FFI::Pointer) ? C::MemCache.new(pointer) : pointer
32
- @length = length
32
+ @length = if length
33
+ length
34
+ else
35
+ length = 0
36
+ current = @internal
37
+
38
+ until current.null?
39
+ length += 1
40
+ current = C::MemCache.new(current[:next])
41
+ end
42
+
43
+ length
44
+ end
33
45
  end
34
46
 
35
47
  def each (&block)
@@ -109,6 +121,10 @@ class Result
109
121
  to_native[:type]
110
122
  end
111
123
 
124
+ def md5
125
+ to_native[:md5sum]
126
+ end
127
+
112
128
  def to_native
113
129
  @internal
114
130
  end
data/lib/glyr/version.rb CHANGED
@@ -12,6 +12,6 @@ require 'glyr'
12
12
 
13
13
  module Glyr
14
14
  def self.version
15
- '0.9.9.2'
15
+ '0.9.9.3'
16
16
  end
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glyr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9.2
4
+ version: 0.9.9.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-23 00:00:00.000000000 Z
12
+ date: 2012-06-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -71,6 +71,7 @@ files:
71
71
  - lib/glyr/c.rb
72
72
  - lib/glyr/c/functions.rb
73
73
  - lib/glyr/c/types.rb
74
+ - lib/glyr/database.rb
74
75
  - lib/glyr/providers.rb
75
76
  - lib/glyr/query.rb
76
77
  - lib/glyr/results.rb