oraora 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -19
- data/bin/oraora +10 -3
- data/lib/oraora/app.rb +8 -2
- data/lib/oraora/help.rb +23 -0
- data/lib/oraora/version.rb +3 -0
- data/oraora.gemspec +14 -9
- metadata +32 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0525a9154b0f168548f8ba6665cd7e7fc06cf53
|
4
|
+
data.tar.gz: 2ad2f0ad89db333bb18a66f7272927174cdbb1cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8af2df15ac1afaa55550df03bd388a1af6aeb50ef356c6a87d19ba28e4565f371f0e122dd3c111c2493f21d0e7f4ed498a46a35a03ea91f209cf3e361d602a1f
|
7
|
+
data.tar.gz: 8c0d894792da339c2074fd07de15968fa502b8d97f28ebe848ee50dc96cf29facf108f8ab79a3e88c789375ec6eeb09b906c219dafad6abc22c6f7a822b04fb4
|
data/README.md
CHANGED
@@ -23,6 +23,8 @@ If you don't have Ruby, check one-click installer for Windows or rvm for Linux.
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
+
### Connecting to database
|
27
|
+
|
26
28
|
Start oraora passing connection string as argument, just like you would connect to SQL*Plus:
|
27
29
|
```
|
28
30
|
$ oraora user/password@DB
|
@@ -94,41 +96,68 @@ Note: `l` is aliased as `ls`. `d` is aliased as `desc` and `describe`.
|
|
94
96
|
|
95
97
|
### SQL
|
96
98
|
|
97
|
-
Any
|
98
|
-
for execution
|
99
|
+
Any command starting with SQL keyword like `SELECT`, `CREATE`, `ALTER`, etc. is treated as SQL and passed to
|
100
|
+
database for execution
|
101
|
+
|
102
|
+
```
|
103
|
+
~ $ SELECT * FROM dual;
|
104
|
+
D
|
105
|
+
-
|
106
|
+
X
|
107
|
+
|
108
|
+
[INFO] 1 row(s) selected
|
109
|
+
```
|
99
110
|
|
100
111
|
### Context-aware SQL
|
101
112
|
|
102
|
-
|
103
|
-
statements will work:
|
113
|
+
Within specific context, you can omit some obvious keywords or identifiers at the beginning of SQL statements.
|
114
|
+
For example, in context of a table following statements will work:
|
104
115
|
```
|
105
|
-
~.SOME_TABLE $ SELECT; # implicit '
|
106
|
-
~.SOME_TABLE $ WHERE col = 1; # implicit 'SELECT * FROM SOME_TABLE
|
107
|
-
~.SOME_TABLE $ SET col = 2; # implicit 'UPDATE SOME_TABLE
|
108
|
-
~.SOME_TABLE $ ADD x INTEGER; # implicit 'ALTER TABLE SOME_TABLE
|
116
|
+
~.SOME_TABLE $ SELECT; # implicit 'SELECT * FROM SOME_TABLE'
|
117
|
+
~.SOME_TABLE $ WHERE col = 1; # implicit 'SELECT * FROM SOME_TABLE WHERE col = 1'
|
118
|
+
~.SOME_TABLE $ SET col = 2; # implicit 'UPDATE SOME_TABLE SET col = 2'
|
119
|
+
~.SOME_TABLE $ ADD x INTEGER; # implicit 'ALTER TABLE SOME_TABLE ADD x INTEGER'
|
109
120
|
```
|
110
121
|
|
111
122
|
Some other examples:
|
112
123
|
```
|
113
|
-
~ $ IDENTIFIED BY oraora; # implicit 'ALTER USER xxx
|
114
|
-
~.SOME_TABLE.COL $ WHERE x = 1; # implicit 'SELECT COL FROM SOME_TABLE
|
124
|
+
~ $ IDENTIFIED BY oraora; # implicit 'ALTER USER xxx IDENTIFIED BY oraora'
|
125
|
+
~.SOME_TABLE.COL $ WHERE x = 1; # implicit 'SELECT COL FROM SOME_TABLE WHERE x = 1'
|
115
126
|
~.SOME_TABLE.COL $ RENAME TO kol; # implicit 'ALTER TABLE SOME_TABLE RENAME COLUMN col TO kol'
|
116
127
|
```
|
117
128
|
|
129
|
+
### Tab completion
|
130
|
+
|
131
|
+
Oraora has bash-style tab completion - hit `<TAB>` to autocomplete current word with SQL keyword or context. If there are
|
132
|
+
multiple possible completions hit `<TAB>` twice to see the list.
|
133
|
+
|
134
|
+
Also there are several quick templates defined. For example, type `S*`, then hit `<TAB>` to expand it into
|
135
|
+
`SELECT * FROM `. Available templates are as follows:
|
136
|
+
|
137
|
+
```
|
138
|
+
s => SELECT
|
139
|
+
s* => SELECT * FROM
|
140
|
+
c* => SELECT COUNT(*) FROM
|
141
|
+
i => INSERT
|
142
|
+
u => UPDATE
|
143
|
+
d => DELETE
|
144
|
+
a => ALTER
|
145
|
+
c => CREATE
|
146
|
+
cr => CREATE OR REPLACE
|
147
|
+
```
|
148
|
+
|
118
149
|
### Su / sudo
|
119
150
|
|
120
151
|
`su` and `sudo` allow to switch to SYS session temporarily or execute a single statement as SYS, similarly to their
|
121
152
|
unix counterparts. If you don't have SYS password for current connection in orafile, you will be prompted for it.
|
122
153
|
```
|
123
|
-
$ oraora
|
124
|
-
~ $
|
125
|
-
ERROR:
|
126
|
-
~ $ sudo GRANT
|
127
|
-
|
128
|
-
~ $
|
129
|
-
|
130
|
-
------------
|
131
|
-
Hello world!
|
154
|
+
$ oraora test@DB
|
155
|
+
~ $ CREATE TABLE test (a INTEGER);
|
156
|
+
[ERROR] ORA-01031: insufficient privileges at 0
|
157
|
+
~ $ sudo GRANT CREATE TABLE TO test;
|
158
|
+
[INFO] 0 row(s) affected
|
159
|
+
~ $ CREATE TABLE test (a INTEGER);
|
160
|
+
[INFO] 0 row(s) affected
|
132
161
|
```
|
133
162
|
|
134
163
|
## Limitations
|
data/bin/oraora
CHANGED
@@ -8,15 +8,19 @@ begin
|
|
8
8
|
# Options
|
9
9
|
options = { log_level: Logger::INFO }
|
10
10
|
|
11
|
-
OptionParser.new do |opts|
|
12
|
-
opts.banner = "Usage: oraora [options]
|
11
|
+
option_parser = OptionParser.new do |opts|
|
12
|
+
opts.banner = "Usage: oraora [options] connection_string"
|
13
13
|
|
14
14
|
opts.on("-l LEVEL", "--log-level=LEVEL", [:debug, :info, :warn, :error], "Set message verbosity (debug, info, warn, error)") do |l|
|
15
15
|
options[:log_level] = Logger.const_get(l.upcase)
|
16
16
|
end
|
17
17
|
|
18
18
|
opts.on("-h", "--help", "Show this message") { |h| puts opts; exit }
|
19
|
-
end
|
19
|
+
end
|
20
|
+
option_parser.parse!
|
21
|
+
|
22
|
+
# Check arguments
|
23
|
+
raise ArgumentError if ARGV.length == 0
|
20
24
|
|
21
25
|
# Logger
|
22
26
|
logger = Oraora::Logger.new(STDOUT, options[:log_level])
|
@@ -39,6 +43,9 @@ begin
|
|
39
43
|
rescue OptionParser::ParseError => e
|
40
44
|
puts "Options error: " + e.message
|
41
45
|
|
46
|
+
rescue ArgumentError
|
47
|
+
puts option_parser.help
|
48
|
+
|
42
49
|
rescue Oraora::Credentials::ParseError => e
|
43
50
|
puts "Invalid connection string: " + e.message
|
44
51
|
|
data/lib/oraora/app.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
module Oraora
|
2
3
|
class App
|
3
4
|
class InvalidCommand < StandardError; end
|
@@ -14,7 +15,7 @@ module Oraora
|
|
14
15
|
USER SESSION SCHEMA SYSTEM DATABASE
|
15
16
|
REPLACE AND OR
|
16
17
|
)
|
17
|
-
ORAORA_KEYWORDS = %w(c cd l ls d desc describe x exit su sudo - -- --- . ! /)
|
18
|
+
ORAORA_KEYWORDS = %w(c cd l ls d desc describe x exit su sudo - -- --- . ! ? /)
|
18
19
|
|
19
20
|
attr_reader :meta, :context
|
20
21
|
|
@@ -32,6 +33,7 @@ module Oraora
|
|
32
33
|
# Connect to Oracle
|
33
34
|
@logger.debug "Connecting: #{@credentials}" + (@role ? " as #{@role}" : '')
|
34
35
|
logon
|
36
|
+
@logger.info "Oraora v#{VERSION}. Type '?' for quick help"
|
35
37
|
@user ||= @oci.username
|
36
38
|
@context ||= Context.new(@user, schema: @user)
|
37
39
|
|
@@ -73,7 +75,7 @@ module Oraora
|
|
73
75
|
|
74
76
|
rescue Interrupt
|
75
77
|
if Time.now - last_interrupt < 2
|
76
|
-
@logger.warn "Exit on CTRL+C
|
78
|
+
@logger.warn "Exit on CTRL+C"
|
77
79
|
terminate
|
78
80
|
else
|
79
81
|
@logger.warn "CTRL+C, hit again within 2 seconds to quit"
|
@@ -237,6 +239,10 @@ module Oraora
|
|
237
239
|
@logger.debug "Command type: metadata refresh"
|
238
240
|
@meta.purge_cache
|
239
241
|
|
242
|
+
when '?'
|
243
|
+
@logger.debug "Command type: help"
|
244
|
+
puts(HELP)
|
245
|
+
|
240
246
|
# Unknown
|
241
247
|
else
|
242
248
|
raise InvalidCommand, "Invalid command: #{$1}"
|
data/lib/oraora/help.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'oraora/completion'
|
2
|
+
|
3
|
+
module Oraora
|
4
|
+
HELP = <<-HERE.reset_indentation
|
5
|
+
Oraora v#{VERSION} - https://github.com/kmehkeri/oraora
|
6
|
+
|
7
|
+
Commands reference:
|
8
|
+
c / cd [path]- Change context (or home schema if path not provided)
|
9
|
+
l / ls [path] List in path (or current context)
|
10
|
+
d / desc / describe Describe path (or current context)
|
11
|
+
x / exit Exit
|
12
|
+
sudo [command] Execute a single command as SYS
|
13
|
+
su Spawn a subshell using SYS username
|
14
|
+
- / -- / --- Navigate 1/2/3 levels up
|
15
|
+
. Navigate to database root
|
16
|
+
! Refresh metadata
|
17
|
+
? Display this help
|
18
|
+
SELECT ... or any other SQL keyword - execute
|
19
|
+
|
20
|
+
Quick templates (type then press <TAB> to expand):
|
21
|
+
#{Completion::TEMPLATES.collect { |template, expansion| "%-3s => %s" % [template, expansion] }.join("\n ")}
|
22
|
+
HERE
|
23
|
+
end
|
data/oraora.gemspec
CHANGED
@@ -1,22 +1,27 @@
|
|
1
|
+
require './lib/oraora/version'
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = 'oraora'
|
3
|
-
s.version =
|
5
|
+
s.version = Oraora::VERSION
|
4
6
|
s.summary = "Interactive command-line utility for Oracle"
|
5
|
-
s.description =
|
7
|
+
s.description = <<-EOS
|
8
|
+
SQL*Plus replacement for interactive work with Oracle, with tab-completion, colored output,
|
9
|
+
metadata navigation with context-aware SQL and more features
|
10
|
+
EOS
|
6
11
|
|
7
12
|
s.author = "kmehkeri"
|
8
13
|
s.email = 'kmehkeri@gmail.com'
|
9
|
-
s.homepage = '
|
14
|
+
s.homepage = 'https://github.com/kmehkeri/oraora'
|
10
15
|
s.license = 'MIT'
|
11
16
|
|
12
17
|
s.files = `git ls-files`.split($/)
|
13
18
|
s.executables = `git ls-files -- bin`.split($/).map { |f| File.basename(f) }
|
14
19
|
|
15
|
-
s.add_runtime_dependency 'highline'
|
16
|
-
s.add_runtime_dependency 'ruby-oci8'
|
17
|
-
s.add_runtime_dependency 'indentation'
|
18
|
-
s.add_runtime_dependency 'colorize'
|
19
|
-
s.add_runtime_dependency 'bigdecimal'
|
20
|
+
s.add_runtime_dependency 'highline', '~> 1'
|
21
|
+
s.add_runtime_dependency 'ruby-oci8', '~> 2'
|
22
|
+
s.add_runtime_dependency 'indentation', '~> 0'
|
23
|
+
s.add_runtime_dependency 'colorize', '~> 0'
|
24
|
+
s.add_runtime_dependency 'bigdecimal', '~> 1'
|
20
25
|
|
21
|
-
s.add_development_dependency 'rspec'
|
26
|
+
s.add_development_dependency 'rspec', '~> 3'
|
22
27
|
end
|
metadata
CHANGED
@@ -1,107 +1,109 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oraora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kmehkeri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ruby-oci8
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: indentation
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: colorize
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bigdecimal
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '1'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '1'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '3'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
97
|
-
description:
|
96
|
+
version: '3'
|
97
|
+
description: |2
|
98
|
+
SQL*Plus replacement for interactive work with Oracle, with tab-completion, colored output,
|
99
|
+
metadata navigation with context-aware SQL and more features
|
98
100
|
email: kmehkeri@gmail.com
|
99
101
|
executables:
|
100
102
|
- oraora
|
101
103
|
extensions: []
|
102
104
|
extra_rdoc_files: []
|
103
105
|
files:
|
104
|
-
- .gitignore
|
106
|
+
- ".gitignore"
|
105
107
|
- LICENSE
|
106
108
|
- README.md
|
107
109
|
- bin/oraora
|
@@ -111,6 +113,7 @@ files:
|
|
111
113
|
- lib/oraora/completion.rb
|
112
114
|
- lib/oraora/context.rb
|
113
115
|
- lib/oraora/credentials.rb
|
116
|
+
- lib/oraora/help.rb
|
114
117
|
- lib/oraora/logger.rb
|
115
118
|
- lib/oraora/meta.rb
|
116
119
|
- lib/oraora/meta/column.rb
|
@@ -124,10 +127,11 @@ files:
|
|
124
127
|
- lib/oraora/meta/view.rb
|
125
128
|
- lib/oraora/oci.rb
|
126
129
|
- lib/oraora/terminal.rb
|
130
|
+
- lib/oraora/version.rb
|
127
131
|
- oraora.gemspec
|
128
132
|
- spec/context_spec.rb
|
129
133
|
- spec/credentials_spec.rb
|
130
|
-
homepage:
|
134
|
+
homepage: https://github.com/kmehkeri/oraora
|
131
135
|
licenses:
|
132
136
|
- MIT
|
133
137
|
metadata: {}
|
@@ -137,17 +141,17 @@ require_paths:
|
|
137
141
|
- lib
|
138
142
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
143
|
requirements:
|
140
|
-
- -
|
144
|
+
- - ">="
|
141
145
|
- !ruby/object:Gem::Version
|
142
146
|
version: '0'
|
143
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
148
|
requirements:
|
145
|
-
- -
|
149
|
+
- - ">="
|
146
150
|
- !ruby/object:Gem::Version
|
147
151
|
version: '0'
|
148
152
|
requirements: []
|
149
153
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.
|
154
|
+
rubygems_version: 2.4.5
|
151
155
|
signing_key:
|
152
156
|
specification_version: 4
|
153
157
|
summary: Interactive command-line utility for Oracle
|