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.
Files changed (3) hide show
  1. data/bin/zebraidx_record +55 -0
  2. data/lib/idzebra.rb +139 -0
  3. metadata +116 -0
@@ -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: []