forked from mysqljs/mysql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate-error-constants.js
executable file
·129 lines (104 loc) · 3.31 KB
/
generate-error-constants.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var script = path.basename(__filename);
var srcDir = process.argv[2];
if (!srcDir) {
var args = [];
args[0] = process.argv[0].indexOf(' ') !== -1
? '"' + process.argv[0] + '"'
: process.argv[0];
args[1] = process.argv[1].indexOf(' ') !== -1
? '"' + process.argv[1] + '"'
: process.argv[1];
args[2] = path.join('path', 'to', 'mysql', 'src');
console.error('Usage: ' + args.join(' '));
process.exit(1);
}
var codes = [];
var targetFile = path.join(__dirname, '..', 'lib', 'protocol', 'constants', 'errors.js');
var stream = fs.createWriteStream(targetFile);
appendGlobalErrorCodes(srcDir, codes);
appendDatabseErrorCodes(srcDir, codes);
appendSqlErrorCodes(srcDir, codes);
stream.write('/**\n * MySQL error constants\n *\n * !! Generated by ' + script + ', do not modify by hand !!\n */\n\n');
var alignment = codes.reduce(maxLength, 0);
for (var i = 0; i < codes.length; i++) {
if (i in codes) {
stream.write('exports.' + codes[i] + (new Array(alignment - codes[i].length + 1)).join(' ') + ' = ' + i + ';\n');
}
}
stream.write('\n// Lookup-by-number table\n');
var alignment = String(codes.length).length;
for (var i = 0; i < codes.length; i++) {
if (i in codes) {
stream.write('exports[' + i + ']' + (new Array(alignment - String(i).length + 1)).join(' ') + ' = \'' + codes[i] + '\';\n');
}
}
console.log('Wrote constants to ' + targetFile);
function appendGlobalErrorCodes(srcDir, codes) {
var headerFile = path.join(srcDir, 'include', 'mysys_err.h');
var code = '';
var contents = fs.readFileSync(headerFile, 'ascii');
var block = false;
var match = null;
var num = 0;
var regexp = /#define +(EE_[A-Z0-9_]+)\s+([0-9]+)/mg;
while ((match = regexp.exec(contents))) {
code = match[1];
num = Number(match[2]);
if (!block) {
block = code === 'EE_ERROR_FIRST';
continue;
}
if (code === 'EE_ERROR_LAST') {
break;
}
codes[num] = code;
}
return codes;
}
function appendDatabseErrorCodes(srcDir, codes) {
var headerFile = path.join(srcDir, 'include', 'my_base.h');
var code = '';
var contents = fs.readFileSync(headerFile, 'ascii');
var block = false;
var match = null;
var num = 0;
var regexp = /#define +(HA_[A-Z0-9_]+)\s+([0-9]+)/mg;
while ((match = regexp.exec(contents))) {
code = match[1];
num = Number(match[2]);
if (!block) {
block = code === 'HA_ERR_FIRST';
continue;
}
if (code === 'HA_ERR_LAST') {
break;
}
codes[num] = code;
}
return codes;
}
function appendSqlErrorCodes(srcDir, codes) {
var errorFile = path.join(srcDir, 'sql', 'share', 'errmsg-utf8.txt');
var contents = fs.readFileSync(errorFile, 'utf-8');
var offset = Number(contents.match(/start-error-number (\d+)/)[1]);
var names = contents.match(/^([A-Z0-9_]+)/mg).map(fixupCode);
var num = 0;
for (var i = 0; i < names.length; i++) {
num = offset + i;
codes[num] = names[i];
}
return codes;
}
function fixupCode(code) {
return code
// remove obsolete markers
.replace('ER_OBSOLETE_', 'ER_')
// remove unused markers
.replace(/_(?:OLD)?_UNUSED$/, '');
}
function maxLength(max, value) {
return Math.max(max, value.length);
}