idzebra 0.1.1 → 0.2.0

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