ruby-plsql 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Package" do
4
+ before(:all) do
5
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
6
+ plsql.connection.exec <<-EOS
7
+ CREATE OR REPLACE PACKAGE test_package IS
8
+ FUNCTION test_uppercase ( p_string VARCHAR2 )
9
+ RETURN VARCHAR2;
10
+ END;
11
+ EOS
12
+ plsql.connection.exec <<-EOS
13
+ CREATE OR REPLACE PACKAGE BODY test_package IS
14
+ FUNCTION test_uppercase ( p_string VARCHAR2 )
15
+ RETURN VARCHAR2
16
+ IS
17
+ BEGIN
18
+ RETURN UPPER(p_string);
19
+ END test_uppercase;
20
+ END;
21
+ EOS
22
+
23
+ end
24
+
25
+ after(:all) do
26
+ plsql.logoff
27
+ end
28
+
29
+ before(:each) do
30
+ end
31
+
32
+ it "should find existing package" do
33
+ PLSQL::Package.find(plsql, :test_package).should_not be_nil
34
+ end
35
+
36
+ it "should not find nonexisting package" do
37
+ PLSQL::Package.find(plsql, :qwerty123456).should be_nil
38
+ end
39
+
40
+ it "should find existing package in schema" do
41
+ plsql.test_package.class.should == PLSQL::Package
42
+ end
43
+
44
+ it "should execute package function and return correct value" do
45
+ plsql.test_package.test_uppercase('xxx').should == 'XXX'
46
+ end
47
+
48
+ end
@@ -0,0 +1,168 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Procedure with string parameters" do
4
+
5
+ before(:all) do
6
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
7
+ plsql.connection.exec <<-EOS
8
+ CREATE OR REPLACE FUNCTION test_uppercase
9
+ ( p_string VARCHAR2 )
10
+ RETURN VARCHAR2
11
+ IS
12
+ BEGIN
13
+ RETURN UPPER(p_string);
14
+ END test_uppercase;
15
+ EOS
16
+ end
17
+
18
+ after(:all) do
19
+ plsql.logoff
20
+ end
21
+
22
+ it "should find existing procedure" do
23
+ PLSQL::Procedure.find(plsql, :test_uppercase).should_not be_nil
24
+ end
25
+
26
+ it "should not find nonexisting procedure" do
27
+ PLSQL::Procedure.find(plsql, :qwerty123456).should be_nil
28
+ end
29
+
30
+ it "should execute function and return correct value" do
31
+ plsql.test_uppercase('xxx').should == 'XXX'
32
+ end
33
+
34
+ it "should execute function with named parameters and return correct value" do
35
+ plsql.test_uppercase(:p_string => 'xxx').should == 'XXX'
36
+ end
37
+
38
+ it "should raise error if wrong number of arguments is passed" do
39
+ lambda { plsql.test_uppercase('xxx','yyy') }.should raise_error(ArgumentError)
40
+ end
41
+
42
+ it "should raise error if wrong named argument is passed" do
43
+ lambda { plsql.test_uppercase(:p_string2 => 'xxx') }.should raise_error(ArgumentError)
44
+ end
45
+
46
+ it "should execute function with schema name specified" do
47
+ plsql.hr.test_uppercase('xxx').should == 'XXX'
48
+ end
49
+
50
+ end
51
+
52
+ describe "Procedure with numeric parameters" do
53
+
54
+ before(:all) do
55
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
56
+ plsql.connection.exec <<-EOS
57
+ CREATE OR REPLACE FUNCTION test_sum
58
+ ( p_num1 NUMBER, p_num2 NUMBER )
59
+ RETURN NUMBER
60
+ IS
61
+ BEGIN
62
+ RETURN p_num1 + p_num2;
63
+ END test_sum;
64
+ EOS
65
+ end
66
+
67
+ after(:all) do
68
+ plsql.logoff
69
+ end
70
+
71
+ it "should process integer parameters" do
72
+ plsql.test_sum(123,456).should == 579
73
+ end
74
+
75
+ it "should process big integer parameters" do
76
+ plsql.test_sum(123123123123,456456456456).should == 579579579579
77
+ end
78
+
79
+ it "should process float parameters" do
80
+ plsql.test_sum(123.123,456.456).should == 579.579
81
+ end
82
+
83
+ end
84
+
85
+ describe "Procedure with date parameters" do
86
+
87
+ before(:all) do
88
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
89
+ plsql.connection.exec <<-EOS
90
+ CREATE OR REPLACE FUNCTION test_date
91
+ ( p_date DATE )
92
+ RETURN DATE
93
+ IS
94
+ BEGIN
95
+ RETURN p_date + 1;
96
+ END test_date;
97
+ EOS
98
+ end
99
+
100
+ after(:all) do
101
+ plsql.logoff
102
+ end
103
+
104
+ it "should process date parameters" do
105
+ now = DateTime.new(2008,8,12,14,28,0)
106
+ plsql.test_date(now).should == now + 1
107
+ end
108
+
109
+ it "should process old date parameters" do
110
+ now = DateTime.new(1900,1,1,12,0,0)
111
+ plsql.test_date(now).should == now + 1
112
+ end
113
+
114
+ end
115
+
116
+ describe "Procedure with timestamp parameters" do
117
+
118
+ before(:all) do
119
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
120
+ plsql.connection.exec <<-EOS
121
+ CREATE OR REPLACE FUNCTION test_timestamp
122
+ ( p_time TIMESTAMP )
123
+ RETURN TIMESTAMP
124
+ IS
125
+ BEGIN
126
+ RETURN p_time + 1;
127
+ END test_timestamp;
128
+ EOS
129
+ end
130
+
131
+ after(:all) do
132
+ plsql.logoff
133
+ end
134
+
135
+ it "should process timestamp parameters" do
136
+ now = Time.local(2008,8,12,14,28,0)
137
+ plsql.test_timestamp(now).should == now + 60*60*24
138
+ end
139
+
140
+ end
141
+
142
+ describe "Procedure with output parameters" do
143
+ before(:all) do
144
+ plsql.connection = conn = OCI8.new("hr","hr","xe")
145
+ plsql.connection.exec <<-EOS
146
+ CREATE OR REPLACE PROCEDURE test_copy
147
+ ( p_from VARCHAR2, p_to OUT VARCHAR2, p_to_double OUT VARCHAR2 )
148
+ IS
149
+ BEGIN
150
+ p_to := p_from;
151
+ p_to_double := p_from || p_from;
152
+ END test_copy;
153
+ EOS
154
+ end
155
+
156
+ after(:all) do
157
+ plsql.logoff
158
+ end
159
+
160
+ it "should return array with output parameters" do
161
+ plsql.test_copy("abc", nil, nil).should == { :p_to => "abc", :p_to_double => "abcabc" }
162
+ end
163
+
164
+ it "should return array with output parameters when called with named parameters" do
165
+ plsql.test_copy(:p_from => "abc", :p_to => nil, :p_to_double => nil).should == { :p_to => "abc", :p_to_double => "abcabc" }
166
+ end
167
+
168
+ end
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Schema" do
4
+
5
+ it "should create Schema object" do
6
+ plsql.class.should == PLSQL::Schema
7
+ end
8
+
9
+ end
10
+
11
+ describe "Connection" do
12
+
13
+ before(:each) do
14
+ @conn = OCI8.new("hr","hr","xe")
15
+ end
16
+
17
+ after(:each) do
18
+ @conn.logoff
19
+ end
20
+
21
+ it "should connect to test database" do
22
+ plsql.connection = @conn
23
+ plsql.connection.should == @conn
24
+ end
25
+
26
+ it "should connect to test database using connection alias" do
27
+ plsql(:hr).connection = @conn
28
+ plsql(:hr).connection.should == @conn
29
+ end
30
+
31
+ it "should return schema name" do
32
+ plsql.connection = @conn
33
+ plsql.schema_name.should == 'HR'
34
+ end
35
+
36
+ it "should return nil schema name if not connected" do
37
+ plsql(:xxx).schema_name.should == nil
38
+ end
39
+
40
+ end
41
+
42
+ describe "Named Schema" do
43
+ before(:all) do
44
+ @conn = OCI8.new("hr","hr","xe")
45
+ plsql.connection = @conn
46
+ end
47
+
48
+ after(:all) do
49
+ @conn.logoff
50
+ end
51
+
52
+ it "should find existing schema" do
53
+ plsql.hr.class.should == PLSQL::Schema
54
+ end
55
+
56
+ it "should have the same connection as default schema" do
57
+ plsql.hr.connection.should == @conn
58
+ end
59
+
60
+ it "should return schema name" do
61
+ plsql.hr.schema_name.should == 'HR'
62
+ end
63
+
64
+ it "should not find named schema if specified twice" do
65
+ lambda { plsql.hr.hr }.should raise_error(ArgumentError)
66
+ end
67
+
68
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,9 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/ruby_plsql")
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/*"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/*/*_spec.rb']
21
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ Ruby API for PL/SQL
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>Ruby API for PL/SQL</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ruby-plsql"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/ruby-plsql" class="numbers">0.1.0</a>
37
+ </div>
38
+ <h1>&#x2192; &#8216;ruby-plsql&#8217;</h1>
39
+
40
+
41
+ <h2>What</h2>
42
+
43
+
44
+ <p>ruby-plsql gem provides simple Ruby <span class="caps">API</span> for calling Oracle PL/SQL procedures. This gem requires ruby-oci8 for connection to Oracle database.</p>
45
+
46
+
47
+ <h2>Installing</h2>
48
+
49
+
50
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">ruby</span><span class="punct">-</span><span class="ident">plsql</span></pre></p>
51
+
52
+
53
+ <h2>The basics</h2>
54
+
55
+
56
+ <p>Read <a href="http://blog.rayapps.com/2008/03/15/ruby-plsql-gem-simple-ruby-api-for-plsql-procedures/">this blog post first.</a></p>
57
+
58
+
59
+ <p>Usage examples:</p>
60
+
61
+
62
+ <p><pre class='syntax'>
63
+ <span class="ident">require</span> <span class="punct">&quot;</span><span class="string">ruby_plsql</span><span class="punct">&quot;</span>
64
+
65
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">connection</span> <span class="punct">=</span> <span class="constant">OCI8</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(&quot;</span><span class="string">hr</span><span class="punct">&quot;,&quot;</span><span class="string">hr</span><span class="punct">&quot;,&quot;</span><span class="string">xe</span><span class="punct">&quot;)</span>
66
+
67
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
68
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">(</span><span class="symbol">:p_string</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
69
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_copy</span><span class="punct">(&quot;</span><span class="string">abc</span><span class="punct">&quot;,</span> <span class="constant">nil</span><span class="punct">,</span> <span class="constant">nil</span><span class="punct">)</span> <span class="comment"># =&gt; { :p_to =&gt; &quot;abc&quot;, :p_to_double =&gt; &quot;abcabc&quot; }</span>
70
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_copy</span><span class="punct">(</span><span class="symbol">:p_from</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">abc</span><span class="punct">&quot;,</span> <span class="symbol">:p_to</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">,</span> <span class="symbol">:p_to_double</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">)</span>
71
+ <span class="comment"># =&gt; { :p_to =&gt; &quot;abc&quot;, :p_to_double =&gt; &quot;abcabc&quot; }</span>
72
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">hr</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; &quot;XXX&quot;</span>
73
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">test_package</span><span class="punct">.</span><span class="ident">test_uppercase</span><span class="punct">('</span><span class="string">xxx</span><span class="punct">')</span> <span class="comment"># =&gt; 'XXX'</span>
74
+
75
+ <span class="ident">plsql</span><span class="punct">.</span><span class="ident">logoff</span>
76
+ </pre></p>
77
+
78
+
79
+ <p>See more examples in RSpec tests in spec directory of gem.</p>
80
+
81
+
82
+ <h2>Feedback</h2>
83
+
84
+
85
+ <p>Submit your feedback as comments <a href="http://blog.rayapps.com/2008/03/15/ruby-plsql-gem-simple-ruby-api-for-plsql-procedures/">here.</a></p>
86
+
87
+
88
+ <h2>How to submit patches</h2>
89
+
90
+
91
+ <p>Submit bugs and patches to <a href="http://rubyforge.org/tracker/?group_id=5816">RubyForge</a></p>
92
+
93
+
94
+ <p>The trunk repository is <code>http://ruby-plsql.rubyforge.org/svn/</code> for anonymous access.</p>
95
+
96
+
97
+ <h2>License</h2>
98
+
99
+
100
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
101
+ <p class="coda">
102
+ <a href="http://blog.rayapps.com">Raimonds Simanovskis</a>, 16th March 2008<br>
103
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
104
+ </p>
105
+ </div>
106
+
107
+ <!-- insert site tracking codes here, like Google Urchin -->
108
+
109
+ </body>
110
+ </html>