Source code: org/hsqldb/QuotedTextDatabaseRowInput.java
1 /* Copyright (c) 2001-2002, The HSQL Development Group
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of the HSQL Development Group nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
22 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32 package org.hsqldb;
33
34 import java.io.IOException;
35
36 /**
37 *
38 * @author sqlbob@users (RMP)
39 * @version 1.7.0
40 */
41 class QuotedTextDatabaseRowInput extends org.hsqldb.TextDatabaseRowInput {
42
43 private static final int NORMAL_FIELD = 0;
44 private static final int NEED_END_QUOTE = 1;
45 private static final int FOUND_QUOTE = 2;
46 char qtext[];
47
48 public QuotedTextDatabaseRowInput(String fieldSep, String varSep,
49 String longvarSep,
50 boolean emptyIsNull)
51 throws IOException {
52 super(fieldSep, varSep, longvarSep, emptyIsNull);
53 }
54
55 public void setSource(String text, int pos) {
56
57 super.setSource(text, pos);
58
59 qtext = this.text.toCharArray();
60 }
61
62 protected String getField(String sep, int sepLen,
63 boolean isEnd) throws IOException {
64
65 String s = (emptyIsNull) ? null
66 : "";
67
68 if (next >= qtext.length) {
69 return (super.getField(sep, sepLen, isEnd));
70 }
71
72 try {
73 field++;
74
75 StringBuffer ret = new StringBuffer();
76 boolean done = false;
77 int state = NORMAL_FIELD;
78 int end = -1;
79
80 if (!isEnd) {
81 end = text.indexOf(sep, next);
82 }
83
84 for (; next < qtext.length; next++) {
85 switch (state) {
86
87 case NORMAL_FIELD :
88 default :
89 if (next == end) {
90 next += sepLen;
91 done = true;
92 } else if (qtext[next] == '\"') {
93
94 //-- Beginning of field
95 state = NEED_END_QUOTE;
96 } else {
97 ret.append(qtext[next]);
98 }
99 break;
100
101 case NEED_END_QUOTE :
102 if (qtext[next] == '\"') {
103 state = FOUND_QUOTE;
104 } else {
105 ret.append(qtext[next]);
106 }
107 break;
108
109 case FOUND_QUOTE :
110 if (qtext[next] == '\"') {
111
112 //-- Escaped quote
113 ret.append(qtext[next]);
114
115 state = NEED_END_QUOTE;
116 } else {
117
118 //-- End of field.
119 if (((next + 1) != qtext.length)
120 && (text.indexOf(sep, next) != next)) {
121 throw (new Exception("No sep."));
122 }
123
124 next += sepLen - 1;
125 state = NORMAL_FIELD;
126
127 if (!isEnd) {
128 next++;
129
130 done = true;
131 }
132 }
133 break;
134 }
135
136 if (done) {
137 break;
138 }
139 }
140
141 s = ret.toString();
142
143 if (emptyIsNull && s.equals("")) {
144 s = null;
145 }
146 } catch (Exception e) {
147 throw (new IOException("line " + line + ", field " + field + " ("
148 + e.getMessage() + ")"));
149 }
150
151 return (s);
152 }
153 }