1 /*
2  *  Copyright (c) 2011, 2021, Oracle and/or its affiliates.
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License, version 2.0,
6  *  as published by the Free Software Foundation.
7  *
8  *  This program is also distributed with certain software (including
9  *  but not limited to OpenSSL) that is licensed under separate terms,
10  *  as designated in a particular file or component or in included license
11  *  documentation.  The authors of MySQL hereby grant you an additional
12  *  permission to link the program and your derivative works with the
13  *  separately licensed software that they have included with MySQL.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License, version 2.0, for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
23  */
24 
25 package com.mysql.clusterj.jdbc;
26 
27 import com.mysql.clusterj.core.metadata.AbstractDomainFieldHandlerImpl;
28 import com.mysql.clusterj.core.store.Table;
29 import com.mysql.clusterj.core.util.I18NHelper;
30 import com.mysql.clusterj.core.util.Logger;
31 import com.mysql.clusterj.core.util.LoggerFactoryService;
32 
33 /** An instance of this class handles a column of a table. Most of the behavior
34  * is in the superclass, which is common to all implementations. The constructor
35  * determines which type is used for the Java representation of the database type.
36  */
37 public class DomainFieldHandlerImpl extends AbstractDomainFieldHandlerImpl {
38 
39     /** My message translator */
40     static final I18NHelper local = I18NHelper.getInstance(DomainFieldHandlerImpl.class);
41 
42     /** My logger */
43     static final Logger logger = LoggerFactoryService.getFactory().getInstance(DomainFieldHandlerImpl.class);
44 
compareTo(Object other)45     public int compareTo(Object other) {
46         return compareTo((DomainFieldHandlerImpl)other);
47     }
48 
DomainFieldHandlerImpl(DomainTypeHandlerImpl<?> domainTypeHandler, Table table, int fieldNumber, com.mysql.clusterj.core.store.Column column)49     public DomainFieldHandlerImpl(DomainTypeHandlerImpl<?> domainTypeHandler,
50             Table table, int fieldNumber, com.mysql.clusterj.core.store.Column column) {
51         this.domainTypeHandler = domainTypeHandler;
52         this.fieldNumber = fieldNumber;
53         this.name = column.getName();
54         this.storeColumn = column;
55         this.columnName = storeColumn.getName();
56         this.columnNames = new String[] {columnName};
57         storeColumnType = storeColumn.getType();
58         charsetName = storeColumn.getCharsetName();
59         if (logger.isDebugEnabled()) logger.debug("new DomainFieldHandlerImpl: fieldNumber: " + fieldNumber + "; name: " + name);
60         if (logger.isDebugEnabled())
61             logger.debug("Column type for " + name + " is "
62                     + storeColumnType.toString() + "; charset name is "
63                     + charsetName);
64         primaryKey = storeColumn.isPrimaryKey();
65         if (primaryKey) {
66             domainTypeHandler.registerPrimaryKeyColumn(this, columnName);
67         }
68         if (primaryKey) {
69             // primary key
70             switch (column.getType()) {
71             case Int:
72             case Unsigned:
73             case Mediumint:
74             case Mediumunsigned:
75                 objectOperationHandlerDelegate = objectOperationHandlerKeyInt;
76                 break;
77             case Bigint:
78                 objectOperationHandlerDelegate = objectOperationHandlerKeyLong;
79                 break;
80             case Char:
81             case Varchar:
82             case Longvarchar:
83                 objectOperationHandlerDelegate = objectOperationHandlerKeyString;
84                 break;
85             default:
86                     // bad primary key type
87                 objectOperationHandlerDelegate = objectOperationHandlerUnsupportedType;
88                 error(
89                         local.message("ERR_Unsupported_Field_Type", storeColumnType.name(), name));
90             }
91         } else if (storeColumn.getNullable()) {
92             // nullable columns
93             switch (column.getType()) {
94             case Int:
95             case Unsigned:
96             case Mediumint:
97             case Mediumunsigned:
98                 objectOperationHandlerDelegate = objectOperationHandlerObjectInteger;
99                 break;
100             case Bigint:
101                 objectOperationHandlerDelegate = objectOperationHandlerObjectLong;
102                 break;
103             case Char:
104             case Varchar:
105             case Longvarchar:
106                 objectOperationHandlerDelegate = objectOperationHandlerString;
107                 break;
108             case Binary:
109             case Varbinary:
110             case Longvarbinary:
111                 objectOperationHandlerDelegate = objectOperationHandlerBytes;
112                 break;
113             case Blob:
114                 objectOperationHandlerDelegate = objectOperationHandlerBytesLob;
115                 break;
116             case Date:
117                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlDate;
118                 break;
119             case Decimal:
120             case Decimalunsigned:
121                 objectOperationHandlerDelegate = objectOperationHandlerDecimal;
122                 break;
123             case Double:
124                 objectOperationHandlerDelegate = objectOperationHandlerObjectDouble;
125                 break;
126             case Float:
127                 objectOperationHandlerDelegate = objectOperationHandlerObjectFloat;
128                 break;
129             case Smallint:
130                 objectOperationHandlerDelegate = objectOperationHandlerObjectShort;
131                 break;
132             case Text:
133                 objectOperationHandlerDelegate = objectOperationHandlerStringLob;
134                 break;
135             case Time:
136                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlTime;
137                 break;
138             case Timestamp:
139                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlTimestamp;
140                 break;
141             case Tinyint:
142             case Tinyunsigned:
143                 objectOperationHandlerDelegate = objectOperationHandlerObjectByte;
144                 break;
145             default:
146                 // unsupported column type
147                 objectOperationHandlerDelegate = objectOperationHandlerUnsupportedType;
148                 error(
149                         local.message("ERR_Unsupported_Field_Type", storeColumnType.name(), name));
150             }
151         } else {
152             // not nullable columns
153             switch (column.getType()) {
154             case Int:
155             case Unsigned:
156             case Mediumint:
157             case Mediumunsigned:
158                 objectOperationHandlerDelegate = objectOperationHandlerInt;
159                 break;
160             case Bigint:
161                 objectOperationHandlerDelegate = objectOperationHandlerLong;
162                 break;
163             case Char:
164             case Varchar:
165             case Longvarchar:
166                 objectOperationHandlerDelegate = objectOperationHandlerString;
167                 break;
168             case Binary:
169             case Varbinary:
170             case Longvarbinary:
171                 objectOperationHandlerDelegate = objectOperationHandlerBytes;
172                 break;
173             case Blob:
174                 objectOperationHandlerDelegate = objectOperationHandlerBytesLob;
175                 break;
176             case Date:
177                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlDate;
178                 break;
179             case Decimal:
180             case Decimalunsigned:
181                 objectOperationHandlerDelegate = objectOperationHandlerDecimal;
182                 break;
183             case Double:
184                 objectOperationHandlerDelegate = objectOperationHandlerDouble;
185                 break;
186             case Float:
187                 objectOperationHandlerDelegate = objectOperationHandlerFloat;
188                 break;
189             case Smallint:
190                 objectOperationHandlerDelegate = objectOperationHandlerShort;
191                 break;
192             case Text:
193                 objectOperationHandlerDelegate = objectOperationHandlerStringLob;
194                 break;
195             case Time:
196                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlTime;
197                 break;
198             case Timestamp:
199                 objectOperationHandlerDelegate = objectOperationHandlerJavaSqlTimestamp;
200                 break;
201             case Tinyint:
202             case Tinyunsigned:
203                 objectOperationHandlerDelegate = objectOperationHandlerByte;
204                 break;
205             default:
206                 // unsupported column type
207                 objectOperationHandlerDelegate = objectOperationHandlerUnsupportedType;
208                 error(
209                         local.message("ERR_Unsupported_Field_Type", storeColumnType.name(), name));
210             }
211         }
212         indices = domainTypeHandler.registerIndices(this, columnName);
213         indexNames = domainTypeHandler.getIndexNames(indices);
214         logger.debug("Index names for " + name + " are " + indexNames);
215         logger.debug("Indices for " + name + " are " + printIndices());
216 
217         reportErrors();
218     }
219 
220 }
221