Created
August 27, 2012 20:34
-
-
Save zeen/3492028 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env lua | |
do | |
local _parse_sql_actions = { [0] = | |
0, 1, 0, 1, 1, 2, 0, 2, 2, 0, 9, 2, 0, 10, 2, 0, 11, 2, 0, 13, | |
2, 1, 2, 2, 1, 6, 3, 0, 3, 4, 3, 0, 3, 5, 3, 0, 3, 7, 3, 0, | |
3, 8, 3, 0, 3, 12, 4, 0, 2, 3, 7, 4, 0, 3, 8, 11 | |
}; | |
local _parse_sql_trans_keys = { [0] = | |
0, 0, 45, 45, 10, 10, 42, 42, 10, 42, 10, 47, 82, 82, | |
69, 69, 65, 65, 84, 84, 69, 69, 32, 32, 68, 84, 65, | |
65, 84, 84, 65, 65, 66, 66, 65, 65, 83, 83, 69, 69, | |
9, 47, 9, 96, 45, 45, 10, 10, 42, 42, 10, 42, 10, 47, | |
10, 96, 10, 96, 9, 47, 9, 59, 45, 45, 10, 10, 42, | |
42, 10, 42, 10, 47, 65, 65, 66, 66, 76, 76, 69, 69, | |
32, 32, 73, 96, 70, 70, 32, 32, 78, 78, 79, 79, 84, 84, | |
32, 32, 69, 69, 88, 88, 73, 73, 83, 83, 84, 84, 83, | |
83, 32, 32, 96, 96, 10, 96, 10, 96, 32, 32, 40, 40, | |
10, 10, 32, 41, 32, 32, 75, 96, 69, 69, 89, 89, 32, 32, | |
96, 96, 10, 96, 10, 96, 10, 10, 82, 82, 73, 73, 77, | |
77, 65, 65, 82, 82, 89, 89, 32, 32, 75, 75, 69, 69, | |
89, 89, 32, 32, 78, 78, 73, 73, 81, 81, 85, 85, 69, 69, | |
32, 32, 75, 75, 10, 96, 10, 96, 10, 10, 10, 59, 10, | |
59, 82, 82, 79, 79, 80, 80, 32, 32, 84, 84, 65, 65, | |
66, 66, 76, 76, 69, 69, 32, 32, 73, 73, 70, 70, 32, 32, | |
69, 69, 88, 88, 73, 73, 83, 83, 84, 84, 83, 83, 32, | |
32, 96, 96, 10, 96, 10, 96, 59, 59, 78, 78, 83, 83, | |
69, 69, 82, 82, 84, 84, 32, 32, 73, 73, 78, 78, 84, 84, | |
79, 79, 32, 32, 96, 96, 10, 96, 10, 96, 32, 32, 40, | |
86, 10, 41, 32, 32, 86, 86, 65, 65, 76, 76, 85, 85, | |
69, 69, 83, 83, 32, 32, 40, 40, 39, 78, 10, 92, 10, 92, | |
41, 44, 44, 59, 32, 78, 48, 57, 41, 57, 48, 57, 41, | |
57, 85, 85, 76, 76, 76, 76, 34, 116, 79, 79, 67, 67, | |
75, 75, 32, 32, 84, 84, 65, 65, 66, 66, 76, 76, 69, 69, | |
83, 83, 32, 32, 96, 96, 10, 96, 10, 96, 32, 32, 87, | |
87, 82, 82, 73, 73, 84, 84, 69, 69, 69, 69, 84, 84, | |
32, 32, 10, 59, 10, 59, 78, 83, 76, 76, 79, 79, 67, 67, | |
75, 75, 32, 32, 84, 84, 65, 65, 66, 66, 76, 76, 69, | |
69, 83, 83, 69, 69, 9, 85, 0 | |
}; | |
local _parse_sql_key_spans = { [0] = | |
0, 1, 1, 1, 33, 38, 1, 1, 1, 1, 1, 1, 17, 1, 1, 1, 1, 1, 1, 1, | |
39, 88, 1, 1, 1, 33, 38, 87, 87, 39, 51, 1, 1, 1, 33, 38, 1, 1, 1, 1, | |
1, 24, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 87, 87, 1, 1, | |
1, 10, 1, 22, 1, 1, 1, 1, 87, 87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 87, 87, 1, 50, 50, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 87, 87, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 87, 87, 1, 47, 32, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 40, 83, 83, 4, 16, 47, 10, 17, 10, 17, 1, 1, 1, 83, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 87, 87, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 50, 50, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 77 | |
}; | |
local _parse_sql_index_offsets = { [0] = | |
0, 0, 2, 4, 6, 40, 79, 81, 83, 85, 87, 89, 91, 109, 111, 113, 115, 117, 119, 121, | |
123, 163, 252, 254, 256, 258, 292, 331, 419, 507, 547, 599, 601, 603, 605, 639, 678, 680, 682, 684, | |
686, 688, 713, 715, 717, 719, 721, 723, 725, 727, 729, 731, 733, 735, 737, 739, 741, 829, 917, 919, | |
921, 923, 934, 936, 959, 961, 963, 965, 967, 1055, 1143, 1145, 1147, 1149, 1151, 1153, 1155, 1157, 1159, 1161, | |
1163, 1165, 1167, 1169, 1171, 1173, 1175, 1177, 1179, 1181, 1269, 1357, 1359, 1410, 1461, 1463, 1465, 1467, 1469, 1471, | |
1473, 1475, 1477, 1479, 1481, 1483, 1485, 1487, 1489, 1491, 1493, 1495, 1497, 1499, 1501, 1503, 1591, 1679, 1681, 1683, | |
1685, 1687, 1689, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1793, 1881, 1883, 1931, 1964, 1966, 1968, 1970, 1972, | |
1974, 1976, 1978, 1980, 1982, 2023, 2107, 2191, 2196, 2213, 2261, 2272, 2290, 2301, 2319, 2321, 2323, 2325, 2409, 2411, | |
2413, 2415, 2417, 2419, 2421, 2423, 2425, 2427, 2429, 2431, 2433, 2521, 2609, 2611, 2613, 2615, 2617, 2619, 2621, 2623, | |
2625, 2627, 2678, 2729, 2736, 2738, 2740, 2742, 2744, 2746, 2748, 2750, 2752, 2754, 2756, 2758, 2760 | |
}; | |
local _parse_sql_indicies = { [0] = | |
0, 1, 2, 0, 3, 1, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, | |
4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 6, 3, 7, | |
1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 14, 1, 15, 1, 16, 1, 17, 1, 18, 1, 19, 1, 20, | |
1, 21, 1, 22, 23, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, | |
1, 25, 1, 22, 23, 22, 22, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 22, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 24, | |
1, 25, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 26, 1, 27, 1, 23, 27, 28, 1, 29, 28, | |
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, | |
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 30, 28, 29, 28, 28, 28, 28, 28, 28, 28, | |
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, | |
28, 28, 28, 28, 30, 28, 28, 28, 28, 22, 28, 32, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 1, 31, 32, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | |
31, 31, 31, 31, 31, 33, 31, 34, 35, 34, 34, 34, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 36, 1, 37, 1, 34, 35, 34, 34, 34, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 36, 1, 37, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 38, | |
1, 35, 38, 39, 1, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, | |
39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 41, 39, 40, | |
39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, | |
39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 41, 39, 39, 39, 39, 34, 39, 42, 1, | |
43, 1, 44, 1, 45, 1, 46, 1, 47, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48, 1, 49, 1, 50, 1, 51, 1, 52, | |
1, 53, 1, 54, 1, 55, 1, 56, 1, 57, 1, 58, 1, 59, 1, 60, 1, 61, 1, 48, | |
1, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, | |
62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, | |
62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, | |
62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, | |
62, 62, 62, 62, 62, 62, 62, 1, 62, 65, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 66, 64, 67, 1, 68, | |
1, 69, 1, 70, 1, 1, 1, 1, 1, 1, 1, 1, 71, 1, 72, 1, 73, 1, 1, 1, | |
1, 74, 1, 1, 1, 1, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 1, 77, | |
1, 78, 1, 79, 1, 80, 1, 82, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 1, 81, 82, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, | |
81, 83, 81, 69, 83, 84, 1, 85, 1, 86, 1, 87, 1, 88, 1, 89, 1, 90, 1, 91, | |
1, 92, 1, 93, 1, 83, 1, 94, 1, 95, 1, 96, 1, 97, 1, 98, 1, 99, 1, 73, | |
1, 101, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, | |
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, | |
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, | |
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, | |
100, 100, 100, 100, 100, 100, 100, 1, 100, 103, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, | |
102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, | |
102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, | |
102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, | |
102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 104, 102, 105, 83, 106, | |
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, | |
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, | |
71, 71, 71, 71, 71, 71, 71, 71, 107, 71, 108, 71, 71, 71, 71, 71, 71, 71, 71, 71, | |
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, | |
71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 107, | |
71, 109, 1, 110, 1, 111, 1, 112, 1, 113, 1, 114, 1, 115, 1, 116, 1, 117, 1, 118, | |
1, 119, 1, 120, 1, 121, 1, 122, 1, 123, 1, 124, 1, 125, 1, 126, 1, 127, 1, 128, | |
1, 129, 1, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 1, 130, 131, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, | |
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 132, 130, 6, | |
1, 133, 1, 134, 1, 135, 1, 136, 1, 137, 1, 138, 1, 139, 1, 140, 1, 141, 1, 142, | |
1, 143, 1, 144, 1, 146, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, | |
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, | |
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, | |
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, | |
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 1, 145, 148, 147, 147, 147, 147, 147, 147, | |
147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, | |
147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, | |
147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, | |
147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 149, | |
147, 150, 1, 151, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 152, 1, 153, 151, 151, 151, 151, 151, 151, 151, 151, | |
151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, | |
151, 151, 154, 151, 155, 1, 152, 1, 156, 1, 157, 1, 158, 1, 159, 1, 160, 1, 161, 1, | |
162, 1, 163, 1, 1, 1, 1, 1, 164, 1, 1, 165, 165, 165, 165, 165, 165, 165, 165, 165, | |
165, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 166, 1, 168, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, | |
167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 169, 167, 167, 167, 167, 167, 167, 167, | |
167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, | |
167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, | |
167, 167, 167, 167, 167, 170, 167, 172, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, | |
171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 173, 171, 171, 171, | |
171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, | |
171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, | |
171, 171, 171, 171, 171, 171, 171, 171, 171, 174, 171, 175, 1, 1, 176, 1, 161, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 177, 1, 178, 1, 1, 1, 1, 1, 1, | |
163, 1, 1, 1, 1, 1, 164, 1, 1, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 166, | |
1, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 1, 180, 1, 1, 181, 1, 182, 1, 179, | |
179, 179, 179, 179, 179, 179, 179, 179, 179, 1, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, | |
1, 180, 1, 1, 181, 1, 1, 1, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 1, 184, | |
1, 185, 1, 186, 1, 171, 1, 1, 171, 1, 171, 1, 1, 1, 1, 1, 1, 1, 1, 171, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 171, 1, 171, 1, 1, 171, 1, 1, 171, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 171, 1, 1, 1, 171, 1, 171, 1, 187, 1, 188, 1, 189, 1, 190, 1, 191, 1, 192, | |
1, 193, 1, 194, 1, 195, 1, 196, 1, 197, 1, 198, 1, 200, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 1, | |
199, 200, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, | |
199, 199, 199, 199, 199, 199, 199, 201, 199, 202, 1, 203, 1, 204, 1, 205, 1, 206, 1, 132, | |
1, 207, 1, 208, 1, 209, 1, 210, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, | |
209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, | |
209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 211, 209, 2, 209, | |
209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, | |
209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, | |
209, 209, 209, 209, 209, 209, 209, 211, 209, 212, 1, 1, 1, 1, 213, 1, 214, 1, 215, 1, | |
216, 1, 217, 1, 218, 1, 219, 1, 220, 1, 221, 1, 222, 1, 223, 1, 132, 1, 127, 1, | |
6, 2, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 224, 1, 225, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 226, 227, | |
1, 1, 1, 1, 228, 1, 1, 229, 1, 1, 1, 1, 1, 1, 230, 1, 231, 1, 0 | |
}; | |
local _parse_sql_trans_targs = { [0] = | |
2, 0, 196, 4, 4, 5, 196, 7, 8, 9, 10, 11, 12, 13, 36, 14, 15, 16, 17, 18, | |
19, 20, 21, 21, 22, 24, 27, 23, 25, 25, 26, 28, 28, 29, 30, 30, 31, 33, 32, 34, | |
34, 35, 37, 38, 39, 40, 41, 42, 56, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, | |
54, 55, 57, 57, 57, 57, 58, 59, 60, 61, 62, 92, 63, 64, 71, 82, 89, 65, 66, 67, | |
68, 69, 69, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, | |
90, 90, 90, 90, 91, 70, 92, 93, 196, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, | |
106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 116, 117, 119, 120, 121, 122, 123, 124, 125, | |
126, 127, 128, 129, 130, 131, 131, 131, 131, 132, 133, 134, 137, 134, 135, 136, 138, 139, 140, 141, | |
142, 143, 144, 145, 150, 151, 154, 146, 146, 147, 157, 146, 146, 147, 157, 148, 149, 196, 144, 151, | |
148, 149, 152, 153, 155, 156, 147, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, | |
171, 172, 173, 174, 175, 176, 177, 179, 180, 181, 181, 182, 184, 195, 185, 186, 187, 188, 189, 190, | |
191, 192, 193, 194, 1, 3, 6, 94, 118, 158, 178, 183 | |
}; | |
local _parse_sql_trans_actions = { [0] = | |
1, 0, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 3, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 1, 1, | |
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 5, 20, 1, 3, 30, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
5, 20, 1, 3, 26, 3, 3, 1, 23, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 5, 20, 1, 3, 42, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, | |
1, 1, 11, 1, 5, 5, 1, 5, 20, 46, 5, 1, 3, 34, 1, 14, 1, 17, 1, 1, | |
51, 38, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 | |
}; | |
local parse_sql_start = 196; | |
local parse_sql_first_final = 196; | |
local parse_sql_error = 0; | |
local parse_sql_en_main = 196; | |
local _sql_unescapes = setmetatable({ | |
["\\0"] = "\0"; | |
["\\'"] = "'"; | |
["\\\""] = "\""; | |
["\\b"] = "\b"; | |
["\\n"] = "\n"; | |
["\\r"] = "\r"; | |
["\\t"] = "\t"; | |
["\\Z"] = "\26"; | |
["\\\\"] = "\\"; | |
["\\%"] = "%"; | |
["\\_"] = "_"; | |
},{ __index = function(t, s) assert(false, "Unknown escape sequences: "..s); end }); | |
function parse_sql(data, h) | |
local p = 1; | |
local pe = #data + 1; | |
local cs; | |
local pos_char, pos_line = 1, 1; | |
local mark, token; | |
local table_name, columns, value_lists, value_list, value_count; | |
cs = parse_sql_start; | |
-- ragel flat exec | |
local testEof = false; | |
local _slen = 0; | |
local _trans = 0; | |
local _keys = 0; | |
local _inds = 0; | |
local _acts = 0; | |
local _nacts = 0; | |
local _tempval = 0; | |
local _goto_level = 0; | |
local _resume = 10; | |
local _eof_trans = 15; | |
local _again = 20; | |
local _test_eof = 30; | |
local _out = 40; | |
while true do -- goto loop | |
local _continue = false; | |
repeat | |
local _trigger_goto = false; | |
if _goto_level <= 0 then | |
-- noEnd | |
if p == pe then | |
_goto_level = _test_eof; | |
_continue = true; break; | |
end | |
-- errState != 0 | |
if cs == 0 then | |
_goto_level = _out; | |
_continue = true; break; | |
end | |
end -- _goto_level <= 0 | |
if _goto_level <= _resume then | |
_keys = cs * 2; -- LOCATE_TRANS | |
_inds = _parse_sql_index_offsets[cs]; | |
_slen = _parse_sql_key_spans[cs]; | |
if _slen > 0 and | |
_parse_sql_trans_keys[_keys] <= data:byte(p) and | |
data:byte(p) <= _parse_sql_trans_keys[_keys + 1] then | |
_trans = _parse_sql_indicies[ _inds + data:byte(p) - _parse_sql_trans_keys[_keys] ]; | |
else _trans =_parse_sql_indicies[ _inds + _slen ]; end | |
cs = _parse_sql_trans_targs[_trans]; | |
if _parse_sql_trans_actions[_trans] ~= 0 then | |
_acts = _parse_sql_trans_actions[_trans]; | |
_nacts = _parse_sql_actions[_acts]; | |
_acts = _acts + 1; | |
while _nacts > 0 do | |
_nacts = _nacts - 1; | |
_acts = _acts + 1; | |
_tempval = _parse_sql_actions[_acts - 1]; | |
-- start action switch | |
if _tempval == 0 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 34 "sql.rl" -- end of line directive | |
pos_char = pos_char + 1; -- ACTION | |
elseif _tempval == 1 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 35 "sql.rl" -- end of line directive | |
pos_line = pos_line + 1; pos_char = 1; -- ACTION | |
elseif _tempval == 2 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 38 "sql.rl" -- end of line directive | |
mark = p; -- ACTION | |
elseif _tempval == 3 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 39 "sql.rl" -- end of line directive | |
token = data:sub(mark, p-1); -- ACTION | |
elseif _tempval == 4 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 52 "sql.rl" -- end of line directive | |
table.insert(columns, token); columns[#columns] = token; -- ACTION | |
elseif _tempval == 5 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 58 "sql.rl" -- end of line directive | |
table_name,columns = token,{}; -- ACTION | |
elseif _tempval == 6 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 59 "sql.rl" -- end of line directive | |
h.create(table_name, columns); -- ACTION | |
elseif _tempval == 7 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 65 "sql.rl" -- end of line directive | |
value_count = value_count + 1; value_list[value_count] = token:gsub("\\.", _sql_unescapes); | |
-- ACTION | |
elseif _tempval == 8 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 68 "sql.rl" -- end of line directive | |
value_count = value_count + 1; value_list[value_count] = tonumber(token); -- ACTION | |
elseif _tempval == 9 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 69 "sql.rl" -- end of line directive | |
value_count = value_count + 1; -- ACTION | |
elseif _tempval == 10 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 71 "sql.rl" -- end of line directive | |
value_list,value_count = {},0; -- ACTION | |
elseif _tempval == 11 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 71 "sql.rl" -- end of line directive | |
table.insert(value_lists, value_list); -- ACTION | |
elseif _tempval == 12 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 74 "sql.rl" -- end of line directive | |
table_name,value_lists = token,{}; -- ACTION | |
elseif _tempval == 13 then --4 FROM_STATE_ACTION_SWITCH | |
-- line 75 "sql.rl" -- end of line directive | |
h.insert(table_name, value_lists); -- ACTION | |
end | |
-- line 355 "sql.lua" -- end of line directive | |
-- end action switch | |
end -- while _nacts | |
end | |
if _trigger_goto then _continue = true; break; end | |
end -- endif | |
if _goto_level <= _again then | |
if cs == 0 then | |
_goto_level = _out; | |
_continue = true; break; | |
end | |
p = p + 1; | |
if p ~= pe then | |
_goto_level = _resume; | |
_continue = true; break; | |
end | |
end -- _goto_level <= _again | |
if _goto_level <= _test_eof then | |
end -- _goto_level <= _test_eof | |
if _goto_level <= _out then break; end | |
_continue = true; | |
until true; | |
if not _continue then break; end | |
end -- endif _goto_level <= out | |
-- end of execute block | |
if cs < parse_sql_first_final then | |
print("parse_sql: there was an error, line "..pos_line.." column "..pos_char); | |
else | |
print("Success. EOF at line "..pos_line.." column "..pos_char) | |
end | |
end | |
end | |
-- import modules | |
package.path = package.path..";../?.lua"; | |
package.cpath = package.cpath..";../?.so"; -- needed for util.pposix used in datamanager | |
-- ugly workaround for getting datamanager to work outside of prosody :( | |
prosody = { }; | |
prosody.platform = "unknown"; | |
if os.getenv("WINDIR") then | |
prosody.platform = "windows"; | |
elseif package.config:sub(1,1) == "/" then | |
prosody.platform = "_posix"; | |
end | |
package.loaded["util.logger"] = {init = function() return function() end; end} | |
local dm = require "util.datamanager"; | |
dm.set_data_path("data"); | |
local datetime = require "util.datetime"; | |
local lxp = require "lxp"; | |
local st = require "util.stanza"; | |
local parse_xml = (function() | |
local ns_prefixes = { | |
["http://www.w3.org/XML/1998/namespace"] = "xml"; | |
}; | |
local ns_separator = "\1"; | |
local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; | |
return function(xml) | |
local handler = {}; | |
local stanza = st.stanza("root"); | |
function handler:StartElement(tagname, attr) | |
local curr_ns,name = tagname:match(ns_pattern); | |
if name == "" then | |
curr_ns, name = "", curr_ns; | |
end | |
if curr_ns ~= "" then | |
attr.xmlns = curr_ns; | |
end | |
for i=1,#attr do | |
local k = attr[i]; | |
attr[i] = nil; | |
local ns, nm = k:match(ns_pattern); | |
if nm ~= "" then | |
ns = ns_prefixes[ns]; | |
if ns then | |
attr[ns..":"..nm] = attr[k]; | |
attr[k] = nil; | |
end | |
end | |
end | |
stanza:tag(name, attr); | |
end | |
function handler:CharacterData(data) | |
stanza:text(data); | |
end | |
function handler:EndElement(tagname) | |
stanza:up(); | |
end | |
local parser = lxp.new(handler, "\1"); | |
local ok, err, line, col = parser:parse(xml); | |
if ok then ok, err, line, col = parser:parse(); end | |
--parser:close(); | |
if ok then | |
return stanza.tags[1]; | |
else | |
return ok, err.." (line "..line..", col "..col..")"; | |
end | |
end; | |
end)(); | |
function store_password(username, host, password) | |
-- create or update account for username@host | |
local ret, err = dm.store(username, host, "accounts", {password = password}); | |
print("["..(err or "success").."] stored account: "..username.."@"..host.." = "..password); | |
end | |
function store_vcard(username, host, stanza) | |
-- create or update vCard for username@host | |
local ret, err = dm.store(username, host, "vcard", st.preserialize(stanza)); | |
print("["..(err or "success").."] stored vCard: "..username.."@"..host); | |
end | |
function store_roster(username, host, roster_items) | |
-- fetch current roster-table for username@host if he already has one | |
local roster = dm.load(username, host, "roster") or {}; | |
-- merge imported roster-items with loaded roster | |
for item_tag in roster_items:childtags() do | |
-- jid for this roster-item | |
local item_jid = item_tag.attr.jid | |
-- validate item stanzas | |
if (item_tag.name == "item") and (item_jid ~= "") then | |
-- prepare roster item | |
-- TODO: is the subscription attribute optional? | |
local item = {subscription = item_tag.attr.subscription, groups = {}}; | |
-- optional: give roster item a real name | |
if item_tag.attr.name then | |
item.name = item_tag.attr.name; | |
end | |
-- optional: iterate over group stanzas inside item stanza | |
for group_tag in item_tag:childtags() do | |
local group_name = group_tag:get_text(); | |
if (group_tag.name == "group") and (group_name ~= "") then | |
item.groups[group_name] = true; | |
else | |
print("[error] invalid group stanza: "..group_tag:pretty_print()); | |
end | |
end | |
-- store item in roster | |
roster[item_jid] = item; | |
print("[success] roster entry: " ..username.."@"..host.." - "..item_jid); | |
else | |
print("[error] invalid roster stanza: " ..item_tag:pretty_print()); | |
end | |
end | |
-- store merged roster-table | |
local ret, err = dm.store(username, host, "roster", roster); | |
print("["..(err or "success").."] stored roster: " ..username.."@"..host); | |
end | |
function store_subscription_request(username, host, presence_stanza) | |
local from_bare = presence_stanza.attr.from; | |
-- fetch current roster-table for username@host if he already has one | |
local roster = dm.load(username, host, "roster") or {}; | |
local item = roster[from_bare]; | |
if item and (item.subscription == "from" or item.subscription == "both") then | |
return; -- already subscribed, do nothing | |
end | |
-- add to table of pending subscriptions | |
if not roster.pending then roster.pending = {}; end | |
roster.pending[from_bare] = true; | |
-- store updated roster-table | |
local ret, err = dm.store(username, host, "roster", roster); | |
print("["..(err or "success").."] stored subscription request: " ..username.."@"..host.." - "..from_bare); | |
end | |
local os_date = os.date; | |
local os_time = os.time; | |
local os_difftime = os.difftime; | |
function datetime_parse(s) | |
if s then | |
local year, month, day, hour, min, sec, tzd; | |
year, month, day, hour, min, sec, tzd = s:match("^(%d%d%d%d)%-?(%d%d)%-?(%d%d)T(%d%d):(%d%d):(%d%d)%.?%d*([Z+%-]?.*)$"); | |
if year then | |
local time_offset = os_difftime(os_time(os_date("*t")), os_time(os_date("!*t"))); -- to deal with local timezone | |
local tzd_offset = 0; | |
if tzd ~= "" and tzd ~= "Z" then | |
local sign, h, m = tzd:match("([+%-])(%d%d):?(%d*)"); | |
if not sign then return; end | |
if #m ~= 2 then m = "0"; end | |
h, m = tonumber(h), tonumber(m); | |
tzd_offset = h * 60 * 60 + m * 60; | |
if sign == "-" then tzd_offset = -tzd_offset; end | |
end | |
sec = (sec + time_offset) - tzd_offset; | |
return os_time({year=year, month=month, day=day, hour=hour, min=min, sec=sec, isdst=false}); | |
end | |
end | |
end | |
function store_offline_messages(username, host, stanza) | |
-- TODO: maybe use list_load(), append and list_store() instead | |
-- of constantly reopening the file with list_append()? | |
--for ch in offline_messages:childtags() do | |
--print("message :"..ch:pretty_print()); | |
stanza.attr.node = nil; | |
local stamp = stanza:get_child("x", "jabber:x:delay"); | |
if not stamp or not stamp.attr.stamp then print(2) return; end | |
for i=1,#stanza do if stanza[i] == stamp then table.remove(stanza, i); break; end end | |
for i=1,#stanza.tags do if stanza.tags[i] == stamp then table.remove(stanza.tags, i); break; end end | |
local parsed_stamp = datetime_parse(stamp.attr.stamp); | |
if not parsed_stamp then print(1, stamp.attr.stamp) return; end | |
stanza.attr.stamp, stanza.attr.stamp_legacy = datetime.datetime(parsed_stamp), datetime.legacy(parsed_stamp); | |
local ret, err = dm.list_append(username, host, "offline", st.preserialize(stanza)); | |
print("["..(err or "success").."] stored offline message: " ..username.."@"..host.." - "..stanza.attr.from); | |
--end | |
end | |
-- load data | |
local filename = arg[1] | |
local f = io.open(filename); | |
local s = f:read("*a"); | |
f:close(); | |
local table_count = 0; | |
local insert_count = 0; | |
local row_count = 0; | |
-- parse | |
parse_sql(s, { | |
create = function(table_name, columns) | |
--[[print(table_name);]] | |
table_count = table_count + 1; | |
end; | |
insert = function(table_name, value_lists) | |
--[[print(table_name, #value_lists);]] | |
insert_count = insert_count + 1; | |
row_count = row_count + #value_lists; | |
for _,value_list in ipairs(value_lists) do | |
if table_name == "users" then | |
local user, realm, password = unpack(value_list); | |
store_password(user, realm, password); | |
elseif table_name == "roster" then | |
local user, realm, xml = unpack(value_list); | |
local stanza,err = parse_xml(xml); | |
if stanza then | |
store_roster(user, realm, stanza); | |
else | |
print("[error] roster: XML parsing failed for "..user.."@"..realm..": "..err); | |
end | |
elseif table_name == "vcard" then | |
local user, realm, name, email, nickname, birthday, photo, xml = unpack(value_list); | |
if xml then | |
local stanza,err = parse_xml(xml); | |
if stanza then | |
store_vcard(user, realm, stanza); | |
else | |
print("[error] vcard: XML parsing failed for "..user.."@"..realm..": "..err); | |
end | |
else | |
--print("[warn] vcard: NULL vCard for "..user.."@"..realm..": "..err); | |
end | |
elseif table_name == "storedsubscriptionrequests" then | |
local user, realm, fromjid, xml = unpack(value_list); | |
local stanza,err = parse_xml(xml); | |
if stanza then | |
store_subscription_request(user, realm, stanza); | |
else | |
print("[error] storedsubscriptionrequests: XML parsing failed for "..user.."@"..realm..": "..err); | |
end | |
elseif table_name == "messages" then | |
--local user, realm, node, correspondent, type, storetime, delivertime, subject, body, xml = unpack(value_list); | |
local user, realm, type, xml = value_list[1], value_list[2], value_list[5], value_list[10]; | |
if type == "offline" and xml ~= "" then | |
local stanza,err = parse_xml(xml); | |
if stanza then | |
store_offline_messages(user, realm, stanza); | |
else | |
print("[error] offline messages: XML parsing failed for "..user.."@"..realm..": "..err); | |
print(unpack(value_list)); | |
end | |
end | |
end | |
end | |
end; | |
}); | |
print("table_count", table_count); | |
print("insert_count", insert_count); | |
print("row_count", row_count); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment