idzebra 0.1.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 +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: []