rdbxml 0.5 → 0.6

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/Rakefile CHANGED
@@ -6,6 +6,8 @@ require 'rake/rdoctask'
6
6
  require 'rake/gempackagetask'
7
7
  require 'rake/contrib/rubyforgepublisher'
8
8
 
9
+ GEM_VERSION = '0.6'
10
+
9
11
  dbxml_dist = ENV['DBXML_DIST']
10
12
  if dbxml_dist
11
13
  puts "*** Using DBXML distribution in #{dbxml_dist}"
@@ -57,7 +59,6 @@ rd = Rake::RDocTask.new :rdoc do |rdoc|
57
59
  rdoc.rdoc_files.include 'rake/**/*task.rb'
58
60
  end
59
61
 
60
- GEM_VERSION = '0.5'
61
62
  GEM_FILES = rd.rdoc_files + FileList[
62
63
  'Rakefile',
63
64
  'ext/**/*.i',
@@ -71,9 +72,8 @@ spec = Gem::Specification.new do |s|
71
72
  s.version = GEM_VERSION
72
73
  s.date = Date.today.to_s
73
74
  s.authors = ["Steve Sloan"]
74
- s.summary = 'Provides wrappers for the BDBXML (and BDB) C++ APIs, plus pure Ruby extensions'
75
- s.description = <<-END
76
- END
75
+ s.summary = 'Provides wrappers for the BDB XML C++ APIs, plus pure Ruby extensions'
76
+ # s.description =
77
77
  s.files = GEM_FILES.to_a.delete_if {|f| f.include?('.svn')}
78
78
  s.autorequire = 'rdbxml'
79
79
  s.test_files = Dir["test/test_*.rb"]
data/ext/dbxml_ruby.i CHANGED
@@ -1,5 +1,7 @@
1
1
  %module dbxml
2
+ %include "exception.i"
2
3
  %include "std_string.i"
4
+ %include "std_except.i"
3
5
 
4
6
  %alias XmlManager::createQueryContext "create_query_context";
5
7
 
@@ -11,25 +13,66 @@
11
13
  %alias XmlDocument::getContent "content";
12
14
  %alias XmlDocument::setContent "content=";
13
15
 
14
- %alias XmlQueryContext::getNamespace "get_namespace";
15
- %alias XmlQueryContext::setNamespace "set_namespace";
16
- %alias XmlQueryContext::getDefaultCollection "default_collection";
17
- %alias XmlQueryContext::setDefaultCollection "default_collection=";
18
- %alias XmlQueryContext::getVariableValue "[]";
19
- %alias XmlQueryContext::setVariableValue "[]=";
16
+ %alias XmlQueryContext::getNamespace "namespace";
17
+ %alias XmlQueryContext::setNamespace "namespace=";
18
+ %alias XmlQueryContext::getDefaultCollection "collection";
19
+ %alias XmlQueryContext::setDefaultCollection "collection=";
20
20
 
21
21
  %alias XmlValue::asString "to_s";
22
22
  %alias XmlValue::asNumber "to_f";
23
23
  %alias XmlValue::asDocument "to_doc";
24
24
 
25
+ %exceptionclass DbException;
26
+ class DbException;
27
+
28
+ %exceptionclass XmlException;
29
+ %alias XmlException::what "to_s";
30
+ %alias XmlException::getExceptionCode "err";
31
+
32
+ class XmlException : public std::exception {
33
+ public:
34
+ enum ExceptionCode {
35
+ INTERNAL_ERROR, ///< An internal error occured.
36
+ CONTAINER_OPEN, ///< The container is open.
37
+ CONTAINER_CLOSED, ///< The container is closed.
38
+ NULL_POINTER, ///< null pointer exception
39
+ INDEXER_PARSER_ERROR, ///< XML Indexer could not parse a document.
40
+ DATABASE_ERROR, ///< Berkeley DB reported a database problem.
41
+ XPATH_PARSER_ERROR, ///< The XPath parser was unable to parse the XPath expression.
42
+ DOM_PARSER_ERROR, ///< The DOM parser was unable to parse an XML document.
43
+ XPATH_EVALUATION_ERROR, ///< The XPath evaluator was unable to execute the XPath expression.
44
+ NO_VARIABLE_BINDING, ///< An XPath expression referred to variable without a value.
45
+ LAZY_EVALUATION, ///< XmlResults is lazily evaluated.
46
+ DOCUMENT_NOT_FOUND, ///< The specified document could not be found
47
+ CONTAINER_EXISTS, ///< The container already exists.
48
+ UNKNOWN_INDEX, ///< The indexing strategy name is unknown.
49
+ INVALID_VALUE, ///< An invalid parameter was passed.
50
+ VERSION_MISMATCH, ///< The container version and the dbxml library version are not compatible.
51
+ UNUSED_2, ///< Placeholder
52
+ CONTAINER_NOT_FOUND, ///< The specified container could not be found
53
+ TRANSACTION_ERROR, ///< An XmlTransaction has already been committed or aborted
54
+ UNIQUE_ERROR, ///< A uniqueness constraint has been violated
55
+ NO_MEMORY_ERROR ///< An operation was unable to allocate memory
56
+ };
57
+
58
+ explicit XmlException(const DbException &e, const char *file = 0, int line = 0);
59
+ XmlException(const XmlException &);
60
+ virtual ~XmlException() throw();
61
+ virtual const char *what() const throw();
62
+
63
+ ExceptionCode getExceptionCode() const;
64
+ int getDbErrno() const;
65
+ };
66
+
25
67
  %exception {
26
68
  try {
27
69
  $action
28
70
  } catch ( DbException &ex ) {
29
- static VALUE rb_DBException = rb_define_class("DBException", rb_eStandardError);
30
- rb_raise( rb_DBException, ex.what() );
31
- } catch ( DbXml::XmlException &ex ) {
32
- static VALUE rb_XmlException = rb_define_class("XmlException", rb_eStandardError);
33
- rb_raise( rb_XmlException, ex.what() );
71
+ %raise( SWIG_NewPointerObj(new DbException(ex), SWIGTYPE_p_DbException, SWIG_POINTER_OWN),
72
+ "BDB Exception", SWIGTYPE_p_DbException );
73
+ } catch ( XmlException &ex ) {
74
+ %raise( SWIG_NewPointerObj(new XmlException(ex), SWIGTYPE_p_XmlException, SWIG_POINTER_OWN),
75
+ "BDB XXML Exception", SWIGTYPE_p_XmlException );
34
76
  }
35
77
  }
78
+
data/lib/rdbxml.rb CHANGED
@@ -38,9 +38,18 @@ module RDBXML
38
38
  end
39
39
  end
40
40
 
41
+ # Wraps and extends the XmlValue[http://www.sleepycat.com/xmldocs/api_cxx/XmlValue.html] class.
42
+ # === Aliases:
43
+ # to_s:: asString
44
+ # to_f:: asNumber
45
+ # to_doc:: asDocument (XmlDocument)
46
+ # to_i:: #to_f
41
47
  class Dbxml::XmlValue
42
- def to_i ; self.to_f.to_i ; end
48
+ def to_i # :nodoc:
49
+ self.to_f.to_i
50
+ end
43
51
 
52
+ # Handles Numeric/Boolean/String comparisons
44
53
  def ==( that )
45
54
  if isNumber
46
55
  self.asNumber == that
@@ -52,33 +61,71 @@ class Dbxml::XmlValue
52
61
  end
53
62
  end
54
63
 
64
+ # Wraps the XmlResults[http://www.sleepycat.com/xmldocs/api_cxx/XmlResults_list.html] class as an
65
+ # enumerable collection of XmlValue or XmlDocument.
55
66
  class Dbxml::XmlResults
56
67
  include Enumerable
57
68
 
58
- def each( &block )
69
+ # Iterates across each result (as an XmlValue) in the set
70
+ def each( &block ) # :yields: value
59
71
  self.reset
60
72
  while self.hasNext
61
73
  yield self.next
62
74
  end
63
75
  end
64
76
 
77
+ # Iterates across each result (as an XmlDocument) in the set
78
+ def each_doc( &block ) # :yields: document
79
+ self.reset
80
+ while self.hasNext
81
+ yield self.nextDocument
82
+ end
83
+ end
84
+
85
+ # Returns the first result as an XmlValue(or +nil+)
65
86
  def first
66
87
  self.reset
67
88
  self.hasNext ? self.next : nil
68
89
  end
69
90
 
91
+ # Returns the first result as an XmlDocument (or +nil+)
92
+ def first_doc
93
+ self.reset
94
+ self.hasNext ? self.nextDocument : nil
95
+ end
96
+
97
+ # Returns the result set as +newline+-joined strings
70
98
  def to_s
71
99
  collect { |v| v.to_s }.join "\n"
72
100
  end
73
101
  end
74
102
 
75
- class Dbxml::XmlDocument
76
- @@namespaces = {}
103
+ # Wraps and extends the XmlQueryContext[http://www.sleepycat.com/xmldocs/api_cxx/XmlQueryContext_list.html] class.
104
+ # === Aliases
105
+ # namespace:: getNamespace/setNamespace[http://www.sleepycat.com/xmldocs/api_cxx/XmlQueryContext_setNamespace.html]
106
+ # collection:: getDefaultCollection/setDefaultCollection[http://www.sleepycat.com/xmldocs/api_cxx/XmlQueryContext_setDefaultCollection.html]
107
+ class Dbxml::XmlQueryContext
108
+ # XmlQueryContext::getVariableValue[http://www.sleepycat.com/xmldocs/api_cxx/XmlQueryContext_setVariableValue.html]
109
+ def []( name )
110
+ getVariableValue name.to_s
111
+ end
112
+ # XmlQueryContext::setVariableValue[http://www.sleepycat.com/xmldocs/api_cxx/XmlQueryContext_setVariableValue.html]
113
+ def []=( name, val ) # :nodoc:
114
+ setVariableValue name.to_s, Dbxml::XmlValue.new(val)
115
+ end
116
+ end
77
117
 
118
+ # Wraps and extends the XmlDocument[http://www.sleepycat.com/xmldocs/api_cxx/XmlDocument_list.html] class.
119
+ # === Aliases:
120
+ # name:: getName/setName[http://www.sleepycat.com/xmldocs/api_cxx/XmlDocument_setName.html]
121
+ # content:: getContent/setContent[http://www.sleepycat.com/xmldocs/api_cxx/XmlDocument_getContent.html]
122
+ # to_s:: #content
123
+ class Dbxml::XmlDocument
124
+ # Represents the document metadata as an Enumerable collection
78
125
  class MetaData
79
126
  include Enumerable
80
127
 
81
- def initialize(doc)
128
+ def initialize(doc) #:nodoc:
82
129
  @doc = doc
83
130
  end
84
131
 
@@ -92,7 +139,7 @@ class Dbxml::XmlDocument
92
139
  val = args.pop
93
140
  ns = args.shift || ''
94
141
  if val
95
- @doc.setMetaData ns, name.to_s, XmlValue.new(val)
142
+ @doc.setMetaData ns, name.to_s, Dbxml::XmlValue.new(val)
96
143
  else
97
144
  delete name, ns
98
145
  end
@@ -103,7 +150,7 @@ class Dbxml::XmlDocument
103
150
  @doc.removeMetaData ns, name.to_s
104
151
  end
105
152
 
106
- def each(&block)
153
+ def each(&block) # :yields: name, value, uri
107
154
  i = @doc.getMetaDataIterator
108
155
  while (xmd = i.next)
109
156
  yield xmd.get_name.to_sym, xmd.get_value, xmd.get_uri
@@ -118,12 +165,16 @@ class Dbxml::XmlDocument
118
165
  end
119
166
  end
120
167
 
168
+ # Returns the document metadata[http://www.sleepycat.com/xmldocs/api_cxx/XmlDocument_getMetaData.html]
121
169
  def meta
122
170
  @Meta ||= MetaData.new(self)
123
171
  end
124
172
 
125
173
  end
126
174
 
175
+ # Wraps and extends the XmlContainer[http://www.sleepycat.com/xmldocs/api_cxx/XmlContainer_list.html] class.
176
+ # === Aliases
177
+ # manager:: getManager[http://www.sleepycat.com/xmldocs/api_cxx/XmlContainer_getManager.html]
127
178
  class Dbxml::XmlContainer
128
179
  include Enumerable
129
180
 
@@ -131,8 +182,8 @@ class Dbxml::XmlContainer
131
182
  def []( name )
132
183
  begin
133
184
  getDocument name.to_s
134
- rescue XmlException => ex
135
- raise unless ex.to_s =~ /document not found/i
185
+ rescue Dbxml::XmlException => ex
186
+ raise unless ex.err == XmlException::DOCUMENT_NOT_FOUND
136
187
  nil
137
188
  end
138
189
  end
@@ -152,32 +203,37 @@ class Dbxml::XmlContainer
152
203
  self << doc
153
204
  end
154
205
 
155
- # Creates/updates the document +doc+.
206
+ # Creates/updates the XmlDocument +doc+.
156
207
  def <<( doc )
157
208
  ctx = getManager.createUpdateContext
158
209
  begin
159
210
  putDocument doc, ctx, 0
160
- rescue XmlException => ex
161
- raise unless ex.to_s =~ /document exists/i
211
+ rescue Dbxml::XmlException => ex
212
+ raise unless ex.err == XmlException::UNIQUE_ERROR
162
213
  d = self[doc.name]
163
214
  d.content = doc.content
164
215
  updateDocument d, ctx
165
216
  end
166
217
  end
167
218
 
168
- # Iterates over each document in the collection
169
- def each( &block )
219
+ # Iterates over each XmlDocument in the collection
220
+ def each( &block ) # :yields: document
170
221
  getAllDocuments.each(block)
171
222
  end
172
223
  end
173
224
 
225
+ # Wraps and extends the XmlManager[http://www.sleepycat.com/xmldocs/api_cxx/XmlManager_list.html] class.
226
+ # === Aliases
227
+ # create_query_context:: createQueryContext
174
228
  class Dbxml::XmlManager
175
229
  # Opens the container named +name+, creating it if it doesn't exist.
176
230
  def []( name )
177
231
  openContainer name.to_s, Dbxml::DB_CREATE
178
232
  end
179
233
 
180
- def query( xquery, opts = {}, &block )
234
+ # Runs the query +xquery+, creating a query context if necessary or using
235
+ # +opts[:ctx]+ if passed.
236
+ def query( xquery, opts = {}, &block ) # :yeilds: result
181
237
  opts[:ctx] ||= create_query_context
182
238
  q = self.prepare xquery, opts[:ctx]
183
239
  res = q.execute( opts[:ctx], 0 )
@@ -186,3 +242,12 @@ class Dbxml::XmlManager
186
242
  res
187
243
  end
188
244
  end
245
+
246
+ # Wraps and extends the [http://www.sleepycat.com/xmldocs/api_cxx/env_class.html] class.
247
+ class Db::DbEnv
248
+ # Convenience function to instantiate a XmlManager which attaches to
249
+ # this environment.
250
+ def manager
251
+ Dbxml::XmlManager.new self, 0
252
+ end
253
+ end
data/test/test_rdbxml.rb CHANGED
@@ -55,6 +55,20 @@ class XmlValueTest < Test::Unit::TestCase
55
55
  end
56
56
  end
57
57
 
58
+ class XmlQueryContextTest < Test::Unit::TestCase
59
+ def setup
60
+ @db = RDBXML::XmlManager.new
61
+ @q = @db.create_query_context
62
+ end
63
+
64
+ def test_get_set_variable
65
+ @q[:foo] = 'xyz'
66
+ assert_equal 'xyz', @q[:foo].to_s
67
+ assert_equal 'xyz', @db.query('$foo', :ctx => @q).to_s
68
+ end
69
+
70
+ end
71
+
58
72
  class XmlResultsTest < Test::Unit::TestCase
59
73
  def setup
60
74
  @db = RDBXML::XmlManager.new
@@ -93,8 +107,8 @@ class XmlDocumentTest < Test::Unit::TestCase
93
107
  def setup
94
108
  @dir = File.join( File.dirname(__FILE__), File.basename(__FILE__, '.rb') + '.db' )
95
109
  Dir.mkdir @dir unless File.exists? @dir
96
- @env = RDBXML::env(@dir)
97
- @db = RDBXML::XmlManager.new @env, 0
110
+ @env = RDBXML::env @dir
111
+ @db = @env.manager
98
112
  @docs = @db['test']
99
113
  end
100
114
 
metadata CHANGED
@@ -3,16 +3,16 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: rdbxml
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.5"
7
- date: 2006-05-14 00:00:00 -07:00
8
- summary: Provides wrappers for the BDBXML (and BDB) C++ APIs, plus pure Ruby extensions
6
+ version: "0.6"
7
+ date: 2006-05-29 00:00:00 -07:00
8
+ summary: Provides wrappers for the BDB XML C++ APIs, plus pure Ruby extensions
9
9
  require_paths:
10
10
  - lib
11
11
  - ext
12
12
  email:
13
13
  homepage:
14
14
  rubyforge_project:
15
- description: ""
15
+ description:
16
16
  autorequire: rdbxml
17
17
  default_executable:
18
18
  bindir: bin