idzebra 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/zebraidx_record +7 -5
  2. data/lib/idzebra.rb +65 -2
  3. metadata +35 -3
data/bin/zebraidx_record CHANGED
@@ -45,11 +45,13 @@ data = case file
45
45
  end
46
46
 
47
47
  IdZebra::API(global_opts[:config]) do |repo|
48
- case cmd
49
- when "add"
50
- repo.add_record(data)
51
- when "remove"
52
- repo.delete_record(data)
48
+ repo.transaction do
49
+ case cmd
50
+ when "add"
51
+ repo.add_record(data)
52
+ when "remove"
53
+ repo.delete_record(data)
54
+ end
53
55
  end
54
56
  repo.commit if global_opts[:commit]
55
57
  end
data/lib/idzebra.rb CHANGED
@@ -20,15 +20,21 @@ module IdZebra
20
20
 
21
21
  typedef :pointer, :zebra_handle
22
22
  typedef :pointer, :zebra_service
23
+ typedef :pointer, :res
23
24
  typedef :short, :zebra_res
24
25
 
25
26
  # Yaz functions to set logging level
26
27
  attach_function :yaz_log_init_level, [:int], :void
27
28
  attach_function :yaz_log_mask_str, [:string], :int
28
29
 
30
+ # Res function for resource handling
31
+ attach_function :res_open, [:res, :res], :res
32
+
29
33
  attach_function :zebra_start, [:string], :zebra_service
30
34
  attach_function :zebra_stop, [:zebra_service], :zebra_res
31
- attach_function :zebra_open, [:zebra_service, :pointer], :zebra_handle
35
+ attach_function :zebra_open, [:zebra_service, :res], :zebra_handle
36
+ attach_function :zebra_begin_trans, [:zebra_handle, :short], :zebra_res
37
+ attach_function :zebra_end_trans, [:zebra_handle], :zebra_res
32
38
  attach_function :zebra_close, [:zebra_handle], :zebra_res
33
39
 
34
40
  attach_function :zebra_init, [:zebra_handle], :zebra_res
@@ -36,6 +42,18 @@ module IdZebra
36
42
  attach_function :zebra_commit, [:zebra_handle], :zebra_res
37
43
  attach_function :zebra_compact, [:zebra_handle], :zebra_res
38
44
 
45
+ attach_function :zebra_get_resource, [
46
+ :zebra_handle,
47
+ :string, # name
48
+ :string], # default value
49
+ :string
50
+
51
+ attach_function :zebra_set_resource, [
52
+ :zebra_handle,
53
+ :string, # name
54
+ :string], # value
55
+ :string
56
+
39
57
  attach_function :zebra_add_record, [
40
58
  :zebra_handle,
41
59
  :string, # buf
@@ -55,6 +73,7 @@ module IdZebra
55
73
 
56
74
  class << self
57
75
 
76
+ # Create a new {Repository} connection.
58
77
  def API(config_file, &block)
59
78
  extend Native
60
79
  log_level = :error
@@ -67,6 +86,7 @@ module IdZebra
67
86
  zebra_stop zs
68
87
  end
69
88
 
89
+ # Get the current logging level
70
90
  def log_level
71
91
  extend Native
72
92
  mask = yaz_log_mask_str('')
@@ -84,6 +104,7 @@ module IdZebra
84
104
  end
85
105
  end
86
106
 
107
+ # Set the logging level
87
108
  def log_level=(log_level)
88
109
  extend Native
89
110
  case log_level
@@ -96,29 +117,66 @@ module IdZebra
96
117
  when :info, :default
97
118
  yaz_log_init_level(yaz_log_mask_str('log'))
98
119
  when :debug, :all
99
- yaz_log_init_level(yaz_log_mask_str('all'))
120
+ yaz_log_init_level(yaz_log_mask_str('all,zebraapi,flock'))
100
121
  end
101
122
  end
102
123
 
103
124
  end
104
125
 
126
+ # Raised when transactions are unable to be started.
127
+ class TransactionError < StandardError; end
128
+
129
+ # Class representing a Zebra handle to a repository.
130
+ #
131
+ # Operations are named to directly correspond to their counterparts in api.h
132
+ # and zebraidx, and so are not particularly Ruby-like.
133
+ #
134
+ # @see http://www.indexdata.com/zebra/dox/html/api_8h.html Zebra API
135
+ # @see http://www.indexdata.com/zebra/doc/zebraidx.html zebraidx
105
136
  class Repository < Struct.new(:zebra_handle)
106
137
  include Native
107
138
 
139
+ # Create a new repository (wiping any existing data).
108
140
  def init
109
141
  zebra_init(zebra_handle)
110
142
  end
111
143
 
144
+ # Attempt to save some space by compacting existing data files.
112
145
  def compact
113
146
  zebra_compact(zebra_handle)
114
147
  end
115
148
 
149
+ # Rollback changes in shadow files and forget changes.
116
150
  def clean
117
151
  zebra_clean(zebra_handle)
118
152
  end
119
153
 
154
+ # Commit the shadow files. Not designed to be run inside a transaction, but
155
+ # instead should be run after it.
120
156
  def commit
157
+ transaction
121
158
  zebra_commit(zebra_handle)
159
+ rescue TransactionError
160
+ raise TransactionError, "Commit cannot occur inside a transaction."
161
+ end
162
+
163
+ # Encapsulates the operation with `zebra_begin_trans` and `zebra_end_trans`
164
+ def transaction(read_only = false)
165
+ zebra_res = zebra_begin_trans(zebra_handle, read_only ? 0 : 1)
166
+ if zebra_res != 0
167
+ raise TransactionError,
168
+ "Unable to start transaction - probably a locking issue."
169
+ end
170
+ yield if block_given?
171
+ zebra_end_trans(zebra_handle)
172
+ end
173
+
174
+ def get_resource(name, default = nil)
175
+ zebra_get_resource(zebra_handle, name, default)
176
+ end
177
+
178
+ def set_resource(name, value)
179
+ zebra_set_resource(zebra_handle, name, value)
122
180
  end
123
181
 
124
182
  def add_record(record_str)
@@ -135,6 +193,11 @@ module IdZebra
135
193
  :action_delete, nil, 0, nil, nil, record_str, 0)
136
194
  end
137
195
 
196
+ alias :<< :update_record
197
+ alias :[] :get_resource
198
+ alias :[]= :set_resource
199
+ alias :rollback :clean
200
+
138
201
  end
139
202
 
140
203
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idzebra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
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-09-14 00:00:00.000000000 Z
12
+ date: 2013-01-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: redcarpet
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  - !ruby/object:Gem::Dependency
63
79
  name: rspec
64
80
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +91,22 @@ dependencies:
75
91
  - - ! '>='
76
92
  - !ruby/object:Gem::Version
77
93
  version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
78
110
  description: Ruby bindings for the Zebra open-source Z39.50/SRU server.
79
111
  email: tim@dettrick.net
80
112
  executables:
@@ -105,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
137
  version: '0'
106
138
  segments:
107
139
  - 0
108
- hash: -2741384696241936114
140
+ hash: -4571173317423406803
109
141
  requirements:
110
142
  - idzebra-2.0
111
143
  rubyforge_project: