sedna 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/{CHANGES → CHANGES.rdoc} +9 -0
- data/{README → README.rdoc} +23 -25
- data/Rakefile +32 -9
- data/ext/{extconf.rb → sedna/extconf.rb} +33 -21
- data/ext/{sedna.c → sedna/sedna.c} +48 -40
- data/test/sedna_test.rb +9 -9
- data/vendor/sedna/AUTHORS +18 -0
- data/vendor/sedna/COPYRIGHT +90 -0
- data/vendor/sedna/LICENSE +202 -0
- data/vendor/sedna/Makefile.include +423 -0
- data/vendor/sedna/Makefile.platform +31 -0
- data/vendor/sedna/depend.sed +48 -0
- data/vendor/sedna/driver/c/Makefile +98 -0
- data/vendor/sedna/driver/c/libsedna.c +1998 -0
- data/vendor/sedna/driver/c/libsedna.h +199 -0
- data/vendor/sedna/driver/c/sednamt.def +21 -0
- data/vendor/sedna/driver/c/sp_defs.h +186 -0
- data/vendor/sedna/kernel/common/FastXptrHash.cpp +101 -0
- data/vendor/sedna/kernel/common/IntHash.h +314 -0
- data/vendor/sedna/kernel/common/IntList.h +224 -0
- data/vendor/sedna/kernel/common/Makefile +30 -0
- data/vendor/sedna/kernel/common/SSMMsg.cpp +459 -0
- data/vendor/sedna/kernel/common/SSMMsg.h +142 -0
- data/vendor/sedna/kernel/common/XptrHash.h +435 -0
- data/vendor/sedna/kernel/common/argtable.c +972 -0
- data/vendor/sedna/kernel/common/argtable.h +896 -0
- data/vendor/sedna/kernel/common/base.cpp +339 -0
- data/vendor/sedna/kernel/common/base.h +226 -0
- data/vendor/sedna/kernel/common/bit_set.cpp +157 -0
- data/vendor/sedna/kernel/common/bit_set.h +55 -0
- data/vendor/sedna/kernel/common/commutil.h +67 -0
- data/vendor/sedna/kernel/common/config.h +62 -0
- data/vendor/sedna/kernel/common/counted_ptr.h +74 -0
- data/vendor/sedna/kernel/common/errdbg/ErrorCodes.java +1056 -0
- data/vendor/sedna/kernel/common/errdbg/Makefile +34 -0
- data/vendor/sedna/kernel/common/errdbg/assert.c +133 -0
- data/vendor/sedna/kernel/common/errdbg/d_printf.c +150 -0
- data/vendor/sedna/kernel/common/errdbg/d_printf.h +91 -0
- data/vendor/sedna/kernel/common/errdbg/error.codes +1743 -0
- data/vendor/sedna/kernel/common/errdbg/error_codes.c +531 -0
- data/vendor/sedna/kernel/common/errdbg/error_codes.h +549 -0
- data/vendor/sedna/kernel/common/errdbg/error_codes_scm.scm +527 -0
- data/vendor/sedna/kernel/common/errdbg/event_log.c +956 -0
- data/vendor/sedna/kernel/common/errdbg/event_log.h +226 -0
- data/vendor/sedna/kernel/common/errdbg/exceptions.cpp +155 -0
- data/vendor/sedna/kernel/common/errdbg/exceptions.h +559 -0
- data/vendor/sedna/kernel/common/errdbg/gen_error_codes +0 -0
- data/vendor/sedna/kernel/common/errdbg/gen_error_codes.c +345 -0
- data/vendor/sedna/kernel/common/gmm.cpp +192 -0
- data/vendor/sedna/kernel/common/gmm.h +29 -0
- data/vendor/sedna/kernel/common/ipc_ops.cpp +435 -0
- data/vendor/sedna/kernel/common/ipc_ops.h +51 -0
- data/vendor/sedna/kernel/common/lfsGlobals.h +12 -0
- data/vendor/sedna/kernel/common/lm_base.h +90 -0
- data/vendor/sedna/kernel/common/mmgr/Makefile +11 -0
- data/vendor/sedna/kernel/common/mmgr/aset.c +1185 -0
- data/vendor/sedna/kernel/common/mmgr/mcxt.c +741 -0
- data/vendor/sedna/kernel/common/mmgr/memnodes.h +70 -0
- data/vendor/sedna/kernel/common/mmgr/memutils.h +145 -0
- data/vendor/sedna/kernel/common/mmgr/se_alloc.h +321 -0
- data/vendor/sedna/kernel/common/mmgr/track.c +214 -0
- data/vendor/sedna/kernel/common/pping.cpp +672 -0
- data/vendor/sedna/kernel/common/pping.h +119 -0
- data/vendor/sedna/kernel/common/rcv_test.cpp +273 -0
- data/vendor/sedna/kernel/common/rcv_test.h +19 -0
- data/vendor/sedna/kernel/common/sedna.c +128 -0
- data/vendor/sedna/kernel/common/sedna.h +49 -0
- data/vendor/sedna/kernel/common/sedna_ef.h +52 -0
- data/vendor/sedna/kernel/common/sm_vmm_data.h +144 -0
- data/vendor/sedna/kernel/common/sp.c +93 -0
- data/vendor/sedna/kernel/common/sp.h +36 -0
- data/vendor/sedna/kernel/common/st/Makefile +20 -0
- data/vendor/sedna/kernel/common/st/os_linux/stacktrace.c +213 -0
- data/vendor/sedna/kernel/common/st/os_nt/stacktrace.c +338 -0
- data/vendor/sedna/kernel/common/st/os_other/stacktrace.c +39 -0
- data/vendor/sedna/kernel/common/st/stacktrace.h +72 -0
- data/vendor/sedna/kernel/common/st/stacktrfmt.c +64 -0
- data/vendor/sedna/kernel/common/tr_debug.cpp +112 -0
- data/vendor/sedna/kernel/common/tr_debug.h +22 -0
- data/vendor/sedna/kernel/common/u/Makefile +14 -0
- data/vendor/sedna/kernel/common/u/u.c +268 -0
- data/vendor/sedna/kernel/common/u/u.h +715 -0
- data/vendor/sedna/kernel/common/u/uatomic.h +12 -0
- data/vendor/sedna/kernel/common/u/udl.h +31 -0
- data/vendor/sedna/kernel/common/u/uevent.c +406 -0
- data/vendor/sedna/kernel/common/u/uevent.h +71 -0
- data/vendor/sedna/kernel/common/u/ugnames.cpp +330 -0
- data/vendor/sedna/kernel/common/u/ugnames.h +134 -0
- data/vendor/sedna/kernel/common/u/uhash_map.h +77 -0
- data/vendor/sedna/kernel/common/u/uhdd.c +1018 -0
- data/vendor/sedna/kernel/common/u/uhdd.h +206 -0
- data/vendor/sedna/kernel/common/u/ummap.cpp +268 -0
- data/vendor/sedna/kernel/common/u/ummap.h +60 -0
- data/vendor/sedna/kernel/common/u/umutex.c +145 -0
- data/vendor/sedna/kernel/common/u/umutex.h +65 -0
- data/vendor/sedna/kernel/common/u/upipe.cpp +244 -0
- data/vendor/sedna/kernel/common/u/upipe.h +74 -0
- data/vendor/sedna/kernel/common/u/uprocess.c +767 -0
- data/vendor/sedna/kernel/common/u/uprocess.h +91 -0
- data/vendor/sedna/kernel/common/u/usafesync.h +41 -0
- data/vendor/sedna/kernel/common/u/usecurity.c +150 -0
- data/vendor/sedna/kernel/common/u/usecurity.h +55 -0
- data/vendor/sedna/kernel/common/u/usem.c +891 -0
- data/vendor/sedna/kernel/common/u/usem.h +83 -0
- data/vendor/sedna/kernel/common/u/ushm.c +222 -0
- data/vendor/sedna/kernel/common/u/ushm.h +46 -0
- data/vendor/sedna/kernel/common/u/usocket.c +541 -0
- data/vendor/sedna/kernel/common/u/usocket.h +118 -0
- data/vendor/sedna/kernel/common/u/usystem.c +57 -0
- data/vendor/sedna/kernel/common/u/usystem.h +46 -0
- data/vendor/sedna/kernel/common/u/uthread.c +259 -0
- data/vendor/sedna/kernel/common/u/uthread.h +95 -0
- data/vendor/sedna/kernel/common/u/utime.c +65 -0
- data/vendor/sedna/kernel/common/u/utime.h +40 -0
- data/vendor/sedna/kernel/common/u/uutils.c +142 -0
- data/vendor/sedna/kernel/common/u/uutils.h +65 -0
- data/vendor/sedna/kernel/common/ugc.cpp +156 -0
- data/vendor/sedna/kernel/common/ugc.h +15 -0
- data/vendor/sedna/kernel/common/utils.cpp +156 -0
- data/vendor/sedna/kernel/common/utils.h +133 -0
- data/vendor/sedna/kernel/common/version.c +16 -0
- data/vendor/sedna/kernel/common/version.h +21 -0
- data/vendor/sedna/kernel/common/wustructures.h +18 -0
- data/vendor/sedna/kernel/common/wutypes.h +34 -0
- data/vendor/sedna/kernel/common/xptr.cpp +17 -0
- data/vendor/sedna/kernel/common/xptr.h +211 -0
- data/vendor/sedna/ver +1 -0
- metadata +142 -14
data/{CHANGES → CHANGES.rdoc}
RENAMED
@@ -1,3 +1,12 @@
|
|
1
|
+
=== 0.6.0
|
2
|
+
|
3
|
+
* Released on May 29th, 2010.
|
4
|
+
* Bundled Sedna driver from version 3.3.55 (protocol version 3.0). The bundled
|
5
|
+
driver is now used by default to simplify installation.
|
6
|
+
* Fixed build errors on Mac OS X 10.6.
|
7
|
+
* Unit test compatibility with Sedna 3.3.
|
8
|
+
* Fully tested in Ruby 1.8.6+ (including 1.9.2-preview2) and Rubinius 1.0.
|
9
|
+
|
1
10
|
=== 0.5.1
|
2
11
|
|
3
12
|
* Released on January 23th, 2010.
|
data/{README → README.rdoc}
RENAMED
@@ -1,18 +1,18 @@
|
|
1
|
-
=
|
1
|
+
= S<i></i>edna XML database client library
|
2
2
|
|
3
3
|
This library provides a Ruby client for <i>Sedna</i>, an open-source, native XML
|
4
4
|
database system. The client is a Ruby extension that uses the official C
|
5
5
|
driver that is shipped as part of the S<i></i>edna distribution.
|
6
6
|
|
7
|
-
|
7
|
+
S<i></i>edna provides a full range of core database services -- persistent storage,
|
8
8
|
ACID transactions, security, indices, hot backup. Flexible XML processing
|
9
9
|
facilities include W3C XQuery implementation, tight integration of XQuery with
|
10
10
|
full-text search facilities and a node-level update language.
|
11
11
|
|
12
|
-
For more information about the
|
12
|
+
For more information about the S<i></i>edna XML database system, see the project page
|
13
13
|
at http://modis.ispras.ru/sedna
|
14
14
|
|
15
|
-
|
15
|
+
== About the client library
|
16
16
|
|
17
17
|
Author: Rolf Timmermans (r.timmermans <i>at</i> voormedia.com)
|
18
18
|
|
@@ -30,40 +30,38 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
30
30
|
See the License for the specific language governing permissions and
|
31
31
|
limitations under the License.
|
32
32
|
|
33
|
-
|
33
|
+
== Current version
|
34
34
|
|
35
|
-
The current version of this library is 0.
|
36
|
-
For a complete overview all recent and previous changes, see CHANGES.
|
35
|
+
The current version of this library is 0.6.0. This is a <b>stable release</b>.
|
36
|
+
For a complete overview all recent and previous changes, see CHANGES.rdoc.
|
37
37
|
|
38
|
-
|
38
|
+
== Requirements
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
distribution of \Sedna. When installing, choose either <tt>/usr/local/sedna</tt> or
|
43
|
-
<tt>/opt/sedna</tt> as target locations.
|
40
|
+
The S<i></i>edna client library ships with a copy of the official C driver, which
|
41
|
+
will be built for your platform automatically when you install it.
|
44
42
|
|
45
|
-
The library has been tested with Ruby 1.8.
|
43
|
+
The library has been tested with Ruby 1.8.6 and above, including Ruby 1.9.1 and
|
44
|
+
Ruby 1.9.2.
|
46
45
|
|
47
|
-
|
46
|
+
== Installation
|
48
47
|
|
49
|
-
|
50
|
-
library as a rubygem.
|
48
|
+
Install the Ruby client library as a gem.
|
51
49
|
|
52
50
|
% gem install sedna
|
53
51
|
|
54
|
-
If
|
55
|
-
|
56
|
-
|
52
|
+
If you do not wish to use the bundled driver, you have the option to use a
|
53
|
+
version installed on your system. You can specify in which location the
|
54
|
+
library and header files located by adding the <tt>--with-sedna-dir</tt>
|
55
|
+
option when installing.
|
57
56
|
|
58
|
-
% gem install sedna -- --with-sedna-
|
57
|
+
% gem install sedna -- --with-sedna-dir=/path/to/sedna
|
59
58
|
|
60
|
-
|
59
|
+
== Usage
|
61
60
|
|
62
|
-
After installation
|
63
|
-
using it.
|
61
|
+
After installation, +require+ the sedna library in order to start using it.
|
64
62
|
|
65
|
-
require
|
66
|
-
require
|
63
|
+
require "rubygems"
|
64
|
+
require "sedna"
|
67
65
|
|
68
66
|
To start querying a database, create a new connection with the Sedna.connect
|
69
67
|
method. When a block is given, the Sedna connection object will be returned
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2008
|
1
|
+
# Copyright 2008-2010 Voormedia B.V.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -35,16 +35,18 @@ end
|
|
35
35
|
|
36
36
|
desc "Build the Ruby extension"
|
37
37
|
task :build do
|
38
|
-
Dir.chdir "ext"
|
38
|
+
Dir.chdir "ext/sedna"
|
39
39
|
ruby "extconf.rb"
|
40
40
|
sh "make"
|
41
|
-
Dir.chdir "
|
41
|
+
Dir.chdir "../.."
|
42
42
|
end
|
43
43
|
|
44
44
|
desc "Remove build products"
|
45
45
|
task :clobber_build do
|
46
|
-
sh "rm -f ext
|
47
|
-
sh "rm -f ext
|
46
|
+
sh "rm -f ext/**/*.{so,o,log,bundle}"
|
47
|
+
sh "rm -f ext/**/Makefile"
|
48
|
+
sh "rm -rf ext/**/conftest.*"
|
49
|
+
system "cd vendor/sedna/driver/c && make clean"
|
48
50
|
end
|
49
51
|
|
50
52
|
desc "Force a rebuild of the Ruby extension"
|
@@ -57,7 +59,7 @@ end
|
|
57
59
|
|
58
60
|
gem_spec = Gem::Specification.new do |s|
|
59
61
|
s.name = "sedna"
|
60
|
-
s.version = "0.
|
62
|
+
s.version = "0.6.0"
|
61
63
|
|
62
64
|
s.summary = "Sedna XML DBMS client library."
|
63
65
|
s.description = %{Ruby extension that provides a client library for the Sedna XML DBMS, making use of the official C driver of the Sedna project.}
|
@@ -67,13 +69,14 @@ gem_spec = Gem::Specification.new do |s|
|
|
67
69
|
s.homepage = "http://sedna.rubyforge.org/"
|
68
70
|
s.rubyforge_project = "sedna"
|
69
71
|
|
70
|
-
s.extensions << "ext/extconf.rb"
|
71
|
-
s.files = FileList["Rakefile", "ext
|
72
|
+
s.extensions << "ext/sedna/extconf.rb"
|
73
|
+
s.files = (FileList["Rakefile", "ext/**/extconf.rb", "ext/**/*.c", "test/**/*.rb"] + FileList["vendor/sedna/**/*"] -
|
74
|
+
FileList["vendor/sedna/**/{*.exp,*.so,*.o,*.a,*.bb,*.bbg,*.da,*.map,*.pdb,vc*.idb,*.SUP,*.d,*.d.*,generated}"]).to_a
|
72
75
|
s.require_path = "lib"
|
73
76
|
|
74
77
|
s.has_rdoc = true
|
75
78
|
s.extra_rdoc_files = RDOC_FILES
|
76
|
-
s.rdoc_options << "--title" << RDOC_TITLE << "--main" << "README"
|
79
|
+
s.rdoc_options << "--title" << RDOC_TITLE << "--main" << "README.rdoc"
|
77
80
|
|
78
81
|
s.test_files = FileList["test/**/*_test.rb"].to_a
|
79
82
|
end
|
@@ -90,3 +93,23 @@ Rake::RDocTask.new do |rdoc|
|
|
90
93
|
rdoc.rdoc_files.include *RDOC_FILES
|
91
94
|
rdoc.main = "README"
|
92
95
|
end
|
96
|
+
|
97
|
+
namespace :driver do
|
98
|
+
task :update do
|
99
|
+
exit if ENV["SOURCE"].nil?
|
100
|
+
source = File.expand_path(File.join(File.dirname(__FILE__), ENV["SOURCE"]))
|
101
|
+
target = "vendor/sedna"
|
102
|
+
%x(rm -rf #{target} && mkdir -p #{target}/driver && mkdir -p #{target}/kernel)
|
103
|
+
|
104
|
+
%x(cp -r #{source}/{AUTHORS,COPYRIGHT,LICENSE} #{target})
|
105
|
+
%x(cp -r #{source}/{depend.sed,ver,Makefile.include,Makefile.platform} #{target})
|
106
|
+
%x(cp -r #{source}/driver/c #{target}/driver/c)
|
107
|
+
%x(cp -r #{source}/kernel/common #{target}/kernel/common)
|
108
|
+
|
109
|
+
u_h = File.read("#{target}/kernel/common/u/u.h")
|
110
|
+
u_h.gsub!("#include <ucontext.h>", "")
|
111
|
+
File.open("#{target}/kernel/common/u/u.h", "w") do |f|
|
112
|
+
f.write u_h
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2008
|
1
|
+
# Copyright 2008-2010 Voormedia B.V.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -19,25 +19,50 @@
|
|
19
19
|
|
20
20
|
require "mkmf"
|
21
21
|
|
22
|
+
# Fail for old Rubies.
|
22
23
|
if RUBY_VERSION < "1.8"
|
23
24
|
puts "This library requires ruby 1.8."
|
24
25
|
exit 1
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
def set_arch(arch)
|
29
|
+
flags = "-arch #{arch}"
|
30
|
+
$CFLAGS.gsub!(/-arch\s+\S+ /, "")
|
31
|
+
$LDFLAGS.gsub!(/-arch\s+\S+ /, "")
|
32
|
+
CONFIG['LDSHARED'].gsub!(/-arch\s+\S+ /, "")
|
33
|
+
|
34
|
+
$CFLAGS << " " << flags
|
35
|
+
$LDFLAGS << " " << flags
|
36
|
+
CONFIG["LDSHARED"] << " " << flags
|
37
|
+
end
|
38
|
+
|
39
|
+
DRIVER = "/driver/c"
|
31
40
|
|
32
|
-
# If user specified directories.
|
33
41
|
idir, ldir = dir_config "sedna", nil, nil
|
34
42
|
if idir.nil? or ldir.nil?
|
35
|
-
|
43
|
+
driver_dir = File.expand_path("#{File.dirname(__FILE__)}/../../vendor/sedna/#{DRIVER}")
|
44
|
+
|
45
|
+
# Compile bundled driver.
|
46
|
+
system "cd #{driver_dir} && make clean && make"
|
47
|
+
|
48
|
+
# Link to bundled driver.
|
49
|
+
idir = ldir = [driver_dir]
|
36
50
|
else
|
37
|
-
|
51
|
+
# Use user-specified driver.
|
52
|
+
ldir = File.expand_path(ldir.sub("/lib", DRIVER)) unless ldir.nil?
|
38
53
|
idir = [File.expand_path(idir), ldir] unless idir.nil?
|
39
54
|
end
|
40
55
|
|
56
|
+
# Fix multiple arch flags on Mac OS X.
|
57
|
+
if RUBY_PLATFORM.include?("darwin")
|
58
|
+
ldir.each do |libdir|
|
59
|
+
if File.exists?("#{libdir}/libsedna.a") and %x(which lipo && lipo -info #{libdir}/libsedna.a) =~ /architecture: (.+)$/
|
60
|
+
set_arch($1) unless $1 == "i386"
|
61
|
+
break
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
41
66
|
if not find_library "sedna", "SEconnect", *ldir
|
42
67
|
$stderr.write %{
|
43
68
|
==============================================================================
|
@@ -74,19 +99,6 @@ Could not find header file(s) for libsedna.
|
|
74
99
|
exit 3
|
75
100
|
end
|
76
101
|
|
77
|
-
if CONFIG["arch"] =~ /x86_64/i and File.exist?(f = $LIBPATH.first + File::Separator + "libsedna.a")
|
78
|
-
if system "/usr/bin/objdump --reloc \"#{f}\" 2>/dev/null | grep R_X86_64_32S >/dev/null && echo"
|
79
|
-
$stderr.write %{==============================================================================
|
80
|
-
Library libsedna.a was statically compiled for a 64-bit platform as position-
|
81
|
-
dependent code. It will not be possible to create a Ruby shared library with
|
82
|
-
this Sedna library. Recompile the library as position-independent code by
|
83
|
-
passing the -fPIC option to gcc.
|
84
|
-
==============================================================================
|
85
|
-
}
|
86
|
-
exit 4
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
102
|
have_func "rb_thread_blocking_region"
|
91
103
|
have_func "rb_mutex_synchronize"
|
92
104
|
have_func "rb_enc_str_buf_cat"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright 2008
|
2
|
+
* Copyright 2008-2010 Voormedia B.V.
|
3
3
|
*
|
4
4
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
* you may not use this file except in compliance with the License.
|
@@ -70,17 +70,17 @@ typedef struct SednaConnection SC;
|
|
70
70
|
// Define a struct for database queries.
|
71
71
|
struct SednaQuery {
|
72
72
|
void *conn;
|
73
|
-
|
73
|
+
char *query;
|
74
74
|
};
|
75
75
|
typedef struct SednaQuery SQ;
|
76
76
|
|
77
77
|
// Define a struct for database connection arguments.
|
78
78
|
struct SednaConnArgs {
|
79
79
|
void *conn;
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
80
|
+
char *host;
|
81
|
+
char *db;
|
82
|
+
char *user;
|
83
|
+
char *pw;
|
84
84
|
};
|
85
85
|
typedef struct SednaConnArgs SCA;
|
86
86
|
|
@@ -153,34 +153,34 @@ static void sedna_err(SC *conn, int res)
|
|
153
153
|
// SEgetLastErrorCode(conn) is useless, because it varies if the order of
|
154
154
|
// errors changes. The actual code is a string which is defined in error_codes.h
|
155
155
|
// in the Sedna source code.
|
156
|
-
|
156
|
+
code = strstr(msg, "ERROR ");
|
157
157
|
err = strstr(msg, "\n");
|
158
158
|
details = strstr(err, "\nDetails: ");
|
159
159
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
160
|
+
if(code != NULL) {
|
161
|
+
code += 6; // Advance beyond "ERROR "
|
162
|
+
if((p = strstr(code, "\n")) != NULL) strncpy(p, "\0", 1);
|
163
|
+
}
|
164
164
|
|
165
165
|
if(err != NULL) {
|
166
166
|
err++; // Advance beyond "\n"
|
167
167
|
if((p = strstr(err, "\n")) != NULL) strncpy(p, "\0", 1);
|
168
168
|
} else {
|
169
|
-
err = "Unknown error.";
|
169
|
+
err = strdup("Unknown error.");
|
170
170
|
}
|
171
171
|
|
172
172
|
if(details != NULL) {
|
173
173
|
details += 10; // Advance beyond "\nDetails: "
|
174
174
|
while((p = strstr(details, "\n")) != NULL) strncpy(p, " ", 1);
|
175
|
-
|
175
|
+
snprintf(exc_message, BUFSIZ, "%s (%s)", err, details);
|
176
176
|
} else {
|
177
|
-
|
177
|
+
snprintf(exc_message, BUFSIZ, "%s", err);
|
178
|
+
}
|
179
|
+
exc = rb_exc_new2(exc_class, exc_message);
|
180
|
+
if(code != NULL) {
|
181
|
+
rb_iv_set(exc, IV_EXC_CODE, rb_str_new2(code));
|
178
182
|
}
|
179
|
-
|
180
|
-
if(code != NULL) {
|
181
|
-
rb_iv_set(exc, IV_EXC_CODE, rb_str_new2(code));
|
182
|
-
}
|
183
|
-
rb_exc_raise(exc);
|
183
|
+
rb_exc_raise(exc);
|
184
184
|
}
|
185
185
|
|
186
186
|
// Retrieve the SednaConnection struct from the Ruby Sedna object obj.
|
@@ -401,7 +401,8 @@ static VALUE cSedna_s_new(VALUE klass)
|
|
401
401
|
*/
|
402
402
|
static VALUE cSedna_initialize(VALUE self, VALUE options)
|
403
403
|
{
|
404
|
-
VALUE host_k, db_k, user_k, pw_k,
|
404
|
+
VALUE host_k, db_k, user_k, pw_k,
|
405
|
+
host_v, db_v, user_v, pw_v;
|
405
406
|
char *host, *db, *user, *pw;
|
406
407
|
|
407
408
|
// Ensure the argument is a Hash.
|
@@ -409,21 +410,21 @@ static VALUE cSedna_initialize(VALUE self, VALUE options)
|
|
409
410
|
|
410
411
|
// Store the symbols of the valid hash keys.
|
411
412
|
host_k = ID2SYM(rb_intern("host"));
|
412
|
-
db_k
|
413
|
+
db_k = ID2SYM(rb_intern("database"));
|
413
414
|
user_k = ID2SYM(rb_intern("username"));
|
414
|
-
pw_k
|
415
|
+
pw_k = ID2SYM(rb_intern("password"));
|
415
416
|
|
416
417
|
// Get the connection details or set them to the default values if not given.
|
417
|
-
if(NIL_P(host_v = rb_hash_aref(options, host_k))) host = DEFAULT_HOST; else host =
|
418
|
-
if(NIL_P(db_v
|
419
|
-
if(NIL_P(user_v = rb_hash_aref(options, user_k))) user = DEFAULT_USER; else user =
|
420
|
-
if(NIL_P(pw_v
|
418
|
+
if(NIL_P(host_v = rb_hash_aref(options, host_k))) host = strdup(DEFAULT_HOST); else host = StringValuePtr(host_v);
|
419
|
+
if(NIL_P(db_v = rb_hash_aref(options, db_k ))) db = strdup(DEFAULT_DB); else db = StringValuePtr(db_v);
|
420
|
+
if(NIL_P(user_v = rb_hash_aref(options, user_k))) user = strdup(DEFAULT_USER); else user = StringValuePtr(user_v);
|
421
|
+
if(NIL_P(pw_v = rb_hash_aref(options, pw_k ))) pw = strdup(DEFAULT_PW); else pw = StringValuePtr(pw_v);
|
421
422
|
|
422
423
|
// Save all connection details to instance variables.
|
423
424
|
rb_iv_set(self, IV_HOST, rb_str_new2(host));
|
424
|
-
rb_iv_set(self, IV_DB,
|
425
|
+
rb_iv_set(self, IV_DB, rb_str_new2(db));
|
425
426
|
rb_iv_set(self, IV_USER, rb_str_new2(user));
|
426
|
-
rb_iv_set(self, IV_PW,
|
427
|
+
rb_iv_set(self, IV_PW, rb_str_new2(pw));
|
427
428
|
|
428
429
|
#ifdef NON_BLOCKING
|
429
430
|
// Create a mutex if this build supports non-blocking queries.
|
@@ -474,13 +475,19 @@ static VALUE cSedna_close(VALUE self)
|
|
474
475
|
*/
|
475
476
|
static VALUE cSedna_reset(VALUE self)
|
476
477
|
{
|
478
|
+
VALUE host_v, db_v, user_v, pw_v;
|
477
479
|
SC *conn = sedna_struct(self);
|
478
480
|
|
479
481
|
// First ensure the current connection is closed.
|
480
482
|
sedna_close(conn);
|
481
483
|
|
482
484
|
// Retrieve stored connection details.
|
483
|
-
|
485
|
+
host_v = rb_iv_get(self, IV_HOST);
|
486
|
+
db_v = rb_iv_get(self, IV_DB);
|
487
|
+
user_v = rb_iv_get(self, IV_USER);
|
488
|
+
pw_v = rb_iv_get(self, IV_PW);
|
489
|
+
|
490
|
+
SCA c = { conn, StringValuePtr(host_v), StringValuePtr(db_v), StringValuePtr(user_v), StringValuePtr(pw_v) };
|
484
491
|
|
485
492
|
// Connect to the database.
|
486
493
|
sedna_connect(self, &c);
|
@@ -646,7 +653,7 @@ static VALUE cSedna_execute(VALUE self, VALUE query)
|
|
646
653
|
SC *conn = sedna_struct(self);
|
647
654
|
|
648
655
|
// Prepare query arguments.
|
649
|
-
SQ q = { conn,
|
656
|
+
SQ q = { conn, StringValuePtr(query) };
|
650
657
|
|
651
658
|
// Verify that the connection is OK.
|
652
659
|
if(SEconnectionStatus(conn) != SEDNA_CONNECTION_OK) rb_raise(cSednaConnError, "Connection is closed.");
|
@@ -709,14 +716,14 @@ static VALUE cSedna_load_document(int argc, VALUE *argv, VALUE self)
|
|
709
716
|
|
710
717
|
// 2 mandatory arguments, 1 optional.
|
711
718
|
rb_scan_args(argc, argv, "21", &document, &doc_name, &col_name);
|
712
|
-
doc_name_c =
|
713
|
-
col_name_c = NIL_P(col_name) ? NULL :
|
719
|
+
doc_name_c = StringValuePtr(doc_name);
|
720
|
+
col_name_c = NIL_P(col_name) ? NULL : StringValuePtr(col_name);
|
714
721
|
|
715
722
|
if(TYPE(document) == T_FILE) {
|
716
723
|
// If the document is an IO object...
|
717
724
|
while(!NIL_P(buf = rb_funcall(document, rb_intern("read"), 1, INT2NUM(LOAD_BUF_LEN)))) {
|
718
725
|
// ...read from it until we reach EOF and load the data.
|
719
|
-
res = SEloadData(conn,
|
726
|
+
res = SEloadData(conn, StringValuePtr(buf), RSTRING_LEN(buf), doc_name_c, col_name_c);
|
720
727
|
VERIFY_RES(SEDNA_DATA_CHUNK_LOADED, res, conn);
|
721
728
|
}
|
722
729
|
|
@@ -730,7 +737,7 @@ static VALUE cSedna_load_document(int argc, VALUE *argv, VALUE self)
|
|
730
737
|
if(RSTRING_LEN(document) == 0) rb_raise(cSednaException, "Document is empty.");
|
731
738
|
|
732
739
|
// Load the data.
|
733
|
-
res = SEloadData(conn,
|
740
|
+
res = SEloadData(conn, StringValuePtr(document), RSTRING_LEN(document), doc_name_c, col_name_c);
|
734
741
|
VERIFY_RES(SEDNA_DATA_CHUNK_LOADED, res, conn);
|
735
742
|
}
|
736
743
|
|
@@ -1018,13 +1025,14 @@ void Init_sedna()
|
|
1018
1025
|
* Raised when a transaction could not be committed.
|
1019
1026
|
*/
|
1020
1027
|
cSednaException = rb_define_class_under(cSedna, "Exception", rb_eStandardError);
|
1028
|
+
|
1021
1029
|
/*
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1030
|
+
* Returns the error code associated with this exception. This code is a string
|
1031
|
+
* that can be used to accurately identify which error has occurred. Some
|
1032
|
+
* errors are thrown by the Ruby client rather than the C bindings. In these
|
1033
|
+
* cases, the error code is +nil+.
|
1034
|
+
*/
|
1035
|
+
rb_define_attr(cSednaException, "code", 1, 0);
|
1028
1036
|
|
1029
1037
|
/*
|
1030
1038
|
* Sedna::AuthenticationError is a subclass of Sedna::Exception, and is
|
data/test/sedna_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
# Copyright 2008
|
4
|
+
# Copyright 2008-2010 Voormedia B.V.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -21,7 +21,7 @@
|
|
21
21
|
# This file contains the test suite to verify the client library is working
|
22
22
|
# correctly.
|
23
23
|
|
24
|
-
$:.unshift(File.dirname(__FILE__) + '/../ext')
|
24
|
+
$:.unshift(File.dirname(__FILE__) + '/../ext/sedna')
|
25
25
|
|
26
26
|
require 'test/unit'
|
27
27
|
require 'sedna'
|
@@ -345,7 +345,7 @@ class SednaTest < Test::Unit::TestCase
|
|
345
345
|
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
346
346
|
begin
|
347
347
|
thread = Thread.new do
|
348
|
-
@@sedna.execute "create document '#{__method__}'"
|
348
|
+
@@sedna.execute "create document '#{__method__}'" rescue nil
|
349
349
|
end
|
350
350
|
thread.raise
|
351
351
|
thread.join
|
@@ -384,7 +384,7 @@ class SednaTest < Test::Unit::TestCase
|
|
384
384
|
|
385
385
|
test "load_document should create document in given collection" do
|
386
386
|
col = "test_collection"
|
387
|
-
doc = "<?xml version=\"1.0\" standalone=\"yes\"
|
387
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<document>\n <node/>\n</document>"
|
388
388
|
@@sedna.execute "create collection '#{col}'" rescue nil
|
389
389
|
@@sedna.execute "drop document '#{__method__}' in collection '#{col}'" rescue nil
|
390
390
|
@@sedna.load_document doc, __method__.to_s, col
|
@@ -394,7 +394,7 @@ class SednaTest < Test::Unit::TestCase
|
|
394
394
|
end
|
395
395
|
|
396
396
|
test "load_document should create standalone document if collection is unspecified" do
|
397
|
-
doc = "<?xml version=\"1.0\" standalone=\"yes\"
|
397
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<document>\n <node/>\n</document>"
|
398
398
|
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
399
399
|
@@sedna.load_document doc, __method__.to_s
|
400
400
|
assert_equal doc, @@sedna.execute("doc('#{__method__}')").first
|
@@ -402,7 +402,7 @@ class SednaTest < Test::Unit::TestCase
|
|
402
402
|
end
|
403
403
|
|
404
404
|
test "load_document should create standalone document if collection is nil" do
|
405
|
-
doc = "<?xml version=\"1.0\" standalone=\"yes\"
|
405
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<document>\n <node/>\n</document>"
|
406
406
|
@@sedna.execute "drop document '#{__method__}'" rescue nil
|
407
407
|
@@sedna.load_document doc, __method__.to_s, nil
|
408
408
|
assert_equal doc, @@sedna.execute("doc('#{__method__}')").first
|
@@ -448,8 +448,8 @@ class SednaTest < Test::Unit::TestCase
|
|
448
448
|
end
|
449
449
|
end
|
450
450
|
|
451
|
-
test "load_document should create document if given document is
|
452
|
-
doc = "<?xml version=\"1.0\" standalone=\"yes\"
|
451
|
+
test "load_document should create document if given document is io object" do
|
452
|
+
doc = "<?xml version=\"1.0\" standalone=\"yes\"?>\n<document>" << ("\n <some_very_often_repeated_node/>" * 800) << "\n</document>"
|
453
453
|
p_out, p_in = IO.pipe
|
454
454
|
p_in.write doc
|
455
455
|
p_in.close
|
@@ -696,7 +696,7 @@ class SednaTest < Test::Unit::TestCase
|
|
696
696
|
end
|
697
697
|
rescue Sedna::Exception => exc
|
698
698
|
end
|
699
|
-
|
699
|
+
assert_match /It is a dynamic error if evaluation of an expression relies on some part of the dynamic context that has not been assigned a value/, exc.message
|
700
700
|
end
|
701
701
|
|
702
702
|
test "transaction should raise Sedna::TransactionError if called from different threads on same connection" do
|