|
1 | 1 | #!/usr/bin/env node
|
| 2 | +var fs = require('fs'); |
2 | 3 | var path = require('path');
|
3 | 4 | var script = path.basename(__filename);
|
4 | 5 |
|
5 |
| -var errorFile = process.argv[2]; |
6 |
| -if (!errorFile) { |
7 |
| - console.error('Usage: ./' + script + ' path/to/errmsg-utf8.txt'); |
| 6 | +var srcDir = process.argv[2]; |
| 7 | +if (!srcDir) { |
| 8 | + var args = []; |
| 9 | + args[0] = process.argv[0].indexOf(' ') !== -1 |
| 10 | + ? '"' + process.argv[0] + '"' |
| 11 | + : process.argv[0]; |
| 12 | + args[1] = process.argv[1].indexOf(' ') !== -1 |
| 13 | + ? '"' + process.argv[1] + '"' |
| 14 | + : process.argv[1]; |
| 15 | + args[2] = path.join('path', 'to', 'mysql', 'src'); |
| 16 | + console.error('Usage: ' + args.join(' ')); |
8 | 17 | process.exit(1);
|
9 | 18 | }
|
10 | 19 |
|
11 |
| -var fs = require('fs'); |
12 |
| -var errors = fs.readFileSync(errorFile, 'utf-8'); |
13 |
| - |
14 |
| -var targetFile = path.join(__dirname, '../lib/protocol/constants/errors.js'); |
15 |
| -var offset = Number(errors.match(/start-error-number (\d+)/)[1]); |
16 |
| -var codes = errors.match(/^([A-Z_]+)/mg).map(fixupCode); |
| 20 | +var codes = []; |
| 21 | +var targetFile = path.join(__dirname, '..', 'lib', 'protocol', 'constants', 'errors.js'); |
17 | 22 | var stream = fs.createWriteStream(targetFile);
|
18 |
| -var alignment = codes.reduce(maxLength, 0); |
19 | 23 |
|
20 |
| -stream.write('// Generated by ' + script + ', do not modify by hand\n'); |
| 24 | +appendGlobalErrorCodes(srcDir, codes); |
| 25 | +appendSqlErrorCodes(srcDir, codes); |
| 26 | + |
| 27 | +stream.write('/**\n * MySQL error constants\n *\n * !! Generated by ' + script + ', do not modify by hand !!\n */\n\n'); |
21 | 28 |
|
| 29 | +var alignment = codes.reduce(maxLength, 0); |
22 | 30 | for (var i = 0; i < codes.length; i++) {
|
23 |
| - stream.write('exports.' + codes[i] + (new Array(alignment - codes[i].length + 1)).join(' ') + ' = ' + (offset + i) + ';\n'); |
| 31 | + if (i in codes) { |
| 32 | + stream.write('exports.' + codes[i] + (new Array(alignment - codes[i].length + 1)).join(' ') + ' = ' + i + ';\n'); |
| 33 | + } |
24 | 34 | }
|
25 | 35 |
|
26 | 36 | stream.write('\n// Lookup-by-number table\n');
|
27 | 37 |
|
| 38 | +var alignment = String(codes.length).length; |
28 | 39 | for (var i = 0; i < codes.length; i++) {
|
29 |
| - stream.write('exports[' + (offset + i) + '] = \'' + codes[i] + '\';\n'); |
| 40 | + if (i in codes) { |
| 41 | + stream.write('exports[' + i + ']' + (new Array(alignment - String(i).length + 1)).join(' ') + ' = \'' + codes[i] + '\';\n'); |
| 42 | + } |
30 | 43 | }
|
31 | 44 |
|
32 | 45 | console.log('Wrote constants to ' + targetFile);
|
33 | 46 |
|
| 47 | +function appendGlobalErrorCodes(srcDir, codes) { |
| 48 | + var headerFile = path.join(srcDir, 'include', 'mysys_err.h'); |
| 49 | + var code = ''; |
| 50 | + var contents = fs.readFileSync(headerFile, 'ascii'); |
| 51 | + var block = false; |
| 52 | + var match = null; |
| 53 | + var num = 0; |
| 54 | + var regexp = /#define +(EE_[A-Z_]+)\s+([0-9]+)/mg; |
| 55 | + |
| 56 | + while ((match = regexp.exec(contents))) { |
| 57 | + code = match[1]; |
| 58 | + num = Number(match[2]); |
| 59 | + |
| 60 | + if (!block) { |
| 61 | + block = code === 'EE_ERROR_FIRST'; |
| 62 | + continue; |
| 63 | + } |
| 64 | + |
| 65 | + if (code === 'EE_ERROR_LAST') { |
| 66 | + break; |
| 67 | + } |
| 68 | + |
| 69 | + codes[num] = code; |
| 70 | + } |
| 71 | + |
| 72 | + return codes; |
| 73 | +} |
| 74 | + |
| 75 | +function appendSqlErrorCodes(srcDir, codes) { |
| 76 | + var errorFile = path.join(srcDir, 'sql', 'share', 'errmsg-utf8.txt'); |
| 77 | + var contents = fs.readFileSync(errorFile, 'utf-8'); |
| 78 | + var offset = Number(contents.match(/start-error-number (\d+)/)[1]); |
| 79 | + var names = contents.match(/^([A-Z_]+)/mg).map(fixupCode); |
| 80 | + var num = 0; |
| 81 | + |
| 82 | + for (var i = 0; i < names.length; i++) { |
| 83 | + num = offset + i; |
| 84 | + codes[num] = names[i]; |
| 85 | + } |
| 86 | + |
| 87 | + return codes; |
| 88 | +} |
| 89 | + |
34 | 90 | function fixupCode(code) {
|
35 | 91 | return code
|
36 | 92 | // remove obsolete markers
|
|
0 commit comments