arel_extensions 1.6.0 → 2.0.0.rc3
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +370 -773
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +38 -52
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -18
- data/NEWS.md +0 -116
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 66c2dbd555cb0f702ba816dfd15143d1206667a52d3e9ef531837cede739ce1b
|
|
4
|
+
data.tar.gz: 7bddb377ad0a827d95a9b1a6d0dbedf2a60edcacb65a7ca485b341dedeced96b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 28b4685b962e6e2d608ed3e0a482a9ee2af533d8529438223caed947e07dbc286238c510b897b0c090e4abcb968261cc660a42929a909ddd21950c375669b2df
|
|
7
|
+
data.tar.gz: 5cd46969679f69c1dcc67c18c8f184c17f14f269e6e4de1e4ebd1c048a0e8844d9d25ef9c44c359534346f1b9439b1ee24b08497f434f8bf9bab07d461ca2a33
|
data/.codeclimate.yml
CHANGED
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
plugins:
|
|
2
|
-
- rubocop-performance
|
|
3
|
-
|
|
4
1
|
AllCops:
|
|
5
2
|
DisabledByDefault: true
|
|
6
3
|
Exclude:
|
|
7
|
-
|
|
4
|
+
- "test/**/*"
|
|
8
5
|
|
|
9
6
|
Layout/EndOfLine:
|
|
10
7
|
Enabled: true
|
|
@@ -12,32 +9,10 @@ Layout/EndOfLine:
|
|
|
12
9
|
Layout/ExtraSpacing:
|
|
13
10
|
Enabled: true
|
|
14
11
|
|
|
15
|
-
Layout/IndentationWidth:
|
|
16
|
-
Enabled: true
|
|
17
|
-
|
|
18
|
-
Layout/LineLength:
|
|
19
|
-
Enabled: false
|
|
20
|
-
|
|
21
|
-
Layout/SpaceAfterComma:
|
|
22
|
-
Enabled: true
|
|
23
|
-
|
|
24
12
|
Layout/SpaceAroundEqualsInParameterDefault:
|
|
25
13
|
Enabled: true
|
|
26
14
|
|
|
27
|
-
Layout/
|
|
28
|
-
Enabled: true
|
|
29
|
-
|
|
30
|
-
Layout/SpaceInsideHashLiteralBraces:
|
|
31
|
-
Enabled: true
|
|
32
|
-
EnforcedStyle: no_space
|
|
33
|
-
|
|
34
|
-
Layout/TrailingEmptyLines:
|
|
35
|
-
Enabled: true
|
|
36
|
-
|
|
37
|
-
Metrics/BlockLength:
|
|
38
|
-
Enabled: false
|
|
39
|
-
|
|
40
|
-
Naming/FileName:
|
|
15
|
+
Layout/TrailingBlankLines:
|
|
41
16
|
Enabled: true
|
|
42
17
|
|
|
43
18
|
Style/CollectionMethods:
|
|
@@ -58,53 +33,14 @@ Style/EmptyElse:
|
|
|
58
33
|
Style/Encoding:
|
|
59
34
|
Enabled: true
|
|
60
35
|
|
|
61
|
-
Style/
|
|
36
|
+
Style/FileName:
|
|
62
37
|
Enabled: true
|
|
63
|
-
EnforcedStyle: ruby19
|
|
64
38
|
|
|
65
39
|
Style/MethodCallWithArgsParentheses:
|
|
66
40
|
Enabled: false
|
|
67
41
|
|
|
68
|
-
Style/MethodCallWithoutArgsParentheses:
|
|
69
|
-
Enabled: true
|
|
70
|
-
|
|
71
|
-
Style/NegatedIf:
|
|
72
|
-
Enabled: false
|
|
73
|
-
|
|
74
|
-
Style/NumericLiterals:
|
|
75
|
-
Enabled: true
|
|
76
|
-
|
|
77
|
-
Style/RedundantParentheses:
|
|
78
|
-
Enabled: true
|
|
79
|
-
|
|
80
|
-
Style/RedundantRegexpCharacterClass:
|
|
81
|
-
Enabled: true
|
|
82
|
-
|
|
83
|
-
Style/RedundantReturn:
|
|
84
|
-
Enabled: true
|
|
85
|
-
|
|
86
|
-
# Even when conservative, this is unsafe.
|
|
87
|
-
#Style/StringConcatenation:
|
|
88
|
-
# Enabled: true
|
|
89
|
-
# Mode: 'conservative'
|
|
90
|
-
|
|
91
|
-
Style/StringLiterals:
|
|
92
|
-
Enabled: true
|
|
93
|
-
|
|
94
|
-
Style/SymbolArray:
|
|
95
|
-
Enabled: true
|
|
96
|
-
|
|
97
|
-
Style/WordArray:
|
|
98
|
-
Enabled: true
|
|
99
|
-
|
|
100
42
|
Performance/DoubleStartEndWith:
|
|
101
43
|
Enabled: true
|
|
102
44
|
|
|
103
45
|
Performance/RedundantMerge:
|
|
104
46
|
Enabled: true
|
|
105
|
-
|
|
106
|
-
Performance/RegexpMatch:
|
|
107
|
-
Enabled: true
|
|
108
|
-
|
|
109
|
-
Performance/StringReplacement:
|
|
110
|
-
Enabled: true
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// vim: set et sw=2 ts=2:
|
|
2
|
+
"use strict";
|
|
3
|
+
var env = process.env;
|
|
4
|
+
var url = require('url');
|
|
5
|
+
var Promise = require('bluebird');
|
|
6
|
+
var Phantom = Promise.promisifyAll(require('node-phantom-simple'));
|
|
7
|
+
|
|
8
|
+
var login = {
|
|
9
|
+
begin: url.parse(env['ORACLE_LOGIN_BEGIN'] || "https://www.oracle.com/webapps/redirect/signon?nexturl=https://www.oracle.com/favicon.ico"),
|
|
10
|
+
end: url.parse(env['ORCALE_LOGIN_END'] || "https://www.oracle.com/favicon.ico"),
|
|
11
|
+
};
|
|
12
|
+
delete env['ORACLE_LOGIN_BEGIN'];
|
|
13
|
+
delete env['ORACLE_LOGIN_END'];
|
|
14
|
+
|
|
15
|
+
var credentials = Object.keys(env)
|
|
16
|
+
.filter(function (key) { return key.indexOf('ORACLE_LOGIN_') == 0 })
|
|
17
|
+
.map(function (key) { return [key.substr(13), env[key]] });
|
|
18
|
+
|
|
19
|
+
if (credentials.length <= 0) {
|
|
20
|
+
console.error("Missing ORACLE_LOGIN environment variables!");
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
Phantom.createAsync({ parameters: { 'ssl-protocol': 'tlsv1' } }).then(function (browser) {
|
|
25
|
+
browser = Promise.promisifyAll(browser, { suffix: 'Promise' });
|
|
26
|
+
browser.addCookie({'name': 'oraclelicense', 'value': "accept-" + env['ORACLE_COOKIE'] + "-cookie", 'domain': '.oracle.com' });
|
|
27
|
+
|
|
28
|
+
// Open a tab, configure it
|
|
29
|
+
return browser.createPagePromise().then(function (page) {
|
|
30
|
+
page = Promise.promisifyAll(page, { suffix: 'Promise' });
|
|
31
|
+
|
|
32
|
+
var received = "";
|
|
33
|
+
page.onNavigationRequested = function () { console.info("%s %j", (new Date()).toISOString(), arguments["0"]); };
|
|
34
|
+
page.onResourceError = console.error.bind(console);
|
|
35
|
+
page.onResourceReceived = function (response) { if (response.stage == "end") received = response.url; };
|
|
36
|
+
page.set('settings.loadImages', false);
|
|
37
|
+
|
|
38
|
+
return page
|
|
39
|
+
.setPromise('settings.userAgent', env['USER_AGENT']) // PhantomJS configures the UA per tab
|
|
40
|
+
|
|
41
|
+
// Begin login, wait for the login page
|
|
42
|
+
.then(function () {
|
|
43
|
+
return page.openPromise(login.begin.href).then(function (status) {
|
|
44
|
+
if (status != 'success') throw "Unable to connect to " + login.begin.host;
|
|
45
|
+
|
|
46
|
+
return new Promise(function (resolve, reject) {
|
|
47
|
+
var deadline = Date.now() + 6000;
|
|
48
|
+
var interval = 100;
|
|
49
|
+
|
|
50
|
+
var check = function () {
|
|
51
|
+
if (deadline < Date.now()) return reject("Timeout waiting for form");
|
|
52
|
+
|
|
53
|
+
page.evaluate(function () {
|
|
54
|
+
return window['jQuery'] && document.querySelectorAll('input[type=password]').length;
|
|
55
|
+
}, function (err, result) {
|
|
56
|
+
if (result) { resolve(); } else { setTimeout(check, interval); }
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
check();
|
|
61
|
+
});
|
|
62
|
+
})
|
|
63
|
+
.tapCatch(function (err) {
|
|
64
|
+
return page.getPromise('plainText').then(function (text) {
|
|
65
|
+
console.error("Unable to load login page. Last response was:\n" + text);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Submit the login form
|
|
71
|
+
.then(function () {
|
|
72
|
+
return page.evaluatePromise(function (credentials) {
|
|
73
|
+
var $form = jQuery(document.forms[0]);
|
|
74
|
+
return credentials.filter(function (tuple) {
|
|
75
|
+
return $form.find("[name='"+tuple[0]+"']").val(tuple[1]).length == 0;
|
|
76
|
+
})
|
|
77
|
+
.map(function (tuple) { return tuple[0]; });
|
|
78
|
+
}, credentials)
|
|
79
|
+
.then(function (unapplied) {
|
|
80
|
+
if (unapplied.length > 0) {
|
|
81
|
+
console.warn("Unable to use all ORACLE_LOGIN environment variables: %j", unapplied);
|
|
82
|
+
}
|
|
83
|
+
return page.evaluatePromise(function () {
|
|
84
|
+
jQuery(function () { document.forms[0].submit(); });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Wait for login result
|
|
90
|
+
.then(function () {
|
|
91
|
+
return new Promise(function (resolve, reject) {
|
|
92
|
+
var deadline = Date.now() + 6000;
|
|
93
|
+
var interval = 100;
|
|
94
|
+
|
|
95
|
+
var check = function () {
|
|
96
|
+
if (deadline < Date.now()) return reject("Timeout waiting for " + login.end.href);
|
|
97
|
+
if (received == login.end.href) { resolve(); } else { setTimeout(check, interval); }
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
check();
|
|
101
|
+
})
|
|
102
|
+
.tapCatch(function (err) {
|
|
103
|
+
return page.getPromise('plainText').then(function (text) {
|
|
104
|
+
console.error("Unable to load login result. Last response was:\n" + text);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// Export cookies for cURL
|
|
110
|
+
.then(function () {
|
|
111
|
+
return browser.getPromise('cookies').then(function (cookies) {
|
|
112
|
+
var data = "";
|
|
113
|
+
for (var i = 0; i < cookies.length; ++i) {
|
|
114
|
+
var cookie = cookies[i];
|
|
115
|
+
data += cookie.domain + "\tTRUE\t" + cookie.path + "\t"
|
|
116
|
+
+ (cookie.secure ? "TRUE" : "FALSE") + "\t0\t"
|
|
117
|
+
+ cookie.name + "\t" + cookie.value + "\n";
|
|
118
|
+
}
|
|
119
|
+
return Promise.promisify(require('fs').writeFile)(env['COOKIES'], data);
|
|
120
|
+
});
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
// Download file using cURL
|
|
124
|
+
.then(function () {
|
|
125
|
+
return browser.exitPromise().then(function () {
|
|
126
|
+
var cmd = ['curl', [
|
|
127
|
+
'--cookie', env['COOKIES'],
|
|
128
|
+
'--cookie-jar', env['COOKIES'],
|
|
129
|
+
'--location',
|
|
130
|
+
'--output', env['ORACLE_DOWNLOAD_FILE'],
|
|
131
|
+
'--user-agent', env['USER_AGENT'],
|
|
132
|
+
"https://edelivery.oracle.com/akam/otn/linux/" + env['ORACLE_FILE']
|
|
133
|
+
]];
|
|
134
|
+
|
|
135
|
+
console.info("Executing %j", cmd);
|
|
136
|
+
|
|
137
|
+
var child_process = require('child_process');
|
|
138
|
+
var child = child_process.spawn.apply(child_process, cmd.concat({ stdio: [0, 1, 2] }));
|
|
139
|
+
child.on('exit', process.exit);
|
|
140
|
+
});
|
|
141
|
+
})
|
|
142
|
+
.catch(function (err) {
|
|
143
|
+
console.error(err);
|
|
144
|
+
browser.on('exit', function () { process.exit(1); });
|
|
145
|
+
browser.exit();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
})
|
|
149
|
+
.catch(function (err) {
|
|
150
|
+
console.error(err);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/bin/sh -e
|
|
2
|
+
# vim: set et sw=2 ts=2:
|
|
3
|
+
|
|
4
|
+
[ -n "$ORACLE_COOKIE" ] || { echo "Missing ORACLE_COOKIE environment variable!"; exit 1; }
|
|
5
|
+
[ -n "$ORACLE_FILE" ] || { echo "Missing ORACLE_FILE environment variable!"; exit 1; }
|
|
6
|
+
|
|
7
|
+
ORACLE_DOWNLOAD_FILE="$(basename "$ORACLE_FILE")"
|
|
8
|
+
|
|
9
|
+
if [ -n "$ORACLE_DOWNLOAD_DIR" ]; then
|
|
10
|
+
mkdir -p "$ORACLE_DOWNLOAD_DIR"
|
|
11
|
+
ORACLE_DOWNLOAD_FILE="$(readlink -f "$ORACLE_DOWNLOAD_DIR")/$ORACLE_DOWNLOAD_FILE"
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
if [ "${*#*--unless-exists}" != "$*" ] && [ -f "$ORACLE_DOWNLOAD_FILE" ]; then
|
|
15
|
+
exit 0
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
cd "$(dirname "$(readlink -f "$0")")"
|
|
19
|
+
|
|
20
|
+
echo "PhantomJS version $(phantomjs --version)"
|
|
21
|
+
npm install bluebird node-phantom-simple
|
|
22
|
+
|
|
23
|
+
export ORACLE_DOWNLOAD_FILE
|
|
24
|
+
export COOKIES='cookies.txt'
|
|
25
|
+
export USER_AGENT='Mozilla/5.0'
|
|
26
|
+
|
|
27
|
+
echo > "$COOKIES"
|
|
28
|
+
chmod 600 "$COOKIES"
|
|
29
|
+
|
|
30
|
+
exec node download.js
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// vim: set et sw=2 ts=2:
|
|
2
|
+
"use strict";
|
|
3
|
+
var env = process.env;
|
|
4
|
+
var Promise = require('bluebird');
|
|
5
|
+
var Phantom = Promise.promisifyAll(require('node-phantom-simple'));
|
|
6
|
+
var PhantomError = require('node-phantom-simple/headless_error');
|
|
7
|
+
|
|
8
|
+
var credentials = Object.keys(env)
|
|
9
|
+
.filter(function (key) { return key.indexOf('ORACLE_LOGIN_') == 0 })
|
|
10
|
+
.map(function (key) { return [key.substr(13), env[key]] });
|
|
11
|
+
|
|
12
|
+
if (credentials.length <= 0) {
|
|
13
|
+
console.error("Missing ORACLE_LOGIN environment variables!");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Phantom.createAsync({ parameters: { 'ssl-protocol': 'tlsv1' } }).then(function (browser) {
|
|
18
|
+
browser = Promise.promisifyAll(browser, { suffix: 'Promise' });
|
|
19
|
+
|
|
20
|
+
// Configure the browser, open a tab
|
|
21
|
+
return browser
|
|
22
|
+
.addCookiePromise({'name': 'oraclelicense', 'value': "accept-" + env['ORACLE_COOKIE'] + "-cookie", 'domain': '.oracle.com' })
|
|
23
|
+
.then(function () {
|
|
24
|
+
return browser.createPagePromise();
|
|
25
|
+
})
|
|
26
|
+
.then(function (page) {
|
|
27
|
+
page = Promise.promisifyAll(page, { suffix: 'Promise' });
|
|
28
|
+
|
|
29
|
+
// Configure the tab
|
|
30
|
+
page.onResourceError = console.error.bind(console);
|
|
31
|
+
return page
|
|
32
|
+
.setPromise('settings.userAgent', env['USER_AGENT']) // PhantomJS configures the UA per tab
|
|
33
|
+
|
|
34
|
+
// Request the file, wait for the login page
|
|
35
|
+
.then(function () {
|
|
36
|
+
return page.openPromise("https://edelivery.oracle.com/akam/otn/linux/" + env['ORACLE_FILE']).then(function (status) {
|
|
37
|
+
if (status != 'success') throw "Unable to connect to oracle.com";
|
|
38
|
+
return page.waitForSelectorPromise('input[type=password]', 5000);
|
|
39
|
+
})
|
|
40
|
+
.catch(PhantomError, function (err) {
|
|
41
|
+
return page.getPromise('plainText').then(function (text) {
|
|
42
|
+
console.error("Unable to load login page. Last response was:\n" + text);
|
|
43
|
+
throw err;
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// Export cookies for cURL
|
|
49
|
+
.then(function () {
|
|
50
|
+
return page.getPromise('cookies').then(function (cookies) {
|
|
51
|
+
var data = "";
|
|
52
|
+
for (var i = 0; i < cookies.length; ++i) {
|
|
53
|
+
var cookie = cookies[i];
|
|
54
|
+
data += cookie.domain + "\tTRUE\t" + cookie.path + "\t"
|
|
55
|
+
+ (cookie.secure ? "TRUE" : "FALSE") + "\t0\t"
|
|
56
|
+
+ cookie.name + "\t" + cookie.value + "\n";
|
|
57
|
+
}
|
|
58
|
+
return Promise.promisifyAll(require('fs')).writeFileAsync(env['COOKIES'], data);
|
|
59
|
+
});
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// Submit the login form using cURL
|
|
63
|
+
.then(function () {
|
|
64
|
+
return page.evaluatePromise(function () {
|
|
65
|
+
var $form = jQuery(document.forms[0]);
|
|
66
|
+
return {
|
|
67
|
+
action: $form.prop('action'),
|
|
68
|
+
data: $form.serialize()
|
|
69
|
+
};
|
|
70
|
+
})
|
|
71
|
+
.then(function (form) {
|
|
72
|
+
return browser.exitPromise().then(function () {
|
|
73
|
+
var unapplied = credentials.filter(function (tuple) {
|
|
74
|
+
var applied = false;
|
|
75
|
+
form.data = form.data.replace(tuple[0] + '=', function (name) {
|
|
76
|
+
applied = true;
|
|
77
|
+
return name + encodeURIComponent(tuple[1]);
|
|
78
|
+
});
|
|
79
|
+
return !applied;
|
|
80
|
+
})
|
|
81
|
+
.map(function (tuple) { return tuple[0] });
|
|
82
|
+
|
|
83
|
+
if (unapplied.length > 0) {
|
|
84
|
+
console.warn("Unable to use all ORACLE_LOGIN environment variables: %j", unapplied);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
var cmd = ['curl', [
|
|
88
|
+
'--cookie', env['COOKIES'],
|
|
89
|
+
'--cookie-jar', env['COOKIES'],
|
|
90
|
+
'--data', '@-',
|
|
91
|
+
'--location',
|
|
92
|
+
'--output', require('path').basename('ojdbc6.jar'),
|
|
93
|
+
'--user-agent', env['USER_AGENT'],
|
|
94
|
+
env['ORACLE_OJDBC_URL']
|
|
95
|
+
]];
|
|
96
|
+
|
|
97
|
+
console.info("Executing %j", cmd);
|
|
98
|
+
|
|
99
|
+
var child_process = require('child_process');
|
|
100
|
+
var child = child_process.spawn.apply(child_process, cmd.concat({ stdio: ['pipe', 1, 2] }));
|
|
101
|
+
child.on('exit', process.exit);
|
|
102
|
+
child.stdin.end(form.data);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
})
|
|
106
|
+
.catch(function (err) {
|
|
107
|
+
console.error(err);
|
|
108
|
+
browser.on('exit', function () { process.exit(1); });
|
|
109
|
+
browser.exit();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
})
|
|
113
|
+
.catch(function (err) {
|
|
114
|
+
console.error(err);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/sh -e
|
|
2
|
+
# vim: set et sw=2 ts=2:
|
|
3
|
+
|
|
4
|
+
[ -z "$ORACLE_DOWNLOAD_DIR" ] || ORACLE_DOWNLOAD_DIR="$(readlink -f "$ORACLE_DOWNLOAD_DIR")/"
|
|
5
|
+
[ -n "$ORACLE_FILE" ] || { echo "Missing ORACLE_FILE environment variable!"; exit 1; }
|
|
6
|
+
[ -n "$ORACLE_HOME" ] || { echo "Missing ORACLE_HOME environment variable!"; exit 1; }
|
|
7
|
+
|
|
8
|
+
ORACLE_RPM="$(basename "$ORACLE_FILE" .zip)"
|
|
9
|
+
|
|
10
|
+
cd "$(dirname "$(readlink -f "$0")")"
|
|
11
|
+
|
|
12
|
+
dpkg -s bc libaio1 rpm unzip > /dev/null 2>&1 ||
|
|
13
|
+
( sudo apt-get -qq update && sudo apt-get --no-install-recommends -qq install bc libaio1 rpm unzip )
|
|
14
|
+
|
|
15
|
+
df -B1 /dev/shm | awk 'END { if ($1 != "shmfs" && $1 != "tmpfs" || $2 < 2147483648) exit 1 }' ||
|
|
16
|
+
( sudo rm -r /dev/shm && sudo mkdir /dev/shm && sudo mount -t tmpfs shmfs -o size=2G /dev/shm )
|
|
17
|
+
|
|
18
|
+
test -f /sbin/chkconfig ||
|
|
19
|
+
( echo '#!/bin/sh' | sudo tee /sbin/chkconfig > /dev/null && sudo chmod u+x /sbin/chkconfig )
|
|
20
|
+
|
|
21
|
+
test -d /var/lock/subsys || sudo mkdir /var/lock/subsys
|
|
22
|
+
|
|
23
|
+
unzip -j "${ORACLE_DOWNLOAD_DIR}$(basename "$ORACLE_FILE")" "*/$ORACLE_RPM"
|
|
24
|
+
sudo rpm --install --nodeps --nopre "$ORACLE_RPM"
|
|
25
|
+
|
|
26
|
+
echo 'OS_AUTHENT_PREFIX=""' | sudo tee -a "$ORACLE_HOME/config/scripts/init.ora" > /dev/null
|
|
27
|
+
sudo usermod -aG dba $USER
|
|
28
|
+
|
|
29
|
+
( echo ; echo ; echo travis ; echo travis ; echo n ) | sudo AWK='/usr/bin/awk' /etc/init.d/oracle-xe configure
|
|
30
|
+
|
|
31
|
+
"$ORACLE_HOME/bin/sqlplus" -L -S / AS SYSDBA <<SQL
|
|
32
|
+
CREATE USER $USER IDENTIFIED EXTERNALLY;
|
|
33
|
+
GRANT CONNECT, RESOURCE TO $USER;
|
|
34
|
+
SQL
|