Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }