idzebra 0.1.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.
- data/bin/zebraidx_record +55 -0
- data/lib/idzebra.rb +139 -0
- metadata +116 -0
data/bin/zebraidx_record
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'idzebra'
|
4
|
+
require 'trollop'
|
5
|
+
|
6
|
+
SUB_COMMANDS = %w(add delete)
|
7
|
+
global_opts = Trollop::options do
|
8
|
+
banner "zebra <options> (add|remove) [file]"
|
9
|
+
opt :config, "Zebra config file",
|
10
|
+
:type => :string, :short => '-c', :required => true
|
11
|
+
opt :verbose, "Verbosity level", :type => :string, :short => "-v"
|
12
|
+
opt :commit, "Commit on completion", :default => false, :short => "-C"
|
13
|
+
stop_on SUB_COMMANDS
|
14
|
+
end
|
15
|
+
|
16
|
+
Trollop::die :config, "must exist" unless File.exist?(global_opts[:config])
|
17
|
+
|
18
|
+
if global_opts[:verbose]
|
19
|
+
level = global_opts[:verbose]
|
20
|
+
level = level =~ /^0x/ ? level.to_i : level.to_sym
|
21
|
+
IdZebra::log_level = level
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
cmd = ARGV.shift # get the subcommand
|
26
|
+
cmd_opts = case cmd
|
27
|
+
when "add" # parse delete options
|
28
|
+
Trollop::options do
|
29
|
+
# No cmd specific options
|
30
|
+
end
|
31
|
+
when "remove" # parse copy options
|
32
|
+
Trollop::options do
|
33
|
+
# No cmd specific options
|
34
|
+
end
|
35
|
+
else
|
36
|
+
Trollop::die "unknown subcommand #{cmd.inspect}"
|
37
|
+
end
|
38
|
+
|
39
|
+
file = ARGV.shift
|
40
|
+
data = case file
|
41
|
+
when nil, '-'
|
42
|
+
STDIN.read
|
43
|
+
else
|
44
|
+
File.open(file) { |f| f.read}
|
45
|
+
end
|
46
|
+
|
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)
|
53
|
+
end
|
54
|
+
repo.commit if global_opts[:commit]
|
55
|
+
end
|
data/lib/idzebra.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module IdZebra
|
4
|
+
|
5
|
+
module Native
|
6
|
+
extend FFI::Library
|
7
|
+
|
8
|
+
UPDATE_ACTIONS = enum [
|
9
|
+
:action_insert, 1,
|
10
|
+
:action_replace,
|
11
|
+
:action_delete,
|
12
|
+
:action_update,
|
13
|
+
:action_a_delete ]
|
14
|
+
|
15
|
+
ffi_lib_flags :now, :global
|
16
|
+
ffi_lib ['yaz', 'libyaz.so.4'],
|
17
|
+
['yaz_server', 'libyaz_server.so.4'],
|
18
|
+
['idzebra-2.0', 'libidzebra-2.0.so.0']
|
19
|
+
|
20
|
+
typedef :pointer, :zebra_handle
|
21
|
+
typedef :pointer, :zebra_service
|
22
|
+
typedef :short, :zebra_res
|
23
|
+
|
24
|
+
# Yaz functions to set logging level
|
25
|
+
attach_function :yaz_log_init_level, [:int], :void
|
26
|
+
attach_function :yaz_log_mask_str, [:string], :int
|
27
|
+
|
28
|
+
attach_function :zebra_start, [:string], :zebra_service
|
29
|
+
attach_function :zebra_stop, [:zebra_service], :zebra_res
|
30
|
+
attach_function :zebra_open, [:zebra_service, :pointer], :zebra_handle
|
31
|
+
attach_function :zebra_close, [:zebra_handle], :zebra_res
|
32
|
+
|
33
|
+
attach_function :zebra_init, [:zebra_handle], :zebra_res
|
34
|
+
attach_function :zebra_clean, [:zebra_handle], :zebra_res
|
35
|
+
attach_function :zebra_commit, [:zebra_handle], :zebra_res
|
36
|
+
attach_function :zebra_compact, [:zebra_handle], :zebra_res
|
37
|
+
|
38
|
+
attach_function :zebra_add_record, [
|
39
|
+
:zebra_handle,
|
40
|
+
:string, # buf
|
41
|
+
:int], # buf_size
|
42
|
+
:zebra_res
|
43
|
+
attach_function :zebra_update_record, [
|
44
|
+
:zebra_handle,
|
45
|
+
UPDATE_ACTIONS, # action
|
46
|
+
:string, # recordType
|
47
|
+
:long, # sysno
|
48
|
+
:string, # match
|
49
|
+
:string, # fname
|
50
|
+
:string, # buf
|
51
|
+
:int], # buf_size
|
52
|
+
:zebra_res
|
53
|
+
end
|
54
|
+
|
55
|
+
class << self
|
56
|
+
|
57
|
+
def API(config_file, &block)
|
58
|
+
extend Native
|
59
|
+
log_level = :error
|
60
|
+
zs = zebra_start(config_file)
|
61
|
+
zh = zebra_open(zs, nil)
|
62
|
+
log_level = :default
|
63
|
+
yield Repository.new(zh)
|
64
|
+
log_level = :error
|
65
|
+
zebra_close zh
|
66
|
+
zebra_stop zs
|
67
|
+
end
|
68
|
+
|
69
|
+
def log_level
|
70
|
+
extend Native
|
71
|
+
mask = yaz_log_mask_str('')
|
72
|
+
case mask
|
73
|
+
when yaz_log_mask_str('none,error')
|
74
|
+
:error
|
75
|
+
when yaz_log_mask_str('none,error,warn')
|
76
|
+
:warn
|
77
|
+
when yaz_log_mask_str('log')
|
78
|
+
:info
|
79
|
+
when yaz_log_mask_str('all')
|
80
|
+
:default
|
81
|
+
else
|
82
|
+
mask
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def log_level=(log_level)
|
87
|
+
extend Native
|
88
|
+
case log_level
|
89
|
+
when Numeric
|
90
|
+
yaz_log_init_level(log_level)
|
91
|
+
when :error
|
92
|
+
yaz_log_init_level(yaz_log_mask_str('none,error'))
|
93
|
+
when :warn
|
94
|
+
yaz_log_init_level(yaz_log_mask_str('none,error,warn'))
|
95
|
+
when :info, :default
|
96
|
+
yaz_log_init_level(yaz_log_mask_str('log'))
|
97
|
+
when :debug, :all
|
98
|
+
yaz_log_init_level(yaz_log_mask_str('all'))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
class Repository < Struct.new(:zebra_handle)
|
105
|
+
include Native
|
106
|
+
|
107
|
+
def init
|
108
|
+
zebra_init(zebra_handle)
|
109
|
+
end
|
110
|
+
|
111
|
+
def compact
|
112
|
+
zebra_compact(zebra_handle)
|
113
|
+
end
|
114
|
+
|
115
|
+
def clean
|
116
|
+
zebra_clean(zebra_handle)
|
117
|
+
end
|
118
|
+
|
119
|
+
def commit
|
120
|
+
zebra_commit(zebra_handle)
|
121
|
+
end
|
122
|
+
|
123
|
+
def add_record(record_str)
|
124
|
+
zebra_add_record(zebra_handle, record_str, 0)
|
125
|
+
end
|
126
|
+
|
127
|
+
def update_record(record_str)
|
128
|
+
zebra_update_record(zebra_handle,
|
129
|
+
:action_update, nil, 0, nil, nil, record_str, 0)
|
130
|
+
end
|
131
|
+
|
132
|
+
def delete_record(record_str)
|
133
|
+
zebra_update_record(zebra_handle,
|
134
|
+
:action_delete, nil, 0, nil, nil, record_str, 0)
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: idzebra
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tim Dettrick
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ffi
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: trollop
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
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'
|
78
|
+
description: Ruby bindings for the Zebra open-source Z39.50/SRU server.
|
79
|
+
email: tim@dettrick.net
|
80
|
+
executables:
|
81
|
+
- zebraidx_record
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- lib/idzebra.rb
|
86
|
+
- bin/zebraidx_record
|
87
|
+
homepage: https://github.com/tjdett/idzebra
|
88
|
+
licenses:
|
89
|
+
- Simplified BSD
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
require_paths:
|
93
|
+
- lib
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 1.9.1
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
hash: 3872328755922669822
|
109
|
+
requirements:
|
110
|
+
- idzebra-2.0
|
111
|
+
rubyforge_project:
|
112
|
+
rubygems_version: 1.8.24
|
113
|
+
signing_key:
|
114
|
+
specification_version: 3
|
115
|
+
summary: Ruby bindings for IdZebra
|
116
|
+
test_files: []
|