annotate src/main/java/nl/cwi/monetdb/mcl/parser/HeaderLineParser.java @ 350:54137aeb1f92

Update Copyright year.
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Thu, 02 Jan 2020 14:42:27 +0100 (2020-01-02)
parents 0b8eb1df8276
children f15d2ac35932
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
1 /*
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
2 * This Source Code Form is subject to the terms of the Mozilla Public
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
5 *
350
54137aeb1f92 Update Copyright year.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 325
diff changeset
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V.
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
7 */
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
8
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
9 package nl.cwi.monetdb.mcl.parser;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
10
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
11
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
12 /**
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
13 * The HeaderLineParser is a generic MCLParser that extracts values from
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
14 * a metadata header in the MCL protocol either as string or integer
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
15 * values.
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
16 *
194
1296dbcc4958 Resolved javadoc many errors and warnings, such as:
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 180
diff changeset
17 * @author Fabian Groffen
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
18 */
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
19 public final class HeaderLineParser extends MCLParser {
203
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
20 /* types of meta data supported by MCL protocol */
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
21 public final static int NAME = 1; // name of column
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
22 public final static int LENGTH = 2;
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
23 public final static int TABLE = 3; // may include the schema name
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
24 public final static int TYPE = 4;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
25
203
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
26 /** The int values found while parsing. Public, you may touch it. */
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
27 public final int intValues[];
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
28
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
29 /**
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
30 * Constructs a HeaderLineParser which expects columncount columns.
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
31 *
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
32 * @param columncount the number of columns in the to be parsed string
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
33 */
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
34 public HeaderLineParser(final int columncount) {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
35 super(columncount);
203
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
36 intValues = new int[columncount];
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
37 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
38
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
39 /**
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
40 * Parses the given String source as header line. If source cannot
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
41 * be parsed, an MCLParseException is thrown. The columncount argument
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
42 * given during construction is used for allocation of the backing array.
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
43 *
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
44 * @param source a String which should be parsed
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
45 * @return the type of then parsed header line
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
46 * @throws MCLParseException if an error occurs during parsing
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
47 */
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
48 @Override
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
49 public int parse(final String source) throws MCLParseException {
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
50 final char[] chrLine = source.toCharArray();
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
51 int len = chrLine.length;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
52 int pos = 0;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
53 boolean foundChar = false;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
54 boolean nameFound = false;
203
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
55
180
fdf4c888d5b7 Small code and layout improvements
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 119
diff changeset
56 // find header name searching from the end of the line
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
57 for (int i = len - 1; i >= 0; i--) {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
58 switch (chrLine[i]) {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
59 case ' ':
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
60 case '\n':
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
61 case '\t':
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
62 case '\r':
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
63 if (!foundChar) {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
64 len = i - 1;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
65 } else {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
66 pos = i + 1;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
67 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
68 break;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
69 case '#':
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
70 // found!
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
71 nameFound = true;
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
72 if (pos == 0)
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
73 pos = i + 1;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
74 i = 0; // force the loop to terminate
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
75 break;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
76 default:
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
77 foundChar = true;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
78 pos = 0;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
79 break;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
80 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
81 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
82 if (!nameFound)
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
83 throw new MCLParseException("invalid header, no header name found", pos);
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
84
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
85 // depending on the name of the header, we continue
203
c6abd650aeb4 Reduce memory consumption in TupleLineParser which is a subclass of MCLParser.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 200
diff changeset
86 int type = 0;
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
87 switch (len - pos) {
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
88 case 4:
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
89 // source.regionMatches(pos + 1, "name", 1, 3)
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
90 if (chrLine[pos] == 'n' && chrLine[pos+1] == 'a' && chrLine[pos+2] == 'm' && chrLine[pos+3] == 'e') {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
91 getValues(chrLine, 2, pos - 3);
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
92 type = NAME;
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
93 } else
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
94 // source.regionMatches(pos + 1, "type", 1, 3)
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
95 if (chrLine[pos] == 't' && chrLine[pos+1] == 'y' && chrLine[pos+2] == 'p' && chrLine[pos+3] == 'e') {
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
96 getValues(chrLine, 2, pos - 3);
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
97 type = TYPE;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
98 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
99 break;
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
100 case 6:
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
101 if (source.regionMatches(pos + 1, "length", 1, 5)) {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
102 getIntValues(chrLine, 2, pos - 3);
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
103 type = LENGTH;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
104 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
105 break;
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
106 case 10:
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
107 if (source.regionMatches(pos + 1, "table_name", 1, 9)) {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
108 getValues(chrLine, 2, pos - 3);
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
109 type = TABLE;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
110 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
111 break;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
112 default:
180
fdf4c888d5b7 Small code and layout improvements
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 119
diff changeset
113 throw new MCLParseException("unknown header: " + (new String(chrLine, pos, len - pos)));
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
114 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
115
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
116 // adjust colno
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
117 colnr = 0;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
118
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
119 return type;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
120 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
121
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
122 /**
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
123 * Fills an array of Strings containing the values between
104
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
124 * ',\t' separators.
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
125 *
104
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
126 * As of Oct2014-SP1 release MAPI adds double quotes around names when
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
127 * the name contains a comma or a tab or a space or a # or " or \ escape character.
104
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
128 * See issue: https://www.monetdb.org/bugzilla/show_bug.cgi?id=3616
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
129 * If the parsed name string part has a " as first and last character,
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
130 * we remove those added double quotes here.
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
131 *
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
132 * @param chrLine a character array holding the input data
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
133 * @param start where the relevant data starts
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
134 * @param stop where the relevant data stops
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
135 */
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
136 private final void getValues(final char[] chrLine, int start, final int stop) {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
137 int elem = 0;
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
138 boolean inString = false, escaped = false;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
139
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
140 for (int i = start; i < stop; i++) {
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
141 switch(chrLine[i]) {
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
142 case '\\':
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
143 escaped = !escaped;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
144 break;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
145 case '"':
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
146 /**
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
147 * If all strings are wrapped between two quotes, a \" can
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
148 * never exist outside a string. Thus if we believe that we
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
149 * are not within a string, we can safely assume we're about
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
150 * to enter a string if we find a quote.
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
151 * If we are in a string we should stop being in a string if
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
152 * we find a quote which is not prefixed by a \, for that
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
153 * would be an escaped quote. However, a nasty situation can
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
154 * occur where the string is like "test \\" as obvious, a
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
155 * test for a \ in front of a " doesn't hold here for all
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
156 * cases. Because "test \\\"" can exist as well, we need to
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
157 * know if a quote is prefixed by an escaping slash or not.
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
158 */
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
159 if (!inString) {
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
160 inString = true;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
161 } else if (!escaped) {
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
162 inString = false;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
163 }
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
164 // reset escaped flag
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
165 escaped = false;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
166 break;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
167 case ',':
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
168 if (!inString && chrLine[i + 1] == '\t') {
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
169 // we found the field separator
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
170 if (chrLine[start] == '"')
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
171 start++; // skip leading double quote
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
172 if (elem < values.length) {
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
173 // TODO: also deal with escape characters as done in TupleLineParser.parse()
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
174 values[elem++] = new String(chrLine, start, i - (chrLine[i - 1] == '"' ? 1 : 0) - start);
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
175 }
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
176 i++;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
177 start = i + 1; // reset start for the next name, skipping the field separator (a comma and tab)
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
178 }
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
179 // reset escaped flag
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
180 escaped = false;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
181 break;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
182 default:
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
183 escaped = false;
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
184 break;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
185 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
186 }
104
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
187 // add the left over part (last column)
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
188 if (chrLine[start] == '"')
839ffec1d36d Fix for bug 6183.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 90
diff changeset
189 start++; // skip leading double quote
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
190 if (elem < values.length)
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
191 values[elem] = new String(chrLine, start, stop - (chrLine[stop - 1] == '"' ? 1 : 0) - start);
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
192 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
193
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
194 /**
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
195 * Fills an array of ints containing the values between
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
196 * ',\t' separators.
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
197 *
116
04c535b05c52 Fixed negative number parsing on the StartOfHeaderParser
Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
parents: 104
diff changeset
198 * Feb2017 note - This integer parser doesn't have to parse negative
04c535b05c52 Fixed negative number parsing on the StartOfHeaderParser
Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
parents: 104
diff changeset
199 * numbers, because it is only used to parse column lengths
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
200 * which are always greater than 0.
116
04c535b05c52 Fixed negative number parsing on the StartOfHeaderParser
Pedro Ferreira <pedro.ferreira@monetdbsolutions.com>
parents: 104
diff changeset
201 *
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
202 * @param chrLine a character array holding the input data
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
203 * @param start where the relevant data starts
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
204 * @param stop where the relevant data stops
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
205 */
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
206 private final void getIntValues(final char[] chrLine, final int start, final int stop) throws MCLParseException {
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
207 int elem = 0;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
208 int tmp = 0;
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
209
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
210 for (int i = start; i < stop; i++) {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
211 if (chrLine[i] == ',' && chrLine[i + 1] == '\t') {
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
212 if (elem < intValues.length) {
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
213 intValues[elem++] = tmp;
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
214 }
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
215 tmp = 0;
297
bb273e9c7e09 Add "final" keyword to classes, method arguments and local variables where possible.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 261
diff changeset
216 i++;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
217 } else {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
218 // note: don't use Character.isDigit() here, because
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
219 // we only want ISO-LATIN-1 digits
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
220 if (chrLine[i] >= '0' && chrLine[i] <= '9') {
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
221 tmp *= 10;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
222 tmp += (int)chrLine[i] - (int)'0';
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
223 } else {
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
224 throw new MCLParseException("expected a digit in " + new String(chrLine) + " at " + i);
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
225 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
226 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
227 }
119
1ea2ee3b946c Extend HeaderLineParser to also correctly parse result set header lines for table
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 117
diff changeset
228 // add the left over part (last column)
325
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
229 if (elem < intValues.length)
0b8eb1df8276 Optimised parsing of Header line data.
Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
parents: 297
diff changeset
230 intValues[elem] = tmp;
0
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
231 }
a5a898f6886c Copy of MonetDB java directory changeset e6e32756ad31.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
232 }