From 861783f7138180d9c68c7d6d6d11e33d5cb30fb8 Mon Sep 17 00:00:00 2001 From: Dhaverd Date: Fri, 20 Jan 2023 21:05:28 +0800 Subject: [PATCH] initial-commit --- .idea/.gitignore | 3 + .../WorkoutDBDatesAutoUpdater_jar.xml | 11 + .idea/libraries/java.xml | 10 + .idea/libraries/mysql_connector_j_8_0.xml | 21 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/uiDesigner.xml | 124 + WorkoutDBDatesAutoUpdater.iml | 13 + config.json | 7 + json-simple-master/.classpath | 8 + json-simple-master/.gitignore | 2 + json-simple-master/.project | 17 + json-simple-master/AUTHORS.txt | 3 + json-simple-master/ChangeLog.txt | 28 + json-simple-master/LICENSE.txt | 202 + json-simple-master/README.txt | 2 + json-simple-master/VERSION.txt | 1 + json-simple-master/build.xml | 41 + json-simple-master/doc/json.lex | 61 + json-simple-master/pom.xml | 110 + .../main/java/org/json/simple/ItemList.java | 147 + .../main/java/org/json/simple/JSONArray.java | 381 + .../main/java/org/json/simple/JSONAware.java | 12 + .../main/java/org/json/simple/JSONObject.java | 132 + .../java/org/json/simple/JSONStreamAware.java | 15 + .../main/java/org/json/simple/JSONValue.java | 316 + .../json/simple/parser/ContainerFactory.java | 23 + .../json/simple/parser/ContentHandler.java | 110 + .../org/json/simple/parser/JSONParser.java | 533 + .../json/simple/parser/ParseException.java | 90 + .../java/org/json/simple/parser/Yylex.java | 688 + .../java/org/json/simple/parser/Yytoken.java | 58 + .../java/org/json/simple/JSONArrayTest.java | 288 + .../java/org/json/simple/JSONValueTest.java | 256 + .../src/test/java/org/json/simple/Test.java | 383 + .../org/json/simple/parser/YylexTest.java | 80 + json-simple-master/test.xml | 48 + logs/log.log | 166 + logs/oldLog.log | 1 + mysql-connector-j-8.0.31/CHANGES | 6231 ++++ mysql-connector-j-8.0.31/INFO_BIN | 4 + mysql-connector-j-8.0.31/INFO_SRC | 5 + mysql-connector-j-8.0.31/LICENSE | 1384 + mysql-connector-j-8.0.31/README | 33 + mysql-connector-j-8.0.31/build.xml | 1675 + .../mysql-connector-j-8.0.31.jar | Bin 0 -> 2515519 bytes .../ErrorMappingsDocGenerator.java | 84 + .../documentation/PropertiesDocGenerator.java | 143 + .../java/instrumentation/AddMethods.java | 139 + .../java/instrumentation/CommonChecks.java | 193 + .../instrumentation/TranslateExceptions.java | 735 + .../src/build/misc/Product.wxs | 66 + .../src/build/misc/debian.in/changelog | 5 + .../src/build/misc/debian.in/compat | 1 + .../src/build/misc/debian.in/control | 17 + .../src/build/misc/debian.in/copyright | 9 + .../src/build/misc/debian.in/install | 8 + .../src/build/misc/debian.in/rules | 77 + .../src/build/misc/debian.in/source/format | 1 + .../src/build/misc/debian.in/watch | 2 + .../src/build/misc/pom-relocation.xml | 45 + .../src/build/misc/pom.xml | 74 + .../src/build/misc/rpm.spec.in | 202 + .../demo/java/demo/x/devapi/DevApiSample.java | 84 + .../java/com/mysql/cj/x/protobuf/Mysqlx.java | 3431 ++ .../mysql/cj/x/protobuf/MysqlxConnection.java | 4199 +++ .../com/mysql/cj/x/protobuf/MysqlxCrud.java | 26427 ++++++++++++++++ .../com/mysql/cj/x/protobuf/MysqlxCursor.java | 3301 ++ .../mysql/cj/x/protobuf/MysqlxDatatypes.java | 6923 ++++ .../com/mysql/cj/x/protobuf/MysqlxExpect.java | 2583 ++ .../com/mysql/cj/x/protobuf/MysqlxExpr.java | 11203 +++++++ .../com/mysql/cj/x/protobuf/MysqlxNotice.java | 5921 ++++ .../mysql/cj/x/protobuf/MysqlxPrepare.java | 4615 +++ .../mysql/cj/x/protobuf/MysqlxResultset.java | 5646 ++++ .../mysql/cj/x/protobuf/MysqlxSession.java | 3235 ++ .../com/mysql/cj/x/protobuf/MysqlxSql.java | 1988 ++ .../com/mysql/cj/x/protobuf/package-info.java | 40 + .../legacy/java/com/mysql/jdbc/Driver.java | 46 + .../java/com/mysql/jdbc/SocketFactory.java | 98 + .../com/mysql/jdbc/SocketFactoryWrapper.java | 79 + .../core-api/java/com/mysql/cj/BindValue.java | 137 + .../java/com/mysql/cj/CacheAdapter.java | 44 + .../com/mysql/cj/CacheAdapterFactory.java | 36 + .../java/com/mysql/cj/CancelQueryTask.java | 44 + .../java/com/mysql/cj/CharsetMapping.java | 820 + .../java/com/mysql/cj/CharsetSettings.java | 114 + .../core-api/java/com/mysql/cj/Constants.java | 105 + .../java/com/mysql/cj/DataStoreMetadata.java | 40 + .../java/com/mysql/cj/MessageBuilder.java | 45 + .../core-api/java/com/mysql/cj/Messages.java | 108 + .../java/com/mysql/cj/MysqlConnection.java | 82 + .../core-api/java/com/mysql/cj/MysqlType.java | 1034 + .../com/mysql/cj/PerConnectionLRUFactory.java | 96 + .../java/com/mysql/cj/PingTarget.java | 36 + .../java/com/mysql/cj/PreparedQuery.java | 63 + .../core-api/java/com/mysql/cj/Query.java | 118 + .../com/mysql/cj/QueryAttributesBindings.java | 83 + .../java/com/mysql/cj/QueryBindings.java | 134 + .../core-api/java/com/mysql/cj/QueryInfo.java | 712 + .../java/com/mysql/cj/QueryResult.java | 34 + .../java/com/mysql/cj/QueryReturnType.java | 37 + .../java/com/mysql/cj/ServerVersion.java | 166 + .../core-api/java/com/mysql/cj/Session.java | 222 + .../com/mysql/cj/TransactionEventHandler.java | 37 + .../java/com/mysql/cj/WarningListener.java | 38 + .../callback/FidoAuthenticationCallback.java | 132 + .../com/mysql/cj/callback/MysqlCallback.java | 37 + .../cj/callback/MysqlCallbackHandler.java | 57 + .../mysql/cj/callback/UsernameCallback.java | 51 + .../conf/ConnectionPropertiesTransform.java | 52 + .../java/com/mysql/cj/conf/ConnectionUrl.java | 830 + .../mysql/cj/conf/ConnectionUrlParser.java | 705 + .../mysql/cj/conf/DatabaseUrlContainer.java | 42 + .../java/com/mysql/cj/conf/HostInfo.java | 241 + .../java/com/mysql/cj/conf/HostsListView.java | 37 + .../com/mysql/cj/conf/PropertyDefinition.java | 160 + .../mysql/cj/conf/PropertyDefinitions.java | 890 + .../java/com/mysql/cj/conf/PropertyKey.java | 388 + .../java/com/mysql/cj/conf/PropertySet.java | 87 + .../com/mysql/cj/conf/RuntimeProperty.java | 120 + .../exceptions/AssertionFailedException.java | 96 + .../exceptions/CJCommunicationsException.java | 67 + ...onnectionFeatureNotAvailableException.java | 56 + .../com/mysql/cj/exceptions/CJException.java | 103 + .../CJOperationNotSupportedException.java | 44 + .../exceptions/CJPacketTooBigException.java | 69 + .../cj/exceptions/CJTimeoutException.java | 54 + .../ClosedOnExpiredPasswordException.java | 67 + .../ConnectionIsClosedException.java | 64 + .../exceptions/DataConversionException.java | 42 + .../cj/exceptions/DataReadException.java | 47 + .../exceptions/DataTruncationException.java | 112 + .../DeadlockTimeoutRollbackMarker.java | 37 + .../mysql/cj/exceptions/ExceptionFactory.java | 307 + .../cj/exceptions/ExceptionInterceptor.java | 65 + .../exceptions/ExceptionInterceptorChain.java | 90 + .../FeatureNotAvailableException.java | 55 + .../InvalidConnectionAttributeException.java | 60 + .../cj/exceptions/MysqlErrorNumbers.java | 1521 + .../mysql/cj/exceptions/NumberOutOfRange.java | 42 + .../OperationCancelledException.java | 54 + .../exceptions/PasswordExpiredException.java | 67 + .../PropertyNotModifiableException.java | 56 + .../com/mysql/cj/exceptions/RSAException.java | 56 + .../cj/exceptions/SSLParamsException.java | 60 + .../StatementIsClosedException.java | 64 + .../cj/exceptions/StreamingNotifiable.java | 36 + .../exceptions/UnableToConnectException.java | 60 + .../UnsupportedConnectionStringException.java | 60 + .../cj/exceptions/WrongArgumentException.java | 60 + .../cj/interceptors/QueryInterceptor.java | 181 + .../java/com/mysql/cj/log/Jdk14Logger.java | 274 + .../core-api/java/com/mysql/cj/log/Log.java | 188 + .../java/com/mysql/cj/log/NullLogger.java | 106 + .../java/com/mysql/cj/log/ProfilerEvent.java | 157 + .../mysql/cj/log/ProfilerEventHandler.java | 45 + .../java/com/mysql/cj/log/Slf4JLogger.java | 114 + .../java/com/mysql/cj/log/StandardLogger.java | 298 + .../cj/protocol/AuthenticationPlugin.java | 154 + .../cj/protocol/AuthenticationProvider.java | 52 + .../mysql/cj/protocol/ColumnDefinition.java | 85 + .../cj/protocol/FullReadInputStream.java | 113 + .../com/mysql/cj/protocol/InternalDate.java | 88 + .../com/mysql/cj/protocol/InternalTime.java | 148 + .../mysql/cj/protocol/InternalTimestamp.java | 145 + .../java/com/mysql/cj/protocol/Message.java | 52 + .../com/mysql/cj/protocol/MessageHeader.java | 45 + .../mysql/cj/protocol/MessageListener.java | 64 + .../com/mysql/cj/protocol/MessageReader.java | 170 + .../com/mysql/cj/protocol/MessageSender.java | 117 + .../mysql/cj/protocol/NetworkResources.java | 100 + .../cj/protocol/OutputStreamWatcher.java | 44 + .../cj/protocol/PacketReceivedTimeHolder.java | 39 + .../cj/protocol/PacketSentTimeHolder.java | 57 + .../java/com/mysql/cj/protocol/Protocol.java | 314 + .../com/mysql/cj/protocol/ProtocolEntity.java | 34 + .../cj/protocol/ProtocolEntityFactory.java | 70 + .../cj/protocol/ProtocolEntityReader.java | 77 + .../com/mysql/cj/protocol/ResultBuilder.java | 57 + .../com/mysql/cj/protocol/ResultStreamer.java | 43 + .../java/com/mysql/cj/protocol/Resultset.java | 198 + .../com/mysql/cj/protocol/ResultsetRow.java | 46 + .../com/mysql/cj/protocol/ResultsetRows.java | 191 + .../mysql/cj/protocol/ResultsetRowsOwner.java | 63 + .../mysql/cj/protocol/ServerCapabilities.java | 52 + .../com/mysql/cj/protocol/ServerSession.java | 200 + .../ServerSessionStateController.java | 146 + .../mysql/cj/protocol/SocketConnection.java | 113 + .../com/mysql/cj/protocol/SocketFactory.java | 127 + .../com/mysql/cj/protocol/SocketMetadata.java | 89 + .../com/mysql/cj/protocol/ValueDecoder.java | 79 + .../com/mysql/cj/protocol/ValueEncoder.java | 53 + .../java/com/mysql/cj/protocol/Warning.java | 53 + .../mysql/cj/protocol/WatchableStream.java | 42 + .../java/com/mysql/cj/result/Field.java | 422 + .../java/com/mysql/cj/result/Row.java | 108 + .../java/com/mysql/cj/result/RowList.java | 88 + .../com/mysql/cj/result/ValueFactory.java | 90 + .../java/com/mysql/cj/util/Base64Decoder.java | 97 + .../java/com/mysql/cj/util/DataTypeUtil.java | 55 + .../java/com/mysql/cj/util/DnsSrv.java | 156 + .../com/mysql/cj/util/EscapeTokenizer.java | 190 + .../java/com/mysql/cj/util/LRUCache.java | 48 + .../java/com/mysql/cj/util/LazyString.java | 91 + .../java/com/mysql/cj/util/LogUtils.java | 67 + .../util/PerVmServerConfigCacheFactory.java | 70 + .../java/com/mysql/cj/util/SaslPrep.java | 349 + .../java/com/mysql/cj/util/SearchMode.java | 124 + .../com/mysql/cj/util/SequentialIdLease.java | 62 + .../com/mysql/cj/util/StringInspector.java | 990 + .../java/com/mysql/cj/util/StringUtils.java | 1855 ++ .../java/com/mysql/cj/util/TestUtils.java | 38 + .../java/com/mysql/cj/util/TimeUtil.java | 521 + .../core-api/java/com/mysql/cj/util/Util.java | 507 + .../java/com/mysql/cj/AbstractQuery.java | 261 + .../com/mysql/cj/CancelQueryTaskImpl.java | 147 + .../com/mysql/cj/ClientPreparedQuery.java | 225 + .../java/com/mysql/cj/CoreSession.java | 221 + .../com/mysql/cj/DataStoreMetadataImpl.java | 83 + .../com/mysql/cj/LicenseConfiguration.java | 59 + .../java/com/mysql/cj/MysqlxSession.java | 176 + .../com/mysql/cj/NativeCharsetSettings.java | 731 + .../cj/NativeQueryAttributesBindings.java | 85 + .../com/mysql/cj/NativeQueryBindValue.java | 395 + .../com/mysql/cj/NativeQueryBindings.java | 561 + .../java/com/mysql/cj/NativeSession.java | 834 + .../com/mysql/cj/NoSubInterceptorWrapper.java | 98 + .../com/mysql/cj/ServerPreparedQuery.java | 642 + .../ServerPreparedQueryTestcaseGenerator.java | 133 + .../java/com/mysql/cj/SimpleQuery.java | 40 + .../com/mysql/cj/admin/ServerController.java | 333 + .../cj/conf/AbstractPropertyDefinition.java | 183 + .../cj/conf/AbstractRuntimeProperty.java | 234 + .../com/mysql/cj/conf/BooleanProperty.java | 39 + .../cj/conf/BooleanPropertyDefinition.java | 97 + .../com/mysql/cj/conf/DefaultPropertySet.java | 271 + .../java/com/mysql/cj/conf/EnumProperty.java | 39 + .../mysql/cj/conf/EnumPropertyDefinition.java | 80 + .../com/mysql/cj/conf/IntegerProperty.java | 54 + .../cj/conf/IntegerPropertyDefinition.java | 87 + .../java/com/mysql/cj/conf/LongProperty.java | 54 + .../mysql/cj/conf/LongPropertyDefinition.java | 77 + .../com/mysql/cj/conf/MemorySizeProperty.java | 80 + .../cj/conf/MemorySizePropertyDefinition.java | 80 + .../com/mysql/cj/conf/StringProperty.java | 44 + .../cj/conf/StringPropertyDefinition.java | 62 + .../cj/conf/url/FailoverConnectionUrl.java | 50 + .../conf/url/FailoverDnsSrvConnectionUrl.java | 115 + .../cj/conf/url/LoadBalanceConnectionUrl.java | 137 + .../url/LoadBalanceDnsSrvConnectionUrl.java | 148 + .../cj/conf/url/ReplicationConnectionUrl.java | 216 + .../url/ReplicationDnsSrvConnectionUrl.java | 170 + .../cj/conf/url/SingleConnectionUrl.java | 50 + .../cj/conf/url/XDevApiConnectionUrl.java | 169 + .../conf/url/XDevApiDnsSrvConnectionUrl.java | 136 + .../com/mysql/cj/log/BaseMetricsHolder.java | 375 + .../java/com/mysql/cj/log/LogFactory.java | 95 + .../cj/log/LoggingProfilerEventHandler.java | 81 + .../com/mysql/cj/log/ProfilerEventImpl.java | 325 + .../mysql/cj/protocol/AbstractProtocol.java | 172 + .../cj/protocol/AbstractSocketConnection.java | 144 + .../mysql/cj/protocol/ExportControlled.java | 725 + .../cj/protocol/NamedPipeSocketFactory.java | 273 + .../cj/protocol/ReadAheadInputStream.java | 286 + .../java/com/mysql/cj/protocol/Security.java | 188 + .../cj/protocol/SocksProxySocketFactory.java | 102 + .../cj/protocol/StandardSocketFactory.java | 231 + .../cj/protocol/WatchableOutputStream.java | 56 + .../mysql/cj/protocol/WatchableWriter.java | 60 + .../com/mysql/cj/protocol/WriterWatcher.java | 44 + .../protocol/result/AbstractResultsetRow.java | 258 + .../result/AbstractDateTimeValueFactory.java | 141 + .../result/AbstractNumericValueFactory.java | 72 + .../cj/result/BigDecimalValueFactory.java | 103 + .../cj/result/BinaryStreamValueFactory.java | 54 + .../mysql/cj/result/BooleanValueFactory.java | 117 + .../com/mysql/cj/result/BufferedRowList.java | 89 + .../com/mysql/cj/result/ByteValueFactory.java | 117 + .../cj/result/DefaultColumnDefinition.java | 239 + .../mysql/cj/result/DefaultValueFactory.java | 118 + .../mysql/cj/result/DoubleValueFactory.java | 92 + .../mysql/cj/result/DurationValueFactory.java | 74 + .../mysql/cj/result/FloatValueFactory.java | 92 + .../mysql/cj/result/IntegerValueFactory.java | 96 + .../cj/result/LocalDateTimeValueFactory.java | 92 + .../cj/result/LocalDateValueFactory.java | 91 + .../cj/result/LocalTimeValueFactory.java | 91 + .../com/mysql/cj/result/LongValueFactory.java | 92 + .../cj/result/OffsetDateTimeValueFactory.java | 140 + .../cj/result/OffsetTimeValueFactory.java | 128 + .../mysql/cj/result/ShortValueFactory.java | 96 + .../mysql/cj/result/SqlDateValueFactory.java | 125 + .../mysql/cj/result/SqlTimeValueFactory.java | 128 + .../cj/result/SqlTimestampValueFactory.java | 203 + .../mysql/cj/result/StringValueFactory.java | 170 + .../cj/result/UtilCalendarValueFactory.java | 150 + .../cj/result/ZonedDateTimeValueFactory.java | 137 + .../mysql/cj/sasl/ScramSha1SaslClient.java | 144 + .../mysql/cj/sasl/ScramSha256SaslClient.java | 145 + .../com/mysql/cj/sasl/ScramShaSaslClient.java | 344 + .../cj/sasl/ScramShaSaslClientFactory.java | 131 + .../mysql/cj/sasl/ScramShaSaslProvider.java | 85 + .../src/main/doc/connector-j-overview.html | 18 + .../src/main/doc/mysqlx-overview.html | 15 + .../cj/protocol/a/AbstractRowFactory.java | 53 + .../cj/protocol/a/AbstractValueEncoder.java | 311 + .../cj/protocol/a/BinaryResultsetReader.java | 146 + .../mysql/cj/protocol/a/BinaryRowFactory.java | 155 + .../mysql/cj/protocol/a/BlobValueEncoder.java | 58 + .../cj/protocol/a/BooleanValueEncoder.java | 149 + .../cj/protocol/a/ByteArrayValueEncoder.java | 75 + .../mysql/cj/protocol/a/ClobValueEncoder.java | 47 + .../protocol/a/ColumnDefinitionFactory.java | 68 + .../cj/protocol/a/ColumnDefinitionReader.java | 184 + .../cj/protocol/a/CompressedInputStream.java | 291 + .../cj/protocol/a/CompressedPacketSender.java | 270 + .../a/DebugBufferingPacketReader.java | 184 + .../a/DebugBufferingPacketSender.java | 104 + .../cj/protocol/a/DurationValueEncoder.java | 100 + .../protocol/a/InputStreamValueEncoder.java | 175 + .../cj/protocol/a/InstantValueEncoder.java | 172 + .../protocol/a/LocalDateTimeValueEncoder.java | 138 + .../cj/protocol/a/LocalDateValueEncoder.java | 117 + .../cj/protocol/a/LocalTimeValueEncoder.java | 105 + .../a/MergingColumnDefinitionFactory.java | 66 + .../cj/protocol/a/MultiPacketReader.java | 160 + .../protocol/a/MysqlBinaryValueDecoder.java | 289 + .../cj/protocol/a/MysqlTextValueDecoder.java | 387 + .../a/NativeAuthenticationProvider.java | 706 + .../cj/protocol/a/NativeCapabilities.java | 163 + .../mysql/cj/protocol/a/NativeConstants.java | 197 + .../cj/protocol/a/NativeMessageBuilder.java | 360 + .../cj/protocol/a/NativePacketHeader.java | 67 + .../cj/protocol/a/NativePacketPayload.java | 703 + .../mysql/cj/protocol/a/NativeProtocol.java | 2313 ++ .../cj/protocol/a/NativeServerSession.java | 388 + .../a/NativeServerSessionStateController.java | 138 + .../cj/protocol/a/NativeSocketConnection.java | 111 + .../com/mysql/cj/protocol/a/NativeUtils.java | 107 + .../mysql/cj/protocol/a/NullValueEncoder.java | 59 + .../cj/protocol/a/NumberValueEncoder.java | 161 + .../a/OffsetDateTimeValueEncoder.java | 165 + .../cj/protocol/a/OffsetTimeValueEncoder.java | 114 + .../mysql/cj/protocol/a/PacketSplitter.java | 72 + .../cj/protocol/a/ReaderValueEncoder.java | 93 + .../mysql/cj/protocol/a/ResultsetFactory.java | 73 + .../cj/protocol/a/ResultsetRowReader.java | 90 + .../cj/protocol/a/SimplePacketReader.java | 163 + .../cj/protocol/a/SimplePacketSender.java | 67 + .../cj/protocol/a/SqlDateValueEncoder.java | 146 + .../cj/protocol/a/SqlTimeValueEncoder.java | 183 + .../protocol/a/SqlTimestampValueEncoder.java | 195 + .../cj/protocol/a/StringValueEncoder.java | 418 + .../cj/protocol/a/TextResultsetReader.java | 127 + .../mysql/cj/protocol/a/TextRowFactory.java | 80 + .../protocol/a/TimeTrackingPacketReader.java | 99 + .../protocol/a/TimeTrackingPacketSender.java | 74 + .../cj/protocol/a/TracingPacketReader.java | 126 + .../cj/protocol/a/TracingPacketSender.java | 101 + .../protocol/a/UtilCalendarValueEncoder.java | 183 + .../cj/protocol/a/UtilDateValueEncoder.java | 200 + .../protocol/a/ZonedDateTimeValueEncoder.java | 169 + .../AuthenticationFidoClient.java | 147 + .../AuthenticationKerberosClient.java | 294 + .../AuthenticationLdapSaslClientPlugin.java | 313 + .../AuthenticationOciClient.java | 177 + .../CachingSha2PasswordPlugin.java | 166 + .../MysqlClearPasswordPlugin.java | 98 + .../MysqlNativePasswordPlugin.java | 102 + .../MysqlOldPasswordPlugin.java | 175 + .../authentication/Sha256PasswordPlugin.java | 222 + .../protocol/a/result/AbstractBufferRow.java | 68 + .../a/result/AbstractResultsetRows.java | 89 + .../cj/protocol/a/result/BinaryBufferRow.java | 291 + .../cj/protocol/a/result/ByteArrayRow.java | 93 + .../cj/protocol/a/result/NativeResultset.java | 166 + .../mysql/cj/protocol/a/result/OkPacket.java | 115 + .../a/result/ResultsetRowsCursor.java | 285 + .../a/result/ResultsetRowsStatic.java | 188 + .../a/result/ResultsetRowsStreaming.java | 271 + .../cj/protocol/a/result/TextBufferRow.java | 134 + .../cj/protocol/x/CompressionAlgorithm.java | 153 + .../mysql/cj/protocol/x/CompressionMode.java | 38 + .../x/CompressionSplittedInputStream.java | 368 + .../x/CompressionSplittedOutputStream.java | 277 + .../protocol/x/CompressorStreamsFactory.java | 130 + .../cj/protocol/x/ConfinedInputStream.java | 170 + .../cj/protocol/x/ContinuousInputStream.java | 172 + .../cj/protocol/x/ContinuousOutputStream.java | 51 + .../x/ErrorToFutureCompletionHandler.java | 57 + .../mysql/cj/protocol/x/FetchDoneEntity.java | 42 + .../cj/protocol/x/FetchDoneEntityFactory.java | 43 + .../cj/protocol/x/FetchDoneMoreResults.java | 41 + .../x/FetchDoneMoreResultsFactory.java | 43 + .../com/mysql/cj/protocol/x/FieldFactory.java | 245 + .../mysql/cj/protocol/x/MessageConstants.java | 194 + .../java/com/mysql/cj/protocol/x/Notice.java | 197 + .../mysql/cj/protocol/x/NoticeFactory.java | 43 + .../java/com/mysql/cj/protocol/x/Ok.java | 43 + .../com/mysql/cj/protocol/x/OkBuilder.java | 57 + .../com/mysql/cj/protocol/x/OkFactory.java | 43 + .../cj/protocol/x/ResultMessageListener.java | 85 + .../cj/protocol/x/ReusableOutputStream.java | 56 + .../cj/protocol/x/StatementExecuteOk.java | 86 + .../protocol/x/StatementExecuteOkBuilder.java | 103 + .../protocol/x/StatementExecuteOkFactory.java | 43 + .../x/SyncFlushDeflaterOutputStream.java | 43 + .../cj/protocol/x/SyncMessageReader.java | 311 + .../cj/protocol/x/SyncMessageSender.java | 119 + .../protocol/x/XAuthenticationProvider.java | 141 + .../com/mysql/cj/protocol/x/XMessage.java | 195 + .../mysql/cj/protocol/x/XMessageBuilder.java | 1008 + .../mysql/cj/protocol/x/XMessageHeader.java | 84 + .../com/mysql/cj/protocol/x/XProtocol.java | 1038 + .../mysql/cj/protocol/x/XProtocolDecoder.java | 339 + .../mysql/cj/protocol/x/XProtocolError.java | 89 + .../com/mysql/cj/protocol/x/XProtocolRow.java | 162 + .../cj/protocol/x/XProtocolRowFactory.java | 44 + .../protocol/x/XProtocolRowInputStream.java | 92 + .../cj/protocol/x/XServerCapabilities.java | 143 + .../mysql/cj/protocol/x/XServerSession.java | 251 + .../protocol/x/XpluginStatementCommand.java | 44 + .../cj/LocalizedErrorMessages.properties | 1022 + .../com/mysql/cj/TlsSettings.properties | 126 + .../cj/configurations/3-0-Compat.properties | 16 + .../cj/configurations/clusterBase.properties | 3 + .../cj/configurations/coldFusion.properties | 16 + .../cj/configurations/fullDebug.properties | 6 + .../maxPerformance-8-0.properties | 38 + .../configurations/maxPerformance.properties | 34 + .../solarisMaxPerformance.properties | 13 + .../mysql/cj/util/TimeZoneMapping.properties | 502 + .../com/mysql/cj/jdbc/ClientInfoProvider.java | 151 + .../com/mysql/cj/jdbc/JdbcConnection.java | 616 + .../mysql/cj/jdbc/JdbcPreparedStatement.java | 60 + .../com/mysql/cj/jdbc/JdbcPropertySet.java | 48 + .../java/com/mysql/cj/jdbc/JdbcStatement.java | 132 + .../com/mysql/cj/jdbc/ParameterBindings.java | 101 + .../com/mysql/cj/jdbc/ha/BalanceStrategy.java | 81 + .../jdbc/ha/LoadBalanceExceptionChecker.java | 74 + .../cj/jdbc/ha/LoadBalancedConnection.java | 46 + .../cj/jdbc/ha/ReplicationConnection.java | 190 + .../ConnectionLifecycleInterceptor.java | 178 + .../jdbc/result/CachedResultSetMetaData.java | 41 + .../jdbc/result/ResultSetInternalMethods.java | 161 + .../java/com/mysql/cj/xdevapi/AddResult.java | 45 + .../com/mysql/cj/xdevapi/AddStatement.java | 69 + .../java/com/mysql/cj/xdevapi/Client.java | 70 + .../com/mysql/cj/xdevapi/ClientFactory.java | 85 + .../java/com/mysql/cj/xdevapi/Collection.java | 260 + .../java/com/mysql/cj/xdevapi/Column.java | 155 + .../com/mysql/cj/xdevapi/DatabaseObject.java | 78 + .../java/com/mysql/cj/xdevapi/DbDoc.java | 114 + .../com/mysql/cj/xdevapi/DeleteStatement.java | 62 + .../java/com/mysql/cj/xdevapi/DocResult.java | 36 + .../java/com/mysql/cj/xdevapi/Expression.java | 61 + .../com/mysql/cj/xdevapi/FetchResult.java | 86 + .../com/mysql/cj/xdevapi/FilterParams.java | 330 + .../com/mysql/cj/xdevapi/FindStatement.java | 154 + .../com/mysql/cj/xdevapi/InsertResult.java | 43 + .../com/mysql/cj/xdevapi/InsertStatement.java | 58 + .../java/com/mysql/cj/xdevapi/JsonValue.java | 46 + .../com/mysql/cj/xdevapi/ModifyStatement.java | 132 + .../com/mysql/cj/xdevapi/RemoveStatement.java | 63 + .../java/com/mysql/cj/xdevapi/Result.java | 60 + .../java/com/mysql/cj/xdevapi/Row.java | 244 + .../java/com/mysql/cj/xdevapi/RowResult.java | 58 + .../java/com/mysql/cj/xdevapi/Schema.java | 296 + .../com/mysql/cj/xdevapi/SelectStatement.java | 128 + .../java/com/mysql/cj/xdevapi/Session.java | 214 + .../com/mysql/cj/xdevapi/SessionFactory.java | 129 + .../java/com/mysql/cj/xdevapi/SqlResult.java | 50 + .../com/mysql/cj/xdevapi/SqlStatement.java | 36 + .../java/com/mysql/cj/xdevapi/Statement.java | 139 + .../java/com/mysql/cj/xdevapi/Table.java | 99 + .../java/com/mysql/cj/xdevapi/Type.java | 37 + .../com/mysql/cj/xdevapi/UpdateStatement.java | 84 + .../java/com/mysql/cj/xdevapi/UpdateType.java | 38 + .../java/com/mysql/cj/xdevapi/Warning.java | 36 + .../com/mysql/cj/xdevapi/XDevAPIError.java | 62 + .../com/mysql/cj/xdevapi/package-info.java | 36 + .../AbandonedConnectionCleanupThread.java | 255 + .../java/com/mysql/cj/jdbc/Blob.java | 280 + .../com/mysql/cj/jdbc/BlobFromLocator.java | 624 + .../com/mysql/cj/jdbc/CallableStatement.java | 2529 ++ .../cj/jdbc/CallableStatementWrapper.java | 1935 ++ .../mysql/cj/jdbc/ClientInfoProviderSP.java | 169 + .../cj/jdbc/ClientPreparedStatement.java | 1762 ++ .../java/com/mysql/cj/jdbc/Clob.java | 271 + .../cj/jdbc/CommentClientInfoProvider.java | 106 + .../com/mysql/cj/jdbc/ConnectionGroup.java | 254 + .../mysql/cj/jdbc/ConnectionGroupManager.java | 215 + .../com/mysql/cj/jdbc/ConnectionImpl.java | 2697 ++ .../com/mysql/cj/jdbc/ConnectionWrapper.java | 1251 + .../com/mysql/cj/jdbc/DatabaseMetaData.java | 5014 +++ .../jdbc/DatabaseMetaDataUsingInfoSchema.java | 1288 + .../java/com/mysql/cj/jdbc/Driver.java | 70 + .../com/mysql/cj/jdbc/EscapeProcessor.java | 509 + .../mysql/cj/jdbc/EscapeProcessorResult.java | 42 + .../java/com/mysql/cj/jdbc/IterateBlock.java | 81 + .../mysql/cj/jdbc/JdbcPropertySetImpl.java | 93 + .../jdbc/MysqlConnectionPoolDataSource.java | 61 + .../com/mysql/cj/jdbc/MysqlDataSource.java | 612 + .../mysql/cj/jdbc/MysqlDataSourceFactory.java | 136 + .../mysql/cj/jdbc/MysqlParameterMetadata.java | 203 + .../mysql/cj/jdbc/MysqlPooledConnection.java | 225 + .../java/com/mysql/cj/jdbc/MysqlSQLXML.java | 632 + .../com/mysql/cj/jdbc/MysqlSavepoint.java | 93 + .../com/mysql/cj/jdbc/MysqlXAConnection.java | 373 + .../com/mysql/cj/jdbc/MysqlXADataSource.java | 82 + .../com/mysql/cj/jdbc/MysqlXAException.java | 72 + .../java/com/mysql/cj/jdbc/MysqlXid.java | 119 + .../java/com/mysql/cj/jdbc/NClob.java | 46 + .../mysql/cj/jdbc/NonRegisteringDriver.java | 306 + .../mysql/cj/jdbc/ParameterBindingsImpl.java | 287 + .../cj/jdbc/PreparedStatementWrapper.java | 979 + .../cj/jdbc/ServerPreparedStatement.java | 672 + .../java/com/mysql/cj/jdbc/StatementImpl.java | 2268 ++ .../com/mysql/cj/jdbc/StatementWrapper.java | 880 + .../cj/jdbc/SuspendableXAConnection.java | 193 + .../java/com/mysql/cj/jdbc/WrapperBase.java | 134 + .../com/mysql/cj/jdbc/admin/MiniAdmin.java | 108 + .../exceptions/CommunicationsException.java | 83 + ...onnectionFeatureNotAvailableException.java | 62 + .../MySQLQueryInterruptedException.java | 54 + .../MySQLStatementCancelledException.java | 55 + .../exceptions/MySQLTimeoutException.java | 55 + .../MySQLTransactionRollbackException.java | 55 + .../jdbc/exceptions/MysqlDataTruncation.java | 79 + .../cj/jdbc/exceptions/NotUpdatable.java | 53 + .../OperationNotSupportedException.java | 48 + .../exceptions/PacketTooBigException.java | 59 + .../mysql/cj/jdbc/exceptions/SQLError.java | 256 + .../jdbc/exceptions/SQLExceptionsMapping.java | 133 + .../ha/BestResponseTimeBalanceStrategy.java | 117 + .../cj/jdbc/ha/FailoverConnectionProxy.java | 547 + .../ha/LoadBalancedAutoCommitInterceptor.java | 153 + .../jdbc/ha/LoadBalancedConnectionProxy.java | 1013 + .../jdbc/ha/LoadBalancedMySQLConnection.java | 98 + .../cj/jdbc/ha/MultiHostConnectionProxy.java | 559 + .../cj/jdbc/ha/MultiHostMySQLConnection.java | 762 + .../ha/NdbLoadBalanceExceptionChecker.java | 44 + .../cj/jdbc/ha/RandomBalanceStrategy.java | 134 + .../jdbc/ha/ReplicationConnectionGroup.java | 419 + .../ha/ReplicationConnectionGroupManager.java | 383 + .../jdbc/ha/ReplicationConnectionProxy.java | 866 + .../jdbc/ha/ReplicationMySQLConnection.java | 252 + .../cj/jdbc/ha/SequentialBalanceStrategy.java | 164 + .../cj/jdbc/ha/ServerAffinityStrategy.java | 79 + .../StandardLoadBalanceExceptionChecker.java | 130 + .../c3p0/MysqlConnectionTester.java | 119 + .../ResultSetScannerInterceptor.java | 128 + .../ServerStatusDiffInterceptor.java | 112 + .../SessionAssociationInterceptor.java | 109 + .../LoadBalanceConnectionGroupManager.java | 135 + ...oadBalanceConnectionGroupManagerMBean.java | 60 + .../cj/jdbc/jmx/ReplicationGroupManager.java | 151 + .../jmx/ReplicationGroupManagerMBean.java | 185 + .../result/CachedResultSetMetaDataImpl.java | 48 + .../cj/jdbc/result/ResultSetFactory.java | 148 + .../mysql/cj/jdbc/result/ResultSetImpl.java | 2743 ++ .../cj/jdbc/result/ResultSetMetaData.java | 391 + .../cj/jdbc/result/UpdatableResultSet.java | 2136 ++ .../com/mysql/cj/jdbc/util/BaseBugReport.java | 250 + .../mysql/cj/xdevapi/AbstractDataResult.java | 161 + .../cj/xdevapi/AbstractFilterParams.java | 216 + .../mysql/cj/xdevapi/AddResultBuilder.java | 41 + .../com/mysql/cj/xdevapi/AddResultImpl.java | 54 + .../mysql/cj/xdevapi/AddStatementImpl.java | 114 + .../java/com/mysql/cj/xdevapi/ClientImpl.java | 503 + .../com/mysql/cj/xdevapi/CollectionImpl.java | 254 + .../java/com/mysql/cj/xdevapi/ColumnImpl.java | 184 + .../mysql/cj/xdevapi/CreateIndexParams.java | 343 + .../cj/xdevapi/DatabaseObjectDescription.java | 69 + .../com/mysql/cj/xdevapi/DbDocFactory.java | 53 + .../java/com/mysql/cj/xdevapi/DbDocImpl.java | 130 + .../mysql/cj/xdevapi/DbDocValueFactory.java | 77 + .../mysql/cj/xdevapi/DeleteStatementImpl.java | 64 + .../com/mysql/cj/xdevapi/DocFilterParams.java | 83 + .../mysql/cj/xdevapi/DocResultBuilder.java | 98 + .../com/mysql/cj/xdevapi/DocResultImpl.java | 56 + .../java/com/mysql/cj/xdevapi/ExprParser.java | 1236 + .../com/mysql/cj/xdevapi/ExprUnparser.java | 345 + .../java/com/mysql/cj/xdevapi/ExprUtil.java | 351 + .../mysql/cj/xdevapi/FilterableStatement.java | 172 + .../mysql/cj/xdevapi/FindStatementImpl.java | 150 + .../com/mysql/cj/xdevapi/InsertParams.java | 102 + .../mysql/cj/xdevapi/InsertResultBuilder.java | 41 + .../mysql/cj/xdevapi/InsertResultImpl.java | 54 + .../mysql/cj/xdevapi/InsertStatementImpl.java | 76 + .../java/com/mysql/cj/xdevapi/JsonArray.java | 79 + .../com/mysql/cj/xdevapi/JsonLiteral.java | 50 + .../java/com/mysql/cj/xdevapi/JsonNumber.java | 77 + .../java/com/mysql/cj/xdevapi/JsonParser.java | 608 + .../java/com/mysql/cj/xdevapi/JsonString.java | 95 + .../mysql/cj/xdevapi/ModifyStatementImpl.java | 142 + .../mysql/cj/xdevapi/PreparableStatement.java | 226 + .../mysql/cj/xdevapi/RemoveStatementImpl.java | 86 + .../java/com/mysql/cj/xdevapi/RowFactory.java | 68 + .../java/com/mysql/cj/xdevapi/RowImpl.java | 194 + .../mysql/cj/xdevapi/RowResultBuilder.java | 105 + .../com/mysql/cj/xdevapi/RowResultImpl.java | 80 + .../java/com/mysql/cj/xdevapi/SchemaImpl.java | 216 + .../mysql/cj/xdevapi/SelectStatementImpl.java | 130 + .../com/mysql/cj/xdevapi/SessionImpl.java | 227 + .../com/mysql/cj/xdevapi/SqlMultiResult.java | 159 + .../mysql/cj/xdevapi/SqlResultBuilder.java | 130 + .../com/mysql/cj/xdevapi/SqlSingleResult.java | 61 + .../mysql/cj/xdevapi/SqlStatementImpl.java | 84 + .../com/mysql/cj/xdevapi/SqlUpdateResult.java | 101 + .../cj/xdevapi/StreamingDocResultBuilder.java | 95 + .../cj/xdevapi/StreamingRowResultBuilder.java | 97 + .../cj/xdevapi/StreamingSqlResultBuilder.java | 126 + .../mysql/cj/xdevapi/TableFilterParams.java | 70 + .../java/com/mysql/cj/xdevapi/TableImpl.java | 179 + .../com/mysql/cj/xdevapi/UpdateParams.java | 74 + .../com/mysql/cj/xdevapi/UpdateResult.java | 66 + .../mysql/cj/xdevapi/UpdateResultBuilder.java | 68 + .../java/com/mysql/cj/xdevapi/UpdateSpec.java | 116 + .../mysql/cj/xdevapi/UpdateStatementImpl.java | 82 + .../com/mysql/cj/xdevapi/WarningImpl.java | 61 + .../config/ssl-test-certs/ca-cert-ext.pem | 24 + .../test/config/ssl-test-certs/ca-cert.pem | 24 + .../test/config/ssl-test-certs/ca-key-ext.pem | 27 + .../src/test/config/ssl-test-certs/ca-key.pem | 27 + .../test/config/ssl-test-certs/ca-truststore | Bin 0 -> 1109 bytes .../config/ssl-test-certs/ca-truststore-ext | Bin 0 -> 1362 bytes .../config/ssl-test-certs/certs_howto.txt | 129 + .../config/ssl-test-certs/client-cert-ext.pem | 22 + .../config/ssl-test-certs/client-cert.pem | 22 + .../config/ssl-test-certs/client-key-ext.pem | 27 + .../test/config/ssl-test-certs/client-key.pem | 27 + .../config/ssl-test-certs/client-keystore | Bin 0 -> 2308 bytes .../config/ssl-test-certs/client-keystore-ext | Bin 0 -> 2312 bytes .../src/test/config/ssl-test-certs/mykey.pem | 15 + .../src/test/config/ssl-test-certs/mykey.pub | 6 + .../config/ssl-test-certs/server-cert-ext.pem | 22 + .../config/ssl-test-certs/server-cert.pem | 26 + .../config/ssl-test-certs/server-key-ext.pem | 27 + .../test/config/ssl-test-certs/server-key.pem | 27 + .../com/mysql/cj/CharsetMappingWrapper.java | 70 + .../java/com/mysql/cj/ConnectionUrlTest.java | 1668 + .../test/java/com/mysql/cj/MessagesTest.java | 165 + .../java/com/mysql/cj/ServerVersionTest.java | 145 + .../a/CompressedPacketSenderTest.java | 296 + .../a/DebugBufferingPacketSenderTest.java | 67 + .../a/MysqlBinaryValueDecoderTest.java | 107 + .../protocol/a/MysqlTextValueDecoderTest.java | 192 + .../cj/protocol/a/PacketSenderTestBase.java | 74 + .../cj/protocol/a/SimplePacketReaderTest.java | 314 + .../cj/protocol/a/SimplePacketSenderTest.java | 161 + .../mysql/cj/protocol/x/CompressionTest.java | 384 + .../cj/protocol/x/SyncMessageReaderTest.java | 189 + .../cj/protocol/x/SyncMessageWriterTest.java | 107 + .../cj/result/BigDecimalValueFactoryTest.java | 189 + .../result/BinaryStreamValueFactoryTest.java | 44 + .../cj/result/BooleanValueFactoryTest.java | 183 + .../mysql/cj/result/ByteValueFactoryTest.java | 266 + .../com/mysql/cj/result/CommonAsserts.java | 52 + .../cj/result/DoubleValueFactoryTest.java | 229 + .../cj/result/FloatValueFactoryTest.java | 228 + .../cj/result/IntegerValueFactoryTest.java | 267 + .../result/LocalDateTimeValueFactoryTest.java | 253 + .../cj/result/LocalDateValueFactoryTest.java | 234 + .../cj/result/LocalTimeValueFactoryTest.java | 224 + .../mysql/cj/result/LongValueFactoryTest.java | 230 + .../cj/result/ShortValueFactoryTest.java | 279 + .../cj/result/SqlDateValueFactoryTest.java | 252 + .../cj/result/SqlTimeValueFactoryTest.java | 225 + .../result/SqlTimestampValueFactoryTest.java | 277 + .../cj/result/StringValueFactoryTest.java | 169 + .../ZeroDateTimeToNullValueFactoryTest.java | 140 + .../mysql/cj/util/StringInspectorTest.java | 201 + .../com/mysql/cj/util/StringUtilsTest.java | 1458 + .../java/com/mysql/cj/util/TimeUtilTest.java | 330 + .../com/mysql/cj/xdevapi/ExprParserTest.java | 604 + .../com/mysql/cj/xdevapi/JsonDocTest.java | 765 + .../java/testsuite/BaseQueryInterceptor.java | 63 + .../src/test/java/testsuite/BaseTestCase.java | 1309 + .../test/java/testsuite/BufferingLogger.java | 72 + .../java/testsuite/InjectedSocketFactory.java | 383 + .../src/test/java/testsuite/JUnitSummary.java | 108 + .../testsuite/MockJndiContextFactory.java | 316 + .../src/test/java/testsuite/TestUtils.java | 145 + .../testsuite/UnreliableSocketFactory.java | 564 + .../java/testsuite/perf/BasePerfTest.java | 201 + .../testsuite/perf/LoadStorePerfTest.java | 314 + .../testsuite/perf/RetrievalPerfTest.java | 199 + .../regression/BlobRegressionTest.java | 518 + .../regression/CachedRowsetTest.java | 87 + .../CallableStatementRegressionTest.java | 1672 + .../regression/CharsetRegressionTest.java | 1353 + .../regression/ConnectionRegressionTest.java | 11698 +++++++ .../regression/DataSourceRegressionTest.java | 575 + .../regression/DateTimeRegressionTest.java | 1165 + .../EscapeProcessorRegressionTest.java | 125 + .../regression/ExceptionSubclassesTest.java | 52 + .../regression/MetaDataRegressionTest.java | 5510 ++++ .../MicroPerformanceRegressionTest.java | 464 + .../regression/NonLocalSocketFactory.java | 42 + .../regression/NumbersRegressionTest.java | 280 + .../PooledConnectionRegressionTest.java | 1501 + .../regression/ResultSetRegressionTest.java | 8125 +++++ .../regression/StatementRegressionTest.java | 12673 ++++++++ .../regression/StressRegressionTest.java | 470 + .../regression/StringRegressionTest.java | 313 + .../regression/SubqueriesRegressionTest.java | 146 + .../regression/SyntaxRegressionTest.java | 2061 ++ .../regression/UtilsRegressionTest.java | 689 + .../testsuite/simple/AuthenticationTest.java | 735 + .../test/java/testsuite/simple/BlobTest.java | 243 + .../simple/CallableStatementTest.java | 1866 ++ .../java/testsuite/simple/CharsetTest.java | 1253 + .../java/testsuite/simple/ConnectionTest.java | 3007 ++ .../java/testsuite/simple/DataSourceTest.java | 310 + .../test/java/testsuite/simple/DateTest.java | 372 + .../java/testsuite/simple/DateTimeTest.java | 4701 +++ .../simple/EscapeProcessingTest.java | 170 + .../java/testsuite/simple/ExceptionsTest.java | 129 + .../java/testsuite/simple/MetadataTest.java | 1893 ++ .../java/testsuite/simple/MiniAdminTest.java | 72 + .../simple/MultiHostConnectionTest.java | 1417 + .../java/testsuite/simple/NumbersTest.java | 148 + .../testsuite/simple/QueryAttributesTest.java | 1026 + .../simple/ReadOnlyCallableStatementTest.java | 144 + .../java/testsuite/simple/ResultSetTest.java | 1471 + .../test/java/testsuite/simple/SSLTest.java | 81 + .../java/testsuite/simple/SaslPrepTest.java | 263 + .../simple/SequentialIdLeaseTest.java | 154 + .../simple/ServerControllerTest.java | 63 + .../testsuite/simple/SimpleTransformer.java | 48 + .../testsuite/simple/SplitDBdotNameTest.java | 94 + .../java/testsuite/simple/StatementsTest.java | 5404 ++++ .../simple/TestLifecycleInterceptor.java | 83 + .../testsuite/simple/TransactionTest.java | 68 + .../java/testsuite/simple/TraversalTest.java | 188 + .../testsuite/simple/UpdatabilityTest.java | 308 + .../test/java/testsuite/simple/UtilsTest.java | 134 + .../test/java/testsuite/simple/XATest.java | 473 + .../testsuite/x/devapi/AsyncQueryTest.java | 277 + .../x/devapi/BaseCollectionTestCase.java | 69 + .../testsuite/x/devapi/BaseTableTestCase.java | 53 + .../java/testsuite/x/devapi/BindTest.java | 118 + .../testsuite/x/devapi/CollectionAddTest.java | 825 + .../x/devapi/CollectionFindTest.java | 3935 +++ .../x/devapi/CollectionModifyTest.java | 2061 ++ .../x/devapi/CollectionRemoveTest.java | 717 + .../testsuite/x/devapi/CollectionTest.java | 2508 ++ .../testsuite/x/devapi/CompressionTest.java | 818 + .../x/devapi/DevApiBaseTestCase.java | 310 + .../testsuite/x/devapi/Ipv6SupportTest.java | 112 + .../java/testsuite/x/devapi/MetadataTest.java | 1656 + .../java/testsuite/x/devapi/ResultTest.java | 165 + .../testsuite/x/devapi/RowLockingTest.java | 828 + .../java/testsuite/x/devapi/SchemaTest.java | 472 + .../testsuite/x/devapi/SecureSessionTest.java | 2080 ++ .../x/devapi/SessionFailoverTest.java | 310 + .../java/testsuite/x/devapi/SessionTest.java | 2597 ++ .../testsuite/x/devapi/TableDeleteTest.java | 322 + .../testsuite/x/devapi/TableInsertTest.java | 344 + .../testsuite/x/devapi/TableSelectTest.java | 1199 + .../java/testsuite/x/devapi/TableTest.java | 238 + .../testsuite/x/devapi/TableUpdateTest.java | 329 + .../testsuite/x/devapi/TransactionTest.java | 253 + .../java/testsuite/x/devapi/package-info.java | 34 + .../x/internal/InternalXBaseTestCase.java | 280 + .../x/internal/MysqlxSessionTest.java | 224 + .../x/internal/XProtocolAsyncTest.java | 169 + .../x/internal/XProtocolAuthTest.java | 168 + .../testsuite/x/internal/XProtocolTest.java | 545 + .../testsuite/x/internal/package-info.java | 34 + .../WorkoutDBDatesAutoUpdater.jar | Bin 0 -> 4937764 bytes .../WorkoutDBDatesAutoUpdater/config.json | 7 + .../WorkoutDBDatesAutoUpdater/logs/log.log | 16 + .../WorkoutDBDatesAutoUpdater/logs/oldLog.log | 1 + .../WorkoutDBDatesAutoUpdater/run.cmd | 2 + .../META-INF/MANIFEST.MF | 3 + .../WorkoutDatesUpdater/Main.class | Bin 0 -> 6894 bytes .../WorkoutDatesUpdater/logging.class | Bin 0 -> 3133 bytes .../cj/LocalizedErrorMessages.properties | 1022 + .../com/mysql/cj/TlsSettings.properties | 126 + .../cj/configurations/3-0-Compat.properties | 16 + .../cj/configurations/clusterBase.properties | 3 + .../cj/configurations/coldFusion.properties | 16 + .../cj/configurations/fullDebug.properties | 6 + .../maxPerformance-8-0.properties | 38 + .../configurations/maxPerformance.properties | 34 + .../solarisMaxPerformance.properties | 13 + .../mysql/cj/util/TimeZoneMapping.properties | 502 + .../org/json/simple/ItemList.class | Bin 0 -> 4028 bytes .../org/json/simple/JSONArray.class | Bin 0 -> 6490 bytes .../org/json/simple/JSONAware.class | Bin 0 -> 161 bytes .../org/json/simple/JSONObject.class | Bin 0 -> 2999 bytes .../org/json/simple/JSONStreamAware.class | Bin 0 -> 223 bytes .../org/json/simple/JSONValue.class | Bin 0 -> 4700 bytes .../json/simple/parser/ContainerFactory.class | Bin 0 -> 239 bytes .../json/simple/parser/ContentHandler.class | Bin 0 -> 573 bytes .../org/json/simple/parser/JSONParser.class | Bin 0 -> 9144 bytes .../json/simple/parser/ParseException.class | Bin 0 -> 2260 bytes .../org/json/simple/parser/Yylex.class | Bin 0 -> 12747 bytes .../org/json/simple/parser/Yytoken.class | Bin 0 -> 1465 bytes src/META-INF/MANIFEST.MF | 3 + src/WorkoutDatesUpdater/Main.java | 130 + src/WorkoutDatesUpdater/logging.java | 62 + src/com/mysql/cj/AbstractQuery.class | Bin 0 -> 7563 bytes src/com/mysql/cj/BindValue.class | Bin 0 -> 1310 bytes src/com/mysql/cj/CacheAdapter.class | Bin 0 -> 506 bytes src/com/mysql/cj/CacheAdapterFactory.class | Bin 0 -> 393 bytes src/com/mysql/cj/CancelQueryTask.class | Bin 0 -> 375 bytes .../mysql/cj/CancelQueryTaskImpl$1$1.class | Bin 0 -> 757 bytes src/com/mysql/cj/CancelQueryTaskImpl$1.class | Bin 0 -> 3969 bytes src/com/mysql/cj/CancelQueryTaskImpl.class | Bin 0 -> 2065 bytes src/com/mysql/cj/CharsetMapping.class | Bin 0 -> 26991 bytes src/com/mysql/cj/CharsetSettings.class | Bin 0 -> 1537 bytes src/com/mysql/cj/ClientPreparedQuery.class | Bin 0 -> 6939 bytes src/com/mysql/cj/Collation.class | Bin 0 -> 1676 bytes src/com/mysql/cj/Constants.class | Bin 0 -> 3514 bytes src/com/mysql/cj/CoreSession.class | Bin 0 -> 6550 bytes src/com/mysql/cj/DataStoreMetadata.class | Bin 0 -> 308 bytes src/com/mysql/cj/DataStoreMetadataImpl.class | Bin 0 -> 4291 bytes src/com/mysql/cj/LicenseConfiguration.class | Bin 0 -> 626 bytes .../cj/LocalizedErrorMessages.properties | 1022 + src/com/mysql/cj/MessageBuilder.class | Bin 0 -> 838 bytes src/com/mysql/cj/Messages.class | Bin 0 -> 2599 bytes src/com/mysql/cj/MysqlCharset.class | Bin 0 -> 3936 bytes src/com/mysql/cj/MysqlConnection.class | Bin 0 -> 724 bytes src/com/mysql/cj/MysqlType$1.class | Bin 0 -> 922 bytes src/com/mysql/cj/MysqlType.class | Bin 0 -> 12615 bytes src/com/mysql/cj/MysqlxSession.class | Bin 0 -> 6380 bytes src/com/mysql/cj/NativeCharsetSettings.class | Bin 0 -> 22688 bytes .../cj/NativeQueryAttributesBindings.class | Bin 0 -> 4467 bytes src/com/mysql/cj/NativeQueryBindValue$1.class | Bin 0 -> 2366 bytes src/com/mysql/cj/NativeQueryBindValue.class | Bin 0 -> 8828 bytes src/com/mysql/cj/NativeQueryBindings.class | Bin 0 -> 17982 bytes src/com/mysql/cj/NativeSession$1.class | Bin 0 -> 1572 bytes src/com/mysql/cj/NativeSession.class | Bin 0 -> 29966 bytes .../mysql/cj/NoSubInterceptorWrapper.class | Bin 0 -> 3188 bytes ...onnectionLRUFactory$PerConnectionLRU.class | Bin 0 -> 3128 bytes .../mysql/cj/PerConnectionLRUFactory.class | Bin 0 -> 1069 bytes src/com/mysql/cj/PingTarget.class | Bin 0 -> 185 bytes src/com/mysql/cj/PreparedQuery.class | Bin 0 -> 863 bytes src/com/mysql/cj/Query$CancelStatus.class | Bin 0 -> 1145 bytes src/com/mysql/cj/Query.class | Bin 0 -> 1787 bytes .../mysql/cj/QueryAttributesBindings.class | Bin 0 -> 460 bytes src/com/mysql/cj/QueryBindings.class | Bin 0 -> 1931 bytes src/com/mysql/cj/QueryInfo.class | Bin 0 -> 13721 bytes src/com/mysql/cj/QueryResult.class | Bin 0 -> 116 bytes src/com/mysql/cj/QueryReturnType.class | Bin 0 -> 1135 bytes src/com/mysql/cj/ServerPreparedQuery.class | Bin 0 -> 23171 bytes ...ServerPreparedQueryTestcaseGenerator.class | Bin 0 -> 3659 bytes src/com/mysql/cj/ServerVersion.class | Bin 0 -> 3251 bytes .../cj/Session$SessionEventListener.class | Bin 0 -> 320 bytes src/com/mysql/cj/Session.class | Bin 0 -> 3560 bytes src/com/mysql/cj/SimpleQuery.class | Bin 0 -> 375 bytes src/com/mysql/cj/TlsSettings.properties | 126 + .../mysql/cj/TransactionEventHandler.class | Bin 0 -> 204 bytes src/com/mysql/cj/WarningListener.class | Bin 0 -> 177 bytes src/com/mysql/cj/admin/ServerController.class | Bin 0 -> 4948 bytes .../callback/FidoAuthenticationCallback.class | Bin 0 -> 1293 bytes src/com/mysql/cj/callback/MysqlCallback.class | Bin 0 -> 129 bytes .../cj/callback/MysqlCallbackHandler.class | Bin 0 -> 277 bytes .../mysql/cj/callback/UsernameCallback.class | Bin 0 -> 555 bytes .../cj/conf/AbstractPropertyDefinition.class | Bin 0 -> 5459 bytes .../cj/conf/AbstractRuntimeProperty.class | Bin 0 -> 7021 bytes src/com/mysql/cj/conf/BooleanProperty.class | Bin 0 -> 775 bytes ...anPropertyDefinition$AllowableValues.class | Bin 0 -> 1552 bytes .../cj/conf/BooleanPropertyDefinition.class | Bin 0 -> 4534 bytes .../conf/ConnectionPropertiesTransform.class | Bin 0 -> 236 bytes src/com/mysql/cj/conf/ConnectionUrl$1.class | Bin 0 -> 223 bytes .../ConnectionUrl$HostsCardinality$1.class | Bin 0 -> 754 bytes .../ConnectionUrl$HostsCardinality$2.class | Bin 0 -> 754 bytes .../ConnectionUrl$HostsCardinality$3.class | Bin 0 -> 754 bytes .../conf/ConnectionUrl$HostsCardinality.class | Bin 0 -> 1750 bytes .../mysql/cj/conf/ConnectionUrl$Type.class | Bin 0 -> 7227 bytes src/com/mysql/cj/conf/ConnectionUrl.class | Bin 0 -> 20291 bytes .../cj/conf/ConnectionUrlParser$Pair.class | Bin 0 -> 1300 bytes .../mysql/cj/conf/ConnectionUrlParser.class | Bin 0 -> 14021 bytes .../mysql/cj/conf/DatabaseUrlContainer.class | Bin 0 -> 187 bytes .../mysql/cj/conf/DefaultPropertySet.class | Bin 0 -> 10424 bytes src/com/mysql/cj/conf/EnumProperty.class | Bin 0 -> 793 bytes .../cj/conf/EnumPropertyDefinition.class | Bin 0 -> 4911 bytes src/com/mysql/cj/conf/HostInfo.class | Bin 0 -> 5572 bytes src/com/mysql/cj/conf/HostsListView.class | Bin 0 -> 1054 bytes src/com/mysql/cj/conf/IntegerProperty.class | Bin 0 -> 2556 bytes .../cj/conf/IntegerPropertyDefinition.class | Bin 0 -> 3489 bytes src/com/mysql/cj/conf/LongProperty.class | Bin 0 -> 2542 bytes .../cj/conf/LongPropertyDefinition.class | Bin 0 -> 3155 bytes .../mysql/cj/conf/MemorySizeProperty.class | Bin 0 -> 2415 bytes .../conf/MemorySizePropertyDefinition.class | Bin 0 -> 2582 bytes .../mysql/cj/conf/PropertyDefinition.class | Bin 0 -> 1009 bytes .../conf/PropertyDefinitions$AuthMech.class | Bin 0 -> 1293 bytes .../PropertyDefinitions$Compression.class | Bin 0 -> 1263 bytes .../PropertyDefinitions$DatabaseTerm.class | Bin 0 -> 1215 bytes .../cj/conf/PropertyDefinitions$SslMode.class | Bin 0 -> 1345 bytes .../PropertyDefinitions$XdevapiSslMode.class | Bin 0 -> 1342 bytes ...ertyDefinitions$ZeroDatetimeBehavior.class | Bin 0 -> 1330 bytes .../mysql/cj/conf/PropertyDefinitions.class | Bin 0 -> 36000 bytes src/com/mysql/cj/conf/PropertyKey.class | Bin 0 -> 20947 bytes src/com/mysql/cj/conf/PropertySet.class | Bin 0 -> 2045 bytes ...timeProperty$RuntimePropertyListener.class | Bin 0 -> 459 bytes src/com/mysql/cj/conf/RuntimeProperty.class | Bin 0 -> 1138 bytes src/com/mysql/cj/conf/StringProperty.class | Bin 0 -> 934 bytes .../cj/conf/StringPropertyDefinition.class | Bin 0 -> 2102 bytes .../cj/conf/url/FailoverConnectionUrl.class | Bin 0 -> 705 bytes .../url/FailoverDnsSrvConnectionUrl.class | Bin 0 -> 3369 bytes .../conf/url/LoadBalanceConnectionUrl.class | Bin 0 -> 5298 bytes .../url/LoadBalanceDnsSrvConnectionUrl.class | Bin 0 -> 4489 bytes .../conf/url/ReplicationConnectionUrl$1.class | Bin 0 -> 764 bytes .../conf/url/ReplicationConnectionUrl.class | Bin 0 -> 7638 bytes .../ReplicationDnsSrvConnectionUrl$1.class | Bin 0 -> 782 bytes .../url/ReplicationDnsSrvConnectionUrl.class | Bin 0 -> 5525 bytes .../cj/conf/url/SingleConnectionUrl.class | Bin 0 -> 697 bytes .../cj/conf/url/XDevApiConnectionUrl.class | Bin 0 -> 7454 bytes .../conf/url/XDevApiDnsSrvConnectionUrl.class | Bin 0 -> 4514 bytes .../cj/configurations/3-0-Compat.properties | 16 + .../cj/configurations/clusterBase.properties | 3 + .../cj/configurations/coldFusion.properties | 16 + .../cj/configurations/fullDebug.properties | 6 + .../maxPerformance-8-0.properties | 38 + .../configurations/maxPerformance.properties | 34 + .../solarisMaxPerformance.properties | 13 + .../exceptions/AssertionFailedException.class | Bin 0 -> 1535 bytes .../CJCommunicationsException.class | Bin 0 -> 2005 bytes ...nnectionFeatureNotAvailableException.class | Bin 0 -> 1426 bytes src/com/mysql/cj/exceptions/CJException.class | Bin 0 -> 2260 bytes .../CJOperationNotSupportedException.class | Bin 0 -> 597 bytes .../exceptions/CJPacketTooBigException.class | Bin 0 -> 1228 bytes .../cj/exceptions/CJTimeoutException.class | Bin 0 -> 956 bytes .../ClosedOnExpiredPasswordException.class | Bin 0 -> 1231 bytes .../ConnectionIsClosedException.class | Bin 0 -> 1166 bytes .../exceptions/DataConversionException.class | Bin 0 -> 536 bytes .../cj/exceptions/DataReadException.class | Bin 0 -> 694 bytes .../exceptions/DataTruncationException.class | Bin 0 -> 2379 bytes .../DeadlockTimeoutRollbackMarker.class | Bin 0 -> 163 bytes .../cj/exceptions/ExceptionFactory.class | Bin 0 -> 9361 bytes .../cj/exceptions/ExceptionInterceptor.class | Bin 0 -> 355 bytes .../ExceptionInterceptorChain.class | Bin 0 -> 3733 bytes .../FeatureNotAvailableException.class | Bin 0 -> 1084 bytes .../InvalidConnectionAttributeException.class | Bin 0 -> 1190 bytes .../cj/exceptions/MysqlErrorNumbers.class | Bin 0 -> 64101 bytes .../cj/exceptions/NumberOutOfRange.class | Bin 0 -> 515 bytes .../OperationCancelledException.class | Bin 0 -> 994 bytes .../exceptions/PasswordExpiredException.class | Bin 0 -> 1207 bytes .../PropertyNotModifiableException.class | Bin 0 -> 1090 bytes .../mysql/cj/exceptions/RSAException.class | Bin 0 -> 1036 bytes .../cj/exceptions/SSLParamsException.class | Bin 0 -> 1139 bytes .../StatementIsClosedException.class | Bin 0 -> 1163 bytes .../cj/exceptions/StreamingNotifiable.class | Bin 0 -> 182 bytes .../exceptions/UnableToConnectException.class | Bin 0 -> 1157 bytes ...UnsupportedConnectionStringException.class | Bin 0 -> 1240 bytes .../exceptions/WrongArgumentException.class | Bin 0 -> 1151 bytes .../cj/interceptors/QueryInterceptor.class | Bin 0 -> 1596 bytes ...$ConnectionFinalizerPhantomReference.class | Bin 0 -> 1540 bytes .../AbandonedConnectionCleanupThread.class | Bin 0 -> 6130 bytes src/com/mysql/cj/jdbc/Blob.class | Bin 0 -> 5998 bytes .../BlobFromLocator$LocatorInputStream.class | Bin 0 -> 3311 bytes src/com/mysql/cj/jdbc/BlobFromLocator.class | Bin 0 -> 11699 bytes .../mysql/cj/jdbc/CallableStatement$1.class | Bin 0 -> 647 bytes ...ableStatement$CallableStatementParam.class | Bin 0 -> 1340 bytes ...Statement$CallableStatementParamInfo.class | Bin 0 -> 9153 bytes src/com/mysql/cj/jdbc/CallableStatement.class | Bin 0 -> 57976 bytes .../cj/jdbc/CallableStatementWrapper.class | Bin 0 -> 33722 bytes .../mysql/cj/jdbc/ClientInfoProvider.class | Bin 0 -> 603 bytes .../mysql/cj/jdbc/ClientInfoProviderSP.class | Bin 0 -> 4768 bytes .../cj/jdbc/ClientPreparedStatement.class | Bin 0 -> 47696 bytes src/com/mysql/cj/jdbc/Clob.class | Bin 0 -> 7263 bytes .../cj/jdbc/CommentClientInfoProvider.class | Bin 0 -> 2839 bytes src/com/mysql/cj/jdbc/ConnectionGroup.class | Bin 0 -> 6310 bytes .../cj/jdbc/ConnectionGroupManager.class | Bin 0 -> 6722 bytes src/com/mysql/cj/jdbc/ConnectionImpl$1.class | Bin 0 -> 1424 bytes src/com/mysql/cj/jdbc/ConnectionImpl$2.class | Bin 0 -> 1875 bytes src/com/mysql/cj/jdbc/ConnectionImpl$3.class | Bin 0 -> 1426 bytes src/com/mysql/cj/jdbc/ConnectionImpl$4.class | Bin 0 -> 1552 bytes src/com/mysql/cj/jdbc/ConnectionImpl$5.class | Bin 0 -> 1482 bytes src/com/mysql/cj/jdbc/ConnectionImpl$6.class | Bin 0 -> 1540 bytes src/com/mysql/cj/jdbc/ConnectionImpl$7.class | Bin 0 -> 900 bytes .../ConnectionImpl$CompoundCacheKey.class | Bin 0 -> 1337 bytes .../ConnectionImpl$NetworkTimeoutSetter.class | Bin 0 -> 1314 bytes src/com/mysql/cj/jdbc/ConnectionImpl.class | Bin 0 -> 69654 bytes src/com/mysql/cj/jdbc/ConnectionWrapper.class | Bin 0 -> 30886 bytes .../mysql/cj/jdbc/DatabaseMetaData$1.class | Bin 0 -> 5561 bytes .../mysql/cj/jdbc/DatabaseMetaData$10.class | Bin 0 -> 5108 bytes .../mysql/cj/jdbc/DatabaseMetaData$11.class | Bin 0 -> 3173 bytes .../mysql/cj/jdbc/DatabaseMetaData$2.class | Bin 0 -> 8915 bytes .../mysql/cj/jdbc/DatabaseMetaData$3.class | Bin 0 -> 6071 bytes .../mysql/cj/jdbc/DatabaseMetaData$4.class | Bin 0 -> 3177 bytes .../mysql/cj/jdbc/DatabaseMetaData$5.class | Bin 0 -> 3077 bytes .../mysql/cj/jdbc/DatabaseMetaData$6.class | Bin 0 -> 5035 bytes .../mysql/cj/jdbc/DatabaseMetaData$7.class | Bin 0 -> 4560 bytes .../mysql/cj/jdbc/DatabaseMetaData$8.class | Bin 0 -> 4630 bytes .../mysql/cj/jdbc/DatabaseMetaData$9.class | Bin 0 -> 6617 bytes .../DatabaseMetaData$ComparableWrapper.class | Bin 0 -> 2740 bytes .../DatabaseMetaData$IndexMetaDataKey.class | Bin 0 -> 2254 bytes ...DatabaseMetaData$IteratorWithCleanup.class | Bin 0 -> 899 bytes ...seMetaData$LocalAndReferencedColumns.class | Bin 0 -> 1325 bytes .../jdbc/DatabaseMetaData$ProcedureType.class | Bin 0 -> 1202 bytes ...atabaseMetaData$SingleStringIterator.class | Bin 0 -> 1327 bytes .../DatabaseMetaData$StringListIterator.class | Bin 0 -> 1625 bytes .../DatabaseMetaData$TableMetaDataKey.class | Bin 0 -> 2257 bytes .../cj/jdbc/DatabaseMetaData$TableType.class | Bin 0 -> 2912 bytes .../DatabaseMetaData$TypeDescriptor.class | Bin 0 -> 5323 bytes src/com/mysql/cj/jdbc/DatabaseMetaData.class | Bin 0 -> 102381 bytes .../DatabaseMetaDataUsingInfoSchema$1.class | Bin 0 -> 1721 bytes ...DataUsingInfoSchema$FunctionConstant.class | Bin 0 -> 1822 bytes .../DatabaseMetaDataUsingInfoSchema.class | Bin 0 -> 40499 bytes src/com/mysql/cj/jdbc/Driver.class | Bin 0 -> 733 bytes src/com/mysql/cj/jdbc/EscapeProcessor.class | Bin 0 -> 10506 bytes .../mysql/cj/jdbc/EscapeProcessorResult.class | Bin 0 -> 505 bytes src/com/mysql/cj/jdbc/IterateBlock.class | Bin 0 -> 1945 bytes src/com/mysql/cj/jdbc/JdbcConnection.class | Bin 0 -> 3774 bytes .../mysql/cj/jdbc/JdbcPreparedStatement.class | Bin 0 -> 781 bytes src/com/mysql/cj/jdbc/JdbcPropertySet.class | Bin 0 -> 346 bytes .../mysql/cj/jdbc/JdbcPropertySetImpl.class | Bin 0 -> 4861 bytes src/com/mysql/cj/jdbc/JdbcStatement.class | Bin 0 -> 1019 bytes .../jdbc/MysqlConnectionPoolDataSource.class | Bin 0 -> 1568 bytes src/com/mysql/cj/jdbc/MysqlDataSource.class | Bin 0 -> 46679 bytes .../cj/jdbc/MysqlDataSourceFactory.class | Bin 0 -> 3808 bytes .../cj/jdbc/MysqlParameterMetadata.class | Bin 0 -> 5145 bytes .../mysql/cj/jdbc/MysqlPooledConnection.class | Bin 0 -> 5552 bytes .../jdbc/MysqlSQLXML$SimpleSaxToReader.class | Bin 0 -> 3866 bytes src/com/mysql/cj/jdbc/MysqlSQLXML.class | Bin 0 -> 12660 bytes src/com/mysql/cj/jdbc/MysqlSavepoint.class | Bin 0 -> 1922 bytes src/com/mysql/cj/jdbc/MysqlXAConnection.class | Bin 0 -> 9396 bytes src/com/mysql/cj/jdbc/MysqlXADataSource.class | Bin 0 -> 2282 bytes src/com/mysql/cj/jdbc/MysqlXAException.class | Bin 0 -> 1194 bytes src/com/mysql/cj/jdbc/MysqlXid.class | Bin 0 -> 1588 bytes src/com/mysql/cj/jdbc/NClob.class | Bin 0 -> 640 bytes .../cj/jdbc/NonRegisteringDriver$1.class | Bin 0 -> 1175 bytes .../mysql/cj/jdbc/NonRegisteringDriver.class | Bin 0 -> 6736 bytes src/com/mysql/cj/jdbc/ParameterBindings.class | Bin 0 -> 1348 bytes .../cj/jdbc/ParameterBindingsImpl$1.class | Bin 0 -> 1005 bytes .../mysql/cj/jdbc/ParameterBindingsImpl.class | Bin 0 -> 8916 bytes .../cj/jdbc/PreparedStatementWrapper.class | Bin 0 -> 19181 bytes .../cj/jdbc/ServerPreparedStatement.class | Bin 0 -> 22506 bytes src/com/mysql/cj/jdbc/StatementImpl$1.class | Bin 0 -> 731 bytes src/com/mysql/cj/jdbc/StatementImpl.class | Bin 0 -> 52664 bytes src/com/mysql/cj/jdbc/StatementWrapper.class | Bin 0 -> 14840 bytes .../cj/jdbc/SuspendableXAConnection.class | Bin 0 -> 5113 bytes ...nnectionErrorFiringInvocationHandler.class | Bin 0 -> 2971 bytes src/com/mysql/cj/jdbc/WrapperBase.class | Bin 0 -> 1490 bytes src/com/mysql/cj/jdbc/admin/MiniAdmin.class | Bin 0 -> 1777 bytes .../exceptions/CommunicationsException.class | Bin 0 -> 2379 bytes ...nnectionFeatureNotAvailableException.class | Bin 0 -> 1509 bytes .../MySQLQueryInterruptedException.class | Bin 0 -> 916 bytes .../MySQLStatementCancelledException.class | Bin 0 -> 1047 bytes .../exceptions/MySQLTimeoutException.class | Bin 0 -> 998 bytes .../MySQLTransactionRollbackException.class | Bin 0 -> 993 bytes .../jdbc/exceptions/MysqlDataTruncation.class | Bin 0 -> 1048 bytes .../cj/jdbc/exceptions/NotUpdatable.class | Bin 0 -> 840 bytes .../OperationNotSupportedException.class | Bin 0 -> 798 bytes .../exceptions/PacketTooBigException.class | Bin 0 -> 954 bytes .../mysql/cj/jdbc/exceptions/SQLError.class | Bin 0 -> 6853 bytes .../exceptions/SQLExceptionsMapping.class | Bin 0 -> 3968 bytes .../mysql/cj/jdbc/ha/BalanceStrategy.class | Bin 0 -> 521 bytes .../ha/BestResponseTimeBalanceStrategy.class | Bin 0 -> 3250 bytes ...tionProxy$FailoverJdbcInterfaceProxy.class | Bin 0 -> 1891 bytes .../cj/jdbc/ha/FailoverConnectionProxy.class | Bin 0 -> 12078 bytes .../jdbc/ha/LoadBalanceExceptionChecker.class | Bin 0 -> 291 bytes .../LoadBalancedAutoCommitInterceptor.class | Bin 0 -> 4679 bytes .../cj/jdbc/ha/LoadBalancedConnection.class | Bin 0 -> 408 bytes ...roxy$NullLoadBalancedConnectionProxy.class | Bin 0 -> 2088 bytes .../jdbc/ha/LoadBalancedConnectionProxy.class | Bin 0 -> 26208 bytes .../jdbc/ha/LoadBalancedMySQLConnection.class | Bin 0 -> 3662 bytes ...stConnectionProxy$JdbcInterfaceProxy.class | Bin 0 -> 1990 bytes .../cj/jdbc/ha/MultiHostConnectionProxy.class | Bin 0 -> 10672 bytes .../cj/jdbc/ha/MultiHostMySQLConnection.class | Bin 0 -> 22791 bytes .../ha/NdbLoadBalanceExceptionChecker.class | Bin 0 -> 1002 bytes .../cj/jdbc/ha/RandomBalanceStrategy.class | Bin 0 -> 4319 bytes .../cj/jdbc/ha/ReplicationConnection.class | Bin 0 -> 2177 bytes .../jdbc/ha/ReplicationConnectionGroup.class | Bin 0 -> 7228 bytes .../ReplicationConnectionGroupManager.class | Bin 0 -> 8321 bytes .../jdbc/ha/ReplicationConnectionProxy.class | Bin 0 -> 18597 bytes .../jdbc/ha/ReplicationMySQLConnection.class | Bin 0 -> 7444 bytes .../jdbc/ha/SequentialBalanceStrategy.class | Bin 0 -> 3550 bytes .../cj/jdbc/ha/ServerAffinityStrategy.class | Bin 0 -> 2817 bytes .../StandardLoadBalanceExceptionChecker.class | Bin 0 -> 3517 bytes .../c3p0/MysqlConnectionTester.class | Bin 0 -> 2714 bytes .../ConnectionLifecycleInterceptor.class | Bin 0 -> 680 bytes .../ResultSetScannerInterceptor$1.class | Bin 0 -> 2375 bytes .../ResultSetScannerInterceptor.class | Bin 0 -> 3677 bytes .../ServerStatusDiffInterceptor.class | Bin 0 -> 4464 bytes .../SessionAssociationInterceptor.class | Bin 0 -> 3639 bytes .../LoadBalanceConnectionGroupManager.class | Bin 0 -> 3334 bytes ...adBalanceConnectionGroupManagerMBean.class | Bin 0 -> 839 bytes .../cj/jdbc/jmx/ReplicationGroupManager.class | Bin 0 -> 4340 bytes .../jmx/ReplicationGroupManagerMBean.class | Bin 0 -> 2230 bytes .../jdbc/result/CachedResultSetMetaData.class | Bin 0 -> 309 bytes .../result/CachedResultSetMetaDataImpl.class | Bin 0 -> 731 bytes .../cj/jdbc/result/ResultSetFactory.class | Bin 0 -> 4583 bytes .../cj/jdbc/result/ResultSetImpl$1.class | Bin 0 -> 2555 bytes .../mysql/cj/jdbc/result/ResultSetImpl.class | Bin 0 -> 72139 bytes .../result/ResultSetInternalMethods.class | Bin 0 -> 1299 bytes .../cj/jdbc/result/ResultSetMetaData$1.class | Bin 0 -> 2262 bytes .../cj/jdbc/result/ResultSetMetaData.class | Bin 0 -> 9783 bytes .../cj/jdbc/result/UpdatableResultSet$1.class | Bin 0 -> 2269 bytes .../cj/jdbc/result/UpdatableResultSet.class | Bin 0 -> 52135 bytes .../mysql/cj/jdbc/util/BaseBugReport.class | Bin 0 -> 2311 bytes src/com/mysql/cj/log/BaseMetricsHolder.class | Bin 0 -> 7418 bytes src/com/mysql/cj/log/Jdk14Logger.class | Bin 0 -> 4349 bytes src/com/mysql/cj/log/Log.class | Bin 0 -> 574 bytes src/com/mysql/cj/log/LogFactory.class | Bin 0 -> 3103 bytes .../cj/log/LoggingProfilerEventHandler.class | Bin 0 -> 2855 bytes src/com/mysql/cj/log/NullLogger.class | Bin 0 -> 1902 bytes src/com/mysql/cj/log/ProfilerEvent.class | Bin 0 -> 779 bytes .../mysql/cj/log/ProfilerEventHandler.class | Bin 0 -> 411 bytes src/com/mysql/cj/log/ProfilerEventImpl.class | Bin 0 -> 6359 bytes src/com/mysql/cj/log/Slf4JLogger.class | Bin 0 -> 2603 bytes src/com/mysql/cj/log/StandardLogger.class | Bin 0 -> 3900 bytes .../cj/protocol/AbstractProtocol$1.class | Bin 0 -> 648 bytes .../cj/protocol/AbstractProtocol$2.class | Bin 0 -> 652 bytes .../mysql/cj/protocol/AbstractProtocol.class | Bin 0 -> 7013 bytes .../protocol/AbstractSocketConnection.class | Bin 0 -> 4399 bytes .../cj/protocol/AuthenticationPlugin.class | Bin 0 -> 1707 bytes .../cj/protocol/AuthenticationProvider.class | Bin 0 -> 581 bytes .../mysql/cj/protocol/ColumnDefinition.class | Bin 0 -> 1015 bytes .../ExportControlled$KeyStoreConf.class | Bin 0 -> 807 bytes ...rtControlled$X509TrustManagerWrapper.class | Bin 0 -> 8271 bytes .../mysql/cj/protocol/ExportControlled.class | Bin 0 -> 22939 bytes .../cj/protocol/FullReadInputStream.class | Bin 0 -> 2030 bytes src/com/mysql/cj/protocol/InternalDate.class | Bin 0 -> 1664 bytes src/com/mysql/cj/protocol/InternalTime.class | Bin 0 -> 3814 bytes .../mysql/cj/protocol/InternalTimestamp.class | Bin 0 -> 3739 bytes src/com/mysql/cj/protocol/Message.class | Bin 0 -> 176 bytes src/com/mysql/cj/protocol/MessageHeader.class | Bin 0 -> 241 bytes .../mysql/cj/protocol/MessageListener.class | Bin 0 -> 876 bytes src/com/mysql/cj/protocol/MessageReader.class | Bin 0 -> 2586 bytes src/com/mysql/cj/protocol/MessageSender.class | Bin 0 -> 1988 bytes ...medPipeSocketFactory$NamedPipeSocket.class | Bin 0 -> 2934 bytes ...tFactory$RandomAccessFileInputStream.class | Bin 0 -> 1356 bytes ...Factory$RandomAccessFileOutputStream.class | Bin 0 -> 1283 bytes .../cj/protocol/NamedPipeSocketFactory.class | Bin 0 -> 3817 bytes .../mysql/cj/protocol/NetworkResources.class | Bin 0 -> 1685 bytes .../cj/protocol/OutputStreamWatcher.class | Bin 0 -> 209 bytes .../protocol/PacketReceivedTimeHolder.class | Bin 0 -> 347 bytes .../cj/protocol/PacketSentTimeHolder.class | Bin 0 -> 417 bytes .../Protocol$ProtocolEventHandler.class | Bin 0 -> 632 bytes ...ocol$ProtocolEventListener$EventType.class | Bin 0 -> 1379 bytes .../Protocol$ProtocolEventListener.class | Bin 0 -> 451 bytes src/com/mysql/cj/protocol/Protocol.class | Bin 0 -> 3721 bytes .../mysql/cj/protocol/ProtocolEntity.class | Bin 0 -> 131 bytes .../cj/protocol/ProtocolEntityFactory.class | Bin 0 -> 1799 bytes .../cj/protocol/ProtocolEntityReader.class | Bin 0 -> 1704 bytes .../cj/protocol/ReadAheadInputStream.class | Bin 0 -> 4731 bytes src/com/mysql/cj/protocol/ResultBuilder.class | Bin 0 -> 319 bytes .../mysql/cj/protocol/ResultStreamer.class | Bin 0 -> 163 bytes .../cj/protocol/Resultset$Concurrency.class | Bin 0 -> 1711 bytes .../mysql/cj/protocol/Resultset$Type.class | Bin 0 -> 1720 bytes src/com/mysql/cj/protocol/Resultset.class | Bin 0 -> 876 bytes src/com/mysql/cj/protocol/ResultsetRow.class | Bin 0 -> 376 bytes src/com/mysql/cj/protocol/ResultsetRows.class | Bin 0 -> 1988 bytes .../cj/protocol/ResultsetRowsOwner.class | Bin 0 -> 571 bytes src/com/mysql/cj/protocol/Security.class | Bin 0 -> 2567 bytes .../cj/protocol/ServerCapabilities.class | Bin 0 -> 407 bytes src/com/mysql/cj/protocol/ServerSession.class | Bin 0 -> 2491 bytes ...Controller$ServerSessionStateChanges.class | Bin 0 -> 576 bytes ...onStateController$SessionStateChange.class | Bin 0 -> 1205 bytes ...ntroller$SessionStateChangesListener.class | Bin 0 -> 616 bytes .../ServerSessionStateController.class | Bin 0 -> 2045 bytes .../mysql/cj/protocol/SocketConnection.class | Bin 0 -> 1636 bytes src/com/mysql/cj/protocol/SocketFactory.class | Bin 0 -> 1469 bytes .../mysql/cj/protocol/SocketMetadata.class | Bin 0 -> 2286 bytes .../cj/protocol/SocksProxySocketFactory.class | Bin 0 -> 3205 bytes .../cj/protocol/StandardSocketFactory.class | Bin 0 -> 6044 bytes src/com/mysql/cj/protocol/ValueDecoder.class | Bin 0 -> 1170 bytes src/com/mysql/cj/protocol/ValueEncoder.class | Bin 0 -> 601 bytes src/com/mysql/cj/protocol/Warning.class | Bin 0 -> 210 bytes .../cj/protocol/WatchableOutputStream.class | Bin 0 -> 900 bytes .../mysql/cj/protocol/WatchableStream.class | Bin 0 -> 279 bytes .../mysql/cj/protocol/WatchableWriter.class | Bin 0 -> 765 bytes src/com/mysql/cj/protocol/WriterWatcher.class | Bin 0 -> 197 bytes .../cj/protocol/a/AbstractRowFactory.class | Bin 0 -> 1231 bytes .../cj/protocol/a/AbstractValueEncoder.class | Bin 0 -> 12570 bytes .../cj/protocol/a/BinaryResultsetReader.class | Bin 0 -> 7260 bytes .../cj/protocol/a/BinaryRowFactory.class | Bin 0 -> 5583 bytes .../cj/protocol/a/BlobValueEncoder.class | Bin 0 -> 1591 bytes .../cj/protocol/a/BooleanValueEncoder$1.class | Bin 0 -> 1940 bytes .../cj/protocol/a/BooleanValueEncoder.class | Bin 0 -> 4754 bytes .../cj/protocol/a/ByteArrayValueEncoder.class | Bin 0 -> 2666 bytes .../cj/protocol/a/ClobValueEncoder.class | Bin 0 -> 1177 bytes .../protocol/a/ColumnDefinitionFactory.class | Bin 0 -> 1810 bytes .../protocol/a/ColumnDefinitionReader$1.class | Bin 0 -> 1519 bytes .../protocol/a/ColumnDefinitionReader.class | Bin 0 -> 5991 bytes .../cj/protocol/a/CompressedInputStream.class | Bin 0 -> 5249 bytes .../protocol/a/CompressedPacketSender.class | Bin 0 -> 4125 bytes .../a/DebugBufferingPacketReader.class | Bin 0 -> 6754 bytes .../a/DebugBufferingPacketSender.class | Bin 0 -> 3447 bytes .../protocol/a/DurationValueEncoder$1.class | Bin 0 -> 1003 bytes .../cj/protocol/a/DurationValueEncoder.class | Bin 0 -> 3750 bytes .../protocol/a/InputStreamValueEncoder.class | Bin 0 -> 6387 bytes .../cj/protocol/a/InstantValueEncoder$1.class | Bin 0 -> 1193 bytes .../cj/protocol/a/InstantValueEncoder.class | Bin 0 -> 8065 bytes .../a/LocalDateTimeValueEncoder$1.class | Bin 0 -> 1211 bytes .../a/LocalDateTimeValueEncoder.class | Bin 0 -> 5792 bytes .../protocol/a/LocalDateValueEncoder$1.class | Bin 0 -> 1153 bytes .../cj/protocol/a/LocalDateValueEncoder.class | Bin 0 -> 4483 bytes .../protocol/a/LocalTimeValueEncoder$1.class | Bin 0 -> 1006 bytes .../cj/protocol/a/LocalTimeValueEncoder.class | Bin 0 -> 4335 bytes .../a/MergingColumnDefinitionFactory.class | Bin 0 -> 1811 bytes .../cj/protocol/a/MultiPacketReader.class | Bin 0 -> 4678 bytes .../protocol/a/MysqlBinaryValueDecoder.class | Bin 0 -> 8560 bytes .../cj/protocol/a/MysqlTextValueDecoder.class | Bin 0 -> 10857 bytes .../a/NativeAuthenticationProvider.class | Bin 0 -> 23226 bytes .../cj/protocol/a/NativeCapabilities.class | Bin 0 -> 4469 bytes .../a/NativeConstants$IntegerDataType.class | Bin 0 -> 1509 bytes ...NativeConstants$StringLengthDataType.class | Bin 0 -> 1294 bytes .../NativeConstants$StringSelfDataType.class | Bin 0 -> 1339 bytes .../mysql/cj/protocol/a/NativeConstants.class | Bin 0 -> 2657 bytes .../cj/protocol/a/NativeMessageBuilder.class | Bin 0 -> 13641 bytes .../cj/protocol/a/NativePacketHeader.class | Bin 0 -> 1014 bytes .../cj/protocol/a/NativePacketPayload$1.class | Bin 0 -> 2097 bytes .../cj/protocol/a/NativePacketPayload.class | Bin 0 -> 11793 bytes .../cj/protocol/a/NativeProtocol$1.class | Bin 0 -> 712 bytes .../cj/protocol/a/NativeProtocol$2.class | Bin 0 -> 716 bytes .../cj/protocol/a/NativeProtocol$3.class | Bin 0 -> 803 bytes .../mysql/cj/protocol/a/NativeProtocol.class | Bin 0 -> 74366 bytes .../cj/protocol/a/NativeServerSession.class | Bin 0 -> 10679 bytes ...ller$NativeServerSessionStateChanges.class | Bin 0 -> 3454 bytes .../NativeServerSessionStateController.class | Bin 0 -> 3255 bytes .../protocol/a/NativeSocketConnection$1.class | Bin 0 -> 791 bytes .../protocol/a/NativeSocketConnection.class | Bin 0 -> 4926 bytes src/com/mysql/cj/protocol/a/NativeUtils.class | Bin 0 -> 1214 bytes .../cj/protocol/a/NullValueEncoder.class | Bin 0 -> 1308 bytes .../cj/protocol/a/NumberValueEncoder$1.class | Bin 0 -> 2234 bytes .../cj/protocol/a/NumberValueEncoder.class | Bin 0 -> 4466 bytes .../a/OffsetDateTimeValueEncoder$1.class | Bin 0 -> 1214 bytes .../a/OffsetDateTimeValueEncoder.class | Bin 0 -> 7870 bytes .../protocol/a/OffsetTimeValueEncoder$1.class | Bin 0 -> 1009 bytes .../protocol/a/OffsetTimeValueEncoder.class | Bin 0 -> 4864 bytes .../mysql/cj/protocol/a/PacketSplitter.class | Bin 0 -> 910 bytes .../cj/protocol/a/ReaderValueEncoder.class | Bin 0 -> 3624 bytes .../cj/protocol/a/ResultsetFactory.class | Bin 0 -> 2489 bytes .../cj/protocol/a/ResultsetRowReader.class | Bin 0 -> 3899 bytes .../cj/protocol/a/SimplePacketReader.class | Bin 0 -> 5074 bytes .../cj/protocol/a/SimplePacketSender.class | Bin 0 -> 1657 bytes .../cj/protocol/a/SqlDateValueEncoder$1.class | Bin 0 -> 1147 bytes .../cj/protocol/a/SqlDateValueEncoder.class | Bin 0 -> 5955 bytes .../cj/protocol/a/SqlTimeValueEncoder$1.class | Bin 0 -> 1147 bytes .../cj/protocol/a/SqlTimeValueEncoder.class | Bin 0 -> 7479 bytes .../a/SqlTimestampValueEncoder$1.class | Bin 0 -> 1208 bytes .../protocol/a/SqlTimestampValueEncoder.class | Bin 0 -> 8317 bytes .../cj/protocol/a/StringValueEncoder$1.class | Bin 0 -> 2614 bytes .../cj/protocol/a/StringValueEncoder.class | Bin 0 -> 12296 bytes .../cj/protocol/a/TextResultsetReader.class | Bin 0 -> 6154 bytes .../mysql/cj/protocol/a/TextRowFactory.class | Bin 0 -> 3705 bytes .../protocol/a/TimeTrackingPacketReader.class | Bin 0 -> 3607 bytes .../protocol/a/TimeTrackingPacketSender.class | Bin 0 -> 1883 bytes .../cj/protocol/a/TracingPacketReader.class | Bin 0 -> 5123 bytes .../cj/protocol/a/TracingPacketSender.class | Bin 0 -> 2635 bytes .../a/UtilCalendarValueEncoder$1.class | Bin 0 -> 1208 bytes .../protocol/a/UtilCalendarValueEncoder.class | Bin 0 -> 8646 bytes .../protocol/a/UtilDateValueEncoder$1.class | Bin 0 -> 1150 bytes .../cj/protocol/a/UtilDateValueEncoder.class | Bin 0 -> 8384 bytes .../a/ZonedDateTimeValueEncoder$1.class | Bin 0 -> 1211 bytes .../a/ZonedDateTimeValueEncoder.class | Bin 0 -> 7824 bytes .../AuthenticationFidoClient.class | Bin 0 -> 5936 bytes .../AuthenticationKerberosClient$1.class | Bin 0 -> 2039 bytes .../AuthenticationKerberosClient.class | Bin 0 -> 11582 bytes ...AuthenticationLdapSaslClientPlugin$1.class | Bin 0 -> 2096 bytes ...AuthenticationLdapSaslClientPlugin$2.class | Bin 0 -> 1187 bytes ...lientPlugin$AuthenticationMechanisms.class | Bin 0 -> 2830 bytes .../AuthenticationLdapSaslClientPlugin.class | Bin 0 -> 11864 bytes .../AuthenticationOciClient.class | Bin 0 -> 7350 bytes .../CachingSha2PasswordPlugin$AuthStage.class | Bin 0 -> 1533 bytes .../CachingSha2PasswordPlugin.class | Bin 0 -> 6643 bytes .../MysqlClearPasswordPlugin.class | Bin 0 -> 4048 bytes .../MysqlNativePasswordPlugin.class | Bin 0 -> 3988 bytes .../MysqlOldPasswordPlugin.class | Bin 0 -> 6134 bytes .../authentication/Sha256PasswordPlugin.class | Bin 0 -> 9213 bytes .../protocol/a/result/AbstractBufferRow.class | Bin 0 -> 734 bytes .../a/result/AbstractResultsetRows.class | Bin 0 -> 1521 bytes .../protocol/a/result/BinaryBufferRow.class | Bin 0 -> 6987 bytes .../cj/protocol/a/result/ByteArrayRow.class | Bin 0 -> 2106 bytes .../protocol/a/result/NativeResultset.class | Bin 0 -> 3202 bytes .../mysql/cj/protocol/a/result/OkPacket.class | Bin 0 -> 3495 bytes .../a/result/ResultsetRowsCursor.class | Bin 0 -> 6461 bytes .../a/result/ResultsetRowsStatic.class | Bin 0 -> 3593 bytes .../a/result/ResultsetRowsStreaming.class | Bin 0 -> 9340 bytes .../cj/protocol/a/result/TextBufferRow.class | Bin 0 -> 3557 bytes .../result/AbstractResultsetRow$1.class | Bin 0 -> 2679 bytes .../result/AbstractResultsetRow.class | Bin 0 -> 4665 bytes .../cj/protocol/x/CompressionAlgorithm.class | Bin 0 -> 3937 bytes .../mysql/cj/protocol/x/CompressionMode.class | Bin 0 -> 1056 bytes .../x/CompressionSplittedInputStream.class | Bin 0 -> 6757 bytes .../x/CompressionSplittedOutputStream.class | Bin 0 -> 5792 bytes .../protocol/x/CompressorStreamsFactory.class | Bin 0 -> 3049 bytes .../cj/protocol/x/ConfinedInputStream.class | Bin 0 -> 2063 bytes .../cj/protocol/x/ContinuousInputStream.class | Bin 0 -> 2359 bytes .../protocol/x/ContinuousOutputStream.class | Bin 0 -> 562 bytes .../x/ErrorToFutureCompletionHandler.class | Bin 0 -> 1912 bytes .../mysql/cj/protocol/x/FetchDoneEntity.class | Bin 0 -> 366 bytes .../protocol/x/FetchDoneEntityFactory.class | Bin 0 -> 991 bytes .../cj/protocol/x/FetchDoneMoreResults.class | Bin 0 -> 381 bytes .../x/FetchDoneMoreResultsFactory.class | Bin 0 -> 1021 bytes .../mysql/cj/protocol/x/FieldFactory$1.class | Bin 0 -> 1781 bytes .../mysql/cj/protocol/x/FieldFactory.class | Bin 0 -> 6864 bytes .../cj/protocol/x/MessageConstants.class | Bin 0 -> 8930 bytes .../x/Notice$XSessionStateChanged.class | Bin 0 -> 2179 bytes .../x/Notice$XSessionVariableChanged.class | Bin 0 -> 1542 bytes .../mysql/cj/protocol/x/Notice$XWarning.class | Bin 0 -> 1598 bytes src/com/mysql/cj/protocol/x/Notice.class | Bin 0 -> 3815 bytes .../mysql/cj/protocol/x/NoticeFactory.class | Bin 0 -> 953 bytes src/com/mysql/cj/protocol/x/Ok.class | Bin 0 -> 359 bytes src/com/mysql/cj/protocol/x/OkBuilder.class | Bin 0 -> 1430 bytes src/com/mysql/cj/protocol/x/OkFactory.class | Bin 0 -> 913 bytes .../cj/protocol/x/ResultMessageListener.class | Bin 0 -> 3867 bytes .../cj/protocol/x/ReusableOutputStream.class | Bin 0 -> 607 bytes .../cj/protocol/x/StatementExecuteOk.class | Bin 0 -> 3091 bytes .../x/StatementExecuteOkBuilder.class | Bin 0 -> 4463 bytes .../x/StatementExecuteOkFactory.class | Bin 0 -> 1009 bytes .../x/SyncFlushDeflaterOutputStream.class | Bin 0 -> 551 bytes ...yncMessageReader$ListenersDispatcher.class | Bin 0 -> 2619 bytes .../cj/protocol/x/SyncMessageReader.class | Bin 0 -> 10727 bytes .../cj/protocol/x/SyncMessageSender.class | Bin 0 -> 4883 bytes .../x/XAuthenticationProvider$1.class | Bin 0 -> 987 bytes .../protocol/x/XAuthenticationProvider.class | Bin 0 -> 6223 bytes src/com/mysql/cj/protocol/x/XMessage.class | Bin 0 -> 5624 bytes .../cj/protocol/x/XMessageBuilder$1.class | Bin 0 -> 1849 bytes .../cj/protocol/x/XMessageBuilder$2.class | Bin 0 -> 1487 bytes .../mysql/cj/protocol/x/XMessageBuilder.class | Bin 0 -> 49035 bytes .../mysql/cj/protocol/x/XMessageHeader.class | Bin 0 -> 1648 bytes src/com/mysql/cj/protocol/x/XProtocol.class | Bin 0 -> 44339 bytes .../cj/protocol/x/XProtocolDecoder.class | Bin 0 -> 9363 bytes .../mysql/cj/protocol/x/XProtocolError.class | Bin 0 -> 1958 bytes .../mysql/cj/protocol/x/XProtocolRow.class | Bin 0 -> 3796 bytes .../cj/protocol/x/XProtocolRowFactory.class | Bin 0 -> 1308 bytes .../protocol/x/XProtocolRowInputStream.class | Bin 0 -> 2656 bytes .../cj/protocol/x/XServerCapabilities.class | Bin 0 -> 6858 bytes .../mysql/cj/protocol/x/XServerSession.class | Bin 0 -> 5488 bytes .../protocol/x/XpluginStatementCommand.class | Bin 0 -> 2117 bytes .../AbstractDateTimeValueFactory$1.class | Bin 0 -> 959 bytes .../result/AbstractDateTimeValueFactory.class | Bin 0 -> 4903 bytes .../result/AbstractNumericValueFactory.class | Bin 0 -> 2879 bytes .../cj/result/BigDecimalValueFactory.class | Bin 0 -> 2895 bytes .../cj/result/BinaryStreamValueFactory.class | Bin 0 -> 1140 bytes .../mysql/cj/result/BooleanValueFactory.class | Bin 0 -> 4791 bytes src/com/mysql/cj/result/BufferedRowList.class | Bin 0 -> 2736 bytes .../mysql/cj/result/ByteValueFactory.class | Bin 0 -> 4600 bytes .../cj/result/DefaultColumnDefinition$1.class | Bin 0 -> 961 bytes .../cj/result/DefaultColumnDefinition.class | Bin 0 -> 4885 bytes .../mysql/cj/result/DefaultValueFactory.class | Bin 0 -> 4054 bytes .../mysql/cj/result/DoubleValueFactory.class | Bin 0 -> 3216 bytes .../cj/result/DurationValueFactory.class | Bin 0 -> 2663 bytes src/com/mysql/cj/result/Field$1.class | Bin 0 -> 1894 bytes src/com/mysql/cj/result/Field.class | Bin 0 -> 7719 bytes .../mysql/cj/result/FloatValueFactory.class | Bin 0 -> 3323 bytes .../mysql/cj/result/IntegerValueFactory.class | Bin 0 -> 3369 bytes .../cj/result/LocalDateTimeValueFactory.class | Bin 0 -> 3011 bytes .../cj/result/LocalDateValueFactory.class | Bin 0 -> 2903 bytes .../cj/result/LocalTimeValueFactory.class | Bin 0 -> 3108 bytes .../mysql/cj/result/LongValueFactory.class | Bin 0 -> 3135 bytes .../result/OffsetDateTimeValueFactory.class | Bin 0 -> 5854 bytes .../cj/result/OffsetTimeValueFactory.class | Bin 0 -> 5561 bytes src/com/mysql/cj/result/Row.class | Bin 0 -> 1255 bytes src/com/mysql/cj/result/RowList.class | Bin 0 -> 1109 bytes .../mysql/cj/result/ShortValueFactory.class | Bin 0 -> 3344 bytes .../mysql/cj/result/SqlDateValueFactory.class | Bin 0 -> 4349 bytes .../mysql/cj/result/SqlTimeValueFactory.class | Bin 0 -> 4468 bytes .../cj/result/SqlTimestampValueFactory.class | Bin 0 -> 5407 bytes .../mysql/cj/result/StringValueFactory.class | Bin 0 -> 5658 bytes .../cj/result/UtilCalendarValueFactory.class | Bin 0 -> 4570 bytes src/com/mysql/cj/result/ValueFactory.class | Bin 0 -> 1418 bytes .../cj/result/ZonedDateTimeValueFactory.class | Bin 0 -> 5727 bytes .../mysql/cj/sasl/ScramSha1SaslClient.class | Bin 0 -> 3183 bytes .../mysql/cj/sasl/ScramSha256SaslClient.class | Bin 0 -> 3211 bytes .../mysql/cj/sasl/ScramShaSaslClient$1.class | Bin 0 -> 938 bytes ...cramShaSaslClient$ScramExchangeStage.class | Bin 0 -> 1765 bytes .../mysql/cj/sasl/ScramShaSaslClient.class | Bin 0 -> 8506 bytes .../cj/sasl/ScramShaSaslClientFactory.class | Bin 0 -> 4161 bytes ...ScramShaSaslProvider$ProviderService.class | Bin 0 -> 1987 bytes .../mysql/cj/sasl/ScramShaSaslProvider.class | Bin 0 -> 2056 bytes .../cj/util/Base64Decoder$IntWrapper.class | Bin 0 -> 463 bytes src/com/mysql/cj/util/Base64Decoder.class | Bin 0 -> 2209 bytes src/com/mysql/cj/util/DataTypeUtil.class | Bin 0 -> 556 bytes src/com/mysql/cj/util/DnsSrv$SrvRecord.class | Bin 0 -> 2311 bytes src/com/mysql/cj/util/DnsSrv.class | Bin 0 -> 5033 bytes src/com/mysql/cj/util/EscapeTokenizer.class | Bin 0 -> 2385 bytes src/com/mysql/cj/util/LRUCache.class | Bin 0 -> 1023 bytes src/com/mysql/cj/util/LazyString.class | Bin 0 -> 1697 bytes src/com/mysql/cj/util/LogUtils.class | Bin 0 -> 1884 bytes .../PerVmServerConfigCacheFactory$1.class | Bin 0 -> 2506 bytes .../util/PerVmServerConfigCacheFactory.class | Bin 0 -> 1561 bytes .../mysql/cj/util/SaslPrep$StringType.class | Bin 0 -> 1115 bytes src/com/mysql/cj/util/SaslPrep.class | Bin 0 -> 5646 bytes src/com/mysql/cj/util/SearchMode.class | Bin 0 -> 2637 bytes src/com/mysql/cj/util/SequentialIdLease.class | Bin 0 -> 1259 bytes src/com/mysql/cj/util/StringInspector.class | Bin 0 -> 14161 bytes src/com/mysql/cj/util/StringUtils.class | Bin 0 -> 30124 bytes src/com/mysql/cj/util/TestUtils.class | Bin 0 -> 536 bytes src/com/mysql/cj/util/TimeUtil.class | Bin 0 -> 15897 bytes .../mysql/cj/util/TimeZoneMapping.properties | 502 + src/com/mysql/cj/util/Util.class | Bin 0 -> 14429 bytes src/com/mysql/cj/x/protobuf/Mysqlx$1.class | Bin 0 -> 214 bytes .../x/protobuf/Mysqlx$ClientMessages$1.class | Bin 0 -> 1419 bytes .../Mysqlx$ClientMessages$Builder.class | Bin 0 -> 12100 bytes .../Mysqlx$ClientMessages$Type$1.class | Bin 0 -> 1181 bytes .../protobuf/Mysqlx$ClientMessages$Type.class | Bin 0 -> 6702 bytes .../cj/x/protobuf/Mysqlx$ClientMessages.class | Bin 0 -> 11925 bytes .../Mysqlx$ClientMessagesOrBuilder.class | Bin 0 -> 278 bytes .../mysql/cj/x/protobuf/Mysqlx$Error$1.class | Bin 0 -> 1365 bytes .../cj/x/protobuf/Mysqlx$Error$Builder.class | Bin 0 -> 16625 bytes .../x/protobuf/Mysqlx$Error$Severity$1.class | Bin 0 -> 1142 bytes .../cj/x/protobuf/Mysqlx$Error$Severity.class | Bin 0 -> 3831 bytes .../mysql/cj/x/protobuf/Mysqlx$Error.class | Bin 0 -> 16142 bytes .../cj/x/protobuf/Mysqlx$ErrorOrBuilder.class | Bin 0 -> 719 bytes src/com/mysql/cj/x/protobuf/Mysqlx$Ok$1.class | Bin 0 -> 1347 bytes .../cj/x/protobuf/Mysqlx$Ok$Builder.class | Bin 0 -> 13759 bytes src/com/mysql/cj/x/protobuf/Mysqlx$Ok.class | Bin 0 -> 13272 bytes .../cj/x/protobuf/Mysqlx$OkOrBuilder.class | Bin 0 -> 376 bytes .../x/protobuf/Mysqlx$ServerMessages$1.class | Bin 0 -> 1419 bytes .../Mysqlx$ServerMessages$Builder.class | Bin 0 -> 12102 bytes .../Mysqlx$ServerMessages$Type$1.class | Bin 0 -> 1181 bytes .../protobuf/Mysqlx$ServerMessages$Type.class | Bin 0 -> 5544 bytes .../cj/x/protobuf/Mysqlx$ServerMessages.class | Bin 0 -> 11927 bytes .../Mysqlx$ServerMessagesOrBuilder.class | Bin 0 -> 278 bytes src/com/mysql/cj/x/protobuf/Mysqlx.class | Bin 0 -> 7073 bytes .../cj/x/protobuf/MysqlxConnection$1.class | Bin 0 -> 244 bytes .../MysqlxConnection$Capabilities$1.class | Bin 0 -> 1497 bytes ...ysqlxConnection$Capabilities$Builder.class | Bin 0 -> 20570 bytes .../MysqlxConnection$Capabilities.class | Bin 0 -> 14760 bytes .../MysqlxConnection$CapabilitiesGet$1.class | Bin 0 -> 1515 bytes ...lxConnection$CapabilitiesGet$Builder.class | Bin 0 -> 12385 bytes .../MysqlxConnection$CapabilitiesGet.class | Bin 0 -> 12204 bytes ...xConnection$CapabilitiesGetOrBuilder.class | Bin 0 -> 310 bytes ...sqlxConnection$CapabilitiesOrBuilder.class | Bin 0 -> 983 bytes .../MysqlxConnection$CapabilitiesSet$1.class | Bin 0 -> 1515 bytes ...lxConnection$CapabilitiesSet$Builder.class | Bin 0 -> 16755 bytes .../MysqlxConnection$CapabilitiesSet.class | Bin 0 -> 14582 bytes ...xConnection$CapabilitiesSetOrBuilder.class | Bin 0 -> 714 bytes .../MysqlxConnection$Capability$1.class | Bin 0 -> 1485 bytes .../MysqlxConnection$Capability$Builder.class | Bin 0 -> 18156 bytes .../MysqlxConnection$Capability.class | Bin 0 -> 15890 bytes ...MysqlxConnection$CapabilityOrBuilder.class | Bin 0 -> 789 bytes .../x/protobuf/MysqlxConnection$Close$1.class | Bin 0 -> 1455 bytes .../MysqlxConnection$Close$Builder.class | Bin 0 -> 12175 bytes .../x/protobuf/MysqlxConnection$Close.class | Bin 0 -> 11944 bytes .../MysqlxConnection$CloseOrBuilder.class | Bin 0 -> 290 bytes .../MysqlxConnection$Compression$1.class | Bin 0 -> 1491 bytes ...MysqlxConnection$Compression$Builder.class | Bin 0 -> 16659 bytes .../MysqlxConnection$Compression.class | Bin 0 -> 16454 bytes ...ysqlxConnection$CompressionOrBuilder.class | Bin 0 -> 1002 bytes .../cj/x/protobuf/MysqlxConnection.class | Bin 0 -> 6447 bytes .../mysql/cj/x/protobuf/MysqlxCrud$1.class | Bin 0 -> 226 bytes .../x/protobuf/MysqlxCrud$Collection$1.class | Bin 0 -> 1431 bytes .../MysqlxCrud$Collection$Builder.class | Bin 0 -> 15189 bytes .../cj/x/protobuf/MysqlxCrud$Collection.class | Bin 0 -> 14596 bytes .../MysqlxCrud$CollectionOrBuilder.class | Bin 0 -> 472 bytes .../cj/x/protobuf/MysqlxCrud$Column$1.class | Bin 0 -> 1407 bytes .../protobuf/MysqlxCrud$Column$Builder.class | Bin 0 -> 23108 bytes .../cj/x/protobuf/MysqlxCrud$Column.class | Bin 0 -> 17086 bytes .../protobuf/MysqlxCrud$ColumnOrBuilder.class | Bin 0 -> 1192 bytes .../x/protobuf/MysqlxCrud$CreateView$1.class | Bin 0 -> 1431 bytes .../MysqlxCrud$CreateView$Builder.class | Bin 0 -> 27727 bytes .../cj/x/protobuf/MysqlxCrud$CreateView.class | Bin 0 -> 23053 bytes .../MysqlxCrud$CreateViewOrBuilder.class | Bin 0 -> 1915 bytes .../x/protobuf/MysqlxCrud$DataModel$1.class | Bin 0 -> 1088 bytes .../cj/x/protobuf/MysqlxCrud$DataModel.class | Bin 0 -> 3789 bytes .../cj/x/protobuf/MysqlxCrud$Delete$1.class | Bin 0 -> 1407 bytes .../protobuf/MysqlxCrud$Delete$Builder.class | Bin 0 -> 39135 bytes .../cj/x/protobuf/MysqlxCrud$Delete.class | Bin 0 -> 23877 bytes .../protobuf/MysqlxCrud$DeleteOrBuilder.class | Bin 0 -> 2990 bytes .../cj/x/protobuf/MysqlxCrud$DropView$1.class | Bin 0 -> 1419 bytes .../MysqlxCrud$DropView$Builder.class | Bin 0 -> 16893 bytes .../cj/x/protobuf/MysqlxCrud$DropView.class | Bin 0 -> 14838 bytes .../MysqlxCrud$DropViewOrBuilder.class | Bin 0 -> 684 bytes .../cj/x/protobuf/MysqlxCrud$Find$1.class | Bin 0 -> 1395 bytes .../x/protobuf/MysqlxCrud$Find$Builder.class | Bin 0 -> 53200 bytes .../protobuf/MysqlxCrud$Find$RowLock$1.class | Bin 0 -> 1161 bytes .../x/protobuf/MysqlxCrud$Find$RowLock.class | Bin 0 -> 3892 bytes .../MysqlxCrud$Find$RowLockOptions$1.class | Bin 0 -> 1203 bytes .../MysqlxCrud$Find$RowLockOptions.class | Bin 0 -> 3960 bytes .../mysql/cj/x/protobuf/MysqlxCrud$Find.class | Bin 0 -> 29878 bytes .../x/protobuf/MysqlxCrud$FindOrBuilder.class | Bin 0 -> 4506 bytes .../cj/x/protobuf/MysqlxCrud$Insert$1.class | Bin 0 -> 1407 bytes .../protobuf/MysqlxCrud$Insert$Builder.class | Bin 0 -> 36412 bytes .../MysqlxCrud$Insert$TypedRow$1.class | Bin 0 -> 1518 bytes .../MysqlxCrud$Insert$TypedRow$Builder.class | Bin 0 -> 20080 bytes .../protobuf/MysqlxCrud$Insert$TypedRow.class | Bin 0 -> 14592 bytes .../MysqlxCrud$Insert$TypedRowOrBuilder.class | Bin 0 -> 949 bytes .../cj/x/protobuf/MysqlxCrud$Insert.class | Bin 0 -> 21570 bytes .../protobuf/MysqlxCrud$InsertOrBuilder.class | Bin 0 -> 2700 bytes .../cj/x/protobuf/MysqlxCrud$Limit$1.class | Bin 0 -> 1401 bytes .../x/protobuf/MysqlxCrud$Limit$Builder.class | Bin 0 -> 13463 bytes .../cj/x/protobuf/MysqlxCrud$Limit.class | Bin 0 -> 13352 bytes .../x/protobuf/MysqlxCrud$LimitExpr$1.class | Bin 0 -> 1425 bytes .../MysqlxCrud$LimitExpr$Builder.class | Bin 0 -> 17757 bytes .../cj/x/protobuf/MysqlxCrud$LimitExpr.class | Bin 0 -> 14858 bytes .../MysqlxCrud$LimitExprOrBuilder.class | Bin 0 -> 709 bytes .../protobuf/MysqlxCrud$LimitOrBuilder.class | Bin 0 -> 368 bytes .../x/protobuf/MysqlxCrud$ModifyView$1.class | Bin 0 -> 1431 bytes .../MysqlxCrud$ModifyView$Builder.class | Bin 0 -> 27001 bytes .../cj/x/protobuf/MysqlxCrud$ModifyView.class | Bin 0 -> 22240 bytes .../MysqlxCrud$ModifyViewOrBuilder.class | Bin 0 -> 1857 bytes .../cj/x/protobuf/MysqlxCrud$Order$1.class | Bin 0 -> 1401 bytes .../x/protobuf/MysqlxCrud$Order$Builder.class | Bin 0 -> 17066 bytes .../MysqlxCrud$Order$Direction$1.class | Bin 0 -> 1180 bytes .../protobuf/MysqlxCrud$Order$Direction.class | Bin 0 -> 3893 bytes .../cj/x/protobuf/MysqlxCrud$Order.class | Bin 0 -> 15057 bytes .../protobuf/MysqlxCrud$OrderOrBuilder.class | Bin 0 -> 861 bytes .../x/protobuf/MysqlxCrud$Projection$1.class | Bin 0 -> 1431 bytes .../MysqlxCrud$Projection$Builder.class | Bin 0 -> 17871 bytes .../cj/x/protobuf/MysqlxCrud$Projection.class | Bin 0 -> 15614 bytes .../MysqlxCrud$ProjectionOrBuilder.class | Bin 0 -> 758 bytes .../cj/x/protobuf/MysqlxCrud$Update$1.class | Bin 0 -> 1407 bytes .../protobuf/MysqlxCrud$Update$Builder.class | Bin 0 -> 44825 bytes .../cj/x/protobuf/MysqlxCrud$Update.class | Bin 0 -> 25669 bytes .../MysqlxCrud$UpdateOperation$1.class | Bin 0 -> 1461 bytes .../MysqlxCrud$UpdateOperation$Builder.class | Bin 0 -> 20648 bytes ...qlxCrud$UpdateOperation$UpdateType$1.class | Bin 0 -> 1256 bytes ...ysqlxCrud$UpdateOperation$UpdateType.class | Bin 0 -> 4729 bytes .../protobuf/MysqlxCrud$UpdateOperation.class | Bin 0 -> 17146 bytes .../MysqlxCrud$UpdateOperationOrBuilder.class | Bin 0 -> 1307 bytes .../protobuf/MysqlxCrud$UpdateOrBuilder.class | Bin 0 -> 3619 bytes .../protobuf/MysqlxCrud$ViewAlgorithm$1.class | Bin 0 -> 1112 bytes .../x/protobuf/MysqlxCrud$ViewAlgorithm.class | Bin 0 -> 3944 bytes .../MysqlxCrud$ViewCheckOption$1.class | Bin 0 -> 1124 bytes .../protobuf/MysqlxCrud$ViewCheckOption.class | Bin 0 -> 3861 bytes .../MysqlxCrud$ViewSqlSecurity$1.class | Bin 0 -> 1124 bytes .../protobuf/MysqlxCrud$ViewSqlSecurity.class | Bin 0 -> 3863 bytes src/com/mysql/cj/x/protobuf/MysqlxCrud.class | Bin 0 -> 13844 bytes .../mysql/cj/x/protobuf/MysqlxCursor$1.class | Bin 0 -> 232 bytes .../cj/x/protobuf/MysqlxCursor$Close$1.class | Bin 0 -> 1419 bytes .../protobuf/MysqlxCursor$Close$Builder.class | Bin 0 -> 12921 bytes .../cj/x/protobuf/MysqlxCursor$Close.class | Bin 0 -> 12742 bytes .../MysqlxCursor$CloseOrBuilder.class | Bin 0 -> 334 bytes .../cj/x/protobuf/MysqlxCursor$Fetch$1.class | Bin 0 -> 1419 bytes .../protobuf/MysqlxCursor$Fetch$Builder.class | Bin 0 -> 13600 bytes .../cj/x/protobuf/MysqlxCursor$Fetch.class | Bin 0 -> 13514 bytes .../MysqlxCursor$FetchOrBuilder.class | Bin 0 -> 386 bytes .../cj/x/protobuf/MysqlxCursor$Open$1.class | Bin 0 -> 1413 bytes .../protobuf/MysqlxCursor$Open$Builder.class | Bin 0 -> 17616 bytes .../MysqlxCursor$Open$OneOfMessage$1.class | Bin 0 -> 1548 bytes ...sqlxCursor$Open$OneOfMessage$Builder.class | Bin 0 -> 17759 bytes ...ysqlxCursor$Open$OneOfMessage$Type$1.class | Bin 0 -> 1307 bytes .../MysqlxCursor$Open$OneOfMessage$Type.class | Bin 0 -> 3995 bytes .../MysqlxCursor$Open$OneOfMessage.class | Bin 0 -> 15674 bytes ...qlxCursor$Open$OneOfMessageOrBuilder.class | Bin 0 -> 1035 bytes .../cj/x/protobuf/MysqlxCursor$Open.class | Bin 0 -> 15543 bytes .../protobuf/MysqlxCursor$OpenOrBuilder.class | Bin 0 -> 824 bytes .../mysql/cj/x/protobuf/MysqlxCursor.class | Bin 0 -> 4937 bytes .../cj/x/protobuf/MysqlxDatatypes$1.class | Bin 0 -> 241 bytes .../cj/x/protobuf/MysqlxDatatypes$Any$1.class | Bin 0 -> 1434 bytes .../MysqlxDatatypes$Any$Builder.class | Bin 0 -> 23402 bytes .../protobuf/MysqlxDatatypes$Any$Type$1.class | Bin 0 -> 1176 bytes .../x/protobuf/MysqlxDatatypes$Any$Type.class | Bin 0 -> 3984 bytes .../cj/x/protobuf/MysqlxDatatypes$Any.class | Bin 0 -> 18471 bytes .../MysqlxDatatypes$AnyOrBuilder.class | Bin 0 -> 1514 bytes .../x/protobuf/MysqlxDatatypes$Array$1.class | Bin 0 -> 1446 bytes .../MysqlxDatatypes$Array$Builder.class | Bin 0 -> 19984 bytes .../cj/x/protobuf/MysqlxDatatypes$Array.class | Bin 0 -> 14411 bytes .../MysqlxDatatypes$ArrayOrBuilder.class | Bin 0 -> 869 bytes .../x/protobuf/MysqlxDatatypes$Object$1.class | Bin 0 -> 1452 bytes .../MysqlxDatatypes$Object$Builder.class | Bin 0 -> 20386 bytes ...MysqlxDatatypes$Object$ObjectField$1.class | Bin 0 -> 1586 bytes ...Datatypes$Object$ObjectField$Builder.class | Bin 0 -> 18365 bytes .../MysqlxDatatypes$Object$ObjectField.class | Bin 0 -> 16107 bytes ...atatypes$Object$ObjectFieldOrBuilder.class | Bin 0 -> 816 bytes .../x/protobuf/MysqlxDatatypes$Object.class | Bin 0 -> 14546 bytes .../MysqlxDatatypes$ObjectOrBuilder.class | Bin 0 -> 1036 bytes .../x/protobuf/MysqlxDatatypes$Scalar$1.class | Bin 0 -> 1452 bytes .../MysqlxDatatypes$Scalar$Builder.class | Bin 0 -> 24083 bytes .../MysqlxDatatypes$Scalar$Octets$1.class | Bin 0 -> 1556 bytes ...ysqlxDatatypes$Scalar$Octets$Builder.class | Bin 0 -> 14248 bytes .../MysqlxDatatypes$Scalar$Octets.class | Bin 0 -> 14049 bytes ...sqlxDatatypes$Scalar$OctetsOrBuilder.class | Bin 0 -> 502 bytes .../MysqlxDatatypes$Scalar$String$1.class | Bin 0 -> 1556 bytes ...ysqlxDatatypes$Scalar$String$Builder.class | Bin 0 -> 14299 bytes .../MysqlxDatatypes$Scalar$String.class | Bin 0 -> 14177 bytes ...sqlxDatatypes$Scalar$StringOrBuilder.class | Bin 0 -> 498 bytes .../MysqlxDatatypes$Scalar$Type$1.class | Bin 0 -> 1197 bytes .../MysqlxDatatypes$Scalar$Type.class | Bin 0 -> 4562 bytes .../x/protobuf/MysqlxDatatypes$Scalar.class | Bin 0 -> 20874 bytes .../MysqlxDatatypes$ScalarOrBuilder.class | Bin 0 -> 1510 bytes .../mysql/cj/x/protobuf/MysqlxDatatypes.class | Bin 0 -> 6032 bytes .../mysql/cj/x/protobuf/MysqlxExpect$1.class | Bin 0 -> 232 bytes .../cj/x/protobuf/MysqlxExpect$Close$1.class | Bin 0 -> 1419 bytes .../protobuf/MysqlxExpect$Close$Builder.class | Bin 0 -> 12071 bytes .../cj/x/protobuf/MysqlxExpect$Close.class | Bin 0 -> 11816 bytes .../MysqlxExpect$CloseOrBuilder.class | Bin 0 -> 278 bytes .../cj/x/protobuf/MysqlxExpect$Open$1.class | Bin 0 -> 1413 bytes .../protobuf/MysqlxExpect$Open$Builder.class | Bin 0 -> 21244 bytes .../MysqlxExpect$Open$Condition$1.class | Bin 0 -> 1530 bytes .../MysqlxExpect$Open$Condition$Builder.class | Bin 0 -> 15391 bytes ...$Open$Condition$ConditionOperation$1.class | Bin 0 -> 1370 bytes ...ct$Open$Condition$ConditionOperation.class | Bin 0 -> 4245 bytes .../MysqlxExpect$Open$Condition$Key$1.class | Bin 0 -> 1280 bytes .../MysqlxExpect$Open$Condition$Key.class | Bin 0 -> 4206 bytes .../MysqlxExpect$Open$Condition.class | Bin 0 -> 15281 bytes ...MysqlxExpect$Open$ConditionOrBuilder.class | Bin 0 -> 801 bytes .../MysqlxExpect$Open$CtxOperation$1.class | Bin 0 -> 1207 bytes .../MysqlxExpect$Open$CtxOperation.class | Bin 0 -> 4002 bytes .../cj/x/protobuf/MysqlxExpect$Open.class | Bin 0 -> 15695 bytes .../protobuf/MysqlxExpect$OpenOrBuilder.class | Bin 0 -> 1157 bytes .../mysql/cj/x/protobuf/MysqlxExpect.class | Bin 0 -> 4520 bytes .../mysql/cj/x/protobuf/MysqlxExpr$1.class | Bin 0 -> 226 bytes .../cj/x/protobuf/MysqlxExpr$Array$1.class | Bin 0 -> 1401 bytes .../x/protobuf/MysqlxExpr$Array$Builder.class | Bin 0 -> 19714 bytes .../cj/x/protobuf/MysqlxExpr$Array.class | Bin 0 -> 14222 bytes .../protobuf/MysqlxExpr$ArrayOrBuilder.class | Bin 0 -> 832 bytes .../MysqlxExpr$ColumnIdentifier$1.class | Bin 0 -> 1467 bytes .../MysqlxExpr$ColumnIdentifier$Builder.class | Bin 0 -> 24547 bytes .../MysqlxExpr$ColumnIdentifier.class | Bin 0 -> 18328 bytes ...MysqlxExpr$ColumnIdentifierOrBuilder.class | Bin 0 -> 1261 bytes .../MysqlxExpr$DocumentPathItem$1.class | Bin 0 -> 1467 bytes .../MysqlxExpr$DocumentPathItem$Builder.class | Bin 0 -> 15990 bytes .../MysqlxExpr$DocumentPathItem$Type$1.class | Bin 0 -> 1227 bytes .../MysqlxExpr$DocumentPathItem$Type.class | Bin 0 -> 4365 bytes .../MysqlxExpr$DocumentPathItem.class | Bin 0 -> 15651 bytes ...MysqlxExpr$DocumentPathItemOrBuilder.class | Bin 0 -> 726 bytes .../cj/x/protobuf/MysqlxExpr$Expr$1.class | Bin 0 -> 1395 bytes .../x/protobuf/MysqlxExpr$Expr$Builder.class | Bin 0 -> 34961 bytes .../x/protobuf/MysqlxExpr$Expr$Type$1.class | Bin 0 -> 1143 bytes .../cj/x/protobuf/MysqlxExpr$Expr$Type.class | Bin 0 -> 4474 bytes .../mysql/cj/x/protobuf/MysqlxExpr$Expr.class | Bin 0 -> 25516 bytes .../x/protobuf/MysqlxExpr$ExprOrBuilder.class | Bin 0 -> 2792 bytes .../protobuf/MysqlxExpr$FunctionCall$1.class | Bin 0 -> 1443 bytes .../MysqlxExpr$FunctionCall$Builder.class | Bin 0 -> 23614 bytes .../x/protobuf/MysqlxExpr$FunctionCall.class | Bin 0 -> 16299 bytes .../MysqlxExpr$FunctionCallOrBuilder.class | Bin 0 -> 1190 bytes .../x/protobuf/MysqlxExpr$Identifier$1.class | Bin 0 -> 1431 bytes .../MysqlxExpr$Identifier$Builder.class | Bin 0 -> 15217 bytes .../cj/x/protobuf/MysqlxExpr$Identifier.class | Bin 0 -> 14617 bytes .../MysqlxExpr$IdentifierOrBuilder.class | Bin 0 -> 484 bytes .../cj/x/protobuf/MysqlxExpr$Object$1.class | Bin 0 -> 1407 bytes .../protobuf/MysqlxExpr$Object$Builder.class | Bin 0 -> 20081 bytes .../MysqlxExpr$Object$ObjectField$1.class | Bin 0 -> 1536 bytes ...ysqlxExpr$Object$ObjectField$Builder.class | Bin 0 -> 18112 bytes .../MysqlxExpr$Object$ObjectField.class | Bin 0 -> 15876 bytes ...sqlxExpr$Object$ObjectFieldOrBuilder.class | Bin 0 -> 782 bytes .../cj/x/protobuf/MysqlxExpr$Object.class | Bin 0 -> 14341 bytes .../protobuf/MysqlxExpr$ObjectOrBuilder.class | Bin 0 -> 986 bytes .../cj/x/protobuf/MysqlxExpr$Operator$1.class | Bin 0 -> 1419 bytes .../MysqlxExpr$Operator$Builder.class | Bin 0 -> 21661 bytes .../cj/x/protobuf/MysqlxExpr$Operator.class | Bin 0 -> 16072 bytes .../MysqlxExpr$OperatorOrBuilder.class | Bin 0 -> 963 bytes src/com/mysql/cj/x/protobuf/MysqlxExpr.class | Bin 0 -> 7655 bytes .../mysql/cj/x/protobuf/MysqlxNotice$1.class | Bin 0 -> 232 bytes .../cj/x/protobuf/MysqlxNotice$Frame$1.class | Bin 0 -> 1419 bytes .../protobuf/MysqlxNotice$Frame$Builder.class | Bin 0 -> 14913 bytes .../protobuf/MysqlxNotice$Frame$Scope$1.class | Bin 0 -> 1172 bytes .../x/protobuf/MysqlxNotice$Frame$Scope.class | Bin 0 -> 3881 bytes .../protobuf/MysqlxNotice$Frame$Type$1.class | Bin 0 -> 1166 bytes .../x/protobuf/MysqlxNotice$Frame$Type.class | Bin 0 -> 4306 bytes .../cj/x/protobuf/MysqlxNotice$Frame.class | Bin 0 -> 14810 bytes .../MysqlxNotice$FrameOrBuilder.class | Bin 0 -> 632 bytes ...otice$GroupReplicationStateChanged$1.class | Bin 0 -> 1557 bytes ...GroupReplicationStateChanged$Builder.class | Bin 0 -> 15295 bytes ...$GroupReplicationStateChanged$Type$1.class | Bin 0 -> 1327 bytes ...ce$GroupReplicationStateChanged$Type.class | Bin 0 -> 4486 bytes ...xNotice$GroupReplicationStateChanged.class | Bin 0 -> 15033 bytes ...roupReplicationStateChangedOrBuilder.class | Bin 0 -> 497 bytes .../protobuf/MysqlxNotice$ServerHello$1.class | Bin 0 -> 1455 bytes .../MysqlxNotice$ServerHello$Builder.class | Bin 0 -> 12197 bytes .../x/protobuf/MysqlxNotice$ServerHello.class | Bin 0 -> 11972 bytes .../MysqlxNotice$ServerHelloOrBuilder.class | Bin 0 -> 290 bytes .../MysqlxNotice$SessionStateChanged$1.class | Bin 0 -> 1503 bytes ...lxNotice$SessionStateChanged$Builder.class | Bin 0 -> 21741 bytes ...tice$SessionStateChanged$Parameter$1.class | Bin 0 -> 1294 bytes ...Notice$SessionStateChanged$Parameter.class | Bin 0 -> 5259 bytes .../MysqlxNotice$SessionStateChanged.class | Bin 0 -> 16221 bytes ...xNotice$SessionStateChangedOrBuilder.class | Bin 0 -> 1258 bytes ...ysqlxNotice$SessionVariableChanged$1.class | Bin 0 -> 1521 bytes ...otice$SessionVariableChanged$Builder.class | Bin 0 -> 18442 bytes .../MysqlxNotice$SessionVariableChanged.class | Bin 0 -> 16145 bytes ...tice$SessionVariableChangedOrBuilder.class | Bin 0 -> 822 bytes .../x/protobuf/MysqlxNotice$Warning$1.class | Bin 0 -> 1431 bytes .../MysqlxNotice$Warning$Builder.class | Bin 0 -> 15785 bytes .../MysqlxNotice$Warning$Level$1.class | Bin 0 -> 1186 bytes .../protobuf/MysqlxNotice$Warning$Level.class | Bin 0 -> 4004 bytes .../cj/x/protobuf/MysqlxNotice$Warning.class | Bin 0 -> 15455 bytes .../MysqlxNotice$WarningOrBuilder.class | Bin 0 -> 681 bytes .../mysql/cj/x/protobuf/MysqlxNotice.class | Bin 0 -> 7046 bytes .../mysql/cj/x/protobuf/MysqlxPrepare$1.class | Bin 0 -> 235 bytes .../protobuf/MysqlxPrepare$Deallocate$1.class | Bin 0 -> 1458 bytes .../MysqlxPrepare$Deallocate$Builder.class | Bin 0 -> 13054 bytes .../x/protobuf/MysqlxPrepare$Deallocate.class | Bin 0 -> 12902 bytes .../MysqlxPrepare$DeallocateOrBuilder.class | Bin 0 -> 343 bytes .../x/protobuf/MysqlxPrepare$Execute$1.class | Bin 0 -> 1440 bytes .../MysqlxPrepare$Execute$Builder.class | Bin 0 -> 21400 bytes .../cj/x/protobuf/MysqlxPrepare$Execute.class | Bin 0 -> 16054 bytes .../MysqlxPrepare$ExecuteOrBuilder.class | Bin 0 -> 1011 bytes .../x/protobuf/MysqlxPrepare$Prepare$1.class | Bin 0 -> 1440 bytes .../MysqlxPrepare$Prepare$Builder.class | Bin 0 -> 17118 bytes ...MysqlxPrepare$Prepare$OneOfMessage$1.class | Bin 0 -> 1579 bytes ...Prepare$Prepare$OneOfMessage$Builder.class | Bin 0 -> 30000 bytes ...xPrepare$Prepare$OneOfMessage$Type$1.class | Bin 0 -> 1340 bytes ...qlxPrepare$Prepare$OneOfMessage$Type.class | Bin 0 -> 4442 bytes .../MysqlxPrepare$Prepare$OneOfMessage.class | Bin 0 -> 22207 bytes ...repare$Prepare$OneOfMessageOrBuilder.class | Bin 0 -> 2357 bytes .../cj/x/protobuf/MysqlxPrepare$Prepare.class | Bin 0 -> 14930 bytes .../MysqlxPrepare$PrepareOrBuilder.class | Bin 0 -> 800 bytes .../mysql/cj/x/protobuf/MysqlxPrepare.class | Bin 0 -> 5485 bytes .../cj/x/protobuf/MysqlxResultset$1.class | Bin 0 -> 241 bytes .../MysqlxResultset$ColumnMetaData$1.class | Bin 0 -> 1500 bytes ...sqlxResultset$ColumnMetaData$Builder.class | Bin 0 -> 20873 bytes ...Resultset$ColumnMetaData$FieldType$1.class | Bin 0 -> 1283 bytes ...lxResultset$ColumnMetaData$FieldType.class | Bin 0 -> 5036 bytes .../MysqlxResultset$ColumnMetaData.class | Bin 0 -> 20498 bytes ...qlxResultset$ColumnMetaDataOrBuilder.class | Bin 0 -> 1138 bytes .../MysqlxResultset$ContentType_BYTES$1.class | Bin 0 -> 1171 bytes .../MysqlxResultset$ContentType_BYTES.class | Bin 0 -> 4041 bytes ...sqlxResultset$ContentType_DATETIME$1.class | Bin 0 -> 1189 bytes ...MysqlxResultset$ContentType_DATETIME.class | Bin 0 -> 3984 bytes .../MysqlxResultset$FetchDone$1.class | Bin 0 -> 1470 bytes .../MysqlxResultset$FetchDone$Builder.class | Bin 0 -> 12233 bytes .../protobuf/MysqlxResultset$FetchDone.class | Bin 0 -> 12016 bytes ...lxResultset$FetchDoneMoreOutParams$1.class | Bin 0 -> 1548 bytes ...ltset$FetchDoneMoreOutParams$Builder.class | Bin 0 -> 12502 bytes ...sqlxResultset$FetchDoneMoreOutParams.class | Bin 0 -> 12350 bytes ...tset$FetchDoneMoreOutParamsOrBuilder.class | Bin 0 -> 321 bytes ...xResultset$FetchDoneMoreResultsets$1.class | Bin 0 -> 1554 bytes ...tset$FetchDoneMoreResultsets$Builder.class | Bin 0 -> 12525 bytes ...qlxResultset$FetchDoneMoreResultsets.class | Bin 0 -> 12378 bytes ...set$FetchDoneMoreResultsetsOrBuilder.class | Bin 0 -> 323 bytes .../MysqlxResultset$FetchDoneOrBuilder.class | Bin 0 -> 295 bytes .../MysqlxResultset$FetchSuspended$1.class | Bin 0 -> 1500 bytes ...sqlxResultset$FetchSuspended$Builder.class | Bin 0 -> 12338 bytes .../MysqlxResultset$FetchSuspended.class | Bin 0 -> 12146 bytes ...qlxResultset$FetchSuspendedOrBuilder.class | Bin 0 -> 305 bytes .../cj/x/protobuf/MysqlxResultset$Row$1.class | Bin 0 -> 1434 bytes .../MysqlxResultset$Row$Builder.class | Bin 0 -> 14838 bytes .../cj/x/protobuf/MysqlxResultset$Row.class | Bin 0 -> 13689 bytes .../MysqlxResultset$RowOrBuilder.class | Bin 0 -> 489 bytes .../mysql/cj/x/protobuf/MysqlxResultset.class | Bin 0 -> 6912 bytes .../mysql/cj/x/protobuf/MysqlxSession$1.class | Bin 0 -> 235 bytes ...MysqlxSession$AuthenticateContinue$1.class | Bin 0 -> 1518 bytes ...Session$AuthenticateContinue$Builder.class | Bin 0 -> 13673 bytes .../MysqlxSession$AuthenticateContinue.class | Bin 0 -> 13486 bytes ...ession$AuthenticateContinueOrBuilder.class | Bin 0 -> 398 bytes .../MysqlxSession$AuthenticateOk$1.class | Bin 0 -> 1482 bytes ...MysqlxSession$AuthenticateOk$Builder.class | Bin 0 -> 13498 bytes .../MysqlxSession$AuthenticateOk.class | Bin 0 -> 13291 bytes ...ysqlxSession$AuthenticateOkOrBuilder.class | Bin 0 -> 386 bytes .../MysqlxSession$AuthenticateStart$1.class | Bin 0 -> 1500 bytes ...qlxSession$AuthenticateStart$Builder.class | Bin 0 -> 15829 bytes .../MysqlxSession$AuthenticateStart.class | Bin 0 -> 15474 bytes ...lxSession$AuthenticateStartOrBuilder.class | Bin 0 -> 544 bytes .../cj/x/protobuf/MysqlxSession$Close$1.class | Bin 0 -> 1428 bytes .../MysqlxSession$Close$Builder.class | Bin 0 -> 12097 bytes .../cj/x/protobuf/MysqlxSession$Close.class | Bin 0 -> 11848 bytes .../MysqlxSession$CloseOrBuilder.class | Bin 0 -> 281 bytes .../cj/x/protobuf/MysqlxSession$Reset$1.class | Bin 0 -> 1428 bytes .../MysqlxSession$Reset$Builder.class | Bin 0 -> 12968 bytes .../cj/x/protobuf/MysqlxSession$Reset.class | Bin 0 -> 12870 bytes .../MysqlxSession$ResetOrBuilder.class | Bin 0 -> 331 bytes .../mysql/cj/x/protobuf/MysqlxSession.class | Bin 0 -> 5563 bytes src/com/mysql/cj/x/protobuf/MysqlxSql$1.class | Bin 0 -> 223 bytes .../x/protobuf/MysqlxSql$StmtExecute$1.class | Bin 0 -> 1428 bytes .../MysqlxSql$StmtExecute$Builder.class | Bin 0 -> 23326 bytes .../cj/x/protobuf/MysqlxSql$StmtExecute.class | Bin 0 -> 17818 bytes .../protobuf/MysqlxSql$StmtExecuteOk$1.class | Bin 0 -> 1440 bytes .../MysqlxSql$StmtExecuteOk$Builder.class | Bin 0 -> 12161 bytes .../x/protobuf/MysqlxSql$StmtExecuteOk.class | Bin 0 -> 11928 bytes .../MysqlxSql$StmtExecuteOkOrBuilder.class | Bin 0 -> 285 bytes .../MysqlxSql$StmtExecuteOrBuilder.class | Bin 0 -> 1137 bytes src/com/mysql/cj/x/protobuf/MysqlxSql.class | Bin 0 -> 4010 bytes .../mysql/cj/x/protobuf/package-info.class | Bin 0 -> 129 bytes .../mysql/cj/xdevapi/AbstractDataResult.class | Bin 0 -> 4856 bytes .../cj/xdevapi/AbstractFilterParams.class | Bin 0 -> 9213 bytes src/com/mysql/cj/xdevapi/AddResult.class | Bin 0 -> 263 bytes .../mysql/cj/xdevapi/AddResultBuilder.class | Bin 0 -> 1049 bytes src/com/mysql/cj/xdevapi/AddResultImpl.class | Bin 0 -> 704 bytes src/com/mysql/cj/xdevapi/AddStatement.class | Bin 0 -> 541 bytes .../mysql/cj/xdevapi/AddStatementImpl.class | Bin 0 -> 5328 bytes .../cj/xdevapi/Client$ClientProperty.class | Bin 0 -> 1633 bytes src/com/mysql/cj/xdevapi/Client.class | Bin 0 -> 288 bytes src/com/mysql/cj/xdevapi/ClientFactory.class | Bin 0 -> 863 bytes src/com/mysql/cj/xdevapi/ClientImpl$1.class | Bin 0 -> 1011 bytes .../xdevapi/ClientImpl$PooledXProtocol.class | Bin 0 -> 2928 bytes src/com/mysql/cj/xdevapi/ClientImpl.class | Bin 0 -> 18973 bytes src/com/mysql/cj/xdevapi/Collection.class | Bin 0 -> 1328 bytes src/com/mysql/cj/xdevapi/CollectionImpl.class | Bin 0 -> 10205 bytes src/com/mysql/cj/xdevapi/Column.class | Bin 0 -> 588 bytes src/com/mysql/cj/xdevapi/ColumnImpl$1.class | Bin 0 -> 1527 bytes src/com/mysql/cj/xdevapi/ColumnImpl.class | Bin 0 -> 4385 bytes .../CreateIndexParams$IndexField.class | Bin 0 -> 3893 bytes .../mysql/cj/xdevapi/CreateIndexParams.class | Bin 0 -> 4050 bytes .../DatabaseObject$DbObjectStatus.class | Bin 0 -> 1263 bytes .../xdevapi/DatabaseObject$DbObjectType.class | Bin 0 -> 1303 bytes src/com/mysql/cj/xdevapi/DatabaseObject.class | Bin 0 -> 546 bytes .../xdevapi/DatabaseObjectDescription.class | Bin 0 -> 1045 bytes src/com/mysql/cj/xdevapi/DbDoc.class | Bin 0 -> 408 bytes src/com/mysql/cj/xdevapi/DbDocFactory.class | Bin 0 -> 1194 bytes src/com/mysql/cj/xdevapi/DbDocImpl.class | Bin 0 -> 2020 bytes .../mysql/cj/xdevapi/DbDocValueFactory.class | Bin 0 -> 1907 bytes .../mysql/cj/xdevapi/DeleteStatement.class | Bin 0 -> 529 bytes .../cj/xdevapi/DeleteStatementImpl.class | Bin 0 -> 3061 bytes .../mysql/cj/xdevapi/DocFilterParams.class | Bin 0 -> 2369 bytes src/com/mysql/cj/xdevapi/DocResult.class | Bin 0 -> 329 bytes .../mysql/cj/xdevapi/DocResultBuilder.class | Bin 0 -> 3884 bytes src/com/mysql/cj/xdevapi/DocResultImpl.class | Bin 0 -> 1203 bytes src/com/mysql/cj/xdevapi/ExprParser$1.class | Bin 0 -> 1910 bytes .../cj/xdevapi/ExprParser$ParseExpr.class | Bin 0 -> 452 bytes .../mysql/cj/xdevapi/ExprParser$Token.class | Bin 0 -> 1328 bytes .../cj/xdevapi/ExprParser$TokenType.class | Bin 0 -> 5611 bytes src/com/mysql/cj/xdevapi/ExprParser.class | Bin 0 -> 35667 bytes src/com/mysql/cj/xdevapi/ExprUnparser$1.class | Bin 0 -> 2497 bytes src/com/mysql/cj/xdevapi/ExprUnparser.class | Bin 0 -> 11916 bytes src/com/mysql/cj/xdevapi/ExprUtil.class | Bin 0 -> 12188 bytes src/com/mysql/cj/xdevapi/Expression.class | Bin 0 -> 646 bytes src/com/mysql/cj/xdevapi/FetchResult.class | Bin 0 -> 1046 bytes .../cj/xdevapi/FilterParams$RowLock.class | Bin 0 -> 1334 bytes .../xdevapi/FilterParams$RowLockOptions.class | Bin 0 -> 1381 bytes src/com/mysql/cj/xdevapi/FilterParams.class | Bin 0 -> 1214 bytes .../cj/xdevapi/FilterableStatement.class | Bin 0 -> 2726 bytes src/com/mysql/cj/xdevapi/FindStatement.class | Bin 0 -> 1244 bytes .../cj/xdevapi/FindStatementImpl$1.class | Bin 0 -> 908 bytes .../mysql/cj/xdevapi/FindStatementImpl.class | Bin 0 -> 6358 bytes src/com/mysql/cj/xdevapi/InsertParams.class | Bin 0 -> 4935 bytes src/com/mysql/cj/xdevapi/InsertResult.class | Bin 0 -> 214 bytes .../cj/xdevapi/InsertResultBuilder.class | Bin 0 -> 1067 bytes .../mysql/cj/xdevapi/InsertResultImpl.class | Bin 0 -> 679 bytes .../mysql/cj/xdevapi/InsertStatement.class | Bin 0 -> 827 bytes .../cj/xdevapi/InsertStatementImpl.class | Bin 0 -> 2976 bytes src/com/mysql/cj/xdevapi/JsonArray.class | Bin 0 -> 1635 bytes src/com/mysql/cj/xdevapi/JsonLiteral.class | Bin 0 -> 1382 bytes src/com/mysql/cj/xdevapi/JsonNumber.class | Bin 0 -> 1044 bytes .../cj/xdevapi/JsonParser$EscapeChar.class | Bin 0 -> 1843 bytes .../xdevapi/JsonParser$StructuralToken.class | Bin 0 -> 1529 bytes .../cj/xdevapi/JsonParser$Whitespace.class | Bin 0 -> 1345 bytes src/com/mysql/cj/xdevapi/JsonParser.class | Bin 0 -> 9904 bytes src/com/mysql/cj/xdevapi/JsonString.class | Bin 0 -> 2159 bytes src/com/mysql/cj/xdevapi/JsonValue.class | Bin 0 -> 333 bytes .../mysql/cj/xdevapi/ModifyStatement.class | Bin 0 -> 775 bytes .../cj/xdevapi/ModifyStatementImpl.class | Bin 0 -> 7349 bytes .../cj/xdevapi/PreparableStatement$1.class | Bin 0 -> 1119 bytes ...atement$PreparableStatementFinalizer.class | Bin 0 -> 1348 bytes .../PreparableStatement$PreparedState.class | Bin 0 -> 1536 bytes .../cj/xdevapi/PreparableStatement.class | Bin 0 -> 3767 bytes .../mysql/cj/xdevapi/RemoveStatement.class | Bin 0 -> 551 bytes .../cj/xdevapi/RemoveStatementImpl.class | Bin 0 -> 4053 bytes src/com/mysql/cj/xdevapi/Result.class | Bin 0 -> 341 bytes src/com/mysql/cj/xdevapi/Row.class | Bin 0 -> 977 bytes src/com/mysql/cj/xdevapi/RowFactory.class | Bin 0 -> 1413 bytes src/com/mysql/cj/xdevapi/RowImpl.class | Bin 0 -> 5458 bytes src/com/mysql/cj/xdevapi/RowResult.class | Bin 0 -> 534 bytes .../mysql/cj/xdevapi/RowResultBuilder.class | Bin 0 -> 4245 bytes src/com/mysql/cj/xdevapi/RowResultImpl.class | Bin 0 -> 3256 bytes .../Schema$CreateCollectionOptions.class | Bin 0 -> 1291 bytes .../Schema$ModifyCollectionOptions.class | Bin 0 -> 884 bytes .../Schema$Validation$ValidationLevel.class | Bin 0 -> 1280 bytes .../mysql/cj/xdevapi/Schema$Validation.class | Bin 0 -> 1191 bytes src/com/mysql/cj/xdevapi/Schema.class | Bin 0 -> 1453 bytes src/com/mysql/cj/xdevapi/SchemaImpl.class | Bin 0 -> 11160 bytes .../mysql/cj/xdevapi/SelectStatement.class | Bin 0 -> 943 bytes .../cj/xdevapi/SelectStatementImpl$1.class | Bin 0 -> 914 bytes .../cj/xdevapi/SelectStatementImpl.class | Bin 0 -> 5490 bytes src/com/mysql/cj/xdevapi/Session.class | Bin 0 -> 863 bytes src/com/mysql/cj/xdevapi/SessionFactory.class | Bin 0 -> 3901 bytes src/com/mysql/cj/xdevapi/SessionImpl.class | Bin 0 -> 9513 bytes src/com/mysql/cj/xdevapi/SqlMultiResult.class | Bin 0 -> 3637 bytes src/com/mysql/cj/xdevapi/SqlResult.class | Bin 0 -> 667 bytes .../mysql/cj/xdevapi/SqlResultBuilder.class | Bin 0 -> 4971 bytes .../mysql/cj/xdevapi/SqlSingleResult.class | Bin 0 -> 1127 bytes src/com/mysql/cj/xdevapi/SqlStatement.class | Bin 0 -> 306 bytes .../mysql/cj/xdevapi/SqlStatementImpl.class | Bin 0 -> 3106 bytes .../mysql/cj/xdevapi/SqlUpdateResult.class | Bin 0 -> 1836 bytes .../cj/xdevapi/Statement$LockContention.class | Bin 0 -> 1232 bytes src/com/mysql/cj/xdevapi/Statement.class | Bin 0 -> 3637 bytes .../xdevapi/StreamingDocResultBuilder.class | Bin 0 -> 4155 bytes .../xdevapi/StreamingRowResultBuilder.class | Bin 0 -> 4461 bytes .../xdevapi/StreamingSqlResultBuilder.class | Bin 0 -> 6408 bytes src/com/mysql/cj/xdevapi/Table.class | Bin 0 -> 711 bytes .../mysql/cj/xdevapi/TableFilterParams.class | Bin 0 -> 1368 bytes src/com/mysql/cj/xdevapi/TableImpl.class | Bin 0 -> 8498 bytes src/com/mysql/cj/xdevapi/Type.class | Bin 0 -> 1815 bytes src/com/mysql/cj/xdevapi/UpdateParams.class | Bin 0 -> 2666 bytes src/com/mysql/cj/xdevapi/UpdateResult.class | Bin 0 -> 922 bytes .../cj/xdevapi/UpdateResultBuilder.class | Bin 0 -> 2051 bytes src/com/mysql/cj/xdevapi/UpdateSpec.class | Bin 0 -> 2770 bytes .../mysql/cj/xdevapi/UpdateStatement.class | Bin 0 -> 792 bytes .../cj/xdevapi/UpdateStatementImpl.class | Bin 0 -> 4156 bytes src/com/mysql/cj/xdevapi/UpdateType.class | Bin 0 -> 1332 bytes src/com/mysql/cj/xdevapi/Warning.class | Bin 0 -> 153 bytes src/com/mysql/cj/xdevapi/WarningImpl.class | Bin 0 -> 790 bytes src/com/mysql/cj/xdevapi/XDevAPIError.class | Bin 0 -> 620 bytes src/com/mysql/cj/xdevapi/package-info.class | Bin 0 -> 126 bytes src/com/mysql/jdbc/Driver.class | Bin 0 -> 760 bytes src/com/mysql/jdbc/SocketFactory.class | Bin 0 -> 464 bytes src/com/mysql/jdbc/SocketFactoryWrapper.class | Bin 0 -> 2034 bytes src/org/json/simple/ItemList.java | 147 + src/org/json/simple/JSONArray.java | 381 + src/org/json/simple/JSONAware.java | 12 + src/org/json/simple/JSONObject.java | 132 + src/org/json/simple/JSONStreamAware.java | 15 + src/org/json/simple/JSONValue.java | 316 + .../json/simple/parser/ContainerFactory.java | 23 + .../json/simple/parser/ContentHandler.java | 110 + src/org/json/simple/parser/JSONParser.java | 533 + .../json/simple/parser/ParseException.java | 90 + src/org/json/simple/parser/Yylex.java | 688 + src/org/json/simple/parser/Yytoken.java | 58 + 1891 files changed, 334497 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/artifacts/WorkoutDBDatesAutoUpdater_jar.xml create mode 100644 .idea/libraries/java.xml create mode 100644 .idea/libraries/mysql_connector_j_8_0.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 WorkoutDBDatesAutoUpdater.iml create mode 100644 config.json create mode 100644 json-simple-master/.classpath create mode 100644 json-simple-master/.gitignore create mode 100644 json-simple-master/.project create mode 100644 json-simple-master/AUTHORS.txt create mode 100644 json-simple-master/ChangeLog.txt create mode 100644 json-simple-master/LICENSE.txt create mode 100644 json-simple-master/README.txt create mode 100644 json-simple-master/VERSION.txt create mode 100644 json-simple-master/build.xml create mode 100644 json-simple-master/doc/json.lex create mode 100644 json-simple-master/pom.xml create mode 100644 json-simple-master/src/main/java/org/json/simple/ItemList.java create mode 100644 json-simple-master/src/main/java/org/json/simple/JSONArray.java create mode 100644 json-simple-master/src/main/java/org/json/simple/JSONAware.java create mode 100644 json-simple-master/src/main/java/org/json/simple/JSONObject.java create mode 100644 json-simple-master/src/main/java/org/json/simple/JSONStreamAware.java create mode 100644 json-simple-master/src/main/java/org/json/simple/JSONValue.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/ContainerFactory.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/ContentHandler.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/JSONParser.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/ParseException.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/Yylex.java create mode 100644 json-simple-master/src/main/java/org/json/simple/parser/Yytoken.java create mode 100644 json-simple-master/src/test/java/org/json/simple/JSONArrayTest.java create mode 100644 json-simple-master/src/test/java/org/json/simple/JSONValueTest.java create mode 100644 json-simple-master/src/test/java/org/json/simple/Test.java create mode 100644 json-simple-master/src/test/java/org/json/simple/parser/YylexTest.java create mode 100644 json-simple-master/test.xml create mode 100644 logs/log.log create mode 100644 logs/oldLog.log create mode 100644 mysql-connector-j-8.0.31/CHANGES create mode 100644 mysql-connector-j-8.0.31/INFO_BIN create mode 100644 mysql-connector-j-8.0.31/INFO_SRC create mode 100644 mysql-connector-j-8.0.31/LICENSE create mode 100644 mysql-connector-j-8.0.31/README create mode 100644 mysql-connector-j-8.0.31/build.xml create mode 100644 mysql-connector-j-8.0.31/mysql-connector-j-8.0.31.jar create mode 100644 mysql-connector-j-8.0.31/src/build/java/documentation/ErrorMappingsDocGenerator.java create mode 100644 mysql-connector-j-8.0.31/src/build/java/documentation/PropertiesDocGenerator.java create mode 100644 mysql-connector-j-8.0.31/src/build/java/instrumentation/AddMethods.java create mode 100644 mysql-connector-j-8.0.31/src/build/java/instrumentation/CommonChecks.java create mode 100644 mysql-connector-j-8.0.31/src/build/java/instrumentation/TranslateExceptions.java create mode 100644 mysql-connector-j-8.0.31/src/build/misc/Product.wxs create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/changelog create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/compat create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/control create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/copyright create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/install create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/rules create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/source/format create mode 100644 mysql-connector-j-8.0.31/src/build/misc/debian.in/watch create mode 100644 mysql-connector-j-8.0.31/src/build/misc/pom-relocation.xml create mode 100644 mysql-connector-j-8.0.31/src/build/misc/pom.xml create mode 100644 mysql-connector-j-8.0.31/src/build/misc/rpm.spec.in create mode 100644 mysql-connector-j-8.0.31/src/demo/java/demo/x/devapi/DevApiSample.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/Mysqlx.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxConnection.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCrud.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCursor.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxDatatypes.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpect.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpr.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxNotice.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxPrepare.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxResultset.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSession.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSql.java create mode 100644 mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/package-info.java create mode 100644 mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/Driver.java create mode 100644 mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactoryWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/BindValue.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapter.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapterFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CancelQueryTask.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetMapping.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetSettings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Constants.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/DataStoreMetadata.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MessageBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Messages.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlType.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PerConnectionLRUFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PingTarget.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PreparedQuery.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Query.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryAttributesBindings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryBindings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryInfo.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryReturnType.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/ServerVersion.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Session.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/TransactionEventHandler.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/WarningListener.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/FidoAuthenticationCallback.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallback.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallbackHandler.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/UsernameCallback.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionPropertiesTransform.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrlParser.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/DatabaseUrlContainer.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostInfo.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostsListView.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinitions.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyKey.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertySet.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/RuntimeProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/AssertionFailedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJCommunicationsException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJConnectionFeatureNotAvailableException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJOperationNotSupportedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJPacketTooBigException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJTimeoutException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ClosedOnExpiredPasswordException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ConnectionIsClosedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataConversionException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataReadException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataTruncationException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DeadlockTimeoutRollbackMarker.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptorChain.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/FeatureNotAvailableException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/InvalidConnectionAttributeException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/MysqlErrorNumbers.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/NumberOutOfRange.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/OperationCancelledException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PasswordExpiredException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PropertyNotModifiableException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/RSAException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/SSLParamsException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StatementIsClosedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StreamingNotifiable.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnableToConnectException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnsupportedConnectionStringException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/WrongArgumentException.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/interceptors/QueryInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Jdk14Logger.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Log.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/NullLogger.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEvent.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEventHandler.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Slf4JLogger.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/StandardLogger.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ColumnDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/FullReadInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalDate.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTime.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTimestamp.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Message.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageHeader.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageListener.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/NetworkResources.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/OutputStreamWatcher.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketReceivedTimeHolder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketSentTimeHolder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Protocol.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntity.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultStreamer.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Resultset.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRows.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRowsOwner.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerCapabilities.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSessionStateController.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketMetadata.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueDecoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Warning.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/WatchableStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Field.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Row.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/RowList.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/ValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Base64Decoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DataTypeUtil.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DnsSrv.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/EscapeTokenizer.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LRUCache.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LazyString.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LogUtils.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/PerVmServerConfigCacheFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SaslPrep.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SearchMode.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SequentialIdLease.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringInspector.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringUtils.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TestUtils.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TimeUtil.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Util.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/AbstractQuery.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CancelQueryTaskImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ClientPreparedQuery.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CoreSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/DataStoreMetadataImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/LicenseConfiguration.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/MysqlxSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeCharsetSettings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryAttributesBindings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindValue.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindings.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NoSubInterceptorWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQuery.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQueryTestcaseGenerator.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/SimpleQuery.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/admin/ServerController.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractRuntimeProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/DefaultPropertySet.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizeProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizePropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringProperty.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringPropertyDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverDnsSrvConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceDnsSrvConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/SingleConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiDnsSrvConnectionUrl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/BaseMetricsHolder.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LogFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LoggingProfilerEventHandler.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/ProfilerEventImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractProtocol.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractSocketConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ExportControlled.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/NamedPipeSocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ReadAheadInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/Security.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/SocksProxySocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/StandardSocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableOutputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableWriter.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WriterWatcher.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/result/AbstractResultsetRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractDateTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractNumericValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BigDecimalValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BinaryStreamValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BooleanValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BufferedRowList.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ByteValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultColumnDefinition.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DoubleValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DurationValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/FloatValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/IntegerValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LongValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetDateTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ShortValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlDateValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlTimestampValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/StringValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/UtilCalendarValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ZonedDateTimeValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/sasl/ScramSha1SaslClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/sasl/ScramSha256SaslClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/sasl/ScramShaSaslClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/sasl/ScramShaSaslClientFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/sasl/ScramShaSaslProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/doc/connector-j-overview.html create mode 100644 mysql-connector-j-8.0.31/src/main/doc/mysqlx-overview.html create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/AbstractRowFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/AbstractValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/BinaryResultsetReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/BinaryRowFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/BlobValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/BooleanValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ByteArrayValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ClobValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ColumnDefinitionFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ColumnDefinitionReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/CompressedInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/CompressedPacketSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/DebugBufferingPacketReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/DebugBufferingPacketSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/DurationValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/InputStreamValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/InstantValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/LocalDateTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/LocalDateValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/LocalTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/MergingColumnDefinitionFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/MultiPacketReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/MysqlBinaryValueDecoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/MysqlTextValueDecoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeAuthenticationProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeCapabilities.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeConstants.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeMessageBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativePacketHeader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativePacketPayload.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeProtocol.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeServerSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeServerSessionStateController.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeSocketConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NativeUtils.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NullValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/NumberValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/OffsetDateTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/OffsetTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/PacketSplitter.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ReaderValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ResultsetFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ResultsetRowReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/SimplePacketReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/SimplePacketSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/SqlDateValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/SqlTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/SqlTimestampValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/StringValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TextResultsetReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TextRowFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TimeTrackingPacketReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TimeTrackingPacketSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TracingPacketReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/TracingPacketSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/UtilCalendarValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/UtilDateValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/ZonedDateTimeValueEncoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/AuthenticationFidoClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/AuthenticationKerberosClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/AuthenticationLdapSaslClientPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/AuthenticationOciClient.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/CachingSha2PasswordPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/MysqlClearPasswordPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/MysqlNativePasswordPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/MysqlOldPasswordPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/authentication/Sha256PasswordPlugin.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/AbstractBufferRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/AbstractResultsetRows.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/BinaryBufferRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/ByteArrayRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/NativeResultset.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/OkPacket.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/ResultsetRowsCursor.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/ResultsetRowsStatic.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/ResultsetRowsStreaming.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/a/result/TextBufferRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/CompressionAlgorithm.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/CompressionMode.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/CompressionSplittedInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/CompressionSplittedOutputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/CompressorStreamsFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ConfinedInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ContinuousInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ContinuousOutputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ErrorToFutureCompletionHandler.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/FetchDoneEntity.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/FetchDoneEntityFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/FetchDoneMoreResults.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/FetchDoneMoreResultsFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/FieldFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/MessageConstants.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/Notice.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/NoticeFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/Ok.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/OkBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/OkFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ResultMessageListener.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/ReusableOutputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/StatementExecuteOk.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/StatementExecuteOkBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/StatementExecuteOkFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/SyncFlushDeflaterOutputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/SyncMessageReader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/SyncMessageSender.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XAuthenticationProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XMessage.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XMessageBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XMessageHeader.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocol.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocolDecoder.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocolError.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocolRow.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocolRowFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XProtocolRowInputStream.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XServerCapabilities.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XServerSession.java create mode 100644 mysql-connector-j-8.0.31/src/main/protocol-impl/java/com/mysql/cj/protocol/x/XpluginStatementCommand.java create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/LocalizedErrorMessages.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/TlsSettings.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/3-0-Compat.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/clusterBase.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/coldFusion.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/fullDebug.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/maxPerformance-8-0.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/maxPerformance.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/configurations/solarisMaxPerformance.properties create mode 100644 mysql-connector-j-8.0.31/src/main/resources/com/mysql/cj/util/TimeZoneMapping.properties create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ClientInfoProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/JdbcConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/JdbcPreparedStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/JdbcPropertySet.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/JdbcStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ParameterBindings.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ha/BalanceStrategy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ha/LoadBalanceExceptionChecker.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ha/LoadBalancedConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/ha/ReplicationConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/interceptors/ConnectionLifecycleInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/result/CachedResultSetMetaData.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/jdbc/result/ResultSetInternalMethods.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/AddResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/AddStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Client.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/ClientFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Collection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Column.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/DatabaseObject.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/DbDoc.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/DeleteStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/DocResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Expression.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/FetchResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/FilterParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/FindStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/InsertResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/InsertStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/JsonValue.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/ModifyStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/RemoveStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Result.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Row.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/RowResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Schema.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/SelectStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Session.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/SessionFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/SqlResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/SqlStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Statement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Table.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Type.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/UpdateStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/UpdateType.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/Warning.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/XDevAPIError.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-api/java/com/mysql/cj/xdevapi/package-info.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/AbandonedConnectionCleanupThread.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/Blob.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/BlobFromLocator.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/CallableStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/CallableStatementWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ClientInfoProviderSP.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ClientPreparedStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/Clob.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/CommentClientInfoProvider.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionGroup.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionGroupManager.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ConnectionWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaData.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/Driver.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/EscapeProcessor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/EscapeProcessorResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/IterateBlock.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/JdbcPropertySetImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlConnectionPoolDataSource.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlDataSource.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlDataSourceFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlParameterMetadata.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlPooledConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSQLXML.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlSavepoint.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlXAConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlXADataSource.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlXAException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlXid.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/NClob.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/NonRegisteringDriver.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ParameterBindingsImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/PreparedStatementWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ServerPreparedStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/StatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/StatementWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/SuspendableXAConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/WrapperBase.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/admin/MiniAdmin.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/CommunicationsException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/ConnectionFeatureNotAvailableException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/MySQLQueryInterruptedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/MySQLStatementCancelledException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/MySQLTimeoutException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/MySQLTransactionRollbackException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/MysqlDataTruncation.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/NotUpdatable.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/OperationNotSupportedException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/PacketTooBigException.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/SQLError.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/exceptions/SQLExceptionsMapping.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/BestResponseTimeBalanceStrategy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/FailoverConnectionProxy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/LoadBalancedAutoCommitInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/LoadBalancedConnectionProxy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/LoadBalancedMySQLConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/MultiHostConnectionProxy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/MultiHostMySQLConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/NdbLoadBalanceExceptionChecker.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/RandomBalanceStrategy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/ReplicationConnectionGroup.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/ReplicationConnectionGroupManager.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/ReplicationConnectionProxy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/ReplicationMySQLConnection.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/SequentialBalanceStrategy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/ServerAffinityStrategy.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/ha/StandardLoadBalanceExceptionChecker.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/integration/c3p0/MysqlConnectionTester.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/interceptors/ResultSetScannerInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/interceptors/ServerStatusDiffInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/interceptors/SessionAssociationInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/jmx/LoadBalanceConnectionGroupManager.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/jmx/LoadBalanceConnectionGroupManagerMBean.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/jmx/ReplicationGroupManager.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/jmx/ReplicationGroupManagerMBean.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/result/CachedResultSetMetaDataImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/result/ResultSetMetaData.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/result/UpdatableResultSet.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/jdbc/util/BaseBugReport.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/AbstractDataResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/AbstractFilterParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/AddResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/AddResultImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/AddStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ClientImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/CollectionImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ColumnImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/CreateIndexParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DatabaseObjectDescription.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DbDocFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DbDocImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DbDocValueFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DeleteStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DocFilterParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DocResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/DocResultImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ExprParser.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ExprUnparser.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ExprUtil.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/FilterableStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/FindStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/InsertParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/InsertResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/InsertResultImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/InsertStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/JsonArray.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/JsonLiteral.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/JsonNumber.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/JsonParser.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/JsonString.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/ModifyStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/PreparableStatement.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/RemoveStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/RowFactory.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/RowImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/RowResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/RowResultImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SchemaImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SelectStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SessionImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SqlMultiResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SqlResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SqlSingleResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SqlStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/SqlUpdateResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/StreamingDocResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/StreamingRowResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/StreamingSqlResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/TableFilterParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/TableImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/UpdateParams.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/UpdateResult.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/UpdateResultBuilder.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/UpdateSpec.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/UpdateStatementImpl.java create mode 100644 mysql-connector-j-8.0.31/src/main/user-impl/java/com/mysql/cj/xdevapi/WarningImpl.java create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-cert-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-cert.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-key-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-key.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-truststore create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/ca-truststore-ext create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/certs_howto.txt create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-cert-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-cert.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-key-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-key.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-keystore create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/client-keystore-ext create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/mykey.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/mykey.pub create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/server-cert-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/server-cert.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/server-key-ext.pem create mode 100644 mysql-connector-j-8.0.31/src/test/config/ssl-test-certs/server-key.pem create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/CharsetMappingWrapper.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/ConnectionUrlTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/MessagesTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/ServerVersionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/CompressedPacketSenderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/DebugBufferingPacketSenderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/MysqlBinaryValueDecoderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/MysqlTextValueDecoderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/PacketSenderTestBase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/SimplePacketReaderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/a/SimplePacketSenderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/x/CompressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/x/SyncMessageReaderTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/protocol/x/SyncMessageWriterTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/BigDecimalValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/BinaryStreamValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/BooleanValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/ByteValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/CommonAsserts.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/DoubleValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/FloatValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/IntegerValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/LocalDateTimeValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/LocalDateValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/LocalTimeValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/LongValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/ShortValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/SqlDateValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/SqlTimeValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/SqlTimestampValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/StringValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/result/ZeroDateTimeToNullValueFactoryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/util/StringInspectorTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/util/StringUtilsTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/util/TimeUtilTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/xdevapi/ExprParserTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/com/mysql/cj/xdevapi/JsonDocTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/BaseQueryInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/BaseTestCase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/BufferingLogger.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/InjectedSocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/JUnitSummary.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/MockJndiContextFactory.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/TestUtils.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/UnreliableSocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/perf/BasePerfTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/perf/LoadStorePerfTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/perf/RetrievalPerfTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/BlobRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/CachedRowsetTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/CallableStatementRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/CharsetRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/ConnectionRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/DataSourceRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/DateTimeRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/EscapeProcessorRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/ExceptionSubclassesTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/MetaDataRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/MicroPerformanceRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/NonLocalSocketFactory.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/NumbersRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/PooledConnectionRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/ResultSetRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/StatementRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/StressRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/StringRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/SubqueriesRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/SyntaxRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/regression/UtilsRegressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/AuthenticationTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/BlobTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/CallableStatementTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/CharsetTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/ConnectionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/DataSourceTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/DateTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/DateTimeTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/EscapeProcessingTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/ExceptionsTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/MetadataTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/MiniAdminTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/MultiHostConnectionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/NumbersTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/QueryAttributesTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/ReadOnlyCallableStatementTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/ResultSetTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/SSLTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/SaslPrepTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/SequentialIdLeaseTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/ServerControllerTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/SimpleTransformer.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/SplitDBdotNameTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/StatementsTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/TestLifecycleInterceptor.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/TransactionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/TraversalTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/UpdatabilityTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/UtilsTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/simple/XATest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/AsyncQueryTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/BaseCollectionTestCase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/BaseTableTestCase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/BindTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CollectionAddTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CollectionFindTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CollectionModifyTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CollectionRemoveTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CollectionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/CompressionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/DevApiBaseTestCase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/Ipv6SupportTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/MetadataTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/ResultTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/RowLockingTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/SchemaTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/SecureSessionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/SessionFailoverTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/SessionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TableDeleteTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TableInsertTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TableSelectTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TableTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TableUpdateTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/TransactionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/devapi/package-info.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/InternalXBaseTestCase.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/MysqlxSessionTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/XProtocolAsyncTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/XProtocolAuthTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/XProtocolTest.java create mode 100644 mysql-connector-j-8.0.31/src/test/java/testsuite/x/internal/package-info.java create mode 100644 out/artifacts/WorkoutDBDatesAutoUpdater/WorkoutDBDatesAutoUpdater.jar create mode 100644 out/artifacts/WorkoutDBDatesAutoUpdater/config.json create mode 100644 out/artifacts/WorkoutDBDatesAutoUpdater/logs/log.log create mode 100644 out/artifacts/WorkoutDBDatesAutoUpdater/logs/oldLog.log create mode 100644 out/artifacts/WorkoutDBDatesAutoUpdater/run.cmd create mode 100644 out/production/WorkoutDBDatesAutoUpdater/META-INF/MANIFEST.MF create mode 100644 out/production/WorkoutDBDatesAutoUpdater/WorkoutDatesUpdater/Main.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/WorkoutDatesUpdater/logging.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/LocalizedErrorMessages.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/TlsSettings.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/3-0-Compat.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/clusterBase.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/coldFusion.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/fullDebug.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/maxPerformance-8-0.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/maxPerformance.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/configurations/solarisMaxPerformance.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/com/mysql/cj/util/TimeZoneMapping.properties create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/ItemList.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/JSONArray.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/JSONAware.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/JSONObject.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/JSONStreamAware.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/JSONValue.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/ContainerFactory.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/ContentHandler.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/JSONParser.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/ParseException.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/Yylex.class create mode 100644 out/production/WorkoutDBDatesAutoUpdater/org/json/simple/parser/Yytoken.class create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/WorkoutDatesUpdater/Main.java create mode 100644 src/WorkoutDatesUpdater/logging.java create mode 100644 src/com/mysql/cj/AbstractQuery.class create mode 100644 src/com/mysql/cj/BindValue.class create mode 100644 src/com/mysql/cj/CacheAdapter.class create mode 100644 src/com/mysql/cj/CacheAdapterFactory.class create mode 100644 src/com/mysql/cj/CancelQueryTask.class create mode 100644 src/com/mysql/cj/CancelQueryTaskImpl$1$1.class create mode 100644 src/com/mysql/cj/CancelQueryTaskImpl$1.class create mode 100644 src/com/mysql/cj/CancelQueryTaskImpl.class create mode 100644 src/com/mysql/cj/CharsetMapping.class create mode 100644 src/com/mysql/cj/CharsetSettings.class create mode 100644 src/com/mysql/cj/ClientPreparedQuery.class create mode 100644 src/com/mysql/cj/Collation.class create mode 100644 src/com/mysql/cj/Constants.class create mode 100644 src/com/mysql/cj/CoreSession.class create mode 100644 src/com/mysql/cj/DataStoreMetadata.class create mode 100644 src/com/mysql/cj/DataStoreMetadataImpl.class create mode 100644 src/com/mysql/cj/LicenseConfiguration.class create mode 100644 src/com/mysql/cj/LocalizedErrorMessages.properties create mode 100644 src/com/mysql/cj/MessageBuilder.class create mode 100644 src/com/mysql/cj/Messages.class create mode 100644 src/com/mysql/cj/MysqlCharset.class create mode 100644 src/com/mysql/cj/MysqlConnection.class create mode 100644 src/com/mysql/cj/MysqlType$1.class create mode 100644 src/com/mysql/cj/MysqlType.class create mode 100644 src/com/mysql/cj/MysqlxSession.class create mode 100644 src/com/mysql/cj/NativeCharsetSettings.class create mode 100644 src/com/mysql/cj/NativeQueryAttributesBindings.class create mode 100644 src/com/mysql/cj/NativeQueryBindValue$1.class create mode 100644 src/com/mysql/cj/NativeQueryBindValue.class create mode 100644 src/com/mysql/cj/NativeQueryBindings.class create mode 100644 src/com/mysql/cj/NativeSession$1.class create mode 100644 src/com/mysql/cj/NativeSession.class create mode 100644 src/com/mysql/cj/NoSubInterceptorWrapper.class create mode 100644 src/com/mysql/cj/PerConnectionLRUFactory$PerConnectionLRU.class create mode 100644 src/com/mysql/cj/PerConnectionLRUFactory.class create mode 100644 src/com/mysql/cj/PingTarget.class create mode 100644 src/com/mysql/cj/PreparedQuery.class create mode 100644 src/com/mysql/cj/Query$CancelStatus.class create mode 100644 src/com/mysql/cj/Query.class create mode 100644 src/com/mysql/cj/QueryAttributesBindings.class create mode 100644 src/com/mysql/cj/QueryBindings.class create mode 100644 src/com/mysql/cj/QueryInfo.class create mode 100644 src/com/mysql/cj/QueryResult.class create mode 100644 src/com/mysql/cj/QueryReturnType.class create mode 100644 src/com/mysql/cj/ServerPreparedQuery.class create mode 100644 src/com/mysql/cj/ServerPreparedQueryTestcaseGenerator.class create mode 100644 src/com/mysql/cj/ServerVersion.class create mode 100644 src/com/mysql/cj/Session$SessionEventListener.class create mode 100644 src/com/mysql/cj/Session.class create mode 100644 src/com/mysql/cj/SimpleQuery.class create mode 100644 src/com/mysql/cj/TlsSettings.properties create mode 100644 src/com/mysql/cj/TransactionEventHandler.class create mode 100644 src/com/mysql/cj/WarningListener.class create mode 100644 src/com/mysql/cj/admin/ServerController.class create mode 100644 src/com/mysql/cj/callback/FidoAuthenticationCallback.class create mode 100644 src/com/mysql/cj/callback/MysqlCallback.class create mode 100644 src/com/mysql/cj/callback/MysqlCallbackHandler.class create mode 100644 src/com/mysql/cj/callback/UsernameCallback.class create mode 100644 src/com/mysql/cj/conf/AbstractPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/AbstractRuntimeProperty.class create mode 100644 src/com/mysql/cj/conf/BooleanProperty.class create mode 100644 src/com/mysql/cj/conf/BooleanPropertyDefinition$AllowableValues.class create mode 100644 src/com/mysql/cj/conf/BooleanPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/ConnectionPropertiesTransform.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$1.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$HostsCardinality$1.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$HostsCardinality$2.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$HostsCardinality$3.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$HostsCardinality.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl$Type.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrlParser$Pair.class create mode 100644 src/com/mysql/cj/conf/ConnectionUrlParser.class create mode 100644 src/com/mysql/cj/conf/DatabaseUrlContainer.class create mode 100644 src/com/mysql/cj/conf/DefaultPropertySet.class create mode 100644 src/com/mysql/cj/conf/EnumProperty.class create mode 100644 src/com/mysql/cj/conf/EnumPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/HostInfo.class create mode 100644 src/com/mysql/cj/conf/HostsListView.class create mode 100644 src/com/mysql/cj/conf/IntegerProperty.class create mode 100644 src/com/mysql/cj/conf/IntegerPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/LongProperty.class create mode 100644 src/com/mysql/cj/conf/LongPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/MemorySizeProperty.class create mode 100644 src/com/mysql/cj/conf/MemorySizePropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$AuthMech.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$Compression.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$DatabaseTerm.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$SslMode.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$XdevapiSslMode.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions$ZeroDatetimeBehavior.class create mode 100644 src/com/mysql/cj/conf/PropertyDefinitions.class create mode 100644 src/com/mysql/cj/conf/PropertyKey.class create mode 100644 src/com/mysql/cj/conf/PropertySet.class create mode 100644 src/com/mysql/cj/conf/RuntimeProperty$RuntimePropertyListener.class create mode 100644 src/com/mysql/cj/conf/RuntimeProperty.class create mode 100644 src/com/mysql/cj/conf/StringProperty.class create mode 100644 src/com/mysql/cj/conf/StringPropertyDefinition.class create mode 100644 src/com/mysql/cj/conf/url/FailoverConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/FailoverDnsSrvConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/LoadBalanceConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/LoadBalanceDnsSrvConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/ReplicationConnectionUrl$1.class create mode 100644 src/com/mysql/cj/conf/url/ReplicationConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl$1.class create mode 100644 src/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/SingleConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/XDevApiConnectionUrl.class create mode 100644 src/com/mysql/cj/conf/url/XDevApiDnsSrvConnectionUrl.class create mode 100644 src/com/mysql/cj/configurations/3-0-Compat.properties create mode 100644 src/com/mysql/cj/configurations/clusterBase.properties create mode 100644 src/com/mysql/cj/configurations/coldFusion.properties create mode 100644 src/com/mysql/cj/configurations/fullDebug.properties create mode 100644 src/com/mysql/cj/configurations/maxPerformance-8-0.properties create mode 100644 src/com/mysql/cj/configurations/maxPerformance.properties create mode 100644 src/com/mysql/cj/configurations/solarisMaxPerformance.properties create mode 100644 src/com/mysql/cj/exceptions/AssertionFailedException.class create mode 100644 src/com/mysql/cj/exceptions/CJCommunicationsException.class create mode 100644 src/com/mysql/cj/exceptions/CJConnectionFeatureNotAvailableException.class create mode 100644 src/com/mysql/cj/exceptions/CJException.class create mode 100644 src/com/mysql/cj/exceptions/CJOperationNotSupportedException.class create mode 100644 src/com/mysql/cj/exceptions/CJPacketTooBigException.class create mode 100644 src/com/mysql/cj/exceptions/CJTimeoutException.class create mode 100644 src/com/mysql/cj/exceptions/ClosedOnExpiredPasswordException.class create mode 100644 src/com/mysql/cj/exceptions/ConnectionIsClosedException.class create mode 100644 src/com/mysql/cj/exceptions/DataConversionException.class create mode 100644 src/com/mysql/cj/exceptions/DataReadException.class create mode 100644 src/com/mysql/cj/exceptions/DataTruncationException.class create mode 100644 src/com/mysql/cj/exceptions/DeadlockTimeoutRollbackMarker.class create mode 100644 src/com/mysql/cj/exceptions/ExceptionFactory.class create mode 100644 src/com/mysql/cj/exceptions/ExceptionInterceptor.class create mode 100644 src/com/mysql/cj/exceptions/ExceptionInterceptorChain.class create mode 100644 src/com/mysql/cj/exceptions/FeatureNotAvailableException.class create mode 100644 src/com/mysql/cj/exceptions/InvalidConnectionAttributeException.class create mode 100644 src/com/mysql/cj/exceptions/MysqlErrorNumbers.class create mode 100644 src/com/mysql/cj/exceptions/NumberOutOfRange.class create mode 100644 src/com/mysql/cj/exceptions/OperationCancelledException.class create mode 100644 src/com/mysql/cj/exceptions/PasswordExpiredException.class create mode 100644 src/com/mysql/cj/exceptions/PropertyNotModifiableException.class create mode 100644 src/com/mysql/cj/exceptions/RSAException.class create mode 100644 src/com/mysql/cj/exceptions/SSLParamsException.class create mode 100644 src/com/mysql/cj/exceptions/StatementIsClosedException.class create mode 100644 src/com/mysql/cj/exceptions/StreamingNotifiable.class create mode 100644 src/com/mysql/cj/exceptions/UnableToConnectException.class create mode 100644 src/com/mysql/cj/exceptions/UnsupportedConnectionStringException.class create mode 100644 src/com/mysql/cj/exceptions/WrongArgumentException.class create mode 100644 src/com/mysql/cj/interceptors/QueryInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/AbandonedConnectionCleanupThread$ConnectionFinalizerPhantomReference.class create mode 100644 src/com/mysql/cj/jdbc/AbandonedConnectionCleanupThread.class create mode 100644 src/com/mysql/cj/jdbc/Blob.class create mode 100644 src/com/mysql/cj/jdbc/BlobFromLocator$LocatorInputStream.class create mode 100644 src/com/mysql/cj/jdbc/BlobFromLocator.class create mode 100644 src/com/mysql/cj/jdbc/CallableStatement$1.class create mode 100644 src/com/mysql/cj/jdbc/CallableStatement$CallableStatementParam.class create mode 100644 src/com/mysql/cj/jdbc/CallableStatement$CallableStatementParamInfo.class create mode 100644 src/com/mysql/cj/jdbc/CallableStatement.class create mode 100644 src/com/mysql/cj/jdbc/CallableStatementWrapper.class create mode 100644 src/com/mysql/cj/jdbc/ClientInfoProvider.class create mode 100644 src/com/mysql/cj/jdbc/ClientInfoProviderSP.class create mode 100644 src/com/mysql/cj/jdbc/ClientPreparedStatement.class create mode 100644 src/com/mysql/cj/jdbc/Clob.class create mode 100644 src/com/mysql/cj/jdbc/CommentClientInfoProvider.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionGroup.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionGroupManager.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$1.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$2.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$3.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$4.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$5.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$6.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$7.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$CompoundCacheKey.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl$NetworkTimeoutSetter.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionImpl.class create mode 100644 src/com/mysql/cj/jdbc/ConnectionWrapper.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$1.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$10.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$11.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$2.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$3.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$4.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$5.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$6.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$7.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$8.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$9.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$ComparableWrapper.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$IndexMetaDataKey.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$IteratorWithCleanup.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$LocalAndReferencedColumns.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$ProcedureType.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$SingleStringIterator.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$StringListIterator.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$TableMetaDataKey.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$TableType.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData$TypeDescriptor.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaData.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema$1.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema$FunctionConstant.class create mode 100644 src/com/mysql/cj/jdbc/DatabaseMetaDataUsingInfoSchema.class create mode 100644 src/com/mysql/cj/jdbc/Driver.class create mode 100644 src/com/mysql/cj/jdbc/EscapeProcessor.class create mode 100644 src/com/mysql/cj/jdbc/EscapeProcessorResult.class create mode 100644 src/com/mysql/cj/jdbc/IterateBlock.class create mode 100644 src/com/mysql/cj/jdbc/JdbcConnection.class create mode 100644 src/com/mysql/cj/jdbc/JdbcPreparedStatement.class create mode 100644 src/com/mysql/cj/jdbc/JdbcPropertySet.class create mode 100644 src/com/mysql/cj/jdbc/JdbcPropertySetImpl.class create mode 100644 src/com/mysql/cj/jdbc/JdbcStatement.class create mode 100644 src/com/mysql/cj/jdbc/MysqlConnectionPoolDataSource.class create mode 100644 src/com/mysql/cj/jdbc/MysqlDataSource.class create mode 100644 src/com/mysql/cj/jdbc/MysqlDataSourceFactory.class create mode 100644 src/com/mysql/cj/jdbc/MysqlParameterMetadata.class create mode 100644 src/com/mysql/cj/jdbc/MysqlPooledConnection.class create mode 100644 src/com/mysql/cj/jdbc/MysqlSQLXML$SimpleSaxToReader.class create mode 100644 src/com/mysql/cj/jdbc/MysqlSQLXML.class create mode 100644 src/com/mysql/cj/jdbc/MysqlSavepoint.class create mode 100644 src/com/mysql/cj/jdbc/MysqlXAConnection.class create mode 100644 src/com/mysql/cj/jdbc/MysqlXADataSource.class create mode 100644 src/com/mysql/cj/jdbc/MysqlXAException.class create mode 100644 src/com/mysql/cj/jdbc/MysqlXid.class create mode 100644 src/com/mysql/cj/jdbc/NClob.class create mode 100644 src/com/mysql/cj/jdbc/NonRegisteringDriver$1.class create mode 100644 src/com/mysql/cj/jdbc/NonRegisteringDriver.class create mode 100644 src/com/mysql/cj/jdbc/ParameterBindings.class create mode 100644 src/com/mysql/cj/jdbc/ParameterBindingsImpl$1.class create mode 100644 src/com/mysql/cj/jdbc/ParameterBindingsImpl.class create mode 100644 src/com/mysql/cj/jdbc/PreparedStatementWrapper.class create mode 100644 src/com/mysql/cj/jdbc/ServerPreparedStatement.class create mode 100644 src/com/mysql/cj/jdbc/StatementImpl$1.class create mode 100644 src/com/mysql/cj/jdbc/StatementImpl.class create mode 100644 src/com/mysql/cj/jdbc/StatementWrapper.class create mode 100644 src/com/mysql/cj/jdbc/SuspendableXAConnection.class create mode 100644 src/com/mysql/cj/jdbc/WrapperBase$ConnectionErrorFiringInvocationHandler.class create mode 100644 src/com/mysql/cj/jdbc/WrapperBase.class create mode 100644 src/com/mysql/cj/jdbc/admin/MiniAdmin.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/CommunicationsException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/ConnectionFeatureNotAvailableException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/MySQLQueryInterruptedException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/MySQLStatementCancelledException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/MySQLTimeoutException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/MySQLTransactionRollbackException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/MysqlDataTruncation.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/NotUpdatable.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/OperationNotSupportedException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/PacketTooBigException.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/SQLError.class create mode 100644 src/com/mysql/cj/jdbc/exceptions/SQLExceptionsMapping.class create mode 100644 src/com/mysql/cj/jdbc/ha/BalanceStrategy.class create mode 100644 src/com/mysql/cj/jdbc/ha/BestResponseTimeBalanceStrategy.class create mode 100644 src/com/mysql/cj/jdbc/ha/FailoverConnectionProxy$FailoverJdbcInterfaceProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/FailoverConnectionProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalanceExceptionChecker.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalancedAutoCommitInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalancedConnection.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalancedConnectionProxy$NullLoadBalancedConnectionProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalancedConnectionProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/LoadBalancedMySQLConnection.class create mode 100644 src/com/mysql/cj/jdbc/ha/MultiHostConnectionProxy$JdbcInterfaceProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/MultiHostConnectionProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/MultiHostMySQLConnection.class create mode 100644 src/com/mysql/cj/jdbc/ha/NdbLoadBalanceExceptionChecker.class create mode 100644 src/com/mysql/cj/jdbc/ha/RandomBalanceStrategy.class create mode 100644 src/com/mysql/cj/jdbc/ha/ReplicationConnection.class create mode 100644 src/com/mysql/cj/jdbc/ha/ReplicationConnectionGroup.class create mode 100644 src/com/mysql/cj/jdbc/ha/ReplicationConnectionGroupManager.class create mode 100644 src/com/mysql/cj/jdbc/ha/ReplicationConnectionProxy.class create mode 100644 src/com/mysql/cj/jdbc/ha/ReplicationMySQLConnection.class create mode 100644 src/com/mysql/cj/jdbc/ha/SequentialBalanceStrategy.class create mode 100644 src/com/mysql/cj/jdbc/ha/ServerAffinityStrategy.class create mode 100644 src/com/mysql/cj/jdbc/ha/StandardLoadBalanceExceptionChecker.class create mode 100644 src/com/mysql/cj/jdbc/integration/c3p0/MysqlConnectionTester.class create mode 100644 src/com/mysql/cj/jdbc/interceptors/ConnectionLifecycleInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/interceptors/ResultSetScannerInterceptor$1.class create mode 100644 src/com/mysql/cj/jdbc/interceptors/ResultSetScannerInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/interceptors/ServerStatusDiffInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/interceptors/SessionAssociationInterceptor.class create mode 100644 src/com/mysql/cj/jdbc/jmx/LoadBalanceConnectionGroupManager.class create mode 100644 src/com/mysql/cj/jdbc/jmx/LoadBalanceConnectionGroupManagerMBean.class create mode 100644 src/com/mysql/cj/jdbc/jmx/ReplicationGroupManager.class create mode 100644 src/com/mysql/cj/jdbc/jmx/ReplicationGroupManagerMBean.class create mode 100644 src/com/mysql/cj/jdbc/result/CachedResultSetMetaData.class create mode 100644 src/com/mysql/cj/jdbc/result/CachedResultSetMetaDataImpl.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetFactory.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetImpl$1.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetImpl.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetInternalMethods.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetMetaData$1.class create mode 100644 src/com/mysql/cj/jdbc/result/ResultSetMetaData.class create mode 100644 src/com/mysql/cj/jdbc/result/UpdatableResultSet$1.class create mode 100644 src/com/mysql/cj/jdbc/result/UpdatableResultSet.class create mode 100644 src/com/mysql/cj/jdbc/util/BaseBugReport.class create mode 100644 src/com/mysql/cj/log/BaseMetricsHolder.class create mode 100644 src/com/mysql/cj/log/Jdk14Logger.class create mode 100644 src/com/mysql/cj/log/Log.class create mode 100644 src/com/mysql/cj/log/LogFactory.class create mode 100644 src/com/mysql/cj/log/LoggingProfilerEventHandler.class create mode 100644 src/com/mysql/cj/log/NullLogger.class create mode 100644 src/com/mysql/cj/log/ProfilerEvent.class create mode 100644 src/com/mysql/cj/log/ProfilerEventHandler.class create mode 100644 src/com/mysql/cj/log/ProfilerEventImpl.class create mode 100644 src/com/mysql/cj/log/Slf4JLogger.class create mode 100644 src/com/mysql/cj/log/StandardLogger.class create mode 100644 src/com/mysql/cj/protocol/AbstractProtocol$1.class create mode 100644 src/com/mysql/cj/protocol/AbstractProtocol$2.class create mode 100644 src/com/mysql/cj/protocol/AbstractProtocol.class create mode 100644 src/com/mysql/cj/protocol/AbstractSocketConnection.class create mode 100644 src/com/mysql/cj/protocol/AuthenticationPlugin.class create mode 100644 src/com/mysql/cj/protocol/AuthenticationProvider.class create mode 100644 src/com/mysql/cj/protocol/ColumnDefinition.class create mode 100644 src/com/mysql/cj/protocol/ExportControlled$KeyStoreConf.class create mode 100644 src/com/mysql/cj/protocol/ExportControlled$X509TrustManagerWrapper.class create mode 100644 src/com/mysql/cj/protocol/ExportControlled.class create mode 100644 src/com/mysql/cj/protocol/FullReadInputStream.class create mode 100644 src/com/mysql/cj/protocol/InternalDate.class create mode 100644 src/com/mysql/cj/protocol/InternalTime.class create mode 100644 src/com/mysql/cj/protocol/InternalTimestamp.class create mode 100644 src/com/mysql/cj/protocol/Message.class create mode 100644 src/com/mysql/cj/protocol/MessageHeader.class create mode 100644 src/com/mysql/cj/protocol/MessageListener.class create mode 100644 src/com/mysql/cj/protocol/MessageReader.class create mode 100644 src/com/mysql/cj/protocol/MessageSender.class create mode 100644 src/com/mysql/cj/protocol/NamedPipeSocketFactory$NamedPipeSocket.class create mode 100644 src/com/mysql/cj/protocol/NamedPipeSocketFactory$RandomAccessFileInputStream.class create mode 100644 src/com/mysql/cj/protocol/NamedPipeSocketFactory$RandomAccessFileOutputStream.class create mode 100644 src/com/mysql/cj/protocol/NamedPipeSocketFactory.class create mode 100644 src/com/mysql/cj/protocol/NetworkResources.class create mode 100644 src/com/mysql/cj/protocol/OutputStreamWatcher.class create mode 100644 src/com/mysql/cj/protocol/PacketReceivedTimeHolder.class create mode 100644 src/com/mysql/cj/protocol/PacketSentTimeHolder.class create mode 100644 src/com/mysql/cj/protocol/Protocol$ProtocolEventHandler.class create mode 100644 src/com/mysql/cj/protocol/Protocol$ProtocolEventListener$EventType.class create mode 100644 src/com/mysql/cj/protocol/Protocol$ProtocolEventListener.class create mode 100644 src/com/mysql/cj/protocol/Protocol.class create mode 100644 src/com/mysql/cj/protocol/ProtocolEntity.class create mode 100644 src/com/mysql/cj/protocol/ProtocolEntityFactory.class create mode 100644 src/com/mysql/cj/protocol/ProtocolEntityReader.class create mode 100644 src/com/mysql/cj/protocol/ReadAheadInputStream.class create mode 100644 src/com/mysql/cj/protocol/ResultBuilder.class create mode 100644 src/com/mysql/cj/protocol/ResultStreamer.class create mode 100644 src/com/mysql/cj/protocol/Resultset$Concurrency.class create mode 100644 src/com/mysql/cj/protocol/Resultset$Type.class create mode 100644 src/com/mysql/cj/protocol/Resultset.class create mode 100644 src/com/mysql/cj/protocol/ResultsetRow.class create mode 100644 src/com/mysql/cj/protocol/ResultsetRows.class create mode 100644 src/com/mysql/cj/protocol/ResultsetRowsOwner.class create mode 100644 src/com/mysql/cj/protocol/Security.class create mode 100644 src/com/mysql/cj/protocol/ServerCapabilities.class create mode 100644 src/com/mysql/cj/protocol/ServerSession.class create mode 100644 src/com/mysql/cj/protocol/ServerSessionStateController$ServerSessionStateChanges.class create mode 100644 src/com/mysql/cj/protocol/ServerSessionStateController$SessionStateChange.class create mode 100644 src/com/mysql/cj/protocol/ServerSessionStateController$SessionStateChangesListener.class create mode 100644 src/com/mysql/cj/protocol/ServerSessionStateController.class create mode 100644 src/com/mysql/cj/protocol/SocketConnection.class create mode 100644 src/com/mysql/cj/protocol/SocketFactory.class create mode 100644 src/com/mysql/cj/protocol/SocketMetadata.class create mode 100644 src/com/mysql/cj/protocol/SocksProxySocketFactory.class create mode 100644 src/com/mysql/cj/protocol/StandardSocketFactory.class create mode 100644 src/com/mysql/cj/protocol/ValueDecoder.class create mode 100644 src/com/mysql/cj/protocol/ValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/Warning.class create mode 100644 src/com/mysql/cj/protocol/WatchableOutputStream.class create mode 100644 src/com/mysql/cj/protocol/WatchableStream.class create mode 100644 src/com/mysql/cj/protocol/WatchableWriter.class create mode 100644 src/com/mysql/cj/protocol/WriterWatcher.class create mode 100644 src/com/mysql/cj/protocol/a/AbstractRowFactory.class create mode 100644 src/com/mysql/cj/protocol/a/AbstractValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/BinaryResultsetReader.class create mode 100644 src/com/mysql/cj/protocol/a/BinaryRowFactory.class create mode 100644 src/com/mysql/cj/protocol/a/BlobValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/BooleanValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/BooleanValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/ByteArrayValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/ClobValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/ColumnDefinitionFactory.class create mode 100644 src/com/mysql/cj/protocol/a/ColumnDefinitionReader$1.class create mode 100644 src/com/mysql/cj/protocol/a/ColumnDefinitionReader.class create mode 100644 src/com/mysql/cj/protocol/a/CompressedInputStream.class create mode 100644 src/com/mysql/cj/protocol/a/CompressedPacketSender.class create mode 100644 src/com/mysql/cj/protocol/a/DebugBufferingPacketReader.class create mode 100644 src/com/mysql/cj/protocol/a/DebugBufferingPacketSender.class create mode 100644 src/com/mysql/cj/protocol/a/DurationValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/DurationValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/InputStreamValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/InstantValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/InstantValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/LocalDateTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/LocalDateTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/LocalDateValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/LocalDateValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/LocalTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/LocalTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/MergingColumnDefinitionFactory.class create mode 100644 src/com/mysql/cj/protocol/a/MultiPacketReader.class create mode 100644 src/com/mysql/cj/protocol/a/MysqlBinaryValueDecoder.class create mode 100644 src/com/mysql/cj/protocol/a/MysqlTextValueDecoder.class create mode 100644 src/com/mysql/cj/protocol/a/NativeAuthenticationProvider.class create mode 100644 src/com/mysql/cj/protocol/a/NativeCapabilities.class create mode 100644 src/com/mysql/cj/protocol/a/NativeConstants$IntegerDataType.class create mode 100644 src/com/mysql/cj/protocol/a/NativeConstants$StringLengthDataType.class create mode 100644 src/com/mysql/cj/protocol/a/NativeConstants$StringSelfDataType.class create mode 100644 src/com/mysql/cj/protocol/a/NativeConstants.class create mode 100644 src/com/mysql/cj/protocol/a/NativeMessageBuilder.class create mode 100644 src/com/mysql/cj/protocol/a/NativePacketHeader.class create mode 100644 src/com/mysql/cj/protocol/a/NativePacketPayload$1.class create mode 100644 src/com/mysql/cj/protocol/a/NativePacketPayload.class create mode 100644 src/com/mysql/cj/protocol/a/NativeProtocol$1.class create mode 100644 src/com/mysql/cj/protocol/a/NativeProtocol$2.class create mode 100644 src/com/mysql/cj/protocol/a/NativeProtocol$3.class create mode 100644 src/com/mysql/cj/protocol/a/NativeProtocol.class create mode 100644 src/com/mysql/cj/protocol/a/NativeServerSession.class create mode 100644 src/com/mysql/cj/protocol/a/NativeServerSessionStateController$NativeServerSessionStateChanges.class create mode 100644 src/com/mysql/cj/protocol/a/NativeServerSessionStateController.class create mode 100644 src/com/mysql/cj/protocol/a/NativeSocketConnection$1.class create mode 100644 src/com/mysql/cj/protocol/a/NativeSocketConnection.class create mode 100644 src/com/mysql/cj/protocol/a/NativeUtils.class create mode 100644 src/com/mysql/cj/protocol/a/NullValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/NumberValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/NumberValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/OffsetDateTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/OffsetDateTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/OffsetTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/OffsetTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/PacketSplitter.class create mode 100644 src/com/mysql/cj/protocol/a/ReaderValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/ResultsetFactory.class create mode 100644 src/com/mysql/cj/protocol/a/ResultsetRowReader.class create mode 100644 src/com/mysql/cj/protocol/a/SimplePacketReader.class create mode 100644 src/com/mysql/cj/protocol/a/SimplePacketSender.class create mode 100644 src/com/mysql/cj/protocol/a/SqlDateValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/SqlDateValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/SqlTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/SqlTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/SqlTimestampValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/SqlTimestampValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/StringValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/StringValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/TextResultsetReader.class create mode 100644 src/com/mysql/cj/protocol/a/TextRowFactory.class create mode 100644 src/com/mysql/cj/protocol/a/TimeTrackingPacketReader.class create mode 100644 src/com/mysql/cj/protocol/a/TimeTrackingPacketSender.class create mode 100644 src/com/mysql/cj/protocol/a/TracingPacketReader.class create mode 100644 src/com/mysql/cj/protocol/a/TracingPacketSender.class create mode 100644 src/com/mysql/cj/protocol/a/UtilCalendarValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/UtilCalendarValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/UtilDateValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/UtilDateValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/ZonedDateTimeValueEncoder$1.class create mode 100644 src/com/mysql/cj/protocol/a/ZonedDateTimeValueEncoder.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationFidoClient.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationKerberosClient$1.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationKerberosClient.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationLdapSaslClientPlugin$1.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationLdapSaslClientPlugin$2.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationLdapSaslClientPlugin$AuthenticationMechanisms.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationLdapSaslClientPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/AuthenticationOciClient.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/CachingSha2PasswordPlugin$AuthStage.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/CachingSha2PasswordPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/MysqlClearPasswordPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/MysqlNativePasswordPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/MysqlOldPasswordPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/authentication/Sha256PasswordPlugin.class create mode 100644 src/com/mysql/cj/protocol/a/result/AbstractBufferRow.class create mode 100644 src/com/mysql/cj/protocol/a/result/AbstractResultsetRows.class create mode 100644 src/com/mysql/cj/protocol/a/result/BinaryBufferRow.class create mode 100644 src/com/mysql/cj/protocol/a/result/ByteArrayRow.class create mode 100644 src/com/mysql/cj/protocol/a/result/NativeResultset.class create mode 100644 src/com/mysql/cj/protocol/a/result/OkPacket.class create mode 100644 src/com/mysql/cj/protocol/a/result/ResultsetRowsCursor.class create mode 100644 src/com/mysql/cj/protocol/a/result/ResultsetRowsStatic.class create mode 100644 src/com/mysql/cj/protocol/a/result/ResultsetRowsStreaming.class create mode 100644 src/com/mysql/cj/protocol/a/result/TextBufferRow.class create mode 100644 src/com/mysql/cj/protocol/result/AbstractResultsetRow$1.class create mode 100644 src/com/mysql/cj/protocol/result/AbstractResultsetRow.class create mode 100644 src/com/mysql/cj/protocol/x/CompressionAlgorithm.class create mode 100644 src/com/mysql/cj/protocol/x/CompressionMode.class create mode 100644 src/com/mysql/cj/protocol/x/CompressionSplittedInputStream.class create mode 100644 src/com/mysql/cj/protocol/x/CompressionSplittedOutputStream.class create mode 100644 src/com/mysql/cj/protocol/x/CompressorStreamsFactory.class create mode 100644 src/com/mysql/cj/protocol/x/ConfinedInputStream.class create mode 100644 src/com/mysql/cj/protocol/x/ContinuousInputStream.class create mode 100644 src/com/mysql/cj/protocol/x/ContinuousOutputStream.class create mode 100644 src/com/mysql/cj/protocol/x/ErrorToFutureCompletionHandler.class create mode 100644 src/com/mysql/cj/protocol/x/FetchDoneEntity.class create mode 100644 src/com/mysql/cj/protocol/x/FetchDoneEntityFactory.class create mode 100644 src/com/mysql/cj/protocol/x/FetchDoneMoreResults.class create mode 100644 src/com/mysql/cj/protocol/x/FetchDoneMoreResultsFactory.class create mode 100644 src/com/mysql/cj/protocol/x/FieldFactory$1.class create mode 100644 src/com/mysql/cj/protocol/x/FieldFactory.class create mode 100644 src/com/mysql/cj/protocol/x/MessageConstants.class create mode 100644 src/com/mysql/cj/protocol/x/Notice$XSessionStateChanged.class create mode 100644 src/com/mysql/cj/protocol/x/Notice$XSessionVariableChanged.class create mode 100644 src/com/mysql/cj/protocol/x/Notice$XWarning.class create mode 100644 src/com/mysql/cj/protocol/x/Notice.class create mode 100644 src/com/mysql/cj/protocol/x/NoticeFactory.class create mode 100644 src/com/mysql/cj/protocol/x/Ok.class create mode 100644 src/com/mysql/cj/protocol/x/OkBuilder.class create mode 100644 src/com/mysql/cj/protocol/x/OkFactory.class create mode 100644 src/com/mysql/cj/protocol/x/ResultMessageListener.class create mode 100644 src/com/mysql/cj/protocol/x/ReusableOutputStream.class create mode 100644 src/com/mysql/cj/protocol/x/StatementExecuteOk.class create mode 100644 src/com/mysql/cj/protocol/x/StatementExecuteOkBuilder.class create mode 100644 src/com/mysql/cj/protocol/x/StatementExecuteOkFactory.class create mode 100644 src/com/mysql/cj/protocol/x/SyncFlushDeflaterOutputStream.class create mode 100644 src/com/mysql/cj/protocol/x/SyncMessageReader$ListenersDispatcher.class create mode 100644 src/com/mysql/cj/protocol/x/SyncMessageReader.class create mode 100644 src/com/mysql/cj/protocol/x/SyncMessageSender.class create mode 100644 src/com/mysql/cj/protocol/x/XAuthenticationProvider$1.class create mode 100644 src/com/mysql/cj/protocol/x/XAuthenticationProvider.class create mode 100644 src/com/mysql/cj/protocol/x/XMessage.class create mode 100644 src/com/mysql/cj/protocol/x/XMessageBuilder$1.class create mode 100644 src/com/mysql/cj/protocol/x/XMessageBuilder$2.class create mode 100644 src/com/mysql/cj/protocol/x/XMessageBuilder.class create mode 100644 src/com/mysql/cj/protocol/x/XMessageHeader.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocol.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocolDecoder.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocolError.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocolRow.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocolRowFactory.class create mode 100644 src/com/mysql/cj/protocol/x/XProtocolRowInputStream.class create mode 100644 src/com/mysql/cj/protocol/x/XServerCapabilities.class create mode 100644 src/com/mysql/cj/protocol/x/XServerSession.class create mode 100644 src/com/mysql/cj/protocol/x/XpluginStatementCommand.class create mode 100644 src/com/mysql/cj/result/AbstractDateTimeValueFactory$1.class create mode 100644 src/com/mysql/cj/result/AbstractDateTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/AbstractNumericValueFactory.class create mode 100644 src/com/mysql/cj/result/BigDecimalValueFactory.class create mode 100644 src/com/mysql/cj/result/BinaryStreamValueFactory.class create mode 100644 src/com/mysql/cj/result/BooleanValueFactory.class create mode 100644 src/com/mysql/cj/result/BufferedRowList.class create mode 100644 src/com/mysql/cj/result/ByteValueFactory.class create mode 100644 src/com/mysql/cj/result/DefaultColumnDefinition$1.class create mode 100644 src/com/mysql/cj/result/DefaultColumnDefinition.class create mode 100644 src/com/mysql/cj/result/DefaultValueFactory.class create mode 100644 src/com/mysql/cj/result/DoubleValueFactory.class create mode 100644 src/com/mysql/cj/result/DurationValueFactory.class create mode 100644 src/com/mysql/cj/result/Field$1.class create mode 100644 src/com/mysql/cj/result/Field.class create mode 100644 src/com/mysql/cj/result/FloatValueFactory.class create mode 100644 src/com/mysql/cj/result/IntegerValueFactory.class create mode 100644 src/com/mysql/cj/result/LocalDateTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/LocalDateValueFactory.class create mode 100644 src/com/mysql/cj/result/LocalTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/LongValueFactory.class create mode 100644 src/com/mysql/cj/result/OffsetDateTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/OffsetTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/Row.class create mode 100644 src/com/mysql/cj/result/RowList.class create mode 100644 src/com/mysql/cj/result/ShortValueFactory.class create mode 100644 src/com/mysql/cj/result/SqlDateValueFactory.class create mode 100644 src/com/mysql/cj/result/SqlTimeValueFactory.class create mode 100644 src/com/mysql/cj/result/SqlTimestampValueFactory.class create mode 100644 src/com/mysql/cj/result/StringValueFactory.class create mode 100644 src/com/mysql/cj/result/UtilCalendarValueFactory.class create mode 100644 src/com/mysql/cj/result/ValueFactory.class create mode 100644 src/com/mysql/cj/result/ZonedDateTimeValueFactory.class create mode 100644 src/com/mysql/cj/sasl/ScramSha1SaslClient.class create mode 100644 src/com/mysql/cj/sasl/ScramSha256SaslClient.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslClient$1.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslClient$ScramExchangeStage.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslClient.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslClientFactory.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslProvider$ProviderService.class create mode 100644 src/com/mysql/cj/sasl/ScramShaSaslProvider.class create mode 100644 src/com/mysql/cj/util/Base64Decoder$IntWrapper.class create mode 100644 src/com/mysql/cj/util/Base64Decoder.class create mode 100644 src/com/mysql/cj/util/DataTypeUtil.class create mode 100644 src/com/mysql/cj/util/DnsSrv$SrvRecord.class create mode 100644 src/com/mysql/cj/util/DnsSrv.class create mode 100644 src/com/mysql/cj/util/EscapeTokenizer.class create mode 100644 src/com/mysql/cj/util/LRUCache.class create mode 100644 src/com/mysql/cj/util/LazyString.class create mode 100644 src/com/mysql/cj/util/LogUtils.class create mode 100644 src/com/mysql/cj/util/PerVmServerConfigCacheFactory$1.class create mode 100644 src/com/mysql/cj/util/PerVmServerConfigCacheFactory.class create mode 100644 src/com/mysql/cj/util/SaslPrep$StringType.class create mode 100644 src/com/mysql/cj/util/SaslPrep.class create mode 100644 src/com/mysql/cj/util/SearchMode.class create mode 100644 src/com/mysql/cj/util/SequentialIdLease.class create mode 100644 src/com/mysql/cj/util/StringInspector.class create mode 100644 src/com/mysql/cj/util/StringUtils.class create mode 100644 src/com/mysql/cj/util/TestUtils.class create mode 100644 src/com/mysql/cj/util/TimeUtil.class create mode 100644 src/com/mysql/cj/util/TimeZoneMapping.properties create mode 100644 src/com/mysql/cj/util/Util.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessages$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessages$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessages$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessages$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessages.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ClientMessagesOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Error$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Error$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Error$Severity$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Error$Severity.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Error.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ErrorOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Ok$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Ok$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$Ok.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$OkOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessages$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessages$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessages$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessages$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessages.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx$ServerMessagesOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/Mysqlx.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capabilities$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capabilities$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capabilities.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesGet$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesGet$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesGet.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesGetOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesSet$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesSet$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesSet.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilitiesSetOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capability$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capability$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Capability.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CapabilityOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Close$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Close$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Close.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CloseOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Compression$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Compression$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$Compression.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection$CompressionOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxConnection.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Collection$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Collection$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Collection.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$CollectionOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Column$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Column$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Column.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ColumnOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$CreateView$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$CreateView$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$CreateView.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$CreateViewOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DataModel$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DataModel.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Delete$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Delete$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Delete.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DeleteOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DropView$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DropView$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DropView.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$DropViewOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$RowLock$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$RowLock.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$RowLockOptions$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find$RowLockOptions.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Find.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$FindOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$TypedRow$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$TypedRow$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$TypedRow.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert$TypedRowOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Insert.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$InsertOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Limit$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Limit$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Limit.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$LimitExpr$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$LimitExpr$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$LimitExpr.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$LimitExprOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$LimitOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ModifyView$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ModifyView$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ModifyView.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ModifyViewOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Order$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Order$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Order$Direction$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Order$Direction.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Order.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$OrderOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Projection$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Projection$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Projection.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ProjectionOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Update$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Update$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$Update.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperation$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperation$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperation$UpdateType$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperation$UpdateType.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperation.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOperationOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$UpdateOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewAlgorithm$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewAlgorithm.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewCheckOption$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewCheckOption.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewSqlSecurity$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud$ViewSqlSecurity.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCrud.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Close$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Close$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Close.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$CloseOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Fetch$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Fetch$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Fetch.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$FetchOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessage$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessage$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessage$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessage$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessage.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open$OneOfMessageOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$Open.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor$OpenOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxCursor.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Any$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Any$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Any$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Any$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Any.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$AnyOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Array$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Array$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Array.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$ArrayOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$ObjectField$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$ObjectField$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$ObjectField.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object$ObjectFieldOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Object.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$ObjectOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Octets$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Octets$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Octets.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$OctetsOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$String$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$String$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$String.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$StringOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$Scalar.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes$ScalarOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxDatatypes.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Close$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Close$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Close.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$CloseOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$ConditionOperation$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$ConditionOperation.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$Key$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition$Key.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$Condition.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$ConditionOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$CtxOperation$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open$CtxOperation.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$Open.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect$OpenOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpect.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Array$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Array$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Array.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ArrayOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ColumnIdentifier$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ColumnIdentifier$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ColumnIdentifier.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ColumnIdentifierOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItem$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItem$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItem$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItem$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItem.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$DocumentPathItemOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Expr$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Expr$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Expr$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Expr$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Expr.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ExprOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$FunctionCall$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$FunctionCall$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$FunctionCall.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$FunctionCallOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Identifier$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Identifier$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Identifier.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$IdentifierOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$ObjectField$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$ObjectField$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$ObjectField.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object$ObjectFieldOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Object.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$ObjectOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Operator$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Operator$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$Operator.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr$OperatorOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxExpr.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$Scope$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$Scope.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Frame.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$FrameOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChanged$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChanged$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChanged$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChanged$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChanged.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$GroupReplicationStateChangedOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$ServerHello$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$ServerHello$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$ServerHello.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$ServerHelloOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChanged$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChanged$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChanged$Parameter$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChanged$Parameter.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChanged.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionStateChangedOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionVariableChanged$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionVariableChanged$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionVariableChanged.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$SessionVariableChangedOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Warning$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Warning$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Warning$Level$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Warning$Level.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$Warning.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice$WarningOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxNotice.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Deallocate$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Deallocate$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Deallocate.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$DeallocateOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Execute$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Execute$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Execute.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$ExecuteOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessage$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessage$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessage$Type$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessage$Type.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessage.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare$OneOfMessageOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$Prepare.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare$PrepareOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxPrepare.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaData$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaData$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaData$FieldType$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaData$FieldType.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaData.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ColumnMetaDataOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ContentType_BYTES$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ContentType_BYTES.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ContentType_DATETIME$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$ContentType_DATETIME.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDone$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDone$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDone.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreOutParams$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreOutParams$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreOutParams.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreOutParamsOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreResultsets$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreResultsets$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreResultsets.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneMoreResultsetsOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchDoneOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchSuspended$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchSuspended$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchSuspended.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$FetchSuspendedOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$Row$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$Row$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$Row.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset$RowOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxResultset.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateContinue$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateContinue$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateContinue.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateContinueOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateOk$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateOk$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateOk.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateOkOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateStart$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateStart$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateStart.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$AuthenticateStartOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Close$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Close$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Close.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$CloseOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Reset$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Reset$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$Reset.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession$ResetOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSession.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecute$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecute$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecute.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecuteOk$1.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecuteOk$Builder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecuteOk.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecuteOkOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql$StmtExecuteOrBuilder.class create mode 100644 src/com/mysql/cj/x/protobuf/MysqlxSql.class create mode 100644 src/com/mysql/cj/x/protobuf/package-info.class create mode 100644 src/com/mysql/cj/xdevapi/AbstractDataResult.class create mode 100644 src/com/mysql/cj/xdevapi/AbstractFilterParams.class create mode 100644 src/com/mysql/cj/xdevapi/AddResult.class create mode 100644 src/com/mysql/cj/xdevapi/AddResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/AddResultImpl.class create mode 100644 src/com/mysql/cj/xdevapi/AddStatement.class create mode 100644 src/com/mysql/cj/xdevapi/AddStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Client$ClientProperty.class create mode 100644 src/com/mysql/cj/xdevapi/Client.class create mode 100644 src/com/mysql/cj/xdevapi/ClientFactory.class create mode 100644 src/com/mysql/cj/xdevapi/ClientImpl$1.class create mode 100644 src/com/mysql/cj/xdevapi/ClientImpl$PooledXProtocol.class create mode 100644 src/com/mysql/cj/xdevapi/ClientImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Collection.class create mode 100644 src/com/mysql/cj/xdevapi/CollectionImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Column.class create mode 100644 src/com/mysql/cj/xdevapi/ColumnImpl$1.class create mode 100644 src/com/mysql/cj/xdevapi/ColumnImpl.class create mode 100644 src/com/mysql/cj/xdevapi/CreateIndexParams$IndexField.class create mode 100644 src/com/mysql/cj/xdevapi/CreateIndexParams.class create mode 100644 src/com/mysql/cj/xdevapi/DatabaseObject$DbObjectStatus.class create mode 100644 src/com/mysql/cj/xdevapi/DatabaseObject$DbObjectType.class create mode 100644 src/com/mysql/cj/xdevapi/DatabaseObject.class create mode 100644 src/com/mysql/cj/xdevapi/DatabaseObjectDescription.class create mode 100644 src/com/mysql/cj/xdevapi/DbDoc.class create mode 100644 src/com/mysql/cj/xdevapi/DbDocFactory.class create mode 100644 src/com/mysql/cj/xdevapi/DbDocImpl.class create mode 100644 src/com/mysql/cj/xdevapi/DbDocValueFactory.class create mode 100644 src/com/mysql/cj/xdevapi/DeleteStatement.class create mode 100644 src/com/mysql/cj/xdevapi/DeleteStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/DocFilterParams.class create mode 100644 src/com/mysql/cj/xdevapi/DocResult.class create mode 100644 src/com/mysql/cj/xdevapi/DocResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/DocResultImpl.class create mode 100644 src/com/mysql/cj/xdevapi/ExprParser$1.class create mode 100644 src/com/mysql/cj/xdevapi/ExprParser$ParseExpr.class create mode 100644 src/com/mysql/cj/xdevapi/ExprParser$Token.class create mode 100644 src/com/mysql/cj/xdevapi/ExprParser$TokenType.class create mode 100644 src/com/mysql/cj/xdevapi/ExprParser.class create mode 100644 src/com/mysql/cj/xdevapi/ExprUnparser$1.class create mode 100644 src/com/mysql/cj/xdevapi/ExprUnparser.class create mode 100644 src/com/mysql/cj/xdevapi/ExprUtil.class create mode 100644 src/com/mysql/cj/xdevapi/Expression.class create mode 100644 src/com/mysql/cj/xdevapi/FetchResult.class create mode 100644 src/com/mysql/cj/xdevapi/FilterParams$RowLock.class create mode 100644 src/com/mysql/cj/xdevapi/FilterParams$RowLockOptions.class create mode 100644 src/com/mysql/cj/xdevapi/FilterParams.class create mode 100644 src/com/mysql/cj/xdevapi/FilterableStatement.class create mode 100644 src/com/mysql/cj/xdevapi/FindStatement.class create mode 100644 src/com/mysql/cj/xdevapi/FindStatementImpl$1.class create mode 100644 src/com/mysql/cj/xdevapi/FindStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/InsertParams.class create mode 100644 src/com/mysql/cj/xdevapi/InsertResult.class create mode 100644 src/com/mysql/cj/xdevapi/InsertResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/InsertResultImpl.class create mode 100644 src/com/mysql/cj/xdevapi/InsertStatement.class create mode 100644 src/com/mysql/cj/xdevapi/InsertStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/JsonArray.class create mode 100644 src/com/mysql/cj/xdevapi/JsonLiteral.class create mode 100644 src/com/mysql/cj/xdevapi/JsonNumber.class create mode 100644 src/com/mysql/cj/xdevapi/JsonParser$EscapeChar.class create mode 100644 src/com/mysql/cj/xdevapi/JsonParser$StructuralToken.class create mode 100644 src/com/mysql/cj/xdevapi/JsonParser$Whitespace.class create mode 100644 src/com/mysql/cj/xdevapi/JsonParser.class create mode 100644 src/com/mysql/cj/xdevapi/JsonString.class create mode 100644 src/com/mysql/cj/xdevapi/JsonValue.class create mode 100644 src/com/mysql/cj/xdevapi/ModifyStatement.class create mode 100644 src/com/mysql/cj/xdevapi/ModifyStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/PreparableStatement$1.class create mode 100644 src/com/mysql/cj/xdevapi/PreparableStatement$PreparableStatementFinalizer.class create mode 100644 src/com/mysql/cj/xdevapi/PreparableStatement$PreparedState.class create mode 100644 src/com/mysql/cj/xdevapi/PreparableStatement.class create mode 100644 src/com/mysql/cj/xdevapi/RemoveStatement.class create mode 100644 src/com/mysql/cj/xdevapi/RemoveStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Result.class create mode 100644 src/com/mysql/cj/xdevapi/Row.class create mode 100644 src/com/mysql/cj/xdevapi/RowFactory.class create mode 100644 src/com/mysql/cj/xdevapi/RowImpl.class create mode 100644 src/com/mysql/cj/xdevapi/RowResult.class create mode 100644 src/com/mysql/cj/xdevapi/RowResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/RowResultImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Schema$CreateCollectionOptions.class create mode 100644 src/com/mysql/cj/xdevapi/Schema$ModifyCollectionOptions.class create mode 100644 src/com/mysql/cj/xdevapi/Schema$Validation$ValidationLevel.class create mode 100644 src/com/mysql/cj/xdevapi/Schema$Validation.class create mode 100644 src/com/mysql/cj/xdevapi/Schema.class create mode 100644 src/com/mysql/cj/xdevapi/SchemaImpl.class create mode 100644 src/com/mysql/cj/xdevapi/SelectStatement.class create mode 100644 src/com/mysql/cj/xdevapi/SelectStatementImpl$1.class create mode 100644 src/com/mysql/cj/xdevapi/SelectStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Session.class create mode 100644 src/com/mysql/cj/xdevapi/SessionFactory.class create mode 100644 src/com/mysql/cj/xdevapi/SessionImpl.class create mode 100644 src/com/mysql/cj/xdevapi/SqlMultiResult.class create mode 100644 src/com/mysql/cj/xdevapi/SqlResult.class create mode 100644 src/com/mysql/cj/xdevapi/SqlResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/SqlSingleResult.class create mode 100644 src/com/mysql/cj/xdevapi/SqlStatement.class create mode 100644 src/com/mysql/cj/xdevapi/SqlStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/SqlUpdateResult.class create mode 100644 src/com/mysql/cj/xdevapi/Statement$LockContention.class create mode 100644 src/com/mysql/cj/xdevapi/Statement.class create mode 100644 src/com/mysql/cj/xdevapi/StreamingDocResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/StreamingRowResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/StreamingSqlResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/Table.class create mode 100644 src/com/mysql/cj/xdevapi/TableFilterParams.class create mode 100644 src/com/mysql/cj/xdevapi/TableImpl.class create mode 100644 src/com/mysql/cj/xdevapi/Type.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateParams.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateResult.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateResultBuilder.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateSpec.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateStatement.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateStatementImpl.class create mode 100644 src/com/mysql/cj/xdevapi/UpdateType.class create mode 100644 src/com/mysql/cj/xdevapi/Warning.class create mode 100644 src/com/mysql/cj/xdevapi/WarningImpl.class create mode 100644 src/com/mysql/cj/xdevapi/XDevAPIError.class create mode 100644 src/com/mysql/cj/xdevapi/package-info.class create mode 100644 src/com/mysql/jdbc/Driver.class create mode 100644 src/com/mysql/jdbc/SocketFactory.class create mode 100644 src/com/mysql/jdbc/SocketFactoryWrapper.class create mode 100644 src/org/json/simple/ItemList.java create mode 100644 src/org/json/simple/JSONArray.java create mode 100644 src/org/json/simple/JSONAware.java create mode 100644 src/org/json/simple/JSONObject.java create mode 100644 src/org/json/simple/JSONStreamAware.java create mode 100644 src/org/json/simple/JSONValue.java create mode 100644 src/org/json/simple/parser/ContainerFactory.java create mode 100644 src/org/json/simple/parser/ContentHandler.java create mode 100644 src/org/json/simple/parser/JSONParser.java create mode 100644 src/org/json/simple/parser/ParseException.java create mode 100644 src/org/json/simple/parser/Yylex.java create mode 100644 src/org/json/simple/parser/Yytoken.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..eaf91e2 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/artifacts/WorkoutDBDatesAutoUpdater_jar.xml b/.idea/artifacts/WorkoutDBDatesAutoUpdater_jar.xml new file mode 100644 index 0000000..c3f97b1 --- /dev/null +++ b/.idea/artifacts/WorkoutDBDatesAutoUpdater_jar.xml @@ -0,0 +1,11 @@ + + + $PROJECT_DIR$/out/artifacts/WorkoutDBDatesAutoUpdater + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/java.xml b/.idea/libraries/java.xml new file mode 100644 index 0000000..b96e2a4 --- /dev/null +++ b/.idea/libraries/java.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/mysql_connector_j_8_0.xml b/.idea/libraries/mysql_connector_j_8_0.xml new file mode 100644 index 0000000..ce5fc1e --- /dev/null +++ b/.idea/libraries/mysql_connector_j_8_0.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f5dd03a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5f595c9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..6d50cd4 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WorkoutDBDatesAutoUpdater.iml b/WorkoutDBDatesAutoUpdater.iml new file mode 100644 index 0000000..50edbb7 --- /dev/null +++ b/WorkoutDBDatesAutoUpdater.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..43285b6 --- /dev/null +++ b/config.json @@ -0,0 +1,7 @@ +{ + "dbname" : "localhost", + "dbuser" : "root", + "dbport" : "3306" , + "dbpass" : "506763", + "schemename" : "workout" +} \ No newline at end of file diff --git a/json-simple-master/.classpath b/json-simple-master/.classpath new file mode 100644 index 0000000..41c3da1 --- /dev/null +++ b/json-simple-master/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/json-simple-master/.gitignore b/json-simple-master/.gitignore new file mode 100644 index 0000000..c8a2a91 --- /dev/null +++ b/json-simple-master/.gitignore @@ -0,0 +1,2 @@ +.settings/ +target/ \ No newline at end of file diff --git a/json-simple-master/.project b/json-simple-master/.project new file mode 100644 index 0000000..b1980df --- /dev/null +++ b/json-simple-master/.project @@ -0,0 +1,17 @@ + + + json-simple + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/json-simple-master/AUTHORS.txt b/json-simple-master/AUTHORS.txt new file mode 100644 index 0000000..8f2b7cb --- /dev/null +++ b/json-simple-master/AUTHORS.txt @@ -0,0 +1,3 @@ +Yidong Fang +Chris Nokleberg +Dave Hughes diff --git a/json-simple-master/ChangeLog.txt b/json-simple-master/ChangeLog.txt new file mode 100644 index 0000000..481db74 --- /dev/null +++ b/json-simple-master/ChangeLog.txt @@ -0,0 +1,28 @@ +ChangeLog + +Version 1.1.1 (2012/01/29) +* Supports OSGi +* Accepts a java.util.Map parameter in constructor of JSONObject + +Version 1.1 (2009/01/23) +* Supports stoppable SAX-like content handler for streaming of JSON text +* Added JSONStreamAware to support streaming JSON text +* Added ContainerFactory to support creating arbitrary Map and List as JSON object and JSON array container during decoding +* Supports any Map and List as JSON object and JSON array container during encoding +* Added interface JSONAware +* Added ParseException to get detail error report while parsing +* Added escaping for Unicode characters that cause problems for browser JS eval + +Version 1.02 (2009/01/10) +* Updated json.lex to improve performance of the lexer +* Removed Rope.java and related junit test + +Version 1.01 (2008/08/26) +* License changed to a more commerce friendly and clear one, Apache License 2.0 +* Use JFlex to generate a faster Yylex.java +* Added Rope.java to get faster string operations +* Separate test codes from source codes +* Added ant build file build.xml + +Version 1.0 (2006/04/15) +* Initial version diff --git a/json-simple-master/LICENSE.txt b/json-simple-master/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/json-simple-master/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/json-simple-master/README.txt b/json-simple-master/README.txt new file mode 100644 index 0000000..e31e82c --- /dev/null +++ b/json-simple-master/README.txt @@ -0,0 +1,2 @@ +Please visit: +http://code.google.com/p/json-simple/ \ No newline at end of file diff --git a/json-simple-master/VERSION.txt b/json-simple-master/VERSION.txt new file mode 100644 index 0000000..524cb55 --- /dev/null +++ b/json-simple-master/VERSION.txt @@ -0,0 +1 @@ +1.1.1 diff --git a/json-simple-master/build.xml b/json-simple-master/build.xml new file mode 100644 index 0000000..2686ea7 --- /dev/null +++ b/json-simple-master/build.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/json-simple-master/doc/json.lex b/json-simple-master/doc/json.lex new file mode 100644 index 0000000..cdb2753 --- /dev/null +++ b/json-simple-master/doc/json.lex @@ -0,0 +1,61 @@ +package org.json.simple.parser; + +%% + +%{ +private StringBuffer sb=new StringBuffer(); + +int getPosition(){ + return yychar; +} + +%} + +%table +%unicode +%state STRING_BEGIN + +%yylexthrow ParseException +%char + +HEX_D = [a-fA-F0-9] +INT = [-]?[0-9]+ +DOUBLE = {INT}((\.[0-9]+)?([eE][-+]?[0-9]+)?) +WS = [ \t\r\n] +UNESCAPED_CH = [^\"\\] +FALLBACK_CH = . +%% + + \" { yybegin(YYINITIAL);return new Yytoken(Yytoken.TYPE_VALUE, sb.toString());} + {UNESCAPED_CH}+ { sb.append(yytext());} + \\\" {sb.append('"');} + \\\\ {sb.append('\\');} + \\\/ {sb.append('/');} + \\b {sb.append('\b');} + \\f {sb.append('\f');} + \\n {sb.append('\n');} + \\r {sb.append('\r');} + \\t {sb.append('\t');} + \\u{HEX_D}{HEX_D}{HEX_D}{HEX_D} { try{ + int ch=Integer.parseInt(yytext().substring(2),16); + sb.append((char)ch); + } + catch(Exception e){ + throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_EXCEPTION, e); + } + } + \\ {sb.append('\\');} + + \" { sb = null; sb = new StringBuffer(); yybegin(STRING_BEGIN);} + {INT} { Long val=Long.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val);} + {DOUBLE} { Double val=Double.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val);} + "true"|"false" { Boolean val=Boolean.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val);} + "null" { return new Yytoken(Yytoken.TYPE_VALUE, null);} + "{" { return new Yytoken(Yytoken.TYPE_LEFT_BRACE,null);} + "}" { return new Yytoken(Yytoken.TYPE_RIGHT_BRACE,null);} + "[" { return new Yytoken(Yytoken.TYPE_LEFT_SQUARE,null);} + "]" { return new Yytoken(Yytoken.TYPE_RIGHT_SQUARE,null);} + "," { return new Yytoken(Yytoken.TYPE_COMMA,null);} + ":" { return new Yytoken(Yytoken.TYPE_COLON,null);} + {WS}+ {} + {FALLBACK_CH} { throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR, new Character(yycharat(0)));} diff --git a/json-simple-master/pom.xml b/json-simple-master/pom.xml new file mode 100644 index 0000000..19f83c9 --- /dev/null +++ b/json-simple-master/pom.xml @@ -0,0 +1,110 @@ + + 4.0.0 + com.googlecode.json-simple + json-simple + bundle + JSON.simple + 1.1.1 + A simple Java toolkit for JSON + http://code.google.com/p/json-simple/ + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + Yidong + Yidong Fang + + architect + developer + + +8 + + + + scm:svn:http://json-simple.googlecode.com/svn/trunk/ + scm:svn:http://json-simple.googlecode.com/svn/trunk/ + http://json-simple.googlecode.com/svn/trunk/ + + + + UTF-8 + + + + + junit + junit + 4.13.2 + test + + + + + + + org.apache.felix + maven-bundle-plugin + 5.1.1 + true + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + verify + + jar-no-fork + + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.4 + + + sign-artifacts + verify + + sign + + + + + + + + + + diff --git a/json-simple-master/src/main/java/org/json/simple/ItemList.java b/json-simple-master/src/main/java/org/json/simple/ItemList.java new file mode 100644 index 0000000..07231e6 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/ItemList.java @@ -0,0 +1,147 @@ +/* + * $Id: ItemList.java,v 1.1 2006/04/15 14:10:48 platform Exp $ + * Created on 2006-3-24 + */ +package org.json.simple; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +/** + * |a:b:c| => |a|,|b|,|c| + * |:| => ||,|| + * |a:| => |a|,|| + * @author FangYidong + */ +public class ItemList { + private String sp=","; + List items=new ArrayList(); + + + public ItemList(){} + + + public ItemList(String s){ + this.split(s,sp,items); + } + + public ItemList(String s,String sp){ + this.sp=s; + this.split(s,sp,items); + } + + public ItemList(String s,String sp,boolean isMultiToken){ + split(s,sp,items,isMultiToken); + } + + public List getItems(){ + return this.items; + } + + public String[] getArray(){ + return (String[])this.items.toArray(); + } + + public void split(String s,String sp,List append,boolean isMultiToken){ + if(s==null || sp==null) + return; + if(isMultiToken){ + StringTokenizer tokens=new StringTokenizer(s,sp); + while(tokens.hasMoreTokens()){ + append.add(tokens.nextToken().trim()); + } + } + else{ + this.split(s,sp,append); + } + } + + public void split(String s,String sp,List append){ + if(s==null || sp==null) + return; + int pos=0; + int prevPos=0; + do{ + prevPos=pos; + pos=s.indexOf(sp,pos); + if(pos==-1) + break; + append.add(s.substring(prevPos,pos).trim()); + pos+=sp.length(); + }while(pos!=-1); + append.add(s.substring(prevPos).trim()); + } + + public void setSP(String sp){ + this.sp=sp; + } + + public void add(int i,String item){ + if(item==null) + return; + items.add(i,item.trim()); + } + + public void add(String item){ + if(item==null) + return; + items.add(item.trim()); + } + + public void addAll(ItemList list){ + items.addAll(list.items); + } + + public void addAll(String s){ + this.split(s,sp,items); + } + + public void addAll(String s,String sp){ + this.split(s,sp,items); + } + + public void addAll(String s,String sp,boolean isMultiToken){ + this.split(s,sp,items,isMultiToken); + } + + /** + * @param i 0-based + * @return + */ + public String get(int i){ + return (String)items.get(i); + } + + public int size(){ + return items.size(); + } + + public String toString(){ + return toString(sp); + } + + public String toString(String sp){ + StringBuffer sb=new StringBuffer(); + + for(int i=0;i + */ +public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware { + private static final long serialVersionUID = 3957988303675231981L; + + /** + * Constructs an empty JSONArray. + */ + public JSONArray(){ + super(); + } + + /** + * Constructs a JSONArray containing the elements of the specified + * collection, in the order they are returned by the collection's iterator. + * + * @param c the collection whose elements are to be placed into this JSONArray + */ + public JSONArray(Collection c){ + super(c); + } + + /** + * Encode a list into JSON text and write it to out. + * If this list is also a JSONStreamAware or a JSONAware, JSONStreamAware and JSONAware specific behaviours will be ignored at this top level. + * + * @see org.json.simple.JSONValue#writeJSONString(Object, Writer) + * + * @param collection + * @param out + */ + public static void writeJSONString(Collection collection, Writer out) throws IOException{ + if(collection == null){ + out.write("null"); + return; + } + + boolean first = true; + Iterator iter=collection.iterator(); + + out.write('['); + while(iter.hasNext()){ + if(first) + first = false; + else + out.write(','); + + Object value=iter.next(); + if(value == null){ + out.write("null"); + continue; + } + + JSONValue.writeJSONString(value, out); + } + out.write(']'); + } + + public void writeJSONString(Writer out) throws IOException{ + writeJSONString(this, out); + } + + /** + * Convert a list to JSON text. The result is a JSON array. + * If this list is also a JSONAware, JSONAware specific behaviours will be omitted at this top level. + * + * @see org.json.simple.JSONValue#toJSONString(Object) + * + * @param collection + * @return JSON text, or "null" if list is null. + */ + public static String toJSONString(Collection collection){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(collection, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(byte[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(byte[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(short[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(short[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(int[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(int[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(long[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(long[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(float[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(float[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(double[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(double[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(boolean[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write(","); + out.write(String.valueOf(array[i])); + } + + out.write("]"); + } + } + + public static String toJSONString(boolean[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(char[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("[\""); + out.write(String.valueOf(array[0])); + + for(int i = 1; i < array.length; i++){ + out.write("\",\""); + out.write(String.valueOf(array[i])); + } + + out.write("\"]"); + } + } + + public static String toJSONString(char[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public static void writeJSONString(Object[] array, Writer out) throws IOException{ + if(array == null){ + out.write("null"); + } else if(array.length == 0) { + out.write("[]"); + } else { + out.write("["); + JSONValue.writeJSONString(array[0], out); + + for(int i = 1; i < array.length; i++){ + out.write(","); + JSONValue.writeJSONString(array[i], out); + } + + out.write("]"); + } + } + + public static String toJSONString(Object[] array){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(array, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + public String toJSONString(){ + return toJSONString(this); + } + + /** + * Returns a string representation of this array. This is equivalent to + * calling {@link JSONArray#toJSONString()}. + */ + public String toString() { + return toJSONString(); + } +} diff --git a/json-simple-master/src/main/java/org/json/simple/JSONAware.java b/json-simple-master/src/main/java/org/json/simple/JSONAware.java new file mode 100644 index 0000000..89f1525 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/JSONAware.java @@ -0,0 +1,12 @@ +package org.json.simple; + +/** + * Beans that support customized output of JSON text shall implement this interface. + * @author FangYidong + */ +public interface JSONAware { + /** + * @return JSON text + */ + String toJSONString(); +} diff --git a/json-simple-master/src/main/java/org/json/simple/JSONObject.java b/json-simple-master/src/main/java/org/json/simple/JSONObject.java new file mode 100644 index 0000000..f565b3e --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/JSONObject.java @@ -0,0 +1,132 @@ +/* + * $Id: JSONObject.java,v 1.1 2006/04/15 14:10:48 platform Exp $ + * Created on 2006-4-10 + */ +package org.json.simple; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * A JSON object. Key value pairs are unordered. JSONObject supports java.util.Map interface. + * + * @author FangYidong + */ +public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{ + + private static final long serialVersionUID = -503443796854799292L; + + + public JSONObject() { + super(); + } + + /** + * Allows creation of a JSONObject from a Map. After that, both the + * generated JSONObject and the Map can be modified independently. + * + * @param map + */ + public JSONObject(Map map) { + super(map); + } + + + /** + * Encode a map into JSON text and write it to out. + * If this map is also a JSONAware or JSONStreamAware, JSONAware or JSONStreamAware specific behaviours will be ignored at this top level. + * + * @see org.json.simple.JSONValue#writeJSONString(Object, Writer) + * + * @param map + * @param out + */ + public static void writeJSONString(Map map, Writer out) throws IOException { + if(map == null){ + out.write("null"); + return; + } + + boolean first = true; + Iterator iter=map.entrySet().iterator(); + + out.write('{'); + while(iter.hasNext()){ + if(first) + first = false; + else + out.write(','); + Map.Entry entry=(Map.Entry)iter.next(); + out.write('\"'); + out.write(escape(String.valueOf(entry.getKey()))); + out.write('\"'); + out.write(':'); + JSONValue.writeJSONString(entry.getValue(), out); + } + out.write('}'); + } + + public void writeJSONString(Writer out) throws IOException{ + writeJSONString(this, out); + } + + /** + * Convert a map to JSON text. The result is a JSON object. + * If this map is also a JSONAware, JSONAware specific behaviours will be omitted at this top level. + * + * @see org.json.simple.JSONValue#toJSONString(Object) + * + * @param map + * @return JSON text, or "null" if map is null. + */ + public static String toJSONString(Map map){ + final StringWriter writer = new StringWriter(); + + try { + writeJSONString(map, writer); + return writer.toString(); + } catch (IOException e) { + // This should never happen with a StringWriter + throw new RuntimeException(e); + } + } + + public String toJSONString(){ + return toJSONString(this); + } + + public String toString(){ + return toJSONString(); + } + + public static String toString(String key,Object value){ + StringBuffer sb = new StringBuffer(); + sb.append('\"'); + if(key == null) + sb.append("null"); + else + JSONValue.escape(key, sb); + sb.append('\"').append(':'); + + sb.append(JSONValue.toJSONString(value)); + + return sb.toString(); + } + + /** + * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). + * It's the same as JSONValue.escape() only for compatibility here. + * + * @see org.json.simple.JSONValue#escape(String) + * + * @param s + * @return + */ + public static String escape(String s){ + return JSONValue.escape(s); + } +} diff --git a/json-simple-master/src/main/java/org/json/simple/JSONStreamAware.java b/json-simple-master/src/main/java/org/json/simple/JSONStreamAware.java new file mode 100644 index 0000000..c2287c4 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/JSONStreamAware.java @@ -0,0 +1,15 @@ +package org.json.simple; + +import java.io.IOException; +import java.io.Writer; + +/** + * Beans that support customized output of JSON text to a writer shall implement this interface. + * @author FangYidong + */ +public interface JSONStreamAware { + /** + * write JSON string to out. + */ + void writeJSONString(Writer out) throws IOException; +} diff --git a/json-simple-master/src/main/java/org/json/simple/JSONValue.java b/json-simple-master/src/main/java/org/json/simple/JSONValue.java new file mode 100644 index 0000000..2fddb21 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/JSONValue.java @@ -0,0 +1,316 @@ +/* + * $Id: JSONValue.java,v 1.1 2006/04/15 14:37:04 platform Exp $ + * Created on 2006-4-15 + */ +package org.json.simple; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Collection; +// import java.util.List; +import java.util.Map; + +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + + +/** + * @author FangYidong + */ +public class JSONValue { + /** + * Parse JSON text into java object from the input source. + * Please use parseWithException() if you don't want to ignore the exception. + * + * @see org.json.simple.parser.JSONParser#parse(Reader) + * @see #parseWithException(Reader) + * + * @param in + * @return Instance of the following: + * org.json.simple.JSONObject, + * org.json.simple.JSONArray, + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean, + * null + * + * @deprecated this method may throw an {@code Error} instead of returning + * {@code null}; please use {@link JSONValue#parseWithException(Reader)} + * instead + */ + public static Object parse(Reader in){ + try{ + JSONParser parser=new JSONParser(); + return parser.parse(in); + } + catch(Exception e){ + return null; + } + } + + /** + * Parse JSON text into java object from the given string. + * Please use parseWithException() if you don't want to ignore the exception. + * + * @see org.json.simple.parser.JSONParser#parse(Reader) + * @see #parseWithException(Reader) + * + * @param s + * @return Instance of the following: + * org.json.simple.JSONObject, + * org.json.simple.JSONArray, + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean, + * null + * + * @deprecated this method may throw an {@code Error} instead of returning + * {@code null}; please use {@link JSONValue#parseWithException(String)} + * instead + */ + public static Object parse(String s){ + StringReader in=new StringReader(s); + return parse(in); + } + + /** + * Parse JSON text into java object from the input source. + * + * @see org.json.simple.parser.JSONParser + * + * @param in + * @return Instance of the following: + * org.json.simple.JSONObject, + * org.json.simple.JSONArray, + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean, + * null + * + * @throws IOException + * @throws ParseException + */ + public static Object parseWithException(Reader in) throws IOException, ParseException{ + JSONParser parser=new JSONParser(); + return parser.parse(in); + } + + public static Object parseWithException(String s) throws ParseException{ + JSONParser parser=new JSONParser(); + return parser.parse(s); + } + + /** + * Encode an object into JSON text and write it to out. + *

+ * If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware will be considered firstly. + *

+ * DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or List) with + * "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or JSONArray.writeJSONString(List, Writer) instead. + * + * @see org.json.simple.JSONObject#writeJSONString(Map, Writer) + * @see org.json.simple.JSONArray#writeJSONString(List, Writer) + * + * @param value + * @param writer + */ + public static void writeJSONString(Object value, Writer out) throws IOException { + if(value == null){ + out.write("null"); + return; + } + + if(value instanceof String){ + out.write('\"'); + out.write(escape((String)value)); + out.write('\"'); + return; + } + + if(value instanceof Double){ + if(((Double)value).isInfinite() || ((Double)value).isNaN()) + out.write("null"); + else + out.write(value.toString()); + return; + } + + if(value instanceof Float){ + if(((Float)value).isInfinite() || ((Float)value).isNaN()) + out.write("null"); + else + out.write(value.toString()); + return; + } + + if(value instanceof Number){ + out.write(value.toString()); + return; + } + + if(value instanceof Boolean){ + out.write(value.toString()); + return; + } + + if((value instanceof JSONStreamAware)){ + ((JSONStreamAware)value).writeJSONString(out); + return; + } + + if((value instanceof JSONAware)){ + out.write(((JSONAware)value).toJSONString()); + return; + } + + if(value instanceof Map){ + JSONObject.writeJSONString((Map)value, out); + return; + } + + if(value instanceof Collection){ + JSONArray.writeJSONString((Collection)value, out); + return; + } + + if(value instanceof byte[]){ + JSONArray.writeJSONString((byte[])value, out); + return; + } + + if(value instanceof short[]){ + JSONArray.writeJSONString((short[])value, out); + return; + } + + if(value instanceof int[]){ + JSONArray.writeJSONString((int[])value, out); + return; + } + + if(value instanceof long[]){ + JSONArray.writeJSONString((long[])value, out); + return; + } + + if(value instanceof float[]){ + JSONArray.writeJSONString((float[])value, out); + return; + } + + if(value instanceof double[]){ + JSONArray.writeJSONString((double[])value, out); + return; + } + + if(value instanceof boolean[]){ + JSONArray.writeJSONString((boolean[])value, out); + return; + } + + if(value instanceof char[]){ + JSONArray.writeJSONString((char[])value, out); + return; + } + + if(value instanceof Object[]){ + JSONArray.writeJSONString((Object[])value, out); + return; + } + + out.write(value.toString()); + } + + /** + * Convert an object to JSON text. + *

+ * If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly. + *

+ * DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with + * "this" as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead. + * + * @see org.json.simple.JSONObject#toJSONString(Map) + * @see org.json.simple.JSONArray#toJSONString(List) + * + * @param value + * @return JSON text, or "null" if value is null or it's an NaN or an INF number. + */ + public static String toJSONString(Object value){ + final StringWriter writer = new StringWriter(); + + try{ + writeJSONString(value, writer); + return writer.toString(); + } catch(IOException e){ + // This should never happen for a StringWriter + throw new RuntimeException(e); + } + } + + /** + * Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). + * @param s + * @return + */ + public static String escape(String s){ + if(s==null) + return null; + StringBuffer sb = new StringBuffer(); + escape(s, sb); + return sb.toString(); + } + + /** + * @param s - Must not be null. + * @param sb + */ + static void escape(String s, StringBuffer sb) { + final int len = s.length(); + for(int i=0;i='\u0000' && ch<='\u001F') || (ch>='\u007F' && ch<='\u009F') || (ch>='\u2000' && ch<='\u20FF')){ + String ss=Integer.toHexString(ch); + sb.append("\\u"); + for(int k=0;k<4-ss.length();k++){ + sb.append('0'); + } + sb.append(ss.toUpperCase()); + } + else{ + sb.append(ch); + } + } + }//for + } + +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/ContainerFactory.java b/json-simple-master/src/main/java/org/json/simple/parser/ContainerFactory.java new file mode 100644 index 0000000..366ac4d --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/ContainerFactory.java @@ -0,0 +1,23 @@ +package org.json.simple.parser; + +import java.util.List; +import java.util.Map; + +/** + * Container factory for creating containers for JSON object and JSON array. + * + * @see org.json.simple.parser.JSONParser#parse(java.io.Reader, ContainerFactory) + * + * @author FangYidong + */ +public interface ContainerFactory { + /** + * @return A Map instance to store JSON object, or null if you want to use org.json.simple.JSONObject. + */ + Map createObjectContainer(); + + /** + * @return A List instance to store JSON array, or null if you want to use org.json.simple.JSONArray. + */ + List creatArrayContainer(); +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/ContentHandler.java b/json-simple-master/src/main/java/org/json/simple/parser/ContentHandler.java new file mode 100644 index 0000000..ae8d065 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/ContentHandler.java @@ -0,0 +1,110 @@ +package org.json.simple.parser; + +import java.io.IOException; + +/** + * A simplified and stoppable SAX-like content handler for stream processing of JSON text. + * + * @see org.xml.sax.ContentHandler + * @see org.json.simple.parser.JSONParser#parse(java.io.Reader, ContentHandler, boolean) + * + * @author FangYidong + */ +public interface ContentHandler { + /** + * Receive notification of the beginning of JSON processing. + * The parser will invoke this method only once. + * + * @throws ParseException + * - JSONParser will stop and throw the same exception to the caller when receiving this exception. + */ + void startJSON() throws ParseException, IOException; + + /** + * Receive notification of the end of JSON processing. + * + * @throws ParseException + */ + void endJSON() throws ParseException, IOException; + + /** + * Receive notification of the beginning of a JSON object. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * - JSONParser will stop and throw the same exception to the caller when receiving this exception. + * @see #endJSON + */ + boolean startObject() throws ParseException, IOException; + + /** + * Receive notification of the end of a JSON object. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * + * @see #startObject + */ + boolean endObject() throws ParseException, IOException; + + /** + * Receive notification of the beginning of a JSON object entry. + * + * @param key - Key of a JSON object entry. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * + * @see #endObjectEntry + */ + boolean startObjectEntry(String key) throws ParseException, IOException; + + /** + * Receive notification of the end of the value of previous object entry. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * + * @see #startObjectEntry + */ + boolean endObjectEntry() throws ParseException, IOException; + + /** + * Receive notification of the beginning of a JSON array. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * + * @see #endArray + */ + boolean startArray() throws ParseException, IOException; + + /** + * Receive notification of the end of a JSON array. + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + * + * @see #startArray + */ + boolean endArray() throws ParseException, IOException; + + /** + * Receive notification of the JSON primitive values: + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean + * null + * + * @param value - Instance of the following: + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean + * null + * + * @return false if the handler wants to stop parsing after return. + * @throws ParseException + */ + boolean primitive(Object value) throws ParseException, IOException; + +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/JSONParser.java b/json-simple-master/src/main/java/org/json/simple/parser/JSONParser.java new file mode 100644 index 0000000..9acaa37 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/JSONParser.java @@ -0,0 +1,533 @@ +/* + * $Id: JSONParser.java,v 1.1 2006/04/15 14:10:48 platform Exp $ + * Created on 2006-4-15 + */ +package org.json.simple.parser; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + + +/** + * Parser for JSON text. Please note that JSONParser is NOT thread-safe. + * + * @author FangYidong + */ +public class JSONParser { + public static final int S_INIT=0; + public static final int S_IN_FINISHED_VALUE=1;//string,number,boolean,null,object,array + public static final int S_IN_OBJECT=2; + public static final int S_IN_ARRAY=3; + public static final int S_PASSED_PAIR_KEY=4; + public static final int S_IN_PAIR_VALUE=5; + public static final int S_END=6; + public static final int S_IN_ERROR=-1; + + private LinkedList handlerStatusStack; + private Yylex lexer = new Yylex((Reader)null); + private Yytoken token = null; + private int status = S_INIT; + + private int peekStatus(LinkedList statusStack){ + if(statusStack.size()==0) + return -1; + Integer status=(Integer)statusStack.getFirst(); + return status.intValue(); + } + + /** + * Reset the parser to the initial state without resetting the underlying reader. + * + */ + public void reset(){ + token = null; + status = S_INIT; + handlerStatusStack = null; + } + + /** + * Reset the parser to the initial state with a new character reader. + * + * @param in - The new character reader. + * @throws IOException + * @throws ParseException + */ + public void reset(Reader in){ + lexer.yyreset(in); + reset(); + } + + /** + * @return The position of the beginning of the current token. + */ + public int getPosition(){ + return lexer.getPosition(); + } + + public Object parse(String s) throws ParseException{ + return parse(s, (ContainerFactory)null); + } + + public Object parse(String s, ContainerFactory containerFactory) throws ParseException{ + StringReader in=new StringReader(s); + try{ + return parse(in, containerFactory); + } + catch(IOException ie){ + /* + * Actually it will never happen. + */ + throw new ParseException(-1, ParseException.ERROR_UNEXPECTED_EXCEPTION, ie); + } + } + + public Object parse(Reader in) throws IOException, ParseException{ + return parse(in, (ContainerFactory)null); + } + + /** + * Parse JSON text into java object from the input source. + * + * @param in + * @param containerFactory - Use this factory to createyour own JSON object and JSON array containers. + * @return Instance of the following: + * org.json.simple.JSONObject, + * org.json.simple.JSONArray, + * java.lang.String, + * java.lang.Number, + * java.lang.Boolean, + * null + * + * @throws IOException + * @throws ParseException + */ + public Object parse(Reader in, ContainerFactory containerFactory) throws IOException, ParseException{ + reset(in); + LinkedList statusStack = new LinkedList(); + LinkedList valueStack = new LinkedList(); + + try{ + do{ + nextToken(); + switch(status){ + case S_INIT: + switch(token.type){ + case Yytoken.TYPE_VALUE: + status=S_IN_FINISHED_VALUE; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(token.value); + break; + case Yytoken.TYPE_LEFT_BRACE: + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(createObjectContainer(containerFactory)); + break; + case Yytoken.TYPE_LEFT_SQUARE: + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(createArrayContainer(containerFactory)); + break; + default: + status=S_IN_ERROR; + }//inner switch + break; + + case S_IN_FINISHED_VALUE: + if(token.type==Yytoken.TYPE_EOF) + return valueStack.removeFirst(); + else + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + + case S_IN_OBJECT: + switch(token.type){ + case Yytoken.TYPE_COMMA: + break; + case Yytoken.TYPE_VALUE: + if(token.value instanceof String){ + String key=(String)token.value; + valueStack.addFirst(key); + status=S_PASSED_PAIR_KEY; + statusStack.addFirst(new Integer(status)); + } + else{ + status=S_IN_ERROR; + } + break; + case Yytoken.TYPE_RIGHT_BRACE: + if(valueStack.size()>1){ + statusStack.removeFirst(); + valueStack.removeFirst(); + status=peekStatus(statusStack); + } + else{ + status=S_IN_FINISHED_VALUE; + } + break; + default: + status=S_IN_ERROR; + break; + }//inner switch + break; + + case S_PASSED_PAIR_KEY: + switch(token.type){ + case Yytoken.TYPE_COLON: + break; + case Yytoken.TYPE_VALUE: + statusStack.removeFirst(); + String key=(String)valueStack.removeFirst(); + Map parent=(Map)valueStack.getFirst(); + parent.put(key,token.value); + status=peekStatus(statusStack); + break; + case Yytoken.TYPE_LEFT_SQUARE: + statusStack.removeFirst(); + key=(String)valueStack.removeFirst(); + parent=(Map)valueStack.getFirst(); + List newArray=createArrayContainer(containerFactory); + parent.put(key,newArray); + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(newArray); + break; + case Yytoken.TYPE_LEFT_BRACE: + statusStack.removeFirst(); + key=(String)valueStack.removeFirst(); + parent=(Map)valueStack.getFirst(); + Map newObject=createObjectContainer(containerFactory); + parent.put(key,newObject); + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(newObject); + break; + default: + status=S_IN_ERROR; + } + break; + + case S_IN_ARRAY: + switch(token.type){ + case Yytoken.TYPE_COMMA: + break; + case Yytoken.TYPE_VALUE: + List val=(List)valueStack.getFirst(); + val.add(token.value); + break; + case Yytoken.TYPE_RIGHT_SQUARE: + if(valueStack.size()>1){ + statusStack.removeFirst(); + valueStack.removeFirst(); + status=peekStatus(statusStack); + } + else{ + status=S_IN_FINISHED_VALUE; + } + break; + case Yytoken.TYPE_LEFT_BRACE: + val=(List)valueStack.getFirst(); + Map newObject=createObjectContainer(containerFactory); + val.add(newObject); + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(newObject); + break; + case Yytoken.TYPE_LEFT_SQUARE: + val=(List)valueStack.getFirst(); + List newArray=createArrayContainer(containerFactory); + val.add(newArray); + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + valueStack.addFirst(newArray); + break; + default: + status=S_IN_ERROR; + }//inner switch + break; + case S_IN_ERROR: + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + }//switch + if(status==S_IN_ERROR){ + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + } + }while(token.type!=Yytoken.TYPE_EOF); + } + catch(IOException ie){ + throw ie; + } + + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + } + + private void nextToken() throws ParseException, IOException{ + token = lexer.yylex(); + if(token == null) + token = new Yytoken(Yytoken.TYPE_EOF, null); + } + + private Map createObjectContainer(ContainerFactory containerFactory){ + if(containerFactory == null) + return new JSONObject(); + Map m = containerFactory.createObjectContainer(); + + if(m == null) + return new JSONObject(); + return m; + } + + private List createArrayContainer(ContainerFactory containerFactory){ + if(containerFactory == null) + return new JSONArray(); + List l = containerFactory.creatArrayContainer(); + + if(l == null) + return new JSONArray(); + return l; + } + + public void parse(String s, ContentHandler contentHandler) throws ParseException{ + parse(s, contentHandler, false); + } + + public void parse(String s, ContentHandler contentHandler, boolean isResume) throws ParseException{ + StringReader in=new StringReader(s); + try{ + parse(in, contentHandler, isResume); + } + catch(IOException ie){ + /* + * Actually it will never happen. + */ + throw new ParseException(-1, ParseException.ERROR_UNEXPECTED_EXCEPTION, ie); + } + } + + public void parse(Reader in, ContentHandler contentHandler) throws IOException, ParseException{ + parse(in, contentHandler, false); + } + + /** + * Stream processing of JSON text. + * + * @see ContentHandler + * + * @param in + * @param contentHandler + * @param isResume - Indicates if it continues previous parsing operation. + * If set to true, resume parsing the old stream, and parameter 'in' will be ignored. + * If this method is called for the first time in this instance, isResume will be ignored. + * + * @throws IOException + * @throws ParseException + */ + public void parse(Reader in, ContentHandler contentHandler, boolean isResume) throws IOException, ParseException{ + if(!isResume){ + reset(in); + handlerStatusStack = new LinkedList(); + } + else{ + if(handlerStatusStack == null){ + isResume = false; + reset(in); + handlerStatusStack = new LinkedList(); + } + } + + LinkedList statusStack = handlerStatusStack; + + try{ + do{ + switch(status){ + case S_INIT: + contentHandler.startJSON(); + nextToken(); + switch(token.type){ + case Yytoken.TYPE_VALUE: + status=S_IN_FINISHED_VALUE; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.primitive(token.value)) + return; + break; + case Yytoken.TYPE_LEFT_BRACE: + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startObject()) + return; + break; + case Yytoken.TYPE_LEFT_SQUARE: + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startArray()) + return; + break; + default: + status=S_IN_ERROR; + }//inner switch + break; + + case S_IN_FINISHED_VALUE: + nextToken(); + if(token.type==Yytoken.TYPE_EOF){ + contentHandler.endJSON(); + status = S_END; + return; + } + else{ + status = S_IN_ERROR; + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + } + + case S_IN_OBJECT: + nextToken(); + switch(token.type){ + case Yytoken.TYPE_COMMA: + break; + case Yytoken.TYPE_VALUE: + if(token.value instanceof String){ + String key=(String)token.value; + status=S_PASSED_PAIR_KEY; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startObjectEntry(key)) + return; + } + else{ + status=S_IN_ERROR; + } + break; + case Yytoken.TYPE_RIGHT_BRACE: + if(statusStack.size()>1){ + statusStack.removeFirst(); + status=peekStatus(statusStack); + } + else{ + status=S_IN_FINISHED_VALUE; + } + if(!contentHandler.endObject()) + return; + break; + default: + status=S_IN_ERROR; + break; + }//inner switch + break; + + case S_PASSED_PAIR_KEY: + nextToken(); + switch(token.type){ + case Yytoken.TYPE_COLON: + break; + case Yytoken.TYPE_VALUE: + statusStack.removeFirst(); + status=peekStatus(statusStack); + if(!contentHandler.primitive(token.value)) + return; + if(!contentHandler.endObjectEntry()) + return; + break; + case Yytoken.TYPE_LEFT_SQUARE: + statusStack.removeFirst(); + statusStack.addFirst(new Integer(S_IN_PAIR_VALUE)); + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startArray()) + return; + break; + case Yytoken.TYPE_LEFT_BRACE: + statusStack.removeFirst(); + statusStack.addFirst(new Integer(S_IN_PAIR_VALUE)); + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startObject()) + return; + break; + default: + status=S_IN_ERROR; + } + break; + + case S_IN_PAIR_VALUE: + /* + * S_IN_PAIR_VALUE is just a marker to indicate the end of an object entry, it doesn't proccess any token, + * therefore delay consuming token until next round. + */ + statusStack.removeFirst(); + status = peekStatus(statusStack); + if(!contentHandler.endObjectEntry()) + return; + break; + + case S_IN_ARRAY: + nextToken(); + switch(token.type){ + case Yytoken.TYPE_COMMA: + break; + case Yytoken.TYPE_VALUE: + if(!contentHandler.primitive(token.value)) + return; + break; + case Yytoken.TYPE_RIGHT_SQUARE: + if(statusStack.size()>1){ + statusStack.removeFirst(); + status=peekStatus(statusStack); + } + else{ + status=S_IN_FINISHED_VALUE; + } + if(!contentHandler.endArray()) + return; + break; + case Yytoken.TYPE_LEFT_BRACE: + status=S_IN_OBJECT; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startObject()) + return; + break; + case Yytoken.TYPE_LEFT_SQUARE: + status=S_IN_ARRAY; + statusStack.addFirst(new Integer(status)); + if(!contentHandler.startArray()) + return; + break; + default: + status=S_IN_ERROR; + }//inner switch + break; + + case S_END: + return; + + case S_IN_ERROR: + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + }//switch + if(status==S_IN_ERROR){ + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + } + }while(token.type!=Yytoken.TYPE_EOF); + } + catch(IOException ie){ + status = S_IN_ERROR; + throw ie; + } + catch(ParseException pe){ + status = S_IN_ERROR; + throw pe; + } + catch(RuntimeException re){ + status = S_IN_ERROR; + throw re; + } + catch(Error e){ + status = S_IN_ERROR; + throw e; + } + + status = S_IN_ERROR; + throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token); + } +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/ParseException.java b/json-simple-master/src/main/java/org/json/simple/parser/ParseException.java new file mode 100644 index 0000000..dbfefc0 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/ParseException.java @@ -0,0 +1,90 @@ +package org.json.simple.parser; + +/** + * ParseException explains why and where the error occurs in source JSON text. + * + * @author FangYidong + * + */ +public class ParseException extends Exception { + private static final long serialVersionUID = -7880698968187728547L; + + public static final int ERROR_UNEXPECTED_CHAR = 0; + public static final int ERROR_UNEXPECTED_TOKEN = 1; + public static final int ERROR_UNEXPECTED_EXCEPTION = 2; + + private int errorType; + private Object unexpectedObject; + private int position; + + public ParseException(int errorType){ + this(-1, errorType, null); + } + + public ParseException(int errorType, Object unexpectedObject){ + this(-1, errorType, unexpectedObject); + } + + public ParseException(int position, int errorType, Object unexpectedObject){ + this.position = position; + this.errorType = errorType; + this.unexpectedObject = unexpectedObject; + } + + public int getErrorType() { + return errorType; + } + + public void setErrorType(int errorType) { + this.errorType = errorType; + } + + /** + * @see org.json.simple.parser.JSONParser#getPosition() + * + * @return The character position (starting with 0) of the input where the error occurs. + */ + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + /** + * @see org.json.simple.parser.Yytoken + * + * @return One of the following base on the value of errorType: + * ERROR_UNEXPECTED_CHAR java.lang.Character + * ERROR_UNEXPECTED_TOKEN org.json.simple.parser.Yytoken + * ERROR_UNEXPECTED_EXCEPTION java.lang.Exception + */ + public Object getUnexpectedObject() { + return unexpectedObject; + } + + public void setUnexpectedObject(Object unexpectedObject) { + this.unexpectedObject = unexpectedObject; + } + + public String getMessage() { + StringBuffer sb = new StringBuffer(); + + switch(errorType){ + case ERROR_UNEXPECTED_CHAR: + sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position).append("."); + break; + case ERROR_UNEXPECTED_TOKEN: + sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append("."); + break; + case ERROR_UNEXPECTED_EXCEPTION: + sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject); + break; + default: + sb.append("Unkown error at position ").append(position).append("."); + break; + } + return sb.toString(); + } +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/Yylex.java b/json-simple-master/src/main/java/org/json/simple/parser/Yylex.java new file mode 100644 index 0000000..e58e27e --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/Yylex.java @@ -0,0 +1,688 @@ +/* The following code was generated by JFlex 1.4.2 */ + +package org.json.simple.parser; + +class Yylex { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + public static final int STRING_BEGIN = 2; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\7\1\7\2\0\1\7\22\0\1\7\1\0\1\11\10\0"+ + "\1\6\1\31\1\2\1\4\1\12\12\3\1\32\6\0\4\1\1\5"+ + "\1\1\24\0\1\27\1\10\1\30\3\0\1\22\1\13\2\1\1\21"+ + "\1\14\5\0\1\23\1\0\1\15\3\0\1\16\1\24\1\17\1\20"+ + "\5\0\1\25\1\0\1\26\uff82\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\2\0\2\1\1\2\1\3\1\4\3\1\1\5\1\6"+ + "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\5\0"+ + "\1\14\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+ + "\1\0\1\25\1\0\1\25\4\0\1\26\1\27\2\0"+ + "\1\30"; + + private static int [] zzUnpackAction() { + int [] result = new int[45]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\33\0\66\0\121\0\154\0\207\0\66\0\242"+ + "\0\275\0\330\0\66\0\66\0\66\0\66\0\66\0\66"+ + "\0\363\0\u010e\0\66\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195"+ + "\0\66\0\66\0\66\0\66\0\66\0\66\0\66\0\66"+ + "\0\u01b0\0\u01cb\0\u01e6\0\u01e6\0\u0201\0\u021c\0\u0237\0\u0252"+ + "\0\66\0\66\0\u026d\0\u0288\0\66"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[45]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int ZZ_TRANS [] = { + 2, 2, 3, 4, 2, 2, 2, 5, 2, 6, + 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, + 2, 10, 11, 12, 13, 14, 15, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, -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, 4, -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, 4, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5, -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, + 21, -1, -1, -1, -1, -1, -1, -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, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 16, 16, 16, 16, 16, 16, 16, + 16, -1, -1, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + -1, -1, -1, -1, -1, -1, -1, -1, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 33, -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, 34, 35, -1, -1, + 34, -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, + 36, -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, 37, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 39, -1, 39, -1, 39, -1, -1, + -1, -1, -1, 39, 39, -1, -1, -1, -1, 39, + 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 35, + -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, 38, -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, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 42, -1, 42, -1, 42, + -1, -1, -1, -1, -1, 42, 42, -1, -1, -1, + -1, 42, 42, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, + -1, -1, 43, 43, -1, -1, -1, -1, 43, 43, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, + -1, 44, -1, 44, -1, -1, -1, -1, -1, 44, + 44, -1, -1, -1, -1, 44, 44, -1, -1, -1, + -1, -1, -1, -1, -1, + }; + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\2\0\1\11\3\1\1\11\3\1\6\11\2\1\1\11"+ + "\5\0\10\11\1\0\1\1\1\0\1\1\4\0\2\11"+ + "\2\0\1\11"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[45]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** number of newlines encountered up to the start of the matched text */ + private int yyline; + + /** the number of characters up to the start of the matched text */ + private int yychar; + + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /* user code: */ +private StringBuffer sb=new StringBuffer(); + +int getPosition(){ + return yychar; +} + + + + /** + * Creates a new scanner + * There is also a java.io.InputStream version of this constructor. + * + * @param in the java.io.Reader to read input from. + */ + Yylex(java.io.Reader in) { + this.zzReader = in; + } + + /** + * Creates a new scanner. + * There is also java.io.Reader version of this constructor. + * + * @param in the java.io.Inputstream to read input from. + */ + Yylex(java.io.InputStream in) { + this(new java.io.InputStreamReader(in)); + } + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 90) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; + } + + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length) { + /* if not: blow it up */ + char newBuffer[] = new char[zzCurrentPos*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + } + + /* finally: fill the buffer with new input */ + int numRead = zzReader.read(zzBuffer, zzEndRead, + zzBuffer.length-zzEndRead); + + if (numRead > 0) { + zzEndRead+= numRead; + return false; + } + // unlikely but not impossible: read 0 characters, but not at end of stream + if (numRead == 0) { + int c = zzReader.read(); + if (c == -1) { + return true; + } else { + zzBuffer[zzEndRead++] = (char) c; + return false; + } + } + + // numRead < 0 + return true; + } + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * Resets the scanner to read from a new input stream. + * Does not close the old reader. + * + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). + * Lexical state is set to ZZ_INITIAL. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public Yytoken yylex() throws java.io.IOException, ParseException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + yychar+= zzMarkedPosL-zzStartRead; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = zzBufferL[zzCurrentPosL++]; + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = zzBufferL[zzCurrentPosL++]; + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 11: + { sb.append(yytext()); + } + case 25: break; + case 4: + { sb = null; sb = new StringBuffer(); yybegin(STRING_BEGIN); + } + case 26: break; + case 16: + { sb.append('\b'); + } + case 27: break; + case 6: + { return new Yytoken(Yytoken.TYPE_RIGHT_BRACE,null); + } + case 28: break; + case 23: + { Boolean val=Boolean.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val); + } + case 29: break; + case 22: + { return new Yytoken(Yytoken.TYPE_VALUE, null); + } + case 30: break; + case 13: + { yybegin(YYINITIAL);return new Yytoken(Yytoken.TYPE_VALUE, sb.toString()); + } + case 31: break; + case 12: + { sb.append('\\'); + } + case 32: break; + case 21: + { Double val=Double.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val); + } + case 33: break; + case 1: + { throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR, new Character(yycharat(0))); + } + case 34: break; + case 8: + { return new Yytoken(Yytoken.TYPE_RIGHT_SQUARE,null); + } + case 35: break; + case 19: + { sb.append('\r'); + } + case 36: break; + case 15: + { sb.append('/'); + } + case 37: break; + case 10: + { return new Yytoken(Yytoken.TYPE_COLON,null); + } + case 38: break; + case 14: + { sb.append('"'); + } + case 39: break; + case 5: + { return new Yytoken(Yytoken.TYPE_LEFT_BRACE,null); + } + case 40: break; + case 17: + { sb.append('\f'); + } + case 41: break; + case 24: + { try{ + int ch=Integer.parseInt(yytext().substring(2),16); + sb.append((char)ch); + } + catch(Exception e){ + throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_EXCEPTION, e); + } + } + case 42: break; + case 20: + { sb.append('\t'); + } + case 43: break; + case 7: + { return new Yytoken(Yytoken.TYPE_LEFT_SQUARE,null); + } + case 44: break; + case 2: + { Long val=Long.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE, val); + } + case 45: break; + case 18: + { sb.append('\n'); + } + case 46: break; + case 9: + { return new Yytoken(Yytoken.TYPE_COMMA,null); + } + case 47: break; + case 3: + { + } + case 48: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + return null; + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/json-simple-master/src/main/java/org/json/simple/parser/Yytoken.java b/json-simple-master/src/main/java/org/json/simple/parser/Yytoken.java new file mode 100644 index 0000000..ff14e27 --- /dev/null +++ b/json-simple-master/src/main/java/org/json/simple/parser/Yytoken.java @@ -0,0 +1,58 @@ +/* + * $Id: Yytoken.java,v 1.1 2006/04/15 14:10:48 platform Exp $ + * Created on 2006-4-15 + */ +package org.json.simple.parser; + +/** + * @author FangYidong + */ +public class Yytoken { + public static final int TYPE_VALUE=0;//JSON primitive value: string,number,boolean,null + public static final int TYPE_LEFT_BRACE=1; + public static final int TYPE_RIGHT_BRACE=2; + public static final int TYPE_LEFT_SQUARE=3; + public static final int TYPE_RIGHT_SQUARE=4; + public static final int TYPE_COMMA=5; + public static final int TYPE_COLON=6; + public static final int TYPE_EOF=-1;//end of file + + public int type=0; + public Object value=null; + + public Yytoken(int type,Object value){ + this.type=type; + this.value=value; + } + + public String toString(){ + StringBuffer sb = new StringBuffer(); + switch(type){ + case TYPE_VALUE: + sb.append("VALUE(").append(value).append(")"); + break; + case TYPE_LEFT_BRACE: + sb.append("LEFT BRACE({)"); + break; + case TYPE_RIGHT_BRACE: + sb.append("RIGHT BRACE(})"); + break; + case TYPE_LEFT_SQUARE: + sb.append("LEFT SQUARE([)"); + break; + case TYPE_RIGHT_SQUARE: + sb.append("RIGHT SQUARE(])"); + break; + case TYPE_COMMA: + sb.append("COMMA(,)"); + break; + case TYPE_COLON: + sb.append("COLON(:)"); + break; + case TYPE_EOF: + sb.append("END OF FILE"); + break; + } + return sb.toString(); + } +} diff --git a/json-simple-master/src/test/java/org/json/simple/JSONArrayTest.java b/json-simple-master/src/test/java/org/json/simple/JSONArrayTest.java new file mode 100644 index 0000000..6e1591d --- /dev/null +++ b/json-simple-master/src/test/java/org/json/simple/JSONArrayTest.java @@ -0,0 +1,288 @@ +package org.json.simple; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashSet; + +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import junit.framework.TestCase; + +public class JSONArrayTest extends TestCase { + + public void testJSONArray() { + final JSONArray jsonArray = new JSONArray(); + + assertEquals("[]", jsonArray.toJSONString()); + } + + public void testJSONArrayCollection() { + final ArrayList testList = new ArrayList(); + testList.add("First item"); + testList.add("Second item"); + + final JSONArray jsonArray = new JSONArray(testList); + + assertEquals("[\"First item\",\"Second item\"]", jsonArray.toJSONString()); + } + + public void testWriteJSONStringCollectionWriter() throws IOException, ParseException { + final HashSet testSet = new HashSet(); + testSet.add("First item"); + testSet.add("Second item"); + + final JSONArray jsonArray = new JSONArray(testSet); + final StringWriter writer = new StringWriter(); + + jsonArray.writeJSONString(writer); + + final JSONParser parser = new JSONParser(); + final JSONArray parsedArray = (JSONArray)parser.parse(writer.toString()); + + assertTrue(parsedArray.containsAll(jsonArray)); + assertTrue(jsonArray.containsAll(parsedArray)); + assertEquals(2, jsonArray.size()); + } + + public void testToJSONStringCollection() throws ParseException { + final HashSet testSet = new HashSet(); + testSet.add("First item"); + testSet.add("Second item"); + + final JSONArray jsonArray = new JSONArray(testSet); + + final JSONParser parser = new JSONParser(); + final JSONArray parsedArray = (JSONArray)parser.parse(jsonArray.toJSONString()); + + assertTrue(parsedArray.containsAll(jsonArray)); + assertTrue(jsonArray.containsAll(parsedArray)); + assertEquals(2, jsonArray.size()); + } + + public void testByteArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((byte[])null)); + assertEquals("[]", JSONArray.toJSONString(new byte[0])); + assertEquals("[12]", JSONArray.toJSONString(new byte[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONArray.toJSONString(new byte[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((byte[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new byte[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new byte[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new byte[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testShortArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((short[])null)); + assertEquals("[]", JSONArray.toJSONString(new short[0])); + assertEquals("[12]", JSONArray.toJSONString(new short[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONArray.toJSONString(new short[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((short[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new short[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new short[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new short[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testIntArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((int[])null)); + assertEquals("[]", JSONArray.toJSONString(new int[0])); + assertEquals("[12]", JSONArray.toJSONString(new int[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONArray.toJSONString(new int[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((int[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new int[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new int[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new int[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testLongArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((long[])null)); + assertEquals("[]", JSONArray.toJSONString(new long[0])); + assertEquals("[12]", JSONArray.toJSONString(new long[] { 12 })); + assertEquals("[-7,22,9223372036854775807,-99]", JSONArray.toJSONString(new long[] { -7, 22, 9223372036854775807L, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((long[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new long[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new long[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new long[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testFloatArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((float[])null)); + assertEquals("[]", JSONArray.toJSONString(new float[0])); + assertEquals("[12.8]", JSONArray.toJSONString(new float[] { 12.8f })); + assertEquals("[-7.1,22.234,86.7,-99.02]", JSONArray.toJSONString(new float[] { -7.1f, 22.234f, 86.7f, -99.02f })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((float[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new float[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new float[] { 12.8f }, writer); + assertEquals("[12.8]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new float[] { -7.1f, 22.234f, 86.7f, -99.02f }, writer); + assertEquals("[-7.1,22.234,86.7,-99.02]", writer.toString()); + } + + public void testDoubleArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((double[])null)); + assertEquals("[]", JSONArray.toJSONString(new double[0])); + assertEquals("[12.8]", JSONArray.toJSONString(new double[] { 12.8 })); + assertEquals("[-7.1,22.234,86.7,-99.02]", JSONArray.toJSONString(new double[] { -7.1, 22.234, 86.7, -99.02 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((double[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new double[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new double[] { 12.8 }, writer); + assertEquals("[12.8]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new double[] { -7.1, 22.234, 86.7, -99.02 }, writer); + assertEquals("[-7.1,22.234,86.7,-99.02]", writer.toString()); + } + + public void testBooleanArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((boolean[])null)); + assertEquals("[]", JSONArray.toJSONString(new boolean[0])); + assertEquals("[true]", JSONArray.toJSONString(new boolean[] { true })); + assertEquals("[true,false,true]", JSONArray.toJSONString(new boolean[] { true, false, true })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((boolean[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new boolean[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new boolean[] { true }, writer); + assertEquals("[true]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new boolean[] { true, false, true }, writer); + assertEquals("[true,false,true]", writer.toString()); + } + + public void testCharArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((char[])null)); + assertEquals("[]", JSONArray.toJSONString(new char[0])); + assertEquals("[\"a\"]", JSONArray.toJSONString(new char[] { 'a' })); + assertEquals("[\"a\",\"b\",\"c\"]", JSONArray.toJSONString(new char[] { 'a', 'b', 'c' })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((char[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new char[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new char[] { 'a' }, writer); + assertEquals("[\"a\"]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new char[] { 'a', 'b', 'c' }, writer); + assertEquals("[\"a\",\"b\",\"c\"]", writer.toString()); + } + + public void testObjectArrayToString() throws IOException { + assertEquals("null", JSONArray.toJSONString((Object[])null)); + assertEquals("[]", JSONArray.toJSONString(new Object[0])); + assertEquals("[\"Hello\"]", JSONArray.toJSONString(new Object[] { "Hello" })); + assertEquals("[\"Hello\",12,[1,2,3]]", JSONArray.toJSONString(new Object[] { "Hello", new Integer(12), new int[] { 1, 2, 3 } })); + + StringWriter writer; + + writer = new StringWriter(); + JSONArray.writeJSONString((Object[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new Object[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new Object[] { "Hello" }, writer); + assertEquals("[\"Hello\"]", writer.toString()); + + writer = new StringWriter(); + JSONArray.writeJSONString(new Object[] { "Hello", new Integer(12), new int[] { 1, 2, 3} }, writer); + assertEquals("[\"Hello\",12,[1,2,3]]", writer.toString()); + } +} diff --git a/json-simple-master/src/test/java/org/json/simple/JSONValueTest.java b/json-simple-master/src/test/java/org/json/simple/JSONValueTest.java new file mode 100644 index 0000000..97f2b50 --- /dev/null +++ b/json-simple-master/src/test/java/org/json/simple/JSONValueTest.java @@ -0,0 +1,256 @@ +package org.json.simple; + +import java.io.IOException; +import java.io.StringWriter; + +import junit.framework.TestCase; + +public class JSONValueTest extends TestCase { + public void testByteArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((byte[])null)); + assertEquals("[]", JSONValue.toJSONString(new byte[0])); + assertEquals("[12]", JSONValue.toJSONString(new byte[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONValue.toJSONString(new byte[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((byte[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new byte[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new byte[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new byte[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testShortArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((short[])null)); + assertEquals("[]", JSONValue.toJSONString(new short[0])); + assertEquals("[12]", JSONValue.toJSONString(new short[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONValue.toJSONString(new short[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((short[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new short[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new short[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new short[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testIntArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((int[])null)); + assertEquals("[]", JSONValue.toJSONString(new int[0])); + assertEquals("[12]", JSONValue.toJSONString(new int[] { 12 })); + assertEquals("[-7,22,86,-99]", JSONValue.toJSONString(new int[] { -7, 22, 86, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((int[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new int[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new int[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new int[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testLongArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((long[])null)); + assertEquals("[]", JSONValue.toJSONString(new long[0])); + assertEquals("[12]", JSONValue.toJSONString(new long[] { 12 })); + assertEquals("[-7,22,9223372036854775807,-99]", JSONValue.toJSONString(new long[] { -7, 22, 9223372036854775807L, -99 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((long[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new long[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new long[] { 12 }, writer); + assertEquals("[12]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new long[] { -7, 22, 86, -99 }, writer); + assertEquals("[-7,22,86,-99]", writer.toString()); + } + + public void testFloatArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((float[])null)); + assertEquals("[]", JSONValue.toJSONString(new float[0])); + assertEquals("[12.8]", JSONValue.toJSONString(new float[] { 12.8f })); + assertEquals("[-7.1,22.234,86.7,-99.02]", JSONValue.toJSONString(new float[] { -7.1f, 22.234f, 86.7f, -99.02f })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((float[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new float[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new float[] { 12.8f }, writer); + assertEquals("[12.8]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new float[] { -7.1f, 22.234f, 86.7f, -99.02f }, writer); + assertEquals("[-7.1,22.234,86.7,-99.02]", writer.toString()); + } + + public void testDoubleArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((double[])null)); + assertEquals("[]", JSONValue.toJSONString(new double[0])); + assertEquals("[12.8]", JSONValue.toJSONString(new double[] { 12.8 })); + assertEquals("[-7.1,22.234,86.7,-99.02]", JSONValue.toJSONString(new double[] { -7.1, 22.234, 86.7, -99.02 })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((double[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new double[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new double[] { 12.8 }, writer); + assertEquals("[12.8]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new double[] { -7.1, 22.234, 86.7, -99.02 }, writer); + assertEquals("[-7.1,22.234,86.7,-99.02]", writer.toString()); + } + + public void testBooleanArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((boolean[])null)); + assertEquals("[]", JSONValue.toJSONString(new boolean[0])); + assertEquals("[true]", JSONValue.toJSONString(new boolean[] { true })); + assertEquals("[true,false,true]", JSONValue.toJSONString(new boolean[] { true, false, true })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((boolean[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new boolean[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new boolean[] { true }, writer); + assertEquals("[true]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new boolean[] { true, false, true }, writer); + assertEquals("[true,false,true]", writer.toString()); + } + + public void testCharArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((char[])null)); + assertEquals("[]", JSONValue.toJSONString(new char[0])); + assertEquals("[\"a\"]", JSONValue.toJSONString(new char[] { 'a' })); + assertEquals("[\"a\",\"b\",\"c\"]", JSONValue.toJSONString(new char[] { 'a', 'b', 'c' })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((char[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new char[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new char[] { 'a' }, writer); + assertEquals("[\"a\"]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new char[] { 'a', 'b', 'c' }, writer); + assertEquals("[\"a\",\"b\",\"c\"]", writer.toString()); + } + + public void testObjectArrayToString() throws IOException { + assertEquals("null", JSONValue.toJSONString((Object[])null)); + assertEquals("[]", JSONValue.toJSONString(new Object[0])); + assertEquals("[\"Hello\"]", JSONValue.toJSONString(new Object[] { "Hello" })); + assertEquals("[\"Hello\",12,[1,2,3]]", JSONValue.toJSONString(new Object[] { "Hello", new Integer(12), new int[] { 1, 2, 3 } })); + + StringWriter writer; + + writer = new StringWriter(); + JSONValue.writeJSONString((Object[])null, writer); + assertEquals("null", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new Object[0], writer); + assertEquals("[]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new Object[] { "Hello" }, writer); + assertEquals("[\"Hello\"]", writer.toString()); + + writer = new StringWriter(); + JSONValue.writeJSONString(new Object[] { "Hello", new Integer(12), new int[] { 1, 2, 3} }, writer); + assertEquals("[\"Hello\",12,[1,2,3]]", writer.toString()); + } + + public void testArraysOfArrays() throws IOException { + + StringWriter writer; + + final int[][][] nestedIntArray = new int[][][]{{{1}, {5}}, {{2}, {6}}}; + final String expectedNestedIntString = "[[[1],[5]],[[2],[6]]]"; + + assertEquals(expectedNestedIntString, JSONValue.toJSONString(nestedIntArray)); + + writer = new StringWriter(); + JSONValue.writeJSONString(nestedIntArray, writer); + assertEquals(expectedNestedIntString, writer.toString()); + + final String[][] nestedStringArray = new String[][]{{"a", "b"}, {"c", "d"}}; + final String expectedNestedStringString = "[[\"a\",\"b\"],[\"c\",\"d\"]]"; + + assertEquals(expectedNestedStringString, JSONValue.toJSONString(nestedStringArray)); + + writer = new StringWriter(); + JSONValue.writeJSONString(nestedStringArray, writer); + assertEquals(expectedNestedStringString, writer.toString()); + } +} diff --git a/json-simple-master/src/test/java/org/json/simple/Test.java b/json-simple-master/src/test/java/org/json/simple/Test.java new file mode 100644 index 0000000..dc5ce03 --- /dev/null +++ b/json-simple-master/src/test/java/org/json/simple/Test.java @@ -0,0 +1,383 @@ +/* + * $Id: Test.java,v 1.1 2006/04/15 14:40:06 platform Exp $ + * Created on 2006-4-15 + */ +package org.json.simple; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import junit.framework.TestCase; + +import org.json.simple.parser.ContainerFactory; +import org.json.simple.parser.ContentHandler; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +/** + * @author FangYidong + */ +public class Test extends TestCase{ + + public void testDecode() throws Exception{ + System.out.println("=======decode======="); + + String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]"; + Object obj=JSONValue.parse(s); + JSONArray array=(JSONArray)obj; + System.out.println("======the 2nd element of array======"); + System.out.println(array.get(1)); + System.out.println(); + assertEquals("{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}",array.get(1).toString()); + + JSONObject obj2=(JSONObject)array.get(1); + System.out.println("======field \"1\"=========="); + System.out.println(obj2.get("1")); + assertEquals("{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}",obj2.get("1").toString()); + + s="{}"; + obj=JSONValue.parse(s); + assertEquals("{}",obj.toString()); + + s="[5,]"; + obj=JSONValue.parse(s); + assertEquals("[5]",obj.toString()); + + s="[5,,2]"; + obj=JSONValue.parse(s); + assertEquals("[5,2]",obj.toString()); + + s="[\"hello\\bworld\\\"abc\\tdef\\\\ghi\\rjkl\\n123\\u4e2d\"]"; + obj=JSONValue.parse(s); + assertEquals("hello\bworld\"abc\tdef\\ghi\rjkl\n123中",((List)obj).get(0).toString()); + + JSONParser parser = new JSONParser(); + s="{\"name\":"; + try{ + obj = parser.parse(s); + } + catch(ParseException pe){ + assertEquals(ParseException.ERROR_UNEXPECTED_TOKEN, pe.getErrorType()); + assertEquals(8, pe.getPosition()); + } + + s="{\"name\":}"; + try{ + obj = parser.parse(s); + } + catch(ParseException pe){ + assertEquals(ParseException.ERROR_UNEXPECTED_TOKEN, pe.getErrorType()); + assertEquals(8, pe.getPosition()); + } + + + s="{\"name"; + try{ + obj = parser.parse(s); + } + catch(ParseException pe){ + assertEquals(ParseException.ERROR_UNEXPECTED_TOKEN, pe.getErrorType()); + assertEquals(6, pe.getPosition()); + } + + + s = "[[null, 123.45, \"a\\\tb c\"}, true]"; + try{ + parser.parse(s); + } + catch(ParseException pe){ + assertEquals(24, pe.getPosition()); + System.out.println("Error at character position: " + pe.getPosition()); + switch(pe.getErrorType()){ + case ParseException.ERROR_UNEXPECTED_TOKEN: + System.out.println("Unexpected token: " + pe.getUnexpectedObject()); + break; + case ParseException.ERROR_UNEXPECTED_CHAR: + System.out.println("Unexpected character: " + pe.getUnexpectedObject()); + break; + case ParseException.ERROR_UNEXPECTED_EXCEPTION: + ((Exception)pe.getUnexpectedObject()).printStackTrace(); + break; + } + } + + s = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; + ContainerFactory containerFactory = new ContainerFactory(){ + public List creatArrayContainer() { + return new LinkedList(); + } + + public Map createObjectContainer() { + return new LinkedHashMap(); + } + + }; + + try{ + Map json = (Map)parser.parse(s, containerFactory); + Iterator iter = json.entrySet().iterator(); + System.out.println("==iterate result=="); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry)iter.next(); + System.out.println(entry.getKey() + "=>" + entry.getValue()); + } + + System.out.println("==toJSONString()=="); + System.out.println(JSONValue.toJSONString(json)); + assertEquals("{\"first\":123,\"second\":[4,5,6],\"third\":789}", JSONValue.toJSONString(json)); + } + catch(ParseException pe){ + pe.printStackTrace(); + } + + s = "{\"first\": 123, \"second\": [{\"s1\":{\"s11\":\"v11\"}}, 4, 5, 6], \"third\": 789}"; + ContentHandler myHandler = new ContentHandler() { + + public boolean endArray() throws ParseException { + System.out.println("endArray()"); + return true; + } + + public void endJSON() throws ParseException { + System.out.println("endJSON()"); + } + + public boolean endObject() throws ParseException { + System.out.println("endObject()"); + return true; + } + + public boolean endObjectEntry() throws ParseException { + System.out.println("endObjectEntry()"); + return true; + } + + public boolean primitive(Object value) throws ParseException { + System.out.println("primitive(): " + value); + return true; + } + + public boolean startArray() throws ParseException { + System.out.println("startArray()"); + return true; + } + + public void startJSON() throws ParseException { + System.out.println("startJSON()"); + } + + public boolean startObject() throws ParseException { + System.out.println("startObject()"); + return true; + } + + public boolean startObjectEntry(String key) throws ParseException { + System.out.println("startObjectEntry(), key:" + key); + return true; + } + + }; + try{ + parser.parse(s, myHandler); + } + catch(ParseException pe){ + pe.printStackTrace(); + } + + class KeyFinder implements ContentHandler{ + private Object value; + private boolean found = false; + private boolean end = false; + private String key; + private String matchKey; + + public void setMatchKey(String matchKey){ + this.matchKey = matchKey; + } + + public Object getValue(){ + return value; + } + + public boolean isEnd(){ + return end; + } + + public void setFound(boolean found){ + this.found = found; + } + + public boolean isFound(){ + return found; + } + + public void startJSON() throws ParseException, IOException { + found = false; + end = false; + } + + public void endJSON() throws ParseException, IOException { + end = true; + } + + public boolean primitive(Object value) throws ParseException, IOException { + if(key != null){ + if(key.equals(matchKey)){ + found = true; + this.value = value; + key = null; + return false; + } + } + return true; + } + + public boolean startArray() throws ParseException, IOException { + return true; + } + + + public boolean startObject() throws ParseException, IOException { + return true; + } + + public boolean startObjectEntry(String key) throws ParseException, IOException { + this.key = key; + return true; + } + + public boolean endArray() throws ParseException, IOException { + return false; + } + + public boolean endObject() throws ParseException, IOException { + return true; + } + + public boolean endObjectEntry() throws ParseException, IOException { + return true; + } + }; + + s = "{\"first\": 123, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}"; + parser.reset(); + KeyFinder keyFinder = new KeyFinder(); + keyFinder.setMatchKey("id"); + int i = 0; + try{ + while(!keyFinder.isEnd()){ + parser.parse(s, keyFinder, true); + if(keyFinder.isFound()){ + i++; + keyFinder.setFound(false); + System.out.println("found id:"); + System.out.println(keyFinder.getValue()); + if(i == 1) + assertEquals("id1", keyFinder.getValue()); + if(i == 2){ + assertTrue(keyFinder.getValue() instanceof Number); + assertEquals("123", String.valueOf(keyFinder.getValue())); + } + if(i == 3) + assertTrue(null == keyFinder.getValue()); + } + } + } + catch(ParseException pe){ + pe.printStackTrace(); + } + } + + public void testEncode() throws Exception{ + System.out.println("=======encode======="); + + JSONArray array1=new JSONArray(); + array1.add("abc\u0010a/"); + array1.add(new Integer(123)); + array1.add(new Double(222.123)); + array1.add(new Boolean(true)); + System.out.println("======array1=========="); + System.out.println(array1); + System.out.println(); + assertEquals("[\"abc\\u0010a\\/\",123,222.123,true]",array1.toString()); + + JSONObject obj1=new JSONObject(); + obj1.put("array1",array1); + System.out.println("======obj1 with array1==========="); + System.out.println(obj1); + System.out.println(); + assertEquals("{\"array1\":[\"abc\\u0010a\\/\",123,222.123,true]}",obj1.toString()); + + obj1.remove("array1"); + array1.add(obj1); + System.out.println("======array1 with obj1========"); + System.out.println(array1); + System.out.println(); + assertEquals("[\"abc\\u0010a\\/\",123,222.123,true,{}]",array1.toString()); + + List list = new ArrayList(); + list.add("abc\u0010a/"); + list.add(new Integer(123)); + list.add(new Double(222.123)); + list.add(new Boolean(true)); + list.add(null); + System.out.println("======list=========="); + System.out.println(JSONArray.toJSONString(list)); + System.out.println(); + assertEquals("[\"abc\\u0010a\\/\",123,222.123,true,null]",JSONArray.toJSONString(list)); + + Map map = new HashMap(); + map.put("array1",list); + System.out.println("======map with list==========="); + System.out.println(map); + System.out.println(); + assertEquals("{\"array1\":[\"abc\\u0010a\\/\",123,222.123,true,null]}",JSONObject.toJSONString(map)); + + Map m1 = new LinkedHashMap(); + Map m2 = new LinkedHashMap(); + List l1 = new LinkedList(); + + m1.put("k11","v11"); + m1.put("k12","v12"); + m1.put("k13", "v13"); + m2.put("k21","v21"); + m2.put("k22","v22"); + m2.put("k23","v23"); + l1.add(m1); + l1.add(m2); + String jsonString = JSONValue.toJSONString(l1); + System.out.println(jsonString); + assertEquals("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\"},{\"k21\":\"v21\",\"k22\":\"v22\",\"k23\":\"v23\"}]", jsonString); + + StringWriter out = new StringWriter(); + JSONValue.writeJSONString(l1, out); + jsonString = out.toString(); + System.out.println(jsonString); + assertEquals("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\"},{\"k21\":\"v21\",\"k22\":\"v22\",\"k23\":\"v23\"}]", jsonString); + + List l2 = new LinkedList(); + Map m3 = new LinkedHashMap(); + m3.put("k31", "v3"); + m3.put("k32", new Double(123.45)); + m3.put("k33", new Boolean(false)); + m3.put("k34", null); + l2.add("vvv"); + l2.add("1.23456789123456789"); + l2.add(new Boolean(true)); + l2.add(null); + m3.put("k35", l2); + m1.put("k14", m3); + out = new StringWriter(); + JSONValue.writeJSONString(l1, out); + jsonString = out.toString(); + System.out.println(jsonString); + assertEquals("[{\"k11\":\"v11\",\"k12\":\"v12\",\"k13\":\"v13\",\"k14\":{\"k31\":\"v3\",\"k32\":123.45,\"k33\":false,\"k34\":null,\"k35\":[\"vvv\",\"1.23456789123456789\",true,null]}},{\"k21\":\"v21\",\"k22\":\"v22\",\"k23\":\"v23\"}]",jsonString); + } +} diff --git a/json-simple-master/src/test/java/org/json/simple/parser/YylexTest.java b/json-simple-master/src/test/java/org/json/simple/parser/YylexTest.java new file mode 100644 index 0000000..ce31751 --- /dev/null +++ b/json-simple-master/src/test/java/org/json/simple/parser/YylexTest.java @@ -0,0 +1,80 @@ +package org.json.simple.parser; + +import java.io.IOException; +import java.io.StringReader; + +import junit.framework.TestCase; + +public class YylexTest extends TestCase { + + public void testYylex() throws Exception{ + String s="\"\\/\""; + System.out.println(s); + StringReader in = new StringReader(s); + Yylex lexer=new Yylex(in); + Yytoken token=lexer.yylex(); + assertEquals(Yytoken.TYPE_VALUE,token.type); + assertEquals("/",token.value); + + s="\"abc\\/\\r\\b\\n\\t\\f\\\\\""; + System.out.println(s); + in = new StringReader(s); + lexer=new Yylex(in); + token=lexer.yylex(); + assertEquals(Yytoken.TYPE_VALUE,token.type); + assertEquals("abc/\r\b\n\t\f\\",token.value); + + s="[\t \n\r\n{ \t \t\n\r}"; + System.out.println(s); + in = new StringReader(s); + lexer=new Yylex(in); + token=lexer.yylex(); + assertEquals(Yytoken.TYPE_LEFT_SQUARE,token.type); + token=lexer.yylex(); + assertEquals(Yytoken.TYPE_LEFT_BRACE,token.type); + token=lexer.yylex(); + assertEquals(Yytoken.TYPE_RIGHT_BRACE,token.type); + + s="\b\f{"; + System.out.println(s); + in = new StringReader(s); + lexer=new Yylex(in); + ParseException err=null; + try{ + token=lexer.yylex(); + } + catch(ParseException e){ + err=e; + System.out.println("error:"+err); + assertEquals(ParseException.ERROR_UNEXPECTED_CHAR, e.getErrorType()); + assertEquals(0,e.getPosition()); + assertEquals(new Character('\b'),e.getUnexpectedObject()); + } + catch(IOException ie){ + throw ie; + } + assertTrue(err!=null); + + s="{a : b}"; + System.out.println(s); + in = new StringReader(s); + lexer=new Yylex(in); + err=null; + try{ + lexer.yylex(); + token=lexer.yylex(); + } + catch(ParseException e){ + err=e; + System.out.println("error:"+err); + assertEquals(ParseException.ERROR_UNEXPECTED_CHAR, e.getErrorType()); + assertEquals(new Character('a'),e.getUnexpectedObject()); + assertEquals(1,e.getPosition()); + } + catch(IOException ie){ + throw ie; + } + assertTrue(err!=null); + } + +} diff --git a/json-simple-master/test.xml b/json-simple-master/test.xml new file mode 100644 index 0000000..bbebbde --- /dev/null +++ b/json-simple-master/test.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/logs/log.log b/logs/log.log new file mode 100644 index 0000000..3141322 --- /dev/null +++ b/logs/log.log @@ -0,0 +1,166 @@ +[2022-12-11 02:00:15] Util started +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:131) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:106) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:01:50] Util started +[2022-12-11 02:01:50] Error code: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Failed to parse the host:port pair 'localhost:localhost'. +Error code: 0 +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) +com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:131) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:106) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:02:18] Util started +[2022-12-11 02:02:18] Error code: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +Error code: 0 +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:106) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:03:11] Util started +[2022-12-11 02:03:11] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +[2022-12-11 02:03:11] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +Error code: 0 +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:106) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:03:57] Util started +[2022-12-11 02:03:57] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:106) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:06:09] Util started +[2022-12-11 02:06:09] Trying to connect to the DB at jdbc:mysql://localhost:3306/workout +[2022-12-11 02:06:10] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:107) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:08:33] Util started +[2022-12-11 02:08:33] Trying to connect to the DB at jdbc:mysql://localhost:3306/workout +[2022-12-11 02:08:33] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:107) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:08:55] Util started +[2022-12-11 02:08:55] Trying to connect to the DB at jdbc:mysql://localhost:3306/workout +[2022-12-11 02:08:55] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:107) +WorkoutDatesUpdater.Main.checkDate(Main.java:88) +WorkoutDatesUpdater.Main.main(Main.java:21) +[2022-12-11 02:21:06] Util started +[2022-12-11 02:21:06] Trying to connect to the DB at jdbc:mysql://localhost:3306/workout +[2022-12-11 02:21:06] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:117) +WorkoutDatesUpdater.Main.checkDate(Main.java:98) +WorkoutDatesUpdater.Main.main(Main.java:29) +[2022-12-11 02:21:37] Util started +[2022-12-11 02:21:37] Trying to connect to the DB at jdbc:mysql://localhost:3306/workout +[2022-12-11 02:21:38] Error: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + Error trace: +com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) +com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) +com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) +com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) +com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) +com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:683) +java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230) +WorkoutDatesUpdater.Main.connectToDB(Main.java:117) +WorkoutDatesUpdater.Main.checkDate(Main.java:98) +WorkoutDatesUpdater.Main.main(Main.java:29) diff --git a/logs/oldLog.log b/logs/oldLog.log new file mode 100644 index 0000000..ec6470d --- /dev/null +++ b/logs/oldLog.log @@ -0,0 +1 @@ +[2022-12-11 01:56:50] Util started \ No newline at end of file diff --git a/mysql-connector-j-8.0.31/CHANGES b/mysql-connector-j-8.0.31/CHANGES new file mode 100644 index 0000000..56e00e4 --- /dev/null +++ b/mysql-connector-j-8.0.31/CHANGES @@ -0,0 +1,6231 @@ +# Changelog +# https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/ + +Version 8.0.31 + + - Fix for Bug#33637993, Loss of backslashes in data after modify api is used. + + - Fix for Bug#34529014, JSonParser not accepting valid JSON string when converting to DbDoc. + + - Fix for Bug#67828 (Bug#15967406), Crashing applets due to reading file.encoding system property. + + - WL#15259, Review maven publishing process. + + - Fix for Bug#107222 (Bug#34150112), ClientPreparedStatement.toString() no longer interpolates byte arrays. + + - Fix for Bug#104753 (Bug#33286177), PreparedStatement.setFetchSize(0) causes ArrayIndexOutOfBoundsException. + +Version 8.0.30 + + - Fix for Bug#107510 (Bug#34259416), Empty string given to set() from Collection.modify() replaces full document. + + - Fix for Bug#106758 (33973048), DatabaseMetaData.getTypeInfo returns AUTO_INCREMENT = false for all datatypes. + + - Fix for Bug#34090350, Update mappings for utf8mb3 and utf8mb4 collations. + + - Fix for Bug#106880 (34022110), Outdated description in connection property 'rewriteBatchedStatements'. + + - Fix for Bug#34082503, CONTRIBUTING.md contains broken links. + + - Fix for Bug#106779 (33976245), Contribution: Fix typo in PropertyDefinitions. + Thanks to Weijie Wu for his contribution. + + - Fix for Bug#76623 (20856749), JDBC driver misinterprets "--" as a comment, instead of "-- ". + +Version 8.0.29 + + - Fix for Bug#21978230, COMMENT PARSING NOT PROPER IN PREPSTMT.EXECUTEBATCH(). + + - Fix for Bug#81468 (23312764), MySQL server fails to rewrite batch insert when column name contains word select. + + - Fix for Bug#106435 (33850099), 8.0.28 Connector/J has regressive in setAutoCommit after Bug#104067 (33054827). + + - Fix for Bug#106240 (33781440), StringIndexOutOfBoundsException when VALUE is at the end of the query. + + - Fix for Bug#106397 (33893591), Contribution: fix: fix LocalizedErrorMessages.properties doc: less then -> ... + Thanks to Jianjian Song for his contribution. + + - Fix for Bug#77924 (25710160), JDBC SOCKS SHOULD NOT PERFORM LOCAL DNS RESOLUTION. + + - Fix for Bug#82084 (23743938), YEAR DATA TYPE RETURNS INCORRECT VALUE FOR JDBC GETCOLUMNTYPE(). + + - Fix for Bug#106441 (33850155), Add charset mapping for utf8mb3. + + - WL#15048, Upgrade Protocol Buffers dependency to protobuf-java-3.19.4. + + - Fix for Bug#106065 (33726184) Contribution: BigDecimal.toPlainString no need to check decimal exponent. + Thanks to Baoyi Chen for his contribution. + + - Fix for Bug#106171 (33757217), Contribution: Remove unnecessary boxing in ResultSetImpl. + Thanks to Ningpp Ning for his contribution. + + - Fix for Bug#25701740, STMT EXECUTION FAILS FOR REPLICATION CONNECTION WHEN USECURSORFETCH=TRUE. + + - Fix for Bug#33723611, getDefaultTransactionIsolation must return repeatable read. + + - Fix for Bug#38954 (11749415), DATA TRUNCATION WHILE USING BIT(1) IN STORED PROCEDURE WITH INOUT TYPE. + + - Fix for Bug#85317 (25672958), EXECUTE BATCH WILL THROW NULL POINTER EXCEPTION WHERE THE COLUMN IS BLOB! + + - Fix for Bug#105915 (33678490), Connector/J 8 server prepared statement precision loss in execute batch. + + - Fix for Bug#104349 (33563548), com.mysql.cj NPE. + + - Fix for Bug#62006 (16714956), JAVA.IO.NOTSERIALIZABLEEXCEPTION: JAVA.IO.STRINGREADER WHEN PROFILESQL=TRUE. + + - WL#14750, Better unification of query bindings. + + - WL#14834, Support for FIDO authentication. + + - WL#14835, Align TLS option checking across connectors. + +Version 8.0.28 + + - Fix for Bug#99260 (31189960), statement.setQueryTimeout,creates a database connection and does not close. + + - Fix for Bug#103324 (32770013), X DevAPI Collection.replaceOne() missing matching _id check. + + - Fix for Bug#105197 (33461744), Statement.executeQuery() may return non-navigable ResultSet. + + - Fix for Bug#105323 (33507321), README.md contains broken links. + + - Fix for Bug#96900 (30355150), STATEMENT.CANCEL()CREATE A DATABASE CONNECTION BUT DOES NOT CLOSE THE CONNECTION. + + - Fix for Bug#104067 (33054827), No reset autoCommit after unknown issue occurs. + Thanks to Tingyu Wei for his contribution. + + - Fix for Bug#85223 (25656020), MYSQLSQLXML SETSTRING CRASH. + + - Fix for Bug#84365 (33425867), INSERT..VALUE with VALUES function lead to a StringIndexOutOfBoundsException. + + - Fix for Bug#105211 (33468860), class java.time.LocalDate cannot be cast to class java.sql.Date. + + - Fix for Bug#101389 (32089018), GETWARNINGS SHOULD CHECK WARNING COUNT BEFORE SENDING SHOW. + + - Fix for Bug#33488091, Remove all references to xdevapi.useAsyncProtocol from properties and code. + + - WL#14805, Remove support for TLS 1.0 and 1.1. + + - WL#14650, Support for MFA (multi factor authentication) authentication. + +Version 8.0.27 + + - Fix for Bug#103612 (32902019), Incorrectly identified WITH...SELECT as unsafe for read-only connections. + + - Fix for Bug#71929 (18346501), Prefixing query with double comments cancels query DML validation. + + - Fix for Bug#23204652, CURSOR POSITIONING API'S DOESNOT CHECK THE VALIDITY OF RESULTSET. + + - Fix for Bug#28725534, MULTI HOST CONNECTION WOULD BLOCK IN CONNECTION POOLING. + + - Fix for Bug#95139 (29807572), CACHESERVERCONFIGURATION APPEARS TO THWART CHARSET DETECTION. + + - Fix for Bug#104641 (33237255), DatabaseMetaData.getImportedKeys can return duplicated foreign keys. + + - Fix for Bug#33185116, Have method ResultSet.getBoolean() supporting conversion of 'T' and 'F' in a VARCHAR to True/False (boolean). + + - Fix for Bug#31117686, PROTOCOL ALLOWLIST NOT COMPATIBLE WITH IBM JAVA. + + - Fix for Bug#104559 (33232419), ResultSet.getObject(i, java.util.Date.class) throws NPE when the value is null. + + - WL#14707, Support OCI IAM authentication. + + - WL#14660, Testsuite with support for single MySQL server instance. + + - Fix for Bug#103878 (32954449), CONNECTOR/J 8 : QUERY WITH 'SHOW XXX' WILL GET EXCEPTION WHEN USE CURSOR. + + - Fix for Bug#103796 (32922715), CONNECTOR/J 8 STMT SETQUERYTIMEOUT CAN NOT WORK. + Thanks to Hong Wang for his contribution. + + - Fix for Bug#104170 (33064455), CONTRIBUTION: CLIENTPREPAREDSTMT: LEAVE CALENDAR UNTOUCHED. + Thanks to Björn Michael for his contribution. + + - Fix for Bug#95564 (29894324), createDatabaseIfNotExist is not working for databases with hyphen in name. + Thanks to Lukasz Sanek for his contribution. + +Version 8.0.26 + + - Fix for Bug#32954396, EXECUTEQUERY HANGS WITH USECURSORFETCH=TRUE & SETFETCHSIZE. + + - Fix for Bug#102372 (32459408), v8.0.23 unusable in OSGi. + + - Fix for Bug#25554464, CONNECT FAILS WITH NPE WHEN THE SERVER STARTED WITH CUSTOM COLLATION. + + - Fix for Bug#100606 (31818423), UNECESARY CALL TO "SET NAMES 'UTF8' COLLATE 'UTF8_GENERAL_CI'". + Thanks to Marc Fletcher for his contribution. + + - Fix for Bug#102404 (32435618), CONTRIBUTION: ADD TRACK SESSION STATE CHANGE. + Thanks to William Lee for his contribution. + + - Fix for Bug#95280 (29757140), DATABASEMETADATA.GETIMPORTEDKEYS RETURNS DOUBLE THE ROWS. + Thanks to Miron Balcerzak for his contribution. + + - Fix for Bug#97269 (30438500), POSSIBLE BUG IN COM.MYSQL.CJ.XDEVAPI.STREAMINGDOCRESULTBUILDER. + + - Fix for Bug#103303 (32766143), JAVA.LANG.CLASSCASTEXCEPTION WHEN INSERTING BLOB WITH SERVER PREPARED STATEMENT. + + - WL#14205, Support query attributes. + + - WL#14411, Support for authentication_kerberos_client authentication plugin. + + - WL#14559, Deprecate TLS 1.0 and 1.1. + + - WL#14391, Migrate QA tests to WorkoutDatesUpdater repo. + +Version 8.0.25 + + - This release contains no functional changes and is published to align the version number with the MySQL Server 8.0.25 release. + +Version 8.0.24 + + - Fix for Bug#102188 (32526663), AccessControlException with AuthenticationLdapSaslClientPlugin. + + - Fix for Bug#22508715, SETSESSIONMAXROWS() CALL ON CLOSED CONNECTION RESULTS IN NPE. + + - Fix for Bug#102131 (32338451), UPDATABLERESULTSET NPE WHEN USING DERIVED QUERIES OR VIEWS. + + - Fix for Bug#101596 (32151143), GET THE 'HOST' PROPERTY ERROR AFTER CALLING TRANSFORMPROPERTIES() METHOD. + + - Fix for Bug#20391832, SETOBJECT() FOR TYPES.TIME RESULTS IN EXCEPTION WHEN VALUE HAS FRACTIONAL PART. + + - Fix for Bug#97730 (31699993), xdev api: ConcurrentModificationException at Session.close. + + - Fix for Bug#99708 (31510398), mysql-connector-java 8.0.20 ASSERTION FAILED: Unknown message type: 57 s.close. + + - Fix for Bug#32122553, EXTRA BYTE IN COM_STMT_EXECUTE. + + - Fix for Bug#101558 (32141210), NULLPOINTEREXCEPTION WHEN EXECUTING INVALID QUERY WITH USEUSAGEADVISOR ENABLED. + + - Fix for Bug#102076 (32329915), CONTRIBUTION: MYSQL JDBC DRIVER RESULTSET.GETLONG() THROWS NUMBEROUTOFRANGE. + + - Fix for Bug#31747910, BUG 30474158 FIX IMPROVES JDBC COMPLIANCE BUT CHANGES DEFAULT RESULTSETTYPE HANDLING. + + - Fix for Bug#102321 (32405590), CALLING RESULTSETMETADATA.GETCOLUMNCLASSNAME RETURNS WRONG VALUE FOR DATETIME. + + - WL#14453, Pluggable authentication: new default behavior & user-less authentications. + + - WL#14392, Improve timeout error messages [classic]. + + - WL#14202, XProtocol: Support connection close notification. + +Version 8.0.23 + + - Fix for Bug#21789378, FORCED TO SET SERVER TIMEZONE IN CONNECT STRING. + + - Fix for Bug#95644 (30573281), JDBC GETDATE/GETTIME/GETTIMESTAMP INTERFACE BEHAVIOR CHANGE AFTER UPGRADE 8.0. + + - Fix for Bug#94457 (29402209), CONNECTOR/J RESULTSET.GETOBJECT( ..., OFFSETDATETIME.CLASS ) THROWS. + + - Fix for Bug#76775 (20959249), FRACTIONAL SECONDS IN TIME VALUES ARE NOT AVAILABLE VIA JDBC. + + - Fix for Bug#99013 (31074051), AN EXTRA HOUR GETS ADDED TO THE TIMESTAMP WHEN SUBTRACTING INTERVAL 'N' DAYS. + + - Fix for Bug#98695 (30962953), EXECUTION OF "LOAD DATA LOCAL INFILE" COMMAND THROUGH JDBC FOR DATETIME COLUMN. + + - Fix for Bug#101413 (32099505), JAVA.TIME.LOCALDATETIME CANNOT BE CAST TO JAVA.SQL.TIMESTAMP. + + - Fix for Bug#101242 (32046007), CANNOT USE BYTEARRAYINPUTSTREAM AS ARGUMENTS IN PREPARED STATEMENTS ANYMORE. + Thanks to Martynas Puronas for his contribution. + + - WL#14274, Support for authentication_ldap_sasl_client(SCRAM-SHA-256) authentication plugin. + + - WL#14206, Support for authentication_ldap_sasl_client(GSSAPI) authentication plugin. + + - WL#14207, Replace language in APIs and source code/docs. + +Version 8.0.22 + + - Fix for Bug#98667 (31711961), "All pipe instances are busy" exception on multiple connections to named Pipe. + + - Fix for Bug#96309 (31699357), MultiHost in loadbalance may lead to a TPS reduction during a quick switch. + + - Fix for Bug#99076 (31083755), Unclear exception/error when connecting with jdbc:mysql to a mysqlx port. + + - Fix for Bug#96870 (30304764), Contribution: Allow to disable AbandonedConnectionCleanupThread completely. + Thanks to Andrey Turbanov for his contribution. + + - WL#14115, Support for authentication_ldap_sasl_client(SCRAM-SHA-1) authentication plugin. + + - WL#14096, Add option to specify LOAD DATA LOCAL allow list folder. + + - WL#13780, Skip system-wide trust and key stores (incl. X DevAPI client certs). + + - WL#14017, XProtocol -- support for configurable compression algorithms. + + - Fix for Bug#92903 (28834903), MySQL Connector/j should support wildcard names or alternative names. + + - Fix for Bug#99767 (31443178), Contribution: Check SubjectAlternativeName for TLS instead of commonName. + Thanks to Daniël van Eeden for his contribution. + + - Fix for Bug#93444 (29015453), LOCALDATETIME PARAMETER VALUES ALTERED WHEN CLIENT AND SERVER TIMEZONES DIFFER. + Thanks to Iwao Abe for his contribution. + + - WL#14052, Remove asynchronous variant of X Protocol. + + - Fix for Bug#99713 (31418928), NPE DURING COM.MYSQL.CJ.SERVERPREPAREDQUERYBINDVALUE.STOREDATE(). + + - WL#14068, Remove legacy integration with JBoss. + +Version 8.0.21 + + - WL#14051, Upgrade Protocol Buffers dependency to protobuf-java-3.11.4. + + - WL#14042, Upgrade testsuite to JUnit 5. + + - Fix for Bug#98237 (30911870), PREPAREDSTATEMENT.SETOBJECT(I, "FALSE", TYPES.BOOLEAN) ALWAYS SETS TRUE OR 1. + + - WL#13008, DevAPI: Add schema validation to create collection. + +Version 8.0.20 + + - Fix for Bug#30805426, IN CASE OF ISAUTHMETHODSWITCHREQUESTPACKET , TOSERVERS > 1 ARE IGNORED. + + - Fix for Bug#97714 (30570249), Contribution: Expose elapsed time for query interceptor to avoid hacky thread local implementations. + Thanks to Matti Sillanpää and Johnathan Crawford for their contribution. + + - Fix for Bug#97724 (30570721), Contribution: Allow \'3.\' formatted numbers. + Thanks to Nick Pollett for his contribution. + + - Fix for Bug#98536 (30877755), SIMPLEDATEFORMAT COULD CACHE A WRONG CALENDAR. + + - Fix for Bug#91112 (28125069), AGAIN WRONG JAVA.SQL.DATE. + + - Fix for Bug#30474158, CONNECTOR/J 8 DOES NOT HONOR THE REQUESTED RESULTSETTYPE SCROLL_INSENSITIVE ETC. + + - Fix for Bug#98445 (30832513), Connection option clientInfoProvider=ClientInfoProviderSP causes NPE. + + - WL#12248, DevAPI: Connection compression. + + - Fix for Bug#30636056, ResultSetUtil.resultSetToMap() can be unsafe to use. + + - Fix for Bug#97757 (30584907), NULLPOINTEREXCEPTION WITH CACHERESULTSETMETADATA=TRUE AND EXECUTEQUERY OF "SET". + +Version 8.0.19 + + - WL#13346, Support for mult-host and failover. + + - Fix for Bug#97413 (30477722), DATABASEMETADATA IS BROKEN AFTER SERVER WL#13528. + + - WL#13367, DNS SRV support. + + - WL#12736, DevAPI: Specify TLS ciphers to be used by a client or session. + + - Fix for regression tests broken by Bug#97079 fix. + + - Fix for Bug#96383 (30119545) RS.GETTIMESTAMP() HAS DIFFERENT RESULTS FOR TIME FIELDS WITH USECURSORFETCH=TRUE. + + - Fix for Bug#96059 (29999318), ERROR STREAMING MULTI RESULTSETS WITH MYSQL-CONNECTOR-JAVA 8.0.X. + + - Fix for Bug#96442 (30151808), INCORRECT DATE ERROR WHEN CALLING GETMETADATA ON PREPARED STATEMENT. + +Version 8.0.18 + + - WL#13347, Connectors should handle expired password sandbox without SET operations. + + - Fix for Bug#84098 (25223123), endless loop in LoadBalancedAutoCommitInterceptor. + + - Fix for Bug#23721537, MULTI-SELECT WITH EXECUTEASYNC() GIVES IMPROPER ERROR. + + - Fix for Bug#95741 (29898567), METADATA QUERY USES UPPER() AROUND NUMERIC EXPRESSION. + + - Fix for Bug#20913289, PSTMT.EXECUTEUPDATE() FAILS WHEN SQL MODE IS NO_BACKSLASH_ESCAPES. + + - Fix for Bug#80441 (22850444), SYNTAX ERROR ON RESULTSET.UPDATEROW() WITH SQL_MODE NO_BACKSLASH_ESCAPES. + +Version 8.0.17 + + - WL#13210, Generate Javadocs via ant. + + - WL#12247, DevAPI: indexing array fields. + + - WL#12726, DevAPI: Add overlaps and not_overlaps as operator. + + - Fix for Bug#95503 (29821029), Operator IN not mapping consistently to the right X Plugin operation. + + - WL#12942, Update README.md and add new CONTRIBUTING.md. + + - WL#13125, Support fully qualified hostnames longer than 60 characters. + + - Fix for Bug#95210 (29807741), ClassCastException in BlobFromLocator when connecting as jdbc:mysql:replication. + + - Fix for Bug#29591275, THE JAR FILE NEEDS TO CONTAIN A README AND LICENSE FILE. + + - WL#13124, Support new utf8mb4 bin collation. + + - WL#13009, DevAPI: Deprecate methods. + + - WL#11101, Remove de-cache and close of SSPSs on double call to close(). + + - Fix for Bug#89133 (27356869) CONTRIBUTION: UPDATE DATABASEMETADATA.JAVA. + Thanks to Harald Aamot for his contribution. + + - Fix for Bug#11891000, DABATASEMETADATA.GETTABLES() IGNORES THE SCHEMA_PATTERN ARGUMENT. + + - Fix for Bug#94101 (29277648), SETTING LOGSLOWQUERIES SHOULD NOT AUTOMATICALLY ENABLE PROFILESQL FOR QUERIES. + Thanks to Florian Agsteiner for the contribution. + + - Fix for Bug#74690 (20010454), PROFILEREVENT HOSTNAME HAS NO GETTER(). + + - Fix for Bug#70677 (17640628), CONNECTOR J WITH PROFILESQL - LOG CONTAINS LOTS OF STACKTRACE DATA. + + - Fix for Bug#41172 (11750577), PROFILEREVENT.PACK() THROWS ARRAYINDEXOUTOFBOUNDSEXCEPTION. + + - Fix for Bug#27453692, CHARACTERS GET GARBLED IN CONCAT() IN PS WHEN USECURSORFETCH=TRUE. + + - Fix for Bug#94585 (29452669), GETTABLENAME() RETURNS NULL FOR A QUERY HAVING COUNT(*) WITH JDBC DRIVER V8.0.12. + + - Fix for Bug#94533 (29446100), GETOBJECT FOR BOXED PRIMITIVE TYPES DOESN'T RETURN NULL FOR NULL COLUMNS. + + - Fix for Bug#94442 (29446059), RESULTSETIMPL.GETDOUBLE IS INEFFICIENT BECAUSE OF BIGDECIMAL (RE)CONSTRUCTIONS. + +Version 8.0.16 + + - WL#12825, Remove third-party libraries from sources and bundles. + + - Fix for Bug#93590 (29054329), javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify. + + - Fix for Bug#94414 (29384853), Connector/J RPM package have version number in path. + + - Fix for Bug#27786499, REDUNDANT FILES IN DEBIAN PACKAGE FOR DEBIAN9(COMMUNITY PACKAGE) FOR CJAVA. + + - WL#12246, DevAPI: Prepared statement support. + + - WL#10839, Adjust c/J tests to the new "ON" default for explicit_defaults_for_timestamp. + + - Fix for Bug#29329326, PLEASE AVOID SHOW PROCESSLIST IF POSSIBLE. + + - WL#12460, DevAPI: Support new session reset functionality. + + - WL#12459, DevAPI: Support connection-attributes. + + - Fix for Bug#25650385, GETBYTE() RETURNS ERROR FOR BINARY() FLD. + + - Fix for Bug#27784363, MYSQL 8.0 JDBC DRIVER THROWS NUMBERFORMATEXCEPTION FOR TEXT DATA + + - Fix for Bug#93007 (28860051), LoadBalancedConnectionProxy.getGlobalBlacklist bug. + + - Fix for Bug#29186870, CONNECTOR/J REGRESSION: NOT RETURNING PRECISION GETPROCEDURECOLUMNS. + + - Fix for Bug#22038729, X DEVAPI: ANY API CALL AFTER A FAILED CALL PROC() RESULTS IN HANG. + + - Fix for Bug#29244101, ADD MAPPING FOR UTF8MB4_ZH_0900_AS_CS COLLATION. + + - Fix for Bug#92819 (28834959), EXPRPARSER THROWS WRONGARGUMENTEXCEPTION WHEN PARSING EMPTY JSON ARRAY. + + - Fix for Bug#21921956, X DEVAPI: EXPRESSION PARSE ERROR WITH UNARY OPERATOR. + + - Fix for Bug#94031 (29257922), WRONG JSON_UNQUOTE WORKAROUND. + + - Fix for Bug#22931700, BINDINGS.GETBOOLEAN() ALWAYS RETURNS FALSE. + + - Fix for Bug#25650912, ERROR MESSAGE NOT CLEAR WHEN WE PASS A CHAR DATA TO ANY TABLE API. + + - Fix for Bug#25642021, CHANGEUSER() FAILS WHEN ENABLEPACKETDEBUG=TRUE. + +Version 8.0.15 + + - Fix for Bug#94051 (29261254), Not recommended default for 'allowLoadLocalInfile'. + +Version 8.0.14 + + - WL#12298, Connectors: Expose metadata about source and binaries in unified way. + + - Fix for Bug#93111 (28894344), ConnectionUrl.java contains char U+00A7 (section sign). + + - WL#12621, DevAPI: Handling of Default Schema. + + - Fix for Bug#93340 (28970166), C/J BUILD SCRIPT IS TOO VERBOSE + + - WL#12462, DevAPI: Be prepared for initial notice on connection. + + - Fix for Bug#28924137, WL#12463:IF COLLECTION DOESN'T EXIST, COLL.COUNT() IS GIVING A WRONG ERROR MESSAGE. + + - WL#12463, DevAPI: Standardize count method. + + - Fix for Bug#92508 (28747636), mysql-connector in bootclasspath causing memory leak. + + - Fix for Bug#25650514, UPDATEROW() CALL FAILS WITH NPE WHEN SSPS=TRUE AND TABLE HAS MULTI-FLD KEY. + + - Fix for Bug#25650482, REFRESHROW() CALL AFTER UPDATEROW() API FAILS WHEN USESERVERPREPSTMTS=TRUE. + + - Fix for Bug#92536 (28692243), UPDATEING SERVER SIDE PREPSTMTS RESULTSET FAIL. + + - Fix for Bug#92625 (28731795), CONTRIBUTION: FIX OBSERVED NPE IN CLEARINPUTSTREAM. + Thanks to Henning Schmiedehausen for his contribution. + + - Fix for Bug#23045642, ADDING NO-DOC (MYSQLCONNJ-696) RESULTS IN EXCEPTION. + + - Fix for Bug#91065 (28101003), ZERODATETIMEBEHAVIOR=CONVERT_TO_NULL SHOULD NOT APPLY TO 00:00:00 TIME COLUMNS. + + - Fix for Bug#92574 (28706219), WHEN CONVERTING FROM VARCHAR TO JAVA BOOLEAN, 'N' IS NOT SUPPORTED. + + - Fix for Bug#25642226, CHANGEUSER() NOT SETTING THE DATABASE PROPERLY WITH SHA USER. + + - Fix for Bug#28606708, NAMED PIPE CONNECTION FOR X PROTOCOL RETURNS NPE, EXPECTED PROPER ERROR MESSAGE. + +Version 8.0.13 + + - Fix for Bug#91317 (28207422), Wrong defaults on collation mappings. + + - WL#12245, DevAPI: Implement connect timeout. + + - Fix for Bug#21774249, UNIT TEST FAILS WITH ERROR " 'CEST' IS UNRECOGNIZED TIME ZONE". + + - WL#11857, DevAPI: Implement connection pooling for xprotocol. + + - Fix for Bug#91873 (28444461), REMOVE USEOLDUTF8BEHAVIOR CONNECTION PROPERTY. + + - Fix for Bug#92264 (28594434), JSONPARSER PUTS UNNECESSARY MAXIMUM LIMIT ON JSONNUMBER TO 10 DIGITS. + + - WL#12110, Extend PropertyDefinitions.PropertyKey usage. + + - Fix for Bug#81063 (23098159), w/ rewriteBatchedStatements, when 2 tables involved, the rewriting not correct. + + - Fix for Bug#84813 (25501750), rewriteBatchedStatements fails in INSERT. + + - Fix for Bug#81196 (23227334), CONNECTOR/J NOT FOLLOWING DATABASE CHARACTER SET. + + - Fix for Bug#72609 (18749544), SETDATE() NOT USING A PROLEPTIC GREGORIAN CALENDAR. + + - Fix for Bug#87534 (26730196), UNION ALL query fails when useServerPrepStmts=true on database connection. + Test case only. Base bug fixed in MySQL 5.7.22. + + - Fix for Bug#89948 (27658489), Batched statements are not committed for useLocalTransactionState=true. + + - Fix for BUG#22305979, WRONG RECORD UPDATED IF SENDFRACTIONALSECONDS=FALSE AND SMT IS SCROLLABLE. + + - Fix for Bug#27102307, CHANGE USESSL AND VERIFYSERVERCERTIFICATE TO SSLMODE OPTION. + + - Fix for Bug#28150662, CONNECTOR/J 8 MALFORMED DATABASE URL EXCEPTION WHIT CORRECT URL STRING. + + - Fix for Bug#91421 (28246270), ALLOWED VALUES FOR ZERODATETIMEBEHAVIOR ARE INCOMPATIBLE WITH NETBEANS. + + - Fix for Bug#23045604, XSESSION.GETURI() RETURNS NPE. + + - Fix for Bug#21914769, NPE WHEN TRY TO EXECUTE INVALID JSON STRING. + + - Fix for Bug#BUG#90887 (28034570), DATABASEMETADATAUSINGINFOSCHEMA#GETTABLES FAILS IF METHOD ARGUMENTS ARE NULL. + + - Fix for Bug#28207088, C/JAVA: UPDATECLOB(INT COLUMNLABEL, JAVA.SQL.CLOB CLOB) IS FAILING. + + - Fix for Bug#27629553, NPE FROM GETSESSION() FOR SSL CONNECTION WHEN NO PASSWORD PASSED. + +Version 8.0.12 + + - Fix for Bug#28208000, MASTER : HANG IN ASYNCHRONOUS SELECT TEST. + + - WL#10544, Update MySQL 8.0 keywords list. + + - WL#11858, DevAPI: Core API v1 alignment. + + - Fix for Bug#27652379, NPE FROM GETSESSION(PROPERTIES) WHEN HOST PARAMETER IS GIVEN IN SMALL LETTER. + + - Fix for BUG#87600 (26724154), CONNECTOR THROWS 'MALFORMED DATABASE URL' ON NON MYSQL CONNECTION-URLS. + + - Fix for BUG#26089880, GETCONNECTION("MYSQLX://..") RETURNS NON-X PROTOCOL CONNECTION. + + - WL#11876, Improve connection properties design. + + - WL#11933, Connector/J 8.0 X DevAPI reference documentation update. + + - WL#11860, Ensure >= 75% code coverage. + + - Fix for Bug#90753 (27977617), WAIT_TIMEOUT EXCEEDED MESSAGE NOT TRIGGERED. + + - Fix for Bug#85941 (25924324), WASNULL NOT SET AFTER GETBYTES IS CALLED. + + - Fix for Bug#28066709, COLLECTION.CREATEINDEX() TEST IS BROKEN AFTER WL#11808 IMPLEMENTATION. + + - Fix for Bug#90872 (28027459), FILTERPARAMS CLASS IS NOT NEEDED. + + - Fix for Bug#27522054, POSSIBLE ASYNC XPROTOCOL MESSAGE HANDLING PERF ISSUE. + The "xdevapi.useAsyncProtocol" connection property default value is changed to "false". + +Version 8.0.11 + + - WL#11293, DevAPI: Support new locking modes : NOWAIT and SKIP LOCKED. + + - Fix for Bug#90029 (27678308), FAILURE WHEN GETTING GEOMCOLLECTION COLUMN TYPE. + + - Fix for BUG#90024 (27677574), SOME TESTS FAILED AGAINST MYSQL 8.0.5 BECAUSE OF DEPRECATED FEATURES REMOVAL. + + - Fix for Bug#86741 (26314325), Multi-Host connection with autocommit=0 getAutoCommit maybe wrong. + + - Fix for Bug#27231383, PROVIDE MAVEN-FRIENDLY COMMERCIAL PACKAGES WITHOUT "-BIN". + + - Fix for Bug#26819691, SETTING PACKETDEBUGBUFFERSIZE=0 RESULTS IN CONNECTION FAILURE. + + - Fix for Bug#88227 (27029657), Connector/J 5.1.44 cannot be used against MySQL 5.7.20 without warnings. + + - Fix for Bug#27374581, CONNECTION FAILS WHEN GPL SERVER STARTED WITH TLS-VERSION=TLSV1.2. + + - WL#11419, DevAPI: New document _id generation support. + + - WL#11620, Change caching_sha2_password padding. + + - WL#11604, DevAPI: Add SHA256_MEMORY support. + + - Fix for BUG#86278 (26092824), SUPPORT CUSTOM CONSTRUCTION OF SSLSOCKET DURING CONNECTION ESTABLISHMENT. + + - Fix for BUG#27226293, JSONNUMBER.GETINTEGER() & NUMBERFORMATEXCEPTION. + + - WL#10527, Clean up Protocol and Session interfaces. + +Version 8.0.10 + + - (Skipped version number to align versions between components and server) + +Version 8.0.9 + + - WL#11469, Update license header in GPL packages. + + - Fix for BUG#27247349, WL#11208 : UNIQUE DOES NOT GIVE ERROR EVEN THOUGH IT IS NOT SUPPORTED. + + - WL#11208, DevAPI: Collection.createIndex. + + - WL#10156, Add setters/getters for connection properties to MysqlDataSource, MysqlXADataSource and MysqlConnectionPoolDataSource. + + - WL#11401, DevAPI: Remove configuration API. + Partial revert of "WL#9868, DevAPI: Configuration handling interface." + + - WL#10619, Ensure compatibility with new data dictionary. + + - Fix for BUG#27217264, WL#10937: NULL POINTER EXCEPTION WHEN NULL IS PASSED AS _ID IN COLL.REPLACEONE. + + - WL#10937, DevAPI: ReplaceOne, AddOrReplaceOne, GetOne, RemoveOne. + + - Fix for Bug#26723646, JSON_MERGE() FUNCTION IS DEPRECATED IN MYSQL 8.0. + + - Fix for Bug#27185332, WL#11210:ERROR IS THROWN WHEN NESTED EMPTY DOCUMENTS ARE INSERTED TO COLLECTION. + + - Fix for Bug#27151601, WL#11210: DOCUMENT PATCH EXPRESSIONS ARE NOT SUPPORTED. + + - WL#11210, DevAPI: Modify/MergePatch. + + - Fix for Bug#79612 (22362474), CONNECTION ATTRIBUTES LOST WHEN CONNECTING WITHOUT DEFAULT DATABASE. + + - WL#10152, Enable TLSv1.2 on mysqlx. + + - Fix for Bug#27131768, NULL POINTER EXCEPTION IN CONNECTION. + + - Fix for Bug#88232 (27047676), c/J does not rollback transaction when autoReconnect=true. + + - Fix for Bug#88242 (27040063), autoReconnect and socketTimeout JDBC option makes wrong order of client packet. + + - Fix for Bug#88021 (26939943), High GC pressure when driver configured with serversideprepared statements. + Thanks to Johnathan Crawford for his contribution. + + - Fix for Bug#26724085, CHARSET MAPPING TO BE UPDATED FOR MYSQL 8.0.3. + + - Fix for Bug#87704 (26771560), THE STREAM GETS THE RESULT SET ?THE DRIVER SIDE GET WRONG ABOUT GETLONG(). + + - Fix for Bug#24924097, SERVER GREETING ERROR ISN'T RECOGNIZED DURING HANDSHAKE. + + - Fix for Bug#26748909, MASTER : ERROR - NO OPERATIONS ALLOWED AFTER STATEMENT CLOSED FOR TOSTRING(). + + - Fix for Bug#26266731, CONCUR_UPDATABLE RESULTSET OPERATIONS FAIL AGAINST 8.0 FOR BOOLEAN COLUMN. + + - WL#11239, DevAPI: Remove create table implementation. + + - Fix for Bug#27131100, WL#11212 : SAVEPOINT CREATING WITH EMPTY STRING AND SPACE AS NAME. + + - WL#11212, DevAPI: transaction save-points. + + - WL#11060, Support new SHA-256 authentication system. + + - Fix for Bug#87826 (26846249), MYSQL JDBC CONNECTOR/J DATABASEMETADATA NULL PATTERN HANDLING IS NON-COMPLIANT. + + - WL#11163, Extract parameter setters, serverPrepare() and serverExecute() to core classes. + + - Fix for BUG#26995710, WL#11161 : NULL POINTER EXCEPTION IN EXECUTEBATCH() AND CLOSE(). + + - WL#11161, Unify query bindings. + + - WL#8469, Don't extract query text from packets when possible. + +Version 8.0.8 + + - Fix for BUG#26722030, TEST FAILING DUE TO BINARY LOGGING ENABLED BY DEFAULT IN MYSQL 8.0.3. + + - Fix for BUG#26722018, TESTS FAILING DUE TO CHANGE IN INFORMATION_SCHEMA.INNODB_SYS_* NAMING. + + - Fix for BUG#26750807, MASTER : NULL POINTER EXCEPTION IN SCHEMA.DROPVIEW(NULL). + + - Fix for BUG#26750705, MASTER : ERROR - UNSUPPORTED CONVERSION FROM TIME TO JAVA.SQL.DATE. + + - WL#10620, DevAPI: SHA256 Authentication support. + + - WL#10936, DevAPI: Row locking for Crud.Find. + + - WL#9868, DevAPI: Configuration handling interface. + + - WL#10935, DevAPI: Array or Object "contains" operator. + + - WL#9875, Prepare c/J 8.0 for DEB and RPM builds. + + - Fix for BUG#26259384, CALLABLE STATEMENT GIVES ERROR IN C/JAVA WHEN RUN AGAINST MYSQL 8.0. + + - Fix for Bug#26393132, NULLPOINTEREXCEPTION IS THROWN WHEN TRIED TO DROP A NULL COLLECTION. + + - WL#10532, DevAPI: Cleanup Drop APIs. + + - Fix for Bug#87429 (26633984), repeated close of ServerPreparedStatement causes memory leak. + Thanks to Eduard Gurskiy for his contribution. + + - Fix for Bug#87379 (26646676), Perform actual TLS capabilities check when restricting TLSv1.2. + Thanks to Todd Farmer for his contribution. + + - Fix for Bug#85601 (25777822), Unit notation is missing in the description of the property involved in the time. + + - Fix for Bug#87153 (26501245), INCORRECT RESULT OF DBMD.GETVERSIONCOLUMNS() AGAINST MYSQL 8.0.2+. + + - Fix for Bug#78313 (21931572), proxies not handling Object.equals(Object) calls correctly. + + - Fix for Bug#85885 (25874048), resultSetConcurrency and resultSetType are swapped in call to prepareStatement. + + - Fix for Bug#74932 (20066806), ConnectionImp Doesn't Close Server Prepared Statement (PreparedStatement Leak). + + - WL#10536, Deprecating COM_SHUTDOWN. + + - Fix for Bug#25946965, UPDATE THE TIME ZONE MAPPINGS WITH LATEST TZ DATABASES. + + - Fix for Bug#20182108, INCLUDE CUSTOM LOAD BALANCING STRATEGY USING PLUGIN API. + New load-balancing strategy "serverAffinity" and new connection property "serverAffinityOrder" added. + + - Fix for Bug#26440544, CONNECTOR/J SHOULD NOT USE TX_{READ_ONLY,ISOLATION} WHICH IS PLANNED FOR REMOVAL. + + - Fix for Bug#26399958, UNABLE TO CONNECT TO MYSQL 8.0.3. + + - Fix for Bug#25650305, GETDATE(),GETTIME() AND GETTIMESTAMP() CALL WITH NULL CALENDAR RETURNS NPE. + +Version 8.0.7 + + - Fix for Bug#26227653, WL#10528 DIFF BEHAVIOUR WHEN SYSTEM PROP JAVAX.NET.SSL.TRUSTSTORETYPE IS SET. + + - WL#10528, DevAPI: Ensure all connectors are secure by default. + + - WL#8305, Remove internal dependency on connection objects. + + - Fix for Bug#22972057, X DEVAPI: CLIENT HANGS AFTER CONNECTION FAILURE. + + - Fix for Bug#26140577, GIS TESTS ARE FAILING WITH MYSQL 8.0.1. + + - WL#10765, DevAPI: Forbid modify() and remove() with no condition. + + - Fix for Bug#26090721, CONNECTION FAILING WHEN SERVER STARTED WITH COLLATION UTF8MB4_DE_PB_0900_AI_CI. + + - WL#10781, enum-based connection properties. + + - Fix for Bug#73775 (19531384), DBMD.getProcedureColumns()/.getFunctionColumns() fail to filter by columnPattern. + + - Fix for Bug#84324 (25321524), CallableStatement.extractProcedureName() not work when catalog name with dash. + + - Fix for Bug#79561 (22333996), NullPointerException when calling a fully qualified stored procedure. + + - Fix for Bug#84783 (25490163), query timeout is not working(thread hang). + + - Fix for Bug#70704 (17653733), Deadlock using UpdatableResultSet. + + - Fix for Bug#66430 (16714868), setCatalog on connection leaves ServerPreparedStatement cache for old catalog. + + - Fix for Bug#70808 (17757070), Set sessionVariables in a single query. + + - Fix for Bug#77192 (21170603), Description for the Property replicationConnetionGroup Missing from the Manual. + + - Fix for Bug#83834 (25101890), Typo in Connector/J error message. + + - WL#10531, Support utf8mb4 as default charset. + + - Fix for Bug#85555 (25757019), useConfigs Can't find configuration template named, in mysql-connector-java 6.x + + - WL#10529, Move version number to 8.0. + + - WL#10530, DevAPI: Remove XSession, rename NodeSession to Session. + + - Fix for Bug#23510958, CONCURRENT ASYNC OPERATIONS RESULT IN HANG. + + - Fix for Bug#23597281, GETNODESESSION() CALL WITH SSL PARAMETERS RETURNS CJCOMMUNICATIONSEXCEPTION. + + - Fix for Bug#25207784, C/J DOESN'T FOLLOW THE FINAL X DEVAPI MY-193 SPECIFICATION. + + - Fix for Bug#25494338, ENABLEDSSLCIPHERSUITES PARAMETER NOT WORKING AS EXPECTED WITH X-PLUGIN. + + - Fix for Bug#84084 (25215008), JAVA.LANG.ARRAYINDEXOUTOFBOUNDSEXCEPTION ON ATTEMPT TO GET VALUE FROM RESULTSET. + + - WL#10553, Add mapping for Japanese utf8mb4 collation. + + - Fix for Bug#25575103, NPE FROM CREATETABLE() WHEN SOME OF THE INPUTS ARE NULL. + + - Fix for Bug#25575156, NPE FROM CREATEVIEW() WHEN SOME OF THE INPUTS ARE NULL. + + - Fix for Bug#25636947, CONNECTION USING MYSQL CLIENT FAILS IF WE USE THE SSL CERTIFICATES FROM C/J SRC. + + - Fix for Bug#25687718, INCORRECT TIME ZONE IDENTIFIER IN STATEMENTREGRESSIONTEST. + + - Fix for Bug#25556597, RESULTSETTEST.TESTPADDING UNIT TEST IS FAILING IN 5.1.41 RELEASE PACKAGE. + + - Fix for Bug#25517837, CONNECT PERFORMNACE DEGRADED BY 10% IN 5.1.41. + + - Fix for Bug#25504578, CONNECT FAILS WHEN CONNECTIONCOLLATION=ISO-8859-13. + + - Fix for Bug#25438355, Improper automatic deserialization of binary data. + + - Fix for Bug#70785 (17756825), MySQL Connector/J inconsistent init state for autocommit. + Property 'elideSetAutoCommits' is temporarily disabled due to Bug#66884. Defaults to 'false' until this bug is fixed. + + - Fix for Bug#75615 (21181249), Incorrect implementation of Connection.setNetworkTimeout(). + + - Fix for Bug#81706 (23535001), NullPointerException in driver. + + - Fix for Bug#83052 (25048543), static method in com.mysql.jdbc.Util relies on null object. + + - Fix for Bug#69526 (17035755), 'Abandoned connection cleanup thread' at mysql-connector-java-5.1.25. + + - Fix for Bug#82826 (24942672), Unneeded version requirement for javax.net.ssl Import-Package on OSGi MANIFEST.MF. + +Version 6.0.6 + + - Added Core TLS/SSL options for the mysqlx URI scheme. + + - Updated collations map. + + - Fix for Bug#24350526, UNEXPECTED BEHAVIOUR OF IS_NUMBER_SIGNED API IN C/JAVA. + + - Fix for Bug#82707 (24512766), WRONG MILLI SECOND VALUE RETURNED FROM TIMESTAMP COLUMN. + + - Fix for Bug#82005 (23702040), JDBCDATEVALUEFACTORY FAILS TO PARSE SOME DATES. + + - Fix for Bug#83725 (25056803), NPE IN XPROTOCOL.GETPLUGINVERSION() WITH MYSQL 5.7.17. + + - Fix for Bug#24525461, UPDATABLE RESULTSET FEATURE FAILS WHEN USESERVERPREPSTMTS=TRUE. + + - Fix for Bug#24527173, QUERY EXECUTION USING PREPARED STMT FAILS WHEN USECURSORFETCH=TRUE. + + - Fix for Bug#82964 (24658016), JSR-310 DATA TYPES CREATED THROUGH JAVA.SQL TYPES. + + - Fix for Bug#81202 (23188159), RESULTSETIMPL.GETOBJECT THROWS NULLPOINTEREXCEPTION WHEN FIELD IS NULL. + + - Fix for Bug#22931277, COLUMN.GETTYPE() RETURNS ERROR FOR VALID DATATYPES. + + - Fix for BUG#24471057, UPDATE FAILS WHEN THE NEW VALUE IS OF TYPE DBDOC WHICH HAS ARRAY IN IT. + + - Fix for Bug#81691 (23519211), GETLASTDOCUMENTIDS() DOESN'T REPORT IDS PROVIDED BY USER. + + - Fix for Bug#82826 (24942672), Unneeded version requirement for javax.net.ssl Import-Package on OSGi MANIFEST.MF. + +10-21-16 - Version 6.0.5 + + - Fix for BUG#82896 (24613062), Unexpected behavior on attempt to connect to JDBC driver with unsupported URL. + + - Added client-side failover during XSession initialization for multi-router configuration. + + - Removed Extension interface. All extension classes now implement their specific interfaces. + + - Fix for Bug#22988922, GETLENGTH() RETURNS -1 FOR LONGBLOB AND LONGTEXT FIELDS. + + - Fix for Bug#24619829, NEW FAILURES IN C/JAVA UNITTESTS AGAINST MYSQL 8.0. + + - Fix for Bug#75209 (20212882), Set useLocalTransactionState may result in partially committed transaction. + + - Fix for Bug#48346 (11756431), Communications link failure when reading compressed data with compressed=true. + Thanks to Ryosuke Yamazaki for his contribution. + + - Fix for Bug#80631 (22891845), ResultSet.getString return garbled result with json type data. + Thanks to Dong SongLing for his contribution. + + - Fix for Bug#64188 (13702433), MysqlXAConnection.MYSQL_ERROR_CODES_TO_XA_ERROR_CODES is missing XA error codes. + + - Fix for Bug#72632 (18759269), NullPointerException for invalid JDBC URL. + + - Fix for Bug#82115 (23743956), Some exceptions are intercepted twice or fail to set the init cause. + + - Fix for Bug#78685 (21938551), Wrong results when retrieving the value of a BIT column as an integer. + + - Fix for Bug#80615 (22954007), prepared statement leak when rewriteBatchedStatements=true and useServerPrepStmt. + + - Extended X DevAPI with flexible parameter lists. + + - Added a virtual NodeSession to X DevAPI. + +09-05-16 - Version 6.0.4 + + - X DevAPI URL prefix changed from "mysql:x:" to "mysqlx:". + + - Fix for Bug#24301468 X DEVAPI SSL CONNECTION FAILS ON WINDOWS + + - The X DevAPI Table object now represents both database tables and views. + + - Added support for matching against pattern for X DevAPI list_objects calls. + Added Schema.getCollections(String pattern) and Schema.getTables(String pattern) interface methods. + + - Switched to "mysqlx" namespace for X DevAPI StmtExecute messages. This change is incompatible to MySQL server versions < 5.7.14. + + - Fix for Bug#82046 (23743947), MYSQL CONNECTOR JAVA OSGI METADATA BROKEN. + + - Fix for Bug#21690043, CONNECT FAILS WHEN PASSWORD IS BLANK. + + - Fix for Bug#22931433, GETTING VALUE OF BIT COLUMN RESULTS IN EXCEPTION. + +06-17-16 - Version 6.0.3 + + - Fix for Bug#23535571, EXCESSIVE MEMORY USAGE WHEN ENABLEPACKETDEBUG=TRUE. + + - Fix for Bug#23212347, ALL API CALLS ON RESULTSET METADATA RESULTS IN NPE WHEN USESERVERPREPSTMTS=TRUE. + + - Fix for Bug#23201930, CLIENT HANG WHEN RSLT CUNCURRENCY=CONCUR_UPDATABLE AND RSLTSET TYPE=FORWARD_ONLY. + + - Fix for Bug#23188498, CLIENT HANG WHILE USING SERVERPREPSTMT WHEN PROFILESQL=TRUE AND USEIS=TRUE. + + - Fix for Bug#22678872, NPE DURING UPDATE WITH FABRIC. + New property 'loadBalanceHostRemovalGracePeriod' sets the grace period when removing hosts from a load-balanced connection. + + - Fix for Bug#71131 (18068303), Poor error message in CallableStatement.java. + + - Fix for Bug#59462 (16736619), ConcurrentModificationException inside ConnectionImpl.closeAllOpenStatements(). + + - Fix for Bug#22848249, LOADBALANCECONNECTIONGROUPMANAGER.REMOVEHOST() NOT WORKING AS EXPECTED. + + - Fix for Bug#22730682, ARRAYINDEXOUTOFBOUNDSEXCEPTION FROM CONNECTIONGROUPMANAGER.REMOVEHOST(). + + - Fix for Bug#77171 (21181466), On every connect getting sql_mode from server creates unnecessary exception. + + - Fix for Bug#79343 (22353759), NPE in TimeUtil.loadTimeZoneMappings causing server time zone value unrecognized. + + - Fix for Bug#22038729, X DevAPI: Any API call after a failed CALL PROC() results in hang + + - Remove Schema.drop(), Collection.drop() and replaced with X DevAPI's session.dropSchema() and session.dropCollection(). + Also added session.dropTable(). + + - Fix for Bug#22932078, GETTIMESTAMP() RETURNS WRONG VALUE FOR FRACTIONAL PART + + - Extracted packet readers from MysqlaProtocol. + + - Fix for Bug#22972057, X protocol CLIENT HANGS AFTER CONNECTION FAILURE + + - Fix for Bug#23044312, NullPointerException in X protocol AsyncMessageReader due to race condition + + - Returned support for MySQL 5.5 and 5.6. + +04-05-16 - Version 6.0.2 + + - Deprecate the EOF packet. + + - Fix for Bug#75956, Inserting timestamps using a server PreparedStatement and useLegacyDatetimeCode=false + + - Fix for Bug#22385172, CONNECTOR/J MANIFEST DOES NOT EXPOSE FABRIC (OSGi). + + - Fix for Bug#22598938, FABRICMYSQLDATASOURCE.GETCONNECTION() NPE AFTER SWITCHOVER. + + - Merged version 5.1.38. + + - Fix for Bug#21286268, CONNECTOR/J REPLICATION USE MASTER IF SLAVE IS UNAVAILABLE. + + - Fix for Bug#21296840 & Bug#17910835, Server information in a group from Fabric is not refreshed after expired TTL. + + - Fix for Bug#56122 (11763419), JDBC4 functionality failure when using replication connections. + + - Added support for TLSv1.1 and TLSv1.2 + + - Fix for Bug#78961 (22096981), Can't call MySQL procedure with InOut parameters in Fabric environment. + + - Fix for Bug#56100 (11763401), Replication driver routes DML statements to read-only slaves. + + - StandardSSLSocketFactory implements SocketMetadata. + + - Fix for Bug#21978216, GETTYPEINFO REPORT MAXIMUM PRECISION OF 255 FOR VARBINARY. + + - Fix for Bug#78706 (21947042), Prefer TLS where supported by MySQL Server. + + - Fix for Bug#21934573, FABRIC CODE INVOLVED IN THREAD DEADLOCK. + Duplicate: Bug#78710 (21966391), Deadlock on ReplicationConnection and ReplicationConnectionGroup when failover. + + - Merged version 5.1.37. + + - Fix for Bug#21876798, CONNECTOR/J WITH MYSQL FABRIC AND SPRING PRODUCES PROXY ERROR. + +10-19-15 - Version 6.0.1 + + - Removed useJvmCharsetConverters connection property. JVM charset converters are now used in all cases. + + - Refactored value decoding and removed all date/time connection properties + + - Refactored connection properties + + - Assume existence of INFORMATION_SCHEMA.PARAMETERS (and thus MySQL 5.5) when preparing stored procedure calls. + + - Removed retainStatementAfterResultSetClose connection property. + + - Null-merge of Bug#54095 (11761585) fix. + + - Removed support code for MySQL server versions < 5.7. + + - Merged version 5.1.37. + + - Fix for Bug#76859 (20969312), DBMD getColumns using I_S doesn't have column IS_GENERATEDCOLUMN as per JDBC 4.1. + Added support for GENERATED COLUMNS. + + - Update Time Zone mappings with IANA Time Zone database tsdata2015f and Unicode CLDR v.28. + + - Update DatabaseMetaData SQL keywords. + + - Added tests for Optimizer hints syntax introduced in MySQL 5.7.7. + + - Fix for Bug#21860833, JSON DATA TYPE DOESN'T WORK WITH SSPS. + Added support for JSON data type. + + - Added support for JDBC 4.2 new features. + New property 'enableEscapeProcessing' sets the default escape processing behavior for Statement objects. + + - Fix for Bug#16634180, LOCK WAIT TIMEOUT EXCEEDED CAUSES SQLEXCEPTION, SHOULD CAUSE SQLTRANSIENTEXCEPTION + + - Fix for Bug#75849 (20536592), NPE in abortInternal() method on line 1358 of ConnectionImpl. + + - Fix for Bug#78106 (21648826), Potential memory leak with inflater. + + - Fix for Bug#78225 (21697684), DEFAULT NO_AUTO_CREATE_USER SQL_MODE BEHAVIOR BROKE SOME TESTS + + - Fix for Bug#77665 (21415165), JDBC fails to connect with MySQL 5.0. + + - Fix for Bug#77681 (21429909), rewrite replace sql like insert when rewriteBatchedStatements=true (contribution). + Thanks to Jie Han for his contribution. + + - Fix for Bug#77449 (21304726) Add 'truncateFractionalSeconds=true|false' property (contribution). + The property 'sendFractionalSeconds' was added instead of the proposed 'truncateFractionalSeconds'. + Thanks to KwonNam for his contribution. + + - Fix for Bug#50348 (11758179), mysql connector/j 5.1.10 render the wrong value for dateTime column in GMT DB. + + - Fix for Bug#75670 (20433047), Connection fails with "Public Key Retrieval is not allowed" for native auth. + + - Fix for Bug#76187 (20675539), getTypeInfo report maximum precision of 255 for varchar. + + - Merged version 5.1.36. + + - Add test for new syntax 'ALTER TABLE ... DISCARD|IMPORT PARTITION ...' introduced in MySQL 5.7.4. + + - Fix for Bug#20727196, GETPROCEDURECOLUMNS() RETURNS EXCEPTION FOR FUNCTION WHICH RETURNS ENUM/SET TYPE. + + - Fix for Bug#19803348, GETPROCEDURES() RETURNS INCORRECT OUTPUT WHEN USEINFORMATIONSCHEMA=FALSE. + + - Fix for Bug#21215151, DATABASEMETADATA.GETCATALOGS() FAILS TO SORT RESULTS. + + - Fix for Bug#72630 (18758686), NullPointerException during handshake in some situations + + - Fix for Bug#20825727, CONNECT FAILURE WHEN TRY TO CONNECT SHA USER WITH DIFFERENT CHARSET. + + - Flag RowDataDynamic.isInterrupted removed as it isn't needed. + + - Fix for Bug#20518653, XSL FILES IN PACKAGES + + - Fix for Bug#20804635, GETTIME() AND GETDATE() FUNCTIONS FAILS WHEN FRACTIONAL PART EXISTS + + - Fix for Bug#62452 (16444069), NPE thrown in JDBC4MySQLPooledException when statement is closed. + + - Fix for BUG#70927 (17810800), Connector/J COM_CHANGE_USER handling is broken + + - Fix for Bug#75335 (20283655), Maven artifact for Connector/J is missing source jar. + + - Fix for BUG#75592 (20408891), "SHOW VARIABLES WHERE" is expensive. + + - Fix for Bug#75113 (20821888), Fail in failover of the connection in MySQL fabric + + - Fix for Bug#72077 (18425861), Fabric connection with username to a server with disabled auth throws NPE + + - Add test for already fixed Bug#72546 (18719760), C/J Fabric createGroup() throws ClassCastException + + - Fix for Bug#77217 (21184949), ClassCastException when executing a streaming PreparedStatement with Fabric + + - Merged version 5.1.35. + + - Fix for Bug#19536760, GETSTRING() CALL AFTER RS.RELATIVE() RETURNS NULLPOINTEREXCEPTION + + - Fix for BUG#20453712, CLOB.SETSTRING() WITH VALID INPUT RETURNS EXCEPTION + + - Fix for BUG#20453671, CLOB.POSITION() API CALL WITH CLOB INPUT RETURNS EXCEPTION + + - Fix for Bug#20685022, SSL CONNECTION TO MYSQL 5.7.6 COMMUNITY SERVER FAILS. + + - Fix for Bug#20606107, TEST FAILURES WHEN RUNNING AGAINST 5.7.6 SERVER VERSION + + - Fix for Bug#20533907, BUG#20204783 FIX EXPOSES WRONG BEAHAVIORS IN FAILOVER CONNECTIONS. + This fix is a refactoring of the default failover feature which is no longer attached to load-balancing support. + + - Fix for Bug#20504139, GETFUNCTIONCOLUMNS() AND GETPROCEDURECOLUMNS() RETURNS ERROR FOR VALID INPUTS. + + - Expose PreparedStatment.ParseInfo for external usage, with no capture of the connection, which allows for global, highly-concurrent parse caches to be + implemented. + + - Fix for Bug#75309 (20272931), mysql connector/J driver in streaming mode will in the blocking state. + + - New property 'readOnlyPropagatesToServer' controls the implicit propagation of read only transaction access mode to server. + + - Fix for Bug#54095 (11761585), Unnecessary call in newSetTimestampInternal. + Test case only. The bug was fixed as a consequence of the patch for Bug#71084. + + - Fix for Bug#67760 (15936413), Deadlock when concurrently executing prepared statements with Timestamp objects. + + - Fix for Bug#71084 (18028319), Wrong java.sql.Date stored if client and server time zones differ. + Two connection properties added, "noTimezoneConversionForDateType" and "cacheDefaultTimezone", to define if and how time zone conversions are available to + DATE data type values. + + - Fix for Bug#75080 (20217686), NullPointerException during setTimestamp on Fabric connection. + + - Fix for Bug#75168 (20204783), loadBalanceExceptionChecker interface cannot work using JDBC4/JDK7. + + - Fix for Bug#73595 (19465516), Replace usage of StringBuffer in JDBC driver. + + - Fix for Bug#18925727, SQL INJECTION IN MYSQL JDBC DRIVER. + + - Fix for Bug#74998 (20112694), readRemainingMultiPackets not computed correctly for rows larger than 16 MB. + + - Merged version 5.1.34. + + - Fix for Bug#73012 (19219158), Precedence between timezone options is unclear. + + - Implement support for connecting through SOCKS proxies (WL#8105). Connection properties supporting this are socksProxyHost, socksProxyPort. + + - Ant buildfile reworked to fix incompatibilities with latest Eclipse, to remove dependency from ant-contrib and to improve structure and documentation. + + - Fix for Bug#18474141, TESTSUITE.FABRIC TEST CASES FAIL IF NO FABRIC.TESTSUITE PROPERTIES PROVIDED + + - Fix for Bug#19383371, CONNECT USING MYSQL_OLD_PASSWORD USER FAILS WHEN PWD IS BLANK + + - Merged version 5.1.33. + + - Fix for Bug#17441747, C/J DOESN'T SUPPORT XA RECOVER OUTPUT FORMAT CHANGED IN MYSQL 5.7. + Test case was disabled for affected server versions 5.7.0 - 5.7.4. + + - Fix for Bug#19145408, Error messages may not be interpreted according to the proper character set + + - Fix for Bug#19505524, UNIT TEST SUITE DOES NOT CONSIDER ALL THE PARAMETERS PASSED TO BUILD.XML. + + - Fix for Bug#73474 (19365473), Invalid empty line in MANIFEST.MF + + - Fix for Bug#70436 (17527948), Incorrect mapping of windows timezone to Olson timezone. + TimeZone mappings were revised in order to use latest data from IANA Time Zone Database and Unicode CLDR. + + - Fix for Bug73163 (19171665), IndexOutOfBoundsException thrown preparing statement. + Regression test added. Fix was included in patch from 5.1.32: "Fix for failing tests when running test suite with Java 6+". + + - Added support for gb18030 character set + + - Fix for Bug#73663 (19479242), utf8mb4 does not work for connector/j >=5.1.13 + + - Fix for Bug#73594 (19450418), ClassCastException in MysqlXADataSource if pinGlobalTxToPhysicalConnection=true + + - Fix for Bug#19354014, changeUser() call results in "packets out of order" error when useCompression=true. + + - Fix for Bug#73577 (19443777), CHANGEUSER() CALL WITH USECOMPRESSION=TRUE COULD LEAD TO IO FREEZE + + - Fix for Bug#19172037, TEST FAILURES WHEN RUNNING AGAINST 5.6.20 SERVER VERSION + + - Merged version 5.1.32 + + - Fix for Bug#71923 (18344403), Incorrect generated keys if ON DUPLICATE KEY UPDATE not exact. + Additionally several methods in StringUtils were fixed/upgraded. + + - Fix for Bug#72502 (18691866), NullPointerException in isInterfaceJdbc() when using DynaTrace + + - Fix for Bug#72890 (18970520), Java jdbc driver returns incorrect return code when it's part of XA transaction. + + - Fabric client now supports Fabric 1.5. Older versions are no longer supported. + + - Fix for Bug#71672 (18232840), Every SQL statement is checked if it contains "ON DUPLICATE KEY UPDATE" or not. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#73070 (19034681), Preparing a stored procedure call with Fabric results in an exception + + - Fix for Bug#73053 (19022745), Endless loop in MysqlIO.clearInputStream due to Linux kernel bug. + In the source of this issue is a Linux kernel bug described in the patch "tcp: fix FIONREAD/SIOCINQ" + (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a3374c4). + + - Fix for Bug#18869381, CHANGEUSER() FOR SHA USER RESULTS IN NULLPOINTEREXCEPTION + + - Fix for Bug#62577 (16722757), XA connection fails with ClassCastException + + - Fix for Bug#18852587, CONNECT WITH A USER CREATED USING SHA256_PASSWORD PLUGIN FAILS WHEN PWD IS BLANK + + - Fix for Bug#18852682, TEST TESTSHA256PASSWORDPLUGIN FAILS WHEN EXECUTE AGAINST COMMERCIAL SERVER + + - Fix for failing tests when running test suite with Java 6+. + Includes fix for Bug#35829 (11748301), build.xml check for java6 should use or instead of and. + + - Charset mappings refactored. + + - Fix for Bug#72712 (18836319), No way to configure Connector JDBC to not do extra queries on connection + +06-09-14 - Version 5.1.31 + + - Fix for Bug#66947 (16004987), Calling ServerPreparedStatement.close() twice corrupts cached statements. + + - Fix for Bug#61213 (18009254), ON DUPLICATE KEY UPDATE breaks generated key list when extended INSERT is used + + - Test cases updated to comply with MySQL 5.7.4 new STRICT_MODE behavior and no longer supported IGNORE clause in + ALTER TABLE statement. + + - Added support for sha256_password authentication with RSA encryption. + + - Fix for Bug#71753 (18260918), Bad SSL socket transform. + + - Added tests for changes in GET DIAGNOSTIC syntax introduced in MySQL 5.7.0. + + - Fix for Bug#67803 (16708231), XA commands sent twice to MySQL server. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#55680 (16737192), MySQL Connector/J memory leak + + - Fix for Bug#72326 (18598665), Typo in fullDebug.properties - gatherPerMetrics should be gatherPerfMetrics + + - Fix for Bug#72023 (18403456), Avoid byte array creation in MysqlIO#unpackBinaryResultSetRow. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#72000 (18402873), java.lang.ArrayIndexOutOfBoundsException on java.sql.ResultSet.getInt(String). + + - Fix for Bug#71850 (18318197), init() is called twice on exception interceptors + + - Fix for Bug#72008 (18389973), Avoid useless object creation in StringUtils#getBytes-methods. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#72006 (18403199), Avoid creation of a character array in PreparedStatement$ParseInfo. + Thanks to Andrej Golovnin for his contribution. + Additionally, unneeded StringBuffer replaced by StringBuilder instances in StringUtils. + + - Fix for Bug#72301 (18549472), Fabric driver swallows exceptions thrown during connection creation using JDBC4 + +03-28-14 - Version 5.1.30 + + - Fix for Bug#71679 (18236388), Avoid iterator creation when invoking statement interceptors in MysqlIO. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#70944 (17831255), community and commercial builds should have the same line number tables + + - Fix for Bug#71861 (18327245), Avoid manual array copy in MysqlIO and LoadBalancingConnectionProxy. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#71623 (18228668), Field#getStringFromBytes() creates useless byte array when using JVM converter. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#71621 (18228302), MysqlXAConnection#xidToString(Xid xid) produces too much garbage. + Thanks to Andrej Golovnin for his contribution. + + - Fix for Bug#67318 (16722637), SQLException thrown on already closed ResultSet. Thanks to Thomas Manville and Andrej Golovnin for their contribution. + + - Fix for Bug#71396 (18110320), setMaxRows (SQL_SELECT_LIMIT) from one query used in later queries (sometimes). + Additionally, SQL_SELECT_LIMIT is no longer sent unnecessarily between consecutive queries. + + - Fix for Bug#71432 (18107621), Key store files not closed when making SSL connection + + - Reserved words lists updated from latest official SQL:92 and SQL:2003 specifications. + + - Fix for Bug#18091639, STRINGINDEXOUTOFBOUNDSEXCEPTION IN PREPAREDSTATEMENT.SETTIMESTAMP WITH 5.6.15 + + - Added Fabric support + +02-10-14 - Version 5.1.29 + + - Fix for Bug#70701 (17647584), DatabaseMetaData.getSQLKeywords() doesn't match MySQL 5.6 reserved words. + + - Fix for Bug#17435879, REMOVE SRC/LIB-NODIST DIRECTORY FROM LAUNCHPAD DISTRIBUTION. + Additional "com.mysql.jdbc.extra.libs" parameter must be used for ant build. + + - Fix for Bug#71038, Add an option for custom collations detection. + Added new connection property detectCustomCollations=[true|false], with default false. + Please be aware that these changed the previous default behavior and if you use custom charsets or collations + you need to set detectCustomCollations=true. + + - Added tests for new index renaming syntax introduced in 5.7.1. + +12-23-13 - Version 5.1.28 + + - Fix for Bug#69579, DriverManager.setLoginTimeout not honored. + + - Fix for Bug#51313, Escape processing is confused by multiple backslashes. + + - Fix for Bug#55340, initializeResultsMetadataFromCache fails on second call to stored proc. + + - Fix for Bug#70969, Shadow declaration of OperationNotSupportedException in RowDataDynamic. + + - Fix for Bug#70835 (17750877), SQLExceptions thrown because of query interruption (KILL QUERY, query timeout, etc.) + didn't extend java.sql.SQLNonTransientException for JDBC4+ deployments. + + - Fix for Bug#24344 test case, test fails if it's run with UTC timezone settings. + + - Fix for Bug#69777, Setting maxAllowedPacket below 8203 makes blobSendChunkSize negative. + + - Fix for Bug#35115, yearIsDateType=false has no effect on result's column type and class. + + - Fix for Bug#68916 (16691047), closeOnCompletion doesn't work. + + - Fix for Bug #69746 (17164058), ResultSet closed after Statement.close() when dontTrackOpenResources=true + + - Fix for Bug#70842 (17753369), Adding live management of replication host topographies. + +11-04-13 - Version 5.1.27 + + - Fix for Bug#17248345, getFunctionColumns() method returns columns of procedure. + + - Fix for Bug#69290 (16879239), JDBC Table type "SYSTEM TABLE" is used inconsistently. + + - Fix for Bug#68562, Combination rewriteBatchedStatements and useAffectedRows not working as expected. + + - Fix for Bug#69452 (17015673), memory size connection property doesn't support large values well. + + - Added tests for InnoDB full-text search support introduced in 5.6GA. + + - Extended slow query warning with query execution plan for INSERT, REPLACE, UPDATE and DELETE. + + - Added tests for IPv6 functions introduced in 5.6GA. + + - Added support of authentication data up to 2^64-1 bytes. + + - Fix for Bug#38252, ResultSet.absolute(0) is not behaving according to JDBC specification. + + - Fix for Bug#62469, JDBC Authentication Fails with Null Byte in Scramble + + - Fix for Bug#69506, XAER_DUPID error code is not returned when a duplicate XID is offered in Java. + + - Added support for multi-master replication topographies in ReplicationDriver. ReplicationDriver now uses two discrete load-balanced + connections, one each for master and slave connections. The same load-balancing options which apply to load-balanced connections + now also apply to ReplicationConnections. By default, this means that when a ReplicationConnection uses master connections + (because the read-only property of the Connection is false), work may be re-balanced between configured master hosts at transaction + boundaries. As with load-balanced connections, the ReplicationConnection host list may be managed within the JVM (see + com.mysql.jdbc.ReplicationConnectionGroupManager) or optionally via JMX (using replicationEnableJMX configuration option; see + com.mysql.jdbc.jmx.ReplicationGroupManagerMBean). To specify multi-master replication topographies, define each host "type" + property using the following format: + + address=(host=hostname)(port=3306)(type=[master|slave]) + + In the absense of explicit type definitions, the driver will assume a single master listed first, with all subsequently-listed + hosts configured as slaves. + + - Fix for Bug#63354 (16443992), JDBC cannot make new connections if master is down. + + - Fix for Bug#17003626, REGRESSION TEST FAILURE WITH SERVER VERSION 5.7.1 + + - Removed ant-contrib.jar from C/J distribution. + + - Added tests for GIS precise spatial operations introduced in 5.6GA. + + - Fixed META-INF information + + - Fix for Bug#17251955, ARRAYINDEXOUTOFBOUNDSEXCEPTION ON LONG MULTI-BYTE DB/USER NAMES + + - Fix for Bug#50538, DatabaseMetaData.getDriverVersion() contains unexpanded ${bzr.revision-id} + +08-05-13 - Version 5.1.26 + + - Fix for Bug#69298 (16845965), Methods DatabaseMetaData.getProcedures() and DatabaseMetaData.getProcedureColumns(), in JDBC4, + return stored procedure only or both stored procedures and functions metadata information, depending on the value set in the + connection property "getProceduresReturnsFunctions", having default value 'true'. Several fixes in Functions and + Procedures metadata so that consulting I__S and MySQL/DDL returns the same info. + + - Fix for Bug#69308 (16879267), Avoid calling batchedStatement.close() twice, and thus raising and ignoring an undercover SQLException, in methods + PreparedStatement.executeBatchedInserts and PreparedStatement.executePreparedBatchAsMultiStatement. + + - Fix for Bug#68400, useCompression=true and connect to server, zip native method cause out of memory. + CompressedInputStream now does not keep reference to connection. + Thank Dominic Tootell for his investigation, proposed solution and all the help he provided. + + - Fix for Bug#65871, DatabaseMetaData.getColumns() throws an MySQLSyntaxErrorException. + Delimited names of databases and tables are handled correctly now. The edge case is ANSI quoted + identifiers with leading and trailing "`" symbols, for example CREATE DATABASE "`dbname`". Methods + like DatabaseMetaData.getColumns() allow parameters passed both in unquoted and quoted form, + quoted form is not JDBC-compliant but used by third party tools. So when you pass the indentifier + "`dbname`" in unquoted form (`dbname`) driver handles it as quoted by "`" symbol. To handle such + identifiers correctly a new behavior was added to pedantic mode (connection property pedantic=true), + now if it set to true methods like DatabaseMetaData.getColumns() treat all parameters as unquoted. + + - Fix for Bug#45757 (11754192), Don't allow updateRow() to be called when updatable cursor is positioned on insert row. + + - Fix for Bug#68098 (16224299), Return indexes sorted by NON_UNIQUE, TYPE, INDEX_NAME, and ORDINAL_POSITION in DatabaseMetaData.getIndexInfo. + + - Fix for Bug#68307 (16707803), Return correct COLUMN_TYPE from both getProcedureColumns() and getFunctionColumns(). + + - Fix for Bug#42267, PreparedStatementWrapper doesn't have a toString() implementation + + - Fix for Bug#44451 (11753081), Added missing fields in methods getColumns(), getProcedureColumns(), getTables() and getUDTs(). + Methods getClientInfoProperties() and getFunctions() were made available in all *DatabaseMetaDataUsingInfoSchema implementations. + +05-06-13 - Version 5.1.25 + + - Fix for Bug#68801, java webstart mysql-connector-java lib calls -bin library. + + - Fix for Bug#16426462, SyntaxRegressionTest failing on C/J 5.1.24 against MySQL 5.6.10 + + - Fix for Bug#60816, Cannot pass NULL to an INOUT procedure parameter. + + - Added support for Connection Attributes when used with MySQL Server versions (5.6+) which support this feature. + By default, the following standard attributes are sent to the server, where they can be seen in the + performance_schema.session_connect_attrs table: + * _client_version : the version of MySQL Connector Java in use + * _client_name : "MySQL Connector Java" + * _runtime_version : the version of the Java runtime environment in which the driver is running + * _runtime_vendor : the name of company which produced the Java runtime environment + Additionally, users may supply their own key/value attributes to be exposed by providing them in + "key1:value1,key2:value2" format in the connectionAttributes connection property. + To avoid sending any connection attributes to the server, set connectionAttributes property to "none". + + - Fix for Bug#68763 (16545334), ReplicationConnection.isMasterConnection() returns false always. + + - Fix for Bug#68733 (16526938), ReplicationConnection doesn't ping all slaves. + + - Fix for Bug#68556, Tomcat can't stop a cleanup thread by clearReferencesStopThreads. + + - Fix for Bug#16436511, getDriverName() returns a string with company name "MySQL-AB". Driver name changed to "MySQL Connector Java". + + - Fix for Bug#68664 (16486957), Enable packaging of .JAR file from Eclipse. + +03-05-13 - Version 5.1.24 + + - Fix for Bug#64204, ResultSet.close hangs if streaming query is killed. + + - Fix for Bug#16224249, Deadlock on concurrently used LoadBalancedMySQLConnection: + 1) abortInternal() method was moved from com.mysql.jdbc.MySQLConnection to com.mysql.jdbc.Connection interface; + 2) load-balanced/failover proxy now broadcasts abortInternal() to all underlying physical connections; + 3) load-balanced/failover proxy now prevents picking of new physical connection after close() or abortInternal() were called explicitly on proxy; + 4) connection synchronization mutex was refactored, now mutex is proxy instance for proxied connection or connection instance itself if there is no proxy. + + - Fix for Bug#64805, StatementImpl$CancelTask occasionally throws NullPointerExceptions. + + - Fixed typos in descriptions of properties. + + - Fix for Bug#68011, Invalid error message noDatetimeSync property instead of noDatetimeStringSync. + +02-04-13 - Version 5.1.23 + + - Fix for Bug#35653, executeQuery() in Statement.java let "TRUNCATE" queries being executed. "TRUNCATE" and "RENAME" are now filtered for executeQuery(). + + - Fix for Bug#65909, referenceThread causes memory leak in Tomcat. + Abandoned connection cleanup thread was refactored to have static shutdown method. + If you encountered this leak problem, your application should implement context listener with + AbandonedConnectionCleanupThread.shutdown() call in contextDestroyed method. + + For example: + @WebListener + public class YourThreadsListener implements ServletContextListener { + public void contextDestroyed(ServletContextEvent arg0) { + try { + AbandonedConnectionCleanupThread.shutdown(); + } catch (InterruptedException e) { + } + } + ... + } + + Note that if container does not support annotations you should add description to web.xml: + + user.package.YourThreadsListener + + + - Added tests for explicit partition selection syntax introduced in 5.6GA. + + - Added support of password expiration protocol. This introduces new boolean connection property disconnectOnExpiredPasswords. + If disconnectOnExpiredPasswords = true and password expired then connection will be rejected by server with ErrorCode == 1820 (ER_MUST_CHANGE_PASSWORD). + If disconnectOnExpiredPasswords = false then connection will enter to "sandbox" mode, + all commands except SET PASSWORD = ... and SET PASSWORD FOR CURRRENT_USER() = ... will cause an error to be thrown. + + - Added tests for EXCHANGE PARTITION syntax introduced in 5.6GA. + + - Added tests for transportable tablespaces syntax introduced in 5.6GA. + + - Added tests for CREATE TABLE syntax changed in 5.6GA: CREATE TABLE ... DATA DIRECTORY = 'absolute/path/to/directory/' + + - Added tests for ALTER TABLE syntax changed in 5.6GA: ALGORITHM and LOCK keywords. + + - Fix for Bug#67954, stack trace used for point-of-origin in log and exception messages + causes permgen leak with webapp classloader on application redeploy. We no longer store the entire + stack trace, only the calling class and method, and even then, that only when using the usage advisor + or when profiling. + + - Fix for Bug#11237, useCompression=true and LOAD DATA LOCAL INFILE SQL Command. + + - Static charset/collation maps were updated. + + - Fix for Bug#14260352, difference in Timestamp value returned with rewriteBatchedStatements=true. + + - Fix for Bug#60598, nativeSQL() truncates fractional seconds. + + - Fix for Bug#40279, Timestamp values get truncated when passed as prepared statement parameters. + This was partly fixed in 5.1.19 but that fix did not cover useLegacyDatetimeCode=true case. + + - Fix for Bug#14665141, Diff results returned from ResultSet and CachedRowSet with new password hashing. + Test suite modified to don't perform comparison of PASSWORD() results if old_passwords=2 + because with SHA-256 password hashing enabled they are nondeterministic. + + - The driver now allows the mechanism for caching MySQL server configuration values replaceable at runtime, + via the "serverConfigCacheFactory" property. The default is an implementation that is a per-VM concurrent + map, keyed by URL. The driver will invalidate cache entries when SQLExceptions that indicate communications + errors are thrown (on the assumption that the server has been or is restarting), or if the server version + that is being connected to, differs from the one that was present when the cached values were populated. + + To replace the default implementation, implement CacheAdapterFactory>, and + use the fully-qualified class name of this implementation for "serverConfigCacheFactory". + + - Connection.setReadOnly() will take advantage of server-side support for read-only transactions + present in MySQL-5.6 and newer. Calling .isReadOnly() will incur a round-trip if useLocalSessionState + is not enabled. + +09-06-12 - Version 5.1.22 + - Fix for Bug#57662, Incorrect Query Duration When useNanosForElapsedTime Enabled. + + - Fix for Bug#65503, ResultSets created by PreparedStatement.getGeneratedKeys() are not close()d. + + - Fix for Bug#63800, getVersionColumns() does not return timestamp fields; always empty. + Added support of ON UPDATE CURRENT_TIMESTAMP for TIMESTAMP and DATETIME fields. + + - Fix for Bug#41752, Can't connect mysqld which character_set_server=ucs2. + + - Fix for Bug#65508, getCharsetNameForIndex() should be faster. + + - Fix for Bug#14563127, Load-balanced connection fails to select valid host, closes connection + on re-balance. + +07-05-12 - Version 5.1.21 + - Added new built-in authentication plugin com.mysql.jdbc.authentication.Sha256PasswordPlugin + ("sha256_password"). + + - Fix for Bug#64731, StringUtils.getBytesWrapped throws StringIndexOutOfBoundsException. + + - Added new built-in authentication plugin com.mysql.jdbc.authentication.MysqlClearPasswordPlugin + ("mysql_clear_password"). It allows C/J based clients to connect to MySQL accounts which use + PAM authentication for example. SSL connection required for this authentication method. + If SSL is not enabled then authentication which requires "mysql_clear_password" will lead to an error. + + - Fix for Bug#13980303, Auth plugin's confidentiality requirements are not checked after Auth Switch Request. + + - Fix for Bug#64205, Connected through Connector/J 5.1 to MySQL 5.5, the error message is garbled. + + - Fix for Bug#37931, Null Pointer Exception Thrown When specifying invalid character_set_results enc. + + - Fix for Bug#36662, TimeUtil.java: MEST mapping n/a. + + - Fix a scalability/memory footprint issue where Object.finalize() was being used on + ConnectionImpl to clean up the low-level network connection to MySQL should a + connection be abandoned by the application before being cleanly close()d. We now + track connections in a phantom reference queue, and have a single thread per-vm + clean these up when the VM notices the connection is no longer referenced by + anything else. + + - Added the ability to add new client-side prepared statement parse info caches by + implementing com.mysql.jdbc.CacheAdapterFactory and telling the driver to use it + when "cachePrepStmts=true" via the "parseInfoCacheFactory" configuration property. + + - Implemented JDBC-4.1 methods from Java-7: + + - Connection.setSchema(String) - no-op, until we support database==schema in the driver + - Connection.getSchema() - see above + - Connection.abort(Executor executor) + - Connection.setNetworkTimeout(Executor, int) + - Connection.getNetworkTimeout() throws SQLException; + - CallableStatement.getObject(int, Class) + - CallableStatement.getObject(String, Class) + - DBMD.getPseudoColumns() - returns an empty result set + - DBMD.generatedKeyAlwaysReturned() - always true for MySQL + - ResultSet.getObject(int, Class) + - ResultSet.getObject(String, Class) + - Statement.closeOnCompletion() + - Statement.isCloseOnCompletion() + +05-02-12 - Version 5.1.20 + - Fix for Bug#64983, 5.1.19 not working with JBoss AS 4.2.3.GA. + + - Fix for Bug#13960556, java.lang.StringIndexOutOfBoundsException in com.mysql.jdbc.PreparedStatement.formatNanos(int nanos). + + - Fix for pluggable authentication tests to run on Windows. + + - Fix for Bug#13897714, NPE in testsuite.regression.StatementRegressionTest.testBug1933() with 5.6.5_m8 server. + + - Fix for Bug#55962, Savepoint identifier is occasionally considered as floating point numbers. + + - Fix for Bug#13955027, SET OPTION syntax was removed starting from 5.6.5 server version. + + - Fix for Bug#13958793, ClassCastException in ConnectionImpl.buildCollationMapping() with 4.1 server. + + - Fix for Bug#36478, Client prepared statement bugged if word 'limit' included in the query. + +04-02-12 - Version 5.1.19 + - Fix for Bug#64621, setMaxRows was not correctly processed during CS PS metadata + collection causing entire resultset to be fetched and possibly leading to OOM. + + - Fix for Bug#63456, MetaData precision is different when using UTF8 or Latin1 tables. + The problem was in finding maxBytesPerChar through versioned mapping from Java charset to MySQL charset. + That map returns "utf8mb4" instead "utf8" for server versions starting with 5.5.2. + CharsetMapping, ConnectionImpl and Field have been reorganized to use static maps INDEX_TO_MYSQL_CHARSET, + STATIC_CHARSET_TO_NUM_BYTES_MAP instead. Also dynamic maps ConnectionImpl.indexToCustomMysqlCharset + and ConnectionImpl.mysqlCharsetToCustomMblen have been added for custom charsets. + + - Added support for pluggable authentication via the com.mysql.jdbc.AuthenticationPlugin + interface (which extends standard "extension" interface). Examples are in + com/mysql/jdbc/authentication and in testsuite.regression.ConnectionRegressionTest. + This introduces three new properties: + + authenticationPlugins defines comma-delimited list of classes that implement + com.mysql.jdbc.AuthenticationPlugin and which will be used for authentication + unless disabled by "disabledAuthenticationPlugins" property. + + disabledAuthenticationPlugins defines comma-delimited list of classes implementing + com.mysql.jdbc.AuthenticationPlugin or mechanisms, i.e. "mysql_native_password". + The authentication plugins or mechanisms listed will not be used for authentication + which will fail if it requires one of them. It is an error to disable the default + authentication plugin (either the one named by "defaultAuthenticationPlugin" property + or the hard-coded one if "defaultAuthenticationPlugin" propery is not set). + + defaultAuthenticationPlugin defines name of a class implementing + com.mysql.jdbc.AuthenticationPlugin which will be used as the default authentication + plugin. It is an error to use a class which is not listed in "authenticationPlugins" + nor it is one of the built-in plugins. It is an error to set as default a plugin + which was disabled with "disabledAuthenticationPlugins" property. It is an error + to set this value to null or the empty string (i.e. there must be at least a valid + default authentication plugin specified for the connection, meeting all constraints + listed above). + + - Fix for Bug#63526. The problem happens in com.mysql.jdbc.EscapeProcessor#escapeSQL. The function recognizes the string in the create table statement as an escape sequence (line 136+138). The "if" construct beginning in line 182 tries to match a white-space collapsed version of the string to prefixes for valid jdbc-escapes (till line 300). Since no matching escape sequence is found and no "else" clause is defined, neither the token, nor replacement are added to the resulting escaped SQL string. + + - Fix for Bug#61203, noAccessToProcedureBodies does not work anymore. + + - Fix for Bug#63811, pointless Socket.bind() when using ephemeral ports and interfaces, which limits scalability on some platforms. + + - Connection.changeUser() would not check for closed connections, leading to NPEs when this method was called on a closed connection. + + - Fix for Bug#63284, memory leak with Failover proxied Statement/PreparedStatement with DBCP due to improper implementation of equals(). + + - Prepared statements would needlessly allocate a 4K buffer for converting + streams when no set*Stream() methods had been used. + +10-03-11 - Version 5.1.18 + + - Fix for Bug#12565726, not putting the space between VALUES() and ON DUPLICATE KEY UPDATE + causes C/J a) enter rewriting the query although it has ON UPDATE + and b) to generate the wrong query with multiple ON DUPLICATE KEY + + - Fix for Bug#12784170, "process fork failure" errors while running test suite via ant on Windows. + Added new ant flag, com.mysql.jdbc.junit.fork, which controls whether JUnit will fork new processes + for testing ("on", default and legacy behavior) or not ("off", required for Windows). + + - Reverting changes made to ConnectionImpl.java, + private boolean characterSetNamesMatches function. + + - Added function MYSQL_INDEX_TO_MYSQL_CHARSET to retrieve server charset name + using index instead of parsing variables to CharsetMapping.java. + + - Completed fix for Bug#61201/12649557, fixed tests failures. + + - Fix for Bug#61201/12649557, Can't establish connection when url has + sessionVariables and characterEncoding. Fix covers only MySQL server 4.1+ + + - Fix for Bug#61501 - Calling Statement.cancel() on a statement that isn't + currently executing will cause some later-executed query on the same + connection to be cancelled unexpectedly. The driver now guards against this + condition, but it is an underlying server issue. The MySQL statement "KILL QUERY" + (which is what the driver uses to implement Statement.cancel()) is rather + non-deterministic, and thus the use of Statement.cancel() should be avoided + if possible. + + - Fix for Bug#61866/12791594 - Calling Statement.getWarnings() after + Statement.clearWarnings() has been called, returns the "old" warnings. + + - Fix for Bug#13036537 - LRUCache was really a least-recently-added cache. + + - Fix for Bug#13036309, Correcting parameter name in maxPerformance.properties. + + +07-04-11 - Version 5.1.17 + + - Fix for Bug#61332 - LIKE not optimized in server when run against I__S tables and no wildcards used. + Databases/tables with "_" and/or "%" in their names (escaped or not) will be handled by this code path, + although slower, since it's rare to find these characters in table names in SQL. If there's a "_" or "%" + in the string, LIKE will take care of that, otherwise we now use = . The only exception is + information_schema database which is handled separately. Patch covers both getTables() and getColumns(). + + - Fix for Bug#61150 - First call to stored procedure fails with "No Database Selected". + The workaround introduced in DatabaseMetaData.getCallStmtParameterTypes to fix + the bug in server where SHOW CREATE PROCEDURE was not respecting lower-case table names + is misbehaving when connection is not attached to database and on non-casesensitive OS. + + - Fix for Bug#61105 - Avoid a concurrent bottleneck in Java's character set + encoding/decoding when converting bytes to/from Strings. + +04-21-11 - Version 5.1.16 + + - Partial fix for BUG#54135 - setQueryTimeout unsafe across VIP. Fix prevents c/J from + killing the right ConnectionID but on wrong server. + + - Fix for BUG#57808 - wasNull not set for DATE field with value 0000-00-00 + in getDate() although zeroDateTimeBehavior is convertToNull. + + - Fix for Bug#54425 - Bypassing the server protocol bug where DB should be null-terminated + whether it exists or not. Affects COM_CHANGE_USER. + + - Fix for Bug#60313 (11890729), bug in + com.mysql.jdbc.ResultSetRow.getTimestampFast(). + + - Fix for bug 11782297, DBMD.getTables (so thus getColumns too) fails with + table names containing dot (like "junk_[Sp:e,c/ C-h+a=.r]"). + + - Added the ability to determine if the connection is against a server on the + same host via the Connection.isServerLocal() method. + + - Fix for bug 12325877, Setting "autoReconnect=true" and + "cacheServerConfiguration=true" would cause connections created after + an existing connection fails to have non-existent values for server + variables which lead to exceeding of max allowed packet exceptions when the + new connections were used. + +02-08-11 - Version 5.1.15 + + - Fix for Bug#38367, parameters metadata did not reflect the fact that NULL is allowed + parameter value. So DatabaseMetaData.getProcedureColumns will set isNullable member to + java.sql.DatabaseMetaData.procedureNullable now. + + - Completed fix for Bug#27916. + + - Fix for Bug#59224, adding 5.5 reserved words to DatabaseMetaData.getSQLKeywords(). + + - Fixed an issue where statement comments set via Connection.setStatementComment() + weren't represented in autoGenerateTestcaseScript=true output. + + - Added ability to include the current java thread dump in the exception message + given for deadlock/wait lock timeout exceptions, enable with + "includeThreadDumpInDeadlockExceptions=true" in your JDBC url. + + - Added ability to include current thread name as a statement comment visible + in MySQL's "SHOW PROCESSLIST" and Innodb deadlock diagnostics, enable with + "includeThreadNamesAsStatementComment=true". + + - Added an SLF4J WorkoutDatesUpdater.logging adapter. Enable by adding setting the connection + property "logger" to "Slf4JLogger" and placing the appropriate bridge + from SLF4J to the WorkoutDatesUpdater.logging framework of choice in your CLASSPATH. As with + other Connector/J WorkoutDatesUpdater.logging adapters, the log category name used by the + driver is "MySQL". See http://www.slf4j.org/manual.html for more details. + +12-06-10 - Version 5.1.14 + + - Fix for Bug#58728, NPE in com.mysql.jdbc.jdbc2.optional.StatementWrappe.getResultSet() + if rs is null. Regression test case added to Statement regression tests. + + - Fix for Bug#58751, DatabaseMetadata.getIndexInfo() CARDINALITY now clamped + to Integer.MAX_VALUE. + + - Fix for BUG#58590 + - Testsuite.Simple.DateTest, MetadataTest, NumbersTest and StatementsTest cleaned and fixed. + + - Testsuite.simple, ConenctionTest & DataSourceTest are up to date. Major rework on + ConnectionTest.testDeadlockDetection (Sveta) and testUseCompress. + + - Testsuite.simple, CallableStatementTest & CharsetTests are up to date. + + - Testsuite.regression SubqueriesRegressionTest and StringRegressionTest are up to date. + + - Testsuite.regression MicroPerformanceRegressionTest, NumbersRegressionTest, PooledConnectionRegressionTest, + ResultSetRegressionTest are up to date. + + - Testsuite.regression.MetaDataRegressionTest up to date. + + - Typo in StatementRegressionTest.testLikeWithBackslashes fixed. StatementRegressionTest + is up to date. + + - Fix for Bug#58232 - CallableStatement fails to fetch OUT parameter against 5.5 server + + - Testsuite.regression.Connection, tests for BUG#45419 refined by Todd so not to cause failures. + + - Testsuite.regression.CallableStatement, tests for BUG#26959 failing against 5.5+ server. + + - Bringing testsuite.regression.CachedRowsetTest up to date. + + - Bringing BLOBregression tests up to date. + + - Fix for Bug#58042 - Statements test failure not handled. + + - Fix for Bug#57850 - Refresh SELECT statement doesn't use correct data type. + Added Field.valueNeedsQuoting (private final boolean) and protected boolean getvalueNeedsQuoting(). + UpdatableResultSet refresher and updater call upon this value now. + + - Removing commented source in fix for Bug#57697 + - Fix for Bug#57697 - Metadata getTables() was not checking for table_name already been quoted. + - Fix for Bug#57694 - 3byte UTF8 can not be used with 5.5.3+ server. + - Fix for Bug#57701 - StatementsTest.testBatchRewriteErrors() failing on new servers. + + - Fix for Bug#54756 - Cannot retrieve data from ResultSet by column name from a Sphinx daemon. + We were relying only on "server version string" passed. Now, determining + server version is done via protocol flags too, where applicable. + + - Fix for Bug#57022 - cannot execute a store procedure with output parameters, + database parameter was ignored in db.sp notation. The fix is to "sanitize" + db.sp call just like in patch for noAccessToProcedureBodies. BaseTestCase + extended with createDatabase and dropDatabase. Regression test added. + + - Fix for Bug#57262 - "useOldUTF8Behavior" behavior was broken since 5.1.3, + now explicitly sets connection character set to latin1 ("SET NAMES latin1") + during connection post-handshake process. + + - Patch for problem where "noAccessToProcedureBodies=true" was causing + "underprivileged" user not to have access to procedures created by him. + + - Patch for Bug#56305, unhandled NPE in DatabaseMetaData.java when calling + wrong-cased function without access to mysql.proc. Although simple by + itself, some more enhancements were needed for everything to function + properly. So, along with catching potential NPE due to server bug, a + guard against calling JDBC functions with db_name.proc_name notation was + also added. Necessary changes added to StringUtils.java too. + + - Added ability to load-balance while auto-commit is enabled. This + introduces two new properties: + + loadBalanceAutoCommitStatementThreshold defines the number of matching + statements which will trigger the driver to (potentially) swap physical + server connections, + + loadBalanceAutoCommitStatementRegex defines the regular expression + against which statements must match. The default values (0 and blank, + respectively) retain the previously-established behavior that + connections with auto-commit enabled are never balanced. Feature + request documented in Bug#55723. + + - Minor fix in getProcedureColumns() DisplaySize for Bug#51712. Fix for + Bug#41269 is not complete without this. getColumnDisplaySize on a + ResultSet already consisting of metadata is now functional thanks to + Bogdan. + + - Minor fix for Bug#55217, return 4 as a result of DataBaseMetadata.getJDBCMajorVersion() as per manual. + + - Added support for hosts specified in the URL of the form: + address=(key=value), supported keys are: + + (protocol=tcp or pipe (for named pipes on Windows) + (path=[] for named pipes) + (host=[]) for TCP connections + (port=[]) for TCP connections + + An example would be: + + jdbc:mysql://address=(protocol=tcp)(host=localhost)(port=3306)(user=test)/db + + Any other parameters are treated as host-specific properties that follow + the conventions of the JDBC URL properties. This now allows per-host + overrides of any configuration property for multi-host connections + (failover, loadbalance, replication). We do recommend that the overrides + are limited to user, password, network timeouts and statement and + metadata cache sizes. Unexpected behavior may be observed with other + per-host overrides. + + - Fix for Bug#56099 - Added support for JDBC4-specific functionality when + using load-balanced connections. + + - Fix for Bug#56200 - Added diagnostic information to SQLException message + thrown when a closed load-balanced connection is reused. This + information will identify the conditions which caused the connection to + be closed. + + - Fix for Bug#56429 - When using Connector/J configured for failover + (jdbc:mysql://host1,host2,... URLs), the non-primary servers re-balance + and spawned new idle connections when the transactions on the master were + committed or rolled-back, eventually exceeding max_connections. It was + also discovered that session state (autocommit, isolation level, catalog) + wasn't being copied from the primary connection to secondary + connections correctly because of the same changes that caused this bug, + and this was fixed as well. + + - Fix for Bug#56706 - Ensure read-only state is synchronized when new + load-balanced connections are selected. + + - Fixed Bug#56955 - Connection properties "trustCertificateKeyStoreType" + and "clientCertificateKeyStoreType" have invalid defaults, therefore + connections that specify "useSSL" will sometimes fail with exceptions + from JSSE unless "JKS" has been specified for both of these properties. + The default value for these properties is now "JKS", and thus it no + longer has to be specified. + + - Fixed Bug#56979 - Improper connection closing logic leads to TIME_WAIT + sockets on server + + - Fixed Bug#57380 - DatabaseMetaData.supportsMultipleResultSets() now returns + true when connected to a 4.1 version or later server. + + - Fixed Bug#58706 - Failover connections didn't honor "failOverReadOnly=false", and in some + situations would not fall back. + + - Removed WorkoutDatesUpdater.logging integrations with log4j and apache-commons-WorkoutDatesUpdater.logging due to license + incompatibility. Replacing with SLF4J integration in next release. + +06-24-10 - Version 5.1.13 + + - Minor fix in previous patch for Bug#51904. Function ConnectionImpl.setCatalog() was passed quoted argument thus breaking with "...for the right syntax to use near 'test``'" + + - Fix for Bug#51912 - Passing NULL as cat. param to getProcedureColumns with !nullCatalogMeansCurrent + + - Fix for Bug#52167 - Can't parse parameter list with special characters inside + + - Fix for Bug#51904 - getProcedureColumns() always returns PROCEDURE_CAT result column as NULL + + - Fix for Bug#51712 - Display Size is always 0 for columns returned by getProcedureColumns() + + - Fix for Bug#51908 - db variable might have end up unassigned when calling + getProcedureColumns()/Functions(). This is a followup on code changes made + for Bug#51022. + + - Fixed Bug#51266 - jdbc:mysql:loadbalance:// would stick to the first + host in the list in some cases, especially exacerbated if the host was + down. + + - Replaced URLs of the form jdbc:mysql://host-1,host-2 with a composite of + a normal connection and a jdbc:mysql:loadbalance:// connection for more + robustness and cleaner code. + + - Fixed BUG#51643 - Connections using jdbc:mysql:loadbalance:// would + have statements (and prepared statements) that did not have their connections + changed upon commit()/rollback(), and thus applications that held statement + instances past commit()/rollback() could have data written to or read from + un-intended connections. + + - Fixed BUG#51666 - StatementInterceptors were never "un-safed" after connection + establishment, causing interceptors which returned result sets pre/post execution + would not work. + + - Fixed BUG#51783 - Load-balanced connections could throw a SQLException + incorrectly on commit() or rollback(). This was not caused by failures in commit + or rollback, but rather by the possibility that the newly-selected physical + connection was stale. Added logic to catch and retry if this happens, up to + the number of hosts specified for load-balancing. Also added new property, + loadBalanceValidateConnectionOnSwapServer, which controls whether to explicitly + ping the selected host (otherwise, the host is presumed to be up, and will only + be noticed if auto-commit or transaction isolation state needs to be set and + fails). + + - Added loadBalancePingTimeout property to allow a specific timeout to be set + for each ping executed against the servers. This ping is executed when the + physical connections are rebalanced (commit/rollback or communication exception), + or when a query starting with (exactly) "/* ping */" is executed. The latter + causes each open underlying physical connection to be pinged. + + - Fixed BUG#51776 - Connection.rollback() could swallow exceptions incorrectly. + + - Fixed BUG#52231 - Differences in definitions of which SQLExceptions trigger + a failover event could result in failure to try more than a single host in + certain situations. + + - Fixed BUG#52534 - Performance regression using load-balanced connection. + + - More aggressively purge the statement timeout timers after they've been cancelled to + trade time for memory. This purge only happens if statement timeouts are in use. + + - Added management of running load-balanced connections. Statistics can be obtained, + and hosts added/dropped via com.mysql.jdbc.ConnectionGroupManager or the JMX + implementation. This functionality is enabled by setting the new paramenter, + loadBalanceConnectionGroup to the name of the logical grouping of connections. + All load-balanced connections sharing the same loadBalanceConnectionGroup value, + regardless of how the application creates them, will be managed together. To + enable JMX-based management, set loadBalanceEnableJMX=true and ensure that remote + JMX is enabled in the JRE (eg, use -Dcom.sun.management.jmxremote). + + - Added loadBalanceExceptionChecker property, which takes a fully-qualified class + name implementing com.mysql.jdbc.LoadBalancedExceptionChecker interface. This + allows custom evaluation of SQLExceptions thrown to determine whether they should + trigger failover to an alternate host in load-balanced deployments. The default + is com.mysql.jdbc.StandardLoadBalanceExceptionChecker. + + - Added two new properties which allow more flexibility in determining which + SQLExceptions should trigger failover in a load-balanced deployment. The new + loadBalanceSQLStateFailover property takes a comma-delimited list of SQLState + codes which are compared to the SQLState of the SQLException (matching done + with trailing wildcard), while loadBalanceSQLExceptionSubclassFailover takes + a comma-delimited list of fully-qualified class/interface names, against + which the SQLException is checked to determine if it is an instance of any. + Matches trigger failover to an alternate host. + + - Fixed Bug#51704 - Re-written batched statements don't honor escape processing + flag of their creator. + + - Fixed Bug#43576 - Sometimes not able to register OUT parameters for + CallableStatements. + + - Fixed Bug#54175 - Driver doesn't support utf8mb4 for servers 5.5.2 and newer. The + driver now auto-detects servers configured with character_set_server=utf8mb4 or + treats the Java encoding "utf-8" passed via "characterEncoding=..." as utf8mb4 in + the "SET NAMES=" calls it makes when establishing the connection. + +02-18-10 - Version 5.1.12 + + - NO_INDEX_USED and NO_GOOD_INDEX used were only being set when profileSQL + was set to "true", and in some cases their values were reversed. + + - Fix for Bug#51022 - conn.getMetaData().getProcedures("schema",null,"%"); + returns all stored procedures from all databases and not only for given + one. + + - Fixed Bug#50538 - ${svn.revno} shows up in DBMD.getDriverVersion(). + + - Removed usage of timestamp nanoseconds in PreparedStatement.setTimestamp(), + as long as Bug#50774 exists in the server and there's no real support + for nanos/micros in TIMESTAMPs, avoid the performance regression usage of + them causes. + + +01-20-10 - Version 5.1.11 + + - Fix for BUG#50288 - NullPointerException possible during invalidateCurrentConnection() for load-balanced + connections. + + - Fix for BUG#49745 - deleteRow() for updatable result sets can cause full table scan because escaped hex + values are used for primary key identifiers. + + - Fix for BUG#49607 - Provide Connection context in ExceptionInterceptor. + + - Fix for BUG#48605 - Ping leaves closed connections in liveConnections, causing subsequent Exceptions when + that connection is used. + + - Fix for BUG#48442 - Load-balanced Connection object returns inconsistent results for hashCode() and equals() + dependent upon state of underlying connections. + + - Fix for BUG#48172 - Batch rewrite requires space immediately after "VALUES" + + - Statement Interceptors didn't completely intercept server-side prepared statements. + + - Fix for BUG#48486 Cannot use load balanced connections with MysqlConnectionPoolDataSource. + + - Fix for Bug#32525 - "noDatetimeStringSync" doesn't work for server-side prepared statements. Now it does. + + - Hooked up exception interceptors so they get called now. + + - Rev'd the statement interceptor interface to pass on some server flags, warning counts and errors. See + the com.mysql.jdbc.StatementInteceptorsV2 interface for more details. The driver will create adaptors to + transparently convert older implementations to the newer interface at runtime. + + - Statement Interceptors are now enabled at connection instantiation, but + can not return result sets (they will be ignored) until the connection + has bootstrapped itself. If during the init() method your interceptor + requires access to the connection itself, it should ensure that methods + that might throw exceptions if the connection is closed should handle + this in a robust manner. + + - "Replication" connections (those with URLs that start with + jdbc:mysql:replication) now use a jdbc:mysql:loadbalance connection + under the hood for the slave "pool". This also means that one can set + load balancing properties such as "loadBalanceBlacklistTimeout" and + "loadBalanceStrategy" to choose a mechanism for balancing the load and + failover/fault tolerance strategy for the slave pool. This work was done + in order to fix Bug#49537. + + - Fixed Bug#36565 - permgen leak from java.util.Timer. Unfortunately no great + fix exists that lets us keep the timer shared amongst connection instances, so + instead it's lazily created if need be per-instance, and torn down when the + connection is closed. + + - Fixed BUG#49700 - Connections from ConnectionPoolDataSource don't + maintain any values set with "sesssionVariables=...". This was a bug + in Connection.changeUser()/resetServerState(), we now resubmit the + session variables during the execution of these methods. + +09-22-09 - Version 5.1.10 + + - Fix for BUG#47494 - Non standard port numbers in the URL are not honored. + +09-16-09 - Version 5.1.9 + + - The driver has been OSGi-ified. The bundle symbolic name is "com.mysql.jdbc", see META-INF/MANIFEST.MF to see + what interfaces we export. + + - Fixed BUG#45040, adding missing tags from SVN import to BZR branch for + 5.1. + + - Fix for a variant of Bug#41484 - ResultSet.find*(String) failed when using cached result set + metadata. + + - Fixed BUG#46637 - When the driver encounters an error condition that causes it to create a + CommunicationsException, it tries to build a friendly error message that helps diagnose + what is wrong. However, if there has been no network packets received from the server, + the error message contains bogus information like: + + "The last packet successfully received from the server was 1,249,932,468,916 milliseconds ago. + The last packet sent successfully to the server was 0 milliseconds ago." + + Now the error message states that it has never received any packets from the server in this + scenario. + + - Added a new option, "queryTimeoutKillsConnection", when set to "true" will cause timeouts set + by Statement.setQueryTimeout() to forcibly kill the connection, not just the query. + + - Fixed BUG#32216, "PORT" property filled in by Driver.parseURL() not always present. The driver + will now always fill in the "PORT" (using 3306 if not specified) property, and the "HOST" property + (using "localhost" if not specified) when parseURL() is called. The driver also parses a list of hosts + into HOST.n and PORT.n properties as well as adding a property "NUM_HOSTS" for the number of hosts + it has found. If a list of hosts is passed to the driver, "HOST" and "PORT" will be set to the + values given by "HOST.1" and "PORT.1" respectively. This change has centralized and cleaned up a large + swath of code used to generate lists of hosts, both for load-balanced and fault tolerant connections and + their tests. + + - Fixed the ResultSet side of BUG#23584 - Calendar discared when retrieving dates from server-side prepared + statements. The other cases of this bug were fixed when "useLegacyDatetimeCode=false" became the default. + + - Fixed Bug#44324 - Data truncation exceptions did not return the vendor error code from the server. Note that + the vendor error code is not hard-coded to 1265 as in the bug report, because the server returns different + error codes for different types of truncations, and we did not want to mask those. + + - Fixed Bug#27431 - ResultSet.deleteRow() advances the cursor. The driver now places the cursor on the prior + row in the result set, or before the start of the result set if the result set is empty after the deletion. + + - Fixed Bug#43759 - ResultSet.deleteRow() generates corrupt DELETE statement for primary keys with binary + data. + + - Fixed Bug#46925 - Suspendable XA connections were not pinned to the XID for the global transaction, leading + to failure when attempting to suspend/resume/commit from different logical XA connections. + + - Fixed Bug#44508 - DatabaseMetadata.getSuperTypes() returns result set with incorrect column names. + + - Fixed Bug#46788 - Batched prepared statements with ON DUPLICATE KEY UPDATE are rewritten incorrectly when + when there are parameters as part of the UPDATE clause. Statements of this form can not be rewritten + as multi-value INSERTs so they are rewritten into multi-statements instead. + +07-16-09 - Version 5.1.8 + - Fixed BUG#44588 - Fixed error message for connection exceptions when + streaming result sets are used. + + - Modified/fixed test cases using UnreliableSocketFactory. + + - Fixed BUG#43421 - Made doPing() global blacklist-aware, so that it does not + throw Exceptions when at least a single load-balanced server is available. + + - Fixed BUG#43071 - Specifying ASCII encoding for converting seed String to + byte array; allowing system default encoding to be used causes auth failures + on EBCDIC platforms. + + - Fixed BUG#43070 - traceProtocol parameter isn't configured early enough to + capture handshake protocol. + + - Fixed BUG#41161 - PreparedStatement.addBatch() doesn't check for all parameters + being set, which leads to a NullPointerException when calling executeBatch() and + rewriting batched statements into multi-value or multi-statement statements. + + - Fixed BUG#42055 - ConcurrentModificationException possible when removing items + from global blacklist. + + - Fixed Bug #42309 - Statement.getGeneratedKeys() returns 2 keys when + using ON DUPLICATE KEY UPDATE + + - Fixed some quoting of substituted parameter issues in localized error messages. + + - Added a version check around getting the variable 'auto_increment_increment' for + servers < 5.0.2, which quiets down a warning message that the driver would log + when connecting to MySQL-4.1 or older. + + - The driver will automatically disable elideSetAutoCommit and useLocalTransactionState + if it detects a MySQL server version older than 6.0.10 with the query cache enabled, due + to Bug#36326 which can cause the server to report bogus transaction state. + + - Fixed a performance regression (Bug#41532) in rewritten batched inserts when "ON DUPLICATE KEY" + was present. + + Fixes include an improvement to token searching in the statement, and the ability for the driver + to rewrite prepared statements that include "ON DUPLICATE KEY UPDATE" into multi-valued inserts as + long as there is no use of LAST_INSERT_ID() in the update clause (as this would render + getGeneratedKey() values incorrect). + + - Fixed Bug#44056 - Statement.getGeneratedKeys() retains result set instances until statement is closed, + thus causing memory leaks for long-lived statements, or statements used in tight loops. + + - Fixed issues with server-side prepared statement batch re-writing caused by the fix to Bug#41532. + Rewriting of batched statements now works the same between normal prepared statements and server-side + prepared statements. + + - Fixed Bug#44862 - getBestRowIdentifier does not return resultset as per JDBC API specifications + + - Fixed Bug#44683 - getVersionColumns does not return resultset as per JDBC API specifications + + - Fixed Bug#44865 - getColumns does not return resultset as per JDBC API specifications + + - Fixed Bug#44868 - getTypeInfo does not return resultset as per JDBC API specifications + + - Fixed Bug#44869 - getIndexInfo does not return resultset as per JDBC API specifications + + - Fixed Bug#44867 - getImportedKeys/exportedKeys/crossReference doesn't have correct type for DEFERRABILITY + + - Fixed Bug#41730 - SQL Injection when using U+00A5 and SJIS + + - Fixed Bug#43196 - Statement.getGeneratedKeys() doesn't return values for UNSIGNED BIGINTS with values > Long.MAX_VALUE. + Unfortunately, because the server doesn't tell clients what TYPE the auto increment value is, the driver can't consistently + return BigIntegers for the result set returned from getGeneratedKeys(), it will only return them if the value is > Long.MAX_VALUE. + If your application needs this consistency, it will need to check the class of the return value from .getObject() on the + ResultSet returned by Statement.getGeneratedKeys() and if it's not a BigInteger, create one based on the java.lang.Long that + is returned. + + - Fixed Bug#38387 - "functionsNeverReturnBlobs=true" now works for SQL functions that return binary/binary collation VAR_STRINGS. + + - Fixed Bug#45171 - Connection.serverPrepareStatement() returns wrong default result set types + + - Fixed Bug #43714 - useInformationSchema with + DatabaseMetaData.getExportedKeys() throws exception + + - Fixed Bug #42253 - multiple escaped quotes cause exception from + EscapeProcessor + + - Fixed Bug #41566 - Quotes within comments not correctly ignored by + statement parser + + - Fixed Bug #41269 - DatabaseMetadata.getProcedureColumns() returns + wrong value for column length + + - Fixed Bug #40439 - Error rewriting batched statement if table name + ends with "values". + + - Fixed Bug #41484 Accessing fields by name after the ResultSet is closed throws + NullPointerException. + + - Fixed Bug #39426 - executeBatch passes most recent PreparedStatement params + to StatementInterceptor + + - Support use of INFORMATION_SCHEMA.PARAMETERS when "useInformationSchema" is set "true" and the view exists + for DatabaseMetaData.getProcedureColumns() and getFunctionColumns(). + + - When "logSlowQueries" is set to "true", and the driver has made a connection to a server that has suport + for the SERVER_QUERY_WAS_SLOW flag in the protocol, the query will be logged if the server indicates the + query has passed the slow query threshold. + + - Added new property, "maxAllowedPacket" to set maximum allowed packet size to + send to server. + +10-22-08 - Version 5.1.7 + - Fixed BUG#33861 - Added global blacklist for LoadBalancingConnectionProxy and + implemented in RandomBalanceStrategy and BestResponseTimeBalanceStrategy. + Added new property, "loadBalanceBlacklistTimeout", to control how long a + server lives in the global blacklist. + + - Fixed BUG#38782 - Possible IndexOutOfBoundsException in random load balancing + strategy. + + - Fixed BUG#39784 - invalidateCurrentConnection() does not manage global blacklist + when handling connection exceptions. + + - Fixed BUG#40031 - Adding support for CallableStatement.execute() to call + stored procedures that are defined as NO SQL or SQL READ DATA when failed + over to a read-only slave with replication driver. + + - Fixed BUG#35170- ResultSet.isAfterLast() doesn't work with for + streaming result sets. + + - Fixed BUG#35199 - Parse error for metadata in stored function. + + - Fixed BUG#35415 - When result set is from views without access to underlying + columns and is opened with CONCUR_UPDATABLE, don't throw SQLExceptions when + checking updatability due to access permissions, instead return + CONCUR_READONLY from getConcurrency. + + - Fixed BUG#35666 - NullPointerException when using "logSlowQueries=true" with + server-side prepared statements enabled. + + - Fixed BUG#35660 - Calling equals() on connections created with "jdbc:mysql:loadbalance:" + URLs did not have the same behavior as "plain" connections. The behavior we use + is the implementation in java.lang.Object, load-balanced connections just happened + to be using a java.lang.reflect.Proxy which required some custom behavior in + equals() to make it work the same as "plain" connections. + + Note that there is no *specified* equals contract for JDBC connections in the + JDBC specification itself, but the test makes sure that our implementation is + at least consistent. + + - Fixed BUG#35810 - Properties set in URLs and then passed to DataSources via setUrl() + did not take effect in certain circumstances. This also fixes related bugs BUG#13261 and + BUG#35753. + + - Fixed BUG#36051 - ResultSet.getTime() won't accept value of '24' for hours component of + a java.sql.Time. + + - Fixed BUG#36830 - DBMD.getColumns() doesn't return correct COLUMN_SIZE for SET columns. The + logic wasn't accounting for the ","s in the column size. + + - Fixed BUG#35610, BUG#35150- ResultSet.findColumn() and ResultSet.get...(String) doesn't allow + column names to be used, and isn't congruent with ResultSetMetadata.getColumnName(). + + By default, we follow the JDBC Specification here, in that the 4.0 behavior + is correct. Calling programs should use ResultSetMetaData.getColumnLabel() to dynamically determine + the correct "name" to pass to ResultSet.findColumn() or ResultSet.get...(String) whether or not the + query specifies an alias via "AS" for the column. ResultSetMetaData.getColumnName() will return the + actual name of the column, if it exists, and this name can *not* be used as input to ResultSet.findColumn() + or ResultSet.get...(String). + + The JDBC-3.0 (and earlier) specification has a bug, but you can get the buggy behavior + (allowing column names *and* labels to be used for ResultSet.findColumn() and get...(String)) by setting + "useColumnNamesInFindColumn" to "true". + + - Fixed BUG#35489 - Prepared statements from pooled connections cause NPE when closed() under JDBC-4.0. + + - Added connection property "useLocalTransactionState" which configures if the driver use the in-transaction + state provided by the MySQL protocol to determine if a commit() or rollback() should actually be sent to the database. + (disabled by default). + + - Use socket timeouts for JDBC-4.0's Connection.isValid(int timeout) instead of timer tasks, for scalability. As a side effect + internally, any communications with the database can use a timeout different than the configured timeout, but this isn't currently + used. + + - The number and position of columns for "SHOW INNODB STATUS" changed in MySQL-5.1, which caused the + "includeInnodbStatusInDeadlockExceptions" feature to not show data about the deadlock. + + - Implemented support of INFORMATION_SCHEMA for DatabaseMetadata.getTables() (views there are available as "SYSTEM TABLE"), and thus + also made INFORMATION_SCHEMA tables available via DatabaseMetadata.getColumns(). + + - Fixed BUG#39352, "INSERT ... ON DUPLICATE KEY UPDATE" doesn't return "0" for un-affected rows. This requires the driver to not + send the "CLIENT_FOUND_ROWS" flag to the server when it connects if the connection property "useAffectedRows" is set to "true", + which breaks JDBC-compliance, but currently there is no other way to get correct return values from the server. + + - Fixed BUG#38747 - ResultSets in "streaming" mode throw an exception when closed when the connection is set as "read-only". + + - Fixed BUG#37570 - Can't use non-latin1 passwords. Added connection property "passwordCharacterEncoding". Leaving this set to + the default value (null), uses the platform character set, which works for ISO8859_1 (i.e. "latin1") passwords. For passwords + in other character encodings, the encoding will have to be specified with this property, as it's not possible for the driver to + auto-detect this. + + - Fixed BUG#39911 - We don't retrieve nanos correctly when -parsing- a string for a TIMESTAMP. MySQL itself doesn't support micros + or nanos in timestamp values, but if they're stored as strings, historically we try and parse the nanos portion as well. + Unfortunately we -interpreted- them as micros. This fix includes correcting that behavior, and setting the milliseconds portion of + such TIMESTAMPs to a correct value as well. + + - Fixed BUG#39962 - ResultSet.findColumn() is slow for applications that call it too often (we're looking at -you- Hibernate). We're + using TreeMaps to get case-insensitive comparisons (required for JDBC compliance), but they can be slower than hash maps, so using the + approach Alex Burgel points out in this bug seems to help. + + - Fixed BUG#39956 - Statement.getGeneratedKeys() doesn't respect the 'auto_increment_increment' value. We now grab the *session-scoped* + value, and use that. Beware that using "cacheServerConfig=true" will cause us to cache this value, so new connections won't see changes + that are applied via something like "init-sql". + + - Fixed BUG#39611 - ReplicationConnection never sends queries to last host in slave list. + + - Fixed BUG#34185 - Statement.getGeneratedKeys() does not raise exception when statement was not + created with Statement.RETURN_GENERATED_KEYS flags. + + - Using autoGenerateTestcaseScript=true now logs all statements, regardless or not if they cause errors when processed by MySQL. + A "clock" value (millis since epoch) was added in the comment that is pre-pended with the idea that it can then be used + when post-processing output to sequence things correctly for a multi-threaded testcase, or to replay the test case with the + correct think times. + +03-06-08 - Version 5.1.6 + + - JDBC-4.0-ized XAConnections and datasources. + + - Fixed BUG#31790 MysqlValidConnectionChecker + doesn't properly handle ReplicationConnection + + - Fixed Bug#20491 - DatabaseMetadata.getColumns() doesn't + return correct column names if connection character set + isn't UTF-8. (There was a server-side component of this that + was fixed late in the 5.0 development cycle, it seems, this + is the last piece that fixes some loose ends in the JDBC + driver). This fix touches *all* metadata information coming + from the MySQL server itself. + + - Fixed MysqlIO.nextRowFast() to only attempt to read server + warning counts and status if talking to a 4.1 or newer server + (fixes a hang when reading data from 4.0 servers). + + - Made profiler event handling extensible via the "profilerEventHandler" + connection property. + + - Fixed Bug#31823 - CallableStatement.setNull() on a stored function would + throw an ArrayIndexOutOfBounds when setting the last parameter to null when calling setNull(). + + - Added SSL-related configuration property "verifyServerCertificate". If set to "false", the driver won't verify + the server's certificate when "useSSL" is set to "true". + + When using this feature, the keystore parameters should be specified by the + "clientCertificateKeyStore*" properties, rather than system properties, as the JSSE doesn't + make it straightforward to have a non-verifying trust store and the "default" key store. + + - Fixed ResultSetMetadata.getColumnName() for result sets returned from + Statement.getGeneratedKeys() - it was returning null instead of + "GENERATED_KEY" as in 5.0.x. + + - More applicable fix for the "random" load balance strategy in the face + of node non-responsive, it re-tries a *different* random node, rather + than waiting for the node to recover (for BUG#31053) + + - Fixed BUG#32577 - no way to store two timestamp/datetime values that happens + over the DST switchover, as the hours end up being the same when sent as + the literal that MySQL requires. + + Note that to get this scenario to work with MySQL (since it doesn't support + per-value timezones), you need to configure your server (or session) to be in UTC, + and tell the driver not to use the legacy date/time code by setting + "useLegacyDatetimeCode" to "false". This will cause the driver to always convert + to/from the server and client timezone consistently. + + This bug fix also fixes BUG#15604, by adding entirely new date/time handling + code that can be switched on by "useLegacyDatetimeCode" being set to "false" as + a JDBC configuration property. For Connector/J 5.1.x, the default is "true", + in trunk and beyond it will be "false" (i.e. the old date/time handling code, warts + and all will be deprecated). + + - Fixed BUG#32877 - Load balancing connection using best response time would incorrectly + "stick" to hosts that were down when the connection was first created. + + We solve this problem with a black list that is used during the picking of new hosts. + If the black list ends up including all configured hosts, the driver will retry for + a configurable number of times (the "retriesAllDown" configuration property, with a default + of 120 times), sleeping 250ms between attempts to pick a new connection. + + We've also went ahead and made the balancing strategy extensible. To create a new strategy, + implement the interface com.mysql.jdbc.BalanceStrategy (which also includes our standard + "extension" interface), and tell the driver to use it by passing in the + class name via the "loadBalanceStrategy" configuration property. + + - Fixed BUG#30508 - ResultSet returned by Statement.getGeneratedKeys() is not closed + automatically when statement that created it is closed. + + - Added two new connection properties, "selfDestructOnPingSecondsLifetime" and + "selfDestructOnPingMaxOperations" designed to control overall connection lifetime + (useful to reclaim resources on the server side) for connection pools that don't have such a + facility. + + The driver will consult the values of these properties when a ping is sent, either through + calling Connection.ping(), issuing the "ping marker" query (any query that starts with + "/* ping */"), or when using JDBC-4.0, calling Connection.isValid(). + + If the connection has issued too many operations, or is too old, the driver will + throw a SQLException with the SQLState of "08S01" at the time of the ping, which + will cause the connection to be invalidated with most pools in use today. + + - Fixed issue where driver could send invalid server-side prepared statement + IDs to the server when the driver was setup to do auto-reconnect as the + connection could get set up enough to start sending queries on one thread, + while the thread that "noticed" the connection was down hasn't completed + re-preparing all of the server-side prepared statements that were open when + the connection died. + + Potentially fixes cause for bug 28934. Potentially fixes other possible race + conditions where one thread that has created a connection "shares" it with other + threads if the connection is reconnected due to auto-reconnect functionality. + + - Fixed BUG#33823 - Public interface ResultSetInternalMethods with reference to + non-public class com.mysql.jdbc.CachedResultSetMetaData. + + - For any SQLException caused by another Throwable, besides dumping the message or stack + trace as a string into the message, set the underlying Throwable as the cause for + the SQLException, making it accessible via getCause(). + + - Fixed BUG#34093 - Statements with batched values do not return correct values for + getGeneratedKeys() when "rewriteBatchedStatements" is set to "true", and the + statement has an "ON DUPLICATE KEY UPDATE" clause. + + - Fixed BUG#31192 - Encoding Issue retrieving serverVersion in MysqlIO in the + method doHandshake when encoding doesn't contain ASCII characters in the "standard" + place (i.e. ebcdic). + + - Fixed issue where META-INF in the binary .jar file wasn't packed correctly, + leading to failure of the JDBC-4.0 SPI mechanism. + + - CallableStatements that aren't really stored procedure or stored function calls can + now be used, for tools such as Oracle JDeveloper ADF that issue statements such as + DDL through CallableStatements. + + - Fixed BUG#34518 - Statements using cursor fetch leaked internal prepared statements + until connection was closed. The internal prepared statement is now held open while + the result set is open, and closed by the result set itself being closed. + + - Fixed BUG#34677 - Blob.truncate() wouldn't take "0" as an argument. + + - CommunicationExceptions now carry information about the last time a packet + was received from the MySQL server, as well as when the last packet was sent + to one, in an effort to make it easier to debug communications errors caused + by network timeouts. + + - Reverted a change to DatabaseMetadata.getColumns() from 5.0, where + getColumns() would report NULL for COLUMN_SIZE for TIME, DATE, DATETIME + and TIMESTAMP types. It now reports the column size, in the + DatabaseMetadata implementations that use "SHOW" commands, and the + INFORMATION_SCHEMA. + + - Fixed Bug#34762 - RowDataStatic does't always set the metadata in + ResultSetRow, which can lead to failures when unpacking DATE, + TIME, DATETIME and TIMESTAMP types when using absolute, relative, + and previous result set navigation methods. + + - Fixed BUG#34703 - Connection.isValid() invalidates connection after + timeout, even if connection is actually valid. + + - Fixed BUG#34194 - ResultSetMetaData.getColumnTypeName() returns + "UNKNOWN" for GEOMETRY type. + + - Fixed BUG#33162 - NullPointerException instead of SQLException + thrown for ResultSet.getTimestamp() when not positioned on a + row. + + - The ConnectionLifecycleInterceptor interface now has callback methods for + transaction initiation (transactionBegun()), and completion + (transactionCompleted()), as reported by the *server* (i.e. + calling Connection.setAutoCommit(false) will not trigger + transactionBegun() being called, however the first statement + which causes a transaction to start on the server will cause + transactionBegun() to be called *after* the statement has been processed + on the server). + + - Fixed Bug#34913 - ResultSet.getTimestamp() returns incorrect + values for month/day of TIMESTAMPs when using server-side + prepared statements (not enabled by default). + + - Fixed BUG#34937 - MysqlConnectionPoolDataSource does not support + ReplicationConnection. Notice that we implemented com.mysql.jdbc.Connection + for ReplicationConnection, however, only accessors from ConnectionProperties + are implemented (not the mutators), and they return values from the currently + active connection. All other methods from com.mysql.jdbc.Connection are + implemented, and operate on the currently active connection, with the exception of + resetServerState() and changeUser(). + + - Connections created with jdbc:mysql:replication:// URLs now force + roundRobinLoadBalance=true on the slaves, and round-robin loadbalancing + now uses a "random" choice to more evenly distribute load across slave + servers, especially in connection pools. Connections that are configured + with "roundRobinLoadBalance=true" no longer set the failover state, + as it's assumed that we're not attempting to fall-back to a master + server. This fixes BUG#34963. + +10-09-07 - Version 5.1.5 + + - Released instead of 5.1.4 to pickup patch for BUG#31053 + from 5.0.8. + +10-09-07 - Version 5.1.4 + + - Added "autoSlowLog" configuration property, overrides + "slowQueryThreshold*" properties, driver determines slow + queries by those that are slower than 5 * stddev of the mean + query time (outside the 96% percentile). + + - Fixed BUG#28256 - When connection is in read-only mode, + queries that are wrapped in parentheses incorrectly identified + as DML. + +09-07-07 - Version 5.1.3 RC + + - Setting "useBlobToStoreUTF8OutsideBMP" to "true" tells the + driver to treat [MEDIUM/LONG/TINY]BLOB columns as [LONG]VARCHAR + columns holding text encoded in UTF-8 that has characters + outside the BMP (4-byte encodings), which MySQL server + can't handle natively. + + Set "utf8OutsideBmpExcludedColumnNamePattern" to a regex so that + column names matching the given regex will still be treated + as BLOBs The regex must follow the patterns used for the + java.util.regex package. The default is to exclude no columns, + and include all columns. + + Set "utf8OutsideBmpIncludedColumnNamePattern" to specify exclusion + rules to "utf8OutsideBmpExcludedColumnNamePattern". The regex must + follow the patterns used for the java.util.regex package. + + - New methods on com.mysql.jdbc.Statement: setLocalInfileInputStream() + and getLocalInfileInputStream(). + + setLocalInfileInputStream() sets an InputStream instance that will be used to send data + to the MySQL server for a "LOAD DATA LOCAL INFILE" statement + rather than a FileInputStream or URLInputStream that represents + the path given as an argument to the statement. + + This stream will be read to completion upon execution of a + "LOAD DATA LOCAL INFILE" statement, and will automatically + be closed by the driver, so it needs to be reset + before each call to execute*() that would cause the MySQL + server to request data to fulfill the request for + "LOAD DATA LOCAL INFILE". + + If this value is set to NULL, the driver will revert to using + a FileInputStream or URLInputStream as required. + + getLocalInfileInputStream() returns the InputStream instance that will be used to send + data in response to a "LOAD DATA LOCAL INFILE" statement. + + This method returns NULL if no such stream has been set + via setLocalInfileInputStream(). + + - The driver now connects with an initial character set + of "utf-8" solely for the purposes of authentication to + allow usernames and database names in any character set to + be used in the JDBC URL. + + - Errors encountered during Statement/PreparedStatement/CallableStatement.executeBatch() + when "rewriteBatchStatements" has been set to "true" now return + BatchUpdateExceptions according to the setting of "continueBatchOnError". + + If "continueBatchOnError" is set to "true", the update counts for the + "chunk" that were sent as one unit will all be set to EXECUTE_FAILED, but + the driver will attempt to process the remainder of the batch. You can determine which + "chunk" failed by looking at the update counts returned in the BatchUpdateException. + + If "continueBatchOnError" is set to "false", the update counts returned + will contain the failed "chunk", and stop with the failed chunk, with all + counts for the failed "chunk" set to EXECUTE_FAILED. + + Since MySQL doesn't return multiple error codes for multiple-statements, or + for multi-value INSERT/REPLACE, it is the application's responsibility to handle + determining which item(s) in the "chunk" actually failed. + + - Statement.setQueryTimeout()s now affect the entire batch for batched + statements, rather than the individual statements that make up the batch. + +06-29-07 - Version 5.1.2 Beta + + - Setting the configuration property "rewriteBatchedStatements" + to "true" will now cause the driver to rewrite batched prepared + statements with more than 3 parameter sets in a batch into + multi-statements (separated by ";") if they are not plain + (i.e. without SELECT or ON DUPLICATE KEY UPDATE clauses) INSERT + or REPLACE statements. + +06-22-07 - Version 5.1.1 Alpha + + - Pulled vendor-extension methods of Connection implementation out + into an interface to support java.sql.Wrapper functionality from + ConnectionPoolDataSource. The vendor extensions are javadoc'd in + the com.mysql.jdbc.Connection interface. + + For those looking further into the driver implementation, it is not + an API that is used for plugability of implementations inside our driver + (which is why there are still references to ConnectionImpl throughout the + code). + + Incompatible change: Connection.serverPrepare(String) has been re-named + to Connection.serverPrepareStatement() for consistency with + Connection.clientPrepareStatement(). + + We've also added server and client prepareStatement() methods that cover + all of the variants in the JDBC API. + + - Similar to Connection, we pulled out vendor extensions to Statement + into an interface named "com.mysql.Statement", and moved the Statement + class into com.mysql.StatementImpl. The two methods (javadoc'd in + "com.mysql.Statement" are enableStreamingResults(), which already existed, + and disableStreamingResults() which sets the statement instance back to + the fetch size and result set type it had before enableStreamingResults() + was called. + + - Added experimental support for statement "interceptors" via the + com.mysql.jdbc.StatementInterceptor interface, examples are + in com/mysql/jdbc/interceptors. + + Implement this interface to be placed "in between" query execution, so that + you can influence it. (currently experimental). + + StatementInterceptors are "chainable" when configured by the user, the + results returned by the "current" interceptor will be passed on to the next + on in the chain, from left-to-right order, as specified by the user in the + JDBC configuration property "statementInterceptors". + + See the sources (fully javadoc'd) for com.mysql.jdbc.StatementInterceptor + for more details until we iron out the API and get it documented in the + manual. + + - Externalized the descriptions of connection properties. + + - The data (and how it's stored) for ResultSet rows are now behind an + interface which allows us (in some cases) to allocate less memory + per row, in that for "streaming" result sets, we re-use the packet + used to read rows, since only one row at a time is ever active. + + - Made it possible to retrieve prepared statement parameter bindings + (to be used in StatementInterceptors, primarily). + + - Row navigation now causes any streams/readers open on the result set + to be closed, as in some cases we're reading directly from a shared network + packet and it will be overwritten by the "next" row. + + - Setting "rewriteBatchedStatements" to "true" now causes CallableStatements + with batched arguments to be re-written in the form "CALL (...); CALL (...); ..." + to send the batch in as few client-server round trips as possible. + + - Driver now picks appropriate internal row representation (whole row in one + buffer, or individual byte[]s for each column value) depending on heuristics, + including whether or not the row has BLOB or TEXT types and the overall + row-size. The threshold for row size that will cause the driver to + use a buffer rather than individual byte[]s is configured by the + configuration property "largeRowSizeThreshold", which has a default + value of 2KB. + +04-11-07 - Version 5.1.0 Alpha + + - Bumped JDBC Specification version number in jar-file manifest. + + - Re-worked Ant buildfile to build JDBC-4.0 classes separately, as well + as support building under Eclipse (since Eclipse can't mix/match JDKs). + + To build, you must set JAVA_HOME to J2SDK-1.4.2 or Java-5, and set + the following properties on your Ant commandline: + + com.mysql.jdbc.java6.javac - full path to your Java-6 javac executable + com.mysql.jdbc.java6.rtjar - full path to your Java-6 rt.jar file + + - New feature - driver will automatically adjust session variable + "net_write_timeout" when it determines its been asked for a "streaming" + result, and resets it to the previous value when the result set + has been consumed. (configuration property is named + "netTimeoutForStreamingResults", value has unit of seconds, + the value '0' means the driver will not try and adjust this value). + + - Added support for JDBC-4.0 categorized SQLExceptions. + + - Refactored CommunicationsException into a JDBC3 version, and a JDBC4 + version (which extends SQLRecoverableException, now that it exists). + + This change means that if you were catching + com.mysql.jdbc.CommunicationsException in your applications instead + of looking at the SQLState class of "08", and are moving to Java 6 + (or newer), you need to change your imports to that exception + to be com.mysql.jdbc.exceptions.jdbc4.CommunicationsException, as + the old class will not be instantiated for communications link-related + errors under Java 6. + + - Added support for JDBC-4.0's client information. The backend storage + of information provided via Connection.setClientInfo() and retrieved + by Connection.getClientInfo() is pluggable by any class that implements + the com.mysql.jdbc.JDBC4ClientInfoProvider interface and has a no-args + constructor. + + The implementation used by the driver is configured using the + "clientInfoProvider" configuration property (with a default of value + of "com.mysql.jdbc.JDBC4CommentClientInfoProvider", an implementation + which lists the client info as a comment prepended to every query + sent to the server). + + This functionality is only available when using Java-6 or newer. + + - Added support for JDBC-4.0's SQLXML interfaces. + + - Added support for JDBC-4.0's Wrapper interface. + + - Added support for JDBC-4.0's NCLOB, and NCHAR/NVARCHAR types. + +nn-nn-07 - Version 5.0.9 + + - Driver now calls SocketFactory.afterHandshake() at appropriate time. + +10-09-07 - Version 5.0.8 + + - Fixed BUG#30550, executeBatch() would fail with an ArithmeticException + and/or NullPointerException when the batch had zero members and + "rewriteBatchedStatements" was set to "true" for the connection. + + - Added two configuration parameters (both default to "false") + + * blobsAreStrings - Should the driver always treat BLOBs as Strings + specifically to work around dubious metadata returned + by the server for GROUP BY clauses? + + * functionsNeverReturnBlobs - Should the driver always treat data from + functions returning BLOBs as Strings - + specifically to work around dubious metadata + returned by the server for GROUP BY clauses? + + - Fixed BUG#29106 - Connection checker for JBoss didn't use same method parameters + via reflection, causing connections to always seem "bad". + + - Fixed BUG#30664 - Note that this fix only works for MySQL server + versions 5.0.25 and newer, since earlier versions didn't consistently + return correct metadata for functions, and thus results from + subqueries and functions were indistinguishable from each other, + leading to type-related bugs. + + - Fixed BUG#28972 - DatabaseMetaData.getTypeInfo() for the types DECIMAL + and NUMERIC will return a precision of 254 for server versions older than + 5.0.3, 64 for versions 5.0.3-5.0.5 and 65 for versions newer than 5.0.5. + + - Fixed BUG#29852 - Closing a load-balanced connection would cause a + ClassCastException. + + - Fixed BUG#27867 - Schema objects with identifiers other than + the connection character aren't retrieved correctly in + ResultSetMetadata. + + - Fixed BUG#28689 - CallableStatement.executeBatch() doesn't work when + connection property "noAccessToProcedureBodies" has been set to "true". + + The fix involves changing the behavior of "noAccessToProcedureBodies",in + that the driver will now report all paramters as "IN" paramters + but allow callers to call registerOutParameter() on them without throwing + an exception. + + - Fixed BUG#27182 - Connection.getServerCharacterEncoding() doesn't work + for servers with version >= 4.1. + + - Fixed BUG#27915 - DatabaseMetaData.getColumns() doesn't + contain SCOPE_* or IS_AUTOINCREMENT columns. + + - Fixed BUG#30851, NPE with null column values when + "padCharsWithSpace" is set to "true". + + - Specifying a "validation query" in your connection pool + that starts with "/* ping */" _exactly_ will cause the driver to + instead send a ping to the server and return a fake result set (much + lighter weight), and when using a ReplicationConnection or a LoadBalancedConnection, + will send the ping across all active connections. + + - Fixed Bug#30892 setObject(int, Object, int, int) delegate in + PreparedStatmentWrapper delegates to wrong method. + + - XAConnections now start in auto-commit mode (as per JDBC-4.0 specification + clarification). + + - Fixed Bug#27412 - cached metadata with PreparedStatement.execute() + throws NullPointerException. + + - Driver will now fall back to sane defaults for max_allowed_packet and + net_buffer_length if the server reports them incorrectly (and will log + this situation at WARN level, since it's actually an error condition). + + - Fixed BUG#27916 - UNSIGNED types not reported via DBMD.getTypeInfo(), and + capitalization of type names is not consistent between DBMD.getColumns(), + RSMD.getColumnTypeName() and DBMD.getTypeInfo(). + + This fix also ensures that the precision of UNSIGNED MEDIUMINT + and UNSIGNED BIGINT is reported correctly via DBMD.getColumns(). + + - Fixed BUG#31053 - Connections established using URLs of the form + "jdbc:mysql:loadbalance://" weren't doing failover if they tried to + connect to a MySQL server that was down. The driver now attempts + connections to the next "best" (depending on the load balance strategy + in use) server, and continues to attempt connecting to the next "best" + server every 250 milliseconds until one is found that is up and running + or 5 minutes has passed. + + If the driver gives up, it will throw the last-received SQLException. + +07-19-07 - Version 5.0.7 + + - Setting the configuration parameter "useCursorFetch" to "true" for + MySQL-5.0+ enables the use of cursors that allow Connector/J to save + memory by fetching result set rows in chunks (where the chunk size + is set by calling setFetchSize() on a Statement or ResultSet) by + using fully-materialized cursors on the server. + + The driver will will now automatically set "useServerPrepStmts" to + "true" when "useCursorFetch" has been set to "true", since the feature + requires server-side prepared statements in order to function. + + - Fixed BUG#28469 - PreparedStatement.getMetaData() for statements + containing leading one-line comments is not returned correctly. + + As part of this fix, we also overhauled detection of DML for + executeQuery() and SELECTs for executeUpdate() in plain and + prepared statements to be aware of the same types of comments. + + - Added configuration property "useNanosForElapsedTime" - for + profiling/debugging functionality that measures elapsed time, + should the driver try to use nanoseconds resolution if available + (requires JDK >= 1.5)? + + - Added configuration property "slowQueryThresholdNanos" - if + "useNanosForElapsedTime" is set to "true", and this property + is set to a non-zero value the driver will use this threshold + (in nanosecond units) to determine if a query was slow, instead + of using millisecond units. + + Note, that if "useNanosForElapsedTime" is set to "true", and this + property is set to "0" (or left default), then elapsed times will + still be measured in nanoseconds (if possible), but the slow query + threshold will be converted from milliseconds to nanoseconds, and thus + have an upper bound of approximately 2000 millesconds (as that threshold + is represented as an integer, not a long). + + - Added configuration properties to allow tuning of TCP/IP socket + parameters: + + "tcpNoDelay" - Should the driver set SO_TCP_NODELAY (disabling the + Nagle Algorithm, default "true")? + + "tcpKeepAlive" - Should the driver set SO_KEEPALIVE (default "true")? + + "tcpRcvBuf" - Should the driver set SO_RCV_BUF to the given value? + The default value of '0', means use the platform default + value for this property. + + "tcpSndBuf" - Should the driver set SO_SND_BUF to the given value? + The default value of '0', means use the platform default + value for this property. + + "tcpTrafficClass" - Should the driver set traffic class or + type-of-service fields? See the documentation + for java.net.Socket.setTrafficClass() for more + information. + + - Give more information in EOFExceptions thrown out of MysqlIO (how many + bytes the driver expected to read, how many it actually read, say that + communications with the server were unexpectedly lost). + + - Setting "useDynamicCharsetInfo" to "false" now causes driver to use + static lookups for collations as well (makes + ResultSetMetadata.isCaseSensitive() much more efficient, which leads + to performance increase for ColdFusion, which calls this method for + every column on every table it sees, it appears). + + - Driver detects when it is running in a ColdFusion MX server (tested + with version 7), and uses the configuration bundle "coldFusion", + which sets useDynamicCharsetInfo to "false" (see previous entry), and + sets useLocalSessionState and autoReconnect to "true". + + - Fixed BUG#28851 - parser in client-side prepared statements + eats character following '/' if it's not a multi-line comment. + + - Fixed BUG#28956 - parser in client-side prepared statements + runs to end of statement, rather than end-of-line for '#' comments. + + Also added support for '--' single-line comments. + + - Don't send any file data in response to LOAD DATA LOCAL INFILE + if the feature is disabled at the client side. This is to prevent + a malicious server or man-in-the-middle from asking the client for + data that the client is not expecting. Thanks to Jan Kneschke for + discovering the exploit and Andrey "Poohie" Hristov, Konstantin Osipov + and Sergei Golubchik for discussions about implications and possible + fixes. This fixes BUG 29605 for JDBC. + + - Added new debugging functionality - Setting configuration property + "includeInnodbStatusInDeadlockExceptions" to "true" will cause the driver + to append the output of "SHOW ENGINE INNODB STATUS" to deadlock-related + exceptions, which will enumerate the current locks held inside InnoDB. + +05-15-07 - Version 5.0.6 + + - Fixed BUG#25545 - Client options not sent correctly when using SSL, + leading to stored procedures not being able to return results. Thanks + to Don Cohen for the bug report, testcase and patch. + + - Fixed BUG#26592 - PreparedStatement is not closed in + BlobFromLocator.getBytes(). + + - Fixed BUG#25624 - Whitespace surrounding storage/size specifiers in + stored procedure parameters declaration causes NumberFormatException to + be thrown when calling stored procedure on JDK-1.5 or newer, as the Number + classes in JDK-1.5+ are whitespace intolerant. + + - Fixed BUG#26173 - When useCursorFetch=true, sometimes server would return + new, more exact metadata during the execution of the server-side prepared + statement that enables this functionality, which the driver ignored (using + the original metadata returned during prepare()), causing corrupt reading + of data due to type mismatch when the actual rows were returned. + + - Fixed BUG#26959 - comments in DDL of stored procedures/functions confuse + procedure parser, and thus metadata about them can not be created, leading to + inability to retrieve said metadata, or execute procedures that have certain + comments in them. + + - Give better error message when "streaming" result sets, and the connection + gets clobbered because of exceeding net_write_timeout on the server. (which is + basically what the error message says too). + + - Fixed BUG#26789 - fast date/time parsing doesn't take into + account 00:00:00 as a legal value. + + - Fixed BUG#27317 - ResultSet.get*() with a column index < 1 returns + misleading error message. + + - Fixed BUG#25517 - Statement.setMaxRows() is not effective on result + sets materialized from cursors. + + - New configuration property, "enableQueryTimeouts" (default "true"). + When enabled, query timeouts set via Statement.setQueryTimeout() use a + shared java.util.Timer instance for scheduling. Even if the timeout + doesn't expire before the query is processed, there will be + memory used by the TimerTask for the given timeout which won't be + reclaimed until the time the timeout would have expired if it + hadn't been cancelled by the driver. High-load environments + might want to consider disabling this functionality. (this configuration + property is part of the "maxPerformance" configuration bundle). + + - Fixed BUG#27400 - CALL /* ... */ some_proc() doesn't work. As a side effect + of this fix, you can now use /* */ and # comments when preparing statements using + client-side prepared statement emulation. + + If the comments happen to contain parameter markers '?', they will be treated + as belonging to the comment (i.e. not recognized) rather than being a parameter + of the statement. + + Note that the statement when sent to the server will contain the comments + as-is, they're not stripped during the process of preparing the PreparedStatement + or CallableStatement. + + - Fixed BUG#25328 - BIT(> 1) is returned as java.lang.String from ResultSet.getObject() + rather than byte[]. + + - Fixed BUG#25715 - CallableStatements with OUT/INOUT parameters that + are "binary" (blobs, bits, (var)binary, java_object) have extra 7 bytes + (which happens to be the _binary introducer!) + + - Added configuration property "padCharsWithSpace" (defaults to "false"). If set + to "true", and a result set column has the CHAR type and the value does not + fill the amount of characters specified in the DDL for the column, the driver + will pad the remaining characters with space (for ANSI compliance). + + - Fixed BUG#27655 - Connection.getTransactionIsolation() uses + "SHOW VARIABLES LIKE" which is very inefficient on MySQL-5.0+ + + - Added configuration property "useDynamicCharsetInfo". If set to "false" + (the default), the driver will use a per-connection cache of character set + information queried from the server when necessary, or when set to "true", + use a built-in static mapping that is more efficient, but isn't aware of + custom character sets or character sets implemented after the release of + the JDBC driver. + + Note: this only affects the "padCharsWithSpace" configuration property and the + ResultSetMetaData.getColumnDisplayWidth() method. + + - More intelligent initial packet sizes for the "shared" packets are used + (512 bytes, rather than 16K), and initial packets used during handshake are + now sized appropriately as to not require reallocation. + + - Fixed issue where calling getGeneratedKeys() on a prepared statement after + calling execute() didn't always return the generated keys (executeUpdate() + worked fine however). + + - Fixed issue where a failed-over connection would let an application call + setReadOnly(false), when that call should be ignored until the connection + is reconnected to a writable master unless "failoverReadOnly" had been set + to "false". + + - Fixed BUG#28085 - Generate more useful error messages for diagnostics + when the driver thinks a result set isn't updatable. (Thanks to Ashley Martens + for the patch). + + - Driver will now use INSERT INTO ... VALUES (DEFAULT) form of statement + for updatable result sets for ResultSet.insertRow(), rather than + pre-populating the insert row with values from DatabaseMetaData.getColumns() + (which results in a "SHOW FULL COLUMNS" on the server for every result + set). If an application requires access to the default values before + insertRow() has been called, the JDBC URL should be configured with + "populateInsertRowWithDefaultValues" set to "true". + + This fix specifically targets performance issues with ColdFusion and the + fact that it seems to ask for updatable result sets no matter what the + application does with them. + + - com.mysql.jdbc.[NonRegistering]Driver now understands URLs of the format + "jdbc:mysql:replication://" and "jdbc:mysql:loadbalance://" which will + create a ReplicationConnection (exactly like when + using [NonRegistering]ReplicationDriver) and an experimenal load-balanced + connection designed for use with SQL nodes in a MySQL Cluster/NDB environment, + respectively. + + In an effort to simplify things, we're working on deprecating multiple + drivers, and instead specifying different core behavior based upon JDBC URL + prefixes, so watch for [NonRegistering]ReplicationDriver to eventually + disappear, to be replaced with com.mysql.jdbc[NonRegistering]Driver with + the new URL prefix. + + - Added an experimental load-balanced connection designed for use with SQL nodes + in a MySQL Cluster/NDB environment (This is not for master-slave replication. + For that, we suggest you look at ReplicationConnection or "lbpool"). + + If the JDBC URL starts with "jdbc:mysql:loadbalance://host-1,host-2,...host-n", + the driver will create an implementation of java.sql.Connection that load + balances requests across a series of MySQL JDBC connections to the given hosts, + where the balancing takes place after transaction commit. + + Therefore, for this to work (at all), you must use transactions, even if only + reading data. + + Physical connections to the given hosts will not be created until needed. + + The driver will invalidate connections that it detects have had + communication errors when processing a request. A new connection to the + problematic host will be attempted the next time it is selected by the load + balancing algorithm. + + There are two choices for load balancing algorithms, which may be specified + by the "loadBalanceStrategy" JDBC URL configuration property: + + * "random" - the driver will pick a random host for each request. This tends + to work better than round-robin, as the randomness will somewhat account for + spreading loads where requests vary in response time, while round-robin + can sometimes lead to overloaded nodes if there are variations in response times + across the workload. + + * "bestResponseTime" - the driver will route the request to the host that had + the best response time for the previous transaction. + + - When "useLocalSessionState" is set to "true" and connected to a MySQL-5.0 or + later server, the JDBC driver will now determine whether an actual "commit" or + "rollback" statement needs to be sent to the database when Connection.commit() + or Connection.rollback() is called. + + This is especially helpful for high-load situations with connection pools that + always call Connection.rollback() on connection check-in/check-out because it + avoids a round-trip to the server. + +03-01-07 - Version 5.0.5 + + - Fixed BUG#23645 - Some collations/character sets reported as "unknown" + (specifically cias variants of existing character sets), and inability to override + the detected server character set. + + - Performance enhancement of initial character set configuration, driver + will only send commands required to configure connection character set + session variables if the current values on the server do not match + what is required. + + - Fixed BUG#24360 .setFetchSize() breaks prepared SHOW and other commands. + + - Fixed BUG#24344 - useJDBCCompliantTimezoneShift with server-side prepared + statements gives different behavior than when using client-side prepared + statements. (this is now fixed if moving from server-side prepared statements + to client-side prepared statements by setting "useSSPSCompatibleTimezoneShift" to + true", as the driver can't tell if this is a new deployment that never used + server-side prepared statements, or if it is an existing deployment that is + switching to client-side prepared statements from server-side prepared statements. + + - Fixed BUG#23304 - DBMD using "show" and DBMD using information_schema do + not return results consistent with each other. (note this fix only + addresses the inconsistencies, not the issue that the driver is + treating schemas differently than some users expect. We will revisit + this behavior when there is full support for schemas in MySQL). + + - Fixed BUG#25073 - rewriting batched statements leaks internal statement + instances, and causes a memory leak. + + - Fixed issue where field-level for metadata from DatabaseMetaData when using + INFORMATION_SCHEMA didn't have references to current connections, + sometimes leading to NullPointerExceptions when intropsecting them via + ResultSetMetaData. + + - Fixed BUG#25025 - Client-side prepared statement parser gets confused by + in-line (/* ... */) comments and therefore can't rewrite batched statements + or reliably detect type of statements when they're used. + + - Fixed BUG#24065 - Better error message when server doesn't return enough + information to determine stored procedure/function parameter types. + + - Fixed BUG#21438 - Driver sending nanoseconds to server for timestamps when + using server-side prepared statements, when server expects microseconds. + + - Fixed BUG#25514 - Timer instance used for Statement.setQueryTimeout() + created per-connection, rather than per-VM, causing memory leak + + - Fixed BUG#25009 - Results from updates not handled correctly in + multi-statement queries, leading to erroneous "Result is from UPDATE" + exceptions. + + - Fixed BUG#25047 - StringUtils.indexOfIgnoreCaseRespectQuotes() isn't + case-insensitive on the first character of the target. This bug broke + rewriteBatchedStatements functionality when prepared statements don't + use upper-case for the VALUES clause in their statements. + + - Fixed BUG#21480 - Some exceptions thrown out of StandardSocketFactory + were needlessly wrapped, obscurring their true cause, especially when + using socket timeouts. + + - Fixed BUG#23303 - DatabaseMetaData.getSchemas() doesn't return a + TABLE_CATALOG column. + + - Fixed BUG#25399 - EscapeProcessor gets confused by multiple + backslashes. We now push the responsibility of syntax errors back + on to the server for most escape sequences. + + - Fixed BUG#25379 - INOUT parameters in CallableStatements get + doubly-escaped. + + - Removed non-short-circuited logical ORs from "if" statements. + + - Re-worked stored procedure parameter parser to be more robust. Driver no + longer requires "BEGIN" in stored procedure definition, but does have + requirement that if a stored function begins with a label directly after the + "returns" clause, that the label is not a quoted identifier. + - Reverted back to internal character conversion routines for single-byte + character sets, as the ones internal to the JVM are using much more CPU + time than our internal implementation. + + - Changed cached result set metadata (when using + "cacheResultSetMetadata=true") to be cached per-connection rather + than per-statement as previously implemented. + + - Use a java.util.TreeMap to map column names to ordinal indexes for + ResultSet.findColumn() instead of a HashMap. This allows us to have + case-insensitive lookups (required by the JDBC specification) without + resorting to the many transient object instances needed to support this + requirement with a normal HashMap with either case-adjusted keys, or + case-insensitive keys. (In the worst case scenario for lookups of a 1000 + column result set, TreeMaps are about half as fast wall-clock time as + a HashMap, however in normal applications their use gives many orders + of magnitude reduction in transient object instance creation which pays + off later for CPU usage in garbage collection). + + - Avoid static synchronized code in JVM class libraries for dealing with + default timezones. + + - Fixed cases where ServerPreparedStatements weren't using cached metadata + when "cacheResultSetMetadata=true" was configured. + + - Use faster datetime parsing for ResultSets that come from plain or + non-server-side prepared statements. (Enable old implementation with + "useFastDateParsing=false" as a configuration parameter). + + - Fixed BUG#24794 - DatabaseMetaData.getSQLKeywords() doesn't return + all reserved words for current MySQL version. The current fix/implementation + returns keywords for MySQL-5.1, and doesn't distinguish between different + versions of the server. + + - When using cached metadata, skip field-level metadata packets coming from + the server, rather than reading them and discarding them without creating + com.mysql.jdbc.Field instances. + + - Fixed BUG#25836 - Statement execution which timed out doesn't always + throw MySQLTimeoutException. + + - Throw exceptions encountered during timeout to thread + calling Statement.execute*(), rather than RuntimeException. + + - Added configuration property "localSocketAddress",which is the hostname or + IP address given to explicitly configure the interface that the driver will + bind the client side of the TCP/IP connection to when connecting. + + - Take "localSocketAddress" property into account when creating instances + of CommunicationsException when the underyling exception is a + java.net.BindException, so that a friendlier error message is given with + a little internal diagnostics. + + - Fixed some NPEs when cached metadata was used with UpdatableResultSets. + + - The "rewriteBatchedStatements" feature can now be used with server-side + prepared statements. + + - Fixed BUG#26326 - Connection property "socketFactory" wasn't exposed via + correctly named mutator/accessor, causing data source implementations that + use JavaBean naming conventions to set properties to fail to set the property + (and in the case of SJAS, fail silently when trying to set this parameter). + + - Fixed BUG#25787 - java.util.Date should be serialized for + PreparedStatement.setObject(). + + We've added a new configuration option "treatUtilDateAsTimestamp", which is + false by default, as (1) We already had specific behavior to treat + java.util.Date as a java.sql.Timestamp because it's useful to many folks, + and (2) that behavior will very likely be required for drivers JDBC-post-4.0. + + - Fixed BUG#22628 - Driver.getPropertyInfo() throws NullPointerException for + URL that only specifies host and/or port. + + - Fixed BUG#21267, ParameterMetaData throws NullPointerException when + prepared SQL actually has a syntax error. Added + "generateSimpleParameterMetadata" configuration property, which when set + to "true" will generate metadata reflecting VARCHAR for every parameter + (the default is "false", which will cause an exception to be thrown if no + parameter metadata for the statement is actually available). + + - When extracting foreign key information from "SHOW CREATE TABLE " in + DatabaseMetaData, ignore exceptions relating to tables being missing + (which could happen for cross-reference or imported-key requests, as + the list of tables is generated first, then iterated). + + - Fixed WorkoutDatesUpdater.logging of XA commands sent to server, it's now configurable + via "logXaCommands" property (defaults to "false"). + + - Fixed issue where XADataSources couldn't be bound into JNDI, + as the DataSourceFactory didn't know how to create instances + of them. + + - Fixed issue where XADataSources couldn't be bound into JNDI, + as the DataSourceFactory didn't know how to create instances + of them. + + - Usage advisor will now issue warnings for result sets with large numbers + of rows (size configured by "resultSetSizeThreshold" property, default + value is 100). + +10-20-06 - Version 5.0.4 + + - Fixed BUG#21379 - column names don't match metadata in cases + where server doesn't return original column names (column functions) + thus breaking compatibility with applications that expect 1-1 mappings + between findColumn() and rsmd.getColumnName(), usually manifests itself + as "Can't find column ('')" exceptions. + + - Fixed BUG#21544 - When using information_schema for metadata, + COLUMN_SIZE for getColumns() is not clamped to range of + java.lang.Integer as is the case when not using + information_schema, thus leading to a truncation exception that + isn't present when not using information_schema. + + - Fixed configuration property "jdbcCompliantTruncation" was not + being used for reads of result set values. + + - Fixed BUG#22024 - Newlines causing whitespace to span confuse + procedure parser when getting parameter metadata for stored + procedures. + + - Driver now supports {call sp} (without "()" if procedure has no + arguments). + + - Fixed BUG#22359 - Driver was using milliseconds for + Statement.setQueryTimeout() when specification says argument is + to be in seconds. + + - Workaround for server crash when calling stored procedures + via a server-side prepared statement (driver now detects + prepare(stored procedure) and substitutes client-side prepared + statement), addresses BUG#22297. + + - Added new _ci collations to CharsetMapping, fixing + Bug#22456 - utf8_unicode_ci not working. + + - Fixed BUG#22290 - Driver issues truncation on write exception when + it shouldn't (due to sending big decimal incorrectly to server with + server-side prepared statement). + + - Fixed BUG#22613 - DBMD.getColumns() does not return expected + COLUMN_SIZE for the SET type, now returns length of largest possible + set disregarding whitespace or the "," delimitters to be consistent + with the ODBC driver. + + - Driver now sends numeric 1 or 0 for client-prepared statement + setBoolean() calls instead of '1' or '0'. + + - DatabaseMetaData correctly reports true for supportsCatalog*() + methods. + +07-26-06 - Version 5.0.3 + + - Fixed BUG#20650 - Statement.cancel() causes NullPointerException + if underlying connection has been closed due to server failure. + + - Added configuration option "noAccessToProcedureBodies" which will + cause the driver to create basic parameter metadata for + CallableStatements when the user does not have access to procedure + bodies via "SHOW CREATE PROCEDURE" or selecting from mysql.proc + instead of throwing an exception. The default value for this option + is "false". + +07-11-06 - Version 5.0.2-beta (5.0.1 not released due to packaging error) + + - Fixed BUG#17401 - Can't use XAConnection for local transactions when + no global transaction is in progress. + + - Fixed BUG#18086 - Driver fails on non-ASCII platforms. The driver + was assuming that the platform character set would be a superset + of MySQL's "latin1" when doing the handshake for authentication, + and when reading error messages. We now use Cp1252 for all strings + sent to the server during the handshake phase, and a hard-coded mapping + of the "language" server variable to the character set that + is used for error messages. + + - Fixed BUG#19169 - ConnectionProperties (and thus some + subclasses) are not serializable, even though some J2EE containers + expect them to be. + + - Fixed BUG#20242 - MysqlValidConnectionChecker for JBoss doesn't + work with MySQLXADataSources. + + - Better caching of character set converters (per-connection) + to remove a bottleneck for multibyte character sets. + + - Added connection/datasource property "pinGlobalTxToPhysicalConnection" + (defaults to "false"). When set to "true", when using XAConnections, the + driver ensures that operations on a given XID are always routed to the + same physical connection. This allows the XAConnection to support + "XA START ... JOIN" after "XA END" has been called, and is also a + workaround for transaction managers that don't maintain thread affinity + for a global transaction (most either always maintain thread affinity, + or have it as a configuration option). + + - MysqlXaConnection.recover(int flags) now allows combinations of + XAResource.TMSTARTRSCAN and TMENDRSCAN. To simulate the "scanning" + nature of the interface, we return all prepared XIDs for TMSTARTRSCAN, + and no new XIDs for calls with TMNOFLAGS, or TMENDRSCAN when not in + combination with TMSTARTRSCAN. This change was made for API compliance, + as well as integration with IBM WebSphere's transaction manager. + +12-23-05 - Version 5.0.0-beta + + - XADataSource implemented (ported from 3.2 branch which won't be + released as a product). Use + "com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" as your datasource + class name in your application server to utilize XA transactions + in MySQL-5.0.10 and newer. + + - PreparedStatement.setString() didn't work correctly when + sql_mode on server contained NO_BACKSLASH_ESCAPES, and no characters + that needed escaping were present in the string. + + - Attempt detection of the MySQL type "BINARY" (it's an alias, so this isn't + always reliable), and use the java.sql.Types.BINARY type mapping for it. + + - Moved -bin-g.jar file into separate "debug" subdirectory to avoid confusion. + + - Don't allow .setAutoCommit(true), or .commit() or .rollback() on an XA-managed + connection as-per the JDBC specification. + + - If the connection "useTimezone" is set to "true", then also respect timezone + conversions in escape-processed string literals (e.g. "{ts ...}" and + "{t ...}"). + + - Return original column name for RSMD.getColumnName() if the column was aliased, + alias name for .getColumnLabel() (if aliased), and original table name + for .getTableName(). Note this only works for MySQL-4.1 and newer, as + older servers don't make this information available to clients. + + - Setting "useJDBCCompliantTimezoneShift=true" (it's not the default) + causes the driver to use GMT for _all_ TIMESTAMP/DATETIME timezones, + and the current VM timezone for any other type that refers to timezones. + This feature can not be used when "useTimezone=true" to convert between + server and client timezones. + + - Add one level of indirection of internal representation of CallableStatement + parameter metadata to avoid class not found issues on JDK-1.3 for + ParameterMetadata interface (which doesn't exist prior to JDBC-3.0). + + - Added unit tests for XADatasource, as well as friendlier exceptions + for XA failures compared to the "stock" XAException (which has no + messages). + + - Fixed BUG#14279 - Idle timeouts cause XAConnections to whine about rolling + themselves back + + - Added support for Connector/MXJ integration via url subprotocol + "jdbc:mysql:mxj://....". + + - Moved all SQLException constructor usage to a factory in SQLError + (ground-work for JDBC-4.0 SQLState-based exception classes). + + - Removed Java5-specific calls to BigDecimal constructor (when + result set value is '', (int)0 was being used as an argument + in-directly via method return value. This signature doesn't exist + prior to Java5.) + + - Moved all SQLException creation to a factory method in SQLError, + groundwork for JDBC-4.0 SQLState class-based exceptions. + + - Added service-provider entry to META-INF/services/java.sql.Driver + for JDBC-4.0 support. + + - Return "[VAR]BINARY" for RSMD.getColumnTypeName() when that is actually + the type, and it can be distinguished (MySQL-4.1 and newer). + + - When fix for BUG#14562 was merged from 3.1.12, added functionality + for CallableStatement's parameter metadata to return correct + information for .getParameterClassName(). + + - Fuller synchronization of Connection to avoid deadlocks when + using multithreaded frameworks that multithread a single connection + (usually not recommended, but the JDBC spec allows it anyways), + part of fix to BUG#14972). + + - Implementation of Statement.cancel() and Statement.setQueryTimeout(). + Both require MySQL-5.0.0 or newer server, require a separate connection + to issue the "KILL QUERY" command, and in the case of setQueryTimeout() + creates an additional thread to handle the timeout functionality. + + Note: Failures to cancel the statement for setQueryTimeout() may manifest + themselves as RuntimeExceptions rather than failing silently, as there + is currently no way to unblock the thread that is executing the query being + cancelled due to timeout expiration and have it throw the exception + instead. + + - Removed dead code in com.mysql.jdbc.Connection. + + - Made construction of com.mysql.jdbc.Field (result set metadata) + instances more efficient for non-string types by not doing + character set initialization, or detection of type changes due to + temporary tables. + + - Removed redundant code in com.mysql.jdbc.MysqlIO. + + - Removed work done for BUG#14652, and instead loosened synchronization + to solve a number of deadlock issues in BUG#18719, BUG#18367, BUG#17709 + and BUG#15067. New strategy basically makes Connection instances threadsafe + and thus shareable across threads, and anything else threadsafe, but not + necessarily shareable across threads due to JDBC API interactions that + can cause non-obvious behavior and/or deadlock scenarios to occur since + the API is not designed to be used from multiple threads at once. + + Therefore, unless external synchronization is provided, clients should + not allow multiple threads to share a given statement or result set. Examples + of issues with the API itself not being multi-thread suitable include, + but are not limited to race conditions between modifiers and execution and + retrieval methods on statements and result sets that are not synchronizable + such as ResultSet.get*() and traversal methods, or Statement.execute*() closing + result sets without effectively making the driver itself serializable across the + board. + + These changes should not have any effect on "normal" J(2)EE use cases + where only one thread ever uses a connection instance and the objects created by + it. + + - Use a java.util.Timer to schedule cancellation of queries via + Statement.setQueryTimeout() rather than one thread per potential cancellation. + + A new thread will be used to actually cancel a running query, as there's potential + for a cancel request to block other cancel requests if all run from the + same thread. + +nn-nn-07 - Version 3.1.15 + + - Fixed BUG#23281 - Downed slave caused round-robin load balance to + not cycle back to first host in list. + + - Disabled use of server-side prepared statements by default. + + - Handle YYYY-MM-DD hh:mm:ss format of timestamp in + ResultSet.getTimeFromString(). + + - Fixed BUG#24840 - character encoding of "US-ASCII" doesn't map correctly + for 4.1 or newer + + - Added Implementation-Vendor-Id attribute to jar manifest per request + in BUG#15641. + + - C3P0 >= version 0.9.1 passes non-proxied connections to + MysqlConnectionTester, thus it began throwing ClassCastExceptions. + MysqlConnectionTester now checks if it has a plain Connection and uses + that if possible. Thanks to Brian Skrab for the fix. + +10-19-06 - Version 3.1.14 + + - Fixed BUG#20479 - Updatable result set throws ClassCastException + when there is row data and moveToInsertRow() is called. + + - Fixed BUG#20485 - Updatable result set that contains + a BIT column fails when server-side prepared statements are used. + + - Fixed BUG#16987 - Memory leak with profileSQL=true. + + - Fixed BUG#19726 - Connection fails to localhost when using + timeout and IPv6 is configured. + + - Fixed BUG#16791 - NullPointerException in MysqlDataSourceFactory + due to Reference containing RefAddrs with null content. + + - Fixed BUG#20306 - ResultSet.getShort() for UNSIGNED TINYINT + returns incorrect values when using server-side prepared statements. + + - Fixed BUG#20687 - Can't pool server-side prepared statements, exception + raised when re-using them. + + - Fixed BUG#21062 - ResultSet.getSomeInteger() doesn't work for BIT(>1). + + - Fixed BUG#18880 - ResultSet.getFloatFromString() can't retrieve + values near Float.MIN/MAX_VALUE. + + - Fixed BUG#20888 - escape of quotes in client-side prepared + statements parsing not respected. Patch covers more than bug report, + including NO_BACKSLASH_ESCAPES being set, and stacked quote characters + forms of escaping (i.e. '' or ""). + + - Fixed BUG#19993 - ReplicationDriver does not always round-robin load + balance depending on URL used for slaves list. + + - Fixed calling toString() on ResultSetMetaData for driver-generated + (i.e. from DatabaseMetaData method calls, or from getGeneratedKeys()) + result sets would raise a NullPointerException. + + - Fixed Bug#21207 - Driver throws NPE when tracing prepared statements that + have been closed (in asSQL()). + + - Removed logger autodectection altogether, must now specify logger + explitly if you want to use a logger other than one that logs + to STDERR. + + - Fixed BUG#22290 - Driver issues truncation on write exception when + it shouldn't (due to sending big decimal incorrectly to server with + server-side prepared statement). + + - Driver now sends numeric 1 or 0 for client-prepared statement + setBoolean() calls instead of '1' or '0'. + + - Fixed bug where driver would not advance to next host if + roundRobinLoadBalance=true and the last host in the list is down. + + - Fixed BUG#18258 - DatabaseMetaData.getTables(), columns() with bad + catalog parameter threw exception rather than return empty result + set (as required by spec). + + - Check and store value for continueBatchOnError property in constructor + of Statements, rather than when executing batches, so that Connections + closed out from underneath statements don't cause NullPointerExceptions + when it's required to check this property. + + - Fixed bug when calling stored functions, where parameters weren't + numbered correctly (first parameter is now the return value, subsequent + parameters if specified start at index "2"). + + - Fixed BUG#21814 - time values outside valid range silently wrap. + +05-26-06 - Version 3.1.13 + + - Fixed BUG#15464 - INOUT parameter does not store IN value. + + - Fixed BUG#14609 - Exception thrown for new decimal type when + using updatable result sets. + + - Fixed BUG#15544, no "dos" character set in MySQL > 4.1.0 + + - Fixed BUG#15383 - PreparedStatement.setObject() serializes + BigInteger as object, rather than sending as numeric value + (and is thus not complementary to .getObject() on an UNSIGNED + LONG type). + + - Fixed BUG#11874 - ResultSet.getShort() for UNSIGNED TINYINT + returned wrong values. + + - Fixed BUG#15676 - lib-nodist directory missing from + package breaks out-of-box build + + - Fixed BUG#15854 - DBMD.getColumns() returns wrong type for BIT. + + - Fixed BUG#16169 - ResultSet.getNativeShort() causes stack overflow error + via recurisve calls. + + - Fixed BUG#14938 - Unable to initialize character set mapping tables. + Removed reliance on .properties files to hold this information, as it + turns out to be too problematic to code around class loader hierarchies + that change depending on how an application is deployed. Moved information + back into the CharsetMapping class. + + - Fixed BUG#16841 - updatable result set doesn't return AUTO_INCREMENT + values for insertRow() when multiple column primary keys are used. (the + driver was checking for the existence of single-column primary keys and + an autoincrement value > 0 instead of a straightforward isAutoIncrement() + check). + + - Fixed BUG#17099 - Statement.getGeneratedKeys() throws NullPointerException + when no query has been processed. + + - Fixed BUG#13469 - Driver tries to call methods that don't exist on older and + newer versions of Log4j. The fix is not trying to auto-detect presense of log4j, + too many different incompatible versions out there in the wild to do this reliably. + + If you relied on autodetection before, you will need to add + "logger=com.mysql.jdbc.log.Log4JLogger" to your JDBC URL to enable Log4J usage, + or alternatively use the new "CommonsLogger" class to take care of this. + + - Added support for Apache Commons WorkoutDatesUpdater.logging, use "com.mysql.jdbc.log.CommonsLogger" + as the value for the "logger" configuration property. + + - LogFactory now prepends "com.mysql.jdbc.log" to log class name if it can't be + found as-specified. This allows you to use "short names" for the built-in log + factories, for example "logger=CommonsLogger" instead of + "logger=com.mysql.jdbc.log.CommonsLogger". + + - Fixed BUG#15570 - ReplicationConnection incorrectly copies state, + doesn't transfer connection context correctly when transitioning between + the same read-only states. + + - Fixed BUG#18041 - Server-side prepared statements don't cause + truncation exceptions to be thrown when truncation happens. + + - Added performance feature, re-writing of batched executes for + Statement.executeBatch() (for all DML statements) and + PreparedStatement.executeBatch() (for INSERTs with VALUE clauses + only). Enable by using "rewriteBatchedStatements=true" in your JDBC URL. + + - Fixed BUG#17898 - registerOutParameter not working when some + parameters pre-populated. Still waiting for feedback from JDBC experts + group to determine what correct parameter count from getMetaData() + should be, however. + + - Fixed BUG#17587 - clearParameters() on a closed prepared statement + causes NPE. + + - Map "latin1" on MySQL server to CP1252 for MySQL > 4.1.0. + + - Added additional accessor and mutator methods on ConnectionProperties + so that DataSource users can use same naming as regular URL properties. + + - Fixed BUG#18740 - Data truncation and getWarnings() only returns last + warning in set. + + - Improved performance of retrieving BigDecimal, Time, Timestamp and Date + values from server-side prepared statements by creating fewer short-lived + instances of Strings when the native type is not an exact match for + the requested type. Fixes BUG#18496 for BigDecimals. + + - Fixed BUG#18554 - Aliased column names where length of name > 251 + are corrupted. + + - Fixed BUG#17450 - ResultSet.wasNull() not always reset + correctly for booleans when done via conversion for server-side + prepared statements. + + - Fixed BUG#16277 - Invalid classname returned for + RSMD.getColumnClassName() for BIGINT type. + + - Fixed case where driver wasn't reading server status correctly when + fetching server-side prepared statement rows, which in some cases + could cause warning counts to be off, or multiple result sets to not + be read off the wire. + + - Driver now aware of fix for BIT type metadata that went into + MySQL-5.0.21 for server not reporting length consistently (bug + number 13601). + + - Fixed BUG#19282 - ResultSet.wasNull() returns incorrect value + when extracting native string from server-side prepared statement + generated result set. + +11-30-05 - Version 3.1.12 + + - Fixed client-side prepared statement bug with embedded ? inside + quoted identifiers (it was recognized as a placeholder, when it + was not). + + - Don't allow executeBatch() for CallableStatements with registered + OUT/INOUT parameters (JDBC compliance). + + - Fall back to platform-encoding for URLDecoder.decode() when + parsing driver URL properties if the platform doesn't have a + two-argument version of this method. + + - Fixed BUG#14562 - Java type conversion may be incorrect for + mediumint. + + - Added configuration property "useGmtMillisForDatetimes" which + when set to true causes ResultSet.getDate(), .getTimestamp() to + return correct millis-since GMT when .getTime() is called on + the return value (currently default is "false" for legacy + behavior). + + - Fixed DatabaseMetaData.stores*Identifiers(): + + * if lower_case_table_names=0 (on server): + + storesLowerCaseIdentifiers() returns false + storesLowerCaseQuotedIdentifiers() returns false + storesMixedCaseIdentifiers() returns true + storesMixedCaseQuotedIdentifiers() returns true + storesUpperCaseIdentifiers() returns false + storesUpperCaseQuotedIdentifiers() returns true + + * if lower_case_table_names=1 (on server): + + storesLowerCaseIdentifiers() returns true + storesLowerCaseQuotedIdentifiers() returns true + storesMixedCaseIdentifiers() returns false + storesMixedCaseQuotedIdentifiers() returns false + storesUpperCaseIdentifiers() returns false + storesUpperCaseQuotedIdentifiers() returns true + + - Fixed BUG#14815 - DatabaseMetaData.getColumns() doesn't + return TABLE_NAME correctly. + + - Fixed BUG#14909 - escape processor replaces quote character + in quoted string with string delimiter. + + - Fixed BUG#12975 - OpenOffice expects + DBMD.supportsIntegrityEnhancementFacility() to return "true" + if foreign keys are supported by the datasource, even though + this method also covers support for check constraints, + which MySQL _doesn't_ have. Setting the configuration property + "overrideSupportsIntegrityEnhancementFacility" to "true" causes + the driver to return "true" for this method. + + - Added "com.mysql.jdbc.testsuite.url.default" system property to + set default JDBC url for testsuite (to speed up bug resolution + when I'm working in Eclipse). + + - Fixed BUG#14938 - Unable to initialize character set mapping + tables (due to J2EE classloader differences). + + - Fixed BUG#14972 - Deadlock while closing server-side prepared + statements from multiple threads sharing one connection. + + - Fixed BUG#12230 - logSlowQueries should give better info. + + - Fixed BUG#13775 - Extraneous sleep on autoReconnect. + + - Fixed BUG#15024 - Driver incorrectly closes streams passed as + arguments to PreparedStatements. Reverts to legacy behavior by + setting the JDBC configuration property "autoClosePStmtStreams" + to "true" (also included in the 3-0-Compat configuration "bundle"). + + - Fixed BUG#13048 - maxQuerySizeToLog is not respected. Added WorkoutDatesUpdater.logging of + bound values for execute() phase of server-side prepared statements + when profileSQL=true as well. + + - Fixed BUG#15065 - Usage advisor complains about unreferenced + columns, even though they've been referenced. + + - Don't increase timeout for failover/reconnect (BUG#6577) + + - Process escape tokens in Connection.prepareStatement(...), fix + for BUG#15141. You can disable this behavior by setting + the JDBC URL configuration property "processEscapeCodesForPrepStmts" + to "false". + + - Fixed BUG#13255 - Reconnect during middle of executeBatch() + should not occur if autoReconnect is enabled. + +10-07-05 - Version 3.1.11 + + - Fixed BUG#11629 - Spurious "!" on console when character + encoding is "utf8". + + - Fixed statements generated for testcases missing ";" for + "plain" statements. + + - Fixed BUG#11663 - Incorrect generation of testcase scripts + for server-side prepared statements. + + - Fixed regression caused by fix for BUG#11552 that caused driver + to return incorrect values for unsigned integers when those + integers where within the range of the positive signed type. + + - Moved source code to svn repo. + + - Fixed BUG#11797 - Escape tokenizer doesn't respect stacked single quotes + for escapes. + + - GEOMETRY type not recognized when using server-side prepared statements. + + - Fixed BUG#11879 -- ReplicationConnection won't switch to slave, throws + "Catalog can't be null" exception. + + - Fixed BUG#12218, properties shared between master and slave with + replication connection. + + - Fixed BUG#10630, Statement.getWarnings() fails with NPE if statement + has been closed. + + - Only get char[] from SQL in PreparedStatement.ParseInfo() when needed. + + - Fixed BUG#12104 - Geometry types not handled with server-side prepared + statements. + + - Fixed BUG#11614 - StringUtils.getBytes() doesn't work when using + multibyte character encodings and a length in _characters_ is + specified. + + - Fixed BUG#11798 - Pstmt.setObject(...., Types.BOOLEAN) throws exception. + + - Fixed BUG#11976 - maxPerformance.properties mis-spells + "elideSetAutoCommits". + + - Fixed BUG#11575 -- DBMD.storesLower/Mixed/UpperIdentifiers() + reports incorrect values for servers deployed on Windows. + + - Fixed BUG#11190 - ResultSet.moveToCurrentRow() fails to work when + preceeded by a call to ResultSet.moveToInsertRow(). + + - Fixed BUG#11115, VARBINARY data corrupted when using server-side + prepared statements and .setBytes(). + + - Fixed BUG#12229 - explainSlowQueries hangs with server-side + prepared statements. + + - Fixed BUG#11498 - Escape processor didn't honor strings demarcated + with double quotes. + + - Lifted restriction of changing streaming parameters with server-side + prepared statements. As long as _all_ streaming parameters were set + before execution, .clearParameters() does not have to be called. + (due to limitation of client/server protocol, prepared statements + can not reset _individual_ stream data on the server side). + + - Reworked Field class, *Buffer, and MysqlIO to be aware of field + lengths > Integer.MAX_VALUE. + + - Updated DBMD.supportsCorrelatedQueries() to return true for versions > + 4.1, supportsGroupByUnrelated() to return true and + getResultSetHoldability() to return HOLD_CURSORS_OVER_COMMIT. + + - Fixed BUG#12541 - Handling of catalog argument in + DatabaseMetaData.getIndexInfo(), which also means changes to the following + methods in DatabaseMetaData: + + - getBestRowIdentifier() + - getColumns() + - getCrossReference() + - getExportedKeys() + - getImportedKeys() + - getIndexInfo() + - getPrimaryKeys() + - getProcedures() (and thus indirectly getProcedureColumns()) + - getTables() + + The "catalog" argument in all of these methods now behaves in the following + way: + + - Specifying NULL means that catalog will not be used to filter the + results (thus all databases will be searched), unless you've + set "nullCatalogMeansCurrent=true" in your JDBC URL properties. + + - Specifying "" means "current" catalog, even though this isn't quite + JDBC spec compliant, it's there for legacy users. + + - Specifying a catalog works as stated in the API docs. + + - Made Connection.clientPrepare() available from "wrapped" connections + in the jdbc2.optional package (connections built by + ConnectionPoolDataSource instances). + + - Added Connection.isMasterConnection() for clients to be able to determine + if a multi-host master/slave connection is connected to the first host + in the list. + + - Fixed BUG#12753 - Tokenizer for "=" in URL properties was causing + sessionVariables=.... to be parameterized incorrectly. + + - Fixed BUG#11781, foreign key information that is quoted is + parsed incorrectly when DatabaseMetaData methods use that + information. + + - The "sendBlobChunkSize" property is now clamped to "max_allowed_packet" + with consideration of stream buffer size and packet headers to avoid + PacketTooBigExceptions when "max_allowed_packet" is similar in size + to the default "sendBlobChunkSize" which is 1M. + + - CallableStatement.clearParameters() now clears resources associated + with INOUT/OUTPUT parameters as well as INPUT parameters. + + - Fixed BUG#12417 - Connection.prepareCall() is database name + case-sensitive (on Windows systems). + + - Fixed BUG#12752 - Cp1251 incorrectly mapped to win1251 for + servers newer than 4.0.x. + + - Fixed BUG#12970 - java.sql.Types.OTHER returned for + BINARY and VARBINARY columns when using + DatabaseMetaData.getColumns(). + + - ServerPreparedStatement.getBinding() now checks if the statement + is closed before attempting to reference the list of parameter + bindings, to avoid throwing a NullPointerException. + + - Fixed BUG#13277 - ResultSetMetaData from + Statement.getGeneratedKeys() caused NullPointerExceptions to be + thrown whenever a method that required a connection reference + was called. + + - Removed support for java.nio I/O. Too many implementations + turned out to be buggy, and there was no performance difference + since MySQL is a blocking protocol anyway. + +06-23-05 - Version 3.1.10-stable + + - Fixed connecting without a database specified raised an exception + in MysqlIO.changeDatabaseTo(). + + - Initial implemention of ParameterMetadata for + PreparedStatement.getParameterMetadata(). Only works fully + for CallableStatements, as current server-side prepared statements + return every parameter as a VARCHAR type. + + - Fixed BUG#11552 - Server-side prepared statements return incorrect + values for unsigned TINYINT, SMALLINT, INT and Long. + + - Fixed BUG#11540 - Incorrect year conversion in setDate(..) for + system that use B.E. year in default locale. + +06-22-05 - Version 3.1.9-stable + + - Overhaul of character set configuration, everything now + lives in a properties file. + + - Driver now correctly uses CP932 if available on the server + for Windows-31J, CP932 and MS932 java encoding names, + otherwise it resorts to SJIS, which is only a close + approximation. Currently only MySQL-5.0.3 and newer (and + MySQL-4.1.12 or .13, depending on when the character set + gets backported) can reliably support any variant of CP932. + + - Fixed BUG#9064 - com.mysql.jdbc.PreparedStatement.ParseInfo + does unnecessary call to toCharArray(). + + - Fixed Bug#10144 - Memory leak in ServerPreparedStatement if + serverPrepare() fails. + + - Actually write manifest file to correct place so it ends up + in the binary jar file. + + - Added "createDatabaseIfNotExist" property (default is "false"), + which will cause the driver to ask the server to create the + database specified in the URL if it doesn't exist. You must have + the appropriate privileges for database creation for this to + work. + + - Fixed BUG#10156 - Unsigned SMALLINT treated as signed for ResultSet.getInt(), + fixed all cases for UNSIGNED integer values and server-side prepared statements, + as well as ResultSet.getObject() for UNSIGNED TINYINT. + + - Fixed BUG#10155, double quotes not recognized when parsing + client-side prepared statements. + + - Made enableStreamingResults() visible on + com.mysql.jdbc.jdbc2.optional.StatementWrapper. + + - Made ServerPreparedStatement.asSql() work correctly so auto-explain + functionality would work with server-side prepared statements. + + - Made JDBC2-compliant wrappers public in order to allow access to + vendor extensions. + + - Cleaned up WorkoutDatesUpdater.logging of profiler events, moved code to dump a profiler + event as a string to com.mysql.jdbc.log.LogUtils so that third + parties can use it. + + - DatabaseMetaData.supportsMultipleOpenResults() now returns true. The + driver has supported this for some time, DBMD just missed that fact. + + - Fixed BUG#10310 - Driver doesn't support {?=CALL(...)} for calling + stored functions. This involved adding support for function retrieval + to DatabaseMetaData.getProcedures() and getProcedureColumns() as well. + + - Fixed BUG#10485, SQLException thrown when retrieving YEAR(2) + with ResultSet.getString(). The driver will now always treat YEAR types + as java.sql.Dates and return the correct values for getString(). + Alternatively, the "yearIsDateType" connection property can be set to + "false" and the values will be treated as SHORTs. + + - The datatype returned for TINYINT(1) columns when "tinyInt1isBit=true" + (the default) can be switched between Types.BOOLEAN and Types.BIT + using the new configuration property "transformedBitIsBoolean", which + defaults to "false". If set to "false" (the default), + DatabaseMetaData.getColumns() and ResultSetMetaData.getColumnType() + will return Types.BOOLEAN for TINYINT(1) columns. If "true", + Types.BOOLEAN will be returned instead. Irregardless of this configuration + property, if "tinyInt1isBit" is enabled, columns with the type TINYINT(1) + will be returned as java.lang.Boolean instances from + ResultSet.getObject(..), and ResultSetMetaData.getColumnClassName() + will return "java.lang.Boolean". + + - Fixed BUG#10496 - SQLException is thrown when using property + "characterSetResults" with cp932 or eucjpms. + + - Reorganized directory layout, sources now in "src" folder, + don't pollute parent directory when building, now output goes + to "./build", distribution goes to "./dist". + + - Added support/bug hunting feature that generates .sql test + scripts to STDERR when "autoGenerateTestcaseScript" is set + to "true". + + - Fixed BUG#10850 - 0-length streams not sent to server when + using server-side prepared statements. + + - Setting "cachePrepStmts=true" now causes the Connection to also + cache the check the driver performs to determine if a prepared + statement can be server-side or not, as well as caches server-side + prepared statements for the lifetime of a connection. As before, + the "prepStmtCacheSize" parameter controls the size of these + caches. + + - Try to handle OutOfMemoryErrors more gracefully. Although not + much can be done, they will in most cases close the connection + they happened on so that further operations don't run into + a connection in some unknown state. When an OOM has happened, + any further operations on the connection will fail with a + "Connection closed" exception that will also list the OOM exception + as the reason for the implicit connection close event. + + - Don't send COM_RESET_STMT for each execution of a server-side + prepared statement if it isn't required. + + - Driver detects if you're running MySQL-5.0.7 or later, and does + not scan for "LIMIT ?[,?]" in statements being prepared, as the + server supports those types of queries now. + + - Fixed BUG#11115, Varbinary data corrupted when using server-side + prepared statements and ResultSet.getBytes(). + + - Connection.setCatalog() is now aware of the "useLocalSessionState" + configuration property, which when set to true will prevent + the driver from sending "USE ..." to the server if the requested + catalog is the same as the current catalog. + + - Added the following configuration bundles, use one or many via + the "useConfigs" configuration property: + + * maxPerformance -- maximum performance without being reckless + * solarisMaxPerformance -- maximum performance for Solaris, + avoids syscalls where it can + * 3-0-Compat -- Compatibility with Connector/J 3.0.x functionality + + - Added "maintainTimeStats" configuration property (defaults to "true"), + which tells the driver whether or not to keep track of the last query time + and the last successful packet sent to the server's time. If set to + false, removes two syscalls per query. + + - Fixed BUG#11259, autoReconnect ping causes exception on connection + startup. + + - Fixed BUG#11360 Connector/J dumping query into SQLException twice + + - Fixed PreparedStatement.setClob() not accepting null as a parameter. + + - Fixed BUG#11411 - Production package doesn't include JBoss integration + classes. + + - Removed nonsensical "costly type conversion" warnings when using + usage advisor. + +04-14-05 - Version 3.1.8-stable + + - Fixed DatabaseMetaData.getTables() returning views when they were + not asked for as one of the requested table types. + + - Added support for new precision-math DECIMAL type in MySQL >= 5.0.3. + + - Fixed ResultSet.getTime() on a NULL value for server-side prepared + statements throws NPE. + + - Made Connection.ping() a public method. + + - Fixed Bug#8868, DATE_FORMAT() queries returned as BLOBs from getObject(). + + - ServerPreparedStatements now correctly 'stream' BLOB/CLOB data to the + server. You can configure the threshold chunk size using the + JDBC URL property 'blobSendChunkSize' (the default is one megabyte). + + - BlobFromLocator now uses correct identifier quoting when generating + prepared statements. + + - Server-side session variables can be preset at connection time by + passing them as a comma-delimited list for the connection property + 'sessionVariables'. + + - Fixed regression in ping() for users using autoReconnect=true. + + - Fixed BUG#9040 - PreparedStatement.addBatch() doesn't work with server-side + prepared statements and streaming BINARY data. + + - Fixed BUG#8800 - DBMD.supportsMixedCase*Identifiers() returns wrong + value on servers running on case-sensitive filesystems. + + - Fixed BUG#9206, can not use 'UTF-8' for characterSetResults + configuration property. + + - Fixed BUG#9236, a continuation of BUG#8868, where functions used in queries + that should return non-string types when resolved by temporary tables suddenly + become opaque binary strings (work-around for server limitation). Also fixed + fields with type of CHAR(n) CHARACTER SET BINARY to return correct/matching + classes for RSMD.getColumnClassName() and ResultSet.getObject(). + + - Fixed BUG#8792 - DBMD.supportsResultSetConcurrency() not returning + true for forward-only/read-only result sets (we obviously support this). + + - Fixed BUG#8803, 'DATA_TYPE' column from DBMD.getBestRowIdentifier() + causes ArrayIndexOutOfBoundsException when accessed (and in fact, didn't + return any value). + + - Check for empty strings ('') when converting char/varchar column data to numbers, + throw exception if 'emptyStringsConvertToZero' configuration property is set + to 'false' (for backwards-compatibility with 3.0, it is now set to 'true' + by default, but will most likely default to 'false' in 3.2). + + - Fixed BUG#9320 - PreparedStatement.getMetaData() inserts blank row in database + under certain conditions when not using server-side prepared statements. + + - Connection.canHandleAsPreparedStatement() now makes 'best effort' to distinguish + LIMIT clauses with placeholders in them from ones without in order to have fewer + false positives when generating work-arounds for statements the server cannot + currently handle as server-side prepared statements. + + - Fixed build.xml to not compile log4j WorkoutDatesUpdater.logging if log4j not available. + + - Added support for the c3p0 connection pool's (http://c3p0.sf.net/) + validation/connection checker interface which uses the lightweight + 'COM_PING' call to the server if available. To use it, configure your + c3p0 connection pool's 'connectionTesterClassName' property to use + 'com.mysql.jdbc.integration.c3p0.MysqlConnectionTester'. + + - Better detection of LIMIT inside/outside of quoted strings so that + the driver can more correctly determine whether a prepared statement + can be prepared on the server or not. + + - Fixed BUG#9319 - Stored procedures with same name in + different databases confuse the driver when it tries to determine + parameter counts/types. + + - Added finalizers to ResultSet and Statement implementations to be JDBC + spec-compliant, which requires that if not explicitly closed, these + resources should be closed upon garbage collection. + + - Fixed BUG#9682 - Stored procedures with DECIMAL parameters with + storage specifications that contained "," in them would fail. + + - PreparedStatement.setObject(int, Object, int type, int scale) now + uses scale value for BigDecimal instances. + + - Fixed BUG#9704 - Statement.getMoreResults() could throw NPE when + existing result set was .close()d. + + - The performance metrics feature now gathers information about + number of tables referenced in a SELECT. + + - The WorkoutDatesUpdater.logging system is now automatically configured. If the value has + been set by the user, via the URL property "logger" or the system + property "com.mysql.jdbc.logger", then use that, otherwise, autodetect + it using the following steps: + + Log4j, if it's available, + Then JDK1.4 WorkoutDatesUpdater.logging, + Then fallback to our STDERR WorkoutDatesUpdater.logging. + + - Fixed BUG#9778, DBMD.getTables() shouldn't return tables if views + are asked for, even if the database version doesn't support views. + + - Fixed driver not returning 'true' for '-1' when ResultSet.getBoolean() + was called on result sets returned from server-side prepared statements. + + - Added a Manifest.MF file with implementation information to the .jar + file. + + - More tests in Field.isOpaqueBinary() to distinguish opaque binary (i.e. + fields with type CHAR(n) and CHARACTER SET BINARY) from output of + various scalar and aggregate functions that return strings. + + - Fixed BUG#9917 - Should accept null for catalog (meaning use current) + in DBMD methods, even though it's not JDBC-compliant for legacy's sake. + Disable by setting connection property "nullCatalogMeansCurrent" to "false" + (which will be the default value in C/J 3.2.x). + + - Fixed BUG#9769 - Should accept null for name patterns in DBMD (meaning "%"), + even though it isn't JDBC compliant, for legacy's sake. Disable by setting + connection property "nullNamePatternMatchesAll" to "false" (which will be + the default value in C/J 3.2.x). + +02-18-05 - Version 3.1.7-stable + + + - Fixed BUG#7686, Timestamp key column data needed "_binary'" + stripped for UpdatableResultSet.refreshRow(). + + - Fixed BUG#7715 - Timestamps converted incorrectly to strings + with Server-side prepared statements and updatable result sets. + + - Detect new sql_mode variable in string form (it used to be + integer) and adjust quoting method for strings appropriately. + + - Added 'holdResultsOpenOverStatementClose' property (default is + false), that keeps result sets open over statement.close() or new + execution on same statement (suggested by Kevin Burton). + + - Fixed BUG#7952 -- Infinite recursion when 'falling back' to master + in failover configuration. + + - Disable multi-statements (if enabled) for MySQL-4.1 versions prior + to version 4.1.10 if the query cache is enabled, as the server + returns wrong results in this configuration. + + - Fixed duplicated code in configureClientCharset() that prevented + useOldUTF8Behavior=true from working properly. + + - Removed 'dontUnpackBinaryResults' functionality, the driver now + always stores results from server-side prepared statements as-is + from the server and unpacks them on demand. + + - Fixed BUG#8096 where emulated locators corrupt binary data + when using server-side prepared statements. + + - Fixed synchronization issue with + ServerPreparedStatement.serverPrepare() that could cause + deadlocks/crashes if connection was shared between threads. + + - By default, the driver now scans SQL you are preparing via all + variants of Connection.prepareStatement() to determine if it is a + supported type of statement to prepare on the server side, and if + it is not supported by the server, it instead prepares it as a + client-side emulated prepared statement (BUG#4718). You can + disable this by passing 'emulateUnsupportedPstmts=false' in your + JDBC URL. + + - Remove _binary introducer from parameters used as in/out + parameters in CallableStatement. + + - Always return byte[]s for output parameters registered as *BINARY. + + - Send correct value for 'boolean' "true" to server for + PreparedStatement.setObject(n, "true", Types.BIT). + + - Fixed bug with Connection not caching statements from + prepareStatement() when the statement wasn't a server-side + prepared statement. + + - Choose correct 'direction' to apply time adjustments when both + client and server are in GMT timezone when using + ResultSet.get(..., cal) and PreparedStatement.set(...., cal). + + - Added 'dontTrackOpenResources' option (default is false, to be + JDBC compliant), which helps with memory use for non-well-behaved + apps (i.e applications which don't close Statements when they + should). + + - Fixed BUG#8428 - ResultSet.getString() doesn't maintain format + stored on server, bug fix only enabled when 'noDatetimeStringSync' + property is set to 'true' (the default is 'false'). + + - Fixed NPE in ResultSet.realClose() when using usage advisor and + result set was already closed. + + - Fixed BUG#8487 - PreparedStatements not creating streaming result + sets. + + - Don't pass NULL to String.valueOf() in + ResultSet.getNativeConvertToString(), as it stringifies it (i.e. + returns "null"), which is not correct for the method in question. + + - Fixed BUG#8484 - ResultSet.getBigDecimal() throws exception + when rounding would need to occur to set scale. The driver now + chooses a rounding mode of 'half up' if non-rounding + BigDecimal.setScale() fails. + + - Added 'useLocalSessionState' configuration property, when set to + 'true' the JDBC driver trusts that the application is well-behaved + and only sets autocommit and transaction isolation levels using + the methods provided on java.sql.Connection, and therefore can + manipulate these values in many cases without incurring + round-trips to the database server. + + - Added enableStreamingResults() to Statement for connection pool + implementations that check Statement.setFetchSize() for + specification-compliant values. Call Statement.setFetchSize(>=0) + to disable the streaming results for that statement. + + - Added support for BIT type in MySQL-5.0.3. The driver will treat + BIT(1-8) as the JDBC standard BIT type (which maps to + java.lang.Boolean), as the server does not currently send enough + information to determine the size of a bitfield when < 9 bits are + declared. BIT(>9) will be treated as VARBINARY, and will return + byte[] when getObject() is called. + +12-23-04 - Version 3.1.6-stable + + - Fixed hang on SocketInputStream.read() with Statement.setMaxRows() and + multiple result sets when driver has to truncate result set directly, + rather than tacking a 'LIMIT n' on the end of it. + + - Fixed BUG#7026 - DBMD.getProcedures() doesn't respect catalog parameter. + + - Respect bytes-per-character for RSMD.getPrecision(). + +12-02-04 - Version 3.1.5-gamma + + - Fix comparisons made between string constants and dynamic strings that + are either toUpperCase()d or toLowerCase()d to use Locale.ENGLISH, as + some locales 'override' case rules for English. Also use + StringUtils.indexOfIgnoreCase() instead of .toUpperCase().indexOf(), + avoids creating a very short-lived transient String instance. + + - Fixed BUG#5235 - Server-side prepared statements did not honor + 'zeroDateTimeBehavior' property, and would cause class-cast + exceptions when using ResultSet.getObject(), as the all-zero string + was always returned. + + - Fixed batched updates with server prepared statements weren't looking if + the types had changed for a given batched set of parameters compared + to the previous set, causing the server to return the error + 'Wrong arguments to mysql_stmt_execute()'. + + - Handle case when string representation of timestamp contains trailing '.' + with no numbers following it. + + - Fixed BUG#5706 - Inefficient detection of pre-existing string instances + in ResultSet.getNativeString(). + + - Don't throw exceptions for Connection.releaseSavepoint(). + + - Use a per-session Calendar instance by default when decoding dates + from ServerPreparedStatements (set to old, less performant behavior by + setting property 'dynamicCalendars=true'). + + - Added experimental configuration property 'dontUnpackBinaryResults', + which delays unpacking binary result set values until they're asked for, + and only creates object instances for non-numerical values (it is set + to 'false' by default). For some usecase/jvm combinations, this is + friendlier on the garbage collector. + + - Fixed BUG#5729 - UNSIGNED BIGINT unpacked incorrectly from + server-side prepared statement result sets. + + - Fixed BUG#6225 - ServerSidePreparedStatement allocating short-lived + objects un-necessarily. + + - Removed un-wanted new Throwable() in ResultSet constructor due to bad + merge (caused a new object instance that was never used for every result + set created) - Found while profiling for BUG#6359. + + - Fixed too-early creation of StringBuffer in EscapeProcessor.escapeSQL(), + also return String when escaping not needed (to avoid unnecssary object + allocations). Found while profiling for BUG#6359. + + - Use null-safe-equals for key comparisons in updatable result sets. + + - Fixed BUG#6537, SUM() on Decimal with server-side prepared statement ignores + scale if zero-padding is needed (this ends up being due to conversion to DOUBLE + by server, which when converted to a string to parse into BigDecimal, loses all + 'padding' zeros). + + - Use DatabaseMetaData.getIdentifierQuoteString() when building DBMD + queries. + + - Use 1MB packet for sending file for LOAD DATA LOCAL INFILE if that + is < 'max_allowed_packet' on server. + + - Fixed BUG#6399, ResultSetMetaData.getColumnDisplaySize() returns incorrect + values for multibyte charsets. + + - Make auto-deserialization of java.lang.Objects stored in BLOBs + configurable via 'autoDeserialize' property (defaults to 'false'). + + - Re-work Field.isOpaqueBinary() to detect 'CHAR(n) CHARACTER SET BINARY' + to support fixed-length binary fields for ResultSet.getObject(). + + - Use our own implementation of buffered input streams to get around + blocking behavior of java.io.BufferedInputStream. Disable this with + 'useReadAheadInput=false'. + + - Fixed BUG#6348, failing to connect to the server when one of the + addresses for the given host name is IPV6 (which the server does + not yet bind on). The driver now loops through _all_ IP addresses + for a given host, and stops on the first one that accepts() a + socket.connect(). + +09-04-04 - Version 3.1.4-beta + + - Fixed BUG#4510 - connector/j 3.1.3 beta does not handle integers + correctly (caused by changes to support unsigned reads in + Buffer.readInt() -> Buffer.readShort()). + + - Added support in DatabaseMetaData.getTables() and getTableTypes() + for VIEWs which are now available in MySQL server version 5.0.x. + + - Fixed BUG#4642 -- ServerPreparedStatement.execute*() sometimes + threw ArrayIndexOutOfBoundsException when unpacking field metadata. + + - Optimized integer number parsing, enable 'old' slower integer parsing + using JDK classes via 'useFastIntParsing=false' property. + + - Added 'useOnlyServerErrorMessages' property, which causes message text + in exceptions generated by the server to only contain the text sent by + the server (as opposed to the SQLState's 'standard' description, followed + by the server's error message). This property is set to 'true' by default. + + - Fixed BUG#4689 - ResultSet.wasNull() does not work for primatives if a + previous null was returned. + + - Track packet sequence numbers if enablePacketDebug=true, and throw an + exception if packets received out-of-order. + + - Fixed BUG#4482, ResultSet.getObject() returns wrong type for strings + when using prepared statements. + + - Calling MysqlPooledConnection.close() twice (even though an application + error), caused NPE. Fixed. + + - Fixed BUG#5012 -- ServerPreparedStatements dealing with return of + DECIMAL type don't work. + + - Fixed BUG#5032 -- ResultSet.getObject() doesn't return + type Boolean for pseudo-bit types from prepared statements on 4.1.x + (shortcut for avoiding extra type conversion when using binary-encoded + result sets obscurred test in getObject() for 'pseudo' bit type) + + - You can now use URLs in 'LOAD DATA LOCAL INFILE' statements, and the + driver will use Java's built-in handlers for retreiving the data and + sending it to the server. This feature is not enabled by default, + you must set the 'allowUrlInLocalInfile' connection property to 'true'. + + - The driver is more strict about truncation of numerics on + ResultSet.get*(), and will throw a SQLException when truncation is + detected. You can disable this by setting 'jdbcCompliantTruncation' to + false (it is enabled by default, as this functionality is required + for JDBC compliance). + + - Added three ways to deal with all-zero datetimes when reading them from + a ResultSet, 'exception' (the default), which throws a SQLException + with a SQLState of 'S1009', 'convertToNull', which returns NULL instead of + the date, and 'round', which rounds the date to the nearest closest value + which is '0001-01-01'. + + - Fixed ServerPreparedStatement to read prepared statement metadata off + the wire, even though it's currently a placeholder instead of using + MysqlIO.clearInputStream() which didn't work at various times because + data wasn't available to read from the server yet. This fixes sporadic + errors users were having with ServerPreparedStatements throwing + ArrayIndexOutOfBoundExceptions. + + - Use com.mysql.jdbc.Message's classloader when loading resource bundle, + should fix sporadic issues when the caller's classloader can't locate + the resource bundle. + +07-07-04 - Version 3.1.3-beta + + - Mangle output parameter names for CallableStatements so they + will not clash with user variable names. + + - Added support for INOUT parameters in CallableStatements. + + - Fix for BUG#4119, null bitmask sent for server-side prepared + statements was incorrect. + + - Use SQL Standard SQL states by default, unless 'useSqlStateCodes' + property is set to 'false'. + + - Added packet debuging code (see the 'enablePacketDebug' property + documentation). + + - Added constants for MySQL error numbers (publicly-accessible, + see com.mysql.jdbc.MysqlErrorNumbers), and the ability to + generate the mappings of vendor error codes to SQLStates + that the driver uses (for documentation purposes). + + - Externalized more messages (on-going effort). + + - Fix for BUG#4311 - Error in retrieval of mediumint column with + prepared statements and binary protocol. + + - Support new timezone variables in MySQL-4.1.3 when + 'useTimezone=true' + + - Support for unsigned numerics as return types from prepared statements. + This also causes a change in ResultSet.getObject() for the 'bigint unsigned' + type, which used to return BigDecimal instances, it now returns instances + of java.lang.BigInteger. + +06-09-04 - Version 3.1.2-alpha + + - Fixed stored procedure parameter parsing info when size was + specified for a parameter (i.e. char(), varchar()). + + - Enabled callable statement caching via 'cacheCallableStmts' + property. + + - Fixed case when no output parameters specified for a + stored procedure caused a bogus query to be issued + to retrieve out parameters, leading to a syntax error + from the server. + + - Fixed case when no parameters could cause a NullPointerException + in CallableStatement.setOutputParameters(). + + - Removed wrapping of exceptions in MysqlIO.changeUser(). + + - Fixed sending of split packets for large queries, enabled nio + ability to send large packets as well. + + - Added .toString() functionality to ServerPreparedStatement, + which should help if you're trying to debug a query that is + a prepared statement (it shows SQL as the server would process). + + - Added 'gatherPerformanceMetrics' property, along with properties + to control when/where this info gets logged (see docs for more + info). + + - ServerPreparedStatements weren't actually de-allocating + server-side resources when .close() was called. + + - Added 'logSlowQueries' property, along with property + 'slowQueriesThresholdMillis' to control when a query should + be considered 'slow'. + + - Correctly map output parameters to position given in + prepareCall() vs. order implied during registerOutParameter() - + fixes BUG#3146. + + - Correctly detect initial character set for servers >= 4.1.0 + + - Cleaned up detection of server properties. + + - Support placeholder for parameter metadata for server >= 4.1.2 + + - Fix for BUG#3539 getProcedures() does not return any procedures in + result set + + - Fix for BUG#3540 getProcedureColumns() doesn't work with wildcards + for procedure name + + - Fixed BUG#3520 -- DBMD.getSQLStateType() returns incorrect value. + + - Added 'connectionCollation' property to cause driver to issue + 'set collation_connection=...' query on connection init if default + collation for given charset is not appropriate. + + - Fixed DatabaseMetaData.getProcedures() when run on MySQL-5.0.0 (output of + 'show procedure status' changed between 5.0.1 and 5.0.0. + + - Fixed BUG#3804 -- getWarnings() returns SQLWarning instead of DataTruncation + + - Don't enable server-side prepared statements for server version 5.0.0 or 5.0.1, + as they aren't compatible with the '4.1.2+' style that the driver uses (the driver + expects information to come back that isn't there, so it hangs). + + +02-14-04 - Version 3.1.1-alpha + + - Fixed bug with UpdatableResultSets not using client-side + prepared statements. + + - Fixed character encoding issues when converting bytes to + ASCII when MySQL doesn't provide the character set, and + the JVM is set to a multibyte encoding (usually affecting + retrieval of numeric values). + + - Unpack 'unknown' data types from server prepared statements + as Strings. + + - Implemented long data (Blobs, Clobs, InputStreams, Readers) + for server prepared statements. + + - Implemented Statement.getWarnings() for MySQL-4.1 and newer + (using 'SHOW WARNINGS'). + + - Default result set type changed to TYPE_FORWARD_ONLY + (JDBC compliance). + + - Centralized setting of result set type and concurrency. + + - Re-factored how connection properties are set and exposed + as DriverPropertyInfo as well as Connection and DataSource + properties. + + - Support for NIO. Use 'useNIO=true' on platforms that support + NIO. + + - Support for SAVEPOINTs (MySQL >= 4.0.14 or 4.1.1). + + - Support for mysql_change_user()...See the changeUser() method + in com.mysql.jdbc.Connection. + + - Reduced number of methods called in average query to be more + efficient. + + - Prepared Statements will be re-prepared on auto-reconnect. Any errors + encountered are postponed until first attempt to re-execute the + re-prepared statement. + + - Ensure that warnings are cleared before executing queries + on prepared statements, as-per JDBC spec (now that we support + warnings). + + - Support 'old' profileSql capitalization in ConnectionProperties. + This property is deprecated, you should use 'profileSQL' if possible. + + - Optimized Buffer.readLenByteArray() to return shared empty byte array + when length is 0. + + - Allow contents of PreparedStatement.setBlob() to be retained + between calls to .execute*(). + + - Deal with 0-length tokens in EscapeProcessor (caused by callable + statement escape syntax). + + - Check for closed connection on delete/update/insert row operations in + UpdatableResultSet. + + - Fix support for table aliases when checking for all primary keys in + UpdatableResultSet. + + - Removed useFastDates connection property. + + - Correctly initialize datasource properties from JNDI Refs, including + explicitly specified URLs. + + - DatabaseMetaData now reports supportsStoredProcedures() for + MySQL versions >= 5.0.0 + + - Fixed stack overflow in Connection.prepareCall() (bad merge). + + - Fixed IllegalAccessError to Calendar.getTimeInMillis() in DateTimeValue + (for JDK < 1.4). + + - Fix for BUG#1673, where DatabaseMetaData.getColumns() is not + returning correct column ordinal info for non '%' column name patterns. + + - Merged fix of datatype mapping from MySQL type 'FLOAT' to + java.sql.Types.REAL from 3.0 branch. + + - Detect collation of column for RSMD.isCaseSensitive(). + + - Fixed sending of queries > 16M. + + - Added named and indexed input/output parameter support to CallableStatement. + MySQL-5.0.x or newer. + + - Fixed NullPointerException in ServerPreparedStatement.setTimestamp(), + as well as year and month descrepencies in + ServerPreparedStatement.setTimestamp(), setDate(). + + - Added ability to have multiple database/JVM targets for compliance + and regression/unit tests in build.xml. + + - Fixed NPE and year/month bad conversions when accessing some + datetime functionality in ServerPreparedStatements and their + resultant result sets. + + - Display where/why a connection was implicitly closed (to + aid debugging). + + - CommunicationsException implemented, that tries to determine + why communications was lost with a server, and displays + possible reasons when .getMessage() is called. + + - Fixed BUG#2359, NULL values for numeric types in binary + encoded result sets causing NullPointerExceptions. + + - Implemented Connection.prepareCall(), and DatabaseMetaData. + getProcedures() and getProcedureColumns(). + + - Reset 'long binary' parameters in ServerPreparedStatement when + clearParameters() is called, by sending COM_RESET_STMT to the + server. + + - Merged prepared statement caching, and .getMetaData() support + from 3.0 branch. + + - Fixed off-by-1900 error in some cases for + years in TimeUtil.fastDate/TimeCreate() when unpacking results + from server-side prepared statements. + + - Fixed BUG#2502 -- charset conversion issue in getTables(). + + - Implemented multiple result sets returned from a statement + or stored procedure. + + - Fixed BUG#2606 -- Server side prepared statements not returning + datatype 'YEAR' correctly. + + - Enabled streaming of result sets from server-side prepared + statements. + + - Fixed BUG#2623 -- Class-cast exception when using + scrolling result sets and server-side prepared statements. + + - Merged unbuffered input code from 3.0. + + - Fixed ConnectionProperties that weren't properly exposed + via accessors, cleaned up ConnectionProperties code. + + - Fixed BUG#2671, NULL fields not being encoded correctly in + all cases in server side prepared statements. + + - Fixed rare buffer underflow when writing numbers into buffers + for sending prepared statement execution requests. + + - Use DocBook version of docs for shipped versions of drivers. + + +02-18-03 - Version 3.1.0-alpha + + - Added 'requireSSL' property. + + - Added 'useServerPrepStmts' property (default 'false'). The + driver will use server-side prepared statements when the + server version supports them (4.1 and newer) when this + property is set to 'true'. It is currently set to 'false' + by default until all bind/fetch functionality has been + implemented. Currently only DML prepared statements are + implemented for 4.1 server-side prepared statements. + + - Track open Statements, close all when Connection.close() + is called (JDBC compliance). + +06-22-05 - Version 3.0.17-ga + + - Fixed BUG#5874, Timestamp/Time conversion goes in the wrong 'direction' + when useTimeZone='true' and server timezone differs from client timezone. + + - Fixed BUG#7081, DatabaseMetaData.getIndexInfo() ignoring 'unique' + parameter. + + - Support new protocol type 'MYSQL_TYPE_VARCHAR'. + + - Added 'useOldUTF8Behavoior' configuration property, which causes + JDBC driver to act like it did with MySQL-4.0.x and earlier when + the character encoding is 'utf-8' when connected to MySQL-4.1 or + newer. + + - Fixed BUG#7316 - Statements created from a pooled connection were + returning physical connection instead of logical connection when + getConnection() was called. + + - Fixed BUG#7033 - PreparedStatements don't encode Big5 (and other + multibyte) character sets correctly in static SQL strings. + + - Fixed BUG#6966, connections starting up failed-over (due to down master) + never retry master. + + - Fixed BUG#7061, PreparedStatement.fixDecimalExponent() adding extra + '+', making number unparseable by MySQL server. + + - Fixed BUG#7686, Timestamp key column data needed "_binary'" stripped for + UpdatableResultSet.refreshRow(). + + - Backported SQLState codes mapping from Connector/J 3.1, enable with + 'useSqlStateCodes=true' as a connection property, it defaults to + 'false' in this release, so that we don't break legacy applications (it + defaults to 'true' starting with Connector/J 3.1). + + - Fixed BUG#7601, PreparedStatement.fixDecimalExponent() adding extra + '+', making number unparseable by MySQL server. + + - Escape sequence {fn convert(..., type)} now supports ODBC-style types + that are prepended by 'SQL_'. + + - Fixed duplicated code in configureClientCharset() that prevented + useOldUTF8Behavior=true from working properly. + + - Handle streaming result sets with > 2 billion rows properly by fixing + wraparound of row number counter. + + - Fixed BUG#7607 - MS932, SHIFT_JIS and Windows_31J not recog. as + aliases for sjis. + + - Fixed BUG#6549 (while fixing #7607), adding 'CP943' to aliases for + sjis. + + - Fixed BUG#8064, which requires hex escaping of binary data when using + multibyte charsets with prepared statements. + + - Fixed BUG#8812, NON_UNIQUE column from DBMD.getIndexInfo() returned + inverted value. + + - Workaround for server BUG#9098 - default values of CURRENT_* for + DATE/TIME/TIMESTAMP/TIMESTAMP columns can't be distinguished from + 'string' values, so UpdatableResultSet.moveToInsertRow() generates + bad SQL for inserting default values. + + - Fixed BUG#8629 - 'EUCKR' charset is sent as 'SET NAMES euc_kr' which + MySQL-4.1 and newer doesn't understand. + + - DatabaseMetaData.supportsSelectForUpdate() returns correct value based + on server version. + + - Use hex escapes for PreparedStatement.setBytes() for double-byte charsets + including 'aliases' Windows-31J, CP934, MS932. + + - Added support for the "EUC_JP_Solaris" character encoding, which maps + to a MySQL encoding of "eucjpms" (backported from 3.1 branch). This only + works on servers that support eucjpms, namely 5.0.3 or later. + +11-15-04 - Version 3.0.16-ga + + - Re-issue character set configuration commands when re-using pooled + connections and/or Connection.changeUser() when connected to MySQL-4.1 + or newer. + + - Fixed ResultSetMetaData.isReadOnly() to detect non-writable columns + when connected to MySQL-4.1 or newer, based on existence of 'original' + table and column names. + + - Fixed BUG#5664, ResultSet.updateByte() when on insert row + throws ArrayOutOfBoundsException. + + - Fixed DatabaseMetaData.getTypes() returning incorrect (i.e. non-negative) + scale for the 'NUMERIC' type. + + - Fixed BUG#6198, off-by-one bug in Buffer.readString(string). + + - Made TINYINT(1) -> BIT/Boolean conversion configurable via 'tinyInt1isBit' + property (default 'true' to be JDBC compliant out of the box). + + - Only set 'character_set_results' during connection establishment if + server version >= 4.1.1. + + - Fixed regression where useUnbufferedInput was defaulting to 'false'. + + - Fixed BUG#6231, ResultSet.getTimestamp() on a column with TIME in it + fails. + +09-04-04 - Version 3.0.15-ga + + - Fixed BUG#4010 - StringUtils.escapeEasternUnicodeByteStream is still + broken for GBK + + - Fixed BUG#4334 - Failover for autoReconnect not using port #'s for any + hosts, and not retrying all hosts. (WARN: This required a change to + the SocketFactory connect() method signature, which is now + + public Socket connect(String host, int portNumber, Properties props), + + therefore any third-party socket factories will have to be changed + to support this signature. + + - Logical connections created by MysqlConnectionPoolDataSource will + now issue a rollback() when they are closed and sent back to the pool. + If your application server/connection pool already does this for you, you + can set the 'rollbackOnPooledClose' property to false to avoid the + overhead of an extra rollback(). + + - Removed redundant calls to checkRowPos() in ResultSet. + + - Fixed BUG#4742, 'DOUBLE' mapped twice in DBMD.getTypeInfo(). + + - Added FLOSS license exemption. + + - Fixed BUG#4808, calling .close() twice on a PooledConnection causes NPE. + + - Fixed BUG#4138 and BUG#4860, DBMD.getColumns() returns incorrect JDBC + type for unsigned columns. This affects type mappings for all numeric + types in the RSMD.getColumnType() and RSMD.getColumnTypeNames() methods + as well, to ensure that 'like' types from DBMD.getColumns() match up + with what RSMD.getColumnType() and getColumnTypeNames() return. + + - 'Production' - 'GA' in naming scheme of distributions. + + - Fix for BUG#4880, RSMD.getPrecision() returning 0 for non-numeric types + (should return max length in chars for non-binary types, max length + in bytes for binary types). This fix also fixes mapping of + RSMD.getColumnType() and RSMD.getColumnTypeName() for the BLOB types based + on the length sent from the server (the server doesn't distinguish between + TINYBLOB, BLOB, MEDIUMBLOB or LONGBLOB at the network protocol level). + + - Fixed BUG#5022 - ResultSet should release Field[] instance in .close(). + + - Fixed BUG#5069 -- ResultSet.getMetaData() should not return + incorrectly-initialized metadata if the result set has been closed, but + should instead throw a SQLException. Also fixed for getRow() and + getWarnings() and traversal methods by calling checkClosed() before + operating on instance-level fields that are nullified during .close(). + + - Parse new timezone variables from 4.1.x servers. + + - Use _binary introducer for PreparedStatement.setBytes() and + set*Stream() when connected to MySQL-4.1.x or newer to avoid + misinterpretation during character conversion. + +05-28-04 - Version 3.0.14-production + + - Fixed URL parsing error + +05-27-04 - Version 3.0.13-production + + - Fixed BUG#3848 - Using a MySQLDatasource without server name fails + + - Fixed BUG#3920 - "No Database Selected" when using + MysqlConnectionPoolDataSource. + + - Fixed BUG#3873 - PreparedStatement.getGeneratedKeys() method returns only + 1 result for batched insertions + +05-18-04 - Version 3.0.12-production + + - Add unsigned attribute to DatabaseMetaData.getColumns() output + in the TYPE_NAME column. + + - Added 'failOverReadOnly' property, to allow end-user to configure + state of connection (read-only/writable) when failed over. + + - Backported 'change user' and 'reset server state' functionality + from 3.1 branch, to allow clients of MysqlConnectionPoolDataSource + to reset server state on getConnection() on a pooled connection. + + - Don't escape SJIS/GBK/BIG5 when using MySQL-4.1 or newer. + + - Allow 'url' parameter for MysqlDataSource and MysqlConnectionPool + DataSource so that passing of other properties is possible from + inside appservers. + + - Map duplicate key and foreign key errors to SQLState of + '23000'. + + - Backport documentation tooling from 3.1 branch. + + - Return creating statement for ResultSets created by + getGeneratedKeys() (BUG#2957) + + - Allow java.util.Date to be sent in as parameter to + PreparedStatement.setObject(), converting it to a Timestamp + to maintain full precision (BUG#3103). + + - Don't truncate BLOBs/CLOBs when using setBytes() and/or + setBinary/CharacterStream() (BUG#2670). + + - Dynamically configure character set mappings for field-level + character sets on MySQL-4.1.0 and newer using 'SHOW COLLATION' + when connecting. + + - Map 'binary' character set to 'US-ASCII' to support DATETIME + charset recognition for servers >= 4.1.2 + + - Use 'SET character_set_results" during initialization to allow any + charset to be returned to the driver for result sets. + + - Use charsetnr returned during connect to encode queries before + issuing 'SET NAMES' on MySQL >= 4.1.0. + + - Add helper methods to ResultSetMetaData (getColumnCharacterEncoding() + and getColumnCharacterSet()) to allow end-users to see what charset + the driver thinks it should be using for the column. + + - Only set character_set_results for MySQL >= 4.1.0. + + - Fixed BUG#3511, StringUtils.escapeSJISByteStream() not covering all + eastern double-byte charsets correctly. + + - Renamed StringUtils.escapeSJISByteStream() to more appropriate + escapeEasternUnicodeByteStream(). + + - Fixed BUG#3554 - Not specifying database in URL caused MalformedURL + exception. + + - Auto-convert MySQL encoding names to Java encoding names if used + for characterEncoding property. + + - Added encoding names that are recognized on some JVMs to fix case + where they were reverse-mapped to MySQL encoding names incorrectly. + + - Use junit.textui.TestRunner for all unit tests (to allow them to be + run from the command line outside of Ant or Eclipse). + + - Fixed BUG#3557 - UpdatableResultSet not picking up default values + for moveToInsertRow(). + + - Fixed BUG#3570 - inconsistent reporting of column type. The server + still doesn't return all types for *BLOBs *TEXT correctly, so the + driver won't return those correctly. + + - Fixed BUG#3520 -- DBMD.getSQLStateType() returns incorrect value. + + - Fixed regression in PreparedStatement.setString() and eastern character + encodings. + + - Made StringRegressionTest 4.1-unicode aware. + +02-19-04 - Version 3.0.11-stable + + - Trigger a 'SET NAMES utf8' when encoding is forced to 'utf8' _or_ + 'utf-8' via the 'characterEncoding' property. Previously, only the + Java-style encoding name of 'utf-8' would trigger this. + + - AutoReconnect time was growing faster than exponentially (BUG#2447). + + - Fixed failover always going to last host in list (BUG#2578) + + - Added 'useUnbufferedInput' parameter, and now use it by default + (due to JVM issue + http://developer.java.sun.com/developer/bugParade/bugs/4401235.html) + + - Detect 'on/off' or '1','2','3' form of lower_case_table_names on + server. + + - Return 'java.lang.Integer' for TINYINT and SMALLINT types from + ResultSetMetaData.getColumnClassName() (fix for BUG#2852). + + - Return 'java.lang.Double' for FLOAT type from ResultSetMetaData. + getColumnClassName() (fix for BUG#2855). + + - Return '[B' instead of java.lang.Object for BINARY, VARBINARY and + LONGVARBINARY types from ResultSetMetaData.getColumnClassName() + (JDBC compliance). + +01-13-04 - Version 3.0.10-stable + + - Don't count quoted id's when inside a 'string' in PreparedStatement + parsing (fix for BUG#1511). + + - 'Friendlier' exception message for PacketTooLargeException + (BUG#1534). + + - Backported fix for aliased tables and UpdatableResultSets in + checkUpdatability() method from 3.1 branch. + + - Fix for ArrayIndexOutOfBounds exception when using Statement.setMaxRows() + (BUG#1695). + + - Fixed BUG#1576, dealing with large blobs and split packets not being + read correctly. + + - Fixed regression of Statement.getGeneratedKeys() and REPLACE statements. + + - Fixed BUG#1630, subsequent call to ResultSet.updateFoo() causes NPE if + result set is not updatable. + + - Fix for 4.1.1-style auth with no password. + + - Fix for BUG#1731, Foreign Keys column sequence is not consistent in + DatabaseMetaData.getImported/Exported/CrossReference(). + + - Fix for BUG#1775 - DatabaseMetaData.getSystemFunction() returning + bad function 'VResultsSion'. + + - Fix for BUG#1592 -- cross-database updatable result sets + are not checked for updatability correctly. + + - DatabaseMetaData.getColumns() should return Types.LONGVARCHAR for + MySQL LONGTEXT type. + + - ResultSet.getObject() on TINYINT and SMALLINT columns should return + Java type 'Integer' (BUG#1913) + + - Added 'alwaysClearStream' connection property, which causes the driver + to always empty any remaining data on the input stream before + each query. + + - Added more descriptive error message 'Server Configuration Denies + Access to DataSource', as well as retrieval of message from server. + + - Autoreconnect code didn't set catalog upon reconnect if it had been + changed. + + - Implement ResultSet.updateClob(). + + - ResultSetMetaData.isCaseSensitive() returned wrong value for CHAR/VARCHAR + columns. + + - Fix for BUG#1933 -- Connection property "maxRows" not honored. + + - Fix for BUG#1925 -- Statements being created too many times in + DBMD.extractForeignKeyFromCreateTable(). + + - Fix for BUG#1914 -- Support escape sequence {fn convert ... } + + - Fix for BUG#1958 -- ArrayIndexOutOfBounds when parameter number == + number of parameters + 1. + + - Fix for BUG#2006 -- ResultSet.findColumn() should use first matching + column name when there are duplicate column names in SELECT query + (JDBC-compliance). + + - Removed static synchronization bottleneck from + PreparedStatement.setTimestamp(). + + - Removed static synchronization bottleneck from instance factory + method of SingleByteCharsetConverter. + + - Enable caching of the parsing stage of prepared statements via + the 'cachePrepStmts', 'prepStmtCacheSize' and 'prepStmtCacheSqlLimit' + properties (disabled by default). + + - Speed up parsing of PreparedStatements, try to use one-pass whenever + possible. + + - Fixed security exception when used in Applets (applets can't + read the system property 'file.encoding' which is needed + for LOAD DATA LOCAL INFILE). + + - Use constants for SQLStates. + + - Map charset 'ko18_ru' to 'ko18r' when connected to MySQL-4.1.0 or + newer. + + - Ensure that Buffer.writeString() saves room for the \0. + + - Fixed exception 'Unknown character set 'danish' on connect w/ JDK-1.4.0 + + - Fixed mappings in SQLError to report deadlocks with SQLStates of '41000'. + + - 'maxRows' property would affect internal statements, so check it for all + statement creation internal to the driver, and set to 0 when it is not. + +10-07-03 - Version 3.0.9-stable + + - Faster date handling code in ResultSet and PreparedStatement (no longer + uses Date methods that synchronize on static calendars). + + - Fixed test for end of buffer in Buffer.readString(). + + - Fixed ResultSet.previous() behavior to move current + position to before result set when on first row + of result set (bugs.mysql.com BUG#496) + + - Fixed Statement and PreparedStatement issuing bogus queries + when setMaxRows() had been used and a LIMIT clause was present + in the query. + + - Fixed BUG#661 - refreshRow didn't work when primary key values + contained values that needed to be escaped (they ended up being + doubly-escaped). + + - Support InnoDB contraint names when extracting foreign key info + in DatabaseMetaData BUG#517 and BUG#664 + (impl. ideas from Parwinder Sekhon) + + - Backported 4.1 protocol changes from 3.1 branch (server-side SQL + states, new field info, larger client capability flags, + connect-with-database, etc). + + - Fix UpdatableResultSet to return values for getXXX() when on + insert row (BUG#675). + + - The insertRow in an UpdatableResultSet is now loaded with + the default column values when moveToInsertRow() is called + (BUG#688) + + - DatabaseMetaData.getColumns() wasn't returning NULL for + default values that are specified as NULL. + + - Change default statement type/concurrency to TYPE_FORWARD_ONLY + and CONCUR_READ_ONLY (spec compliance). + + - Don't try and reset isolation level on reconnect if MySQL doesn't + support them. + + - Don't wrap SQLExceptions in RowDataDynamic. + + - Don't change timestamp TZ twice if useTimezone==true (BUG#774) + + - Fixed regression in large split-packet handling (BUG#848). + + - Better diagnostic error messages in exceptions for 'streaming' + result sets. + + - Issue exception on ResultSet.getXXX() on empty result set (wasn't + caught in some cases). + + - Don't hide messages from exceptions thrown in I/O layers. + + - Don't fire connection closed events when closing pooled connections, or + on PooledConnection.getConnection() with already open connections (BUG#884). + + - Clip +/- INF (to smallest and largest representative values for the type in + MySQL) and NaN (to 0) for setDouble/setFloat(), and issue a warning on the + statement when the server does not support +/- INF or NaN. + + - Fix for BUG#879, double-escaping of '\' when charset is SJIS or GBK and '\' + appears in non-escaped input. + + - When emptying input stream of unused rows for 'streaming' result sets, + have the current thread yield() every 100 rows in order to not monopolize + CPU time. + + - Fixed BUG#1099, DatabaseMetaData.getColumns() getting confused about the + keyword 'set' in character columns. + + - Fixed deadlock issue with Statement.setMaxRows(). + + - Fixed CLOB.truncate(), BUG#1130 + + - Optimized CLOB.setChracterStream(), BUG#1131 + + - Made databaseName, portNumber and serverName optional parameters + for MysqlDataSourceFactory (BUG#1246) + + - Fix for BUG#1247 -- ResultSet.get/setString mashing char 127 + + - Backported auth. changes for 4.1.1 and newer from 3.1 branch. + + - Added com.mysql.jdbc.util.BaseBugReport to help creation of testcases + for bug reports. + + - Added property to 'clobber' streaming results, by setting the + 'clobberStreamingResults' property to 'true' (the default is 'false'). + This will cause a 'streaming' ResultSet to be automatically + closed, and any oustanding data still streaming from the server to + be discarded if another query is executed before all the data has been + read from the server. + +05-23-03 - Version 3.0.8-stable + + - Allow bogus URLs in Driver.getPropertyInfo(). + + - Return list of generated keys when using multi-value INSERTS + with Statement.getGeneratedKeys(). + + - Use JVM charset with filenames and 'LOAD DATA [LOCAL] INFILE' + + - Fix infinite loop with Connection.cleanup(). + + - Changed Ant target 'compile-core' to 'compile-driver', and + made testsuite compilation a separate target. + + - Fixed result set not getting set for Statement.executeUpdate(), + which affected getGeneratedKeys() and getUpdateCount() in + some cases. + + - Unicode character 0xFFFF in a string would cause the driver to + throw an ArrayOutOfBoundsException (Bug #378) + + - Return correct amount of generated keys when using 'REPLACE' + statements. + + - Fix problem detecting server character set in some cases. + + - Fix row data decoding error when using _very_ large packets. + + - Optimized row data decoding. + + - Issue exception when operating on an already-closed + prepared statement. + + - Fixed SJIS encoding bug, thanks to Naoto Sato. + + - Optimized usage of EscapeProcessor. + + - Allow multiple calls to Statement.close() + +04-08-03 - Version 3.0.7-stable + + - Fixed MysqlPooledConnection.close() calling wrong event type. + + - Fixed StringIndexOutOfBoundsException in PreparedStatement. + setClob(). + + - 4.1 Column Metadata fixes + + - Remove synchronization from Driver.connect() and + Driver.acceptsUrl(). + + - IOExceptions during a transaction now cause the Connection to + be closed. + + - Fixed missing conversion for 'YEAR' type in ResultSetMetaData. + getColumnTypeName(). + + - Don't pick up indexes that start with 'pri' as primary keys + for DBMD.getPrimaryKeys(). + + - Throw SQLExceptions when trying to do operations on a forcefully + closed Connection (i.e. when a communication link failure occurs). + + - You can now toggle profiling on/off using + Connection.setProfileSql(boolean). + + - Fixed charset issues with database metadata (charset was not + getting set correctly). + + - Updatable ResultSets can now be created for aliased tables/columns + when connected to MySQL-4.1 or newer. + + - Fixed 'LOAD DATA LOCAL INFILE' bug when file > max_allowed_packet. + + - Fixed escaping of 0x5c ('\') character for GBK and Big5 charsets. + + - Fixed ResultSet.getTimestamp() when underlying field is of type DATE. + + - Ensure that packet size from alignPacketSize() does not + exceed MAX_ALLOWED_PACKET (JVM bug) + + - Don't reset Connection.isReadOnly() when autoReconnecting. + +02-18-03 - Version 3.0.6-stable + + - Fixed ResultSetMetaData to return "" when catalog not known. + Fixes NullPointerExceptions with Sun's CachedRowSet. + + - Fixed DBMD.getTypeInfo() and DBMD.getColumns() returning + different value for precision in TEXT/BLOB types. + + - Allow ignoring of warning for 'non transactional tables' during + rollback (compliance/usability) by setting 'ignoreNonTxTables' + property to 'true'. + + - Fixed SQLExceptions getting swallowed on initial connect. + + - Fixed Statement.setMaxRows() to stop sending 'LIMIT' type queries + when not needed (performance) + + - Clean up Statement query/method mismatch tests (i.e. INSERT not + allowed with .executeQuery()). + + - More checks added in ResultSet traversal method to catch + when in closed state. + + - Fixed ResultSetMetaData.isWritable() to return correct value. + + - Add 'window' of different NULL sorting behavior to + DBMD.nullsAreSortedAtStart (4.0.2 to 4.0.10, true, otherwise, + no). + + - Implemented Blob.setBytes(). You still need to pass the + resultant Blob back into an updatable ResultSet or + PreparedStatement to persist the changes, as MySQL does + not support 'locators'. + + - Backported 4.1 charset field info changes from Connector/J 3.1 + +01-22-03 - Version 3.0.5-gamma + + - Fixed Buffer.fastSkipLenString() causing ArrayIndexOutOfBounds + exceptions with some queries when unpacking fields. + + - Implemented an empty TypeMap for Connection.getTypeMap() so that + some third-party apps work with MySQL (IBM WebSphere 5.0 Connection + pool). + + - Added missing LONGTEXT type to DBMD.getColumns(). + + - Retrieve TX_ISOLATION from database for + Connection.getTransactionIsolation() when the MySQL version + supports it, instead of an instance variable. + + - Quote table names in DatabaseMetaData.getColumns(), + getPrimaryKeys(), getIndexInfo(), getBestRowIdentifier() + + - Greatly reduce memory required for setBinaryStream() in + PreparedStatements. + + - Fixed ResultSet.isBeforeFirst() for empty result sets. + + - Added update options for foreign key metadata. + + +01-06-03 - Version 3.0.4-gamma + + - Added quoted identifiers to database names for + Connection.setCatalog. + + - Added support for quoted identifiers in PreparedStatement + parser. + + - Streamlined character conversion and byte[] handling in + PreparedStatements for setByte(). + + - Reduce memory footprint of PreparedStatements by sharing + outbound packet with MysqlIO. + + - Added 'strictUpdates' property to allow control of amount + of checking for 'correctness' of updatable result sets. Set this + to 'false' if you want faster updatable result sets and you know + that you create them from SELECTs on tables with primary keys and + that you have selected all primary keys in your query. + + - Added support for 4.0.8-style large packets. + + - Fixed PreparedStatement.executeBatch() parameter overwriting. + +12-17-02 - Version 3.0.3-dev + + - Changed charsToByte in SingleByteCharConverter to be non-static + + - Changed SingleByteCharConverter to use lazy initialization of each + converter. + + - Fixed charset handling in Fields.java + + - Implemented Connection.nativeSQL() + + - More robust escape tokenizer -- recognize '--' comments, and allow + nested escape sequences (see testsuite.EscapeProcessingTest) + + - DBMD.getImported/ExportedKeys() now handles multiple foreign keys + per table. + + - Fixed ResultSetMetaData.getPrecision() returning incorrect values + for some floating point types. + + - Fixed ResultSetMetaData.getColumnTypeName() returning BLOB for + TEXT and TEXT for BLOB types. + + - Fixed Buffer.isLastDataPacket() for 4.1 and newer servers. + + - Added CLIENT_LONG_FLAG to be able to get more column flags + (isAutoIncrement() being the most important) + + - Because of above, implemented ResultSetMetaData.isAutoIncrement() + to use Field.isAutoIncrement(). + + - Honor 'lower_case_table_names' when enabled in the server when + doing table name comparisons in DatabaseMetaData methods. + + - Some MySQL-4.1 protocol support (extended field info from selects) + + - Use non-aliased table/column names and database names to fullly + qualify tables and columns in UpdatableResultSet (requires + MySQL-4.1 or newer) + + - Allow user to alter behavior of Statement/ + PreparedStatement.executeBatch() via 'continueBatchOnError' property + (defaults to 'true'). + + - Check for connection closed in more Connection methods + (createStatement, prepareStatement, setTransactionIsolation, + setAutoCommit). + + - More robust implementation of updatable result sets. Checks that + _all_ primary keys of the table have been selected. + + - 'LOAD DATA LOCAL INFILE ...' now works, if your server is configured + to allow it. Can be turned off with the 'allowLoadLocalInfile' + property (see the README). + + - Substitute '?' for unknown character conversions in single-byte + character sets instead of '\0'. + + - NamedPipeSocketFactory now works (only intended for Windows), see + README for instructions. + +11-08-02 - Version 3.0.2-dev + + - Fixed issue with updatable result sets and PreparedStatements not + working + + - Fixed ResultSet.setFetchDirection(FETCH_UNKNOWN) + + - Fixed issue when calling Statement.setFetchSize() when using + arbitrary values + + - Fixed incorrect conversion in ResultSet.getLong() + + - Implemented ResultSet.updateBlob(). + + - Removed duplicate code from UpdatableResultSet (it can be inherited + from ResultSet, the extra code for each method to handle updatability + I thought might someday be necessary has not been needed). + + - Fixed "UnsupportedEncodingException" thrown when "forcing" a + character encoding via properties. + + - Fixed various non-ASCII character encoding issues. + + - Added driver property 'useHostsInPrivileges'. Defaults to true. + Affects whether or not '@hostname' will be used in + DBMD.getColumn/TablePrivileges. + + - All DBMD result set columns describing schemas now return NULL + to be more compliant with the behavior of other JDBC drivers + for other databases (MySQL does not support schemas). + + - Added SSL support. See README for information on how to use it. + + - Properly restore connection properties when autoReconnecting + or failing-over, including autoCommit state, and isolation level. + + - Use 'SHOW CREATE TABLE' when possible for determining foreign key + information for DatabaseMetaData...also allows cascade options for + DELETE information to be returned + + - Escape 0x5c character in strings for the SJIS charset. + + - Fixed start position off-by-1 error in Clob.getSubString() + + - Implemented Clob.truncate() + + - Implemented Clob.setString() + + - Implemented Clob.setAsciiStream() + + - Implemented Clob.setCharacterStream() + + - Added com.mysql.jdbc.MiniAdmin class, which allows you to send + 'shutdown' command to MySQL server...Intended to be used when 'embedding' + Java and MySQL server together in an end-user application. + + - Added 'connectTimeout' parameter that allows users of JDK-1.4 and newer + to specify a maxium time to wait to establish a connection. + + - Failover and autoReconnect only work when the connection is in a + autoCommit(false) state, in order to stay transaction safe + + - Added 'queriesBeforeRetryMaster' property that specifies how many + queries to issue when failed over before attempting to reconnect + to the master (defaults to 50) + + - Fixed DBMD.supportsResultSetConcurrency() so that it returns true + for ResultSet.TYPE_SCROLL_INSENSITIVE and ResultSet.CONCUR_READ_ONLY or + ResultSet.CONCUR_UPDATABLE + + - Fixed ResultSet.isLast() for empty result sets (should return false). + + - PreparedStatement now honors stream lengths in setBinary/Ascii/Character + Stream() unless you set the connection property + 'useStreamLengthsInPrepStmts' to 'false'. + + - Removed some not-needed temporary object creation by using Strings + smarter in EscapeProcessor, Connection and DatabaseMetaData classes. + +09-21-02 - Version 3.0.1-dev + + - Fixed ResultSet.getRow() off-by-one bug. + + - Fixed RowDataStatic.getAt() off-by-one bug. + + - Added limited Clob functionality (ResultSet.getClob(), + PreparedStatemtent.setClob(), + PreparedStatement.setObject(Clob). + + - Added socketTimeout parameter to URL. + + - Connection.isClosed() no longer "pings" the server. + + - Connection.close() issues rollback() when getAutoCommit() == false + + - Added "paranoid" parameter...sanitizes error messages removing + "sensitive" information from them (i.e. hostnames, ports, + usernames, etc.), as well as clearing "sensitive" data structures + when possible. + + - Fixed ResultSetMetaData.isSigned() for TINYINT and BIGINT. + + - Charsets now automatically detected. Optimized code for single-byte + character set conversion. + + - Implemented ResultSet.getCharacterStream() + + - Added "LOCAL TEMPORARY" to table types in DatabaseMetaData.getTableTypes() + + - Massive code clean-up to follow Java coding conventions (the time had come) + + +07-31-02 - Version 3.0.0-dev + + - !!! LICENSE CHANGE !!! The driver is now GPL. If you need + non-GPL licenses, please contact me + + - JDBC-3.0 functionality including + Statement/PreparedStatement.getGeneratedKeys() and + ResultSet.getURL() + + - Performance enchancements - driver is now 50-100% faster + in most situations, and creates fewer temporary objects + + - Repackaging...new driver name is "com.mysql.jdbc.Driver", + old name still works, though (the driver is now provided + by MySQL-AB) + + - Better checking for closed connections in Statement + and PreparedStatement. + + - Support for streaming (row-by-row) result sets (see README) + Thanks to Doron. + + - Support for large packets (new addition to MySQL-4.0 protocol), + see README for more information. + + - JDBC Compliance -- Passes all tests besides stored procedure tests + + + - Fix and sort primary key names in DBMetaData (SF bugs 582086 and 582086) + + - Float types now reported as java.sql.Types.FLOAT (SF bug 579573) + + - ResultSet.getTimestamp() now works for DATE types (SF bug 559134) + + - ResultSet.getDate/Time/Timestamp now recognizes all forms of invalid + values that have been set to all zeroes by MySQL (SF bug 586058) + + - Testsuite now uses Junit (which you can get from www.junit.org) + + - The driver now only works with JDK-1.2 or newer. + + - Added multi-host failover support (see README) + + - General source-code cleanup. + + - Overall speed improvements via controlling transient object + creation in MysqlIO class when reading packets + + - Performance improvements in string handling and field + metadata creation (lazily instantiated) contributed by + Alex Twisleton-Wykeham-Fiennes + + +05-16-02 - Version 2.0.14 + + - More code cleanup + + - PreparedStatement now releases resources on .close() (SF bug 553268) + + - Quoted identifiers not used if server version does not support them. Also, + if server started with --ansi or --sql-mode=ANSI_QUOTES then '"' will be + used as an identifier quote, otherwise '`' will be used. + + - ResultSet.getDouble() now uses code built into JDK to be more precise (but slower) + + - LogicalHandle.isClosed() calls through to physical connection + + - Added SQL profiling (to STDERR). Set "profileSql=true" in your JDBC url. + See README for more information. + + - Fixed typo for relaxAutoCommit parameter. + +04-24-02 - Version 2.0.13 + + - More code cleanup. + + - Fixed unicode chars being read incorrectly (SF bug 541088) + + - Faster blob escaping for PrepStmt + + - Added set/getPortNumber() to DataSource(s) (SF bug 548167) + + - Added setURL() to MySQLXADataSource (SF bug 546019) + + - PreparedStatement.toString() fixed (SF bug 534026) + + - ResultSetMetaData.getColumnClassName() now implemented + + - Rudimentary version of Statement.getGeneratedKeys() from JDBC-3.0 + now implemented (you need to be using JDK-1.4 for this to work, I + believe) + + - DBMetaData.getIndexInfo() - bad PAGES fixed (SF BUG 542201) + +04-07-02 - Version 2.0.12 + + - General code cleanup. + + - Added getIdleFor() method to Connection and MysqlLogicalHandle. + + - Relaxed synchronization in all classes, should fix 520615 and 520393. + + - Added getTable/ColumnPrivileges() to DBMD (fixes 484502). + + - Added new types to getTypeInfo(), fixed existing types thanks to + Al Davis and Kid Kalanon. + + - Added support for BIT types (51870) to PreparedStatement. + + - Fixed getRow() bug (527165) in ResultSet + + - Fixes for ResultSet updatability in PreparedStatement. + - Fixed timezone off by 1-hour bug in PreparedStatement (538286, 528785). + + - ResultSet: Fixed updatability (values being set to null + if not updated). + + - DataSources - fixed setUrl bug (511614, 525565), + wrong datasource class name (532816, 528767) + + - Added identifier quoting to all DatabaseMetaData methods + that need them (should fix 518108) + + - Added support for YEAR type (533556) + + - ResultSet.insertRow() should now detect auto_increment fields + in most cases and use that value in the new row. This detection + will not work in multi-valued keys, however, due to the fact that + the MySQL protocol does not return this information. + + - ResultSet.refreshRow() implemented. + + - Fixed testsuite.Traversal afterLast() bug, thanks to Igor Lastric. + +01-27-02 - Version 2.0.11 + + - Fixed missing DELETE_RULE value in + DBMD.getImported/ExportedKeys() and getCrossReference(). + + - Full synchronization of Statement.java. + + - More changes to fix "Unexpected end of input stream" + errors when reading BLOBs. This should be the last fix. + +01-24-02 - Version 2.0.10 + + - Fixed spurious "Unexpected end of input stream" errors in + MysqlIO (bug 507456). + + - Fixed null-pointer-exceptions when using + MysqlConnectionPoolDataSource with Websphere 4 (bug 505839). + +01-13-02 - Version 2.0.9 + + - Ant build was corrupting included jar files, fixed + (bug 487669). + + - Fixed extra memory allocation in MysqlIO.readPacket() + (bug 488663). + + - Implementation of DatabaseMetaData.getExported/ImportedKeys() and + getCrossReference(). + + - Full synchronization on methods modifying instance and class-shared + references, driver should be entirely thread-safe now (please + let me know if you have problems) + + - DataSource implementations moved to org.gjt.mm.mysql.jdbc2.optional + package, and (initial) implementations of PooledConnectionDataSource + and XADataSource are in place (thanks to Todd Wolff for the + implementation and testing of PooledConnectionDataSource with + IBM WebSphere 4). + + - Added detection of network connection being closed when reading packets + (thanks to Todd Lizambri). + + - Fixed quoting error with escape processor (bug 486265). + + - Report batch update support through DatabaseMetaData (bug 495101). + + - Fixed off-by-one-hour error in PreparedStatement.setTimestamp() + (bug 491577). + + - Removed concatenation support from driver (the '||' operator), + as older versions of VisualAge seem to be the only thing that + use it, and it conflicts with the logical '||' operator. You will + need to start mysqld with the "--ansi" flag to use the '||' + operator as concatenation (bug 491680) + + - Fixed casting bug in PreparedStatement (bug 488663). + +11-25-01 - Version 2.0.8 + + - Batch updates now supported (thanks to some inspiration + from Daniel Rall). + + - XADataSource/ConnectionPoolDataSource code (experimental) + + - PreparedStatement.setAnyNumericType() now handles positive + exponents correctly (adds "+" so MySQL can understand it). + + - DatabaseMetaData.getPrimaryKeys() and getBestRowIdentifier() + are now more robust in identifying primary keys (matches + regardless of case or abbreviation/full spelling of Primary Key + in Key_type column). + +10-24-01 - Version 2.0.7 + + - PreparedStatement.setCharacterStream() now implemented + + - Fixed dangling socket problem when in high availability + (autoReconnect=true) mode, and finalizer for Connection will + close any dangling sockets on GC. + + - Fixed ResultSetMetaData.getPrecision() returning one + less than actual on newer versions of MySQL. + + - ResultSet.getBlob() now returns null if column value + was null. + + - Character sets read from database if useUnicode=true + and characterEncoding is not set. (thanks to + Dmitry Vereshchagin) + + - Initial transaction isolation level read from + database (if avaialable) (thanks to Dmitry Vereshchagin) + + - Fixed DatabaseMetaData.supportsTransactions(), and + supportsTransactionIsolationLevel() and getTypeInfo() + SQL_DATETIME_SUB and SQL_DATA_TYPE fields not being + readable. + + - Fixed PreparedStatement generating SQL that would end + up with syntax errors for some queries. + + - Fixed ResultSet.isAfterLast() always returning false. + + - Fixed timezone issue in PreparedStatement.setTimestamp() + (thanks to Erik Olofsson) + + - Captialize type names when "captializeTypeNames=true" + is passed in URL or properties (for WebObjects, thanks + to Anjo Krank) + + - Updatable result sets now correctly handle NULL + values in fields. + + - PreparedStatement.setDouble() now uses full-precision + doubles (reverting a fix made earlier to truncate them). + + - PreparedStatement.setBoolean() will use 1/0 for values + if your MySQL Version >= 3.21.23. + +06-16-01 - Version 2.0.6 + +Fixed PreparedStatement parameter checking + + - Fixed case-sensitive column names in ResultSet.java + +06-13-01 - Version 2.0.5 + + - Fixed ResultSet.getBlob() ArrayIndex out-of-bounds + + - Fixed ResultSetMetaData.getColumnTypeName for TEXT/BLOB + + - Fixed ArrayIndexOutOfBounds when sending large BLOB queries + (Max size packet was not being set) + + - Added ISOLATION level support to Connection.setIsolationLevel() + + - Fixed NPE on PreparedStatement.executeUpdate() when all columns + have not been set. + + - Fixed data parsing of TIMESTAMPs with 2-digit years + + - Added Byte to PreparedStatement.setObject() + + - ResultSet.getBoolean() now recognizes '-1' as 'true' + + - ResultSet has +/-Inf/inf support + + - ResultSet.insertRow() works now, even if not all columns are + set (they will be set to "NULL") + + - DataBaseMetaData.getCrossReference() no longer ArrayIndexOOB + + - getObject() on ResultSet correctly does TINYINT->Byte and + SMALLINT->Short + +12-03-00 - Version 2.0.3 + + - Implemented getBigDecimal() without scale component + for JDBC2. + + - Fixed composite key problem with updateable result sets. + + - Added detection of -/+INF for doubles. + + - Faster ASCII string operations. + + - Fixed incorrect detection of MAX_ALLOWED_PACKET, so sending + large blobs should work now. + + - Fixed off-by-one error in java.sql.Blob implementation code. + + - Added "ultraDevHack" URL parameter, set to "true" to allow + (broken) Macromedia UltraDev to use the driver. + +04-06-00 - Version 2.0.1 + + - Fixed RSMD.isWritable() returning wrong value. + Thanks to Moritz Maass. + + - Cleaned up exception handling when driver connects + + - Columns that are of type TEXT now return as Strings + when you use getObject() + + - DatabaseMetaData.getPrimaryKeys() now works correctly wrt + to key_seq. Thanks to Brian Slesinsky. + + - No escape processing is done on PreparedStatements anymore + per JDBC spec. + + - Fixed many JDBC-2.0 traversal, positioning bugs, especially + wrt to empty result sets. Thanks to Ron Smits, Nick Brook, + Cessar Garcia and Carlos Martinez. + + - Fixed some issues with updatability support in ResultSet when + using multiple primary keys. + +02-21-00 - Version 2.0pre5 + + - Fixed Bad Handshake problem. + +01-10-00 - Version 2.0pre4 + + - Fixes to ResultSet for insertRow() - Thanks to + Cesar Garcia + + - Fix to Driver to recognize JDBC-2.0 by loading a JDBC-2.0 + class, instead of relying on JDK version numbers. Thanks + to John Baker. + + - Fixed ResultSet to return correct row numbers + + - Statement.getUpdateCount() now returns rows matched, + instead of rows actually updated, which is more SQL-92 + like. + +10-29-99 + + - Statement/PreparedStatement.getMoreResults() bug fixed. + Thanks to Noel J. Bergman. + + - Added Short as a type to PreparedStatement.setObject(). + Thanks to Jeff Crowder + + - Driver now automagically configures maximum/preferred packet + sizes by querying server. + + - Autoreconnect code uses fast ping command if server supports + it. + + - Fixed various bugs wrt. to packet sizing when reading from + the server and when alloc'ing to write to the server. + +08-17-99 - Version 2.0pre + + - Now compiles under JDK-1.2. The driver supports both JDK-1.1 + and JDK-1.2 at the same time through a core set of classes. + The driver will load the appropriate interface classes at + runtime by figuring out which JVM version you are using. + + - Fixes for result sets with all nulls in the first row. + (Pointed out by Tim Endres) + + - Fixes to column numbers in SQLExceptions in ResultSet + (Thanks to Blas Rodriguez Somoza) + + - The database no longer needs to specified to connect. + (Thanks to Christian Motschke) + +07-04-99 - Version 1.2b + + - Better Documentation (in progress), in doc/mm.doc/book1.html + + - DBMD now allows null for a column name pattern (not in + spec), which it changes to '%'. + + - DBMD now has correct types/lengths for getXXX(). + + - ResultSet.getDate(), getTime(), and getTimestamp() fixes. + (contributed by Alan Wilken) + + - EscapeProcessor now handles \{ \} and { or } inside quotes + correctly. (thanks to Alik for some ideas on how to fix it) + + - Fixes to properties handling in Connection. + (contributed by Juho Tikkala) + + - ResultSet.getObject() now returns null for NULL columns + in the table, rather than bombing out. + (thanks to Ben Grosman) + + - ResultSet.getObject() now returns Strings for types + from MySQL that it doesn't know about. (Suggested by + Chris Perdue) + + - Removed DataInput/Output streams, not needed, 1/2 number + of method calls per IO operation. + + - Use default character encoding if one is not specified. This + is a work-around for broken JVMs, because according to spec, + EVERY JVM must support "ISO8859_1", but they don't. + + - Fixed Connection to use the platform character encoding + instead of "ISO8859_1" if one isn't explicitly set. This + fixes problems people were having loading the character- + converter classes that didn't always exist (JVM bug). + (thanks to Fritz Elfert for pointing out this problem) + + - Changed MysqlIO to re-use packets where possible to reduce + memory usage. + + - Fixed escape-processor bugs pertaining to {} inside + quotes. + +04-14-99 - Version 1.2a + + - Fixed character-set support for non-Javasoft JVMs + (thanks to many people for pointing it out) + + - Fixed ResultSet.getBoolean() to recognize 'y' & 'n' + as well as '1' & '0' as boolean flags. + (thanks to Tim Pizey) + + - Fixed ResultSet.getTimestamp() to give better performance. + (thanks to Richard Swift) + + - Fixed getByte() for numeric types. + (thanks to Ray Bellis) + + - Fixed DatabaseMetaData.getTypeInfo() for DATE type. + (thanks to Paul Johnston) + + - Fixed EscapeProcessor for "fn" calls. + (thanks to Piyush Shah at locomotive.org) + + - Fixed EscapeProcessor to not do extraneous work if there + are no escape codes. + (thanks to Ryan Gustafson) + + - Fixed Driver to parse URLs of the form "jdbc:mysql://host:port" + (thanks to Richard Lobb) + +03-24-99 - Version 1.1i + + - Fixed Timestamps for PreparedStatements + + - Fixed null pointer exceptions in RSMD and RS + + - Re-compiled with jikes for valid class files (thanks ms!) + +03-08-99 - Version 1.1h + + - Fixed escape processor to deal with un-matched { and } + (thanks to Craig Coles) + + - Fixed escape processor to create more portable (between + DATETIME and TIMESTAMP types) representations so that + it will work with BETWEEN clauses. + (thanks to Craig Longman) + + - MysqlIO.quit() now closes the socket connection. Before, + after many failed connections some OS's would run out + of file descriptors. (thanks to Michael Brinkman) + + - Fixed NullPointerException in Driver.getPropertyInfo. + (thanks to Dave Potts) + + - Fixes to MysqlDefs to allow all *text fields to be + retrieved as Strings. + (thanks to Chris at Leverage) + + - Fixed setDouble in PreparedStatement for large numbers + to avoid sending scientific notation to the database. + (thanks to J.S. Ferguson) + + - Fixed getScale() and getPrecision() in RSMD. + (contrib'd by James Klicman) + + - Fixed getObject() when field was DECIMAL or NUMERIC + (thanks to Bert Hobbs) + + - DBMD.getTables() bombed when passed a null table-name + pattern. Fixed. (thanks to Richard Lobb) + + - Added check for "client not authorized" errors during + connect. (thanks to Hannes Wallnoefer) + +02-19-99 - Version 1.1g + + - Result set rows are now byte arrays. Blobs and Unicode + work bidriectonally now. The useUnicode and encoding + options are implemented now. + + - Fixes to PreparedStatement to send binary set by + setXXXStream to be sent un-touched to the MySQL server. + + - Fixes to getDriverPropertyInfo(). + +12-31-98 - Version 1.1f + + - Changed all ResultSet fields to Strings, this should allow + Unicode to work, but your JVM must be able to convert + between the character sets. This should also make reading + data from the server be a bit quicker, because there is now + no conversion from StringBuffer to String. + + - Changed PreparedStatement.streamToString() to be more + efficient (code from Uwe Schaefer). + + - URL parsing is more robust (throws SQL exceptions on errors + rather than NullPointerExceptions) + + - PreparedStatement now can convert Strings to Time/Date values + via setObject() (code from Robert Currey). + + - IO no longer hangs in Buffer.readInt(), that bug was + introduced in 1.1d when changing to all byte-arrays for + result sets. (Pointed out by Samo Login) + +11-03-98 - Version 1.1b + + - Fixes to DatabaseMetaData to allow both IBM VA and J-Builder + to work. Let me know how it goes. (thanks to Jac Kersing) + + - Fix to ResultSet.getBoolean() for NULL strings + (thanks to Barry Lagerweij) + + - Beginning of code cleanup, and formatting. Getting ready + to branch this off to a parallel JDBC-2.0 source tree. + + - Added "final" modifier to critical sections in MysqlIO and + Buffer to allow compiler to inline methods for speed. + +9-29-98 + + - If object references passed to setXXX() in PreparedStatement are + null, setNull() is automatically called for you. (Thanks for the + suggestion goes to Erik Ostrom) + + - setObject() in PreparedStatement will now attempt to write a + serialized representation of the object to the database for + objects of Types.OTHER and objects of unknown type. + + - Util now has a static method readObject() which given a ResultSet + and a column index will re-instantiate an object serialized in + the above manner. + +9-02-98 - Vesion 1.1 + + - Got rid of "ugly hack" in MysqlIO.nextRow(). Rather than + catch an exception, Buffer.isLastDataPacket() was fixed. + + - Connection.getCatalog() and Connection.setCatalog() + should work now. + + - Statement.setMaxRows() works, as well as setting + by property maxRows. Statement.setMaxRows() overrides + maxRows set via properties or url parameters. + + - Automatic re-connection is available. Because it has + to "ping" the database before each query, it is + turned off by default. To use it, pass in "autoReconnect=true" + in the connection URL. You may also change the number of + reconnect tries, and the initial timeout value via + "maxReconnects=n" (default 3) and "initialTimeout=n" + (seconds, default 2) parameters. The timeout is an + exponential backoff type of timeout, e.g. if you have initial + timeout of 2 seconds, and maxReconnects of 3, then the driver + will timeout 2 seconds, 4 seconds, then 16 seconds between each + re-connection attempt. + +8-24-98 - Version 1.0 + + - Fixed handling of blob data in Buffer.java + + - Fixed bug with authentication packet being + sized too small. + + - The JDBC Driver is now under the LPGL + +8-14-98 - + + - Fixed Buffer.readLenString() to correctly + read data for BLOBS. + + - Fixed PreparedStatement.stringToStream to + correctly read data for BLOBS. + + - Fixed PreparedStatement.setDate() to not + add a day. + (above fixes thanks to Vincent Partington) + + - Added URL parameter parsing (?user=... etc). + + +8-04-98 - Version 0.9d + + - Big news! New package name. Tim Endres from ICE + Engineering is starting a new source tree for + GNU GPL'd Java software. He's graciously given + me the org.gjt.mm package directory to use, so now + the driver is in the org.gjt.mm.mysql package scheme. + I'm "legal" now. Look for more information on Tim's + project soon. + + - Now using dynamically sized packets to reduce + memory usage when sending commands to the DB. + + - Small fixes to getTypeInfo() for parameters, etc. + + - DatabaseMetaData is now fully implemented. Let me + know if these drivers work with the various IDEs + out there. I've heard that they're working with + JBuilder right now. + + - Added JavaDoc documentation to the package. + + - Package now available in .zip or .tar.gz. + +7-28-98 - Version 0.9 + + - Implemented getTypeInfo(). + Connection.rollback() now throws an SQLException + per the JDBC spec. + + - Added PreparedStatement that supports all JDBC API + methods for PreparedStatement including InputStreams. + Please check this out and let me know if anything is + broken. + + - Fixed a bug in ResultSet that would break some + queries that only returned 1 row. + + - Fixed bugs in DatabaseMetaData.getTables(), + DatabaseMetaData.getColumns() and + DatabaseMetaData.getCatalogs(). + + - Added functionality to Statement that allows + executeUpdate() to store values for IDs that are + automatically generated for AUTO_INCREMENT fields. + Basically, after an executeUpdate(), look at the + SQLWarnings for warnings like "LAST_INSERTED_ID = + 'some number', COMMAND = 'your SQL query'". + + If you are using AUTO_INCREMENT fields in your + tables and are executing a lot of executeUpdate()s + on one Statement, be sure to clearWarnings() every + so often to save memory. + +7-06-98 - Version 0.8 + + - Split MysqlIO and Buffer to separate classes. Some + ClassLoaders gave an IllegalAccess error for some + fields in those two classes. Now mm.mysql works in + applets and all classloaders. + + Thanks to Joe Ennis for pointing + out the problem and working on a fix with me. + +7-01-98 - Version 0.7 + + - Fixed DatabaseMetadata problems in getColumns() and + bug in switch statement in the Field constructor. + + Thanks to Costin Manolache for + pointing these out. + +5-21-98 - Version 0.6 + + - Incorporated efficiency changes from + Richard Swift in + MysqlIO.java and ResultSet.java + + - We're now 15% faster than gwe's driver. + + - Started working on DatabaseMetaData. + + The following methods are implemented: + * getTables() + * getTableTypes() + * getColumns + * getCatalogs() diff --git a/mysql-connector-j-8.0.31/INFO_BIN b/mysql-connector-j-8.0.31/INFO_BIN new file mode 100644 index 0000000..14108fd --- /dev/null +++ b/mysql-connector-j-8.0.31/INFO_BIN @@ -0,0 +1,4 @@ +build-date: 2022-09-03 21:54:19 +0000 +os-info: Linux i386 4.1.12-124.48.6.el6uek.x86_64 +compiler: javac 1.8.0_241 +build-tool: Apache Ant(TM) version 1.10.7 compiled on September 1 2019 diff --git a/mysql-connector-j-8.0.31/INFO_SRC b/mysql-connector-j-8.0.31/INFO_SRC new file mode 100644 index 0000000..c5bc629 --- /dev/null +++ b/mysql-connector-j-8.0.31/INFO_SRC @@ -0,0 +1,5 @@ +version: 8.0.31 +branch: release/8.0.31 +date: 2022-09-03 22:46:04 +0100 +commit: 0c86fc148d567b62266c2302bdad0f1e7a7e4eba +short: 0c86fc14 diff --git a/mysql-connector-j-8.0.31/LICENSE b/mysql-connector-j-8.0.31/LICENSE new file mode 100644 index 0000000..d1674c9 --- /dev/null +++ b/mysql-connector-j-8.0.31/LICENSE @@ -0,0 +1,1384 @@ +Licensing Information User Manual + +MySQL Connector/J 8.0 + __________________________________________________________________ + +Introduction + + This License Information User Manual contains Oracle's product license + and other licensing information, including licensing information for + third-party software which may be included in this distribution of + MySQL Connector/J 8.0. + + Last updated: August 2022 + +Licensing Information + + This is a release of MySQL Connector/J 8.0, brought to you by the MySQL + team at Oracle. This software is released under version 2 of the GNU + General Public License (GPLv2), as set forth below, with the following + additional permissions: + + This distribution of MySQL Connector/J 8.0 is distributed with certain + software that is licensed under separate terms, as designated in a + particular file or component or in the license documentation. Without + limiting your rights under the GPLv2, the authors of MySQL hereby grant + you an additional permission to link the program and your derivative + works with the separately licensed software that they have included + with the program. + + Without limiting the foregoing grant of rights under the GPLv2 and + additional permission as to separately licensed software, this + Connector is also subject to the Universal FOSS Exception, version 1.0, + a copy of which is reproduced below and can also be found along with + its FAQ at http://oss.oracle.com/licenses/universal-foss-exception. + + Copyright (c) 2017, 2022, Oracle and/or its affiliates. + +Election of GPLv2 + + For the avoidance of doubt, except that if any license choice other + than GPL or LGPL is available it will apply instead, Oracle elects to + use only the General Public License version 2 (GPLv2) at this time for + any software where a choice of GPL license versions is made available + with the language indicating that GPLv2 or any later version may be + used, or where a choice of which version of the GPL is applied is + otherwise unspecified. + +GNU General Public License Version 2.0, June 1991 + +The following applies to all products licensed under the GNU General +Public License, Version 2.0: You may not use the identified files +except in compliance with the GNU General Public License, Version +2.0 (the "License.") You may obtain a copy of the License at +http://www.gnu.org/licenses/gpl-2.0.txt. A copy of the license is +also reproduced below. Unless required by applicable law or agreed +to in writing, software distributed under the License is distributed +on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the License for the specific language +governing permissions and limitations under the License. + + + ====================================================================== + ====================================================================== + + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim +copies of this license document, but changing it is not +allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, +and (2) offer you this license which gives you legal permission to +copy, distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, +we want its recipients to know that what they have is not the original, +so that any problems introduced by others will not reflect on the +original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as +a special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new +versions of the General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a +version number of this License, you may choose any version ever +published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by the +Free Software Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be guided by the +two goals of preserving the free status of all derivatives of our free +software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS +WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type 'show w'. This is free software, and you are welcome + to redistribute it under certain conditions; type 'show c' + for details. + +The hypothetical commands 'show w' and 'show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than 'show w' and +'show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program 'Gnomovision' (which makes passes at compilers) written + by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, +you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use +the GNU Lesser General Public License instead of this License. + + ====================================================================== + ====================================================================== + +The Universal FOSS Exception, Version 1.0 + + In addition to the rights set forth in the other license(s) included in + the distribution for this software, data, and/or documentation + (collectively the "Software", and such licenses collectively with this + additional permission the "Software License"), the copyright holders + wish to facilitate interoperability with other software, data, and/or + documentation distributed with complete corresponding source under a + license that is OSI-approved and/or categorized by the FSF as free + (collectively "Other FOSS"). We therefore hereby grant the following + additional permission with respect to the use and distribution of the + Software with Other FOSS, and the constants, function signatures, data + structures and other invocation methods used to run or interact with + each of them (as to each, such software's "Interfaces"): + + i. The Software's Interfaces may, to the extent permitted by the + license of the Other FOSS, be copied into, used and distributed in + the Other FOSS in order to enable interoperability, without + requiring a change to the license of the Other FOSS other than as + to any Interfaces of the Software embedded therein. The Software's + Interfaces remain at all times under the Software License, + including without limitation as used in the Other FOSS (which upon + any such use also then contains a portion of the Software under the + Software License). + + ii. The Other FOSS's Interfaces may, to the extent permitted by the + license of the Other FOSS, be copied into, used and distributed in + the Software in order to enable interoperability, without requiring + that such Interfaces be licensed under the terms of the Software + License or otherwise altering their original terms, if this does + not require any portion of the Software other than such Interfaces + to be licensed under the terms other than the Software License. + + iii. If only Interfaces and no other code is copied between the + Software and the Other FOSS in either direction, the use and/or + distribution of the Software with the Other FOSS shall not be + deemed to require that the Other FOSS be licensed under the license + of the Software, other than as to any Interfaces of the Software + copied into the Other FOSS. This includes, by way of example and + without limitation, statically or dynamically linking the Software + together with Other FOSS after enabling interoperability using the + Interfaces of one or both, and distributing the resulting + combination under different licenses for the respective portions + thereof. For avoidance of doubt, a license which is OSI-approved or + categorized by the FSF as free, includes, for the purpose of this + permission, such licenses with additional permissions, and any + license that has previously been so approved or categorized as + free, even if now deprecated or otherwise no longer recognized as + approved or free. Nothing in this additional permission grants any + right to distribute any portion of the Software on terms other than + those of the Software License or grants any additional permission + of any kind for use or distribution of the Software in conjunction + with software other than Other FOSS. + + ====================================================================== + ====================================================================== + +Licenses for Third-Party Components + + The following sections contain licensing information for libraries that + may be included with this product. We are thankful to all individuals + that have created these. Standard licenses referenced herein are + detailed in the Standard Licenses section. + +c3p0 JDBC Library + + The MySQL Connector/J implements interfaces that are included in c3p0, + although no part of c3p0 is included or distributed with MySQL. + +Copyright (C) 2019 Machinery For Change, Inc. + + * This library is free software; you can redistribute it and/or modify + * it under the terms of EITHER: + * + * 1) The GNU Lesser General Public License (LGPL), version 2.1, as + * published by the Free Software Foundation + * + * OR + * + * 2) The Eclipse Public License (EPL), version 1.0 + * You may choose which license to accept if you wish to redistribute + * or modify this work. You may offer derivatives of this work + * under the license you have chosen, or you may provide the same + * choice of license which you have been offered here. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received copies of both LGPL v2.1 and EPL v1.0 + * along with this software; see the files LICENSE-EPL and LICENSE-LGPL. + * If not, the text of these licenses are currently available at + * + * LGPL v2.1: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + * EPL v1.0: http://www.eclipse.org/org/documents/epl-v10.php + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + + distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or anyone +acting on such Contributor's behalf. Contributions do not include additionsto +the Program which: (i) are separate modules of software distributed in +conjunction with the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free copyright license to +reproduce, prepare derivative works of, publicly display, publicly perform, +distribute and sublicense the Contribution of such Contributor, if any, and such +derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants +Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed +Patents to make, use, sell, offer to sell, import and otherwise transfer the +Contribution of such Contributor, if any, in source code and object code form. +This patent license shall apply to the combination of the Contribution and the +Program if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by the +Licensed Patents. The patent license shall not apply to any other combinations +which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to +its Contributions set forth herein, no assurances are provided by any +Contributor that the Program does not infringe the patent or other intellectual +property rights of any other entity. Each Contributor disclaims any liability to +Recipient for claims brought by any other entity based on infringement of +intellectual property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes sole +responsibility to secure any other intellectual property rights needed, if any. +For example, if a third party patent license is required to allow Recipient to +distribute the Program, it is Recipient's responsibility to acquire that license +before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient +copyright rights in its Contribution, if any, to grant the copyright license +set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or conditions + of title and non-infringement, and implied warranties or conditions of + merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within +the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if any, in a manner that reasonably allows subsequent Recipients to identify +the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, if +a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, damages +and costs (collectively "Losses") arising from claims, lawsuits and other legal +actions brought by a third party against the Indemnified Contributor to the +extent caused by the acts or omissions of such Commercial Contributor in +connection with its distribution of the Program in a commercial product +offering. The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. In order +to qualify, an Indemnified Contributor must: a) promptly notify the Commercial +Contributor in writing of such claim, and b) allow the Commercial Contributor to +control, and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may participate in +any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If that +Commercial Contributor then makes performance claims, or offers warranties +related to Product X, those performance claims and warranties are such +Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a court +requires any other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its exercise of +rights under this Agreement , including but not limited to the risks and costs +of program errors, compliance with applicable laws, damage to or loss of data, +programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable +law, it shall not affect the validity or enforceability of the remainder of the +terms of this Agreement, and without further action by the parties hereto, such +provision shall be reformed to the minimum extent necessary to make such +provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted under +Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue and +survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to time. +No one other than the Agreement Steward has the right to modify this Agreement. +The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation +may assign the responsibility to serve as the Agreement Steward to a suitable +separate entity. Each new version of the Agreement will be given a +distinguishing version number. The Program (including Contributions) may always +be distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to distribute the Program (including its Contributions) +under the new version. Except as expressly stated in Sections 2(a) and 2(b) +above, Recipient receives no rights or licenses to the intellectual property of +any Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted under +this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + + The LGPL v2.1 can be found in GNU Lesser General Public License Version + 2.1, February 1999. + + ====================================================================== + ====================================================================== + +Google Protocol Buffers + +Copyright 2008 Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + + ====================================================================== + ====================================================================== + +Unicode Data Files + + Unicode Data Files + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1991-2014 Unicode, Inc. All rights reserved. Distributed under +the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") +or Unicode software and any associated documentation (the "Software") to deal +in the Data Files or Software without restriction, including without +limitation the rights to use, copy, modify, merge, publish, distribute, +and/or sell copies of the Data Files or Software, and to permit persons to +whom the Data Files or Software are furnished to do so, provided that (a) the +above copyright notice(s) and this permission notice appear with all copies +of the Data Files or Software, (b) both the above copyright notice(s) and +this permission notice appear in associated documentation, and (c) there is +clear notice in each modified Data File or in the Software as well as in the +documentation associated with the Data File(s) or Software that the data or +software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD +PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING +OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR +SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be +used in advertising or otherwise to promote the sale, use or other dealings in +these Data Files or Software without prior written authorization of the +copyright holder. + + ====================================================================== + ====================================================================== + +Standard Licenses + +GNU Lesser General Public License Version 2.1, February 1999 + +The following applies to all products licensed under the +GNU Lesser General Public License, Version 2.1: You may +not use the identified files except in compliance with +the GNU Lesser General Public License, Version 2.1 (the +"License"). You may obtain a copy of the License at +http://www.gnu.org/licenses/lgpl-2.1.html. A copy of the +license is also reproduced below. Unless required by +applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express +or implied. See the License for the specific language governing +permissions and limitations under the License. + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs +must be allowed to use the library. A more frequent case is that +a free library does the same job as widely used non-free libraries. +In this case, there is little to gain by limiting the free library +to free software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended +to apply, and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms +of the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should +have at least the "copyright" line and a pointer to where the full +notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James + Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + ====================================================================== + ====================================================================== + +Written Offer for Source Code + + For any software that you receive from Oracle in binary form which is + licensed under an open source license that gives you the right to + receive the source code for that binary, you can obtain a copy of the + applicable source code by visiting + http://www.oracle.com/goto/opensourcecode. If the source code for the + binary was not provided to you with the binary, you can also receive a + copy of the source code on physical media by submitting a written + request to the address listed below or by sending an email to Oracle + using the following link: + http://www.oracle.com/goto/opensourcecode/request. + + Oracle America, Inc. + Attn: Senior Vice President + Development and Engineering Legal + 500 Oracle Parkway, 10th Floor + Redwood Shores, CA 94065 + + Your request should include: + + * The name of the binary for which you are requesting the source code + + * The name and version number of the Oracle product containing the + binary + + * The date you received the Oracle product + + * Your name + + * Your company name (if applicable) + + * Your return mailing address and email, and + + * A telephone number in the event we need to reach you. + + + We may charge you a fee to cover the cost of physical media and + processing. + + Your request must be sent + + a. within three (3) years of the date you received the Oracle product + that included the binary that is the subject of your request, or + + b. in the case of code licensed under the GPL v3 for as long as Oracle + offers spare parts or customer support for that product model. diff --git a/mysql-connector-j-8.0.31/README b/mysql-connector-j-8.0.31/README new file mode 100644 index 0000000..7c9d743 --- /dev/null +++ b/mysql-connector-j-8.0.31/README @@ -0,0 +1,33 @@ +Copyright (c) 2000, 2022, Oracle and/or its affiliates. + +This is a release of MySQL Connector/J, a JDBC Type 4 driver for MySQL that +also supports the new X DevAPI. + +License information can be found in the LICENSE file. + +This distribution may include materials developed by third parties. +For license and attribution notices for these materials, please refer to the +LICENSE file. + +For more information on MySQL Connector/J, visit + https://dev.mysql.com/doc/connector-j/8.0/en/ + +For additional downloads and the source of MySQL Connector/J, visit + https://dev.mysql.com/downloads/ + +MySQL Connector/J is brought to you by the MySQL team at Oracle. + +Notice: +- In order to use the WorkoutDatesUpdater.logging capabilities provided by the default + implementation com.mysql.cj.log.Slf4JLogger, it is required to add one or + more jars for Simple Logging Facade for Java (SLF4J) to your CLASSPATH. +- To use the X DevAPI features in Connector/J, you also need the external + library protobuf-java, which you can download manually from the official + Maven repository and add it to the CLASSPATH, or use Maven's automatic + dependency resolution features by adding a dependency to "GroupId: com.mysql" + and "ArtifactId: mysql-connector-j" to your project's pom.xml file. +- To use OCI AIM authentication, you will need to add the external library + oci-java-sdk-common, which you can download manually from the official Maven + repository and add it to the CLASSPATH, or use Maven's automatic dependency + resolution features by adding a dependency to "GroupId: com.oracle.oci.sdk" + and "ArtifactId: oci-java-sdk-common" to your project's pom.xml file. \ No newline at end of file diff --git a/mysql-connector-j-8.0.31/build.xml b/mysql-connector-j-8.0.31/build.xml new file mode 100644 index 0000000..96275c0 --- /dev/null +++ b/mysql-connector-j-8.0.31/build.xml @@ -0,0 +1,1675 @@ + + + + +Compiling MySQL Connector/J +=========================== + +MySQL Connector/J 8.0 supports JDBC4.2 and implements the X DevAPI. This product requires Java 8 for compiling the source code. +The variable 'com.mysql.cj.build.jdk' is used to specify the compiler when building the driver and the variable 'com.mysql.cj.extra.libs' must point to the +location of third-party libraries that aren't distributed but are required for compiling the source code. Further details can be found in +http://dev.mysql.com/doc/connector-j/en/connector-j-installing-source.html. + +Targets: "clean", "compile", "build" (default), "package", "package-no-sources", "install" + + +Testing MySQL Connector/J +========================= + +MySQL Connector/J 8.0 ships with an extensive test suite that can be run by providing a MySQL JDBC URL in the variable 'com.mysql.cj.testsuite.url' and by +running the target "test". If nothing else is set, the test suite runs with the JVM referred in the variable 'com.mysql.cj.build.jdk'. +Alternatively, all tests can be run with a distinct JVM, provided that it is pointed out in the variable 'com.mysql.cj.testsuite.jvm'. +Running only one test set is possible by setting the variable 'com.mysql.cj.testsuite.test.class' with the class' fully qualified name. If also a comma +separated list of test names is provided in the variable 'com.mysql.cj.testsuite.test.methods', then only those will be executed. + +Targets: "test" + + +Coverage and instrumentation +============================ + +This file ships with target "test-coverage" for collecting coverage results and "report-coverage" for creating the HTML coverage report. +The JaCoCo library needed to run these targets can be found at https://github.com/jacoco/jacoco, its JARs should be placed into +${com.mysql.cj.extra.libs}/jacoco directory. +The "test-coverage" target enables tests execution-time JaCoCo instrumentation, runs tests collecting coverage info into a result file +which path is set as ${com.mysql.cj.coverage.result.dir}/${com.mysql.cj.coverage.result.name}. +The "report-coverage" target first merges coverage result files which are placed in 'com.mysql.cj.coverage.result.dir' directory and +their comma-delimited names are passed via 'com.mysql.cj.coverage.merge.files' property. Merge result file path is passed +via 'com.mysql.cj.coverage.merge.result' property. Finally this target builds the HTML report from +'com.mysql.cj.coverage.merge.result' file into the directory passed via 'com.mysql.cj.coverage.report.dir' property. +If some properties are not passed to ANT script then default values are used: + com.mysql.cj.coverage.result.dir - "${com.mysql.cj.testsuite.build.dir}/coverage" + com.mysql.cj.coverage.result.name - "jacoco.exec" + com.mysql.cj.coverage.merge.files - none, merge step is skipped + com.mysql.cj.coverage.merge.result - ${com.mysql.cj.coverage.result.dir}/jacoco.exec + com.mysql.cj.coverage.report.dir - ${com.mysql.cj.coverage.result.dir}/report + +Targets: "test-coverage", "report-coverage" + + +Generate X DevAPI reference documentation +========================================= + +The target "xdevapi-docs" generates the Javadocs for the X DevAPI classes. The property "com.mysql.cj.docs.xdevapi" can be used to set the destination of the +Javadoc HTML files. + +Targets: "xdevapi-docs" + + +Sample 'build.properties' that can be used to compile, build and test +===================================================================== +~~~start cut here~~~ +# Basic settings for 'compile', 'test' and targets that depend on these. + +# External libraries needed for both compiling and testing: +# - Further details in http://dev.mysql.com/doc/connector-j/en/connector-j-installing-source.html +# - Mandatory. +com.mysql.cj.extra.libs=<full_path_to_connector-j-jardeps> + +# JDKs needed for compiling: +# - Must point to JDK home directory. +# - Also used for testing if 'com.mysql.cj.testsuite.jvm' is not provided. +# - Mandatory. +com.mysql.cj.build.jdk=<full_path_to_jdk1.8> + +# Single JVM/MySQL tests: +# - Must point to JDK or JRE home directory. +# - If not provided, JDBC tests are run with 'com.mysql.cj.build.jdk'. +# - Optional. +com.mysql.cj.testsuite.jvm=<full_path_to_a_jdk_or_jre> +# - URL to the test database. +# - Any of the current MySQL versions. +# - Mandatory for 'test' target. +com.mysql.cj.testsuite.url=jdbc:mysql://<host>:<port>/<testDB>?user=<user>&password=<pwd> +com.mysql.cj.testsuite.mysqlx.url=jdbc:mysql://<user>:<pwd>@<host>:<port>/<testDB> + +# Cancels re-compiling between successive test executions. +# - Comment variable if not needed. +# - Optional. +com.mysql.cj.build.noCleanBetweenCompiles=yes + +# Other targets may require specific settings. Check 'build.xml' for details. +~~~end cut here~~~ + + +Available build properties +========================== + +build.properties - path to properties file + +com.mysql.cj.extra.libs - location of third-party libraries: [${com.mysql.cj.extra.libs}] + +com.mysql.cj.build.jdk - path to JDK used for building driver: [${com.mysql.cj.build.jdk}] +com.mysql.cj.build.addDebugInfo - whether the driver be compiled with debugging info: [${com.mysql.cj.build.addDebugInfo}] +com.mysql.cj.build.noCleanBetweenCompiles - don't delete compiled classes from previous build: [_unset_] +com.mysql.cj.build.failOnWarnings - fail the build when any warning is found: [_unset_] +com.mysql.cj.build.verbose - log the extended build info: [_unset_] + +com.mysql.cj.build.commercial - build commercial variant of the driver: [_unset_] +com.mysql.cj.build.filterLicense - build ISV variant of the driver: [_unset_] +com.mysql.cj.build.noCrypto - build the driver without SSL support: [_unset_] + +com.mysql.cj.build.driver.version.major - major version: [${com.mysql.cj.build.driver.version.major}] +com.mysql.cj.build.driver.version.minor - minor version: [${com.mysql.cj.build.driver.version.minor}] +com.mysql.cj.build.driver.version.subminor - subminor version: [${com.mysql.cj.build.driver.version.subminor}] +com.mysql.cj.build.driver.version.status - version status, such as '-rc' or '-dmr': [${com.mysql.cj.build.driver.version.status}] +com.mysql.cj.build.driver.version.series - product series, i.e. x.y: [${com.mysql.cj.build.driver.version.major}.${com.mysql.cj.build.driver.version.minor}] +com.mysql.cj.build.driver.version.numeric - numeric version, i.e. x.y.z: [${com.mysql.cj.build.driver.version.series}.${com.mysql.cj.build.driver.version.subminor}] +com.mysql.cj.build.driver.version - standard version string (includes version status): [${com.mysql.cj.build.driver.version.numeric}${com.mysql.cj.build.driver.version.status}] +com.mysql.cj.build.driver.version.extra - optional version information appended to the version string: [${com.mysql.cj.build.driver.version.extra}] +com.mysql.cj.build.driver.version.snapshot - optional version snapshot marker: [${com.mysql.cj.build.driver.version.snapshot}] +com.mysql.cj.build.driver.version.full - full version string: [${com.mysql.cj.build.driver.version}${com.mysql.cj.build.driver.version.extra}${com.mysql.cj.build.driver.version.snapshot}] + +com.mysql.cj.build.driver.displayName - product display name: [${com.mysql.cj.build.driver.displayName}] +com.mysql.cj.build.driver.name - product name: [${com.mysql.cj.build.driver.name}] +com.mysql.cj.build.driver.extraName - optional extension to product name: [${com.mysql.cj.build.driver.extraName}] +com.mysql.cj.build.driver.extendedName - final product name: [${com.mysql.cj.build.driver.name}${com.mysql.cj.build.driver.extraName}] +com.mysql.cj.build.driver.fullName - full product name (includes version): [${com.mysql.cj.build.driver.extendedName}-${com.mysql.cj.build.driver.version.full}] + +com.mysql.cj.build.dir - root directory for driver build: [${com.mysql.cj.build.dir}] +com.mysql.cj.build.dir.driver - driver build directory: [${com.mysql.cj.build.dir}/${com.mysql.cj.build.driver.fullName}] + +com.mysql.cj.dist.packageName - final package name: [${com.mysql.cj.build.driver.extendedName}${com.mysql.cj.dist.packageExtraName}-${com.mysql.cj.build.driver.version.full}] +com.mysql.cj.dist.packageExtraName - optional extension to package name: [${com.mysql.cj.dist.packageExtraName}] +com.mysql.cj.dist.noSources - don't include sources into dist archives: [_unset_] +com.mysql.cj.dist.noMaven - don't create Maven bundles: [_unset_] +com.mysql.cj.dist.licenseUrl - license book location: [${com.mysql.cj.dist.licenseUrl}] + +com.mysql.cj.dist.archiveName - final archive name: [${com.mysql.cj.dist.packageName}[_src|_no-src|_none_]] +com.mysql.cj.dist.archiveSourcesSuffix - sources indicator suffix added to the archive name (depends on package type - GPL/Commercial): [_src|_no-src|_unset_] + +com.mysql.cj.dist.dir - root directory for driver packaging: [${com.mysql.cj.dist.dir}] +com.mysql.cj.dist.dir.prepare - directory for preparing packages: [${com.mysql.cj.dist.dir.prepare}] +com.mysql.cj.dist.dir.package - directory for preparing packages for given package name: [${com.mysql.cj.dist.dir.prepare}/${com.mysql.cj.dist.packageName}] +com.mysql.cj.dist.dir.maven - directory for preparing Maven packages: [${com.mysql.cj.dist.dir.prepare}/${com.mysql.cj.dist.packageName}-maven] + +com.mysql.cj.dist.deb.maintainerEmail - the deb package maintainer email: [${com.mysql.cj.dist.deb.maintainerEmail}] + +com.mysql.cj.docs.xdevapi - destination of the X DevAPI Javadoc HTML files: [docs] + +Available test properties +========================= + +com.mysql.cj.testsuite.build.dir - root directory for building the test suite: [${com.mysql.cj.testsuite.build.dir}] +com.mysql.cj.testsuite.junit.results - where to put JUnit reports: [${com.mysql.cj.testsuite.junit.results}] +com.mysql.cj.testsuite.jvm - path to the JVM used to run the test suite: [${com.mysql.cj.testsuite.jvm}] +com.mysql.cj.testsuite.url - connection string to the test server: [_unset_] +com.mysql.cj.testsuite.mysqlx.url - connection string to the test server with X Plugin: [_unset_] +com.mysql.cj.testsuite.test.class - test class name to run: [_unset_] +com.mysql.cj.testsuite.test.methods - a comma separated list of test names existing in the class defined by 'com.mysql.cj.testsuite.test.class': [_unset_] +com.mysql.cj.testsuite.unavailable.host - a host:port pair used for tests checking socket connection timeout: [_unset_] + +See also com.mysql.cj.conf.PropertyDefinitions.SYSP_* variables for other test options. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + build-date: ${com.mysql.cj.build.time}${line.separator} + os-info: ${os.name} ${os.arch} ${os.version}${line.separator} + compiler: ${com.mysql.cj.dist.jdk.compilerVersion}${line.separator} + build-tool: ${ant.version}${line.separator} + + + ## INFO_BIN ##${line.separator}${com.mysql.cj.build.infoBinFromFile} + + + version: ${com.mysql.cj.build.driver.version.full}${line.separator} + branch: ${com.mysql.cj.build.git.branch}${line.separator} + date: ${com.mysql.cj.build.git.date}${line.separator} + commit: ${com.mysql.cj.build.git.commit}${line.separator} + short: ${com.mysql.cj.build.git.short}${line.separator} + + + ## INFO_SRC ##${line.separator}${com.mysql.cj.build.infoSrcFromFile} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Removing sources from '${com.mysql.cj.dist.dir.prepare}' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Compiling MySQL Connector/J with '${com.mysql.cj.build.jdk}' to '${com.mysql.cj.build.compiler.output}' + + + + + + + + + + + + + + + + + + + + + + + + + + Compiling MySQL Connector/J testsuite with '${com.mysql.cj.build.jdk}' to '${com.mysql.cj.testsuite.compiler.output}' + + + + + + + + + + + + + + + Compiling MySQL Connector/J-c3p0 integration with '${com.mysql.cj.build.jdk}' to '${com.mysql.cj.build.compiler.output}' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${com.mysql.cj.testsuite.message.test.mode} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Using Commercial settings + + + + + + + + Using GPL settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mysql-connector-j-8.0.31/mysql-connector-j-8.0.31.jar b/mysql-connector-j-8.0.31/mysql-connector-j-8.0.31.jar new file mode 100644 index 0000000000000000000000000000000000000000..8b74bb87b291fb3c72757ef817cd3f5c308d8d21 GIT binary patch literal 2515519 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

(bf8ZA>b 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

    q0f$C@4kA{b1NLkS5zznO`&# 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

    2V0 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

    5tU`rTK4EU(0)Hm0b?gj+}1muI| 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�>Gv%Ub_V?WsdIqd)o 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

    XOorW0lBhGihWf&stqx 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

    i+U_rmd3rK^fH0;K8XDC$4Svcn1K$> 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

    (~cBr!7EYtmacQQ{RnU&A33fs14UF?Sgub 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ḓ~y7!ZbI*CmE0dL(s{IQs4^cUE178nR9bony7kzj zv{MHf;|6Or`@Do4_Gtz^kR0Bp)Q`a<{-Vk4dUP-tfvjlAtNYZ+E>szZ$z*Ol-xd85 zsGpkgnIBbmbj(P=%cNpze}rUhq1n*<#Sm2XBTw%DE@V6vzEcyF4R`!P&}ISGn6pT| z;LCD_N3kz##Mst%ha|z927)=YgHjbbk$wj)JxZ;>TCO-qO1aRSjK(?CzkyvzO=@7( zhg-r`pXYlLM9&rnk5?~l2s8`3NaVc{ZvvblxXa3`iP9yTC=0z)ZaR{D&acdh88Im? z)K3|YRA03viR+2lB%d#i!de!m_4XULCcaPB1bT9h;ITuHOvyAjd~j+HPLc7LI7%rz zYHez_VRu?5p@+X9cX7$~zvyScLP4H!u{LcpYtq#OiSAI! zKIp+H@~PCA)O;vlnCrIXt@8vl7~S5EM#_Pr#^|pT#Q_qL_u@gRby(^wR(V?&Um#Pu zE_TQkP%gc!nk{?catT;g^rI>&2W!9?c4*)c+jiO~Ym`oQhIWC>)9ohsLexG|B}w&) zBtLpBiqGhmJc3Ooe}^5-=g!f7fm9at?irrptrGJ@(lDlLrP#Mq8>K$#na?|+C*_R9 zJpw|XiC`DqtjxV&oqj|&Of2rIDt>7*3z5~>F6x7Tf~QAD<>LntSi-~u1=Xc$7ELwv z#o$MUl~)sm5sGTo_WME;$ubg~H^F?PDZpy@=i`^pvT?)31_14IOd?#HDLhjb;evp% zk+U~x^r;-VC!a}N0yTSg{$T486T}tr3Or_*Bv(Mf>wYVT)eH}Ude$#*WG2e)WELWJ zssol1q={nrL&n$gY4@4cl=44M?%5)iqmKKUjy!T=-50oRIwKdcb0J)~_H)PfIC5B4 zpye=*EIt_kDm4Pd+L4&;)5k~6s6cGxr=Fb1LFM=$#yBc%F`j3(Z5OcRHWCFd^GiLIE+%P00%C@GDWb#4WkcKq;31XU1Zju>k^q`ukW?mNs)fUuGDUj3+ z(e&WRI7A`MGI%;>^=y2oT5*HI_0Z9c0S z3Sf`M@1>~zQG}DN-I48DwD$lnglT=ioq%HZu_20zs+8n=29HOI-J!N6T}-hU+PP>P zE5m`D=!_hvVhwXHg>Q~nvrJHVZ0}&vG?H!{L4Vlv?3D(8tjw?X7Hs|#F2HVXsMC6h z-#uFxryeoGx&Q$`1P{cP7B>*nNEXY58;qbFCZTGsAuCLGJNe|XCtx8a0zDF z5Kf6S@`yP2p?p7@rYl5L|B-}AHnwaV^PM%oqGNMatD9j|nN@HFFTmFufX=Uu4_`DA zXJ*Vp$&_##*)wrr_K8zAV=auP7#dm@ReKVr zr#tC0&!OMy)r~-A#-)(G7+vMB9&8%-xLRHE3wMG; zp?CN}9Clo?@@E4=?(AGp1Pl#H#~o>=zQD2S%dJycnLJLR$zHMYH^!bK>p9DinZ7z| z?5j*dM$FMOqJ=D(qV|N*_q6jHV%5#ns+SMI2L9MwKQNlzj0j6Ocvx_s4oK_+Z(T=+nc*lq z_(}W^0g2u`PMWylG7<+0Ve;n*`S3YuXT^{`{G-M{(0YIDk*8%U3rJb3btZJq6LO-w zdEa32f06c1QIdXb`evnV+jdskwpD4{wryvnZD&^6wr$%sYU0;lPtSbabJG7gjgwfh zW3P9;d*9D>-Mk5EX&#uZ%Y8TJ`O6rxjCuv;z3F~bNZuJW^~uA^R%lBTvWdFwmDPjP zsR*@2@6gOceBKkEzD<+^R%PA4hiePpIhF|S%iL8|3{ytJ;v%RUzEP8iQkoAe^4-1v zJ0(1~Shzg`NL_^inYG;i|Mc~LhSrwAf{3DiR?O9ffiMX1A@SK=cc6--8sT{qr)Mf+ zVXm4To+7o!{UGj?5!s@M?3%ZgdA?u!*$g8n{zP2JO2jGVP(?7mJcN@{$O5(>d$l@p zQGT&8h6v`nX%^7kT5M`o7goyTKU*H?*lRo$UL$`&fi>WEB$iAs{LL`?F4SDJy9c(5 zlV8^}k@PiY{aG)-Zb(@ zZR$b>X$v%_=ndxIWB#?LJ-<%CQc(bwOyK`y$^OS8$-)B(B8KRFq?^Wva|8~`*;UaZ zMTAIj2wIt>HCnWL1y^ct_zOeXkQwGD{z_St?y9|xyMPlQfPDhRxYXm&MrA+uW|RIA1O|GvA)S9)A5ms816{ zXXlkUiSNI{Wlp=Z9~qz(c2%XeSiuZMkL-XwgWE!cH9{*NY-m-*I0mZ?LrpI`^$+XV zlxVpIUvSkEgDuqR2mff|u!LDcgbVf700j6#_@aT&xhlY0_gdm}7qbZPpRqe^>*t=G zCw3j`X5u0a<|GDYeiRuxR7|Mrn<53{F)2Ko%9Q(j~4nngpLHc(hW@J-h}S;Y2^Lk zI?T6L+2WerTX46NPg`*OIr&00E}XD8)pHZoP1COAcq0jrc3&?vB!_&2nk(Q5!ioP& z+KvBT((cD?gW%6kDE~`LjpK1~O1D-SMRE3fu<}&tiAzjj0#C|q3e*LPI{J_Ya(kkD zygpL;`3UL5QYy!`IytBsXOybhHj)2G@r(X5#g~sT@6OmQwWq6JaUfZfp5u`+iY!xZ z4S5KjApH}{bR%Q%3i0ndb(c0b=pSh}^ZyBj^8f7A{}$f=i!T>%@0gRc(nt)c2fRr_ zlH^*WY4@W4j*p7&UqeqMQ%0UVZ%mx#yTbcrosKBP${Gx+L>L1A%=;pY3H#!OkmtPs zgt?H=m{-Te(wVLNB^t%Q^W{l1d;q?Dsh}H~kEeGkD1{>$!QsImf-2%n%6V6UZ2c_; z0pTtjvdcY9Jnr_C&f&qqmalJ$qRk^PQ=Vz8)Z-EB*gcVe ze`4z7^YQhK+8anO`BjNbt}nIi4LZp;C9{@kX{GHAoPFo;SZmWeGxNs&LC3axWa_2u z4Tzop@K_v~KjF2!x08vkO+z|(e@~qmJN30q;ApbJf4=fU(_2|Ymb5WgKziX`pOR~i z3q2-Qv=P8qWJJT4ifNgtBggzafCri>ISnUg0LF1NuTv%AT`FSx6H~UtWMi&s#Kujff)O3MI2wWFb2|0qY}0AkV66pOw81-d>nu%BDJfqZa|uqa z88k*2(V;J0iG!5ZG;dmulUJNPZHR@TlE7nP&iSZBXwEkj9bd`QU?B={N486Iq>4pW z7VZgfx3ioe@Glm$jBhdpM_mqs70qoo^RQO+T{*Lp+gPso$`Pfp0Ap=s3NGC8W*Kr; zUO|%%JscQ{#5<5a`#+@cXvt@lc%skeDvQ#HKNf%^q*H7s#-*>jk(XOKLBpW8@Bn1F zhux&~c=~nR%t#vPH)UM|fGo!^iB=JogyELWu8jK?;Z!R$JB5CTU&9&};wqysX-n&hGnP<-W;Tx0DX*)IL>tZ4C>mJA??o z`=!JS6qOE#14Xtq*GrbuSV{e&UYOsVtX8EnSpm0cHRQ?;TnxD!ACoO4wmUR<)5`fy zk-Vm^?d;@X^Pi%;h_XY%n(}FO0p~woHQgi7tozk$*`z}otxVICek=6K2ZJEIFBnaHpYl6C;d@~u|YfJiOW=si;~ zFAw@aOm;WQ0&RCx+(DPfTjb1JC@Rqq;?IIac|2tCIi`c&*KRO^7F8k*+bz;x<%Cm#GQyZ7EKIB_j6x7B)5Q8=_Q z9=Rx`#d+65!_<_5*k<2Utt?a+$5z`|ydZ6MqZ9IO`7L}|_#(r4^Q`4XwmHY_%6n^z z%Rsd}DORDXyU8UR8w+`>*YW_h5bBRAi7cOxh7PKE(Px2! zj;OZ2wzk7hU%ICkS^Su<+jIZwzG%}9%rY8>`XUVEK~04lKa3}=!{d9*M1i2VNhW$D zidZ3Y{$*rIT@x)IWwO3-y$r~G zDUeN*zvpRr^!vEL0}Cs>1VtZ>e5f8hQ#^XcB06&1v@nA~%ALh{|7BxxlDL8k`#<{b zA63StYd>;%SY_!f0-oReeil8awG(QCDjJUjG^9Q00GM7QAEZ!c|HA zl`u>9n=G8Hzj42Bew5($K}f*7$xJ}un#14+F)Scy&EqN>a0kW~p#SwCZP|>jM_VX! z6X4hp-~iY`qN=5D4MCca8TyI`iC&Yf%#yI$d}B9Ja0Nc*VgEC$FJFVQ%m-Q2ho^)q z1V_#8rz-=}1Vf;($@3T+x5zsE;Ti#i&NyaWN4>F19b7+xsA`fnC2C{`Z$|If`%8yA zsT=lEot3w)?9IXbCKTD+7j~P9mJh&{k4<(w`Y)Bq#T1Ce8s)>5a+)R3*&#WLRQr>` zSi(Bg(>f&odg;R<!>qU&+nu3PVtSL!(#MIY|>{2%)rp?K*z)5nr*y2jP`U->e+vbJ47Pxpks z$E{`wYekbf;ptdfGLDxgGV27lt;@PH&V@jZNg|SwWOSO@+v^ZM;0oIrBS1o1*mt4t z725XlO>TL_q1{P!sU3<3C!!6B9aM7%Cvu4ZSb3y-4VzSEFDn2mKX#T%UBD&2ea1a= zZe2aho;%}!j{8AYR}M? zEm?6sYT}@CzW< zG6?%@QC&+?vJ6K)589KunI5AF9wFSvL9Jck?h(5wY6fXG&r%qsGo(pC&S6Q|bk~cJ z`>G)w@i#};uK*io*j@^$n^67cE#=+Nr*2H|#6+8-gtnm%rN34id#_t)>g4Uro-bbtl`vU*2A2@lWz@yYW)Bl`ba z-_860(03#KOW#dQib80hhddixC$c6bgs5QfU-oWwcI}E*mFlHPtENDhCSv4*My00e zl;(BIrYP5iW=kurtCA*q-jk_`$%#YRG|95J?#-($uW7&EUNdcOv3~c1Nk2@(!RR?| zNhr`}oG!p@zg9y$=9cAKp9-RL@7XK#T>C;Wblk!Co%T*%!4Uq=huFBMXw{Crrognl zHbw8)e`#Up_TRL+>kQ-2YX|N;%=0rI@jG6~lK(|-+1{^jNgvJCe*L+!H&Cuworgb?zmZk6Sf4P1hK7`C~h7HIOjfB+obqes61D=py)z~YS#uy~{V zWAUz)gbV5F>&Bo9&RcDMwg==)|Twf~Tt> z({zbKU#ZeqZmstf6*iiR42c3grnQ29r}^X_*ziW1xRjgDCi5PO1a`B-{?QOk$tE%5xxUPn^O&lU02)4e99RhqW47FUYis4_RMIk*s5yLIQu7}zn@g1ZvZ}z z_1vP#RMp^s+RhLlt!l1<_GnpfWUd;iwWPHa9*?e~Qb|d#YISt#Sg)!FBY8ItSb&hs zc9p8EsD`qJ19byM_fpk^!Ll^8NGH>HXarAjV9}Hw*`8A(I1M+4)0B96t)w-hJ6~M< zVfVCTS;<}%;!6KuX{j=nQJV7Xz}qG#%_ty-esPw2j`chE9Av}dCdq!$4*uPeM60pm8ds)dPi_j-ijmsn#f)!IZ+9-q*6&OY%UeyTr$aY~at0nm6L+?MJ$66ej~ zBjVHylvf>gSXQR?PTT}Z=$Y&Ii|enW_KhC>Hgh1$!?Mt1c(_#PVS&B@Dd2lQJe;oN zWMe$NRM&b7GpmORJq$BR18REdtwPVN&jO6J>}(W<1;y^bH6et(FC)xhw0(uXb7Sx; zq}dnY4Lydz$0IZ&hRuSSN5tQHS+jG4^3?Su8LzXT2>5WA9v*EpO5Zzu3l@>Lax;}+ zBZ79lp8gV@!{f@*9|?)sYsyftnwSDN6@!qOM>^GT7;Mdgh`1xib3Bn{&}S&aU=y4& zlSgSoONr(Fp=K4>EBd(wxMaFD{*l533)=t=F1Q=r7c{!i5JQKbv64grGl^3tj%gUO z1~W`LMqtQZ*YJ_eSXPNnF|NqW#LjR@Q+_9lJ^(t6mrO!R|I;)RHJesmK8q>}SW5XL zce2z!;<20}N47!gJy-PSA0AI|cHi}^aVZU03=W2?57TkB%nCCXtn3tRnJdXjWi2dm zuC70ckk+_|4o>@(3!)T%5#_a%7bw@NY@g3+ft00-=M5Y?9){1km;bg z1|e;IML!576Wo#Oo4zTVb0WNRqGCd~47EBFPs#S)_vzo$i#a2zE z!XZr2do`3bvsYH&I|;MKpRuG?D`@6`B@vv%V}G%CI1i<`zse z*)S@QmlU{W$R(2U;QGWNfp!zx_HeJbELF5EFmsTUp4^EkBnq0Ix-G3D+`^Cx<0mRp zlGe{QR@upYL$-404^-M=WH1CJ>B+t?+IemIW2#mJ1Sdh|b_WUl=^r75vTQ_6TeSA? zz3x@8LrVTgl07n#Hxl_?r+K=vr{ZTV&R=vYiYI9zH5hIt^hun z;5clA4%NHghA9k5-701~%U!+lBDmI{M4B!a=;>uMhs6XO;;*_L`HR#)GVkYgkS@J^ zwu~LmM*_BrcUai#E$Oqja+3GMewXyZG^C3j?9f7;P$ zi9MSU!?oe04^pE(gVyg=!@GR)Eeuo`?6>z=or|S)89B`beSaCF{pcp zfPLS8$-IrIanm3Is8Vc6Y}ypdLSNNi5&$_#Z(#2g7{L2TU&_=+rrx2nQQs< zvUMrAN#xzyl14>bd|8oZ+`DVq7UU^ihxN%lcEShLF^lh%& zI7fpLk6XfWe1uv_rAD{KAWhc|xg}<`ct!ESmdGwZMHV_2A*}HSrxM&fz#c-hWRTnl zc~CTzMnWf=q7nx-ufd_L8GAHuS(UiFXKledoxrAFxcDP(F`Uf;ZoQb?d|uOe{$=a& z3;NwR#W}X7Z>i|rfig@=`wBCl&791bjX4ySVZD4w4t{q?%`$<_2z&#C;IqB?nb4om zf|p=pE&y>1v1G2?-X{{*czo7a#P~flj%aL^h_7GW;4k7D0kKg?^mH+^YfW-J4aCVs z&LE${XsW~jj2ISqy-VRP(w2Y&#j3;u!*KENJib%G42(3*% zU13INsoBKgKC`xMyd`^9YrM961%2}tT*sBbo$l&SgjSnIPHPCmVQe|epu^HGOn+jq z1PU7x;Sd>JU312|q)7TgVZl@A#DqH}RD)7_o#GfBJ)>KfKNCrA=)-RLQT!6whlt$& z@_0Lt)esxA~(>8 zVN9}gqYUI|C)9{jIK5~9tD0uL=zys+rI-e4Qq{P(5^9pQk*G#E-$UD8MDK7 z=(SsN?=}07wc!Y!L&az({#fOo0#Z^uU^lF9cZi$OT4k|zB;+q>LE3Z<`qyhRHJ=XA zGmQl={!nJkf^k}%1ERo3TGatLrhpV2G|%hfM;9H`EYxoS0_h*^Ed+TjS|HixP>tL` zr+7a8+v%X@3jY1@Q98*Jh4_MlbUS(LQ zQ7mw;q)AF+AD@Hko9DxQ5;K`&(<9LFtu*PdDy>HQ#XpSyrSXoV>z;AEt6D_o54VF0 zZCKhz<#aocj2dcC*73H^i^4I)Q|oJMU^1!40c}}wLR->Bbmql_b8j!8%Z1|t-oyEi*61j4YNft zQzWH)QP8Ff#ulw-X=~VCs_&DQ#IBsaO#L;kwHeGKpig){bBXm${vV8dJ5fbLC)KjP z0)UYl{7Ico`E5HnSS8)g`S^X9l^TFFJ^%b)+yE%qx&6<;+192K6_o!L1}PuRx%#d;7!(T74$ZdsAI!K(#+6)l_RxKi z9p9VYqbRcMC(t+LL3Xj=0!zKDb5gq3$#ff_9-2FyfWOBV;uh9QqsU>U&k!AIbA~vC z3<3d{_Gb~h3E>p_fJ(jdX#6Iiqm)r6DZm}cB~z$pUpAMxf%VAYZ@iVoN|63M?nJy2 z!lG8FH!EcD_MHbNG;}+wyvx?L#p|$JSL}wHmnPOybnK=N&ILg@y*A|bA=!SGh89qjha}2>xUR&E#)YKJirquZ7*rCgOR0iin#X`>i+HcwQI7 zWWD9l9^rw0h@3;9BU@#fIM7enIP&%gSZTk%E}^A`0!zEWAAeL^tmNNj3JXc{8QRC{ zxJr;A$U@!zc3&B>S83PR3R+kLilGY=L%&MQ6-ESJB6w11NisFLK|W;UfHg7}*f{7Ou$!A+Pk0dcb}zT}&GCm`AHUNB19W%At{wCcHpT+ojpko;V5kLG5p8Vj}1>6*6o_yA8f$WwI?T{#HiewxjGz2(*Mj2sEIpa zc0uP(g1pcSR5McxSFu!**{bv-_~uLsKG7P+%Mj|z-qu+_o*)Kx(85@hHeqQYLgEvB zOU2EOrNWF^@}Yxx8EO$D7Uq(gxQ~u&3~TH>D9qf|Se?Jy#D<6yN@XW0T5NxW(MRcY~C+*lZe1!h-EM1!?bFRTE!oHf6 z1iw4GUWB$I^GBvuER7*=x`yv%Owp5wn!ZBU;NQTH zM3i+SPKqHdXn(4%W-%QcK#t}VLn0}$IdvaW{r5ineXiQ7|lyQhCT)w z@hc@Er!w3$!_4_A-zoP2dqbEku4Ey4*PWDU)75wv03LubENto;Eg-I{{DBqmvLnq| z;8cMg%-`y}4GtoImpG&TT^T?2A|WIXPgM|dY2$qL>`EkqFZ;GE%N&n$aqLv2lePQ) zm^@8HJ>_2S{L^)&uyPPN=p781mYE}sBF#@l9^nFl3K%q&3x>)qoimM@yWi_7QezGb zJX0F_$Z<#maYEfIpU?bqw-glLbvfHjzo8g$6Ux-NC6aO|~vb2dJQ&z`8F)Lot(BSQpD{X`BcfQwhpIlvx@ zE0L4xmr0e1$Wb1#P$Z;sd2u)#>f&#AEK%zsQb9tM3C!)4Y|i9~j5Tq*-`sSmtc?tc zx}%lBsB==LRG4l$z*wg`W4NWNnvNCi6(wR|%Pel(E4XZg0o)lKwe01ata>g!*Q%(U zN}DLt(_9FSDkw=^cdds`S`9V`=Ou>IWp(32&sdUSk&IJNs`_`6?J>}x8X4A3X*~;T z(hul-dqw^@^Nucu)qmCZuSM>?`|F4-yw*MHFB{&U?q8n4+R`s=orhwCCRbk{jOq5( zr~kAwNJr?{eoGZ6zHW2JMYNC(&pBG9ydCdr=cEjpG<=|}p(YToN1>x$Z(7{^FiDqS zp{cjo=ee~!vV0+aY^6%s9B4vgvUiAVcsSA>Ql~U@Qe@qt)6bth(e0AWiw88I8y;df zb{KUp7t)%$G3i43?46)VhE%O!IK1_z)0pK-{(MeFi3x$+1 zb^2N>T9O4u_~N%o^SHNlXqh-tv`}X4;iW~Zmqn`G+mKo@Ss*{Ktlk&;ScDqEOK_p5 zdqb}=9%Gy143F#}vAFQOuSe#*p{)$xywX+aaQ8M@$ek=Mbj~d>tY$-Ej zFr-G_>`dni_bG@vMEg*65WrO#qT5$fbwK7>CbHS zkVC6QYnd}pMdO`3UP<30a!^MTZ(X6W{dMOMU0ERiNV8u?9Sg-gd^|7zQNa-~Q@#)H zprk+dnC@=Jg@<(z#B^aVg;qNdrsANvNo7B98HS(1h-VV!bmwk2-`dl{)G3{%IHZAO z5CX2^4J+S3FYjcRRUL2Q^+~LC?Atu&V_i+Fj>Gu29#$BoCZFT3IA z=ZXd+V++B4-~!E7O7sYo-2-c$zaD|C$;f0TpY*v6t&7i|ohWc6^81@n#A+h|w4Cbp zIYRXZ7~@~vQZinor(T=d2F)EA*^D>c(vQt8r+Z##TOpg)ti8Ci=VFsxZLWd!B+1na zFJa{xxxA#h@)$&7P2g|WVO}Sr!~(=Rh8Jw-$5QXVjSH-TI}^5Cq>?k&H%jf$r9P^6 z-%|~{x4V44Al^ZLb0a_AtFo`~N=Nw>o3Ppr9?e7@Gtj(OD*AJOI*;)8;Y-6N=$VPp zLZFpRkWH78lw)n&CYJy4JpSI~oQRB{@MK1%1x^|0{0sWFyeSwdW#p#0bLpPtnjzoa zYYx94&lJ1h;t+t7WPh<4LSqxVGL|lSFRe?CsLnP~q8uDW7lkS*2mc11xjWzsi7Np1 zrMv_^n?$XN?NvS36C;K*7o>~bmM!*sA?Ytqsv@VH{5nbb(_Ps!AR$QF@&|cdG)}yXf-pgT7gFRiBk&`Spiu=Up4+a=Fi*u5*`lE5fn8I+q)G_=z+YJ4 z#cJRA{z{7F*==z7I-sTXjd}&IFt~>0P!Bc3ZQC-~#gP6a1v4NYicZi9%NwEUXIl{G zdPz#bHjKU>eQLK%0{u576b)+hMtvk@#-x(-a7)-dxD7KKX=sY{Mf z_H&~R7`mi7L)*euI0|8AE%ZLwA{A!wOYqROgHVNWZ71~2SbSRW@&NeeP|V4<_-OMY zjJBA434n4u-A5rkLeA8e9Ry!TyWcV!Td64!`~Y1xpUGG42(?*%I9=3b1l2KNP6-6B z6NPS%w@xjxuVfT?7VeBzLr$Mc|Fi7Vz+#71?KSXldzASqni)|^i?XmLF~1`f<4K)qj9J1%f4M`(HNN$)LFne@^s9Fx>QCRHjQ7K}Wh zMC|HdgG>c0+HR}*1mJPi%k^NQd8o!r+Gy8T>jUUR;a0Eq!Ju1zp%mzr2f7Dww&EWo zx*FlA`2sC%Otn7GYF^}&J(m$}M!^3&+%C0lw-enW5yLi$S$_MuJ$VEPt>vtuKIZ^s zSIl1GonG`f=M=~BiMkxdt}W<9Hu@gM-W?8?AJYg)k<*)jmm@X&){8divXA?gCREAmw(^yAz|VCr+qg(-K;mNejS6a4@s=KN z*1N?wqENZr)&;xqN*Bo=i3>kQGSWMCsok9*wU`Dnf>k%Vj*2t%IHhLGI%Lfq6nhR! z`rHF@3_D9UZ8f#0`s_0?hol!*z6H;`TA7rwk!5+sahIX*he}_=DS6%lbHwolhJGo@ z9xKBPWH%JF$NN3&lpz=t6A&0Fssp{vP??G_8;r0otked7Mgz1krv-NJV_FEurvEk> zc83&ECm(7BM?%{X*bIH2_S_jm*t&E)#=6|Ugt-yL=z6-7>~0sIDYXzPU-(YVmYp?t zY^5yN9IfprO?F>sN#$i@kC4K}E(~`~l6u~Mzw28CjbCRYAd9|3K9=fra;L?7G%Hn? z5qAJZC8b%>%ymg9^$N{J9Vy`$PRc2h_?SrAVx&qNSJ z5(|)#JImFd7d1|(cLnojGA#JH(wF?*)RwssxtxD&FI)u#H~XV)6Lj@SBdw&}!Th5>!%T&Bm`2ntWB?P00q_lN)plstsuJT>WVwfIfqlZ*aXs5bnOu>fkkb zC+aE60^nh+k*XIT^w>CiaAV^yJR;^mjpuKW?>Tp0DDhq}KREb^CY5it{WA3!qsPa6 z8V*T$f+xAT2YPJ&1LcGg4=hhVUfvynnJ*UK@q>|uf+=@C2DZKAnYfv7y5WZh!%C*_ zU$hD~Xz+;FJ0G9?|E*{b0U+?oL;CTVo*!;6BI#L)6=VR{^9dp6ECch}Qm7#-IlUCWIJP*$&wamJW*wiz?ZTRTg9R;YiF5 z+07}oOt!6V_KmQ$E$0r4j;rP^@%2`5H6)?7uHOC*HR)Rt!FH zy+RIyKoGvEf@D9T0Z$3be;qG$Ain+irCR$@wo`8X;757f(fk~Dv1_CQ zhn+kQGZ52>W!23K>gK5poOTTiPHIRaoFT}gU?n+Pr=53siJTJ1BCH{D5IH+pQlp>} zN1Y%=IV=zoE<<10r$=y(8&r{iF4s5HeS*k<5J1K5D53+I($oZfT*j)@a$(i-$e6 z{k_X)=W&vAAH>v-<8irb%8L0M8fa-wE*U<$!Ct+&*}o~n3f3@&N2oZ*Bi^-+p}@UG zwCy#3>13q@+>48D4gVpOquaEF^62col){(Ge+ZwTD`A2{Lj2I~vvtG-8r?B0Jg-g; zWywIvG}NF*cJ%NVW65}Wt+s(Nxd@ln-l)^tKE5L=HD>Ynx>#aw2blJ8S$HnG6!W84 z3(ceret*wnT|6)V6t=PDN2{t+0MzKHgO7Hz|?loy|-4 zDy5FV4qQ2gfmo`M1)2e9C)S-`Du_&*$j)LWsZ>(28&@~$#jlKK>cX1FfG6w{x!wd@ zuq_|1p572%m+NQ}3yzbMGZI>b)@pRz2yY0iX6kT4_GN(0t7>nLHLao(0 z#tK2cVshfKksL?2WK9>2UJ?R_*xvI!^QjWRcYN<5)hWIvmf^(; zA4u%%;%Lwjxt(msT=PwlovtQBxo>n5rT3Q~^qSa3uo>(+vEgXDC_^AkGo zI1j!9KOn0MSj*X)R>>lkcz7Gj@wK>BV;k6*m{F|d@FQc8)<@0+C>{VeL9sE{@6JtF z=(TC>#La-N7Zy1`GX1e%)K>}uoVFWj8X<55zoo4BJd7 zVJ%a2bgt<2_gn_38z7 z?$Xb9FNLl)XjLh#%;Q%L%X_}(FbMj2+);!ar3AWYT_YUCTO@VYdpI*2g0xZ>;;_mta;GwOn5h(zuC^KWl910c<#VoDTblaYP4u&jZtQ@4 zX)3l8VZ<{Mk$e_TntyLup|$iQr*}UwxeQZILOeP{;FqM7x~=mJtc|XOa1PS_1;ObV zC6p(#$(c`kWVv_yV+jDar|mRwe&+KzsKD9yr9TIEomINU>)LU4aEqpy$HTgG4hyQ0 zEechGICru#%tTT2eY}t3WNfp@3?ueXC~Inmv=>>+hURDUf+G zw3Im#UX73N9-j>ZxIQN?4p>*47u9h9eMHF z`v?%DQ#_y1_QTcbBT9++`|;5T5l_s`yY$zt6NVtysr7i=tsU~nF@ILWDahtTOcMil zDK7_Ydt?o2-IDaYfJ6y263u_#xztDG82)+vAqP##G*t}?y7^Vbr(umwmuQ|Mij$Kn z+ObL;)iJ21VJ+N4+ia98U~*oot8t0whG55WzbCC7 zL=L;fmfqK;zfQWN?j8b@^+4Gvd~u^@&VOa*ZW9n=m_vnRhbX{6_b_(TwRA|rUt>=p zna3j;a}MsEGzJb4u$WIUTuo%vv$}$MMG$d>epx8wd?O9%O~jF7In9uM`usfz;_OfE zz$m@Xh_^3^Ki+H zEU>uUF{%tGUkFJo;{3;&7YV`*ZVCp&2t&0!b{ZRYlB>&JlC-e(g=uv=*4`J|c+;VSeRklIuqc z$OV{0{lc=oQwXNfxlsjL?$?aGwmkg6%ERz zY>dyXPzSE-=ZfQrq@(u|wCVt}N0MT-*r&@$XAg;fccQvVI_zmN5)PUB4%eo@Ax4bp z`dxdoecrb_o{-l5c*?WUvWwq8{8_BUfHddOuUZxmx_*@Rs9x9=5_keDc|r3-m(lP3 z0;jdN@@qs)UkZ?`xN5A3I+w!EhagSiU5{pYM=)+5pB}iD;)Xbbb)maeNS9?rWw##3 zv8Tja6*fX4S*ZWD5v!&9h-^X7WKuyw@=ZC&XVc-ccyhI@6n7$HpDo_roM{D#b)wH% zD0?jXpkFM@ZBQ)xGnxL7x}w=3_!ZR0hz1z)Ld41$f1aVg{)vZKFMQrGC;yW5hkP8c z{D?1Z-VKU9;ulx3V}%Ds<^_#J6h*_#kAadTgKcpqHJu?~D z)WoAt4$=gLxCK0U!kvqAAKe-5lRuawIisn@kx*$641YVK(j*(H7xM(Ojt`it@I}*& zi`VJAQSywF+*0QX^xR8smU=^nrIg;rJ0izXm)dK;;pQmi3{xFJ@l<>p%t|YgBV5N!TJ2SkYeq=;`*z=cPSxC71x7O`(GQUIE zgMPa4rxrFlVj=98mAp>862>Ns-`~peh^WvGey!XQd8ZxTBfWRyuB{}%Lr$~jeg)Qz( zDpcLxD+_n9g@e0JTl@RVvi(1IoOIrDglK-cr7hy6zXTqOGK4OuR;xflDD)d(TdPnL zsz4NRaz~NTxZd(!I0-`gwWZ}eS!2Ahu)ax zQU2DehZMV7s$j|&)=iFgl@CP284lO8IK01W;RcPanB_zSJs2HQ^7mb-%qY?qYI{fr zIpF|ASqHwMuO|9vidZVUEZs#Q6Z-lV`_QIha5m6iJUFT=+#;d-49yGI4VKUgd@x#j z{>8&eRvK(mKRhdj`x*@BaKAQzx-Fjr70cnn8l+!u!4h$=}LdBwt z?vm6y=Ut+4urc#HvF2!7gr`9>vHmiulDWXCGG&Xv8t)ifCKz4VCTXteE!P$eaD)>b zcS+_9uq+L)h{<+U*Jyf`{zU7eCWPw}FtWgYl~E^qqb65U8Ox6|D>&yW+;Al6OZUo( zRjB}Xl(uqA>CYkBWD55neG*L06%o9y>c_vR$=DPP;YGTd1xapSD66bz;xEW;1OIA$ z<#Ajm;v^fLhCSrKqjWYkY*!X5{|V#9mZMtVxi&1s(y-IHV5hY|w=OCm1>_?&unyo0q@e^?(iCh6XD^_f zh3E5T_U$GGS2E)5$Y(PlotJVsO)b>I zIqzxU+u3fwQC54_jqUD4pISvdO(Z@NtHBzYZ2F9Ow6MLg`rH?!IlD8547b02xyHng z?_6LcuM~c473#G`>WCa*8S9D6sX5?R%8{70a>^{<);PK<(yA(oxI}x`PsidjJ+Mi< zg5SMTcNgC*73mQhmuQO>U9eBb?77rMXM0H|=?PV5fLyejrBr>Cp`Gc`T_LsW_1v)WbaJ^hG~jx&O(l0(R82uTo( zi0*p~j3Z7UzS4JfXfQWUA0+AHX*HxYcaN15>Xogb&Wjdo5#x;VP3HLI-*i~7u!`rr z%yd0NA~&2=5#8OQ&qIJn@)coc&KP4(7sDP*>WpxO96}(sbk!C+-&&P}x^kbtqkPlP zY!yC(wTF4bmdxr+cS#MZRK6h-@Z)THJq^mZ55E5qHTq!IA;{|RF&iSeqZyct~*$-R@X)+kzxZoTq2ARdcw;Ex{}pPX*3GZ&1Pn>!%0^Sq_d*xQdL4GjE0%lYJZvcwfsKn~Qq1mm1kSS`soKOQRF{$^!ya|? zE|K(Dq>>f2day}%bGTyPaRoH7e#EqGu&I$X)k((e6z^psIvNCi_+CahaWH}mAO)xr zACeugGTtGEjAM0n4zyOFmf*5?uu0q7Khz>O+Wi%j;6KZa`Rf<;|M{x_+kmY|)!YeF z75OWh$Wr8>j#`#LSVj;*tEDbW$mNMU3YFcNV52WSfec_$D18*7ei%Edp;i%s+H(ye z(VIM|z6qR2Mp9DTPhc&t5)|gR7xx9och?Rkb6~GKtq#Rgis%{ZearRw{pxOe)75#$ z@!R`@{MW{9$1j$>D6iHGSlj&pZZ9`R-0l7l&sRHK-0ks@mfO8cFSn4uDYp`#23Py1 zEx;?(TO5Gvgc~0(K7W7Emwe`TJwl#9SV%XyUQy!4JwpN>nten99`b!f0v_spMgktn zeSG*F#M|1?nTQwvP*EZ;cwLCtF53Gw)z-2a2sfo(LqHnF(Saa;6R5)_19?h_*8W}W z6pN5 zk)ro2m)5D@r&^RQ810bG!S%z+NWnQBs_U zgj1Qa7-?~)QYn4`Ig6$Lt|Oa8=uuKAf1>9 z#;AjmR-dZ;K+)vvIQzzkxA4A--rm;nA!2RWE$<4l#8ngMSf*gLwPIyunYq}LI_S*E zQr@hVusMICun{G0v9?5Rsfyo_pHf#D{5u%QAdXm|3{ML;3J=CGb!=aQ;!1%Xu@nq;OibjE`!uf zYg?zv4?PV(woe}3;LfZW$)s^1Auh84Jy+P|nkKnnyE%2jCb@w~tZU%Lgl_aN%Yh>t z{}Et__<5^V%MUIFEqGhkZ8SSmqN0e5#Fp%;%^wymnt9#lUr!*mEkuQGwfATBWKfK5 zRQPjXOs`^|3_PIDZ!fOfP0qeMX|r2n-?|2w9X6~xrbW?3C8NDXGD4H%>ekN6iYOUN zc1<2vJTgjQ@$lqOjO*kwTB4eoAmomnTp8r@)HXpy-aJgh9aB0df}>6HuW)Zmsoj$5 z^Y6{rxRJ(4(;I8_ojzA!F3JPX7arvEb;#U5$7oMf9f!A?pFnTo2c&#Pi3&+LD26f$ z>sA5x9V<+s4}tPd-}5Sw zjBsk-UUow7vVvqDli<(-_8%mF^EZfp_*93w#8IXQl4?zG8plNZs}uZ zmOqI_Ng+?DqAcrLtx`g#(;_&0+2@(CZ0I*{B=db43w=V~Qc%o{A}j9=FuTG%r&O=) z>0IaJDmsV7+#rfozsWCYwW$uT^r|E39^nyep1m9KkQ}?00~p`_Jy{N~@jY4g5A%qW zmj*vGO0Exb0Fb0socu^L!DnVBZV^P->DiN(Ky0xEvW=h26Fl?{X=p)b+}A6HW@&4l zK%71VyXb9ZL2K2aGt88+aTr<4Spi|$16Po$21u#4BUELb%C8;cMlK6>a(37)uy8Uy z-N-~#JbOxfQ@a%dqXNu%y9V+${0JKsARDoTsp6C1Oy>sjR{WWcwTBLT+SWBIJ3$?% zhEqpD9fyWfXTk3Asp1jnR}0n*D|iF~9mbs13wJQC47JT?B7gFl`E<5*X+`3{Sp(sN zSSmXF6IcSO@J~7;6tLMMhY*LPv&s2FxAD`=mEHa#nERB1M3@9gcmSC5a>1c2LR9>} zG52W&KUfBJ{h3zb@}O?l;B@7hS?weV{wgjLDL{`$AdvUev&11JI)^2eR>~HhEIk`w z02gJ6$hRd8|C#46DBKh=EO7AbzuRx>3N@z1*@zfnFM?)?p2}nFzGY~y&d;z}9cG{1 z2}k^!;Q^uFZayOb@rhHF$4h|p24n;N37#S7JKQ&`Ye)50BZo8&xK7U>QNSJ!;jgFuyq8h$2o^RcumwE@v_HiY`D(?_ZtMK#`mc9gipGwP=C(Hfj?+g)@~Sa1p_%)!i`OJ zeOMrUn#u%M_fX)iihY@M@w}XpskhS}B8nDjrJ4D#<8rNJ8D-WY>62k<)lXtrA%Amp z6-^(EpVF8?g`AV9Z5LVpD}^%Ef40xHouzh)f5r#Y+mpMa+qe`M@cJJIx`X#Rz2ZMn zf~%h>fxv&c*ZlWy&F}1FW^ChRZm92MENJ_4W8-Z6?@Q67q%DickHoFGPLoLSuPVD& zGjjW(7b9`Re^uG33GN^KhsiFWr>`fUHr{L>_C^%_nhKi2+yHsY=xDpm@o2Nb(e~)P zMOOD0SDyup`sO2Djv&Ody%`JWKaAB`Q(?}aBm5vYcYI&Qe}@gJnUXiT2|^2kyGyaD-+3?Z<58EEUVV`MJl zM`ZWey~DVErqX$R-LBR{o-bz6#1?5~-_f#uNQ0LkWKt+OQOlK17i?~?10whe`@nG6 z{O)(6z8=a&MgNm9AP@NneaBbD{uVx$`~8!LWil4E$HXjmwj^6Ki9mDH!>qP5IUr!w zbmm=OtOFm6mcqD85roa+Ioq&C4&;b0Z=k&JvpL?=-yC2VSm>F#6bpApqMNF*q>D+x~k0LaVDkM}8izj077d^eFw2 zl%PSE6P2Eh-j6ZVr!67Y!X6gJ7Ok!_Z0{VF zp?mtm8d4IV_l3ZeW3vTOMOYV~+^5KD74bhPBzoB$g^p!O(0=q6mW855t_pU_;oHL3WZDVxnLKDkCE z>n;yB%I$R&Tg=Mei7K@rs+Zp8+#VYq549;xRjbb?A!9^o&<$%t{j@uiUOydl?>*05 z&)v4&-nXlYvOuZSN2d5dGxqmhC_23nn_im3k__DmK@B%sR8)iaHeRqht_!KSH@&zH zxM5;1@H?NWx*vhKzT>vO!>+XVTa;eUjy5`fkC?AKvxv8Mk5D&1;xlyZ?=5Y71_XU3 zTzd?|SleE?pFjPsxA!|*+T24jShp6RZCJiSdBV)|g!CIH5 z%{CyI%jfR{HFQh6I+>9ypw0eb@5wPOF0LtbTd68ph6aE3Edv7%Xf&NbQ13&&bLQvO zQW5!Ic%#T!`14bDa^;E;Xb9z2I;B&a)QA-pK4;%(PY6z>^T|~4mR4O^+0OT$FBboL zM0yR7r^ZqOGBu+ID)-`{MgSk$p76Jt#9gJWC4&iIWZEwiX*yD7(y(4)nWR7`lL@@D z6y#y9<%fQ68~EicyzybQHA-=pg%bJZ{kxG%h_z3~gOc|A0W_WYZWuz_`Mr7+*w107 z`L0^$v7)u6!cXZ{un&PV69FiQ&4}s&^mA?q@U&=wWmKTpoK9!COg|nmRrSY6&f^bR zY>oE-17tKkOZPi`V@X?D!RQT%qXXoh~nJEIW`-xt3&t_O32bbt`y_J{HS9{{FEe10kMJQ0B@X3Xy-}=?BJ`ntrQ(OPdE0%`Gc%Q& z5m=|QZaFrn`xKGoxizalL-L#WmIZFW-BF(|*WxXU zBVxv*Hl~+ADF80!{H!fql=Yi$r}&*|(@7!jz5o}KiD0BGj%y43wVaD_33X4OyOnJ# zy~<_JnTc0s6m2z`rgpJd%0G5L#xGdPc(G9a=_Qi9BibBEs=?3AVz+=7LI1NkZXy`Y zSJC^LeT1Zv+y)LOLpm^$FATjcRj5tOh%%ECqNh==1%D=2izE(D{X-3r-u6n=1&269 zR4*c>A{54^46it-B%BzJrlFn>?Mi;q+Xd0zD$0*~rD6yFd^wC`^F-d7y=U7S1!2=a z6`o4M1##7@BkZRB>O?PyVjNC}inPIq_^qWRMC^e?uQ-W-wv%C2!3pHo9_xd%#fj9i zFSG1Tx^roqzmaxFL$WhwqSXsxZE9*|^3Ku#oMP`-=U;UZcV8!r(f~Y;5TWPymmG{o zJ(FbD-baa+&UUoq?BS9pah%_??>DL^C<0LQkwhjHs1iAL4JaU?hoGspCR-!pQGi+v zuaZu~a3q2HWL^@DUsoxWOv%u69|lcCTVtJF>z{E09jq1TdYrg(k4vrTlKBe3x!~#O zXt~s*MW#8uJw1S2SQk-3;Cf~5P6-NA6(zN7lUqglDX=Om@BG?p{gvc-4N7}v1a-Px z!nU2*VOXDEgm_h2$}KhpL2p>a*}OL+kbdC&*2izTJuANiTZZ}`1=sGO!^K&wWSrV$ zt@2o@b2RA{cjF6TgtM|-p?v~fGN-wU8<@yBm=`R5AIimkB3uR)t5wm-lE-s=ao>g| zb0TSNi_A^#Wy`B7@6^`o=w(*fVdp5{=@?mkv;elf#TDOjDqpB+bE0#aXW+WOq;x;_ zp@c7sWuUtNx@Yxe={F51NCAuB?%+OG)&FJ~Qm0aUW$Ob(D0zFTNB|59FfziTPR772 zaoSKaR3ZR^#IFT2f5>6c{-td$D6(QqmfK_D;R(VWRY3Xeh%Mm3str6{$P(aL6lRwP z(lk6OEVeRYg6mJIJ3e#bw^=n%-)rXqZcbrThNSMKE$l5}#in9d#S_g^38KWzecPcm z!*Aq)6Y~D6{)EM|CoDy_9DnMMB*!1CGAMS1HekjT|F*tft%?kYL-$V5JSad8NCZEM zd8*9p-&3f9Zp*3V@!}>PiisKz+}+>D*HeGZaWk$2k0{7P>^}TE|Cw z|4(sE9w5u8y)nRi*3MftaSJfJ3+TcX=J5L{!AT#AwviO=jeDjbNFkGG=M~ z4=;hm>LiWp1m_IK<`e94EG<13Yt8kV((1~tXmtGx0i7DQuy?kC#m{geShp@2)8T1~ zqDPg)j%RVCRSlE9U_dJQb_#Pse=fSELca-QgJZHYq@7{m5cKo*=?bH8?BNJ4*Zd;p zQDYpn>roxzEN2X8AC0j4$)mRO1<{to21PVmrTj9KtPAb9Q~E6t?boEPxM73lQ4+;8 z_u`Zi#icoTWu;R3XnzuM9}aZz7{;m?LsIk_Cp6l}nZWi?L4)eGf|^rlIp%C^2_`<1 z@O3BcW+) zb&K|nXOT?+(3&J;*8c6#a(%e0E^)J>oX~HZoDeNvJ-o0t=aQD4v*Nm}G3dDCfL5l&mTNiQr zBC_8`t^O8ANlM|>!(^uz5st&DZ^OF?Uj1Sq^?0hPEhBQSd3n`|3e>K+M6#?!+rPDK zVM(6!6beGNrLOqFN50EY9u3FD#8&#LwMEZrME#ryNyJ(8!<`y}M9Rbq63wt?#8Kxr z*^%xaK5dd8)Qn6MlF3{6C42`TL(3?dIW}dIxB1Vm>eaEKHa6R>Q{qg9KVsWM36n#Y zVhqb&-xA2ALERl6BTebI7y~lb-FQi6T#;KncK3X`Z*kIS=R936y#1U4rDRBZwUG4F zeW(dX2_%jf5_HjT|1`py&jTHXi_$B2Knc$WkR{^?ls(WT`H9kJyd6nysS#bSyv`Ie zC`$qFI(SLM^bi*pB=0V?3bfdOR}U(`{ig0;I_y-lPX$~N73w8Ez(CK5yH)RM9(&Qs zik$HkQ#!c=7}KiY)Y#>C>)3XBfH1tA+;b>N;aK^!D|+VOL}?eLmYJ?&Qx{mTE#gvU z-4y|<+f3yMn=t-HavSp}OhY~;*|Y)+aXtn_?3%%Urz^JQ3Pl&?!c5!1(HZaTY+M80 zo@i|D5s2umKzgo`pYzV@{0t_(AxZzr6jN7O!u+26i_(x^&AdD>aQ-G<#@A=NWTh>= zlaD>L!6xhxBJiah;T{w`%*E4DS7B<*LcHI__ISavDRX`Qf;A3Pz6o;n*_Z23@uD{N zr<^XAfo)9k?Ep!`YCLo=_Mz%&9(lTuwqHBgsYssLxICS^6iZ5rWvIihr44Yn+=E2* z5oZ!hif17a_5g?Tt|2q-y0^<^z9CDzWr+Th$+XzE-y7(z64Vg{FY3TI8mPfjG6kk_CVH65l!;~UE3boAYGW`jM7pBNVr1Hvtjwq>$tANA zmNca@hA6Evh9s#nhB&G6shCr0dF#c&!oM4NOYo-)`Jx4W+L5GlNyV+3ac|3wt4ynj zab3UqY8bK1;qym4{F9nJzYN4~_er3(4w>fMQMm^!>34xYkaJ^&DY974#(HaP+9wYX z&hIA)8EE6j2F1UyH^@mr zCy@c!%QQ4vX8che>aGy?gxQ|1nARb5-s437?HA^NuuFzx%cw@s>BVR_nbpSDUXlNP zg97%!Xo<=ubc&jH#(!LC+kEjytJcLOT6adb@e)2fUkNZM-2PT3Nz4%UTtU5wf_nb` z^`GL>RWtpc)DZmdrWF5Od#C~KrnKVxRdY1WH8qK-!KX(LqCZI>B7hKK zOb8wsNCcM*#}9~E3r~284;^W8s17v|gzry2o%lS(s!W+l! z_SuHw%P)ep^@TjkG$=lQ$oEe%e>~76} zIQi@}0B?Uy>CDdIqF19w3V{e}Oo=fe#5@o`EivInTW;N&(Q&Qf$#GOdi~8fPfUFx{ z?&)Rzu@6CGMx0MxZZ5vW=I*-GZ1+rWwlYIDTO^0Ujo!j8Ki$!FBol5*7=dxNq))bp z%aRGru(VugzFM{hT-hMlzzB_ZFv~6x#tgIQOwDcW2ng8Y$U}9TD#dkQh78havG-8sy^?KRPZ% zJ@;eOhT^4@dp#W@7%mPvX}3jsBgSWCOZ&gN6&*x@Q?_eeYPDNFeWc+hz_y?42#TSt zqCl?m{x-Jx=~GYVyO>UmW(y23OwhPIUaq_ybOwNX*Y{SjE0D&ZFYa#)fcD1)=x-UD z7bL4tH4s~7EmzS;<9ME~a)7K45Qed_|A;4TYO|I+$f|?ZI$O*G`qa2QS_#ospom9+ z0*qLI;^?evSA}`YRW}gKVRr<-Wc}rPco8gQE;dSpHDMnu2`_-LsG&ZA37Idom+ehs zZ^5a4>NNZesIhDK{xbb0JVuilTr=~m+N;CUSMDbG0Gw!;>mFi-Xg~1#0?P7(-y$YE zC(l=aR~CwJz$juArYd^IvDFbg3 zGI%Vr-|t8J1y@zplVe3|FbFKX82^wk0=#UZXJpuykbK^R+EXLGK9?A zI@K$%$>2q9pnmhN7;AP(*FsWrH%H=x!b*!^=sawr*VqyC{Nt z$Eln1pA#>q(h=wc!xmzsW3i^iWV3OC1s*S_{p1s#wfrFe0U_&NyJ5| zvY@Q__;x!^F*U>emcYx*2K%KQ9B6>lDOF<%^cDzwZ12nMV& z^NU*xnL1xtuXsv1lL*PWd^J>5sSZ2_oas0lU1^SnrQ(IaM;N}PEML&6oGlu$T#q_} zrcQZCRg8lxs6?4-n!qP=>6;Emevk!uXV=zMuY|yiQzjgTrrEJBAY!AfH6S9Ze3jV6 z(Y}P@YJXXKbDj9fZceg%P#Bq$k5VT;c{Ku6{imH^uEYSU#*SZ6XP^QwihWf2=jhsn zUPfHajF1XlXK`lidn17B6oS_W1<(W>~?grJrzgO4Ac`&^9PX0zS)5lWa4G%6&< z2f+7umy#Ungw97nJ-G&g8;kO63Jmao)d4)mXn>I1q9`OyT zTgbYOH5Ikq(@Q&tBQbQ8uY++HRr@;Z{IWt#;4+N2Lp3XJ?Zw}yY6FFSo7ohorjJBo zB_N-dbB$5L$d{^ITX7d>FTP>uu%W_@fn*p$k$F~Nb9Gf_nX|=*5&H6P1Npt1ldd@7 zX=&Mr);MII)qRw?&}&QTotJA==UvUTE-Y9k=ht>Dxar03wI+gw$vC1mu)`r#)%dkb zIu!RXoI{YBN0iH53#9CqAqA70$I@P;8ANt^7ETLpG82(|dzQTi80CZ9KQ*~O^(5t1 z*BZk`Mb{L%P{l)q9}uE=06R#4CTh0gq-p@P8hEo1z>ag#Q;Xfud^j8@q9Z;QDf*O4 z2M4$XxLYj`EZU8w*%PA9-Z)vGd%ZNDHRvwqj8}u&N*!j8IOVFdVA>0%7X{lg<@cpe zZ0wG4F}6SPza~^78OdEg!~rhlh5ZD zFmgF-)`d7TfQ{D)P6+8Hev>6$v8;jHPfqjI#vwHVE6_I)=b8u zJ-@G~=}Tvb&Fdy(hfsE3#dlxP`nDdr(BucDB$$;LQA@tL?&ilP>w4|djntZ3^Caxk zMDEQmkj9EtykWN`$?(`1bzCYtLi;^VOC6IrWc4)vl7*jX6;<2b<$#6AtT%m~sTRgIH~7j(-vQJCP!cftMwDSw}9_Sv){2s$vsj532w zJhGAfDDkX@;niab>H%QKMYxDo_UYSTMo!*UPv03IKGoa!S6;I04C&Wn@j&h3@}A++ z0}9Uz4rxN{QZ-=Xig5Zz`h15RDcbr<>}anRT+fks`0ozm%)P;Lh$vv<@8~srdB?tg zdFujShmiRT_R*5PH2UlQ=J}&Z<|fw}Gt|$1&W+R^(n$lHvsSo^U(Tx;IdiH)CgyDH z^~yqh;*o{#-4uYt2Z~Q$3z3jQ!yqBAagM zRyg6AV!ttWF6EghvwIgPSvEHpy%I1rV`+++0|aa+cMiN6mQ(@-C-l-C{YIRQPdbi28Ooao=MTZVcRWM zR?KPChX+FMXlo>6RI+->9}L!4h-w5mgAVm^Nq6RzNxFh1AMG?lfItcg8`?kkt;nAV zxsaL#wQQOgh?4y77z2l`wV;PbO!1~1`YJodJq?dc1Zd@wh-7AzsRw9np&_#5xMXMX zBP8l4=&`OSVb<5+k9Izvv&n*J8tI}sOiAjFy<r$>!i?KIt~eMCTsSb^6%j#(7-tm?ua7g@l! zDkwfnYd;@eXtQS|z8-5>ry%NC+(H0uM(`6y^gq>&z;6Rgxu(UxJeCVPmw%rbkE7OE z0ICzxcFMTFh$f=yGWW=eN};KezF zwwx`r=jNDM`L};hY1i?{kY|bf?r-uvgz#ki2GR$|7@LTW>CL(Tw+tGEVl~nHIY)(p z8+WDQF_c?oQ1W3uNkT;U^*-xMOpp0C&j(48%?FB(H1A>@nz@7{yZMprIXaWIiSpZ| z`cc%0Yw2^x81mRBld9UoIYqeO&end)O@J2L2K99Oz2%Ew#*p+H%~wH%c4iE( z3{EBW@?Q?_xpty0-4mL(60t2Xtl{eDKKJG1m_4BCLfF#O+ zmQ;J`Th*&}x>uQBl4OdZvHS}70$XrGC!#MC;(=a5Vm*aMqNS3g52`Qc;^mEPm9k1j zG9s$8JE=A!DSYOkip(JTHTXUB#AW!yhMQ#QGw_H9JMq<6$wt{RxTHIrDyc2+3isyw z?u)ttj7=(~{YGL%RjpLX z?VJDfV1~OV>puM)a!3Dg*W&+Qhu#0gu;uz>eq5N|z?(_H$X%ZFsl7uwo$m3>Bt&p9 zp7$!tbr;2r>n_kA>7YElF$~Q*vx7pgjJ9_sciWSlzMYr9v<{erX@~5?5relSS~rGk zt^!e^F6UnG?czVOJJ6y`i_{&>Bb5eos%}lzxNgUm75A)*{z40?qz)%L>5?0;W!P>- ztRo$289yjf>j;Mf2;vwo*Nsf1+de7q9)--MH`Yk(k+bH_LQ`K9mMs#h2jBC)eU>d7 zITB|Qj?jfZX@OI}8mKFtq6hb6F~VL6_@K6bth9pz2~rAiel#!XpX~kuOT~+Vg6VNU z{c$Z0oF^!wfqm*6%|WC))FRDvBi zRVaEAVj?~~7V>#DL4*CAQx~#;jWiBU$#GcR-j+GuAK2wbG&;;F86Y558D+!Zc)iK) zc(vBXdjC0+V*4wZK1USgnJe-*u0Mc_A@$~Fc7RCGMVP`|6&=Ln*adwavmGBTm{K7O z)xLsel2QkjoIzs_0M@lF&Snd`__8|^EqK|WgElb2oT`$kN$h*RQHQ zJ}v3%%4zA-Kzf7(PLsjBlkrAW2L1847(xJBd}$NKMVA%gCieb^Z`qVparJ8cLm+~d z{j^d6h3MOj7)*-lH+~iyQZMg(&KGiiyPZu}Vr-InCLSNc9{l{>jp7DXaw!WEqdQwfZhl2T!GCN=?8V;*BWBxu+REn61G8FA?us6@h9d;Imyyh`-psS zzuS3q*S=FENVg?^q2H9bz}}R8Qec9eLnAyxx;kLkV+gCnGRY)A@&WwM(@th+xhMZ0 z)TRAr+WG&+Wc@s#{|R#G`X4nfjIJc^u|dpyV3NIbKb?k1NSZh_x2#>^-}ib3c358eCIPVBggR`^6H&f@*_M$*YTc$wP){$ z*+%CW-}YuJgX&h(W_!Q8<@L(d>ludi+T-N*Ip_uGi|kehp!|l^=8Nh!1@L7x-s2-F zqv!Ud$MGK4=4))Kr}dSU_1f_s*XCc`6YCj++aRSW`OIGc}OldhYfGUBR+FKhCX?dQQH<$W_ZaOf+C`+QW}O%fc%S15zm9 zM}nyY0m}cx1xW_ISBs&IaW`UMA(h*15l(CpBUV{|oPC2WNqAY#CvQksSuJ5@saRn7 zVU2%A4jX)6!E^zeRY?M^h6Pqyr$+Ru15v_f?$Oix0R<(a5>~=n-CR>R_a)=J6*=x? zPoT7p2L2*={xOH=dXgLca)hVO>PG)613eM|0BEsJftNz$pXZYFQOl>;ZtZI2SxQn{ zWTG0gpS0Oh5tR6waBqAYEUBIA)OiXrIN%l-@KsrHS$vOR<(xL-Q$8LpRnd5*R>%KQ zaT(qt1%{!*7Yz`3j)}PiMP!p zj)#z)&D5-hj0nNf#WgONp{ipb2W$wlzpj-ROD@W_;k_)Wk$ppro}IdU80;-|poQvgj=Y7>cU#2-Z!()`@ z2j>SfzHe(oahY`lM(*mUvq>g)rC=_NB?D2%0Io!7rh|EB>A2Zk13_3fx2L9KGnIHQ zd8G(Pq1^(MS<4Z6Z6AfO$*&J=eId>-8D(lYDflLhO9l2h=MkOQEFNI{sY- z%a)t*^=-H-i9vH_)z6JHYEkMPWYvL6=caY^$f1G`%z#?}yQ19AZ1b{Od?|BWE8C-E zKB7jVxw$-%lxv7m?aoM|06#WJsb{Zl_Z65g1?vW*arT+*Yp-zQBK6p?Ad)AiZB2|`zX1;`CJNm>xg!7agr zoC6x!b4MagCi*x_`7nIduo4f;oMXuv8pMqPu>$SPnDbAr+=Vpsb`zE=9kSUm)>)mG>BlOImjC9sQL50L9R(ItY{Z-orx+K=Gq z0zBSE!aIcKgY{oVh912s5SgFgoPnaLQjd?;7UL&jxV-6=80ohShpniSNZpJV%56wx zc|=Lc$qG;j2CcnH9XT-0>uu88)fxaDn$;W%+siY8`Bdslb0O-IwTu@rr1^~txO1K@ zD@e@KLst{=)18~mDUcT!@qTo^&n-d-bAQ?iMoraH(x4FU;74B80B z?I^sj9z+{@JGG!x2Fd6(!hfij5dvVyHg@a^WO|ewz-^m(5B&QX7TZkoTv3EgKtEJM;nFXi6ll zunHu3;$pH^oE3`xiE(d(a-;<$d1?zY+T>5sTmlPwIe2G-_TJTOC5PJ994}X)XBQqn@dC;+K zy~5(Wu~1xcnL=f%2=8K~1~dGIIvz=T1ZxZ{nrMZ|>D_joWef-Hm@LWHMK@)l?f8?k za3OOUXhdfemT*q*$PEl~xs#Rt3Wv9cb&Z7uD4+6N^gQJ}Rir1L=5?hdGm@*Ap|b@J zhj(OCs~u1Z!0Eq~87q~n@;O6`k_*0aaA>G1uGP?>o=~&S8Cad|yzgy1^kc!YrX7i< zEuomnGu2r(R+SAr^Np?!OV9eN^aPHnqnkbm=Be{|c!c^-!kwUr1og{oY*)vAmm@jS z?gV>98RRbPt=dx&sx4Hy)O5oNt!c6t?m6@n_nLkNmwXD}OJwdZS$keIE!=fOu(ThV z8|!wULnc-Y@J4{dVK>vIJrhbC<{Pe7B^w>Z2%|=xKOwGt!{i94CYB-!h{!9#Zw51Z zf91~r@y|@1Eairs(uM&&h|B% zV4yO6WpAUeqbtKGIKc&r>St%cT)BPqy?P$t=zkI~$#N|TAIZn|)WS@xv8+X$OOYQ2 zufw}ScAt2D&F~}5TJL>==#ZBML-phD2G#6fvPxihZ;^Gu*zD*-vF~&0u~C{& z3mZ)j8BG(D#igX1=!L?Z7us=10vSEG;eUw&&56ta2ySTy3aOQPBTYZ**n$}e?^Y9ir0l7F32(z%q}cjvnF)!&ilH>~!D z+bTU%0H|`7t{JYQX>5;^*TP)0849$fjmSfHe}SnKtX- zat4l>3sCk2y!ds^dcbPqte4b+OJbQ;9)_RrKpQUu(( zWZGkkVsA%KJ?)pDYU_2|kw@Zz*m)C7^%(5PZo51Ho*02l6?SWr+_g&)u!kM8d!~zY zffWt%3?%Oy#{9yPZEGwg9Z#EB64~OC)}tB|&`fJ@9(p|}JF7&WkzRm5#0a;}l=8=cJ@#cB<7Yev=Q{XRd3PrYYy9jqN6sKpelml;u{?-j8b#X&2RJb-T{sXs~~8Y7^HiXJ57!d zcCl=Awo^y0YahwfLy=1~s2y+2m|Ib_J}mwj6K>u#;Sjt^`*_?q8lVwjwki)3Zkf=? zn?RCRqU`zV9b&C*ci3TsxR@d`K_KXFB<(CWkcyMD{0@@#X1Q;S6#pqE8nGGq_Tdu^ z*-vR0*lr3C^OX)E_;f8CEF*vz-65 zcl_76`v3I^;vXc7$r1O|2{<)gEm{B;;ZNVXI386k5gkH2pPE28ij|)=eLT*5ubD`8 z5btmKY+ZxdB25N&tWV@a_Dvx>$mfcskS6e4(TQXQ51cQMKi9CZ{Z; zYyqnQQ~uHWk68|tr0)OW4XK3ZmnKNz7hGgpyU!jP zt-cJckDTxptrxm&7jQ6sAt4lc1eUAywsX8>0ek|1zXTgWE3NPCa&FlPBU&_ZgiK$# zx1dqHhex5n1Thg_G!U(1hX(kl5vgYIs1a>y{X@=LNRD-hVeM(-kDD4t{+d+B`GFCb zZWr2Go1;Sz%8Bi>Lg8?f%5@TY{Dw>n<)8%J__jjVTzI)nze|HK8iYnM*0F)^XnEamAr>kfSQ?P z^zILLZ(jmUMRi31RasMCP62VgbEIpuTXSjlo)Y6tZHK0q?9B2YVO3y&gNS~3EV+@P zfy0PAD>Gw3X&1Ly|+E5!mof0VpD-2Jre*PO-u)6vn= z47Ml{ZYbLS{8AD8q>3#gcez_P!0nM*M3GeuyCEwUyaYGlo6(D@0tiQ{Gi=kYdc%R3If;{$|{gBW)iXS>SrqXL}vmT~WMv^XHAZEKHoE+nDfwvQQ}!aIgvf)K?k+!pD+R$oB5YH;Wz;|Qpm2=ONxCj>1LYPT_w*)uA~u&t2JNW4lt7~~VD7jmJcEL1D2N>9 zBz`XA@kVZx4G$_-=+L82O-D|c zMV!w;>yIL|2s$3O1IO(Y)?@I`C|n^3at=v&s1(c&2JjHG4Y6vQx2HTj=(sWW0FZ2T z?oK9barPhYRmh3Nr~+nmL^VXUJochS(>zLI45m4aAx5He*J17-h7I}kX=%PgP2iBv z4*N}FDA5E~n1<7q^Yf-OMjLJ7nhWgL+*NtIsr(@V?EDP<8ev0nAL&xh67RK2o^hng zegn%F$MHmr!psCr`bGla_DQYdCHQ5PD_aftOe?N zl9Zd~LWJwU&>+U)bf+Gh$Wz!6|H~_8m&wRB-iNPRQj_o^-)Qk+)+Gs!40tOL&2dIz zll5yYsCp2{2}U6{8&sJ#0-_*$5&vPxcC2!J+Di(NoM??kPI#sdP!r3&zj{;$5dQ0v zKtC+A=>rAb)>luW-iQ@LjQygp-uws^QmuNphqm#0qA$~(`nj*PJFON*T@|fGsJ3I-z?LW8Q*DmE8UI&RgT(LPEAzi z;8&UVM@-TYRY@atl>yQqjv{I-C>vXB|hC@pLuoe+VQXL2Ty zvZA&&uFDXt;_;GA(6jbCt!cC~xt9?e?CTK|u7btXmO6{Xu~8R-Omr!&PAJ1 zl)M;npdsJTfHhAYl+>C{oNx_#8jd6>9;~P8`YVjFCB^O-yg!mjO4*|{O&f$Q$LP(N zKV<-4g91_nCNm0u<1=hWK&UeUzd0mod|m$crZ7 z2T=y_h^0rjD3^5slXq4{!LSX%uJK8Te)Ks_?p26gw; zX|tQ|k7X#g$sVH6z-t*wcX$ zhzWi$6JYwVvg-XCP5Kp3<~`i|7Y|&u`0+*L1mtzx@_1|1^xbyS+qk3S70Jop+JyA?dH}r| z6WG&qv^6|}b{T``DfUfkFqK_2AP?zauajuYL+L_;F?A27H#0R+>*xo`ZnkhQ>bdj= z)G`s|6r!nLc#-J}}6#GLTs;!6iWl#ObwxB_)a^7Rkh$(%So>qW8; zb*<=hD~gMJ)$CbEnT{l}BT|8Vtow(OiG0=pWlrGPSiA2A{vPv1p~$rimSvgj6WawF~rbr!i)YK7@#JCjY&{&A>6$Gt<&@5=IVZ9^(h#kl7=Ht zCw;8uztkyX2~{BfPGOAZO7y4|4f~_S5ehmk50?0DC*}qun)G~-YEK_c{k$h|go&rH z9U+=@;2PQOlitlIzQb4J$#4EwhP@8CDpUc8;_$R9@E8&B#vU}Ghm*G~bXXR0i+8g# z%8kZ$qsSiaQPh;(??obu-nKk)qm!>sOo?Cg_?++;VfGpOurtbYRjE^V2vX@U`VD%f z;84K6bR}xEunoaAoS{?s%dRsTg8at@_zNx|$X`iyQq^i8pgIK>Fd>Y}NBgBgzQ>PW z_}U{HX~4vW1dBz7QP=pZWR}P890d;}qBA6qDn{;*$MUYTY!tr+m_h-uM0p z2-R!&mNTbyH|7_)l;IsLBZ8R8^!QeP^p|}7%Orm-Ib^?C1V07Al1$&4&7c7T?XtZ40p9nYzcp4&fuR(vpicxoz zbX&P+Fd6JN%hb?2pTS*ip-c(vP4$?8Jzgt|RKfaQ+BmI2IFFy0I?G_&O)Y%~ z-M+{!fDnj(rFMxbT)K1&aBv{7YrNlYJ$NxI|_$iyx6PO7<4oyvU`rO)x$|57zpTArn&?$?<}|Jae0T-+c!=Jg*N+txFSF)eV7Gm7LtI z!19Gx3+y|Lc2W9#OArgO359slSL&^Tr!KfxwhmDq1p)-8WO-2uMZAV#^8^;|%&4TC zcp5%pi_UQFBbL^roCMP9KT&rui&Qm=)$gRu)IE&qhTqdEytCWFH6oH;Y|e{aR9=&p za|mKfhnc+odm8I;5OqS1Rc|ZkW-ZTbdn~E4kTI`5f)&HoT@W(WPZ}yKm4|IcJ?%fU z2k0hZalc<1S!SuIbIWO=OlM$oeKJ8zo6zKz(!d%`&~ttC;T)?-XE#Z5O^kuOIKgL~ zlKC;nz8MS5Yy-rRG{h`Uu_qGC!sz&64V|BM7d&10)YuorblNUm+;{q2s5RTJIr5co zWlL^*reGNuhY~rz1%$G-H00F7ObLir1NbW%SbHLWO)K>2J*B{khTJ3KsXfT0_|FGQ zty+k#K7UUZKOM>3iUj^0E};b!N`9Nh+;%^H8%bxP#G$i1Dn z%g>WkWX`b_o-pu~-7AcQRYzzy#VN}AV$Gm+ke2oEBPH_DlvH@qLl7G+&R+7wL4jpmcwm3|2 zi3#H(FY&8faVF|`6KBko>>9c2id!^04{U0wx2dbt)+hTJ2tk$gnjYf>3* zte=FRrFF}#{TNu+2s61?$myj`k622XQ5kZ@B^R8n^%-5o#u`d#I_tOUv<#Z+A-Gz{_=&m_4N{3sA~X zb`Z~vKG?pyTi5-m^_%wp!u|V9Lz}^J?BUz0_elFK4)hcF5r~bD_!{{eAiSVjGZ17k)DG&YNMq;ce?kL$ zIp7r^6fR2G|D4hWb(sIX6LIaE#f!QIAse%)OPG6UW~Qc#iVJ^9VA-bm7B6eARGn3g zoqtB57gpnolZb)~UWa)qoCKzoMRJz*g$pr%X^CVgAG)gFKQ5nzcw-ibzn7zC-;Hd_ zq)U7c#MwU+05gqb9#w%3hnNry@zi;wGZ-vM*?KP!1MKK55*T!ZIU=71F!f_Y|j}_UCN{NKrfiEg(|7h z0v0gePbXw7#0EB?rc8B9V!aaNHhoSgOjgdhyGO@1U**vkxs`%6@ZxUy98}M^tFlPL zmYgRiFOeD*D;h^2)`orByu%x*6XZR6*Wo>4T5*1x-E*nGl^#k|wlrxY#YAlstRIpg zb}_4PXFGAqI*_5zzxt0?!MBw0F39KnFR#+!NoC$(5oG`R-Cg{4;Fva-eBrrU#F}IIFnh45E@|jeKy4+@NM}H%K>~x&IgLTS^O_vp#5IPDfIGN^tyktjQ8u71DO=p6|C z_9r1iWX`ZfAmNxMuFQ@*j8b2(_Lx^W5ap$yc;my-nvk5HIM@YJXfm zt~d01{i_qVA{hAyFrQD=$NRj@u$6@5YT`~3j0_thME_imiWAB@OoK1vFi3dsVe&gi z(l{g$Cvs`!l@|Q`2wjXQGI9=l*x(JXff`z5s1)7ngvyjP6}1D#01T4eF`>3;X_bJf zxo;3r<$XVdwAL5}x5RJ&3 z{36F9IQ{k{gas43p#Rjs)~=&>xhb5}g0)lAYZucE4jG*f1>3xPi`j+_3I+4IotC zJW%m@rCfoX%KYd~aJ9YNJ?!dPo=%Vu^=}XYV=z(mi1m&iy@1tn$4^ zzpD)`VY}JV$Fn{JAa_$Ab`)_R8qGISXre|StJ6&ML&%R0*sE8@4vo_+MksS9-r6S6 zsF>)%80;fisNHGcji<%Lgh1m_xv7l^p&=}BFW$&a47lU5-pGv%Ox2gB4ABOP$o|^K zR1)f92?76|z<->JjcNLbP|i$m%6rDQR|Ee#@Uisn5nb;0g1)|sAB}KvJMz(}=jK4b zsJ4Y4_7JjomS;+W2f(_j*mk0-ZXPM7-uZh3_q9F@iVid z#{4#_OIsA11WzosRg1cUe>GrWA(Lxr-c*tDCs9dmC6Bw>iqlahXyL$A(F}p~STqgk zA^%NH+Gnd375tIsRc`GlM36hIkMz+-6WUDRru|0~8t$pA@LR$>HP2f6^sG1K(WGUj zv5JCx%BApOAA$#zaq%LOoZtQYA;W@$0P#06oevu$)&&kysEbNqE_V!<8;uLE93H0% zPkhvRuPM$s9wjnxB0e<{i$<*7g&M!l8F*#=j!xaO2=o_T^J~Fxl3KGW#rtAJYszb) zD!K|AcCZ_QyRC;W_{saNy zp6dt^2n5XoPIA07M)JQzdW^)x#)Ez|%}80!7I1^lYwtlUH^p<7;?tP-cE7WE(TU}_ zEWARW0{NJwhKI#{7vGRXdslulVcCnD0St1JgKxUE3YU zZw`ea7YUOJHhrHz8bVqCoNh9|HY=iI<3G2z%_J0xBAzOuzUvc3FVI-ym$?O`W=;bo zjT1?1ch)&f0$$~q$T67~YSt^zqJ%&Y)(!@Onp-HjnQ=&Bf-H3eZvCqGM-B}(1xM=HkYSx9fk!XC1w%SRx;%%(B)UAX#9+jl zr8v)`eCX=p^pxjWczL3;v!ai2i0=oV)Oe&NZKB+( z{WT_K7pBqba7neHe5zWgEUa|-9A^{&8 zXEs#G0Na{}qw>sOY*8ouP`{8gD{cUlQh7Ullmr>;kJcU;l}&aY@yr^@RO5=cHC!g{ zsT7ky?;;DDAit)`awET7WlAxXa(*Fe*!d~~?&qQ@R++RsYuu`+?#ifikLg|eDhcF} z-hrF0-()T?+iF5et~X58nAiNJRjDs42YFE-KiR5x`8^c~1N<0WulJ=z2S-cC}nYT-$qk1FY zsoWRP=?ss5u$KXiXXNcYR}c!65LLHn=PBL?Mn~xyT{3h30G=MMlSkzWo`N<<{$|9G z8=A{5;k9|8JB?-syQA`340b+Z`r%o^&xon#nvy7T1Pw`VD`e1aJ?GCHCk}Lza3el2 z^85|vX6aU@5#OFK5n#hCEg@WJY}IZINiEejJKE3m zurS)M8#_{o?UL=oG`!}FR0!SBb%=)Zk2^o~nwXVnXWTU14H$X!#OqOXgeCUG1Y} z;uFk%a$(Se_r(2$mDxFas$69>8nxJGmDnFQHJ&vrc(O$%cFkU{Unz9yMJ9AuS2AX<4-8Qh{8?TGDi&v9# zqk5to7MhtK702t=$sG?$WIjrMKDu|Bt@@7ep|}LUQ#|Q|8Y4m-B813_dIq`u{kQPrayz+2CMx`%g-a-th!nNXk7(!dKC|t{ZkIKKLoYwLHKXww=XY zb4HUYz=aoSMC2kzDbDw12>xcByYQkSLe zSe;&bpo6=qUiSq0iz_xJQHLercpX_;k=lt-#|gA>jkafvCS%vCtqUh#4r`bploxfa z(y(ZtZkSV${W5fyOw!vZY!O4ZF>9V}m)0=SmxZuf`mJ zJBgEL@Eb~@rb~Z8N2DyIW32fZ?g)8TB$O^+j=r{G4`)))>#?N4hnHXEjzpPl-ZtL6_V_s;)bp z);oU{9uI};l<+o$9@Rpe!ptj$KWNHa zv9jgIanR`dn1Yotu;S{icOL$@ry{?R$CC31w&^c|Od~69BYT43v-pS6j4lj%O(H%s z(%wGFK!3;c4jgod<#{YnKzl(_W^S6W^UM`2WiAcZ2IEyPC1MM`VtQ^lR{c6oGEiHY z@~9Y=o6>6>&Odjzmk`SlEPgPXe`Hdl@py{FmeB3>28cIG z%Bouen5_ULnq(*e7*~_~n_AG>F$aVLnIgpe_2S-BZmwFgZ8?ldv(&o_V5>}pqYbQR zv%VCH0jGNLQ`|MP$V)gEh*dMW&G~oKYS$pR66ftJ@&HXylLar}3f2yoErZenr|!1b zJ7WZ%nZ+CocRCczNJl)hKDhNJXe~sG#)@iPGypIFTx>o9Y`#K`q)TM%i&3H|r4*=B z%I#Qrac63ND>dGN&m6Havu=Xxk-h<_8?$U) z$Aeg7^?bj_X5_6ZQp3tIOSoO5F8o$TMCmhTP`bM=fNOb_QyvkY*a>yjiPkF^+YaPE z=SVlSFr#hgu{^Q%&Uf-W!6R_dG039LxtR^lOm1Jp_Y_1YH8zAZ?L|q!(glex%W>q@ z9b)G{QMQXzr>^DHU+I#PuI1xDd4&fMesto;r*w&jy@?tZo+zfZ@s9}*?P&Ot-?-6o zPE5@!2Gh$)o#7=T0H{>PT@{8E8M|MSkF|P2=&`VKNXeu+Hy2$|!7JCmSX*AG#OEYb z8hP_h89~tIWyR-m;__|gD8DjgUUAL;RLcpwtw>=+nC=Kmi)YK0s~E~lSA;7OXBWOM zxDL-!nE$>H4`+-0;BLmj8CjlK7Gv#SMNZS;I~vbx&;%Mv3K^>QL~VnXJJT=?>qRTp ztjf)NeErS3SMX7`8&)AcB3-B==Y~RZ2?_1DqCxE!E96iKCQ6vt2=ti zJWEaZWChv1`B>+p;Wh+g4PBAjrQ+1j1{Zf(suGvW_T+__3_2yNLu!O)(uMJmilzP$ zgMNlRAov*)oN!v45HSE3RCEVaw8xL=0k9FI5?fEwB{N;|Oy@S``p3qYIkS+{Mo2*8 zKy%4QCeOOPMB{Y_`ufa9eijq%CBka{hd*fJk$9tn<(zkDqIc@-CrRGNk31d;(;S!Z zr|S~I_e-$#B$Y9hMttH%eDX$m#C6%#+^m@%j8!L{jf4!W6%0j39eQ~L!q6q^r%LD5 z+P6EY$~)|r64(IcsJ`(DT#?6z&+ObT;!kT>IHtG> zvRBAkR3fiWFKOYMZ{*N>Bu*-b1)M{TuReze;w)ASV2U?Ct0I~=4Cs$nLx2mjz z5t&FMmSHvyBA)O*St^z5SeL(4X7+4OVBUHpA>V9DK)Z13giZ&V&AGs?zk|4+*-4x4 zF+&DVZV>LBEWg;F4Y;DNF*PQWR~Pp>+=&Y)=7SLzw>(c z;>U+hA;g(3YrCUH39a7G@ddg`^Xlw7OomqakVQ}KNk`p@zNlWl*|dUgy3zBetOi=6 z?pxO(J$JnnHsvfsc0ykjc=ZV0KhHmUIa(Dz`f{Q85ImW#@S#WjaAmq> z+gG`Kd){ZY`tYcf(}Bk^7)Ul6tBb9nJN?@Ap7s7vhPU6ZA!N3-uiX6LY0P>u@^1^?vdHxR0TTyLVgsubBR8oE>>Qu_8v#f~{L{SV0gVYBFEOEwU$=M=9r;nPT78J0a{Do-%R|MoBilN_5+ z-3DTm{V_(=eh_MtLS^FGbew(?s*}Q^WSvGh3(>1qT)j#+b|{q9*;JC}*i!SV~I^PsFA-v`b-;o8blouUSr0-(}Cy^OtUg3H2Kvh znA@w3*TR$E#@o}AkD6F2$~Dh2&dSY~IfK$E8ze2xOP^iLa;J5hmU^~ymjMXPDOJ{6 zK+t}+hs{kAwqL<7Bk89<=XiM z?1+{jwYN==O;Jrr6&lOS%$4feJG1!lDAj9spvT6nzY(Tn0v3|6Di9r?~vnxd` zkVJmVGF6P2u)-hmvjch}n#**4QV(T_4s`M_AjKR*&8ySPyY7NIA%Krdjr&Z>;&)mq zGh=&N7^`3%jtUTgs_v2sWf-a&1LEE^o4?@(5JYW(E+>+M46d z12*bD@^II!@}|qPX*C;dr>0q}G@C(e(J@6}1INu(HQ%>@fybC>c~}rjnha;9iUMZg zxe6=Dsj@fp;l|Z@meJ&11dFi%G=4?_hJ+N2+Da$a%g^94Wl~tFX$Io16N8h4fJ7 z(M@-Ha?I?)!z?#j`M8d8=k{V2(@c`Ph4yHObG7nqly8c}6Zh@vO~4#d~L|`*oLO))T|Jn8Px> zLah2%c;rK!Bt;!T0eDvT%^3R*fJ+2s*bI*$P}{@egj7wHMq{%7V0_(0(2A7BO=&T;6irlkkqvy13jf(4Xi03gGoOTL=F9_ z1_QrH;XI|okIy}7G|pii1s07BP~H}}mqM6srN0o;27c`x66P_@%pb9<#p*E9QsdSC zo@l#}7Bg-ybRET%g-DjlA}_Z{!GcQzZ4IN2WY08ej>8oMTBz; z5kK$GR=c8P`_nd>4)q0K{D0jJm0!Q8--1JYg=2D&!PBi7sEp zOlRyjl?zI>%|_}pWH8 zXM(kyTM9uM&&xA(68-U(6tPt{O)j2p{#{X{?$N|4WpU8}_n}gE=JPJMSU0H9yB}NT zxazEna(8@p!5!NRRTBK@%93YP|4O+hu5Qh|9+n=Eqk#6xLo4YBhE@-YfiwB{k zYzQtM1TuGE;{t=b$9&8iboGM~Q@*PmsxHC@!ZVc@m89+cjlx##aIV5u#qf^8R?Q=i z7ahu{@=n?Ar|*~Co;j$`26?9`R8B}VFG$@lz;8*bcLJ1n3IL(EDpZ2kK<|;pKcy`9Qfe}YyziqwZloMS;#n#G(jL;99STA7`EOEAX^j?25z8@2OW!kN zU0!eQ?Vy>3o4S{9CV@N-)m=Q z2Wz&aR^v?fr9$@-$joWD(KwvPb0l?Szb(PWnO7oR!O^WSzaZf z*bmIVRTfjrQdaZmJ;AP-UpyBLqgdmq5zH0-dK1Ce*b@ZFv_L**!fpgiQf1bus}AaV zjTCh+5^a{ae>II|{*>*XsES%`GvgjxuWicQY*FdZ?KqDqWd%(N@WO10V~{`yJqMYC zpTJwe7ld>z#N3Tzeq?cf-W7&_L;Cf2aq!OT`lQG{v|$3fMX)WbXdrg`#8Jv2lP}KL z(P-Q8`kn#+Z1Y8RXq_YK20^fl4Wby@NC|^dr26mJ)6LV27mMhd=OZykv(CD`Y*YA5 z3TE5{aFKVz00bB7y!n*JjufwVECDMw0U2f6J9+?wU6YFK>sU>yGdp{%Ie={kA-UDU zmkN2M;%|!ZbiX8yRaHALwz)+$hx`7*qrO=A?u|_C7 z29U-%FjD|?Zq_ZP2}mnspc*~GyKduJEGe%mDx@#BX9S^l zw+(`9&~vZVuU8+7u+8!?Xgk3tqkwgX)XZ){@a0X}h)24XZBpjiOK+-WE;Pv!3%;m_ zB=q)T3|IHEKlpCH&r~-&gQ|6~y;5&N*!lQmct_mE07~98to^#!=ET_5xG4E;(Y#Q& zWAJI@O~$`|k!WX_D%Y2<~dQasQu#vINS zvw_mF|c*ROYncVP?-0zA$^90c?_E_ltMMkR5sM zOYkh`*UFb3hEFi=Cpg-i?yo1(tY`pu2m(qZYs#wMoMr1Gq4p&*O2*IWS6C3nbBg=X zTks>whYQ_O{=5^^7u13C=+w{}e?+}(LxD{C(3tr|&K<`;nbiieKv_WN$R@+-o=F>tQNKL9Nlt z1gA34{@fd6KkB*r*81cX`pdYHGBK?7TI2T?*Lueau7~!ttnlDU0@gI;58YEYt3id| zM=!a3DOjEG;YrD5$QrduwV+bleHa8e+4R@aDRNfy#+Dbrw)qoWiKUOElNFC1Ui_tp z53_E;9lU{!UC`I*=O&IBIuV$D%*?N{DoASYON*LmSVAo+Y&~^xT5g4#mx(U2x#NVM z4u!<$HWQ^b0vAKntP3i(1{mA=9^Ze5-Eq;%r3@RaDEyvQl`6HiKRzMNpJM;pDZ%$E z>ZLl&mH3#hjKZG#_fu2NII(E{0SgXtyEpg9=HheW8y?12Z}aqa2rQJ@d?e`V)SA;i z^^f0*_~9JWIyl8$%qU(=9%VGgvPY&VBc|hU>FTE$OOg!+%nq~JCg$bdGp-R`Hrw*sd6Gc+OOP~iI16@NWA;4v%@8x2C7g8iuZOo)H+zzznwqwetpQHzSlG&jz~O!1V6% z5-%G!xuCW4E~V)?!AbD*?!3Qg|H3*kGQ#mnrP$RBWjv)Wj|o(N6fb4`iATm`gU_)c z?E3ZejAaZq=^jkwIkTV-*{tqtzv(`Q+)^K#^cT!&zZAock7Y6Djx5n(>Yya8)Nw%NeeP=h$D}us$gH*mD%TYIzsx|@YPn-~rqm%B-N$8zV z+M_rc=MydX1&hl!s63fkfk(>`s1&CKJ@@Fefa2Pvk0VOwhU=CLDj9{ZM)d*nK}`a+ zRn)p3Mj5?u9d9EcM?7Xat;+xE@y6!xNSlZ@mdMAX%l?U5^%d$cxUz6qySnn4J>^bj z=!raH5?9BlK1}~MF7C zL2Ze+5T`zCWEC{~1@C4y=P`xj^(~Tj#Cfb&`-Q%EP}o>Y(X;4eFWCIMIL`y1Y$kL#pI>J7>9#A7mu0 z}$D2IbFf3gu2kolv!hj zg34pb2sUd(yHqgJ1h`7$mOB^$REw$uE6?_Eyq|2HX?UU^ByT-YZ!4uf2l4=f*7WLU z!+D_O$VIz01*^@p05#M7w4f31e8$l9$yFHQr{v7Z>Eu{R^cXAhICUpH> zL3L=lEAzjiyX2Y4NQlBVJCmB|NQ;J=Eq0fxB39nTLhmjgB+CnXGoUb#;I< z_X+xC0!0FO{Lezy@MJ|=Ec>CLtDd?}6t3*6=gfB^*O&_8%M#%;k*IixLsfrgwH+ky zj#8uWo-`Tm)z@&6hs6_Xp}+_iw3 z%eT($EKMTS)!tu6wt=`Hx1@ctx_HwNNX0JDq4N2U1bIrgO(U-FFC_6BQhqPp{$CDf zg)D6x{*Pk2|Ai-`{wJO^%g}MuMAB7&ZfZmnW5J|+VPBJKMq%apFFfhbC$39F@dEl+ z{=euXG}*uC4#>#l9%BCHHrR6NDJc+WJO#MWLa-L5;D3j zB_CoBX62+a?Zrs3S>tZkSx{-0A5vb`t;P!@<69wJRB5$TeuR=yQPn^#b2f4?7K28L zo)w56Y*3dU`CBk65oE--n9LMR!FOQW&AaY4cM38oy(%hx5VHOb9I(_8YhECNxJnDY zOx#XCrD(a#VNtH+siRMje1tp;L;LMwL;vuDPUwq2m3WD+UtqfrIcpDW$Wo;!6xkRP zPu39u3;px+09KYBWU1c(Z`669ng^{jlnXa+#$&9OJsBC28ut3jYhuK5*?6fNY{J05 zPGCkH{z-BnSI6%P$&F53gtfyR`Y9|E6`J|PvbNQa@-D&zsD8mP?GioD(mpCb+4_uH z!DeN7jdC7elp>oP_1>hGFzC_PjwLUvpGB)A^5>xmg?&S#5V$oQjHQB3zKfI92NPq# zVb8fk@ZrgC<{gO1j|m%LMJE>8UVj{rK;02Lr>7$6`4 zdLST<|DR{^-;Ja?lqZhSKizd#GOS!yY-T~|8sW$i?PdwZaHxrRsR+TKdic@GWMw7I57 z?1;T&1@6E|ohdR=FFMko$r?W-2AY6TiN1l@cNCYEEeFQSRG9g_t+&mk^3KkdoO?kv z5vI*Exw|yC=mnB!GtFD0-!z@^l=mi@YALQ5Lbfk0x)*T?5I5{=h)A1B=qII{MO1`k zC#y+GmpI*b1oA;Eoy5S<&=T}fB^@d;n$MW0S3Q(zN0{G@iRYe`;wd6)OHfUNqL2S43_UDYwE|0*I7MWxDDOz-uGlbW=S!3jp)5a!93?QcRCOU{jCcuj}?|_zR>NIE{?Ki+3)i9i1#(Y9O#l@jWb)B z#}bYxduj>ZPenrUVY??rDOzMEgr1~__Vv&5-0mgNtP_Bpa*7Hp6VuG5+M79?6IsBb z;@VVQ#KPuao|>B)S1BUQGxdVA=wPd0(AY+fI=?nD^&8GNB3Q4IAgZu8Jq#0C>s5PZ zMd|8sMUzw>J?v0XeAI#RA@ukuUDCz#BSA>9-N^~!PJc@)8br@N!^vFX$hUFQ)%(`i zGKXI^%!21E*VmMMFEKkCXU`whyj<2w5&#Nvz6IWNH_kqp1~|Fkw2*T2%U;j-Z&9)% z8(MIFQuK(-^lI)sx@y1oUjFVQZb+M!l2C?7*EXrbnJmR-(kyuzT1Z=bGUZlm_x1O0 z7)z4v5UKll4cPUTlFdxMyi``ChBPpbZ)j~>B`NR4u^IoNRMwUcvxt^QoR;8R(%AJn zyC&YROUf-7f(hkQ(AzvDDf!ZYh5xgWHoaS#i97ab&tX&gI&-Nk84oC-zF-aaI_&3> zC^4hG;g(ut<+h8teo9vBM|pCbHN-_x+@Pgc`bBzzG6I*_#3Uh$n&Wz zjdn`dB(>pw=TL{eJqhD&;ZXNA$<6^5)L*uG;SS{EUC?#0H#7d`?wY-xd2IOIB(XD= z6MB(fofSc)3f6k6K_0j?ph z64Bq*-X9Q&Q(&2wE@Ij)p-i(3j~+>g653u*{IGWric_GW1pI27tXM4=I(WA#$(9~k zY-Z=HR*Fg2nz0}+K&xm~Bitj!g0!uVOsPx6>HZOX$WLlYdVtnRb%3izc)%jZ7G7c0 z84Zv1vz0w&WE+tH5Ev_rHFLgC`O~f~Qo211U+cwCD?Gwz zkDL(+F`k6V5D7KO(U|Hpm^cE_I$1naoRO~I2-XX$h0b``q~XU0jTAzJ6CI2zt3^Zl zk@ggFQ5$Bg9mIJPI&OR_jht@g$?R4oDt_!Bs$b~yh?1Y8r1x{zNjK2Fsg{kYt_4>tNxzDi8~2fTet0tyLPr5fx!J^1 zD~q_kIq*VM9AM0m*uD9V_z0V4Ax)a>5w)tUDxWkcWKlv@PnHQ>FnmvkMH&W!#`Xc- z&W5$>$I+p@4*Q#*k)qWiWox_)+X-Ccb<$4qDM@lE=U15euA1~#vp_`5sF48YMRRqc z(0pp@6gWQHa4RNy6O%;yup?FooQ&SjO8O((%UK&D0d0%R66FIUILF4ybFDU+KgHB` zkbE$=%PvZLH6VHikE8CMY`TO?19s>RZfD0na+b61X0P)fPn zX-fAwHf-ZA^3s}UNx*n;+A#R&24yS`l;crtd0RKi?-igzv8lO}1gTQ^NbT?nrsPy* zIwA)39Jmv9=?pQ`Lg-3NOMhuGu|&W>{GShjwtncIk|_mRI|G5^@>kI0vYsW$Yh#uD zEba#fpuY&U5Mj1Y@pJZPS`pfvJ2s-IVCAIJOd2KI&RfSa9>J4p^%oADHe>=}YD=!8enqq4}RR`L_9~3!Et|B`f6G@d5g+uS)_mlAT(x_)) z$!53kwi#%#5I=hmyJ5T}i#u*j9b#2F69t<&%zjY)DW#PMsA>nK?uGQLblXIF zi=x`Y&t_fCHCd=`#4ZnLu|F@{6r@}|6w_*=+SC`3rL3jwuh7j!Y*M4k1iR-yEppdg z;;5oMq^p}OFv$v2YDbVGISs)$|K5kI2o#qS02 zO?Mu<@7@Fw&<040_GEfTYxu!}LZ-!!+3)@8fcMJ#&r44l0PC05usbzFvkZ#XekZ=4;p$D4>N^evNL8-ZE4-?(&!Su zVquMpYN1X9VqUybLH%><>FPiub)`jRbE87Iiu+`Ga%%EOIt@JS|8U0~ZrV?dPrt8y z0s4^WMME%SJUz2-VhYM+(ztD(pl~KL>)Ht4z zqhHsg4cxPDtH76QG|Gh^I> ztCr8J;UVa(FOlKRAfwUIBE*<~)wN9EMpeq7`2r2&Gb2G>%57#CNbmcJNVW?`9wStb zyg_5A(AcQ&HZ`>u>z{SK0U@HaiU=&{U)59hpRY(SZ&q*?!c#Zk_tbkp##&pd7*4rH z!8XeDHFxO?KYSnq4L$~6#fy2$NmFZF$0F!tkg`@}%Qr9A(%Z^9=5b%H9>^m&$@5;E zTl=RAT1lu34Qk*O)j$maVFp+TvSH1CU`*ptp ze;Uem4_jV2B(dd}%SOHQ5r=g=9lCm!EN?}r8iECsu2g4MP@#_{5gTideIZ76Z?*E( zQ8pi4Bq9flP(@}+`e-)b2pJs>CpiezlG7AWGD}dQBc;tsGtp5F;VH-ji*+#IbVjf9 z1A=d94=|aP*Z?JDu$jD3ULIaJpwk!8AEH25JWSS#`W3T0#YiDydO6-)k9QzMMl>#F zQWlbB5{N-y{rj9c-Zr^qr=VZe)khZbL-cszUL26`G0;;pePaXqe`!qTfxF?HH=>Ww z7gor~TZswwE=F-vhnthg*C(~$y@NiuCxwlC6^t5jV$*yXkvYIzmeO|Y%QX+a@XEW| z3T}FgtJ>p#Wxl30{ajB9Tj>`K`N=505W}j2wNdyuJ-V&K!+?Zj!U!5Xns#ipv>4dD z7}<<6jA7|Lmc5Q*G5~_Nq;Yw!m*$(Sk{+EB|Ma)(w2mN@6_V2%g-rJeKv-3&%C>Zs zp3&$S(c**V<=5iI85u1;du)^}Sxb?2KbkB&{Din@_OWF}D@GJ0} zFSU%qD0$#CdSOUab6Yso$_6_$CmmJQI~RALSpt3&@#QLe(&7cJxJqC7jW=?P6_1ZY zx|l}%DN~nQduz>D&vKSd>}|}@BW@7a7hGzz^=Ld|l_|X z3WGkk(~?+TfX7%+w#iTtb+q_S&(2+_H=LCAZvvTeon(@{L|&NwYXCt=Bzy#!Xys2L zaCINiU&thancsyVVCqM5M8Rm)Vf1ZM@P_ut#)qW#HRJ|aY>NHNuUP~Xb@KhrL72Kj zsYvuWow*~%3Af~J{-Lw{i9{60TVxe&KP_A#nu_+apRvFv4jIvukQq?4mN-}@q>T(a zEx=vN)d4^wZ%I?r1G_e0{qPx!_guCnL8Z?|d?sct#e_6Xv|Kn79n>*{QiT)Y*=W7> z3c3sZ66zE^80fHACY_Y^q*(qY%VbosTE&u{d*&4rVytJ3v7b5J8s`o{O>vzGE!Aaj z#}S2lL_n$!VTezav?Up5(VLjq`$0xc-zQ;T!r468##R?)C4&EwNm`DXj!*_8Uwkd1 zp;_nk7CWM{rv6}4%G1@KVg#+>O5TeLFOL>m7=r9k^!)$tEiw zrMtzV021y@lr5~+{1bR&+^?Zc>h*=8q5t+(%xm-vawU${l-NDKMM-*kSGFbIdmXg@`tG_KrJpi zVOTMAxZ$bvrG6k_Q14TC;6N~N8x0x?1+|B34oT#4f_o)?^gwcrIr}>^ehVlVq`Mk^FX9LCN5T5=1j$Oi8E;Y#?(l%Cz zq$fhXkf)MB%w{`76p-^hKJuA?^(7mCxWM+uLMOkCVlU$2j-Z>ivElZ2UMAGDMifKH zWg3mUvx~8ou?^8879$cc&*g;80DTW6vaIgo*@h=x!2uQ|( znZT%e-Qfs?_P8OQ)BJAFL}zt*ad7E#9f@Y!Z4f^1I)1;*n8}nCr?s+r{>CNB9EU-M zEaD9UH4{IQJ};CB8Lr0j8BJ9@lOvBHe!X!*Od&} z{}vAKndE95ayFtZFNc^Emk0IO_UHHLj&7?Sh3%F}b0u_#J_;4zkL{!8jqrLSi#Qsk z6Y{|tJR+r&@IhcaDwQMUjb^`ZWK;Ell{`AB*YZI=8L!<3dULKy)%DZ$fycg=TqEj* zk@f-IJpG&e_=)lEQ~eQA(~n&AE?*WTp_PpmkZwk51j`T-1i&J1iO9|ekXbIgA%$_t z0Rq3!?2J7S7Pk^IIS-RDHlE0(C-vge^Fu0J%96 zU+0}3g#Feg^g{IPk1zxKix$l!ZD>CFfV;zALFSfZx))0oozWE0a(lLuzHLsMtq59B zQ76&vpcQ}o=0}6uJmTioECEnGYy>Np4na(fyJ$b3#A+QlThneqoY~su0k?)7y)LQ; zOWeTg74^LHCc6hGONx!p=V5Yp5AW|2r|8Il1zCZ)w_MFn@n^~ zDRRl5!tDaGv5g6DAvOOE#}jKAt`>^|J|C-KBbb-Q-KSy;$t`>E$J0jfMU7<-qOBN^TcXZTXfqd+OH*lY- zIgdI(a&ix+T6!|vKzHI%(W3R*^+fJKcTm34nO(?51k0Hlh^?_Lpg(!g5j6qbFxfpU ze|Rg%VRtb{UOeQzxVO^5a)#X;-6a9r==NkQEiYm zH7+NywX?WNEA!F!G*Mk;Jicz~q5`_6M32k`RM-aW{g~qK7{UHK^JEV({K2kNByOYW zPAb-XSYmO#DNE?>H3BSM@Vcy8`W^NJaBHFRJ%VW2KeVh3^3!UDw>tnY;N2pQ=IFGo zRu~7zaA3z-Lx<#0I+E3h9U{aTu0WjDpF=Iv1gknQwk4#K2gY2sx1SFu@SJ@LpJ^%J z_B!0$jT$ibB7&J9#$4uKfKMB+JmjBTpAx|CcHF#Hv?NnZzHX^@%tO!kWjKZ#0=BM5 zd_`-Xv4FN^5Z5@FM^CVMN0_z<*j7v)=n6`+Q075NXQ(Cvxj!nlb5h?eQhAirW3?o6 zC-A4sqyXNUB6G?pN~`dvPaq!JD|xm(HNGK(Pk7^g3_oKi$E2u6|y~x zXoJjA|&6bK5({@uudXu)5R!JTN!u5n7+BoXeEJym{Mt>1lkoE~ znX+P{(W2=w_;cNSl(+_5bA)5JkI!v-v@&}~=MeTn=+*>h7wJ{SdK>Dr2XlfNl1NLa zlEp99Gf@$km7`AmLR><0CniJ|ZzL8(THsk8q>Ip?rFiOeXvPp*y?g>NEb`or%N$A{ zsKNMRxU^F=@HogX|Iz}2cfbMs&?q`00S(IsC^|l+3xRe$eN>1K^7+$ai zC0On80I(Ywp>uIfmeDcs1IbP1=z|M*U0+zBBM6pYh+d^-;sS;05Z$)cl{m9z1Iy}i zR~+g%JOh=2cEo}^0ksfej7aWN4Nq9@Uow>q1%njlnr9=lk={rk756ffyyzY4n(@cY6g$cJ_Mu1^tMi2YsuO)w^+<7EtP*ucvfoo5B_C=CPBSdE) zf)gTx5v;)g5wQKs1p^wqol)vxb3^2H*r~IM-QiswWdXZ!ofG{FlK`d|3QFE3UrT@N zr5#o{+mf)ow^BKFUz^_GjBNRCm==t(QTf+9@FJbYt~z7@9L*ytGE3W*|0 zDy8$n6$uL~`f52+kb_ldwUcrg0(gQZrl;XO`N4Dj2!XG-rE`Bqx1QYR>~&c>2O2fI zm*TShGW|=AS!jqhEf9cTq_$loY^9u&GF?o6G0)|!CC?YX13wKx6?C>Dy7fRA&#faK zi#0pg#ktf;nX(DfXDUzO$Et^nDsBsg4ENe*?XL^xS=dc^uUBmP%D&NpUA4@ebQ`H< zh=m6#hqQk8{6S=?)T*cLp9s?9Dn20s{X1+fSIhSj#+6D%n5o4H`d3H>20cTOCCxpS z>aCp-U>&_-$|X{crCmZ^GW9cJ?P7t0Q~2W$Z8$W{U>}C1pl%1NMx;qyYtVV3jo&AL zfb~IBX>X;BFa4gN+p_p+RxB#3y&z^EkOq+k zeO$tDIOC_E_0QEP_wn=z`U8I|WB5Y&gk)y}99*z4J2O_JZ+LdW#w{s4F;qk`2)C^EYv`bZLzpeuFOLyXep>}t`@!8S8opO zzSM{FG_PEHF$orz5cGv|HTEVQ(L0AJ<#0p((EUE zg=LMEc&!P#Avf!LL8jVg)!`a(Wts~deY=KCf6qBO2H$!?f_uZ?{S3SDnR4abKQ_0? z+3zt`zht+`IXMQk@tK&8-0B(<{2@f;)(_3Lzk$AdCfw-kck0?dSf=CnCWh`FxFYB% z)1mgB9K%t)iQ0S(73v%w&u)DLXZAWgu>SC(j&HU;0yBLb9%ya8rl&Cxz6kewfh0WX zc787jU^j1q2o?HuDK2`jK3eGe>=4B577xoV8u**lvEqbFxMdoJmc- zP?N}Mv)7XUJ}Wj!cn+0WMSxKS1=65G5${U1Q_5p&*41;z04uc|TEt!DSeZBTO>J?PcduZB zr?80t`N*ICGK=Gck#p_h6kBo6Xih^xjZ=966~x9!_bsTYG?l&Fl9SdGmHv+Fao$?p z6a3q^rKZHiGmLo!)3Y`A|&GWRvP>y0x>GoqoyUpRdcSRlY`6CO+*EEHRf<-lbCe`=Ysgk9<)PL7;9EvV2!TwMZukfwolbZ#hl6dSXrN$_<*Fx(tcDQG*~zWwXhSrLe!I{W*`W_?Z1JHZ9O{i? zW;qdvrj10ViWxF3^qb=iO%8$%K2c+l@@(qt551|XXpK;vdGqbAu^ktkD-MjoZtuGk zH>HP{rOg@pAdt+*mq05R>f*P=EmfzqGR#~_!hafoW^hE1ti;XYv?P$Rd^)YX zE+zHG`J@_@RI>CJiwP6d>az7Z;vso#_^iRMA%vZS9&3v$dX=AEnxf57BxCO(m6?ZP zn8-%l*okc|#skZ5$No!C(c3^N@jKdvYOst7SYs}r=$6#aktQM*=&xQGcsNi9>H z(51>(Nq@iiw)$G;)?K?O${eAjWl-o&?3m55vUCjoss*cZAScBAU@5GC6vc1Ye1!3o z*JlpX-pV&-Fe=~1pf=QFN(EkeRnwCyJZv)JWUY9SSd`;{FOkaBn+=oS%79L*Jqj+2Sf&4sYI_MC07rLsYDNtT4px* zL?P4ffIKNz8zIgnI_zS@BV;>lL?7%HfuJmfyr@L4om6oEk|69i%u%N+46#}caj1c8 zuT^Nk`to$>Wn&{}Pk+%ClqqSSPBAeAgRHs_r95Q>);MG(o>XZNQN}X546649epYD ziZ_oLwZvpY2P}s05MAZi2A?zpq+yOlm6uRfqP)F-P8^=WRD-EckGJ}3y*&g@W>xfn z+Pk|uo@~0@yr6%8|EajvSds9nN~wh)6!jINYgvq*E(5R<={)L zil^AnsaHBJO2$BBxE%Zth;d-!T6%x)H!bkOLF=*Avpk`}N-6g@+Wsbe;qYRUm-v-{ zf5()}bIYxNR(Kr~bkK-`(()Yjq8Z*1v~qtVE2>h)5H$&R42C>=kT|7W|cqTSfK zvCm0!KibP^gz|Ce(H0cyDUtcmG;#>C+J&nniiH>OR+ck!AR9@b-i8qcB;tLbv+zqt zavveh%ZiY#s{mdsxDlXG$vf2`yJUfQnaJOqut*$(I>jTUL~28cXQ@AuIIs9O`(rK( z6@a$+i@@qKSwEBo=*rxpQ^!5;3!WDEsf4cZl1IC053EhqF#5>YAG zJnT7rbv>-^ATL6qHxe=@>mnXzdaRp44sR^$LzprTh|lax&M2+-L^u+_ZKzf+Oou<4 z)O-z~W$OSIb63Dfy36_&R&m!sqCLbra0jJ_1!Q=p$VIi&A$aA+kaG*kbsS{qYo>=IiR&K#lf0ox=uP&+5 zbw#DyVf7m*sQ^UM4&18XN5U=V(CeVkpE)#|L6rMLDo?~~eE01JydvoM23SrlL?xk80_MLbc9gk9L^3=0B-TS<*?n7CS)UF@ZZ2)S~dxgREQ}n6@S| zM55lNBzMH;ld<&<19fB?KIxc7#T$!$4^5V;8zk!kxqLs#!K*8f+AoX04$=!WMKpL3 z?hQXNC*w+!-3Vll^k+!DP7wIGi?*4#Mt3ps*Y=Mjq7rO^k11PG9BCIS?t?j-(`lT z3#xJH;E-@qDD|RjFte6>|c}A=cNhpa`$+Y6y>v` z;R=5068IEJ1klkEi6X>j94U!5M`NH!50BB7w`sOQE-`;&_GOev)D1XBqs-r3ibzwu zGGBiqRv}&7jAT{3z2pyo-mkxd#v1h40=Cy&p-kx<)7Zo1CH#Fe*@-vC@t`H$Np*{f z)29KV5+Xl7U$qFJDo(0q`BhUw=H~$9kc4h@izOvTAy+Xal+FO1JYl7zxNC5(S)ydn z&LCUbofaXFUi`-6B^29`T*9exQ23f=vm~Jv7JIQ+hn0(mN-V(#x^?p#ur)|lqD^d| z^bv|=e-V?|>)5(LAeB}8xUqv1ltPEu+J!!UqL3oY@atUut8{^V3a%LKx9AsbriF?-tU`Hp}&8nxOG-&nmm z358685-Ld=t=6g~XhCSv6_MOF<-&`{Hf4mwP&~^>8$$ccsfkb)a*oPnj>-b%J`o06 z*egt5HPNfwyyj9&F|o&w^2{4Pw{?wQd7bYm21L0nVpbKVOapjgGMt06{a(wwemt`e z|7`NA_=GcYC;BtQDO>)HsKN_ajV__hC}Pw;x;=uJ!jVSx7*HveDA#f#)V><~4a4+E zux&=BVHRhY24$YEa9m|p1896 z3^uVDw>4IJ4*a(H($MtB(+^MMMAEga@=9bn@cH^)=CC|t7TUfM+c`4v1TJ#;9$0AK zo&6Ig*t)*pa@s}Rk|FCtVTDQ$8~oRPR!w@ddtFu&AQT2A9V!zG49forjfss)_&{ht z5OscR&ec*hzGu#Bqr5PBYNr`44+|u)p?xo z(R^?04K#L^9|Mq)Eeq5s5O5f2SUfIE~sgEHdD5= z!6V_47yYI|6$`^gfFNQ++xG8IF~YLj!1mX=AzqbCkaQ5IX%~UmdfAz|j!|j6ud$kv zt)2GVefd78M6m7pysrdcX`m;~dIb-T@I4yly*tQ#TkE}D>E)P5u>Qof^_Crgdu6To z-iAcpbvy`tjYs4i@x47D{n(VvP8*qZyWl1M*a{c;5E$^id+*JD<@pLl{ifXi&T>Pu z<+zjV8V>)6cyP;f-OZ;dlz}!B3Q~8||6>?cLWg;?kv-K_f7#2hd620wQUA~N^K;MsPS11Be$32sP0M~x z{&mW;4`uFj9@czQ`40K?tm%y*S;i6x@J`}}nrYeM%`ZgLoqStrkmBm@LiaLDyS7GC zy}I_&=Is5In)yDX>7($u?w*YKLFQ4*k^p}@JtBv)lFV3a+&KZPXAXR0!ob4XcHg}2 zT>WM>HXMkkzfD60JhE{^#qKjK))ZyY9s^me413rwo&)iDBXyqP&eG`q>mpVWe+j?p zTopDCf4Pf#X*BNQLU;}^g-X>mT-2SEm5!X;#jX;~*`a526{TAvP#TuevJN*25*ps0 zZ4WIl)?AhAmSQ&58^8rtGt-GQ9J#oEYRDQn2tmVogmDYf$y9lXh(p zix|+zXOhd(OaTp$mKY3OFcvKz9eY@gDOvSIN!n1K7^moRu8?oJDkZLY1h5{(1~t|9 zz+pW^mJteW zE9mG;tgu=02@U48J8f}}aC|Dp-}14QxszZ@n>ORZS^8Yher~j}BEjaI-iI`oB@E`+ zJ7m`T<-$yznii7#%Y4g6*dRo_7Xs=^9?juXulaZ>Wgfuu-9{92Jb+nnct#(((2kDO z@o+!FylF6~giOE$74)S=1+@>tVm4~J43)WsZzD{Ks?K-e(=>n&xDy?h7$KqNRAowo*)9qc^4}=2{Z3L#7E`I`5p;&SAUzIRA>IJdk6x9n zIeK|@F_WLq5EUK20h-UktJf5NA3lW9RHS3L+Zmn=w_OP$ZPJweBA_GxYZ`ACUT<|X zz|F^jLSzX8hPEZiW@Af~RmbfrD#{lnr&rV-h81E56XqT3h?6IPSF}Baf`A?BVmow5 z=!ld|3u{Lc&P?Z!cA}Vg+6q2^$kjSl zSz<}`_pHm&52Yuv%>ZZQp%P!)M51IYNn)Tmfu}1H2s!N5e9>!1T!RNCx-g&VrA;b5 z+XMA^1_u9VkzQn1f`hDfAwOcj7-IwC8ldxX@AREDAGaG*y3*fgLqW`YVp~0D5$$9ELePT?G|yXu6$c zSO>fJ#)+04{~_`hZ;Ht32zR4fz0^Bv_%g$mqx6WhPRT4w8Pjq(n|sL+%iO-***KTR zuOi!?e<77R9;ti??!yQdI^IJzG{To3e&H=g5e+ZyKg6N#v3lq27{CLrc+#ZK~7)nya8rXsNKSvQ^n&eam1q_JL5=z`5oUf=u$l zhY-wMSp^DLUWJ@%RHiFZp{$N+nW`2#;Zm1P!4o}OR+XqU>QcW=A(KethLx*&he-sB zv(ErI?1Ka+9(7K85H;kXv@-dwblI#;>R|$a-3n9^Qv^bg?)|?4&*G zXJwNwZEqPp>!q+DX?qvVPKx5#xr{R*U^uf3m!0`rag=*Ul zQ%S-t+Vt8bcT)5sAw;jmmPn z&9hT^(yb7H18D&*pub-^Uw0QQ@)1yIKi}8fZIoR6R3*fUb?1ZZ{L9n*goh>*Sc+9M#$c=%0ioaNh}^ z@|=7roEEU!LBj;d^=R`hv~()Wo*r8s5-gR7Q0zpw>2#j0v^g@Q_Cp$5w}IcVFy6-s zXQ=JOI8F+>oY#|CMkBEp8++pwvrv= zwo)SFW))YV;F8&u1iyY?-pB4G@kYU8XrgDw$oI#zj^x3g2`;IW$HYV_QcidY)IBKV zHd+?oYYpzsM??@!4vTQll0h7FE zq+4&3DLR9a+1#&V#2ffEp?<`|7J)T;$9wdfso*;Tlq_#)MUOYq;bjN9ZbL>pXjz)_ zo@T%Wg>ox-xTS(%l>ONNyvrv_PHK_(w!ZBx*5H>vry$rHmeHI2(YP+3{|AxE zxNN?V4@U8QsvLUcuem7$ib#a;0w$%J z=CI8%{@?T??QQz93!^`&!Au9%Im><5H)@O_|3eRT<2~gr0^7$k#Owxv5)Q&~& zve-EfcaI6n->PR*qF3SByd*z5VwgIm<1V|eB9=Bw(@Y}Pb(&O3(-X1N_#5FAgJ-gF zO;Xu#tsS{&4{4|hU|x(b=Bw$cR>>iAIv|0okRz;+G1w?%l_@mHm6m~JJ=tF=9XcAQ z(wY6>lVT4aI0kIzfxb#bwUe(++xRJZVNcK}x{@w;85Q4{**eK7x0Hl=Wg#Tx51H=E zI?_jMVq)NLDFA)4>q`3LmXFfp?jbz@iHhU$Q1j)~gAIz&E|L+pD%$G!)uX8=G%gh+ zf+1K%?uL}NgK7651vI4$xWx@o@S~tQi+X~+pk|QUAD<%avuDqIS|aU|vqPpT)4L){ zx{zza-K%nksf!HoM=H7)R)ene6n98gK~l|d{w%2rV&h8-FCiI&DO%z6$gRXv85>1t z##JT_7AwV}ZNS9UR8h>E7U#>=26@zi%3Chsb0q@wc7e>BO$V-~2kqd5Je?xQ>rDqTt0tf0 zO!S+f0(@+Bn$UF4Q_s5RI!B2^=JaC#$!q|Zsfgz6v*)t)>s0vd%}?5)7+ML{_OPZW z@B|Qi#ywWR0jRNDe!n6xm-Y3gly@OL<_Yl#;s2}!`uLWV$C@FRjW?$Q#2wFaT6$N& zekx6J^a;Yjm-i{2Crh>PC`r!8nkE*Wu!=piwM z495%;A4RJ|amMX&M&5i~H=j(8UPN8^*3zDVJl&I0smt`dI}NN{|B+)Oj9BWD_*D@P zPi%gx^(vPO7IDPK>SlCT`gJoKwdxCBSt(PaY2?o09t%z13bK#f%h^S2Y$<(bMQCVQU;i;Et?gA6bA~NG~1;! zs4Ux4qg|^voo4UHcy;afT5egjjdRuzNqocavYRh$qoMqP^;4jV%*b{&T_t)qN4@ zzySa{kpTcG|ED)E{@uUHRlNte z(bm|R()0`_`Bmq5lkJ}4X=-{swdL#eINA$STm9b!9lJB^kjKOaF! z&sBNA?nNn6WGi{aso<%Tpd)9e-0zC)75f7M451r^&M=0Q?0-QgI1DZzM(P@yJ1tv0 zRuiW^3M$_t#^52P(x-Gw55aD>ctt+Pq+Ul2*1u4nMp=x6(lIuBdQpb=>8tDXumaFvbH3VzWf#PEWK@vF&JjEHo(**Fw(#rU{s<~Jqne|Xs)mB zF+XN?VB#<^k@4Q3P1NGiFwsVvOie@lFl^9+moRBEPcxHzoQNE>tUfP_HgXZeRU0W_ z!<0$PH_uf&jSM1aK#=E1WJgj8dPU7XDGjeO8JXTcGi{WycE>@|(gWY4oW2$ln3vnx z3oE)9*~6Yy7K?$z-5v~0y6ep!yE3#ULv?bxj67)!GOSR!%_MUQDxW?4scBN5%MXdj zU4q%+orS-&%{cfQhxV9EN>PG!XnkQJi|oXrB5fIpF{4~^^8#iQ)j2YM60(!%8$VrJ zOs6Ku<$Llkb;OE6M3>EcZ!8K_Db40U+~-k#EvMbF@fdrkNll59X4IJbh*WK8ek&}+ zU_J&RyL^Ym5X0pZbf*U?Scm8NF0`^EOJ`$muP)8_3J%b^DAC{k%{t3&QI{%C%($J2 zl^;9w9wz2(^so03FmFS_o_c&!DiM&eW|&3-|i0Vrixh#M1|pxf$&w&JFrX8=oD7&ZXCcF`X&2jRZ5pznC3| z4U&XfB%w6RI9?JodZZK4B062C<%mv`*1ZMSJ_{7qj?ywx9{2F-(GCb z{mKPFSO!IfqT9Dawnc67H5~FCO08OXki)3KYBNZw!TWj!gYoXwdXTmP^D)^Knr?2` z6Kgun$qx0i>IprU0=cbJNwH8h@+GUTa!6g{cj{9PUBRvFK4G}zuk@p`w~8Fw&ADix zyoPRio2EeuE)gy_RMt4<4%pj9))`K&7eBTKhH@X7Fvcd6#U>*tpZ=dt=inXXN6Mjg z*XUi(Qq3XQV1EXUg06|oEOl6ww5zi8(hQ-K{z{0`bDVw|tdp{}is5h4QVZCFS_R9J zx5g}*(W|+N0oc`9UEX9R4x3yp=HS97PkS5e9~#nl6_n2`N@>*o^*3%1zy)&LVUyRv zk$5g$q$CXGHel;lu*dF_HP?XjV}d96_s4ldUat6@=DAd{(M7OPM2=Sg^Sfu6&%~sV z%~{T+xHVT6NN;OPWQaah8&CUmC2pNagAKcy;<|us9X^dThEgDg`ovVu<`NA5lMEvF zY7)-Q5UC@Sk1VwES3W~<&05BJ+|0C61j2#?dx&Abq(UTgJDPL~oobMJ4#i;4(~+lJ zx(-KueT0wG1@&4SGjnPZl#Pd}E2i(@oH{h3=$t<=fJ>fs3Ug8OB*thwDVOI`<0zNs zR->%PGx==J?d4)j^+ZRQ5h8|BHAo0~Ljn={_*lN?+8q!1FE&Z*rL)T+rsgfsy~S6U z@wTdZE(cm~hbU_z7iD<#nM3_pwnKREN%_@2N~7eWM~o4D-J=J$A$z{yz!SY(MxdZt z!xK-LI0rkPU97>vwmS538@>YoeBRJmTal5#I9-T)bZ7yS051yuF^i#E@_@1y4Tka^ozR{x_^Mw@Or|=arO$9C2 zl63?Rz+7tfV=~vU-+?tSZdEVa0iR^evWumoJF;3Ht=Q^WxiQ6?N^SRNFvB{d?1JGP z(dlU?bWls%+QdLno$cj$X$}qwkhRu^gSoeOP*EN1B|umA4lo3Q9PzAvxfXlW9$sg* zg%0^3B#m}kzM_5J5GFs+1)@xx2$y+*cD_<*yb^DXrG{GnSy8|$8D7Uu+7tm8RmKUw$B3EsHlgGMj$QVH9#_YmvAMBw8% z1aI~Yy!`iM>o193ewW-w-a(ftT+xR_nd3P`Z&g^h85N*uJVk*g(Ht&jDVGqC*M1xi zmQ8caZtNmPpH&;IDXwwS%3Z(ltS5+imI!wsBs2`d2eHOajF(u$p8=_bXzb;bk1G_{`?qhRn+c``xj)PQ zl^K-DJ^1nQ`NZj`sy0p#C<=SrAg0F?$%KMM#X-hkv|@}m4JO#o)HNEnpkw0+=vBu41qH^ylDl*uhlLz?H+Wket$jFu1VXL?;y)nT)P78aEbK z4a+sp+62$xHh}jv>U(-mc>T_G+GeYvy^mhuSxwFf$QoY~(}OGCvi|Sfpky7~2UDB1 zMrP$A?t1Dg?F_C#?pB9WSQX$|)qEHZ&H=147aUj;EGl{~%*v!`%0KdbOo5!o+D2+^ zAEz+1qW%{B@Gr)l`l~tjx}tyo3gkK`>VGLv!=|9ee0vYp&Q&-J_kcyJ0vv#HlcKND ziU)dtbZ{TF8=7CWcEj=v4m!}38S};%gP_g=qEyLVWW^K>QuQJJ6}O7ppMV}D>%sX zCpakbuCWbw6Wk5$hS)5ph+c9Dl550ypx96y(al0y|KPtZ$z!8}j~omD031yK0M7q- zN&dqfI{h!a;_~NrH#@`lH6INE1b!Bv11TRsd$64_1c86io`0qh5On5tTPM5$XnDYk za~G8{{u@?1;VngyKYk4>~0r}|m05)}EXcX#UY^77h>p|k({dp5Mo`)1m+ zclYJ9=Ec+Ycx_xX7r;-$rXF}v2G!_0y*T7ZDSvam#8+Qp+ICgKV9mX39qWiBq7X-Kdcw!*#qxUe8G zA~LKY*8(sDrAPx68Fg__TF9Ldd0REh&PU$%t~9rVxFz>=o=uTc(+^Y)xhw zTd8wlyv9IP@d2YkTXL(W6A*e`hQdYsk`v)?4KVQwH${)^FdWgdAUKs^{9)EMLgymjNgXcyWGBRA zY`F{T^0U~bj>Tp1h-_KQETHuzkHwDcG4(64$g&x_ntuuv6uJ7Lbx{|7%PhHn}3uup>-4|wMlf5*4f{jcZ z+Wf7h9_5^TN(>m=7hN@ask-`ovrjIJaTnb>!@4K-pgnqr|4`gqoXrg&D1y!Y=pXX?rfMZe2pCB%MY%5OZ^7TrZ^D_&@4{BXnybDSv@4$%d z^E(9sXNHb1 zyX%Qa@QxRIMs_38kHFTfxS2XETlqcCZeKLVXaQ815_aCKqx)*dhUF?@o-DjO$Y}|m z&ixhDKCZtBxic~>gQKtss@(ldq@+kJus;l5-955l_SjzaLHsdn#Yj`MrX4jh`q&Rf|lQoNjCEo4p+l;^5}GP`B*!(kq{q@Fwv8<|Q)VIO=H_96i4%p7 z^Q7PtP}qzr!?WEI{XN*4QrVU=^*7k%RFc!Va-jhgY-ffCSNA^1IH^pmWye|*JMa~) zi2%0l7B72qb;Je2;U&gFr^SFN!C~w^k4_=YP|28H@A6K310=*Zvue^(FZzy}PFv1q zZJ!)Z-OI}ezy2e&;>3aO5--pRgRJgDhEX-6er5`Jqhtz|jS=7xI@0=7(kJMnV`OjC z&y7B`xK(S6=#@_3iGg-XHpdADR)}3XBu5b9Ux!)_(&qjrGRq$0@2F9Pwfj&&Gr!vK zm?g)J9k)(E%f(bOCbSUc37}^Z5Asal1=##C!^102=`ak7GFCkIEC=5 zR}huS12YoddPERqm9>l5Jar{~l$@2(-AofOe8vcwIf`Q#8bvFO5|)b&K@ydP{@xAy zh$Y&4>mz--gs)_x6fO|ZLR8P~&!wyxz{5Uzd??P4l>e4j{>?+C`xM-D7 z2U$ugMP{ux6RV(b(w5MLBjid_624g(FXMJ(r(ZNG8SnI4tx?<`yWCC5d+pkg;Wh>OHZ zIf9)bW;!0-qvWvQp)IL48E@z)i0lE{3|;*w^OjrchYt@seQw=1iSQ;~{8;ktSHFqG zJz^SRa8frqN%AuKq_!#6-HWo?U8sc?zHKg2e=}gZsigVzX}QkC zgH82}9171YTZkG|5w2VIw~mkMaUpixCJ3y-N(p7Aix7Ne$I_v#)V1v$xAafko{2mr zN;g=t(k8lepFTd5zI{YYx=?D9CxlhPLAO=HdcW}teFvcs>Rl?#D}Qd&C;OM`$%s`4 z%%=t{%$9z3lQulNJ~F;w`vF>}cgU;MT|+8g;Xr<~+?~BuKa(fQcNw#9(|@LJ0X}q% z^sA{%Jbw??B;BNr{u(p=LrO+eyfQ>(;_0t2A%;g)56>my2F`) zVj`b!lCOjM_D3*%LE%ejXOSCV&YCP%e)e+&O6}(~nU-WtH-p~+AGbjf#E~7wP@{29 z*GZWiU-iK30TOXXM$}+SC3b9QVh@`b+@O2SbV;8uzc;mGUozOX12X(2UTuq9pHohHd!-9%z ze1oJ04MZE7Tpzr-9LLAhj)`6Ls3alTM+9SLr$mua_sFad3f%Nb{+WqAF_YA}aV*Qt z*?imvhnifQvJ?wzvhju@gOVp29EM+bA$ZVYXt5RDH-Jrcn9(CX;&}98j`u3?oz#vl zu;O43{ij%em@qsu)nIs8--;p4?05PSJ7#nF1!USfd3x7c8qzag+v@bwbl&3A7v2;5 z6195G^E;a*)2!EK&)Hie97HrUFyJdnTj*gkb!h1n-tzu~(D9zJzdpWIasya~%$7_R zxs}1+!+T6np)3AzY3>#3EcvsN?aJ+8NB$N089!`Ja8*gGPwntM;4GIy`!F#_S!6IeIvl{~|n zW>7xzFJcUE;_mShRXukTC@%Lz1NEYW?Pn?G+xm)BZn*U^U5`0sD>5dHwZ&PJ|>-j%DDWMok#b2%|+9cyL-P}{SWW%B}~Bjgw)yUUC z!yoKm0Cv6!-5VBqG9%jK9Tqud@d)1K4LCy5#;OXdOm-O;3S_WLZwnUiWwo@!81KPS z{FE%S{k(5Eaa?1eQy0+BFab4j+6d1D2`Br3qAT+GCj8wa_g*9MN;SQQ1};QDr{=lN z2oAoC-5(|Bmg=6ky@c89g8-jfSNQDu1|T?D*zi%U`-Da5=AIQf2CgP;edFr1RMcu@ z+kGbJ7K;xGSt{x-WMMOjpceuPX+01*+yqUeFqiCWK+nJS>JEQCFZH?4`|) z`rt47_a&CTzKg3V0`Tj1Zt|NsoKL;vyl_RLccNsafIKOs7L8H#liPORhJ|hKXHb?s zWgl5WmFj5NI%visz2WH+2Nsl7t>i*keE-twV%g~yCA$$)NoV@JNRUw|QE)#R%7CV# z_5rV5Kr6`;Ne0Gug)gSMQ3nXI(-N9+ycqWd&BN>Y^8W9tg=f&Q9u}sajgimN>B6=y z`9p!2@TEV3A32>#yC zBvbBzTJcoOszV;n#+4WWIWKnD$h3_C!uLtm2+ zaC?J-182+xH?0AI{9tPXETc#zKXp}_7$dmMjMPkw@AcC*AT1mPN@`mmnr`j92t-cK zM6EanDUln{ZRmMn@6F@1`h{iAg@DaEh*w7!#qxXIpxz)!KFBq0$8_Gf1sNTW#6DjL z%ZC0E8OHa_d zoDjm@H*yX6p3!J_w?Ym#^mlcxa2KSe*{eY>pPbX=-I{0Wx~X)94A=K%TAuyGWAYXZ zU93_0-6bwI{IsWi`qIvoSi$17(E{Lmc}B=Mn7)|kc&i1K;D5HNIf9e5klAMJtd$l`&;oq99=Qb`&p8Mcq4OpWmY?W z7ZDk*UpQSj;sg~O85RIYt#mE82Qyhw)#h-Z@X_Kb!102R=H6&lyu{hA{U@Dd8w<-g zX{d3@O%+#m0vS5mC4}ZhAq-`hYkF3jcF0Bt!E%KVKt>N3KMy!DChrwSBNZk~1u^Lb zQFDJOdqPYeW!HtJ8iMfyO&>G&Pnip&=fb4k1sXu)Li{LPcFBApH^$M+gs2xl^I)d@ z=Olk?k&RS|Gh{f%MJrwaEqkcOrN_A;Lo3Eb9jb660yzRB9n&j1Zc;)mLkgS9vm7l0Lf^-Yiv zb=Hi^ylWKPI~G9WN56aZB-@2$e1Y@VAEU%<-_Qu|SSIVbmK z{Jng^s`jww-qi=hdZ7ONVYb;-A9VZTX-ntFce_RJv-73hn9_%QzNh0DYV9lhL(MbR z+JFCtyKBJyFZ*ls4SNp=-%F!d%5J+v4KdJzJX^fFjJo7}%&D7+ z3(Nq!5p1fYOByB{J!Btr=)o2<^1<;d_g{hvzTtjAXgEM#@I3}4+=nr+nT6UQ9$nTO z>IXfQHi--AbzW@eM36_n^$dCH z65xr#B2Jtdh%(QA(*{fWTrBGaKvy7w+^qZW*NVvMK?J^>=ZEz|i`}RTL;1mt+@0s4 zy_ejx7l_#_sjEa9h#Ne7@^%%C1agMp9rfYw#GX+d_f6bHP_1a*P@RcIuI>wP1OtJp zBGgLWbacQ--IN|8cioZ-_2=$$9M1@NGX=8WUegN8-#-S$$+*RJP(oXb{1L&`qIk`r zY%tFVq6KE(k%9i>=illY;Z7*3B}i#oCCwPMcpV@VMP$yZ5@ayOM3bVVq!v!6+m8Q! zPE5yuFlSgJ6=9}4`1-e%2jJG3dtafMGMVHKK>nvqu?4s+FdZTy~lLysG; zj}Tcno(q0#Txa8okma+AgZ$`W0gW#_*7CYtc%>&K;V07G9i^ZrSm?cUuvG}#h!x!b zy(ytVw)C~WdNMPYxGCiPQ$@uEIx&^Sxgd4}UvhCRg!hdHz3Y?MjDqFaCw}ATm-cs|f!s6An1HDS&3VLB zGOQQnaH8&QwPzq4%Yvv7V63d9EeNxwz+@sxumi?PJ>q&%z+tovqUun`gKQP3b?l_% zOEGpzPIk(kI0_%F>HZxbnU_&`;+{Nm&0@h>D1z!hPP6V$K<{(2gBKi$uoDbnBkjpD zsI*~MgOWE`KvYvN_I92x+9iPr-^mdj@6Lq(!69fI+CItR`-FJWp0ww zkU<}^^WpK!7k};(Xzmjc%!3^IM*IZIU9jANT?XZf(Xw?}K(jI;8q;V(TD?E`u~Qm- z-2_*M=u@vxILd2fq|h50o}dFyB=n!oE@FW<>9NsTSC|AY&=v-`HTtrLIcbb;&{f1LHPkq6@)HhRLS&LwVcY- zFgeDh!eU^=Et{_S41=Yk9&>VJa!Gb2Umf%&p1%A?JH+HP{Fme zCLUX6N)twKTRAbps{A!UZtxa76g)S=svAh0w)5w&1D^=Tx4`2k%+xpW!?e82Jf?LY z=0sMLW!*2aoq`;HBu_Zm6(f=nsSxw7n`Ni?p5~;GLo|2n5`PxEAtO>ZWWt;Peg4+*H#>oNS*~y6ju5cVJ=L&^}X*IAw$)+WN_1nYbYuhlsT} z`XhmO4#<&+SF+bA_5f=|#g)7by|BYVkZ;GD$@7^pkOLUCq)7 z4ZMlgdTNSY-Tdscxy}F$|B3P-p8D~t8irLbdESa}8qo8n(C1|gxrO)z*ijVo$M(_& z!qL*daIBIM;0sd@(}EiK!0t&^EO(KDi0ARcM!#SEcZZ4=a6|k=ZQA6_=_LSarR5FCzlmcr zFoJ7wnuky>n?Sz1cy|h=A>9OUUyU9qDWw6SA<;X?1 znRn;m;Vuy3eoNbcW?wGp&22>D74PDQJ7JiT%)_|2nwEcMuXP$rhx zJJK?p_P-k)cvY*C$!_1AC1$z=A6HVEs&!=Wq0f_ciXu~Q`PY2fjv~7o6?9J&z5fw@ zeobTBE;#e8LYhxGBc$E_<2XaU=g5B7XDiqR;kjWggntw-n;Rc6d}(a{5uD@E`*=xA zZCL!mlgVe;LgX3`Rxa*EoXncqeM;#`T^edvgk*bW(_|qFr6G4;&xm?rVs!QPH?~Q@Ln=)536C}vr)yCWYF152s9&R8hv%6*(vYF6V}JcMF_sF*{1f%FO21jFNmieC7C+=F}H*d(4WJ@Fm zh1{i$H311?hx`RA`4{LH$uF?VIuhZAxQmd@XwYU<+G<sq2VpRp9IJLzV ztLi7y^FqD~AIs{;Ie>g6#rF5)_j!xwZMXXwX^w_; zO4zfD;`gu-<#c?3QUs}zilic~X!L{jSw5Q{RqaGk3s0am^VkG6PgjC^d6(83jk;%a zD6~g==*nF?p5DJlC6=l&;ugsfT>^sK8wGZKidyvYt~Fs} z&&Y8;PrFA4Tz09sqK2z{agWULDXLbFzQ6hrmr56ivucz875It`It}h(NJ*rpzg|Ow zxPR)$I}g?<11?ekqysm_L>s1eZ<3UJr26!!0K8YP;4VE%f!q|M+EA&fl^ICe!Y9pq z+r^rMJ!hs1sb8O6UB3N;>i2w@E%IU)iPP^qf8g|~Kc6If;WYo?`YA@xOWvAN_7DxL z7r$gUICP`vr|yAM+9etFqHH5#ZKEV*7Cq4-$nIqpzqFui$G2z~wW&s|t9;djx{U^H z*4+Insd|&pE-F#BzX&^#(Xu7T3$4)d*{#DfQ%ZGt(awB8RMyi#c=f5qeo$D&hpnou zHrqp$SySy7;Mju^VSCZyc461_lgX+68dd7u0b}2GOnHL5OFH zHjr*xQ+}K%!FFcdy_`FdE6tkwL- zGN71m?L(Lb{N`El_!PHw5()X(;rj+(lq-TJA}o5&1&rjE+0&2zWN*7f4dPFb1UV6? z2w$Hro&~YnHGmLJqxAYN!z_)%sZ}!ARqUOO2mhY&2*>>xZa+VK{KN=|sj&1nK_X4z4Ev8;HOfT2KdPcIKR7^SW02Gq0vBRu9RB;orbyP&v z0{eSxL8@pH`lQneF4S&O_3PKFHvS3ZxvaJDS0p3OJrsL%SlOfGZznMgg|mZ$Q(Q6g z+j?f(|$aZp0h=Vn@m3)Kb8 zIS^#hmD4Fmg#69Qk2)*G+6GjeBGErnb=f5bK#h|xQ%)k~a5}InAtoO7uq||_t1Yq! zOD=3@mwVtl^|LB@{2F?lBU@KbFo80^6Mz3wRFpSKE2jY)+rhQPMXCo(J>}(Y8m{z= zyEDj2ihZ&jkJiM#V7V{80^o85D)R3Hll>rR4xl8ERKAe*6l6Ro*s&Y+szb4bzn&x* zitcp9vLbqzWiJOo_k0HS_g$fuzJM+$cdT_wG7D7M*alt#2qTMy<9gh=7Y6tsInx}j zck?QnUj`}*tqXQ@!alKz8d>4#>bVtdlJ^~ENLii;X^V(`xS}4QBvFnwW5~`)MxxIH zFYzWQ>_ulm{E(XzL83G#gsPEY%4s4D2*BCP&T~(3ED2+kG%AZkHbPe$>s5G> z!CQbv>qW191%VDAgu4ar%)tqg+4Cbg$cmHT@srdPLqwyAtdc;akEq)hB?)!off*UC zdK8^=bN{KHwK9~vW)<2Xplx&IM!|?`3Tt5^aExrX>nw^$s@A=WDb6>*UQmJ|{>wor zW-~Ge26Ec!u64lFtabwVuW2D&jtWL(oF@C6N1RPx7Wcm47bCw~yjhA)9m%8OIGBVl z{lIK&a%&moScJ8^6(Tmz|y2AP`*ez~HJa97DT zd}$+0%0?d!ZsS71mXqeT3g3XsE~c#09z$iTY_*SVKC*YkMzE~NclNNi?W{T626ngD z^R{%?oO#jwzPW5>$(>@!y)qw^gi%RJ=6n0JrIL(!M%-c=hqH6Zlz~>RRhffCXqMZY zB9U|O=yXyzNwV@or(hTpgFFVu^FvY8H5N__k|MANeURF55UrJaU7h0 zFS9PNViClT-&@%fRjhBid_N^)E+%Sp^@t$> zix&O`B%#!ssdmoqb6!=J;<-ncP%-g#?R{gHX0gsP z1@`|1y<(Q6DJ_4l*(G}f%j$#Bdk9D_UqQk+`M#(x zbXR9oB`1T@fG|64Ln}IqiPU2Kbll+hsJxsMN(N@;BnZ$jNirjpK0^LmK3ysizD&`a zO{Y4a6lKE{$AW6|K=vyL1-o>C@9<*x;t1Hn)1czCvVvk1KXFt#zK<+DPRj#?hGTBX zeh1YttkyNv-rd7TgB^>O%8<-mb`ua1EfaiOriW@{8_YEM`%x?}%t@WFVA)=T>H!zaMg98&0UoA{P1}V>f}|zrIF|(E35Ge zcNHL5Mzp=!u_nqj2ol!Qlo(*roZx-r3JM62{jwd&&K>(`OCXuoYjs>0Woepf6^`8v zwO+4!M+a@K+wig#KKpGqxBq+LpMQ*Q{xlW-4Vslk_&#eAiP4;jTSievjz>o{D^iqu z&;uS}{;}bM+524W?KLEf7i-oom^6vS5yCm~`cZ$}=Pn#k`D+O)_`3UqX4)%PWzn;% z6!LmrlbK_)5a*Qp=mR-vx;4QFiE9}=E_Ug2ig^ruIj#eFsN{SUBcpKo?7uR+6e9HD zkvfZz7KXKn0Ig75npq~<5x7#<)I~ccjL5ItKu>mq4|b7I((JXQsG!v%R1IQUq{({8 zvGD%aWrN={INU`;lCUn*(RYx7lQkg>FA38a5QbvmYyaaS-5?NYF5 zyFTLTG@m}3E*z_RgW?X_yFlF3;V@94hMD{TZU_iy;VA1L@p5vx9u|iIEL%$Y{YN~S zHmHf#`nS>Qv#QXxxOQp@{Hr2uhZE}7eMMesU(cfYH=iBK+mYe6xWGQKilkX4o>hw- zmUIHA3}Y+>9oLjHpa_b?j>{I4N7<1-V9sT{kj)5Mfeo${F<3En)Nfo7!nd>R_ahM? z+Pvu#S&QhHMC_g1_A+6nc<*8IzdlCyV#S=mTOeJbCpX8<@3dS786^&1{jCXDY@1pT>8L;1yaIOuPJ! z>|4|w9_dux5$!0S5a!lkl5>!XJ^LYE{)6zy=x2z=DTSX9okN`Dvm#wK5XAF>gje6r zND;^Q-iT=H{3Tj3v~*q6ep2f##o;#UpbYy6k4+*OF_|nlZr=5-H=j?guK{85J|*$S zmbZjtkmtro$a(;h|24y7W=hDi3{lPBzSl(jlB#_bAUE)A3GGGMz~j#Oqc)h$_tX9c zI;yNhy)<8lk!>@Bbiak$`yF=lUf>TkOew++j9$hU-Q$dXJ^}A8>}$eQ?-?W~Pk$EB z3LXJ&v5H)PJlNJg3kpi8U@h?yZzO?;*P0;F>am|CbK@PfDX7se1s&Y z0I66a)-bMPkbq5GYt<-gJ41J**j1@ZzMmDN#HIwN-mmKtMS??GC)c?X;v$bui^*SF zJlnblVy+wEuUGplZpQKN6w&P4%y0PGNsfDnWNsAQ0;LvJJe+~kKdKUfZ%RBn9@)Td zghbH?(6?_q>KT|ut`%x5y-)c$5qeW&sJ z?@BkczBioS1O3aCb)OF|_$Qjo`SyeG8^Wfny)t??2=Sj(y!`Ju`co2KS^W9NEbttj z2leR!c8<)gLmaNL_MO?`NxSJCm#4b%Kt=2j0LJtl)AW&M*5ExyD!N0Cq4YY#cI!L= zS6EwKz&f46Wl%F*Y3^L?&b{4;UE)5v>jqtI;BSpfsD+Gvb2;*aesz zc@s+#`K%%rINWAr4cB3AK*GEVSIvB^DhC$mm`U>0eqvMHW*`It9@`7=xKC_S7b{h^ zM$P=E2cHA9)>IT+!WWP*_Ynx)ncT-+-fre<9x=~n5?;fHRnRWW%e?IGE2b}Mt|K)b z$WQzd@#-9y{x&4d4of3Jz5XIPs_^%Gq@uPk6+AgSp8YQjI3=1;e>9b5)W1&MM&}GX zORj%)EFp}^Oy=nu`wz4jp0Vu8O>&8McO2i6gFUbjbv;sm8I4ufKvcYlO_Mg|i{0~Y zmiuSM)e6(1)UHuHmXbP+nnwC1!jFxJj^jtnmHFuN2)p7UJdvXJhgrg@;rO};7>1aj zf+Gm;YERk4Z0MRjoEJRaXwfj(+9t^lNe(L?IuXhgipf3eT4sW@zCgD_u&igMs!4r*V-5K6^O&KV!6_+Dy zt4tATDlw{dKP`_n9iKU=r$DC0nHe!J1+`@%0XS}u02=Y3M)%J zM^-FJdnMsM&~!(?3A49bz!IStJzIxuEU;4! zS7<$1ozTO|uIFApK31um(R}Sic*Ddsl&-;yQBjA-rw-`&($tWa1m)`U1MRfhiVI57 z#L%7>h1h8UN`@!9?PYjQ5wyHCTS`bvB0p=w?YPXPMe8XFBdKniUm#Uc{@EG^lQ@6S z+3fnI)jd-}C^}O32@t;uV?p?rQp?<<1Y0TSm$#J(Ixd)r7Nd~{0!xtvC)2zY70e|| zxyk77|7@i7y^Wt7IlC=ivZnZ;WwT{*SRgO$39A`do9CH6*C)DKBbST~N7v=k8yGd5 z5YGkmaAA9(r8SqPQn*z%!%XTTE9TTTMOhi?``@E1axu+vi!HPPq7wx^Df>RJj1{Qc zEZS;$rlKy35!jRnvB?(NmMwybiEy?xOyH{@Rv@SY|6oR|VTn{Ji*QUK;nYGD6 z9l%l9ot7-=Hi3g1SvXs41?{Cg(4u-aMrwD3D6L@SnrYn+r zXss|};;U=yFRuPe-c*TAjrU+|S~CEc={gqhl?taaODLNu)-Yke2XWR-w5wE17IKdN zIdS@>N{u>uNW`VD3A@e%;np6+l|3iSW=GM%-zGkzNi>JIT?IZ;JDxV|$(DS0hp@V_q<6|cGO)TS zDi46Gyk^X;8N24-uEe;A;Vk_=UAw=bnP$3ocqK=K*(0(>;0C}%ty3Oz$O1;iE!TgI zN2?XqwG6T!W2(QTU56=;mO8L0B!29b57TayHssN zq<2lVj9AvQ%I*K514?-4gyMDttH78HPO7v1F|A5D^M~aKdz7)hx8$7v_WoMlxV&MI zR52zty0?t3J6-uK8vHZD81nC>(U67Ah-V#}xE9L`+b}xYjCS$VX>}>VW6?d<)}@2B z1DTnpVWnrVp|l6Q(>PG|U;ozuxHZq436#JIH5_FhQ*60} zFsG|B^JT!|pvvz=ByoQo95RXL4LL{n{(br}CwoQ^E9^N6^9y*x<(2Df!IWVLgs&g_ z{;gsATSB~QzihC`*y=n zz-*QUe%Ac<%hjqdyGEu1ZsuCZf3s`(5KtSyOuM~^C^?yNS%__R`|LNRU z2GF&DLHq8b$Ho@Atk6+MOZhs2C5rva|0r@4}PS58d zBU=^ z?bUz)!xB1>TduR_Am0gXKGCDI@%=BpmH8U+{vyse!ahM9A*T zdj^!I&w~HJRoEfoJ?FUp3$7~LzXGi0c^;sD8Brur!@m9(T;<;M16S!pr*}xX`rKv? zOWCai_?l#h!E9CPgjK*tK?;=zuoqAZ7lyi8ikRB!*cQ={+R}w2SC$*5p&mOkCygME z#g+dTTs8RvSIOes8UF{a>hP`>-o+gMfvYI;7yo zBM07+sXcJJ`Ecz6a!M!eUQwv4DCDG5ovKz1t?z&X&pZA{PU1UeqKxa27tf8zOCO%F zXJi)ng*5UrP&~s3hjNW&k{pf1+z+t-9x|<}3vIdnNZI{=r0l%^A7ABvqpODhBW72{ z{O&bz*JDd>k<^lgsRn~0l?C9~j?b}FpT;9^uvyL*DWIm=ke#+=Z||awFJm=Q}nPxWO|tRonK;%HF$s)Vje#b6Yla4Qd8=J|^o$ zgo5xdVXkcmA9S2N7i>{(aCRS?Sc@p192Cnc6-;<8eq`6eg`gb|$rIv$z$;+?A9Na!)MjAd2s6&#g`At!+ zyG(z}F;=hdX6?8sf$UYSo>;=rLU&I7kOt=@WrzVRE!G4A;w8?4H-D*~U1YBj8ALyu zuv=#MCJJ-8Sut$m{wj>5OI+IouvSddKaz#wP3YYhi0VVnSP<5tO1NM_mYjk-o$ge9 zg&`6A`jsMC6LAhDglaL39TWj{7!WS(YkZuh7lu`&qB#&_5Kc}pKV|3z-96^xx}Z!J zSjyTazFx{I#$w!7Z*35ZS5QnhF!x0mlFPu2&l~2Riza!R#imK6Sj@1WHz*W)U~k4K zrrFR5%gaS_D}L9>Df8S35zOQfaqpDW-{rxnTp>UjtPqR0z^Q2Ku9wuy&27$MGcc0J zM@7ITDQN4!Al%;+MUALGi2(0Q=@&^3qxhhFloK3T9qvCRu@RB%` z=<*W(!c5v#s3){XNp1cX)h*`IYbZu?xqaN;$)8=JPESW^R$LOnGnOb)k!#jsa?;6+ z@6&yKK|;ss>@BC~^gLy-G%oE>HfzMcptSMa)>TyX;5(FUknmF37h^O~?(wmwJ(rgD zpFi>UBLyTtJH}i%wnryDiT3RPhcH*R-NZ|(U{yte%?#pW8;tHxI_?09Wy!L$5ly`W-TuJ!CT>L25H02F2 z34(3LX=E`wkB!BcN>~6<_Zc_KGf8GCDoU3SqdR3 z#gd4>6s3*IU;5k?Wqoi|l#J5Dq-_EDwL5dgG#==cb(zVSCe72vVD9y-+M3(dRf++b zNT};;HFPf0jM{mGy%fkC)w3FLMlk}}&(fOy3ot$W#WQ0IPRPq#O0zc$@aGeHn1#*xa321PKKRPl-Hof0R__QuYi>lL|6g>|@uHP@J9H z>@q6kYciXhiS@1QBFVg!>or*9tk2RcD!qf8s2v87%0a1En5(QZv@U$*jH4?WYm2~Q*dIQ9#5|Pfv6-gyd4qA1N`@zW z__B}oXYc7K3&HP6$S?KRhMsa&Pc{MZ*P_6R#`|_!ta@t2o!zDG&ar(&>PL1xcze~? zs~h%UR8!g{?+IHS*^99wo|A`MS$?x8%pn%9$er1)h-Ffk@B3Ob)f$jE%#Pz3TB499 z<*mcTESy6AlZv`bXMg(~7lJI{DJ@w^#4Vl5*(^eYzMDirG(v+lf|XBCS-iAFc)wra z^B)Kvn?w~WZ>sKq{%8cUWj4SSli3avzEpfJjbo57C#AtQo{}a(5GIEz$bE8UDAPJs z{R2;onHFJFp?>_JQ(%u_dPCSq`1Qc>XPlTq8BZ1jy6Bf}y+7AUdC=Qk$D5;-P8?pK zz9-JFL#W@DJ)*Y6wjQJ%aU2DOjB>`gclkTzq6(=b0xHj$g=A6+b<_-6R2B|Y08TF}uF^3( zAO+D~^KQTpfQ`<46AmG@V$Om|M^Ic=+b?DbyK+?HiGPeUV7nN2YY<( z^TS>2ctBXjXChckNtZ$zb9YAe zaxO7Vh{GNt%1vp8ZXT{3_}50XSx0&g;1qG5je;(K>Q}tBm$Lp#XYXAnq?WBH*e?8c z$AhMb{NyXJKjmUA`nugP^?B-c3~4dJijB4-eacET0m5Y$CV9;*?L+h~XwGqeC4BAe z!u#Jx-~4ZeHD#&4$r>^f13n;vbYh8X+HP#KM#4Ga$e1LpcK>+R0*9TbQ$}sel65We z+R-w!iQV&LpVF;b6?8QMI32wT*thNi-zk)z<`>^|i$K4S zY!Nu-4`ELk5#5&9g-7ZUsFr!hc+jy)XZB@|Wk1NCrqGdhi0sthoI3r`Y1fr6_bYG} zBVcD;r+HNCug)tWRt@<{TvW}GOp%YDmN3;C978_g+|QC*ZKo4kM|LfVN=iyGhNmtU z^M?2%$#VY95n`C=(TrIc9t_@0=`wlNn~N4VC1QxzG#frxTdE?f z51kQD7az|k$yGHQIf;+m!=&f$5i-lq=*d<16jYjc4Ie+uR!Q7J)LyXsgKF(rEe0A z5Ick7=a!qki|kG;$I1h=4kj*69E?fpkl5F`vf$4Hm*uzpNn6_nG$5LxFz|e!bB`AI z`~QrDtckD`tD!{;x9w}_(?Gz>eeG$mz^U2}2)4uSk853&V zLM|&^|FiXAeT0q%lyA%2<3>a@hF#fs;pOp(_%Khkz5{z;e;GYpk1SZI1HUkQnLXhT z@=v~IYUGbI0U+%LkCXepf&Tk`{(_Rq%jw6@p7!Hs|9`IUkhlIn9qsp9lLtr%aX^xP z>%zxCB?jQ3Rs{k;2?dcAM1l?PB*^|FX&30TLM>ObYHqfoUhZg$P^}_ZS9lblXx?gjC^FD7hZg}2qlIMWe2~;`s``dGtzp%CT z3|3!v)X^-z;kD`|-1>ZpJtF8h?2@AE^&{xMAo)%X@;e%``;J%Vj=i+QyuJiS={tQ= zqw9^-w!cJ2ZFe}J`u>yln@RfatLA5VRd0W!iv0`^|5yv|-C@P^j{f(R5!kzXt@9BW z>F0DyPp5ah2S;{8hHme8YftwzIPBN%k$L(VTb^~a%uOfL*QwJb9-NoW5wt@T8EK=r zs-q#)iQ=Xy0c@<*{C9b^(5o;5&>$^f2@SqEq`ZU+Z<&ufm#up4Syk%V>URWG)(ku! z@)lhkjSWV28p$n`58s=i(boT)Y?5VWDbFobwN~8tYg$cTe6~<@utH!0@%)SlyeU8f z)jkTGRbOE9BJ#!UW$Dd;p~#a38Dq@pql0b+Pd<73_eGf$!Jg0JtAr4>$u44=zFqjK zPO@BZX{|ajl6+`~=a)%&J;2z>?p1t)LA0fG$yHQ2R3d+3uPNM z1^`>c6f+q`iceqvN_CloP zvCWlRG7?nf$#rtX7Jt?h8sIXzNAyvJ{d6fAh zYd2zg2(HM`n%sB8H%3WI-l7A&`yZ6OV{~QF)-4*_wr$(CZQHiZif!9Q#a6|(?WB@Q z>g{vS`FP)V-@Ci5-S)55+S+rhInc+Ly|0)7#M-g#60S9u>1?$-!A?s_?UvMuP%j^D zb?z=!9f7)#wT~x6h;@#sC!{A#;5G{11ulff7qB@iksa69>cWSbv1+y|zxxNa(IE3P zQM0nFP{StsiL4bDjs!IUTJ0|ej8!^R77%7hlIceGodb_(adc=N_b$8Lj)l$@TT2B!tIv<(Z4%XicF2fcko}{rH{o= zLhtBJXAy4BO<1j+t8R$vQsg5_mQXL^u(fbGCnMcjVzuxQz`<6r!a_@DY2U1ES zCHCj-ZU|;kf8tAnfs?G}vUE+80;LTZu>kQv7&e-UsZ}6Is_n-ZWB;7zHPq^NKapBB zw=YAoampFf z2iixaaP#jTR(K#&SjljuOO8xN9BjwnvXXs+LP%g%w3(0VM@!wLo#GaS(z>I1oasu<#Ej0pT$jxEv8 zaR-)5warDAzvA!`31nt#wN>=#V;?{;Epp$>oVD0}jM7$AXT{?Ow5{u;3v)E}_3DcIuj`Fe;~%B;0gSg)Lo|@Ai-uOWwVTiDFT}CB>-AP-8N~5@}4DGmE2GywI7^ zb-_=~^ZlqzvNIW&=1Be)=S5-1WJV)WAJXa3H+qG&%OkgpY{1kHw#875D}YBr@d`xX zqA3sVARdY~JJEJVN3Io0W2C`2V6=2)4v*?FRCiXM7E2&MjrcKOP?->SV7S=kYmJPW zBqQIdHsYMocm?U0K;NGA(VduNh4?-oVX~DWj)U8|Z@AIk;~qD)`T z7LFXywI#hvwur5X5)51WD+d(9)*1dYj-zS&5nnzK=?0MzqY*Um4a21&u26FL5~z>x zJ+5W;k5=(t3?*JGBR51znZFI7O`JKs-?!QCsHUzH2xYt^ZBpx z)K=&etIw*<7a_~gRBlW4(W_Z1=N;AaLHF=pft8vr&q~myb*T-1^IR{IbY43a#*dAS zmz$={CFtfj11I(W0I0P$CDAX(F#nXY>_`KswI}%Sjh_fWbI;LFkKD+wN98Pir_a$# z{4#fHIWVzfRW>0@P<687hCU;8=IK>lSIk-9IkduG2XJ!Dk0W@&%c!fd0@%@+&B&9I zn&p_TA+UFqeB}ZTvErxLJfb*`bH6}b6b8keT=FkM7jye2G|YJ8M$`JRS|$w40-0W2 z-J`!#+^-uJ+9y1~z;CCxTVk*KCivl^C3k&)@mFA)DiTfa#P*VAw#;bQl~@e2PTN)d z_*u5@ffC--ZOYE@KXxLyn-jmV_o*W8x8z$;PtcVjT zVogUO<()}(V%n`1M6NVe_ZWZ7N6CL z^)(XHKmvv(_GtIQ%ob5mSPE=OlPl3*q#wZKsfEd>hS4?gS<}&N^=JNAhWk{R3$fAA zb-&WIs)OlfLt`()UY`xK{P0F1;Z^h_P%u+2rQOTgdyG2p>G|P&UzI!J86t12{xpuI ztP|0f^>o6;sKtUHMXIQaJsu1(S?ZffUt zhBJHwC8H(5HU75Wjfk z@w|XeO{Hj87a@sQ7TeO1-O`EFv*xFena!kY%UsVG?a&Chk`6V|Eg3$j`=?YprIkP) z5Do3lTN4v)LHH5VO-k)nX-S%4h$+8lR^4z`E$k-Q5w%}h83#y9G{QXyh%2#vRIC!6 zejLmN3jV?}*6&U}8fQ`gg_&4op_zH|S7iN|jb;~|@Y3|>oAORS1f0hz5;RqZ(9oI^ zZ*+I>BN^ULrPbJ~t*b|h43Dv6c6y2i>as~BPb5CZN!d{?Yf70igjCtQOw!+SEHx}d z3FH$6ano^XnnkR=*d18ajq8mQrUavIZ%3I);3z81=x|xjUT_Yh6_pBlq!e$~q1!Tt z1KR*%kdvd#EPHWAo1rY*g(HkTrzEl89JYm)+8{dxV9)nNg&h?@Jku!WY0^T7h``UR zt3vbbU_MOH=lG#P0UY29F0zG@$w9l!U<YMQ zr{nq*okwoPp15LbSWf8p4usnnYK}#?9<(l%3PBoh)!R5w*%x~$Fm7ewzlXs-JV5-t zuom7*!T7gAE_c8_2tfQjHwzud&T56{n}`C#g!U8*6Ul-R;F6!uRD<$ug{{Y$k=v=;^GQ=&c}g_03v4NDM8wlNM1N5n)QRDj9cQI&CTa~av^=aE!&-Zk9qgTp_O|~L)6N( z43RLzD~OhGXNk9kT$->Y>f$%9t>f@3I4+MeHFoL!&bDqdtF5m<6=0{5;e4iEG4b_# z=u3~qEbDj&=3~d1(*Tf&Z%03AD z`;)A~Qe%3jiQ1Wu1v!Qso8MJ+{VrZfDq~>;;v_ z5&GBX2??gAl0SMpVIhFr%`g>>j{$~C(DhJSxpHlu1slbh-TbU!En@8wFo^~L z%_w{TH@Lw6eN*bc@q>paG&ulhI3ofp$QgiX%5T#$ugXAOk)`kf`9iR1y|M}=#Fp?y zjr%^ZS7l6Q(NqZ6#m|&m!LPl%zX6IsyUa)Xc+lfv#FKKi==L)5aPwP)o(uXO3yx`g zG6~efDp@+q#*Av@JWU;AIlW&fe>-Al)&h2tZ1~Ies=lmb`$(tnU8XYwIN&$Z(&v&) zGa)kEoWX#A`2Mfg#^t~C>+)3p*-HjpFH$NJQXXU+fT5SyB8-ZzVy0G4k$^$` zJl$%HyW;p%_OOuuT=Uz9yf1F@96s2#1y ze`cYle9pLyj6Hhc`*|*vNMYFT2*0I5eUO-i7YWyfeLCp$M{vn>{mXV74)Sj%&-eh7 zK>Q>wLJ{Vte^LIDGkcedNr)RdaK6@IvT<>lL|L$}l8Zp-Y zZh{^^VIqpOJh{&endK^4prM&e!K?7YI_4@dg0e)sg0m^GhN;f=fpS8%4W9X%`O>__^h~z9b0yK zE@sXR#Y%wXwYWG^h+&dZL};Q#ktH9FR--YFy6;SLQ6WVwIq*j42?*Gkb7~awFX?7F z%xlVQyh(Le!DR*$E##cH@HP071PfPm73(eVY74`%t22b5aMgijwcH;H0cypJn>vd~ zrnPZzaERLW;$Xy`4~KFoE*0f;Ka++~Y&8BcxRn=^lHDBT5Oah&iJTN~NQS-?Cp^0d zn00^VIdh-N;L)^K`9MyH53e{?uka^blTs}sN9mUD_rw`Hpq9*R&u4+ghdFKInRXcp z*Iq*2LB3g(C`j8dw$cGkEou^yuTRede_XthfuelFcm>1N2tbTEHE{EHb!~y0d_;LH z)+PH`5M2mAb-&1M>{HQ6-=w5Al$@C$o4Ne0cKr)4-gvfaB9o&k9DY_VtR$f<2ijVP zjoo-O%q^2?BMeGf1AP{%3aUhUl%dP!M@`>)MKL};jn2Z9Qok0}@J|_UmM@IRjA+>ZrxhT}#ierzG zW2oh7ys#UbdaDoFdll}A@AZx{i+KL5Z;b8>3SgSj5H5OV^H3M6xpprRU(JijQ4HbY zIaYhYI@WkW-c@x1$YlM9Gzkw$BkHDC^T01ynOG=HN*f)twftd4y}aweJ;$Al!lQCE zx_!l!A}BS=Z47>;o8M*|Kb459n)|VdzEc0F>@qm3p0|jSn=_zIGs}cKt-?Oj(BUU6 z*-lrUog=%PY^?*X&aS6MO>hV!RojlXe;LBROb#p2z__-JqMM^N*;8I0Haef$izZOn zdm54QsJsDZr>fpB?_9QAT#KM4)E^e@7VV$YkQg<{bPc|Yb@h`Ap5jRjSCXcxJX&T9 zPsT{ZNMv<8MwBKdF=LvtGnR*;wWS#z>pJFTS2z))`_|y;`GZb3l^r5Tz$IY3{x@@% zX&E!5bhk4)fG)^nd7@pq24_QbhdZ|@M_(t&Kh;7o#>^319kFlawt~glDY3 z&6>$`?~5F7NwmN_ufEoHeedDDLB7wM#twY}$wA9ACC71II8NSZbX#cluxv6a4uS^~ARWo99Z-g)BU3D3vk0W8FFTrN+D7TFN*Y$HbY_Ll(;T*4@D` z9ZI505ZP3{@-6F96uA_j3iF2Qj5JisdqM|$#UX~{Jm35r_jiqHe}go>N$2hjnZ^Rk z?qYc}4?LZ-{wCCz?N|H}5I76mhy4aJd=T8RttZKX5g1m+BejWO(J|mE*@>!YAZ%kJ zECX97F_i}1mEqfJByeY2%Xp_&<}`-<#cPd#q943uMaBaJ-(#&2wJZA6(-|{;|Mx#p zEzj1IswY*|7dQh#Lonb=^M42tPR6FT#+K&v)(#eq|BMp6FOF*h5D*Ze5FQ>78XgcF z5)k$Ke-?|6)jDQ!)g&MWLq?9TN1oMoW_nxw`f5j-#Uvooj{oR=ZBHEz;e8#`eZhQ% z6#q&7Q@Y6JZ`KwE2ST*+!5!^=@$oIKT{THA2L~4iCjjn5dMT z6RH&l3P>AEmVZx{nTG{0E39;#hP`#omxbOeJhPtO8}P zg&-=a5kfo&R|E=ce0*<)O9$-{rIm-&PP`{Sv4@hY7LYVebGp`Y^LllXe9 z#l)K-&eqFd2sY$w6zSt0wCRr$9b@8$ostMb7C3heeu zi(MzIkaX`Ai}f6(Sv$TS8^Nmam9oy!o8H?I%b6PJS&s;;%?qvy*GSzEPwB4Wk*9?6 z@g;9j^uh--fs7?~2k70>bY?V4N9TwpiQeHf5!dvK%<8J~`QJIr!@qJ@icrI_nKG~u z9EN_PDDuP%w`@C&X>?|LzHgWpL1uB-=4;@EA1J97kD;$H*Qs~&`ZE3*ZfOzCsrE3A z*=kQdsK=&{sb_Ud;~sr;R795+ih->g&MxAn#7ZZDCtYSDdo%NW<|7}i%qre@r(g?J zJZpj7&Q`~8D|VxlQ~xzjn@+LoZ?d4hOch?7W}>0;CnkC6kQBDv6uCWWIIe~*tE~jZ zl3jCvXPZuHP#Cvhhf%&_?=LB)9w)9}xXgXO)Uv9oW}Mug>md})@IZG1`Wtv&#FYFj8@MCGUXD2#ACQ$J)=4sr_%q+G&+zRV=DjqM`I=rfv)5As!jwZvA&-Ru*I?JaX z%x#A7(m9#qjn~FenXo{Nx*$cG;YsL~C%uznC+=gJi-!~S7eD4!^70B;W=U9#Oda>N z-e15W#?eF=^L%C3Fy3h{wq7uHGNGWW?4{nDVplLrOxYjGM|>yWELpHLFeF^`ilm2i znEe40G>`htBCF!p)Lx>65WciFrtahm?K#q%s-EOO1iU2DQlQ+O$09GuMaMasC(df_ z*?xGY@71F^#H;TmGRAl>i~Vz`2PJ?Wa4fVguJry$J2&M4oNwmd2=zBZ*q6eX`;4rY z;@Ia9X4C1k;+Sb>5;J9Me~>pernB_Wo%tVNLMFatvpsUt8q^fy!mOE61GSuNIA5Gn za&)iKS_CNRhpW&=@|_dCcH#8PSQ(`dm}RzAAvB$hjAKS zKLls4phT+)+Ug0#h-j%LRyG~S=6IE~la^aaEzQl=F*JAQ@&&Cb9uoLFsE*fEED3r2 zGX_}psrud|c2%8C{I&eVH_7TVnH^!(hM(On^Q-yA5-k;je&zY{JK4szvbj04$49(pWU?jS)dwIwqmEP-6)7#p?iKkeLHLHWys?L!Q~{SC^+>W#g}cbjQ2 zy{c&XtqTRl2utc%bo?G$;yPoLHa)wg%&}qAgpjhgtL-=Zp zXGq=_hTUv?D7_a4{n19+cq6z@ZoJsB57*=u-+QKgFVNnpNgf#m!N|($cVdXlJZ)E^KGr?c|cY$zs$iGo}BGhvC{Tu6nfrsd@opsC`4QJ>w7{ z{X_grC5BGiE{U!j;sLP9IKt%+aKkt0@mNAVM*8tHAXQpB%=T8vSZ@D3&_>Ez01 z5>YjgDoJI>aeol#)IlR!o1x}0-vsoks_K!z&}aekx4fQ50gOYp_UOIkpEMs?#`<^9 z`s7^n+QX{9!2eMM|0C*?^P|NC!vg_*kpck$W}g4w6NP_^`V!W5ZssmZ#xBP8uK$et zb=uy3XfNo2j2qWvInWz)WJp8EL{k*N7)(T1$1sJzkVvM9_t`h{$Us|or>`BLVj#UV zY;ARYtI_Q104gwb07|;L)>Ru@-J6}w&;C1|t+xQyjl3N>2Ep&7y*tjIM}2p^fp;C= z2eT=PAVR3ShoLX`sfhUzmNG{8eABb8+kW{uj80FzU={xN;_oWVz5Ahz!?9)e=w8wx z8U9Leh9{@Cy*KC%{d2RNoxdpH=3ypPp_)x#vy@D& zLj!HQ<4m5$p$={NYfgT34&9qqGfo`Ox!s#wnLa*KM~0m}oQMc)n+YA!A;}3LWIV)B z5C(TweH9tJ^X@(CuG?k=VD~@s}zj6I0b6< zXxU2xeP(d0babxlL2rst7(?;hqOgHJbeDdRA<39F2p#7Kt|nZ`Yu?d}2FxTwzXN zcvHJ*v~5}Dv0*=oqs7wWwsucqs1-{&ZAU1!=H^1H!p1?F$31OlgXr%@`45+it^DUw zpVs5X#rg}mayjy3mmxFjlq3T7^2W2I%8hFi`Be8BYRiZ$v|3N2o#n~wGofO8k7W!> z*5T?xSqh`3Db@`Uc?xiSiUo_4d?5r_-cKfVUw;#(z%1!>CJ3Ka~} zqqs8ZGtIJC{>(!#$!{cw8+j^=@iRh+y?VWJr>!qV5=W6ps?pMwXD_4=5R`DVykfNk2p5ZYcWcuci1+7$St9# zKXbdKbLY{Kwo!3tt>2(acA)2y|MHM3js25nJ=-^SIXc`T0gdde+D#uHc|t^%f@B{S z*P69BStm-RO?OdyVA=dU)RzoyN-GhbB^MHNsu7yUOsNZc7z3LjWEP555}F+v*E~1! z2^r>eMW$0|42dDtDJd>C$?a@@4enu-0y|@01$)z|1ny@0I%L{x9hldg4>x176K_7L z30rew0U8;4o;(n5uZ>~&q;R4WMe~GE{gb5n1i$Epf}Bysn5TS9^$PNgnztRdEg_p| zvbtMzXoUqZPXLwjB(9UQ>Xzh4+cEYw67TPPcHwGcZa3)8Qa=t4g)V9Xial>?JU^}h z&G_R%#E!JAjy(=-i@r%&{srroSr;bf$H9XO^p^Q{7(RW^#kX-5KM4wx^wGY5o@~SnRw~ndPZm^~rd|T&vldLk8W7 zV_FUI@R2QSu4@UpkD^*!yJFIu(XwO0nF4nAj%9gh)Opt*3hws!s?O{>(Spy$$Mc7} zrrA>g{UejiYUE>{D-0RDTS=mI@iVzRb0wnbb_NmBZe=?V>M?#74DK*XizS)H?v6U~ zl4_in*eJ81)FxDpBo3HfW~KX5Yk!7d(W1NYve=n5|0By5Iymg{C<)N1}U$3G^36JRuu3L_1q5Ne2kN%N1_Am8{1Y!(^z?P{5ugp-#OF1{&XvE0No5P z8`sa{Qa%90%fwhy?wD38F_cwoTD;;Pp~KV%l|2)oJf!F?Y!e?0rA1Pt-IGm^wulEH zd}m(cevu9n89WCNDum3uCM~Lz<(zadf7GlKlj;>Jm4fRtw<+ONh(yRUx?`XEkS`9u z;yc%f{~6dSMS%?A9=;eH%ob5QCRJe7u)?hIy9(o0a7_W1Kapr%S4G9^VDW73)g+aJ zJ}oDa{NkrwzoaQ#GR^3T;VjPB?0jDvu>}ao9Y1->Vh*ow9R!6lD>zN-3CB-9$aJ@Q zxrJIZBUihuYrg~+KOK3T*S@p_=S^EA29zasNBav8*_!tvG-MnA`e4InmA&EfD*UjB z!=xDvdz;0hF2^k|qMEvB`iQm~DCDAgmC13OOX%DbgGd%} zz4NTFtAjp5>p-Z3!;E4;mlwY%K0JCVBumaO+NAt}1@SLtG?@D{PcPId$DT(}KhKRR z`Y+5gHZaS)SIU>nmo7XOE{Zf-F0R`zu8}|a{-jS{v!3S=Fqq`;GAz%Rwh62&-lRRd zqoau+zpTKI1L5MF;YWr9P}ybf0#XYU=!f?Y^lgQ#imTg zKvSQCIqH*O#0r$iQ6fK}@R4j#Mp&vVBXgvzc5xKZ%K{qVq@py=EIk2)*j zBl52o+C8!P7V1ZX)IuWmP3!J%(2z*I{D2g7a@iJ_7 zOIr{`{iQT3f(c{6DpdT+W8(aSov11~r`FUV5D;B$qQiOUgmrZP~4F@$14NEUB`u)WbL(2PUr zPvA_`yPCOMf1FE*eYhzy%ZQfCESXgx6ipIgTBvb26i4phbvdTyYG_L}REi!gXfim$ z;2ygbufjqThS^>CxApx`t8h1r@O&=t@Q)9FF_OCLo0&K7v`s zAU`WlIGSlEMrNEpnMYA0fOg1N$VhmuT-qReZtrXcKyTsV4O|70uy zDE516$Q0`?IU6e#cle~@KSa&&DeBB@SBsBM-_;^ch>ZieR|-(i@6JU51T${c|!cT@AD4)h?{Zk>k;tkA3fL0 zC->_A;}Y275A|bTkx=>xsP`!Pgy=msC(-m{aIcJ|0WJg-CfPaTKF?}-Tgc2nPYidE z4bvYhf^`Cjdu}PEuG9 zlFF?8QvCX21lIvz(1lHL0LI5BFU*yDLDMBcd$eQ)e7RN_E2s?(g{z_JX)nyvuOI-Pd;;=N(0%9ECxW@>~P>5NC65a2HgQp(#jSF-EH_vsG3dz*2*r`x)umZm<6UXGDg(0Hrgh_q@h4VN`Fghm(2=)uxaok!P~_F zux>e_8MtRMQdm+@SWwy@;}FNp%#EPhct#kM{|Zi=#5M2TNG4iUFVd9;Mvr|L1(4}%@;Qe2No`{OCxEHqXBES+ z$WA;6!Jl)2_ig*9d`d)d$p`oOPnw?S22PX{UzYEQACA~5MJjbW!9|BzIWZ9EsA|73 zB11k&w$HZe+TG+k*Ofkt7Nq6qR~stUZ@fgNWpC;KlydZ3J?)MJ_D zq8chkcC`FNar1+8RBmFrDva}l;IOQvgmZn{q!fMWZ(){mX9owxzEtGDpwMv$Bs|t& zP~43s#qUa*_w98?jnZiPV}vxkcrWc3{!7v8h4`h7!hX3})3F~fvkPoe^4NJX&Mn{p z?K&zB4lg;JjVo3;c}^UdphPS?OZ9n>@Q1u>+1|u8Jprk2$Tsz(V5AkscM-MzLh4$y z#kC9~B^6v~!v!&T;$OZV*Mlpz!F1MSXPbp*S4)aiK*P7ai#Kiz21i{klPfFtsg#lQU{pj?dZumM zEw$F%fIwnAB77`38jlSEL13Q-?xh;v>i&`*t{~^(iP$KJ$C?WKtB_fuxd8w1@XW&E zwzTbr0R?~v&garH2nTQFcFUJI=qjq&pOx4)l?R0xjYxEI__TcOr`q~f;UOMRe9Z_J z+&>S}S^q>hyYOUtRuun&L*}$APU8FzKxzhHMcDV+@;?CU;RCGrzfWcS$M#iqGj=n# zH+T3~1L{A#7_kRLfCmJy2ZXQ$#OX*XngoO^{68I6?ntlO*M4&GOs|`*e8GQdw#B3_ zH;;tK`H!cj?k59W-u80uKinH-yw&xkUb5a}N;F#-X$x0tAy-=^*f|0GEET}_9WJ9} zMrBK&IhQ*@SeBoWr>A0+v9P3){vH>kre*IM!Rf(v0=0{31g%IeTs~aPMX}{Ar0ooO zl8sGP-C=PJnnMy>t%r0$Aq^!F_Qk>mThO1MAd1}k{qO!R&IAKP0s;dT3VfoXPf09sd~BaSYP|#i!%K|BLtQ#W%TkH%ESpF#Yw$m-VSX>ut7I+u-XhJ_8tUvv{cBJDev0Cm5g%!HrLn5CJY#@HE|-ONmn=8|hk#8q}Xc@b+;D{Ho36}e?=($LB< z3K}Q3z1cIX&)AQJ^vquk7dko}<*mx|%yrZ zUxtR`}~N)HLuwqv>< zM3wt(I*?7u@!Ja+gRwcpx@Vwz8*UsYxx9f}o14x_o${fWde-v9!A9iB!uBBhY7Bjw zbk&;raVT6=d=g49@AR+U8PKKDFffMPR-q_@_Y%{f;V!*7!19z++ypNJu-a4L5= zr9JCGGWObY>_iTc*+;pv%IoS4>*j0#)V}wGxBDTc5KlLvu_?ld1}pPilgEBgFV^<4 zr654TqetF*qrV*iqrV*n!NB*?+=@1Y(O)^d@+Jr{&dH5lEmRzW^%EV%()5Qh*1W^? z%YfOk!6`h36ji`UVg*W!t*QCp&&!-wDsUOQnAuO8uuQ*4#5f-60uH`+Xp=(PZMpJG z&L?2)w&uBTavt#3z2BZn_%)#KX+D7RF&;(I1cVVzch(<*{}CHid?2B9Wd5s0XOvW7 zDCllRSEV(^eXs`eTl>>bJTCkg9=nDnAR#Uvx+AttP^ z&2!Rrdt{#cx|W{q2$Lot+OX=KJ)q;j@O2d> zp~;8sqMi#M#59^llcs@AzP9|!nq(V;Rts;&5dK@@CM||O*j?T204?^6d&d}qMYP3a ze~%8*G+KtOL4$s6%HQ!LWVGp5mD9A#^O?pd?I>x{Wup^jeZPU`2G^@Vc%gX#OaK*<7oLOO^shSgvPHj? z`%IIawo(t!GaB}pV%=lF#BlkDBg{q{(e(i1wk)liGu?t^n1BdK!{xzl$@O&7XK3If z-#X=@Ttz?I^)%$sPq?9J=sJL=2;nMWV}C03qE=JEs_aKOoImy<=&f^h%VMDZ0QpCJ z)bN3GH|{DRbCun9bpgf4f~4$eYL(JG379VqKI_Gi<$I7#cKy{ZA-WbpH~j#v+&!I1 zP^aKyy{ejBwx|9|1c^ZjE=m zA>7VKiG+M%P zz2p~Gp?t7A)5wQiR9k~X?X;3cV-d)93GudR*eB7!E9x!K0RoHFIPCuG$-#eIzkQVJ z3kH;+-mG? z<-Oq3cCrpBcwBu@$oIdCenZ$4;y55Jyzrf^k4F?1gkFbY!Ol3QyrY)6qT?UYFS4{h zIYQ?}t6w82?|SEnz#nRht;uhXDyJ%v0?yMEB#B=ej1n{---=)NMf-!OBE2FMgN#L= zq3}FVy&keW^rhu?<|2wwa2GXvB;Kq>nL}o}>x+2=d5e#=KS%3eXOqxT_)jYP4Jz~^Ht|ox- zD4XDj`CD6tHb-UyL}$`lXEMM$S?AOHHe>n+U2#t;pAI+~JRbw`3)c6w|k zzjA9eYtOTc%5mLHXI%HfheBgFce!R`Nq;Xu5YTktMl{s z4Z;(zyAm#O-h|`fo;!!LUEkg5&xfZcPM|a8YaujD)XuPJ7zEnRY$3uiugS{JvANoq zKAL(;s~l5*z0sf;=v{?sEH&oQt=<@7bWSf{)j|5;`ku06ZK_?p3CwZInLnvQXQgL6 z0bU&#wOnmZ`a-nt{i-?7*DLCl>ienM2-Onq{x4mYsTuK@vUAyehd8*}!@4QsVBMUs za*2XkjWCE$AboY^L#bJYnbdLsMYq{gOU}5m4Q$|(tQLdTnuH(+hArFngN=aE#-Z#h z&B_oKK2C?ZQ~KZ}$*n8;ehXjs{7I?u_AHz{xb(^*hNYK0lfLfrWs7U^M7o#}I)3B{ z^1rtnZGAM|*s1o8bM;+tyR}F!uJ_Me-NiGVlf6Yz~np8h*UBYf$AK z`Wa~1l>od$e%Cj-%44P`t9i|iB>A}1PF8KVL6db0n^QIlnznLnY7RaFa;FQKX(|&3 z;h|5kwkT)|<`$~-FQLw`b0*GWCPq*MD3=sv2MXA-pZW4b)+)J2!Ez(!r>>v+CqRVA zjSa5RTQRn)QS9tMW0HNMK3{(AsarK8p^(4^%f#?ZLjlahobmpzNn2~@b*kv0(LP}) zw4N0|<8Rf3wjK*zTNE3^9^K^Z>Aa$f!o=N7ulj;WNGSxi6C+iGrV#`Rg!A2bNnsy2 ze6ElZBrJ*>DCut$_$b8n2mGY9QfNF=yNe#NhjHg(?7;l{_3VX`3&kjZ$>+A(UpNI| zgc)%nF}5iM3eg%8orzE{2Anyy3*;4A*|2Sgs<=X1W{)+^PVOEs#m-(5qVnIP z@*In#-8I$jQf)HSdQ3k6aam;tb#+(8=FC&%!>VP#e zEZu?@<0><)Bf=4+?~IWKOa#~)T_y|$WWW}^ZClu@z&*7uBA@Pq!N2W4(>MIX{p1QZ ztOWuV!4Tkr{>PI3pMFOIFqP=&@-Md&pZvc{`iQ?5)HsT5`HAYtcIw->cW90=k})u8 zAsN=)%kt=krQG`y+&hn%k}K>^|AO-q1k8H0Vg?@ge~6X^Q;PZ@JM z(n&5P1EtS zk|TFLP@l-gRr)K$=Tz~(&VNS3Nj63CyyCL|lBa(uO)w=XR*=Y3z5A~*B&B^r2@_Dw zKLL#RKUVbrG~z!>(SKuhEK}WbSOUN@Ii1cZdMGeO)N5JsNwC$T z9}AIF&Kk23@%VU@3yg=@KafN!2?tOO!!p}qV4#4DlPx{x=4P@UtWKZS5-EW=jLn_V zW3kVvETnW*8cUC|LDt;27n+8YIP)?{9wFpC?R*9&@bDE4q?T~AkC>uB7=N5D8KV1+ zeN_@uAisHAja9nxox(+j@`!#UQHC=X(?^(hz=9|W?x|!-t%BCr2Ajs! zY54FvO$c{SU-la?TK4~V%66kf6)>JCNNV>Ly%mR}4K)7cTwr`fS#kH({@u41zURYa z7H}^;tH-UbzDlzaI`*4Ipwxo*)nILx*Ns5%>bmt!7jEl}awW8p(NA*>Rg_eXOJ2pc z72o%4p$WfY*WqH_X#G!t8QgRr!gRx8a;deoR)3|0gmoC>K%sB`0+RG%&=h22isFW+ zRIj?>BR^Z+7tUr1Ryow%=si5jh%0z(rYN$lRt0Z#?8pxlzH3;QQc9^uGKf}x{EP)P z$lvrM?bB$8R#XdJaw;UT27>;Tr0-WJ-0&q6|@BA+R zLW};>yQSplXlHJw1xQld98Den1pwx0=z5~6qkSu6yGijZD9Oa0s0@-=>tIz^8WoWs zTQQY|FUNQVFHK7OZcfT&W-YJcDt?0&c)Qb!hquWf6L{T=V}9f;`%{P}mve|WYs}AZ zTN?KFy>+}jU+g6o0C5FxIbRQ5fOR`lyeht{N}AeuQwmRSfbEWUfw6coDop=I&>I+K zP{}_ZFqf+~rwOL*td2Wom!rG~wqWzCJirmv!=OvbXs50f+q#v&LG+G+^jZbt&O5E`je)Un-M0s?h0<}Nq`fR(u+H;Th(V?&9akR+Ch`1 zV<4kb`Jv4GxKy%>tgq7~w4xnu(gHXl{{>s0T5$TZiDF}^t}!vG%*$Zz|KaN$gDVZ% zw%wUzl1yx_U}D>LGO=wNE4IyvZQHi(iESqEYYZ_C-_i{<-y$e22GCmePw^61R`9Jpf#;Z``?#Z%hw$CK zWXHL=Aazi?B;4Uj?IYp4TjaW^rh}u@2knf z-%+U8xgTE2ST3QH@cEgUI!MKq#H@uWe+!Yvw~{ag)^=Ld>ts}1#~UbqC%gr;m$;&8 z2X#}>>b1g^C{{&V;{#aL6xM=a=T$(SOC|GXR>~Ntu z)cCLVjmZOohGy&^Ewf_2ER(rDEHi$_iqV{F7Qb$d2&&#JT7=>iJg(#rdA~^^5_pIG zZU@*PB1ttsnad$AIOO~w;t;SRSo{8nYItGhR7)^B=J&Y{ssM9 zCvLpZR~I&GxY-8V=T)iF{NauE2y7=P<5VTDnOi>>gp{3q6{CGvxL5v%;)O{l12#Sc zNF_y9vAHUaK3vD&l*}&>t&M!yM9}TRB!v(1L)hb@O8F3ZGokk*5X-14^UiIR2yq6& zmixo@(HKLz3EjB=5DevglM159Cd_9hx>kD*z+%HU9E-mo?Tp>%`TvgGZW33c4uXGx zUh>;F(*OP8^uNfm7PQxb=%ep7=@h+;?<~p>Xa_V(c@LNXACow!1_UzdY~W{-x-$&|bXeG2dnE zPi3%QKTk`09j0W-f%js)EV0^iN?y}Gflz0%wiLhB^}yHbS07{ z6e|p}U_H`V;4qi=9pKekd!r+@wf7T@i(u9AwxPeK{XSQ64Fm>qC)ZEG0t zGnjeQ#hG{#j#o8&8y0+K9euIFy74B-`)?)7vi`2dh?}sRPN{Go9)ssB`Z-7yW zRNI5^?JM2|Nk0|-w95EhBsy?Or|uWYvauT=x>CL?i%HX`DuKZXObO`$_F1(4e)gsU z&l%o~znBAIWB!HNo-y_F_hin+$w@e%Jbmt*^%dmmq{x|R1Ce@hg6s8FYzXv=Hzis> zhuGg211_GM0rS#F+lwGxb`Fs6%kyY3!Tz<$0RhR2$bg(qEy9!JZ5m0A)NOExp5?Rn zDX?wQwJpSVytf8qD)CvltEX*G=|f8ZUw>q$ZU5be+Sxa${W|lx3-&9-*LC-67xDBN z@x4U;H6`S03B*s=DsccRICvv{84HIZ+0Naap=*Wrode~<+G5IR$^8-hJ;)O$gVOQ0 zNMi4gNCH<0fJK*M282w0;1GyP;3UlT;1no@Q=QljSGG`89ZJGGg*;OtW&BudXGr$Y0jdDFA4j3B2ERpZYV%qRY@XqKftTZk)iv~Vhhhb6 zd$5uz&_8(rX_@r3oisZ-N0=y@flre-+ZvFl)Z(K%HMd+nj5EuupkeT7ES<6x04iu$;O3r}IORAk^MqGov%RDZaN)-Ijv?ZCertd}>6 zt3LPRCH55Dr($X)q=t9wSMq37osH((z|Fuwfm_1>S$}%(|DaM4qu68a&rfDWw!5TK zH6MyeWzrpCgeUA-cxWakvbw@!UyqWn?K>c(hmMZR0t!XbL>DAP3XZBg6N!yh9Mq2Q z;5lhj>wDB<7zo?~7gB)Kv9qd7{t&v!x-Q44_8m-Zjbcisy!%UqWOJ3+ocR^4J{SpF zmk)1eoybO(xz(BILnAq6*hM$_PX{h^Y%E;n`9RaEISK@NZEda!n%6#SyakJ%U_uur zCEA9CXxP26dm^;jit@jO7iSm#?xHty2l) z3=#S(y}f?U+SXyN)@{gja8aZw+)Pco^-k&@f$e7^R;|mu$_PSU()JpuywW6FBP&Cs zpmt(G^cXkrV+RiPsfh)myr#WEBr&{tIbjaAA)jPO08Tnsw`NUw*fy2s?s@J|xL|Pf z#!Li;?Ye>L96Cz-5yUZ0g|`7R&?WQNIJh-KUa^?2^Sd-}6&4C?AV*~IT=uawxk)$WVgp!W zOd`sqH`^Dj;KS(%=A~Th=tHv7Bt@UAfB{Im^&Ju?+UtfTxGRgM{HF_9$0797o97<} z(pQ9Xw92CsWF}g~KCw$dD+j{k#Ya^PI7p^nHM`*b|I8FyPT}%Qs{ab*GV2#N;Pd1f zRlFw(A;EQ{LmFO6sep+;sn?-v=WtYT@v;*VWo4s8c-l*Ko8uMiy{08ObO@w>U@sj+1q+3!4L$HlU@H)DjBkL-$eOKdE-kF2`5l9{*J~@MGf>G_ zGV3aTQAY31qQ}Q#u8iW(q|2OoPGdo8Wl^~P4GjB@3Wc}cZOAgBP?1ktei$W`n!V2V z2Ondbn08NRH!{-*OVBB^e&C8yqtY<25}Ga8G8&sNd_T=b8g1++9$&wa^9tt zcOX*H16p@!7hS@KdaNS86SC$UMAlg}z+EdB`lL_LKWqET5|7UhkrgLTi7wih_jgE? z(=*0rxe=FFfkL+Ii*l|KAvz<*Z}?55S62iuXR2Z&7M!95^SvqD_{QV>)8VtShKUKG zykBqCjKxm%fm9Brv9+_?VHfSW$kPZvh*x)uhllkkh8v~*g^R=I~D-HEhUrNCYFJ?L?nWc(sB?Jz^0(18Fx7i6A5oaDrx;F;xfq$i)OrvHAt5dP8 zRrsM3Mpo5;oV_2=e%&u^3k1XWNO(ZjrN1+9PE|m+n=ZK2RSh1E^BvGtDWl&<{Y2q# zwYg+xNpYYfl_{)?zIG+^Id=R)C{E8n}fz zu>LE3T*H)$Aq`+MD8scW4Pb2-Es<%|2wOaHs;De}M#}1vZ5cypuH7zLkKU!>kxLL8_?Zi)DQ{_!T zW%42tm5;5PlN0D$8pdnW;D+2>t9N?;jkk18n2T4s2ZNHgKbz-)lC&KPXltmMFr#M% zLJ84yG+p)pA0JP_UhOkMuA%QW?H}<+Iq$t#fq=!*bs(+mw$KC+CNX;r5TN9weZRv{u$c3r3pu1?(_TDyQVSi&!6CN7o+0Zf(Tt}8n|=)GuXivj zK>K?+%P2wLp{OgxDYO(l0NNl4qs9K=%Cw^FdQQ`^@r+-tc=dBl1!#X0TvBgKua+u& zb%f<|=z>K#afuE+{WAoo6SN-2Y5c!N>VvXebgNk(KAV7FCAM zYT|{F#_q~z=1$p2T>=jiDO%swQZt&Vqobps>%2E#UtYFAHC{}NRtR=*`BRp`u1c0^ zN!9&Og3zWZoQ3&0YLjiG^=cEIe0|o5lUJl>C%;lvR;RJC*bBO56B}Ag>uss!yo~GJo`n~?e)a2pa-Jz!_TlCp!W@oT&T-{3SY~vYL{f;PCTnNIIZ2WKngx@4eF51|X z)w?mc?SMByy|EL}L$9VR*7{-ZtQMyX*&r;I^-V{32q%Z1$djM140o-)7$t}pi|TH| zrUbigG4O7sn%HGt+}zW)O+9V_bAU1Yiax?l#Fn~qmug>Hx0N@SDU@D&)4Wz?wbR-8 zr&7YE8|n1&A+v;HN^35!$La4h@1NXLX*TSiS3xT3u>#_*AD=Yb?|r*E*bT=nZdOCE zPL>Fhj;XQJgw9PiSQT6iq3S);ivm9DARZx$_h;Gdtq#NDk1220IH5Gc`FOj6zY~1ZpyhuGkO*L*cE?H4gygVwbIR1$`2r_e? zBQJZ##f6OicI{)(GMnxU-U|*@`z15S)7g-c()xx})N8vxDdzqH-?GU|d@oho5u`@} zcVTV|RQsO4Q3rT+i;(JYLPKr;x|rL=lf#Jbt1G-@;rj&XW}}ft!&`N8tx^e0t+kM0 zl{5DgdlGM%=+<#QWY7jf#^ZgpKXGG2;}DdK{~iE1%!#{Id3;Gc#Q2`nX1nz}MX?1cHP3Nw_pM(=e7Aw=E6D~~P^b>u@@ zkK?sVp!#S?#|m61el^!ip5*4Yx;ZswEX;63_q>(1Go$VrhFEE9c|8n z-J%?r)%gZ8RBAc=ZhetiLJa9uV!-;D9kQ7VKB`4hLNXIaV}8pQ*ySob1&mY{rJIFa^2g#^3;*pjrsJ!S3=Mmn)$fb9=l^C>x<}zQ0t#% zb$-_jeze;B{cxA9_HebupO=230e-%4o-jQ5*u^%`$--44o-mwFBDPa!*73$=bOTZY zf;)Ga?4%BMLwl|RJJTIveK)MU^S%Fa){J__IFR3-3%;HsYs675*oh)ITOP8@0Mczo z1nUR00mWoMoIMJfASo`a3Il@a07>cu?VSN7%{Oq2esXETnFD;j;F-jzvt7sMfMv2G z`Zkdbtw8?%9Jj5S)@J%yL3KDb_|M8dy=Q`6C-`nvrkCOP@JNfb*6Xq_>a>GH%+7C` zg3PTnbtGYiOvVoF&kQ1UKVFb}D&qqpBz3wNN~yF0mgF9_yRiMt1%Mn)mqU9UFL##s!Ts<#5bA2V!$)|W(#QJuDo!{iz9eEHE`pHuFffxRn zC{qQz2m@DvhGU`IP{e4v$QBWx{Xgqq#8w#VyfH!8Fq4q6k0b|80-yb+>KAn8#98am z(Y*4rV8IGRn`vRo@`&R2WQ;XIS0jQu|o=xqHJbnYCaUEMf~nRUfn`zGo_2Pf(_ zcMn&l-LMxR=#3D=Q~oVYtjRkY`++}O2Fxk(VrOCYNw8yQ!AL#zg~E$Rr5h7fA`xh; zgC%}u7$_Uu8dzAa7+a}pO26PorajZ!gO!xjJ?*xC=MiC3qq6y#u+<5^_u`=$Y zEtLV^p7Wq_^m$Wk1AlEyy@1<8&S33vAelDA)G~(da;ryM)IuJ9J=hOuq{5r+GpL6a z?BZrZAMbf_AO_m=g>dr2(hZ*P5N(XUT-rnP!2#^4wIk#POr8<6V{-b?pHa2Lp>|;$ zdKX!cs`K(PkNX~25NvZL?1`rWGESUY({S{OZTz%OV5VzAr|!RPNX9yBfwe5)w+8b0 zai4m&rhI}wt=8}OtlJ-bq8`TTbXK2EK0W0EYq~+~x{;77PMGg_pNR82Xzky9{Cxca zN7AY+_H6QHqowqyN{$*$2KbYd&JDO>K8K8KX1AA6Kc|c?$LG)mmgwz?-ss^!3;JSv z{FZ6VYkm1!#o_S)A5X+l+%c!`KcJ)u%qomy+*G}WyoHM1f~Xd@sP8nEi>(9pNpduk z)a1js^)+D=9R$onE>Ju>U(suiD7)@gT7*|^7bFYNFor2s(gve2IN}N<)JSf#gBocW zepw(Yuq-?)%IuyDqs6Q%$}%=bQa0L3=M|+JLM2}NX>fDS)|IOvUHFZwsvDrjNHp6i-2zvBLUC4Wco>|bAj+UoPK zMGWotK7CO2xd!%*A z){um1yLV|ERL*y=lB~61YuZUuabKBdbi$8Y%xX#LXoqfL<{0@@}*J zV<;*WgP~fTLfsORMw7;)2M+_bd<{aXawY*=k5yPsr2$XYAa^mOFb2a7%-3|O$29eg z_TK1(DRGE5U1!?Kg=z6ZcWrk50!uR;Pgts9e>NWcggo`ikg;`Tten;Sysa5Z?g@)o z80M&cIE%`X%xVP=@rbtC%>^@axRSQ&pd7!-o=XTF3W2_#3~MCVWE4iBA{PY?HCMR> z3QkavUH}nV`T@oA9;{Dt0vdyjz^gkKU3Cx{8%tcI_)j+9;++yQ&DW}?zDW|xWx(1{ zREJtqKn^$B(Y1HwU|i4g{z^2uX-mj>=a9;b17`s`*iQ&<&YjfZBz+$y2m&V;2dsDw zkzd3Zj$yj33B++4O$qz)7Hw6tBo|djvUC*-I2K$9x%TvdJ1AB5|M~|4^|)!jM90xa zYN0)Dj*%#_k37#wD(#!^04WTSuHJ55L9-@RfB z^0DV78%;Y0aGjB1W<031qwL$w=QlZiO5rZ4CYcvUNoC@fkRCoLDjMqQ#nVyW6t?t} z4$`8Ai14$AxzXA9Pry}6==ttn?!>U^&;j}<&2J5^j2yGcy}7mfqM~Vl?%K5Whmkv= zRu@lgQUph=NPQ^nMHsd9!mspq%w3k)rR=%{6f9;5vgtM6Tdg!NenI1|P0ZGs)$hw5 zxZFGKy!L%prs|XcAUBQt8zI05YlQoiYu-KBTO`{XFLvOe%05u1IRGdf+F#4q9M;;w?#Kal;|wSXXRdmNy*>ydhjT70CINYz9kn^d|JBO_e;p9d#3se+ zqyTzP4bVDpA}nDh>y%k*4zuAMR^|TI+@K2n^&xgxv+I^QN(Us8Rd_M|*I^zATlp@8 zBaCX!q%8n2XSUgWhsv;>2m%0ut2R{o_;UN%#1Ao7ZR31NDA|>fExpu#(p=WCadh^+EFSg}f;k$sYv)R*beLKaXtx?n+#I=jM>U z7}f>B1$L&~{5)!>_X-u?GrtHODS(o?q2NJ=+BxMwQmd5}X8_O-61s8XM=v}2tw#;q zAmH{{jSsvrU}n^X;e9e*e2VV^qz}1yFc5dJ&O(hWe&EX$*yBd`g|mDopEJ&sRs#J< z4_7)N$rM{um(-;x;K~%FwkNac)o@}}oi(j2q*WJn)n{ehxAs6fo+nlp_O$1_916at zqRWrHL3>5b7USPJZ6xSo!-Ll%TUzrl$hzdvwgtrUt;1=XXobNyCot-BV*+e2cd?r@ z7>qlh2AcJZL|(4cc78&B`;a$VE$m~#^5l;G#2BJ8@!D1OIKLHwtZR`eOOknLa+(~N5@GuU7-_+K%8CFf$(bOJA55XTFe<8ZG z23$WX_`3%Ocvu9#=~Lg_94a`>#6S4NmTDxGf;>W|=71aG90WuGfA92=;5P$~Qxi*{ z=+yCVzol{wZ;IJy(Abl3q z=!8FSf6!H2`v+9bx5ls*;Yv(f#F5esqQcq!{t-74#*c(w#i8c4g`YMvJFT4D*6Kw{ zb8~0!7c+GtE{Kh06jAws-5D0C{zMl7r#+M37KGX9Z*!tZ(LbTjr#r21O4W*A72$8__3?|<=eS5cwFHNVkLjyR4r`{`{mzrw(t4|*#0IEp)i$B~LzoyY zsQj%mF&@GX%^K%gLWx4sKLC@kL0&&GqK#p6f3%0-b;wer*MSxk6fqi$k>1x7{g~^v z#?%JK(zi$eBYmOxYh@^LMaQ20&YRwDyGx-5k$Ghue5)6wBaYMs^?o=*LxZiJy)Bq` zh>Xw4I>go1+%aHXf%H1KOgi`lQ|)WufHG=!MM`lmpi|Z z@1X!o^*ge|ta5c@Bv?EoRK47?G(n49Zc-5#ixowr&D{-8Gyu^SkF2*&#l zm)(+DO#VRj8%I7cAN2KW_b3<=MNT(4Iwe^#7oeWC-P5jeW^qt^tkIVf>5{j42s1~y z`UqR(uzWG0rxuLnv|wvcpx^U6>LOXJF+c9H{L{oxEq5K1$hxnw*(AQJ>0kX_aZXkT z-QXm~x2P;xm^C~g&l0j()(X|SVf%>gDqPG_pxyWi*h0Iy-Sj#RYSF1v_Yr50zx8`^ z)|6geYT&*4d-lirwtAYc-`F!ELgZJFl>=5ss^hv^D51`OjxRgw%#!RAdMVc6Jx*;3=C! zN)9y~q6oY+Hg;I>y@GIfIy?i}N$_|==c+hc=i>!uyzslMn9UzeYuE8(h7c1Zw>bpw zmEC?SOF#=jbHV@4Az~`)bH_NfjC4}f^`U+b$wl4kY_S<^`1=7-I`736gLRXwbTDq@ zUx|R(&zu>1wCkxXM=qROvZHa;nGv!>BF-giI_TYxh8X%;VzGyY=q>1*N8dM40;VsW zHiW-6%<-!B>_^2LqV+OE^MRqKQnU;|YToK^MojJ5>u$w=Cu07`o_E7X^fvrYk;(8+boD>K{@Ynwn;1D+ z*xCMH^3)>b3E6c4G+uB*i~bIt*PV~V(|kGEFg@O zPX#QWU#!rEbn%`Ei4w-r4feL<(FQlp_Qq!yWNqLS*b>NBQc4@d4_fHP@YK2%fU zIU96t9?2hk@2!?|cbK0P*H6mnz%!$hAEy?(+4&J|PK(#~NXV30=`<`=>H5Y0O3(g}G&iA+ zF5u>0v)blANhjt1Ci0}acT5jol}6yHZ;lVZC$UrRDI{QA>oL0og*FjKmT8ky;gK%@?I`i87bDFc~EqL4K7R8UvqYDO{J}D3H zi{$fDA0n6hJ*x$val;DP2fjc z#Nl&rgyOqmUyX9*pp?*O4SFY$st>WMPsL6;480(sVN&UD!juS%&VypZZpH8n$<4wr zt(IJBrQa%by1%fMtN#oS&+?$VF7PzRA5k~<%AixRDHUb#fSsBoVa&tZw$I5#qP367 zsKBUn09A@`G%ND~^c^=r8OezS@yS$;(s>ywUVuidGr`V}WU41pK zL0!GBc9)PpJj`aEJh#EtO8D~}XfPK)HZ zk)QCZiF2uO3}9ldCiy0M^b2o@=j+mnrqt0;Vh@b`yUEtY;kiDO1n^C8<0jkcER%yn z$X}_lpnKdKg1eTWkGKKaz;Ja6hty?^YS75O2TkAFV22R!>$f^0iaCGe3RXlAN(OYt znHjTz>%~{ll6YqT^Vh`(=-InZ7(oF?bJv59_Nq>+wRCHANsCvRA zD0oqz?P`}#q@-_lX5vK$1jbFY|Ehj7@}H9>Mu8(e7^cNz4#*QG|9Kf)@Fw%Z+gJ^a=zrSzbuZw}wYAU1g>$>A!IR90W--%0t zdIL>rSST*9Tl=D3e={8PW0*VRmG2!R({+Wg&`VOJot?S$*93n^Q7#wi495dj~j)Cs#^W6m8+n* zwRq7RWT6MRw|RJ#=+n7c{@f?=)Gmra3B7)kzL8~3vnTPioXi(~3X{+=<*VOvMK^407)3CtG+13S2Odgkc)Cib|>+i&i;8l3XCckCS zFWtZPXpHdt{~9Pb$k5gb=S%nZ}E|F|H zZPaPcVO1V2nL}7B+XZ^bUqqxGYUklcdz8faIZ7~Q;se24 zYsB8nIn}DjUT%eAvf}46G52xsa+i^8#~aGrdnJ$EFR7xhik2OgwN(Ht z_ii?WzyFRiRfHZU)DxL`ic>#7!(aAw*aTCw!W3e8k})_`X+ z<~N{Gvz2895E1)=>aReUzB{h&bXmOSqWX=XPp>|UngypIObk-g{g%df-`pv&m4-Lg zj5PxF_;8vS8gLoJ-W=na0F)6TjvwMcU)$@^tRrWzKVSgl!fu z?zhTIdW=s|jbBUgoS1r-$J2A)W;TS}!lSN}=hyMZm8#5O;Nr1!6a{RI2!#sm$><0+ z|E!b!AhGohZIHEgirVa`Pa?FsX-YTWzx@tgvF8fN$yXED^}QWB2OGeal;c5n9P6%cmKz^{T% zQl4ab=$qb)8+DDBNU|CqDLA@{VeRoT>ANRVjZyXT-6p`TE45|YCLglSNN`?@bgq#B{|v5c!Ge5)wDoh8 zI}dw|J5MRD6IHYAnU?27I7K9T zMs0`gu^4fpmRVS6+%Z-{Q*)S}U_?uukkHak4;rd`A(j6^gCRU(f~~O3x+h4}SaDTQ z{^rML)biH`2Ju$rUPsTL;qIhU{E>B8ml|S>!PQEc8gOMo`J0* zE3!Heku8>2LS%N^=D)B1356=`S$kBbx&tLUUfZQwG$v$mpNk0)Zqi(67V!zQ~R90 z0s*sCvE%&<;yT60bFIEK6bK=^$Wk66n#yE&kR{@5JNkjGTUl?SRyV`fd)}``Km*rC zhN&?VNMnt`=>|EYK3XMB%pnP&3?FLa$csv(Y)ZI=<6}{(Aw}?@of-m66fB3j7r=Bq zJ8`4Br-9%8YXA{H7C0I>kv`CbI?!^68#xyEq~@_A9N`=o46$mKPl7wJpdol3t9b5osk6ghgIF}xuT^JkBr1_bylyI4uOV{WtoM6JY>(kIU01D^ zN;5d56o+XHXZ+6f(bf7atNmLXNOAT)Qpc+-ukibk`da7CJ0Yq4MwaDwL zMywz}L|mL+o?Y2=?#QZZHO&*Sp=_7>%*;6^q|**N(?GIpaa6m|rcU&E47=Jyg}U^N zO*4}^w=Fu1f$WZmoPo^&x>!39k&Cq9@nP{s629lq0(WpXk&BV9 z-rb%0A-1{fUN*VHsZDo)KZy&_UbaApiFwAhZ{cJ$VepTc-2&QU+s=)93B!e9(1#L- zKrM{_>BeCu!_KARB%nA1)fT%%1|V(&n}D|?5M8gfptK^vT~7{Nq(UG!L8Uf~!F$H# zn`tE?Ii#pA^MP=N>CTlfD}-4tp)tGYL@?_lYnnenM-@)sq$dGhuXdYSNt+8}HXlbp z=NJj*m{sWR9MdxmZ8HvS7XawjFr4pHWp01}VsbCBS(jaJ&f>uh>wik!P_Iru`|gP3 zMu@Ie-Z;tmP;TUj&ic+1{e5e<=8%MkBlt~wXHP?Yw5|8GEk7C!$N!6v2_kuRPCP2+5nYR!V7Z3mZhrdJwlR>fgt%6%U~VxC||?%K4K8e{$Cl@(Tu z<_yPAQP>WddGMs{M-rlvs`O8wHCGDwDos`|cY8O9TSAsL;?T zkswHfgXwmxSYhz}LWL&r1p;AxxtYH*bM&qWzS+a?Q$>~AOXT7)oxWOO zETBhY`|ldJZ_M&K6Hy6`BvE4S!uw;4XP03z7Fd3zN}bh>t~8L08yW0n>8-<*Q{}A~ znn%IElep{=t&7I=0Jp%JOSG;^8C=Q>9L7W_mVY3SEqH=~-%l!?NoD`U*}VBPAw7bz z5@uGx^QeAyD_<+np$C00{S{V@%N$?Mq@|<+wJ42a7i}iT@>AJVIH@0PBSIj>tffsF zqhC&AGH4Jsm+6pECK5^&$^7<06r?lVsG??~Shfw%KBkm2)mFa1qSmTNPRj7=3MB5! z`?~r(u}P(;{_!(W!25%#8q(z3L7vG_y`@G&rLb@VH0>0d6HCYJ!iCmm++pu)X!1xh zd2&gzSp>%%=cknY&Hv9$m|d+-DE7~#`t%QO{m)L-|MTDchiCjhPSvVJ9lHfptdXx0 z;2ue#j5(|mL+&ixTHjB*LlXuza$q2#i~0qIWL(I(`rj<0&`z}03>Lm`C~w~q1lDNb zf{HDK5_TdgB=*67^+5@&RhRI}MI1;Qu1ys_Kl%C`NXTav;$~G%PhR*s+`qjLv2aA6r_TyR%_c7478SS;pG?!KD z(_h7Nsu+XS{=Ie|V%e#s1BJ~P%_NbDLU>A_y4i#wR1(rmFkyYX1kH=PRh2=g;ka_r zy?R@I{jxTzj}zY|TfyW6E>OWpTi%YL17`^sq}Mu0Be!p42kxgCuAYo7`%Y_RikNH&3baGzv@fsa(hU^C7jnkTMmxCK{xiiY2r& z?9*d`P;FJI^lIf(>}?hBtZ)aLZgrK@fb$`N6lJc8zo+*QMcuj*$CK%VfAT}}O(`Bk zE$dmbWMz}lrF7_(aEpshFwLinB~jy*jdV*G(VL1ZRJ|G5C2AI+?mfacethY*3ZW1f zavvh-j|xRmg{|iN%KnV^3CbgQ!Sn=^DF66&>ZONTc=Ow2UZhY$k#io+f@z+`!dCwt z^3i`6`_cbq;G%3)d}SfdY?WOk+h|6lJIAkNN! z;QUQEiZB>xEtr|?4&zC2nh>NhZX|y~8!cRvGEvxQkB(phPU}R`@eH}GxHXKoQS^?m zy^nwB&C^RfKJtt{Ly@!3{x181QUglAh2Ppk9Os7+fddkTXJQrLVkQ_yFwrAK5dS3@ zkX^g@VMpgpOcpNebdf(WoE^#JBJ7J8^#$Q{SM~{i_Z+5}AN;*Lmsn;YEmwr@<-cO! z{(~2FGxPJVp#F_WH77g|hGwQ^EkME{(Y9_4Y65c13Y!7xifC?rOyh@+Uk z`~%VqWmFpMyQr-xT>{{01Kac}=m%|+WRhhhdWA~4YS~b7K71J@RaNt&&1J{qZtUk- zZ1rN(Ye7%DrmEUg_me4;w&~tkWmC`Uaa~Wt45#O{7wj zuqyd*1JeWTOYjVVM6W#8#0zF>T|#!H;AWV3MnIiVdXGC0h`RSXm40aR&ZO&AV{Mu7 zsOt8=RT_f?ggLThAruqZh&6xlVT@9>b(;S0aJR1zFzG0-7-sWVnYx?QVkeQG%aWx4 zV>M7wd%Z0~CIuvjvz(Q|mh9KFk(jC2u4kbSmrBZ3b|*U#a`aboSx@OOhQbXH8v> z4DA`%@=n>632DLV9szlWv|#)6f`qpOnuh-Tfgh4riU=aOnT^Hv=?5ugH+n6}1m=fh zSV&WbNRv5e5qrKcLtpFv?w`4-4$=edekk_WfUFRGh<96_vx2snJ43rrKK=M5pHZz` znQ`@7Lw9FZsO=Y^3Ni6UHZ&e%qbPw9i6QP$6ej$B^`|b(VP!-c>dpG{+6pXBvmxRK znOT)mr6v4QV}hKDi36;no2rQ9WkprC5%?<6&lIG3s8x%`)r)8ZRuQ#^r1e(5qvf!o z-V<44I#>mh)%3hV=fw@skNs_Rd*cFH*DyoX)a5aIyWzpFA;R7)Gk|EPkb&Z}$RD0U zfyhd(8S1O(YqpdQWCbTqmVoq{8jod6A#Q+q9{LpbG2ju$qC)Cl6^Cj207TdBr>sNY z0_p`qT+M;B+?T!@$8Sj%Hl(w4*(NWu#-7+>7x<9?1&<0rP(qqygT6$mtEdD+JKPkRf>7jbIL2c&b2LN?^H_=5%F9gL7kE+XlL$w~n&5 zp0LM1qTHQ7UjUGdKMyz4Ub>a!?-F>J$}{A@z}CuI?MLSl?-OG;%|6%kX@%1y^O51a zmNCnksIj3F)VocxqO?!Xs8690ma6IJBh4tbtiAzs6*vm)gxt=_AqwiP?YIW%vaw?3 zC8{vv@S~{9xYxItS#z_l8lMROyk+&p(OCh+!GJ#ER3#L>fKtvt z0KLJBmg9Rin6HWdw%Sh3tM4=5=((iM&=QAQLN#tfWd3)3y0OgMmgNUM!)a((_Z2CP zb*T*lrbW74Tt*~jTky~2c$S39j^XkmebE-@3LAlzeKtEEobxGbKoQRz#nK&G%?QO& zjM7GCZU?_ai!V%vJx<3B3nYlf+bK&litld-i0*Mdbbw*21n>p>xL?x>>sw$K>N|V+ zmC%j*864OOqtVJhL=}g09*5RqAZ;xqX)P$$NKDP8ABGXjLi5tx@Zl=sVKLQqKM++wU|j+#1>R z{|9B?6lK|#ZJS}+wvk~YGi=+o?F`$tZQHh)VcYhLtg8D?-D>x|cHhU|ZT;+zJ=<8l z_klV3NNrbjMzLo)6-{D`h=F65<6=I3*)vP*XQyHU}58Oix2h4Cjs(Yu4_ ztKa@v6Wh75*m4_w8k=vFkG6u3)0L>}=f7?L{gYQ!-27T${1ObzUv9pvf7_3=GyK{b zD{5t6=<-h&BjSHN3z-^P82qzUouO=Qfvt@45sAlHw`*%zbxsV^lfq@j*|;ld!iOct z_pZ{GW@WK-n#>X3>%#pIS(j;RWW0_JNkda#FQY~-gN+NKMt9jruriOFK$!Ef1%?Qh z1IWjhi%%RK?G4%RqpyY0+VsedH~b72F}79ya6vQSugJIu{U=@l z5wF4FQKK$DirSAQYUsDk5&oSV}Tw(ATYI7wXkq98py`#M6OH?7HX$1#GV5b5*N`*LBo9UFMC4bqv~m=N=@Meo(^*`%{l zwgm>Y4Z379MT`Smx82r-$K&iuOgcbslzg9^w_L^GZ&FDxm}(_8r{a!MucS9*^U#WM zlmJyeiOicq;#*2dJjNwDvyjX`OF0_%c#t4XO^wXVpgXuzW&F*#VO|t@fn{hA#odEC zPb@KpK0FbQH5ts4N$)@ABsLX(5=n8?YxHcYuceZ~vVu%vC5dkQ>LESfY=|KxEi`2W z!_&s0VjZP_RJpw!=pdXma-o^fV?}Nh(~pyuGFdo&jNywq?!aZPzEKfuF4pRHatGnL zcn{y}R1 z?W)-Sd+8Hm=Xj3HH9D^HHHt@qOdAWRzhBiWr6To?xxc1Qcba=dOJ$DBxUEG{wPQu+ zMS4mK-BZ3Dv84$OWoM){e5Kh;d+f}3xzS2xp)tdQC1_k?V=7|?WoL-G|LvySwWUYU zbiJ#SjgQ6fmU`X}1i`f%Hi3f+Eb5ubbs?(dAUt#4#9nPBiU2+h&g6#?z}JjD%jzQ zEPkS;h361|Q@0X5)xds?%TN?~uj$zx=>b4Ni&3_P;7$XXzoezi1SPxqK-3JlXp~Ag zPJ%8Ivl`8kTxH)t3+XA=NJP?~bqd{yS+HQ82)9yes`p)>Zm19_J<3T-rmLsF{VdWJ z>&@VP@uW=7~I02 z?%_6Qo^u)n!j(TYiHYhw{a$g}_V6O4WkN}<>U6%}xrh$D-yAOuQIzV(1h#^Sy55do ztG8u9_;b1Ax=ewbXHaqSnMUO1phuK%?DNX-KBeS-7b&aOV(4h5ZV+@M_(v3UR`@fV z{5D80?MHu0VAr~W#ZUtqV6S>IB|prZaM+PqVHH)bd5V`gg67a&4IxMG-D>EO+sEPL zaYY*>W0&B@_*4w*Bg%o7wYJ_FOz^D>HhEN@@2AY-vJ-@%<)N$>0*a*rLV_N6!}p(r z)IUknk5u@QtGz|F$o&sxnBhw{vW8F&>5xmV(cWX!e%VsX9e#%uCj7`HlDqu=z~vWM zV?52~1ffo-e!D!lx=N^g6Fu}G?$QT``ki+cw?wr!l0oTa5D8~W-+2gbrrx`?G4gOa zerPgm8ns4oIOGfw+`2)%{5R1;8qgy(&|~GdsvDn%fo^i3G_+|4TpAqL`b>U5_!$p? z*GwU-AQObtAWO7m5#d#kvl0DIKx9~5vaBZIlh6T8^?pK&P*jW116yzX4vV=Sl(db# zRbZufD1c>y%Sx7u+u6Nwkz*xb|D&H;i9B;!jkx zyVeQ;UGgv=KQXm({hr8h2FB*2luf>U=E%DwSPdAal1^g~w)%}8^FYq@ibv@f(H(~8R`t;O||G7 z1?;;C!~IR81$7Mv92X8aXwlai8n_5>f~Oso3-KFmpFb-m`i|;0qb*PH)xYm9{KLbu zKPZQKzIb@{i-)QI*F5}RW*>tzw9MR)X>eQKkcqjff9OZS+E4yUrW~>ZI z;2*VWKYf-l)bZ$i_;E0KmGs&E2;kk$KAM+QBwCpXPdhS#I_0u4Q&$79?)3HZ5@YCz5%v1YCW}^ke8U61ma&Hc z3u=-k%_Hz#gc8;@NL0M z{aTO`)Vjs3-GW25x9G`N#d%7g9;w*Pzy#K@nY8dZW~~a8JcB52-*^p{)e)v!aCyFX?XrP-j?nxR=c0&FzLOu(D}QU~DdgLY z{O^9f){Yf~$^!O+D`QBn$Y;X-28-w`D3GrHDrAQo`JSq4EQl_}E6%q}#DXmx4f!ju zH`$)H=E>>`?Cz2FOcK2Qpc&ChA>^-p;sltonr_9d6_|y2W-H~cA@WNyW9XZeTY<~T zB<(}huNMk>%XQm;a1qO4wt<80W6i#XZy_!YiwqIrU=k>MN<;#uB5fSWO*oF}tyb*e z#f1ezkOQ={Qo_ugr7=|03ks_svtCU)8g6tJn@{=j4KG=uRODBk{&2`^$SI+&N9|1c z$`5V8CFBccza{qV*KEMAM5Xf#Ec?qA5SWJq&(#;06(sw!Q;`BJZ&71o4jhGMNgqX` z8DNBoK+DT%bZ@7hkfmiqAgXY4oBL=c5R7w5M=A#DYuHN0+VC+^G z8FnC%0(y6W`-o6N50HTNCpjq>vsxir0Vf6}^81%}ehkm?*~Gavn`Y1U5Jx%FJiIQA z-|U1m=xaJis`H)A6>}6QPcmqdKjf!O6(SYRRY^+QV}>MwR=a`4w{(K-?$8!M;g3*A zK30^}G7)cpn1hmgd6M|tn z+~=tkK_h)BiI@wPidv(5xd^896`3~Mt0TqpkuPxZe z;H$qK{pmR$t{9N82QyErH#cE2#=sJV&`!f@gXfbjOgG~M^tjnBgc~X65=9^p417Y) zH$NyYlQrna^ef)xes_)-2H`|ER%lHmx8Ba15XBQ=Zdgo$h>AV}Uo;jjkC^w{=a50Q zSnn?4+eSnK@FJdBsKEZ#L*c`8lk0^!`hVAh32ZfPDhAU^z}?Q zI^y4n)7^AIJcx~qYkU**zg&dNc5BghvcBOnLp}Ld zbA4XxnY#=jK0FT(^M^D>T{)}wyQv+?@LigGdN`@edQRo-iY0HVE`xTi)5uPLaIJGCodU2yP9u<24=M7jd=X%e%DdHLnU#P)YmKtR_) zS5Md8P+HIIYh;{QK<}Rqf80qN|79}#wNci3_G^i_H4SpBl|(ni>RU@m^)bi6fdoF( z*dSp{caYVQUbw3Riny38xxgpY5TY?ts^>!#!-n#7xCOnK=*51g`vv!5=f=m=^FF6H zGZ!qskk|lWBC-UPOST^3Snm;mfP&ZwU=1Rl#FGQK?Y1%smjU=e7FsyBpRQezTIC|m z93$6-<8NrS9>NU&eO%*B@ zajQ5Sa-TZJsxUH%!yGsETl>~itz2kUD-7lGY6Qb1<2X?^YC%T4MV(yx5L@i2nRFMO zEUn{oUjPvT6aq>+SXtJ8ELWS;*3=ir#UqEvEINP=v>BV-S{23M2)-A(#0k~SF;r-( zA4S6KCV>P6j_JJ@GXEZN1c^dd`pgpRqh?`R>!*Q15Mb{24;Xc*D4IvEpN^m9=+L2eO3%t$yD#}ysnGtw6nHux>QfED8*{B1UchPd z_Te$$NGPnS$Q@ApKtT%T53uBcSaW~{e47lkJw5DxmZ%H7hQA7T`)#XC5_s3Jv@Prgm{5)p+4hZ@z;}$Gc1Ti7IE(O2RxH4bDX?h zUeB;PI4g9-Tng9V;tV?siHhO6g2{>?yObcxf`h5P6x&NE{r;OWbTn`J7}DtT8Z&e^ zEpj={L)qsFVGI1LW(iV}7QP@;by)04tZ7bhx(n4O%pFd%9+xMJIUl;4JO{#&oqg)< zqiIe}3^SXAeel$lU353laxKxn2H>Ch9}C?H$wpTP$J$4#A6__sbM!A71KJ}DPSjxX zH9WHdBhVv_FB{Ai+hlhXlcWr~?5}D1tY+EvhBTa8oU_v^0(Wr?|wUr9q`C*0a}SK1a&)odFbn-d zAQ&S=17~_fO?s%CE@CoA3`(s>t@vlTKJftiFYXpzpt4%d@bLB~Eh?rNG4q}?X1Io8=Ep$nv2#g!jb`+j@>#@@l^9yxu?J8HOwHhbMYrRvQ$ z6Ob8Agel-rP!&xn%Wea^53P$=919odnGNDex8pYx4M%vx%I5=HVIg>;vs@0$iB3-v3z__xmv{`HJxf;D@jS)d$pnhh8*n6kDXPDHFo4X#U&V z8UG!6{~5dqF+E~H^vHtNC(Fxf=9XpC3BI%r`k}#CtRP`B@S5Sg(IL9&x}@@Crl!9p z0`RtkL#&0sj&pVDhCR8YF503zygGh;YaT=pPRbjaF*b?vE5ctKeU@rXF*K13pLy0K ztXN3gjpjhPX-_u`G%C)hs)%6dv$6BK&aPF+7k^CzM+qAU%N#Q$_6kuC6zVBc&JYXS zZE%5rp9t}arFg5GMmN4QW?BR3qTMo>EdKsVdBx zuq(LC^Ve`IyECLu+rGmaL_Ya$ve5dQ3!%>@PI$n19s}KsJo1qKEc+)2P2jqm`Z85R zgeRfdQT!u7qiCCg<&3#C(~pe!DA3KnPWDe@IyCyn{?ymWqI{7W)Bg@51Ptx%kClh=WAZEH?38yCs|a zwVJmZui zqF$s67qh_b{S68@!&+-UHxGi6mis0qWyBb)Q6XxeEVVh$f^gh2U9eKZN-hKo>ZD83 z6@8V`8PovJAE>u%CV`b~(Ien>RZcC54m!H6T04b|Z&P@d>ID(;)@(0x&J`9+|1 z`K#_}#>0ED>I`aY=AonPeLs`Z-lNIGthaQ0GF=jJyM*vWbGZ=x7opK9m<61Yop>Rp zra9!AfvDb^1C&%cgbz?(tOuUs(|?kg$7vQ}WBFSmf{qtSgzG`eY#5jJ$FoXh3Von? zSSr_=N=~{#vQAfWj?_V}DM3^)WoJa|0>)_$zu4Q=K&ke{*UtI-eYm=bs|b94^#A%R zK>nzn?)a&`>94>@{t6QOzYP#Q0c-t#zHxs!*L~U6{W0Hk`eVe&^Dpzdz;FM9dENi) zU01d9)?VG8KC56Zc?S6p)4B=_3^qT;xm!eWu`oFd46zuAN9j>9Nm>FE4gq0PQKQIC zYds&B^P}_u%ZY0yJ1P$(b;;K(Eh`Xj@7kY@DB);e!VV#J5nX^=QRGC zfkQ&vrS#kn^r5b$$bPO%{jfMMxI;}PWU*-1g7~>pDoQnn5tw5(UiDGA~BwbH*k7}|9*P({7 zh*}5AHCcuud4e%1{AR?2AB_}cv5|L~Pos*Sfj1(i8BcB8*eau0F~JPu&7FuoQyob+ zKz)M-5`jTT#@5%KR_<%ozo)Qhw*7Ak&8+4QOVOgS@jhXagR#x)J(ZmGe}FxlYR;VB z6q29IFdIoe017Lt**G77eL3n;PxMmXpi*n-s9*wu=C0nxds44GF`TTOh9sl+9#A98 z7^q-;h6RkN7z}5+3!u;D-OwX{^7Ddnqh)R%7s|-yK*QNdmlfT!FAtf%hEi*?B01zA zE%5amg`U(GCYnmbDH3!E)v2-pQz3Wpy-Fkox?&nrpf2aXx(BhTtKgeovtgpyLIf)j zB+T%?^p9&w2+F4HAUM2}AzDLfXXEIdaK>^(>UeO7#^h^zy8|7KLvZ+!Q2Q0&A#fn& zT@LP(LJe3aVfMxs>2(F^y9F=_QIm~=j%{q@rQL1nB9-usiU$-TX=$|Ldr^QHT@ zX(2^%dn`ft524tG(|ZnC{|tCAUqU`=ai@MFe;rQP{y}_UCqO%cbpPlDvuGu)bILX< zq#(e^XD|iZ9LP}0%I)0v9LjyhU*32<0aS|ZZc0(hGkIIt$0?Z~t*@uYTJJZH(oq2E zeid852P7KtHQD&y;*g|Qi{KlB`v}x}qSTinDyYtvqb}0J;o&G4%KnB*y`{d)8VRIi6u>KaI`CnvFB)t zC#bS$hOQ~MQl4ADd8|xXq&jvN?5tP_zmwA)S!7&DWgo(Kcbc?^F6*aDOdeILx1_N& zQ=(X(j}^2Dy9}n|t^~C5*>+i)*l*QEZQ%#aW0#(5Qff%eLR(Ppg`uSCLzvQP%qTr@ zZC{SWn-3KXG!MBD=`byCZroS4v@-i9-J_$<_=>t4f)==)E?dh~bs+*1(Xt+3~Vl@xh3we7Gb4L!1qwOQ!mO+Y_%#3e+_IGLBw``&} zATP`z`MC|b%zz=!WH;5Iw+OAN>CW>jG$pXH_NZbp6pP~3IKzCUP z%i*AS1o4tAboF6$eJ6Lc#DP_|F)R#yxPeP@FyuLxIr+InFvVCUN8}+GFM@D0vH9!U z+yaEY5i=)!q73I;& zzi}ST`VfOBTpZ@%5l=g{eUJJ|1&jt87*}!(8fi_8=j0~vmIA2#qchDv3i~gt_}dP}KPX8_*TT{8zwuIp!l~Vy z5c0=j4Glcu4}1cEoo|*UyWhmbk3hiqtzbcS4a`z80=3Ou&&h|?6xA57!|vFRvbyUT z&p&w-ii{0o!stcIueByG9y4A)UN^IT0jYEshR8019!PowT}pCw`-ULnral4iVm^)Z zPq`Rmo9H1#Nu~>n!bwAOF<19TYdUx;C!kv$mPMW|XK3A}8FO+r61^vOV2u9oFI7e> zWosLV){2qrvB^1k$z42W5_k$_<%$hgEa>Z?!EJTR0-rNmjX(ztc23*DfzxnrsG-cD zxo{Lr;S>w(ASCb=ArDMJk|2Oem$4xk%{ilfjK`;my0uQEO33S$5zv%gF;sS$*g2y& zg4Y*2V+dDve&V!ho2|4cKj$Ensk}R;n>(Ts?NBX@9#NuViBmM$h3KkiG@a9H_6m0k zymcJNX!`C79~30lN9VRBRB`GG-SP%uq-6$m9~$I#29i6-iF`-}9D4rHyxDk4>G1Ak zE7Lx+j1URC?iUBd4D8r=(db#(N^q=>2dRZZBXzqSPK$de9-=bQdKMT--qxx?%2O8n z`Wqe!%_gS(IXQl5#fhH8u>z57$;}9A}?uN;Q}Ih)j(i0oY^nPdoQx=I%?N00=mrP5UoQt zVH@MJN7|?oXv7goCd#=*ECmGtEpR%&rYQsHF(*`B;4$0+zR#KE{(@4b%dD2zqO_&c zREJo)B%YW}e}yVpvS%$UnsrBi4!#33_}bp^A!`(R!1y_B2|or59p2w6WD1%Yy+=_) zGw>qT&m{V3-Ymref7p3|ZKcC;Fg(MGw3^T-sTR>+rrsRE)Oq6GYPeFf-5{O4U5{}HhmT9U}6g>NI0Lt%B0z2BC5 zPS`Jon}&-e1iAM^0a<+ryuKF*?GRh@|{m zW;e7jbTItCj>i8K)&;U1QhjvrAC;13Y9FEf>|5^j)@>A)IA z1w>T?-9T3|;7ve$iUEZ5YwI?T@5ek{8@%7rcSW{-Y{}?|1fxlxCELVEKyok5o=_&0 zI2VpCn8Yp=P$$))QPuHvO1V~MMPSz%PL(WWidVK12LF~^(fkfU>G}jFZ6RsOr5nH2 zICv)?r~I3>3_eWzw{sMTv6f}gGeNTjS>5|drg6mm31u^SzT+-KCq2tD+lF^mg$9Du zst7`08U{Goub?9Y@C=#ts|_oGV0fSzEH`*vM5k%EG+5Bn&ajUAwNKE$4($)brPm-k zgMKOQ`!8E0+W+OD{UwYl68`~mL!Vfy2rPim5F{|uOeB)XoZ0cS>am3r0l+b9J+W%#mkig&xydQ_mS;PEmJDn^hmcHbBfE z+I!tshOlT?il~>mw89hZ=rns*%%~_HaeWXTX?=)^DCNN!iZ%A~Oy+v7n#F5~lA=0R zRLw*$wI(dcYl=2ex;8y_)W2eM1*y`kG^_BKw3l03imZcsyaHI$5>LmI9>bFYt+1pd ztDZ9V=k=5do6u*etP&X0Db!)Ru;!hcAE%dVO!qZbm|@()mP$Hqz|3+(js}yJfW$@>JK!8Z8ZE8L*&{yHIdzi z-j~dRbGZn#0d0{L|9!E!>-aiw`@QVZ#g7_`nNP~$l$C4AS#oLd@t%mnH(X>4QQ`dR zM}oTe1kg}EH3A(p!4(Z)Yb1sXF2o5HtzlqLOgV_x7KBBk-U2qi1iDxV3fhZMyU5x$ zky7%IJE!{^a>?+r(mG*MQNt>C?czOysIYAZlzY-8PwyjEb9#~L&|)W#sCagTpS+qw#axyGpU|Ya`=A05_PEV+*P=n`~WzM zpuP40I*-EjHxv}OYmuJB(95gjpJ622W(p%FdmnZ>D|ZLLM(RCCDAL#5>w!D~WnWBH z`UEkhfS$YJQ^MCbL`f=O52M&hCn}e#hpI8)$aT4IDiP@xGT5$(7{M+yq?{S7$69jF z$t*kASL%{T8PI;i;0iqeeE$=2j$J0pnGU0pm~NadA$rQjPB=Vwp1zzcluFc5+?4Qb zW&&`Ll-pal9(UC`W5lZJ0?MgP2adTl%pznGhiYbsAY6NKE01YyR_u}z zjz8lqO;)vN3@4CwtnD^(NBS*W!a5!%p zf&1`cJ*LPg5&7`SX>!3>1;hLS$5e=tv4G7OT5Ll8_br0>CAOM%z6bagR<>vJ)jJ(> zF051qB0*Dz2vG^qBWw%=cUK4nqN5V4Nn@OJkF>moj5eYStVmVStDxgMaV$FcT%;>}H38fG-lzHKKx|piKVD@qt*1@l z-w*%OiBV!y47TS>H2sA5f5Grq7H?|dU}*Qx;mUuN!xb%+k%W=GNd2Kz(FA15)e@E! z;=Ie1Y8q-9;R_V|!URin8rCgHtB;LXFTw_*-bLSK`XACWy)L3ojx*M|2}r}TpXuz4 zZ`KZ5>@PD`eto{)T7O%bk)sQY^|h6tNFFqd!~nspBp2B&#paQ>fmzz8E87C)nL_-4 z0%5)0haZKs+Abq%j;Lbqj5%VDbd7}MKS(r9`>+fY4=|JeRbrlKWo=g0Y5qHH|081u zlfQLm9;9!k)HJLhTM_AksKaPxQe}bO!CcZ=vL%vr?j!M-UZWgSO5D8TMoT4iX1?)s zr(lDnfitp3N3GLF*+JRb)ev-mu~9%=dsdx5UmF;jC{SOu_eydoQYL^upp!r!@7mXC z)z;IxW#-C%s+$G9)_^9tw^Tm;na?iUxoNfX>dV*6o=(F#9A(K=NSAI8_D(OEoJ&%w zc=kdMQ~Dc%!2*N^zf9#(`;dDr3lWY2_7FS!+O~>}EgT&B0>75h_!?U`vyxt)E+GTfEpKUx)E(Z-q+h zAw;Z_#r3I&j+)~(!&RhXolJRWk{FK@O;?$a?5>Qk1>`Sl9Gs|BZzd#6LqY;}-9xxW z!x46`94d+x^g`HhwVfL~{GAmz4jqS<+ylend#%cM5MHhvKW0+~4bRQo=*ti~XCG@d zwSwDWne`y<(L555p~}=uyiP=SRjo=|p+~0!4dq{g#n6sz z)9TQS)*Z+YZwNArNu-3FbC1f{ox6zNtvT+7#|m3!aGVXros|c|ek=!y=v~T0caM11 zhj4jCU{oS+49K4GBFqFzidOxcMr_>lydH#vcy70`;by0PNyMoggEff9-#ZfLfPEJC zyTFl}X8T$8T92FUTFk_p;RW-+xk8biFPo$4RnKm8ji4Hb09$0kv4_!%;UPgi%OS2r zxyOxm%QJ{i52U)o&3T1cqP62{SLWYe0KQBx=@eW?UsFFB1TZZOiKZ7qHthc?ndn4+ zg*JOC&xuZ4G7kF$8|W0h9&iH|c}J-nVotA+8T`gM8utY3s`nY8z!Rakc#MyjKox-4 zCNmW1On(C^EdKpVvY)UzO?ScMBp;HKS za%=pqy+3v~S3xMyBdff>R^UCozum#}GrxR(57GR8u5&ic$L@t^&+p8pBVwIV{02DPw<9FAY`?lTeCKQR)CDxGdo2G^SI60s~T-m5m)Bpt7``8uiV*c3ys2 zGqZ4e*dL1y*5wV=7*^$-+~(Sh2yX61_#WEaKLr=&;-B?Bta(S6Voxt#ryd=0DA*QM zqCYvfIoKAV6ptDGO4pZ{>^b+EWIG6!-=AWq6wh5(G1`dH>#T=5>AE;8afq#INRW$Q zM-)LCf*eym1yvlfI8(qnh?(1YTAe8& zwFa@TBrb{dXLNeVVY9)db)5=&@v8hc#X`}c!8yafRafMmSAbBLcPXE3KS39(Oyr`8 zRRPVG4WyQ(%dNynKGa_aV*dt!_bi`k> zQ)%?xy8P^p#3mu%#)p+1F>;sOr=4T0dmw2KP9p!Lt(;S8zWy%m0#X&~BH5kM5`M;L zp{R?qNqwkNH)A3>UX)tNS=}r{o!k*oYY5B3RlZlAa+d-lztBU_>(Q>rzbQsujA^Y@;wuM{4~bJp2w9ysL`{AOlmu=N)A=p2rJbZn6NjEQk8H>nhGPg*@ffjJp+dH ziA)Vb4!1RpgwPa3^wPeOda9rN5u?ZqeZgTzpR=`q8M_GeC9p-5C@ z2%EBMg3$U5hLF)x#~gL(-gK=@ZyC6xQCX{kQloAX`Xg>hbmCWb2(S~WXP+Gof|b%( z8n2D~i}l53j5qU-^K&eQa1q(}*GI6p`IkVc{toYxySFJ1G!EQT{J|eg#2MTXXNFI* zFYN<^|LSEG76)mt-TWqNx&spV_0kb-$0PdEuc)*1=MW;Itvd3 zEmXZf$$~a*)yzeRwtgZ_9=W#C&z($bg+gN>j*DL6X9Q;L#B zGB3S>g&xXo+%ZC?TIaYR%(lFl15>96Qvo!6gs90CI`|XqeU2iGTIF~^pg=8)Rr3*2 zepQ!cQ-V&H6Ty-?%{E*wiO!qaqH%7?9auO`}+Xr3mT z+`Yd2<3!&rai`Qp>XZ?tIMWR0&uD27kY8UnKie5A0&*^#5HLvDTUuHkGt-HA ze|f$FY=PjqHedQ}`$UN+-_l*`_Vn=wj%g;4Hw|9dvWH8I?-FuOb79(0)oE~c8bnF>Q{;4O7H@d7c!iiDJzw3z4quURH<}I0{O)>KF#)JP)3U1v(WYKGR0M z&RT_al8#B35au}hEABtdFFRx@3|=+kKHXMwA(!l&lKw6&b;l~=z_&J!9Co)N1_-1` zm1=O9P3+8jk{M=-i`3l)G=i?XzX`j83y6@#XuWSPVV)Ea`r5Qs9mBRCs#8(kTJ(Ul zZ6{9O_0}e&Z;Z`9_TDvi)0)LjMc71}&NfrTDbU43;X=E>?ikX($=DLHS6C_~Ci!?s zq8d1P1)Zi4RwD?7%VAhITqZE%z=3inOZ z-3n^Gpn z^hGtGa@%cxeGuAe`X$X@-Ppd##46DSsA*~%XRYGJy$j&K2MCzL@mCY$+c&4L>NeTm z$rV8tn?E_4y`kNI?Xc)b(6nAvKp)B~52T&VK?QqyN)HhFUCYiUb zT{dNfw5ZfqYqCmbH(j|Poq?kZ@$?q;ZeB;{1J8kgsBGr*h4Ti+`vy^oFvXkdKxj+f z{4?~|=Pf7Cq`im7&fC?}QdF=>WUg0gfkiCov4NagQFakC2T%&oB;cX9vbVC&lJ}C& zZ8yjk%od>yL^7CNH()dvq&F-zpm=xM4+Iw|6;S91G0cRN1BOK~uhn&G_OIJs7Y0sN z4OYMy&Q$hw7w7Dfym^}zLMUWruCjx$O&x)rWykdQDvHZ^mg`k_IdO+?{@44SOh>T2Ex7KsRpnB*bCb*6fC$*9vj^$4X{J2j_H=eySTUiw6n7jUT(nMc)4@7c!h_NUa=(LEJObL-4QM{KT z(k{bPHuOVZ+z&9L?J8egwql2pr8i5|P@qg5PF8LF=_x8jvnK&DQGI5HP|>W)2))u0 zs7j?tmC9g~Jx3jH4iz}gX{BtA7&4HqEBb&s8W>Y1)@4Y9IN%!@<`#;I&lrX^V2Dvn zbM#QUkz%H(JzJ%aFXSp%h1n9CkQtlx5#J8U#vQ2{ih4goKPti_jhvRBTp!H)9{M!H z`VLoeXz!t?Eytzx5xz5qbB-cOz98V9@DO4q7MJTO_9{51nFqF|*(ZNhdF^+Ve*<*o zwa5CigIFhbx>toK5%VXge(HrBJ0I!6%2(Kbu;!lGe zbP~2nQ`{KreF`4ZlEqyOvk{eJ-r|Gu=NNrmAiiPTDD%c<1kN_^pG=pV~iW+Hm#mln3{6=frUp+KU z<^ZWH?kbO#xa|!OB6u{>kodrXWJn?2`@CWhlbn87wJ$yx7r)eAJ($w0cD>qta%G7< z8b9qxmms+(VHi6NXM@3YCP=yHOV?UeFW=&!P!P)KTF_wIOOe+xb4@sYC2?fTQ|5qJ zJ$&$6v<)#NodFsmuB(V^q=6iH^C>)uH^!q~+pT)V6Rn8B7COj(?ic9okmWT=y2a)K zAUKS_FhUN*fg+NnHr7%0sr#7pnU}N9k*Pm`6WvXH(7V#>e>4;QG^K{>zgiQ2_F?~R zcKB~_t6*(z_^-uI2?}3xqO$PZO>m7gP+=$)dMGl{magS+$S4Z=$d+=UH39k8eyYDw z&=M`zt+1Z3ydDtn&?B^?MMV3bfZk*WTUKGnqrub0N5)vA#^nR|BY+fYb|&&p16bR+2==B2Xu|M#FjGac z2_i_QqA@j!!-qq{4DDljy3ZMa#JfeafJlPxPT)D*3ZuLvqtoGH)D z_$>?iOOm;Co;Y1g!Ms$j_`o-|fo5GJyRVRbecm!xevgPrvj0HDELS1FQBIAuLBi2h ztIqDEeH%UjvXs6^jU#G3f6A*c&Y^40Kj+fMB0st!8f6#}dRG{s<(Ecf>WTq#ptq)( z0mkqB<)3AyBfrgbP1R`Hko;>4N)@LI9dJe3;`!T^1i&sr*&@ODS2v8_Y&7~Q(ot>U z5D<{C5wS^Ke;Qc#2q?0KrjqapNeCdy=c|&2K{QWIyBFiU<>?!F$x==4)$mtE^-$e< zKJO1rTE5E1jYvd3Bu#8Kmt0%=T0^?aRJ!rxu%Q{X8 zgCibS!yWm>n<;kR$THZu?*gy}Lat$3D`iu^U;W#i`#)mTKNM-G0rK0oQ56vjFD=c5v?7xyIfCP+uPW4YE>6E&bY{Li?h(}9ISema|Z}+_OYc+N}+Q%5OW6< zZvHX%m5$`4-x#y!H{9G~{%WZ?;Vno>Jiq%?9sp&t7i5d+I}DfN!l@p`)Xr~kb9W@m z#m7`O4TV)b%&DCKX-u9_Eaoq;7BhF;%caL)HWh_lqzxe%+;TOWL7F#UqN?q$jiD>XYM=~sVyrQ#*0z{MbZj~f=~t*h*Km9(J5ZrT>(aX4esg} zr@5XUOcGOY4_9$yDkayKrAxh=CV&+r+Sgc&Q5hAV2hKZMp}J30vg;8K^iA-fBSL)8 zJEBXKAR(-gv%-x~RHlx~W>62^c5xJqPb&B_LHUV0TDB9cJ3WgG zSU@huMo~u`8yhyc1xSm6VmFa8W1wn);3m=RTg9L@aT+a)5aQEmAT}r}oC8JK#HA7Il zn0nduQNIUR>6a~H9MlzY-?fY(JX+2!vlby{`5wiy@Qqi+Lo<`tiWj$83f4&~$CbYn zHThZ>qi4=y!dv#CAeK6&9?k?6=5IMis?_Ge@0x>fiuKv}t*uu4nzHhmW2L!!FO7qV ziUR?!%pzX(4PUWRSXqJK*#_W2<2V7s_JEghdp~YzVXDEaEqker&MBwTXI#Zw9#h3i zwbEQ#VC5-{^%$?^4diC!8OQ0m!E@+FgEL|Os6Tt_it1xvF0Ag^mn$T}dbv44n!Ad< z0EP$bX+N)OR;Qg&QGE4z!7U6Ur*1cI!%P@tm9uJhUlDA( z^y5XaU>J~fN%{sq;$9JN`}CtlkYf0ti#XAW(uxz36K{!`eq+b*50Nw_`x0R*j!KR< zg_01?8gU-sD~=|vD9$48&?c|kTm^^;@ITJf*70n<{e1rxHxP|K_N4|B0@nXN7RjTE zFWR^EAUdx=MS}&WXgmdS(zQ{8Kk$sF;lvXC9cxbEJH&Aw{Ofz3%{xMI5B%!~p4~gp zaRS7ouD<`Sj0UBMNZou#ubc*Hh;m(hhp(&#Er@d6R`(vWc5dQWc+cH^r>>|5Q;7|n zeCMvX1{a7o9DQf5m6RbaK2r=3=1qvX_e<5E6So60u+4tUh!%Q?SD5AC;Jm;szCE`>@Awx zi%6rmpOq+Q%)(v!nK%^25buh;H2AGlkY({@SI#PN$;I6$a?p6E$sN5a?ve`FZ@Le! zJ{u@JR3xOe5mMPnCV@iXd#P&lD#e;5bLH!Y&q=21)8rY$-q zF>s6879LS^%i1;!VF4&WhB2CXi<&cfwpojwNi5tyZ1a!EK$P4=x7eAC+>l$$OnUCI zTii@$?!H@$Ogiq7TbxWL?!j9u2HZ@W=jbu4Ob56KCUhN3xF}eN?C7`Jc+Ev*+?#&f zbTZ>2V>9zoO>x^=0%{O5E>|CfzTen9L{sjRkcsf?pQCtzk)=~YSNMdv9NUo?# z?j*>31Xntp@t84_dAVlAqBe)TZMJ4+I`cep)A}g-3Hpkmc@!~o)6^*D3Z;8UI+J_h zqOy71;*{}VnsKcOB#y%c5{DW>cBlW)B+o;mJ=Pf$Or7ubtcXMIXMnn89aHI9e z?|oF6-OCn9<_m znOYl26$f2yrSZI4v>nz%?kl&3+`~Nj@h9sC+;ZrP3BS`W93-GHms7!wyeTs5>rGK^99%# zBMKbBH(?^~$G5QJGwCSeAAkYg#YBP$@g=|@Hfk+vQ@N&wFgAz^he>%6Xn+%Vfs`rBx{8trkQlRvH7$=^B`2rT zV=#f41Y|%Rd?VliyCCp@16QjpP}%xOR5HCN8Xp6Q$APQU7NTr_q#`*xZ5D$FOyw{J zR~hy*=?#@OxZ)HHPtV1K6xra*02kO*z)kGsOm-%-nr%6?{nPFPDnK5p=7i9@4x?4qyI0M%KtC^{XbE<)Ay^dn#8rEx<|JcOA;PtFM;T{?=8-OS;KT>FcG_d ziM|E(#v`+$vy-JedTu=Uoox@5GgP%PNJf6suc&(P+juB%Z>wlO_s;iKf73T#r-X*N z|9DB(sBY8uaQmO_j?L?N;e`Yy@M^%}b&`Jkawl|KPBm)}o^D)@e0T|YoDI_I&q_S( zg*ewa;+zLShTT5yWDx3hp>Y!mN)%n2#G%|_lWjqzh{zER)6+$E<_4hxT&9J^i6gDR-@{)-t?-~vj@|FbBsqz;|%d2TtViis7n&^n=cS zdv_w{?B1mHkxJ&3{{9j2?W=gwzcj;dZ;zE~V9r-^#b^AqWOeOVrlDU3(jsh$L;kPI z%g8GDt~VoU>E=V{V7Z4r+$9Q``{d47(SPg6&#Z?d4an1Jr-R>S65rAjAscX-&fn_C z%!j`Xz;ST*CyS-8u>w&aqSg3%S=vStUingM1#ua3YrlZ)lj)>hwz!>&4M@lb(>@o+ z5eym%27d)-Sq_V7pw$wZFUIC9nT zZNez6%cWU1=Qso81eX~oQ@&``A8X_XCD6mirdkwug~9Q2oJ4#1uJPCS#l#~q;Ae^ATe@lR1#SoN^6EV`UPuK*j}l{i&tur4FM-B0*9q(P23NxU~@PO zI40zI9cO5~jlye~AI%I{tT`PaDHo@SY^en+>udJ~}KHXDY zxC1uc+#XnP2P*+f0^ZXe`0#0QTm_{k%$Xh4uvy5u>uBjXUMeHd-|njdfXS^ zA&I|quD_}ZTMd<1mX4Gp?QvW$xk_)npGp>!#U-#j?TuXHz*SGTBvluQ(Fe#ERGSt% zJVVHzzy^O395_6~p|mVweJ5DvhaOtH&=PmUuPGG#M~4)7pXg{lj`0Ay7DJj;A`j8> z*GL2J=EL1C+d%H=>cl;fU6G`{g=>K7dvpbbh0!n{_!Z3eHkkO)xa$FaT~8Fzyp{sK zn-1kNwXP&~YhG)N*A1$CcL)Vzf)iutfdsGjTEh*=W@VJXC#Dozx)l{V@UeNB8n8&K zyuE0eX|7L2h-q#_rITrHP{ofa#i-05Jlvob05sFG4lIJxre9GBX5?B_`RqDO%JRU3 z=4D%8LZh;T;$bdzk|4e5NpxHKax_jJ_)PhfU-6tGle0vO>x+vahHBvpFo1~Sjk!$1 zV1%Kb{pIf_HI_JLVu#9Y{58U?ZB&@$q(VHC9p#LZyrI_`p&)J;awhrYkIQksV*bMC z?|s8lqclo@uiWx7(pd_tzGDf+N`0~+u8LrK`JHMEaICn@jhY&vb=+jL46(E-(5BBu zs(NjV$pxprJkw5Ft2QS>y9hGoI{+YYfbkyuB~v#2ZQvCh|Qeh=-%+hCw&0= z;5#T9DdmE?Wb9bVP{W8EZSN>)KJ|p}XM`%jI$kP%js+CtU)l3bDcx!? zteK6d0AmT?RYRz`U}Rbm;x?^W|J4nMJIYR=@>HUTNAb+V0a}65pww%j!NJdQ0(L@4RXbh1%zHc*Uc_?&a+LE56V_twi9%2?q z$z8%U&NRX*CMw!O>7kD5lJiY7cOX{wGc5lS^;4Qb@HmsaEfYzmcZxz5^)Iz1LtVmP zc$DQtyvKi`Wnwlu85uz+3AB}+ACj@W=wvMgGPfkQu-TeLNuHm1YEicQZxsp;XY*y+ z!usVUG$w1p1beB8wzLUdER+gVs>y};bsYZEXHD>r=W&W}{@55d_X)eaCv-1P?gfC% z-UQb4gG2UWyImDNP^=&w|6rWkoR zWF)Bt?Y*CR$hUrH)mUm}b02ZGIWmM|0cual!!N21Pg#qObxRy-oN$?65?IkT91F?@ zCTXJ+5Zih?g#?^#!v)WXXSh-zjf=YH(iY{l2;n4}SC%8LTgh#XXRqH))wL$CqO9tB z8%?iKFsQ-eK{k;A3oxge@hhz$mpv~mBTqaUBlc5t9G*Gey7AyL-udrNu<}5AXr#=H zFPWCK39WyA4X`-fu+B-_U>#rZqlx8wi=c_^)6)=^!um+e%e} zqBjc0#W%I{-_J+D+;66YB9wR|QfXy_mMJz9k=U)qJng}UV)qDCI=Oo#Ij)2-4-JN^ z!wh3|1IYDU&vHZ=su=zP)kFS`PnukQm~{cqoM}j{-d0|{kET*P4N-*64X=EX3G^{= z8mjT9_~hy{*R?bYN>v0lH&3{YMHms5W3tzB1O%S7=bXpJRmkN#wQCh8AIg*=C z#DeO0c$K&~+ZOMt?wlM@9ufMBo0~e*$Py`+a^a>Wq`RreA7t5?>FCTGS-7vBhl2sn zlNzo&nqRILs-5>-93TALFvN4>*eobV7A`Rby9BI>6YBd>3C>4?;h0o9n8&ntM#piT zPiSi|urnsG=it4plfGZDTuKP_%& z>aUtcMSUeFF(MMc7^~#!*a*?&&4^aln*IyK^uQFzk{e2oqHS7sxXt4eSlaQL=bTS? zv&_+pGv*%;R9&`X=YR2Th@V~*jv)q&X%obZZVZa%fRh`xiT<_TH&uMMQ4cwHT6Sx~ zMLm%|dEOUw_cJ`ZZu>s2zns8P%kaZ;@SS5W<}Eyj7}0A#oJ>C*lTdFQMo)s&VW9Nr zKq)I}gDagFiAR0wou)_Ae}Yna&%1@azxX}N>1!Fb5&(jdK%L=YFD{ozK(-M=K0R!v3C~s>vkG*IIv17y+B&%{TlLkRyo9f@X?>0K zv!l?-_*AN0ZF6#Q>%|!FbK65ce=-$cjT`xt`A|pz)dM!R9jMhbHx~^qmOCgdkO9Dz zHy|K7({45NVZ{?`-L^uD+_J)$Yh}RBGqr4g(Yh-C2X_O|C9N{1w2#eX!Z9HnMTgWvuc!Um@xgV+$*G{+2MnFS)! z=3Shbg5l&d`R71J@CDVeuSTCv0UD=Fq8MS$oA3yQIPxAH{FC}rKPo`=Uk1BIeY=`D zNzfFvTUKS92IW)aG3C2sU8RC@3HuqRv-8UmyBI#sf>_Tz+E@V|cPIel9)*VfoXV-B zhFv~VWrZ*ob`rEi$a&4IbMIJn@2b6m;T*=FgmMOQ_T?gytt_HV>W#3qAZ2dnYpJ4I zR052mir2NyYBiuAUhC^h<&5LHHLVMnir)xk&UvFU)H^8uHu9v@d0~E^?-~K7kDDd& z|B`qUvS*un;`~h;S2qV+9t3mj3^VY8A>Y)dgwFk2FsqY$6?@dZX`r6x4`WZoZYcIVqLgJct$;-H{tYqlL?-b zntJjtW@dVZKjn6aT#|L2?Tq!9T$QFECoebm7P|I^^0vA{Uj_Hl9~?vb>UN@fdVkJY z=Sc1DXxwO;tuiamRVo=5tDD*~txo2InwG~q*)(6cjb)0H^#GQJGO6(O0NUr+koorg zg#oj3bpiB!8qAvVwi=ZY4Sm(7h7i+Oyh+s`UyPi1fQ?Dk=x`Z=;CEk;;n*Wkb0!_k-ZXjtv?#timSCTAcM{5k zUh2S0sJR4MySxw`qU_n;)p>^!B)WLXcaBH-2fK1{5XHsgA##FYDJpv1#>#~6%rm?h z=F}WYB2xt0HfkY)%GMPgb3RtbywC6c8N5><(o!_}yM#(%P%iq}4CjyY*XrYX&O5L2 zye?_gfcm+Oxzwg-*|$E>$1HJaSJNENu|d-_4^6lFN1pb3W>~KB&x`5V2i;A0owri| zy19u{Xb+CZP~WWQlv*JeWWzvY80ewzY^?Z?_-UunVUmNv1#S7g<<=HTFso%hGBb?` zWQw<%V@>;-Apbctx)z?VFIJNO3hUT$1#l$Q}}sE1*&JUXpYuKvR8QmW0#D zw7spD;BmM5Fuv5-pTiOn<1PG0(8*v~Y9{aledW7qO>4Rj;}258bX}K#m4EDTiv!;? zm}712lOafnMGX-SQkgp76=VK6Q)FWdI1c>YZ{a;kaDDj57OX)%(r~TF*Z8{}w1%uv zJ(h6ctoVI~jKNOG11@*z%GqJ7LSd)4QEM5kU(3SSe(rKpFB|{CmnsuG;)}_VDT6z$ zg={hInwoQk_Nc+l;LBM!@&*&=hO^9eBqy5zLg7OHn%lLI)p5=m0wl6ba1Z{KS!vFo zuTO4TGt~r%4>4Dl#$|rE~ewRTo#9dwdazR+d&}t!I=@`WtE?xUu0#> zg(6fi$~ip5M1XU;0A3#O#rRzi}WV}!eUZx_G^|AxLn)M z`BbOsL5HrhEnR*Cu^Nqg4xTV`r&!k_RL14)-FT8sFG5u)RkjUsfk%c-G+B$&dk8Jq zE5>{K4eiZxKsZp(A>=E(+kfG#djY&_$J#^-P68D+Zs%wCr8a(>LZgSKk^n)%;nR zkS^OmQ%mm43%y>yfwtT3=x}eo7i5;;T~@JILt9N%t1aTDErO9Hr(i`F1d>)yO)8%q z?RCyihos=lLChe!<<|B?w)D)JN%_eH>P<=etX8N-`+uUWOY{<1WlwbYaTuhROv%1h z)2Prm83GWvI45@Wlv>&GBhM-Z+$=3HzhYS0B0K9U)#PGk+q)|ZoukM_pSn0HfAui9 zz=)2<%qTCS(Dv(OniAso`>6bgfH5=S!li7xZD#pOu|@9zb4Qe*RQgVV8B>7|E#@$+ z#M0u!j-5xt`t-ECokU^eH&IFZwFR3{Srskt@=LI~~0ol_x!> z?Nbx_gA~s8;toqIWg{!P-csg;W0Jo5cVh0J%ts=idqYCYLmNgt&@YWvHU1RSSTv23 zHcA(w%wUZ6XqvpQ%x=k)u5j>!Hn%@zda8Np4JZdj}v{G+z_gq=|GhKhD z-U^zjN-vf#tM@cQ4RVbNXfjdnc0HJB%ZnBG+>ogoklt5)33D5&RNMkq!@E6AP;45( ztF99Cchzmzr9);nlF($~7U*n`6TK*z-@3Wi^ScZ-b)SW<4cq-lPknGfAYA7BO*hb$ zG7zbvJemPmzE6g{p?J|`fa>V(p!<|4)Irp9M~4sJLG@9QRi+^2EiUKQD~o1!`Cjo2 zzPoO%M^Q++&owqb+P!lDDPi_YhN}f+4Lg=7InQkj;hs#ojpJo-M8)m$$6w)cV~u?` zii)<`Z3Pc&)B)&+C<%}L>UFIe6-Nth*ai4Irh1Zf8NLf{12sDY3G1gOaa5;&Q$)_z8V4<^qT~7szwl-V z|046ug%WxO*J|W%W>Jhj6@^MbT&(;wPZhdrbAQBMbJFF z(RCG?84Fc1!^cVgYZOAyn)bIU;Gj|2*VacQ247AaCHHhu@eS#DT>pagN`^2+rt_My z_z)ny8kah;_l{OUEPT2*`*#-cO7}PbA;ZvHxO?%XZxZ7P3HmLS2s}9O)5=x`F8+GTge{CLx1p5VAqja0X@;WV4-TNS~xVF~speIXRS4{<^ zIqbEM%kQJR7n)M&TT$FmZmQtLb`jo4VJ_q4c13hw5LK-@X#+BHW82%)aQo_@OLqY2 zv)?a9*pSkokYvt@jBk9f%;l7*4b)Erhk5o^SC^yA-n1(AL_j#uc2Qp&g0tDzt~)zL zlbdIyV2^N3bO`sE^0VGx%Cn*e<%K%eSk>e3y2 z*166%ZhCPod7S3WIYO=QG>!t=Dwa5LU1=q9(FxBntJ6nf<*rO5w}|`bM`I~4yfW^q zFbTcX&!7*tvln^1Ef9^~xx!hn@+Ngi$lySe>=jYnL_P6DLgor3I?v?wH%p&7QpQ%s zL6D&B;pyHd_0>lHe5rqz3X-)o8l+f{Q58{$2Ut>N9!m$rzJE99GEA2y$ZHws2?PLS zJX0(U#>vO(@>?hhe!J%!4;WBvBJW7}1Fd>rX9T6RNJKhvReNDV(f5f$fIwZJVc84J zh)idabQ56TvLmsw=2!0YJJv;M}JyFEqb99<`g z;v;QHifGku%-vXZe6&o9XWD7%qt^@v>Ym>jD*L#9CQ=T{8tYMH(#!sB#;9CE8)+bA!t-Yop3OeYTP&jjG!krk9V3p+nz{AH| z**2}6#-)kCvYR50tB(c70PQfgkU~=lQdf-GHyW~f4e5iekj+_X&CzjVn=~0fE98`* zLA_%nu0LqiU*nkPx)tb3xX)KJA_l;x(v&S+#QSuV$&xk&I&R3wN{&aD1xBs12 zCA^rmvn%K5+}#{RjP~6AK2_$tVJ7ANK1?H`Zc441C2ho=`@_xd!pXqqG+0wzz(@D| z_p``t-&b7QVkaDlHoas15U7`N_~73-EHM8ey}nl9e(#7<`4RyASA>O}=eixA4C_M@ai0LPKS|FObX#T6&+q_)~^YJ~o??=$@=Jd>xbJz}`MO*A| zgCw3HH14glkURIfE#gP1s^l7x1kKX)wIlZS|25vnhc*BltCW2D3=mJ35L{#PiywwM&^ z2xP8lXC93g3x8G`(z?)EDvtOf)ozLJZY9I1Wsk}V4nFrZ*BdC5GPG#1g7FtK zKJb1gGF}4$W^LD-eB(N7A6SQ-u{qGR9|2eYaLzMV1poG|th{{``Cn^qi+O)U<_wzb zXQsQc+;{Vn172+&@6^Jf;I{6edM|)TTxwpjFCN{rWK;~t0}qd zt3?y*C~}CMa_P7Q8sFyWKM&yhrKNVo6s8pyT|#8o1pPv!qK1-fG{0y`6(4vz-^KX- zyP3^%S3SbQOdeNciAVue4+_UzgZ)`0NzaNlFbhbxiwv*}eqBv33?73 z;`?=^3e!vGZWcYnP0@HCPS1RVdmrUWaFJH0^i9)18pws-M3!`xXFgOv?V+P*5S^zTKZ0#PZ?AE%!mgU^6mVU z?;q6hOC^>K^Oiq2`w28GcENRHlLCDa)FUgugUlh%e;U9{jtySjY)iJ)e~6Er=GO)xz@hpqE8bE(#@Y--nU6kKynnCV~SlW^jK&v_h5_Mx-L z6n0-zhPIt&!zw3580@}ITrwIY8b^urP3CryY`>O}xBm zKCg@1cj{Gisx7mZm*ar#VGS4DIj#c9?|m-x-ELXGgW{}?QhJDFhX zH%-Y~{_S3e!SMavT9IMa3}1kZ){rABu`9?%zm*^i@~jh}Pqk@;;H8IC1iBEYALQtn z4bfspRs_drf{O@-v931fFGSjrLL7=6KJ^skv4g(VFY7@jS@_b(a2dh1B87&yh1>rf zMnfC1q6Q`KrWxmwIr5@HXq13xhe8$EdOcHrN@j zDjsc{{s}Q`_oPMAKl1K6ckwr6SPI%gnVhW(G;98VQFKNGU>13`G|DkaJ7}=N%`-o0 zbLd!CP(m-Tq^#o7wUJ;#snWB!jdVf7&1 zD=HU^F5~&FihV-gG2LGdX_=QyH;lf69WWbQ7XuHY@Rxo!Vz2)aAInmHzE%Ew42`p! z2*fr(VS*<43r{wbiiGosE{t64Kur`CP>d5P!6XZjqHVf+TK_5Mi%kkm+Sr8pAv#r) z&&@J0c=Z+0?8H#ODDy|U&8DKMP9|NLeB&!WA@1aYD3AYVf_b^_8+IqRB4!Xl=I~Jc z_l^{Ll=jS_zf>}z^ql)%|MHn&N%O?Q+dlk5{Vlguc^NIxVuC4o{+dV0Joi`xu1}!8 zW5k#~Z!DbA;PcM(A3R^=6{WL)2?`@8bh>g6Ntp<@yGjr7unZnCrk_#1Jw>p+WhRSw zqTPP!X@&CNcEkLr+R&>N60P{I&+un|s~v0po9Q}CU*~&y&a1lc)75R`Ra`WZ>3Im8 zJM7WJcixYOt3AR8mGi2@=aOddo(|#5$4@rw5xkuT^j=aSV9(qX&ZxETk{)8!zKG5y zGb~O7TR7&gg-f?)p_#S0CXv+Ln<;PmHR36^YJF?OBQ4vPg4ef4IH#hE*8_N6eGXmy zru`x?)%N^Y-&mY;eZlH_Z?m3#Y;yPtr(p3>CRu$Fu7ga6C~i7QBl0g0r(ijFt8MrY z(d!Vo>W$cUp|W#HFa4M80uXCq)br2ve%-1>Ti!}fYB$sJq^k-?gi$3uzst+Rl zi;<$BF2)s*4g2gMd06@L;R<@Y_luyU6-Xtt-AXwFsQhWM$DQ_(12pKO6kOA;YF)?y z#08ThGOe_yG)?mkcIJh0c|#+HjmsCS!tjy6`0!Q@h^I8vf0fuUB%{T)l$`Lfqv@2W zi@l#KdU4i*_&#S}$0wv#J!WCTufHm5X3KnY?^7Z)f?i|FQ7khHfK2GlksP?&3d^+Q zxx(8rj?lc>YyUgiS>AjM71#^`@z$a!iH%aDO#D=1!+Vax z{1tYi$A)seGjVl6sgH@=!*T_v+zOD`D|Ole4)Io2Ge{?Iqa!-B>o-1YMeZK?^BJGl;pwR4n^Q=K78;cU!+>nEI^*2X9AW!2~G6`g_sN^tza#?YkE zHcZk)D~XDA4CY0(#~kcC+lFZYW|cPbWOpbMU#%1j-pDA&H0)S&LRa(ON zQgNjLWD807Rlog&It#2AmZs@$<<^hxJ}Z<62kOFRmVIGffzxmiTEAX!r6*N?Fg=t+ z5r{^w|Nm%VJ~>u7~W^Xz3CVpQf-% zJ%*Iw_&Us*UJQ^*r^gMs!?ywk(t4LsAjQ(pU*VvxH*}pk7)i!d$<2HQcFYc}soX5! zz3tke-x3e&x%}dTmHWz|wYT`CTF;(H+`J1rU+>OtS0aUJwf&X;yrNv~DNf9AtlhCv zP4uW`ugK_pT2zzYz>n{(wMqU$B{9%e^PjY>}x#=1xXFla6Bhorw?|H(Hso6Zh|+Jc9-xAd_JNS zwb3z0{)f~gfeG7W*86=q=A&^LgL3S@T&tx3R#7BsZ5Hjx#yGLY*Oo2Tc&n1Kot>N$ zI1Kzt{M_t+)^;EP9^T{4W)nI(KU8MUe-D6%j{4Wyc^_lCH-799Y3Y$3<4;sA7zn+}l4%1GZ zSOaITu+vXx3WqKJndXLKZ1bhj>IV{ROVDCgPsRt}>_;yAW9df4xT4NtUJt787jP`{ z#PerZ53jsE`?YP-qT%}mEmCnP>jRM`a$-~HiqDt1E3g`}u_<-saVi$QIJKSIfbdRO z0qHJ~`eIfi$6`w9EAMtsj>fcvyBrS1jMeFd|5tFdcVZ|}-1hq=&(vUJWsl)S*gEI8 z>wr9}n8TlaZ5|~>QEc8ka^%(TShquYP4_qi=Zh`sq#W_Eg$@%l02Gin;Lh#2^Q?>* z`(QsswLvsWB)FkD=?i#>p0M`Pe{jjEARho^zW@85cWffQ9oZa4tf)nV|2fngasu6R z5;C-5&A;hN64)dDQsr~agf$g&-kYhw`Dt}JUEXnzvW$AmnCqqm14d*nSWJK6> zWlc2ots`JnWSD^F*!MpsBSmj8AKHDf1+7rY)D0%rqv^xb-y2_viGahWpPrA0M@Pba zM?)nRa;~zc`wBML5~I;=MfT^V)Z60VQk>#d(SD!5-Owb5_zr?;i<6}Jadb4^DqZbI z$y%Gmw>gu2-pj8XD1#Vs4;)q90*!)oSR^U^sjfQ~YmZ1R0ep2VHop#Un$H3Uhx1Lm zjP1|;F7Yx@wyv@-VR}E&j(-&hp+khujGv;HKT(?xJ@r}s3jg8c{QcALcS3;TCY0MV z;bgiYHDVr)C6&)bm`MoEg{ivV+UnrZI%cPZb}*GFuG(s9O#+#~iJ@a1&Y|H46M+lC zOVOR_)M?%NF7luG5T|pUhu)RF#d@TP0ffqOWDA(hk{e#NeTGD+LuX`2~ONRawLQ| zX}qnPEtA+Zv{|@j`moVK{KEIAGAm7Z+Hr9CE=7p(~LEEE--Q_RhOGTbLH-K+F z^n2qNLF9+M!NWzMgV*=h@ScEXKJU`#`|(zdK3)$VQN_6v?mmQUZtzj9{81PGnNIPI z>N2_Hh8=}=RB*sW%>(@%yhd4hm5VNrZ10QcTRe5r&{6TP3zO4qojB9`lb39X?7F_{kE1tb(RmM(v#E{a!aB#LQ6EGt z)rlvMP>6Rj;+&YJ^GblDZ%jj5WXJJ%hAAM#btf3Bu6#5BBkb`U5E0$L2SH@r9 zVqHd`e^kyjf*^%t;2v_T90^(K2%#1Y&%fV-%2n|PL+aO{R&D#FyKAymP#5{a(1ck% zAti-%nr`*L(9RsPSAGVABBr z9HDI3WqW+HC}lp8pyMWhd7AO9VtgxrI&C{X_xA;hV<+7}+M`-CNsXD40AclxvzOR2RUWLQj(^I0b!X9cj zitT_`NLbl&UBX3SxBjMhlH3e89uo$zh`KTk${C%&#)9O{I#6d(q88*h;dT#oc$j7w zPfs`sTA9|-P%pG2w}igIvJlth=g{f2zquf+jAhb$sth*y+#gAEU@M$4da!>k8C$13 z!Ih?y{s_euS6DEJe`hd(RhuEPP%ws7Hp@j1BlL-8&8x*jNFsbeGLkiEN8sRe$1@U+ zwWAuHU33f4B5cp9p^Tkc4fK!AmeZ^o&_<}|Y6`2t{-35b&HzHCQxfx9iqctw> z$Qsw!SnAP8CrfMm(<@`48jF(Fyl+>@fJ~~6DA&rOZ`O=OIstmwcpPAy_#cOUhX3?f z#n;hx_Mlnygc0iZa`SYB5v7I(4O@MQM6c;A6DN9cuK6reCiL!=e2G*4H4i~`iJ@K!bx3yoS{OlV=-ErOiy2ILbXYGaXw;A87K&SGZn%Kk z=2{-j`mu^Ox@H)ke)kBwKdn@Zar{D{PjE?rjTuZgb$2YtZt9myzwq#12yQ|vTA6mC zHd%>v!W3d(x${Mzen<0+K$Bu=bM79EHseZX%$~N0!I~=pUV99O3reaJ*gR{D@rBa# zsWsfpJbACduO_Qp3zvPQ>#LT3di>t4AE$_7JyB7nNCtrgrRl3%?>;GsneU$wPhWd& zfdlffR!x^2{l*9|6h}F3dL?Uzb;2BCxRc%+=KNh{N!8U6ji7nZf&U(HTJ?NK8p$g6~%F`^2ZbQ<41E zqv?xo-t=o06|pBv_JJ5irB%fv`- zIgXa`p6zb?(E13$8db8+!Pve#IKFOvaE9XU>A0!8d$2&#PWD=a!Z@=H$8EGf$Aa(18x80!Y_Oww5)#O%mCSIf$<_SwKQAAAXJS^oJPm?Af zRNfhls2Y7-<4ctiW|b;p69e>nf!tyx<82w`Y4Pi#*b=W&(WYTaR4YBoV8yv+q4%cl z99D(8gKp{bwo1xR8#NJI<#f;d;a;TKZylm215DNk>s8K|_FUMcDt(t2TwiiQ6jyF3 z(GF$4uhKZ1BD1uwlEmaHbDC3Pu~@CvL1~55QO<5@yejh3Vphy3sSKCG$`K2blS^@# zckY2?)IV6xKz=otB6u8E=AE5NbLWNJ=8;T`(E z-QlH)+b{MXc!-g`e*t_gh_L?Nd`hxIb9*lIdjpL%#LxR`eT@ipA;*N$C!#}~L{uJl zxNm+DY}RF-KEa5DS;r{%&siaPZ|nJb#C?7rn3Iw3S18)Z-%8}#U{m}$^Zr*h<;~5y)suVx!5w# z@FazDf`P2xh?n_1J_&NA?hMdX-t)Co}3OCs2ntD0K}BN4eRj@#Lc zg){wTYqE8vnhr2is*FkkuaF*xz-&c;;x?Tv_1UtyDd_dDYFX+@SwKnd9~VWgoOLK9 z6hL>b!y0YrKXJ07*2bcsgNu|oW8+3~MmKpoL^ra7qb_JPyN&3<&$%HLsjvkve0LAG zFynNDmY9K{uK&&$^Hv<42d|qwhjpf|M+)pR&YS3BtM^MB`-)vH(>M~(DQ#Bww^HWI zoEjtVIJxq2NY*oRE>(@yX@cx;B-_V!B9}I{5`(>m`}!lA>_Rn zG_q2YPciY8Bzx!=_>ox-*Op3;s2wW^0F z?Ai!P`Z)ns^(u#3#8Bp<*ONd^Ti+M~9~>he?({D2A=RMIxtpmZ8o5t|>TS9N%jK5O z^Jp(-Nz=zaQNKc$VBg_4uZcC*YMlKdly#^g!Um%;QEFt1UPm+|0xYl>0x+$nUkraN zWQwHMnOc*i7m<3AL=+n9l|&Q^OGPjQ0V`2gRBgWvR0=fs(G%+e^S5jcJ5^j&$nggQ z^DX7CeCdrOU2&r>8ZS=Rqnur1#9N^uDr^m(#6cy;a~YBq#CD;fBJ3%j#1TubQyDmI zr&b!Rl_<9y(;A%jGZ~c^kauE*HruX@ice3H?o8C7%zShHCFMd>{w*ayTiGjd>vPO% zXaIEUm3X2(bxWD4J#|f)slzsu6w{Eukz{KHF;#T-V_44F4FkztQSvky^C&v2G8B6! z4mKKR(0KVWxIa)TT0&eEulqr#TQWJ~=VM8N=|rEG5cy0MuV+D?Ye|BYIO|uGiVmR< zLPH$dThNNvqoBvhB*6+C;d{yn`%p!pAs6i}EXC_pkmo{@U^UMA4duiyMg8y5{4_&6 z-;^&ZUp#%na9jOLf68h8_f&&k+@q|78f{2Ngc4hWuMkS*NI(S5(^Kn+W*ZE@W$y{D zX*Lpgjm_UA-PGqag1@KE<;FhmyQ)Eo-t_+y0?+y%nlXi72u)H&JHmU+LJx%}ykJ!O zCYvwedyqrV&Lgbg&yBvMUU2VKNa`vE;ZOMCw7xA`J|mPP~jB@qrDQ)f~B?N{1`i6w69chC8`>5SSU0I z@*nm%o{d^Zdw!8YcmICaIDEtD{P=MZu&wdP)!AKi8*unW;ooDmD0*b@O$=eN*D8VD zMVzp+Jz6cBBxLVdDCCgumV`d+@YYfG*Y5{uHrBTAMTHWpailiT@O`=t^no8^E(?QpY z%BSPBO-xa1I1rLZ<6o_df=^k#>k$2TmbS$c=b*Z-f1>woYhHSCVc(x05Xo=;}= z|51YXKgF5q_KyD>46O)kpaf9I9_U7r;g%7T!C-1oN77?j1S2rn6)|xK;AYef8Dpw2 z%(*Vvl5sA{^L&LR-pH=K7(Z-}>x!fZj+>#eaP_@eBk=Q({A}Oh1AIFS3}kQL;Ooxx znP`1j&D8bxyuLH}5ARapQ||(E$*7MS&ojzPz9rZP3swe4Gp1@X*LPs{<5yk&u7J9( zVvDQc8Na39N4&WMS%tNZQQu`vYF~b%U8kwX?M-^wx zO|*4vXWuZ@v}Nd-d_;RlwsjQYO!VL=0y>N&ljcoxPXk-96uniAH*mjI4MGi;T{>|W zFl<=akHR6E8rz;4ixr)CRMb(TE}i%XHYFTfNOF=X*F&>@c`8ewy#>hDZl2{F#MgTy zaSn;&?a3~2IyUCAJCWdVoMpVNBpo-$-^0K`jaQCuvM8x(`%hq z)}^~=JS1rb8tkXp!mSWbm6Ad)o9w)^me}50Gfpfu`}a6T@+{7jd0>;(i{4h*=Y*C9 zNq=Gt)cuVH@Nb3H*)(T$`z{8!FHKR2Dd&3hFLGfkMk~^!a%SQdb#+kJlPE)l!GFE7 zZLU=|7s`&ToKTAnF%7)`;)~by^YW1`y1UX%z!!F)y$iKTdUAWV|DM=BEOIMs3?AJ zQz-KLUm*U%r2(MA-cZ4To7SE1jO^`IWG830nmcC?_}pwx=)sU33<9EumWF5rD}Zvy zXKco{-Bh{yi>Dd9IJ+^*Ba)Z)n)InPfKjM2bQJo7mPfF?F>ZD~6sXe?P47X0QJ>Ts zhXjkv8(EQbj4GpSvOgN{Y5{y-G_fueXWjjlV2At-if~W3i4b7yBlXDa6Y1Kd5771z ze-!`DIUoNF(!a%B-@S$WBz+SB6M@p3C-NF{Y$6{D;1K@vhXrCX^)7vA;!CiFOYxV71zjF`!GQT0*d)=Zoh$i9kXGmGf50t8Yqy!)(5$q%)8XLF4tFR&?&TF1oH?K5Q1Y~OW zyu1h;ki0)N<{kGBQGaLdFMBXcw!WsP(nxXF`slfL-*&pMTdsSadh9)p=YEGrSky2L z$lh~Ohua<6ux}63u~+9D7`0_LaY!HOV6%EAlPh3)x~O(!8+3MQo)FkwjrVLd=X%4| z#b>{PKvL*S#G_W^Pkg8n6x<15A}VzV=)t)u^I;y}Aw3@6DSW5a0_f;4M7!;%4Dz$3 zImC~YGGmZFO{wBlJX5B`yFB6IRbM<(& z&)eJYu&X+x$(%w{KCbksQkYTi5IX{=qIbC^_H@iLz^v{TIVz>1SAKEnr%NBjCO(o$ zRj;tA=vF$?O1)5FQ`IYV>Y1okeXM>6oUm5Wt9BANf-uCG>Tgn@W544{9i$RhiL2Tw zx$|Q8ox%;d7t4*9oj$sM_F>oW<3~OfO7*9@qE~q_r_wLEn+;tbruq^(l2-Yxax@9% z*fF6#CilJ|tNbj*u0PBP@*(BYqg7xH)~Qx-0ruJ=unOBOdQ{8w63f#HeGC!U3hPpw zjc|t$XoqrYhPk_6MvG$F7DaTkV@vmYdzd@3dBR{0P97F3F#_B0d>^sy&OT?;A}rQ| z0#0PLigm=RxQ6l^F=aVp-l;4H$KQ7@f-O|GjHq^3uBjZDL_=Q<75**w?@@9iv3C;x zX}p}-1O=7ePzooliaCtA|6Glom4;;)CKfel->GV$7D>Yx)SKzm59Z?P59CA@Tq_Fe zH8f33ifUcu*2WnfdzRNpGaDN?dN?*5Km>MJ2^}&6!vL&Ms|)5A!h$so-r_?M8_xvJ zV4;PD>0(tAXV50cb_CA6Y^>RkF+C-{ojoF|aAjid(NKyyDy!A%3?mM07t*>6?}bo{ zEW8;5*K9;x+}YG2rPQ5ODnE*Bt#}!~6&r(VcHU6Qf)Ktx+MglIyw=G+Mrn?L)$NUm z@J9tz3S+M0wnYo8WPSy6TcPWfO(=E_ZO&@=UCGgslS3yoS1+%pBl4=viXq8?r3bqf&*NN_)Ro;6IrapVoho< zgNYRF^rB}L>F|`Wch8TS$w73b@Y_N&>j@6?+cH*{Lk3k6lhTZ@OF~lI!ytkfEI0~E z?f@XDS{>sRG1Q4|Q2FT=2O09x@+{HqeuS_LpIieF09362ekl7`>C!+&<8wM7_4FXw- zK^2PpjRG9KVA0Rl5?HZc{a-_xRkyv*qOtnN>N@XKiy6io!mNJNkFytaexPY_NU(wHOy5EeQ|#CDo6b97?C#+gNF$zL*Hm=*{$H#2w2B*k&HEOQ1KZ5s!IZt!bKW35 z^m?-txtH_Lpq~oGZ>N3@w_{E5KxmfljQ(RRJkuU47W^MjXJp`eT1r5C`8VZz$~Cv< z1LfMAAExJt6gg_CY3G%14=Oh9@)D?O0 zg&nC4-3qMU(fw<0+23hZ9*k969b$mNLE32ugh_DxN8eaJ^Ze&d;cq3)`g$=MYbK(= zH1+}*0YI>3OET3N?4Sq=!WYvHeHLJ9$)>gC;E|SYYc=BFf*VkpcO^ggA~zuinXKVC z^E=0WJV)X5TXz#uEy{*$j>qE=BBghbv}@(8?;)}Y!lfHkVue$OhuXtwSmcjDHa_`8 zAP!n83m00D;;`YIWXvxYc1o<;gmzNK2%d?BvyusqyHILoCDpd;L{(98MrkWMp~J__ zjMy{lXlp^TzS4jj7HySiNE!I4^yo?xmOPj}ulUM`hnq*SqJ=iVfnU4&0rxvna zQf^1$+m8s%4xt0Cp9RfA*rLM<6q^<{EM%S1i{~*YPt!aaO%i-k8Lp`d7=hb1WuKzI z;+rL6N8a-DL@B#q+ZuAUaaoI%?v46FX1vGswEULfuMLP?&}Cx;P;=ByBkB=D&q2+C z2A5@gMJ?A$pWVH;EY@M<=zeH3FKc+%+z=Y(=W3V--6BHH0q|qVz#v;`7dA z78m3$Qa;j?Rg>d7t?}#AvH^{CE$&538s>H}xjJt4I59=!2};=Tv~XfIG_^3}dgd6a zQh8c@Lw~31B-l!T&3&1j%9N^57J0gBD|Kzzux9Y;lTUaV^3@&OP zS6(()sd&j-UptAVW}hGG2%u$4*9iq z)Qv+G7?~_d|C)m(kVB7KuNDG8kWf+X=p8n>EQnuiA%AH$StgdHwp#H;C$`1|gZR#|-4s7q?7?c8#-WVCwP zeOBj2vbosw>{jB{>F32sD6!w0b6|=?IU=28yy~U2Y1}E`p{3N)3YlJ9!`ip+u9Ohu zNWAB8v~9K&ZZQQArCto`(!T7D>hIudQLCwD>ic`(V_w5l!b~7}D{N@0G(}*vO2NVw zmFcVFu+JT9O?@`mkrnobmdym(-=5-7H5S4}Y3;+rRg5-&>PF>Y5ej$8c4I`@NdlKt z@v`Fn=GYTfCte-3ZTU{9xT?juZHw}Qc978O3r4$Ssl6TjQ_UC%&LSdSA- ztmsac7#YejcVtt#tHafSKuCFFo7#RnJsYtbOL*@D9a0iShI#5^SUmf z>6xYLp@+IpABu?o6=^8Ok91x5i731ZH%S=Uki9pT*c@OsPYg3>)ESkwzkSvmK2zY^ zOgyemzetCoe>GAMdlYl|=k{Ty)?vQqrj9CqoFVEp3HJQry z)d81lyc`o)$_<$!T6@geKKOawJo)kAjEwE@@vIcXW$hu7oQQ1kZc0RhLP^ysAU%jB z9;b2jq9TsCIjyL#ru@PJv}Rp|`;;aGz!_0;e@e%-d#3@+qa%T-%-jNmlK&@^oowc+ z0P-}x;kLhB|7cq{PX8^@E1|RV)DV-`DWI(Vbe@27C+8!jhj6CF_(R^{4vY5;%o>9M z=0@A_ID*y%A*=}lM>EuM2?OV{9rV|HUlig{C?9uTh=mMwQDbFf+%5q*N{wF-zS4n~ zMYr%_^yqO&>$ThP;Iyi*^9j$Y)o0P~*N$NXh?Fu0^IajqSo_C>0K3O40 zFX|cQoF_8q)tCYu9{a$Zwt?o&3UaA+i|$Nl@g*X&8S&IkB-V2#ku`+Z;3EQhqn5bW zMg3E7>Rr1q?@zO%8Tbd{573>lVr$wH%Ct!@r4d1#KSlln){quJ#5VjU6?dU?l-crv zxPWFI`Xt-@buN3~#_n9DTr{}S+Ss}c&u7tmV;5DYsptJf6n3v4#DZ?jpu@#LN5yz& zOxU637)fT>3uI{$;1bcR1|_5mPFOFU-+BrvrW>acf)c@HQw$Dt@lHf4NzzoJ1H<2O z)l70PZTln1#@ZZK#$R7*=gBpWQ$^q3Ov6j2BR8Sc&%8t^x2_<#VmzMwfFgOJcV&is z%ex;wql>>P=w=mJ_y4L~>e`UQB7uHE#6Itqd}%Bb2di<3nGtdBlza`Oh-@QOwdJ^+ zieiUL1cR;iRR_3r&Lf{sJ)c~=F8|ys;h27$Vth@S6=s=c{NejWHSS`z zPNvDWBn0br25W4Cv2HW+@*w(ZiIF|LPPzUAES=%}XaOz~IeYSqk#5qKZqnz~=>sl$ zGPAN{NVTH%#q|0|{I5(Wyi@8D(zPgJrpw$~y6sY2MoDU0NfMt|sU9|3$*u=3Z^t~l z^J=4N*`6J(p4W=%k5-ZV-#@G2D}^CMU8kkEt%1i@&2~j}-Ie>=(s9siEHZ6vRuFKq z!ukqm=MENwy~dQ9=F=`wGqEL8F7{I{9&QpTY+o|DD|QnpTb0z_c@ht)`qkQG>uV(# ziqw(D>x-s(#Q0P~9mifHC5os>M}$fy!6h=P6NxtyfaQrm^$Oh?ywjP_c&~)6ow0q# zicd-M#0Z_yeFp?zQ|Jq3pHW_Ou1n~j{a%xH3+kW6U$w9Wb}0r=wM%1uE1S(fP4K)5 zY6`ujx;_*;vEeJ!l?6|*ah2GJn@LH--l;>hva?&)+lLDYA=HDG7@AbDM) zJV72y-Z8*S;%-WJu-y=s4Y|~;PvC0_WxFhmRol}D)!O~0&L*q%b!hWVUuR53yjn4O zmGu6a5k&K|S-#>~Mud@f*vSmM7k@MHKt>JnRI1VFIUdNuL<7r~{VkHpo~cG2(t}k; zh*gf-XQTSx9ho!RQY1YKaG+RM%d@`%0`)98fgbKA6cGgOrTX%^Lc@lCtNY)QO#FnnwQ9q`jLI@7pD`$G-`3b_HN^566=Nj)n zIYLz9q5A55kWae+Rzg-*RDt5&DvMiI5?2l=!^ssG)5#<6<`Erh3k?}fuF47VGk3X| z+WwT~6S2`*mE~)HxDTEEKGL8Yu}AYm%|Yl!>D78)G3pOhSEd7?hD;lr*&zGS#6$cskEcSENw5fR)RsdEyt^Obx>1Kd z#*fXr3yFvNwE3q<*P;dM zgSNcPPfnCM%|JAcLVPDt6pJKe;5k7OV53LcF8KpGPyn60E7`=*&3t|P$E~96verh` zvR1WP?Q&4j3do8naP`WDRc*`i?;6`$-?#HgD}Alr>zvH>=}WWw4272ur|Vqr*_V9h zSVjZyF<9&9W_q6C;$6If@&%R+o(KW>S<9_R#PAL1n zY@PSWXnyBi{r11=$X5ZqNB!D2?#Me~?(NTz{-4R(U;8V)9e)Xt2}0aOJrF;s2i|V{ zResD-5XTy&K_MEl#qN_L6O7;yj2!_7Y9rVkMLK{C^W?-NMZ9o?MuX77NGj8y0H9r> zIMAazGDbw95p%?p`_4e}==R`{)B30pawJ)2_KnyuONnVln0`{5hcUNvB*TReqBIDF zw0K}VO(8qf1*C$^pf*VLy@04i&jrAG*c1lP0b@e9XLNnH5q?K|IrixE{SvhpR039q zYF7%GZkGyi)0q~H4Y0n8u&52V5aEGbg*`pK)&jn0uRAFc>=Q#~H$bgcnXoYhVN3pS zBv~h%MemO$AO~udA3?Z8bA)wsw5|@=6uBJvBhw<>hZv1CbPvX(AA)p+R)|55q~K-{ z4~0zQT%ayONQH3eYLFlB0rH9*kp6vu1TgQtqq;vf)5Jay+#PF-~w-O2SHm{0{5 zyYeF?gC_Sg03~uFP$8&(j49#N*=aYef?rhN3detrP&Yh5m$M$$P$~CV83~5xvtWS> z=~Qtb*C}3#S1$fIb(xOy^2Gj^vr_Xep&-S*M@s-T1J-(RXLpy*o6m$E=b=06C2XiB z-o-lep1LoAzY6rE)kQ#+8&U=yh68&b1AfpF9vl^bOEpdeZ6HUVlOBE<9mZO**1TYK zdBFEAqc#Y3z+LMW-X`RH!iyX05UJ10Y||oIwzM}E%9+b{Y9w4D@Anb7&%& zXUO)%f*J^#z;AIYaPopEwi&F!Z{f-P(^|GD?7xW&Q;TuL2n>ow3%z+&fd`swBol`a zmLd__Z#0R~fvh}5+@*vR*`$89s*;bwHc;K!w4TN;goBNgjXY$)q=TFmgPn@a z;)M0f@VyW=Jw!VDDJNlYomxj zum*gJpZH!r7a-f^hlZd|iMbuPG~k^Ou31%7I~Dq{Fg0l$53vno!A6g&wXlfKRAB~^ zO<1>&)W9982y+1D;cPr6uBbx?eeGGg^YbMXST<8+tYB14Fivk%R{_cGJXw}I82Ghy z?K|$GCU^H}yajp14>%fvvR4Pl&6S;pH1Lfzm{n7O7FV&9v8pQFwYmx>Tz$21anQgY z;DW8{rA=cX_4y}LNm+aeer7O?dhWDCr!iPG3r1&Or?5mCnyPPsp3_!Fv8g@j>JJ+0W}x57suA zi-H&Q*4~~U4cX2yAgVI}yhXhiih{5&3Zh2?AoHjUA?%+d?Z)Gy1&H4gL-U8JGXPRS z^vD3Cw^qRX{UL9e$9mBGk?PXVl%(g@?XI+Xqf7b7H(t>8eX}qg#Uc5F*%3JW^nhs@ zXV{$y7X5@9w(eZ<>x7$V9tUzi$$_qRS9ZTlNdzblg#qsyJz&Jfxi`{oLPCR@dI<+S z0>dmw@b{{a@Y{$G@s4&p!lXS<55a+Yz#tT?a!l3bJrz-0VT84{2JBG9Ng?v^|{m)JNP&iX-*rCYq|h)&L6_0cOjkQ7f%A z9-REVVJ}Fs-H$pgfBmF7hlm-8ZZaRd-u|X~dF15^tDH9Nv5OX9U&>ODRcbwd0W~ro zklt~M)v_C`*27O+I}Gau5>2{D=TR0)x%=`pnILx&Lan-arod&y_pXBJvG zU8Kc(bdezGy@ilK2#b!>9uPht%pfyUmCCMi zy{9E?;tlpYozPhX^(H>TWH1WfB=sNfXHe+;QOq$rGD4%fpC^si4pCJB}fXV0TkWMiXhl+FDPimA;9Dfpk{jEC*c48`{ zZ%FSbYH=c2(GlXaIJExoD#av@Wg;t;lgp2qW-G-fz4iJgwzN_=vs^qHM5}ox`;5~R zr&pz<9lC3H>p-WCQ;4(OptLk_zWjiC>1T-FlF=>|&UPnTWo65OediJ;hLDNc{ATf9 zvNDnK#{QT$^35}&9rm!#Cl4Q{Q^oj(FCj{rZ$4rRlB+|?Qfg;zJnJ&+7n;gsp+!2aVc&2mV|JWgRxNb3JCWCd_oJ$N4OD!Q$ z$ES{#OJ+w1iX@ro)ggBiZkcWnGl|P@BLB3%YrnwB+Ti&M|K~w8%4UJsZ}4T(W-Ezy zuG&^Vy0(ozJ0~pJsmra^?pDEqrj2?%CgB%(8AFiSs`f#2k|NFF>4xTRYw60O!H}%_ zeqVj#SC)Yw8LS&io7)2CWCs4{?}Ghen-D`=es&Fm?MLJOHDy|?SK#e(OW!J{p(#mq zqo>qvEsKUkxf0s>om9M5l5IM1h|0!Z%<}VbL~av~10#zo?BWP+*Xo+A3e#Am^HUpp zyKRFog@FWb8_0W+a%U-Irpxh>L@1z;sKe}qikVL!9u}SIx?Ee=T=-o4vQ*UY&jMTO za>4u!rg~fJ`;7UCCmcOMD`7WH1hvg`d=nDv2{E_LG2gD@$z%IjftHbUS;u(%n@!_s zqy(2G1P9=CMvf?=k}EkBR;Vq?3& zE0n=329=@v4*InFVjiv_K{h<06yOaRUrpX z>iJ6T?DKeVIR?vAXLVF1AX2CEj=~02I%d`Fj?7VOB8aU^Q{10{t63*|k#N#w^1e9h z7HiPj^VzDqz^VBwfnlMZPxADS7DI=P_$xoWd7Nz&BVlM#`D%tkcNd9D+^R9iZ(0EN zGd;8)1U>TeT*ya%&xYOb(Y$|=g<_FY{ZyeeFe4|!1KFOxg|7#T?GsRKpLs2?1qhaW zjI7gK`2xUNA}<=p3bgRQ&9 z>fp=eZ;9u`bYm|K=mqApzT3?>WH&pnh!VDg@Uw^cI@$Y~{B@80918c|kM@}jz)1dD zarwk{bTHW?lmUE!Y?a;bBDiP0vx-a`i#m>R!x+K+R38?I67=JmOT{Q4en#0U1>J_% zpMhct4KN!j_yIcSN+|%jSAgJxxMdBJTlxn2gC8MOypRH721`a3F(^Co2x%)lCAXFt z{fuUKh>09xQHHJhvP;>7ya<4_m5*Ez5+G&lpaoF?sT_b}=m zZV5nH958LBY}}&Jy*en{ayXM_KC#3CEje-|Cx=Vf_>B_ia zse=Y$QgUgXQNs~VjZX}%T0^ImZbtGl;3Xki`3E6v0ZKGY5oVwJ9=2{}$BnK>nuwqL zuJjFW1==2`(&5_;sB)s3vl-c8)^c7+<#G9@WV~n&I48#@aph1-im_K7`3q0Cfq}WM zs8-Ubga5K}xAF>J*-MROrCS{@lyVh8cnhNjX1FtgI`=AJK<2XC6L5ywpBi2u@a36K z&;<2AHSAEhMsrx<@FHs^h-??ZxXHmMBmKg`w2+q6K6qODb5i=YBM#bdY}okOh(hC% z7T0An(~PGXo^V{o4WSU72txCUYf>MZMsv1E_N#AhB@ezD*WC1__Srk`ze{I3esMuy zZhAPgoDPI>wvpXsJe_@{MT3=WO>VWi**?BO;ZF@&i0nKG=_R zHT-U9S2#>rgnJS_E=$lBtqiC3{czK04b*w&w6*QF@ynD+(t3c0G9ci3GQy+tfod&s z&Y$N(%ncT^7H_(KCm9!3&~I!ATA7#HFjNzytohlH?h5V)p1+{GPr7&&BtLNG09kb- zT16Pby;rTmFYkHIJToZX;z=L?7EQrn-aTlV4o1B2-H=`BQL zx7qmHX*V7s@WFweH`kj#sQc_&)pg7H@kaP;|4zP48^$@7xqdh$+y3&e%EQ#RW3hyj ztls#$pE2yaQIPCEDG#R3&X)H7)gu_2I4L(EfE7C13~o~!1m&TP#jeHB`12g*V5BeV z6hwHxDFqsVlD0K;PusGHaefH$rZC1|8dOYzC3)&Soq0DW^X1*^4agx1AD$9Tb&SHa zp>V!4vmZk^E*_E(5d_dNJ%?$RPPBWfNiyj|(`GGar5g6o;UMbKufTG=d4v({bmqz- z+)AY5$9mb;;cwi6PXOTAbka(rFXEx30^~wrJ>s;kvcDnr_ZV;RI&T3;tba^xETQIh z?;IK0&Y1L5&^J|ztQvA?o7@qaTguv>Zg$fV$FFN%P!yeM47A3vFu`^CHxSoK)pI*L zZeKZanlUe2cL%8==>OnV{ArkZthxa5rr;pp z1m(w3iU;6(C-t%`1Y3m{NGMV%+$r$;-4+d|CESAl_u>L z1<-htIUFUoSV~I4CyJW|l0jM$G+4<{Ktux;)QFLz?W!WVSrFpzFCCZtV7~f_Hk} zbezJC>s%&tJ6@wfhK1%`M*KN&q5ONo;R#~1zuNCJ-&!}w3x0~b^)>AL>W<{(MEuQJ z#>zGuH%ytoVWuu&{U8ZeNU{kxsTp){Db?g@`}fLV?h0vm3o{hIU8Q-+=I_XRN;ZPK z{8TVNLqp2sH+{!n*LZok zGsU5wpb!|v`xqjdBPkMUlqTIqV4fgC0wJ_1P|64B4H+${Pb&v#R}e|maz8Sk`(3!MZ-{ zTp}aeGy*g4_%Ca*235|@D|vT~#EOKaqCPbiT=8tyzU?;SHdi`xno{;8+Fhz_cA>C4 z&zoaUx8a-o6nwf|Nr2M}_~1v%Z`-SkENd_AEX8|#d+KU7RZ>BVPO?RJ4tEWKo2jO0 zU;jj9e$G*6t0ye4nMz%nDl)119+wJ02EfMCtoF)zL}f2BYxzJ9i*oAO2X%Xk#Is4U@-0o)uWDl%i)|zlUFXo9w$cE@8Rd$p;%mCTfKU@$JyF>K zc-x1)f?x6S5jMz-4|^zBUgJ1F5A(YbAF*l0BQBGM z=fth8_a+s5_#pI;_$8{H@IoisQJyVJnw`SPL?oz1OPE2! zEo2e>f|}hYkjd#8gmr#d4C?fyk`kKZA-n>(cND=^gKChgT=3b2d~t~CY0CJ8UT?yi zhaoJDBru0%O9l?nxsG<9*`Y2XEkrm(E`gj3TA+;#DEHl&NZwqCRzrO$Mu69L&c@=7 ztV5Dnnx-lx(9eLFPvJ&{5W|bOFueRh{~hW#o*{L`-%vOGhC18-%9#HTsLMOJe9t-O z|8l}A+sZF0p!v~RuhymjqlO=df-9~Trl{|-L5HNbH#7|Q!!gdMC^fFNthrWvjU#qf zV8w>beo`ECm=cLf!aWS~K5aQ)-SeD0Z0Yy*et5q7t z5Ql}xxFvBbGm>`nkOTOHT{<3YS{nuuJkEbpcaCH)wAy#bc zWvRU>_*+|#q&@l#Zq2vR+RiumE>d6Q=~W}MY)bud}Br)`JqraAubYdn`K2n2g=%JgYsuV9S*Nb~-~JG%9N^ zy*|yV<<8a`exfmFF4qg8maMZ=cb(lwlO^b%xBeObF(|lvL_2y{j@>z%pg>Wf+IiL6 zTJi2Nyy4=~3ve8gL5e*4dk}<0jGgL*KZ)yx8jnC>%m>!F$71zzkI5=abriLE1DCuI z(aoI0J8+AxbIhEnbOVG)#$$xVOCKAgcZjAVuGdfIa=RT61jdCG~PhLK}hX07s^SiNe7r1KHbI%%5) zfE5^@w_EWrI-(d?y)WUXeFDwbp>G4d1*ecnI!_pZR`E$LQ6d?`{v8+ww{@F(e$Xq6}Paw1d`;V&7uf?DU8i7Wpw zpYi`Y>`fiX2Ee~z|NHx*@V`2~|CQnYh1tJv3b1QX&FESJ7wl0$ect$zUHrcSVQ}?g{wFvNHX8~<7GJC7#$gI>GCsy&>)i_LszA32J-QS7kTZl z)XDIf25xJ1xW8X=lne}0{X8w;ue=RVNOYP!qfAk0=?bkL@YERU`1Krm!&$?w>Ais$ z81@``gR;?W4x9V<;qJCOoL3!OPrBQ(qlE46;WPG=x8fc)j<~;vx$-o8qRd&w@!T%E z0;xmLqmC^nLW6N&LUsiIu>Uub{;|qryuH>Y`i-Kp@3!Ud^#LGbds}*2PiIFPdSfek z4-->2LkCOxe9k%q}SusKnLM8m44y z_DSIa!)XInB1dS2{s>5G>2X6d86T693J3)7_uY)ZcK6)?F)KhJb~6pe8?{qYwwhM= zC(mE$o?UUC?DV+j`hR}h(*w~93?&R$E0W%N#e`Wq*8HHay;$fZ3Rms$Aqiu@P1C6x z2bAH#IBBF0ih&J7v5|OW3tC!q($>h@-KvEHYzoamE6e zum+^F3fCv$PL`41Puj4AzC-1)lE9~taJy=&8mPLf7PBjZG!I@e+E_Xs^};S~V~0%Q zK+^L}vp0*#;Idh!UjrXE!wotT71OAWCcKXP$kZvfDHfY$8c-2iL&gh=?> z#u5r*)`WHUt?nR>8ymq0*|B2cNJd+NbY9e=7bzh#rW5Tm40SWRL?u~r>pJrk>0-%q z=1Y44%bzZ)NHWsg9$8}U-S&`Gxv1$t3h`Q1~v1C43L(Hv}tUFcLeiyC> z4#O0Y&2oo@Ythv6CG$o>+ber{L=l)y$gllTNxZ?REHew|7$c{M5vG2SlQi#Pjrta>aibPFCD5fTizv|ctMo|NdB~`-6$JH#{dUK01ub6Xw+K)TU8cUiI81dXwk6<7m;Rqj}0N0`K zPbB;H#8WRHNfE^|^VOw{vWm}Q<&C6sL^~6h_aDHSV-Oe>jiR}^sl8$i=!P-m^?MQu zuZ=ncVlB}LE2sbhD!@dSe{{V>R6uYlgXX~9k9p+eBNYwFNdE>E!TJ;nd5#}sY|8)Dat6P$Xy)XMAl>Y2A>2AU`)vSDM>jph69|GY~JG@jqDv7LugMQK9 z&JK#5cd9))(_rwfxA^tzHzEfg7~WH)U*b+rNIEab)e!|?X>1r&CJs^gT>y!n3(Z{T z#4Ze_eLtnAS+8I9?rQ$0Pcx^Njx}^W*ZtkU>{kBcH}D@=n>W1g(YEzXN)-P)A=#Py z4=T!4mbG6LK=R!zam=ny0|~sDUqI1ngYp3YNreV9i>e@};+%#qj_imGM7#9J_6<OU`M!lL`lMjAz_+gnEYqLeB?#0A&{ue}WVU0-GQGRZ~M#>TEd^8cJ zlw8i_N90GTQdX2@`ghW*8CkDY#IFM7&XywEJr?^Q*)%hkVS-ELG#?bIGk(K+d8(8h>4#C&s6#+K4Z9dUH8Z;B{v*UHNv4ZKmg2_f_C(iKYi4sfgiw|P3 z*k8*naGrTK(2lg{Rmv~S6D@#87ZxjonWp5EI4V+K>K%K6QArnEwMw7ZJDowiz2Vm* zHchy^$*f`KZ}16FuXdqboM8$`>UJ2?6;_?{ua=>%M6+EPuZ1F%?$mwTEy-KGpo_|0 zg104ak~0s&STI6^*ait3cgxOY%)f;HKJxSjrw*XM5f%gbA4lH5AWYKM!G@IazwS^< z7jmeAXrEzvt+cR9Q5p)!rlD$~u_DEhBN9^CEIpZM07(8R7k8oZ%bArwt>>`MRG(_7 z#xVe3ABuxa_`o4;(sk#TnVkDvX6}=>`1(DqPNZ44_kAC{H@(jTc8VqU`=(Y5cK$X zF{7abe(Sk2_z+aanh(OvK-sWZ{^QS&(b-QN3Hf&Rm0+9H3CL;ZM&7b>H*^24-;)OU zT}x0x>Qq<5@$#Dt+qO&jy*6%CvF8Z6S1Q(<^jSmQ@AmueFt%1{Z0SeQueZ(O$f(RF z=FmODK|Ff^%!UK|4*87Niryh}(&XGH2{xmQpBY@i5dAK2{0g2J_svg~XpK_RNdsK1 zHvu*v<N+XTFD$@`*YTWIgr;0V|b7htZA$Jamb&Mu877l7U9pO=IR2<5YIM+V9Z+ z4yw?Fw%i^lAfOd2ARwCmFWUMCsQwA57L7=MGZTP~!6fG^wUMi&osu#8`R)|_C%FX-pY8Sq{ZK_`| ze|s{=&3Zj zu*I#p2HNe7Nq_ygPr5T`zk4wp>_M2{vm34Z91yRkbF)w6lQ7FS)P=~rEuL{@xbj#` z%r`<#cyffS$Jalae|V(a?UR*08}VEdF&p{Z4MdqFQza&@BUk?I5S;kXQkuj=V!(=^ z@*+;*NasUEq)aZf+nE|#a?x5$ek)48YsQP39KThdF}4_YR41nu2ASY~P*m-!sz_7u zZi+-+#!3+1cWL6PqIU9;U}N!XMVw?t#j#W^n4GHMqAhP$NKeCyH9d^UQb^8}AV%N) z)-4n3D+2yfX9_-+r9!h3{dzV%hqtsSPee+pl5w4+RF+-Lj*of{ z3gB`TQ*FX#El&-Q4a6}2!|htCFKd2)jpFjBJ?o5lDaD4SiQxJt?UCbMP%jd(=_z)u z3+!|VMg`O%j&?gdOICS^Nw1ZBzBCm`5ST?)_Ou091$kAF%KVgghJ zX>hjXLULvoqjNoteb{bJzAq(&Hk_3aSg_DKC4`Plq5)V+yB z3RDs9D$TXua;ZACNGKh}mHg6B(5@2F)+v#H#!KXwBI1;47-tWndEVB-o9SR7f@|nTm)L=>_eQD9u zI>B^K%*9_}MM*el!6T-&ZLvK538;Oj@XmFWArB9c=OQhBcgnU@Jm0#eo_JKyKzTsQ9fr%$_3+gRk+k- zJY|HybWsMnV-5&WSoD70Hib}j%RpaWF_l`c+A?8~)Al`Fqczk$hst1D7*a+(mk0b& zU*>N|+m0jAj*7#GrnE*;8(BW|FcT8cEFcrYJl7xy47kuKm@`#Ok`Q2J4U5|n&P=0K`!Z^* z->G569wxY9lkTiSU&JE)fZhAV=1@mfhdpAxLqMMD+=1_?J^d>!lLy zL6$87&gA-pzjdQ4UO0Ve2+L-s3Ig3OJEn+vv2npCNV8j|;v+=WI*9ik=5em@p7PP6 zG;U#C8<54IAX-wdo4fV-M|NU59lEZU65jsp&Kw(?jwutxE^`Q7XLvaFg*WS+(lR)f5iADh**Jrvd#y=!=d z__mIA;IcE{;{HHfi1fj$17g6@n70~>6Zx3`4`bihrs2tcz(ch@7NKs*NPPjegoX9f0!#jux>vTcD*N^wWRD#TvW^dSRjwBE*y1dS^ z4-jV7TYm%32!Y{_o>?PB%Mq446W+RrhS^xrI zi96eid!Oj>gWH08hO%3WUATDx<@xu!pbH*!HXJi@^ z%|3_hQADgaGKB~|6%7LCG&_sI>}067$jbCj`kfiv`YmbviegqPAJXEJ=uw?oFmE z`NsBamp`R9L?g-2?l>QIRRxhxynCWIY>1ZW@b&y>I3tTqW+$-e;;``S*(qV#D$U%W4yAT>JwZOV#11| zEUvt1bT-rLe{a007%KwsR$BRxTSrY!r^X%8;PzwN zb4?gm(eba}Y-)O-*PeKp3?AA(HUGGg9J2Fhit34s;*%TNmKoX>8rqf`+7=tymK);R z*>ZnVC0gMzeXdP<2Gu&QeS`!IUeX&8dOVWvO4800COS$qREkw}ZMr8b*u-&N*+~|- z6Otluq@S)yW_9FMBx9*#SRW=}G8hHCbFe4Lg@g+G)gLoaW&3OW^xWmQX?HfZiYcdg zKXx+*J2_r&2GC3Vn#XeO2t4X3F2hMWD+%8v;3_AdR@)FG%ko%U0CNCsAqn6G2E)Ht*~LE4OaK)1xRW zUwp@oo2qS&5`C2+h%E69IB$CIFtGu2tW=yF`HL}N=nVykT&a36+2MA{;gp%O7ivx- zevaBrQa}mFLc)0_<6ZXY3gGAl#b;FZw8%`V9u}-`_S}Q={igtyk%HJR8=}vgwVkMu|584x)5vtNa@Vn~RYqlA4;V zo&7FbmlE4(=mw`x%B~AeGC#}p&T0t_b1sykFW3ryo{wCm#evP?cEP)wi?nliB6dtB zoAE>s&EVw;l%cjXhsDWuRAF!>$c`zMvMlB$wp)DFTBrx#S4B)DUU}vsbRFC~ z%djT8uqZIdSqyJQSfD_w^)V$Ob%RrrA}JEE`M0n|tSw?jn5SNd(?uw(b*#-rB7yKM zp5-pEg6JWfteE}0YV1{i^R%{FpgS~ry8{90VZ2MqhI4_cr*!EEsA0H#&Z3%~@0hPb zeVi)DJCGjbGmMnbP(|R_P;wHd*;mp6c`78LJi^q3GD*QSQ5~1UaiO%`LT5F>psu0Y z}$a6j@*$=N9Z9LKDX>=!L${($C7o$0~vrAyTBZMS;EyMb0q zsSeTGUB>hY+_rqd@tMA>5rAp0=B2qs{t)PQa@Xy{OMFpE4M0m^uQ32cW7Zz1>}?<6 zCG8hcn<2ua_3xHseV6k*t`9-GO$bSyt=U0=so9(U-XOLN%sR1-gM}Z+EPvC^e;pvy zLBGad+}mtLN93OsS<@9_uRJc*hh<#^RhddfTP~8M8_6^Y-9WtrMo4umI zxeC-0=!-T^{~f21`j0C-yCPmQ6^y=tx4kV5C+UIW&Xh=+kRR*W$WLO*q8KMnixJ-# z$B;@tg+KuHEq%V0H>?rwbnz93)2tR?TghpUrol(AEpmjN*`o?3OVJKoIMJnnIHOc5 zk?o$b!u_lHdoqwEF;m~<1+@&Nc>yEMsjw=yMF)wxdSa}4z9taN;I=vwgWZa)P$}}! z92VfEiPewmqGD_iXE#dw&tFK+h5lis*gYu_`VdZ}%3hY;tHncZS!q7^9~<|G5GJQQ5_nG^d)wRr9 z)z6mT@Y0CyE*<&~l+fhwHJk>l^pbScSM=~6E?Zkm^8}mqqB7GvX%qAr_eqtLkGqKbh}y~ExKQfF4r2)j+6e;f7V->{8+2~jE?|?j~ESyX>%{R*K(fA zwugORDPVn!S`wdOs~i1r*B!`m0No74!dPUfB|2CeP6;__31BA#!ySAy86&6AhjAad z5hq8uYC*4`<9`BP!E02r-US6xxaRXEeao)=VPyXmZu?KT+btb0RNg44Z{n}tqxLGrPKRgv?#Qv9|AK1$g_{BxGYu4f0}o5zzyC+& z{nz0ku1C9NUQkd_Bv4ydP*_(`Syxb6QPA0k1;pXG1h47NgZzb!h0cW9fy_B&QBVRH znViajdg0H^flg=doR3atD^bwuosYTv1Lc+p>|98J>CU}{{DjMF z(A3bC_^3cwamI%FU_btEti@`j5wPidn2qWiBL0t@)!$9V-+xum#lqUy#PRQ5BTGq3 z?k@nZxTWY^GCtA|T&1naTi@^@SX_KSTySnB$Px*!WF10!Q))GfZ!ZMY>=pH1B`gf;wIo^%axM2E`4vU~ zxpnAO$)>@$pJ=YcLS@x}uLQU2jBn&?xGJRQc~qS#VM(KOksRKoh9R1pFy2==17f&t z9i7|p!}%pIy71%T*W>KB53>24F;QFe2kWH9>Q&!v)d=0(kZ!@hNQKp~p{~Mr{MgoX zPSYLh%3uNW62mZUpi^HK&cSJFTv}a1i<>1jZ9^mu#&k@c=-G@HVCEA739Zu~RVR6R zjyc?8&`?uwr1b~s)np#R@*I~RV*+5)5)F8llpjoTx1WnL%vWC=U7pU~P(2k&h1ee4 zbJ)b<&B^GlWeiu)JGXr2PRKeP@w}Quq?%4}e$j!MUIktNjj?-(^6GJcy-Ny!!mbKx zY7Yt3Pl5c{CyzHfVx=9;7%4U@!W;3b_7-}AZgV=212bOwlR%*}BHc-nHj2fQnMW^< zJ0~QW{U*nlC0F7K8mq+j4)%WsfRX7WfYWyXlzgMORR0NV`_};YC)Sp%I4;@$O@S+| z4-LJPuD$6x6Rc6fmUc)A2YmE{ z7D#${|MUT|1Te>@F*R-WCgj1GclwPyNk2UI{=y#fZAZN0n5_5+^X#aHoC4DZ% zW~l!DCRsz$k-vZE2|p^IGe-X8ym{@e5|Y$zy7CcA9wMl9_NiXsxf3K&N6^_?W8P)0 z7hb)S4ZgOaDv;58lolZ*hTG=t5qu5V{N@e?DoP`*Ki8WOY;u6{ZC3t6=u~V&q(r10 ztaY0{rwyIbH|GaUAgF$%I2`#IO_KR3#!U7pQQ?RppYsuUxk4skMwK z?JP|U!(9XrGIbPCxY#~EYzW0csP?)9bd)M?oaeyECYToM=rytQ(hnx%{3_zoG`D}A z-Cudi&T0nQ?ECDvzR`Ee|9*D=#_&Y{86j3IIL1mFV#P}r)A zPvuJv@n290c zK^bo;bCLqW-LF$ZdDf;iWTX1&B4`CX{U<9C;!mmODx_>=yQ#s!KqSdX%O`p5Do3nX zd678m{+4qkN?lAeA@d3Fx<)xt(!3FZwM@=A8(I8s3;3D5jcU<;brfK(L|@h-foSor za{OP(n5xQ%E!4BxQE~l|10LZ}h&kf1gf<3$c3=*0A_A6)E6L?#KmlYX#v6Dc`vE2S z9p~j!uE&14A|wx}`uC%A_0QW@rD~&wB!=t*nowCe9$C83 zVp*n{BBD_>m(NdaSZ3}XKeLd!)^1(g%Dg)0E%1W%3G)f?l!-W9cKq+u=S7qAsVYf!=%WkX@s-x^JJhl)Wua<>}YbRhDl;fv-V zb+>}O-k`z+g?ny3mWF{>DL&be$8K}(T(t;@6eKQ%y6Fk69axQ|mIp3y%rRr;_^R$| zlIXlH+p*QQEPbi}XF_TfNW}!ko74GHu}KQG+vG%O_kMM}n3{Q2iu*+_hi&ht{pekl zW3PQ3?~`i0ohDWchuXd{0Apgzd5}g(z*fY#&&6ko*}F_XNXSBz8nJ5^$M7MPf=BW@ zRX~IINJEuk-yO~^7en#yRM>bn&G_k1)sgWHnBy@ll6WC%Bq7eIKw}?A_cC#V7`EMk z+K(QkXc~o+qzMlzq2g66BiW9@0F?-Le8%c$L-f*V_n$^==XIXTqbb;^YRhdnvc@8> z_fzRs!SQko&Aj%iHVN=;R9=zm3gX1H=lxZbEfayI$cPR!s|+~S9jwV2&6ob`*;ZoR zav-c`+>{KdCRx$K*^O>>Hpio^t>73;84{yIkLe>EWZ-0)#Y#M3$OZGyx=ar&S7xmX z`svoXW7b}Yy@SpmbC**g^d@;Zeu+fY2~RB2jA`yQM*OPD=a97TlBEZqIi&~JGr z6>ogQa8=<$Uzk1vP%x;fEZY5#OYklM@-kR1h3U-=8B;;DwqkC*{UqB+Tqg5)GjJzK zp9k#gDp9o1l+)m*62ak0V|me&d-%5xqYa6!wi&tvK$d5oWIm)9&H&~sq@ z5;GVA5#4wvy0fVgp{<&ZycrYDr{+^LPPk|z??{@T0kVY_OVKU*LtM_>9+6Wxg;DW1 zh0#=8Bj{>wx#&GaE}SZT@!Q6Q0vJMh4oUDexoD&et)gMeqhA~$_CPsfHAEO#Xbuo@ zRDIE-izbGP1Zp|6wm&? z{1GtVW)SIs)J7R8RTxG^bqE!nI0jL9i3VtBvLP3q*(EEWc@i8z*0`LNM0rpiy2Z9L z%3FC5?IFeDNGz2Stf4s);!KF|qlF7gAdyNZM>bx1TbATkVT z#(J zMqch7jHVDLxs#?AQL_V8N=RU)CJ3Ql7@Bo;`fYnu(qX3eb$>zkqr_p6A5PYsy=*_p zA6*tpeD59h!;fj#QMJEqhP&K|I%ywt%1Ch7xHT{H%rEBj=GzQK0|pJa9ca9zsKNTx z|FUiQjyc@Je@bH-CdqlR-kDN$UFO5*;>*tN3ZgM~y}F7Nc(3fCp5JhZN()d2WW6bc zGNU5JSEZV>kr+xh+<+v|Nso{K{}Bsg2HmtI>J7!KD1Qz9B3(;XI2i%jH%OC+37VSFr{o(YWCuEMop&v zY$tCaOrow1iKH&<#XX$#_$pQ&qx9u37Oy=H9KdH{|I+9em#jq~|tIzX6$u0JwB@=>{49}WOLcLTM~$gEEoD1f9UZ;eVJNIBCWWW#RyN8^6% zuILWj-R|t(A0kwx1&h`jFXXJCqB5zOHjw1JIRf+pRBS1l6%TH=Xc4BO@MQB!{VH8E zHuHXCtcqrw1`7H*D0dXx)fY1Zfx|pUzN|!MyB9yl9&RK|kI%C%wLaE24E>2fAPeWv zGcE<-)p(kygI)8P>Ol;8!pJYiyt& z_C`-;08D0&U7$U^PfWX`3~cN7C03WSy}STk1UuhL924)?+p_UU_{G-F>{UYW2pfnw zXE)o|ARRb%&zT%dCqH^2TvQ=?NYM^rX{^ga;FOX(rGRI$Ru?wJP73aX==AFiFYOC7 zEf_TI6xEp1BgLf5(ztkK5WOgyAclu3O)R<_Gv3?(lSUZh-O}fgI}i2f=-gS$sWiSo> z!9`FJG#Y6Hg#l7k3k@C8peN8zp!ZAQ0YfB^E`Oi&B;@}kBv{2ebk|!mfK(;G+v+;* zcAD0Cdpmz_$@y_4A0{+V8Nt;`Wh6e735j$6p}xcRjQl{^T9feZw;u|b09n5=NpYff z6V?&Qh&!%s2*0dngN!~TO-7AT1efgAy?cRi-LmQZUS-x<8RUPevRQv=hEbT@X@Q`j zy-6<<@ZPNFgyHNoz10G<4eJV1q4^Y`vp0q`*x9B~i$0{MC(MN!u7XagbP7chHonV> za?RM)t5cQSym8mwb*Lm9leFZDj;iSEmeL*8Y#S1DiFR2(Op?)VsGmAA;HbN!f`*}J zv!K^VplEP?t}NE{TXWSxjk`PGD&+!0SGFJDH$VvU&iyyNr>+D{f%+1?e+g!_ zzMoyOwv&gxq7dENiNfWIPcWeb>_G03k}TgdQpvCp`m66X@!^ZXPWI-`+EVtpvPJ#t z(k9)zYf*yDv$kw%QKxaoHjj>WdQnd@Y{+{kJWD;%_$O>mt}@$B<_nuMzqC9uttKvpz|m)z;tM@XGf>1F zzrDm}eiS8JD7QL1J`IyskecZetbX0e{h9p#r1C)7CcWzhSD-gw1rSx6EL}q_6Z;$aQ+?uq+)p( zFS5wqtV60Z(J<(6_)bj(FtY!*WKJPWW8Fm>6S%&UtAW?a>uBQZ+fEY9?`La;&~P&2 znbWU+6_{mbWP2T&b52`*ArTlD8JLt1nUIeaSBweQZQS*ZrY_uVIH1!w6 zAPZ(L=wP!ifBn+NA~M|=P#uKM`i^S(!EU1t9IiM@IasLOJZ#2=^%%aLK)8N4TDP~4 zPk;1vJCbdjH{A(=KeImxtv&Ki!u<@|W+%)gVjvp%b4%)5h_E^2Bh+N=fw;I266t_x z;6zsHHWA8Nx7jz<@A-&Ph8?^)9`-3iiui(xNKfCt$n6K9%F?T)#ha0rdNGtopzIFX zL7}PPC#h#4-R65~tSxpxZTDmRrCKLypWw=%Bavi&Zg$%XhAj4=l2lVqI|h?#r)-5g zFyEmHJuVQVH;$xtu|YS9S}j$|mt>R#8f0%}o~6^8#v9%REQyTa&TVFq+Q0a&$^oR!a{H%q7lo@LxJa49+f}6Fspbv%!J^44tOL7w`5%6pS zMx|mWb%|fN#L}W67U}y2A^qYUQ~QFyX9))-Jr)&-GvZSiT}*Lgnwo`pxnoBx9Rvi6 z^CJ&X3qp%?X70$zz>+I1WI8Zp29@V6gEZg&McemROcmYTrObY}GECp>82x{Xsc&BF zn;s(;aWXQnHxV*7_y=s2tZenaN3H8ktS%|T%bPutlKilGU2!SnQp5yn3)ri)kV+H` z&lYCJ>J!*U9B+t}x^LbfJ`$F) zzDot$^KC-s-n%OlVgZ`bPuUM0*l!SRkkWT(uhkb5G_pClCn_t*z3h77y}Z$+g}Bgp z-9agkY_=^KU+J5c9aW=hefNkf?JCp)Q;K zvK3d?@?U+6+P15n_?dSVY!s%EhNM!fzfEH(CpY-k9SXpjmk$}EjnAU;>Q^h<5JMnc zwskI9%WbXtt33zE3C$d|1W8}pgBDiHPlAh$ev)*k9FM-E7;oFgh0`v4dYUN+z9n&b z+`HIPspRiW*=7L`V^ivL;iQUIx8@tm{Pw$UZ)#=-0EtUg*}lD$Z4o&XP56_NK*O&4 zhkTcq3^kVH=)=}%_ghXb;ksezsuk0rcePD7###r=&%3$e_C-2h)#4D||CB8xjB*s^GoV$N8mJ!?y z6fy}0$Rw$zYh&p>01HmbZq34qYp?|+Vn;*uPo?682C}gau|$KGu1DX&GW%l-56Gf+ z%;NcEILX241)0R83OT9cBv=Al#+|po9SQd#(QWrsbA=-K5gdHG{Ir+$4QTRm5_1H+ zBLMoK$23LoAkk&$kBQRr&JFss;U@-5haRN-r)%{^k!2RefJ~+7Q`1nFx50lo^l8uL zulaqM^2>mq(a6jizO4f!&#YVvhx|mZ9dm?BSBZJB@1qp^iQYUW31_65_DFA=%#u$! z0-su&E$HdU-0o&!&JV(gJLgh9yW=L&9!g``6AH`nfZ&s-5d1zly5C&uMxGEG{UuMn zmo;(nFN&VO(gVEi>DG_$^zi!KU$Ojuqz5HuM;9Y!m+wwX+0M%3AA;>~Xj|!93H+5( zEK`agc<7@dYy&`npD!pPN$nV(3&W^{fhQOSFRdh_B|3b&+Ed_yEG8Ce=9{#?+GMF< ziapZ*`n2x!#FcvC^Zs>8>g4cOJi|0R%f!3WYGZe%hLJh5l)x%&GSIjd6}N*IsLSkg7XNdl z;VcDX6oxB7&O{G6?|s6P?cHligBg!YqSRo3?=)nDEd5RDZ)TH`CF3wm&nLLirMTK| z%gSo-&Yx_P_@_{()IjqX2mX(ZxA;bkQFfWRek0k3$sUhLw*wMWQl19mdAsP<*Of{4 z8M3veHlB?{P`iu6&}pr8R+kzQ(|0Y2g*$KS^WjK^5f~urcS}{hhZyA+#M@(B8_#l( zXEcXzwiY3Imtl~oj{}@IbeF9QUR_;AASpVIfSMUs&2|c=)wpO1l4DQhih1nYGgc3b zJ{&omu3StX#~Hzn`ds(4c7?ZcH{fV$4l#O1J}7Rr_(t&r9uwGTaBN*C`sVB#Xq)WoR4>Z9PTUIf_h(1dMyaL2-G3Ga?3-Ml_Nt`u zTyS8INe-6^zBCNIU6XXppt^pVGzUHd!n>;0RYYv6T$CBoi80?&{Lm!Jp>}|HWRC@) z*T!Fx8|g6zxd1wYh4&PS+9g~KyOB}+AQ`B*MJh$=nEl24g0KrD&fR?_?-fw_#snFN zj_C6SVchl`P*5321RB=mnuu}b9`|m28x!ULq`uH(4|yp_mFl&1FYF|=CSgGVykKtu z9XV=WvZ>oUNMz!CI?j=Sq|oM~;0q@|AUmN^ETB9f8`g>r#0I{RA-@Yz8L3fXsTepK z!c%lM1jJ^EP|uu5IWICZky3tAyEOom39XEu$;lCffvH4!#=0Bm=ljoJU2&tbc?e96 z*#!<0M8PD~Mj&t&<~?g^y(<2R=4e2L%i<+#rtAL>T}Eurf!BU_aRT30>i?(Ws+oU3 zU7YLys4oXuty^)>4M=;Pt9j>IHk51*w;q-%K=A)$2F+ znn_-23WXUkVRAkdhPaFl5hNPlcegm4t}{8zT#tsQ>9zqj2IuLCC&+&dW=0WU+(UXg z#D>0i-r)!R5_}~9ixmvJ&x9f9bD|CUb{aFGrhj3BjD#Mm!09kpe1@JklvmSPzH=Tf zU9RHn7oM$DX*zp<;}TX+FogBGJ8z#uyuDC$Kuk;G`T@Zr8uEO2P}FF=pMj7 zr2+|%Hj5h`3*H+qLhL^{pE3`851Bu3Y*cRVFG|o|C)DB*S#Qc_tH?-cF|g)jCW4x3 zYJq-Lc356vV;;6|X;SQO*u1oEZ_qIuOt)Y+>2Kih_z5=3QjS{lIVcZKx=YT;otOge7hG<*ZyVBo<_ySiRIYwnrJL((qDF>j&ts^n$3i@lw&UU|gnP|rV? zq*!&Dwp2gK^N{%{<@2c7`6zS19@><2fd$0p`@UA1VeR)3}zu71CLXbp6LVO zZkIwVsJs{2VKN`eDS%3rW$G8A&kMOs%*RNW%0BpPcA||p7$3Z*|PVUc8Qu=y$Y#mz$ya-KCJ zhvJRcG%|C1$t)S?N!d)9&M2AhzwH{OFgU3SL;Ufh_WQN|U*9l)_nZIVM%5wQl@Awv zrn3%ZNzv;01qDgr;e}8ISAv6Rf`0f*s3V5?K?yMi@sI2n2duO!i=6-INKvI}5-eO( zwnB*y!KYkPZM1D#YFg1-x3oF$rb2nyzTO(8CNMZx2VDfmGu zUVx>GEzQr9t(;o2aQJ+7*BE2AVZW!rHZ|=_Q`2!{h7-Es4&>{w|L4XOkYdZRKd^^%&+erI%I@4<%=YB3NxBZ3= z=Z~w=ucE1+XQ$pIS3o46LQPNcSWdTfSQak>!E#8okU3@JN)bCwF0X_DdV5qZubK+p z1xv6M%YRD8TWGNzc1y7u9HQR9H%gHd(4y1BqZbU1WA^OB6F>4h1`bnz9nKR@5QS2G zB2v$)6297rDQwKcR}&`4Bpf8lX@RsEXGkn0mD>rwgi{4MK&-vR&&>Wc>PsO_Gbn%}fs zFi6GAAwbs8glq)#oNV;FdPGup56ZOGk?&e;9~R#w91IRbAS@0e+_LNvYg%a*7PPhZ z;gTT{Ez>czypjapHePC!s+LXlq>SqJo)<$u`sPlJB_G6?3uXWqtna<5tSY>)B$)PJ z7Pmm2+9I7Sm86u++j~<|d!+U0;FwE=JTf#t7HzOp-vgVv7bmqP9zoB%C&#_|NFQ-^ z8$*{^60kQSh{By7JMbXL-!KPj+G zl$$mk!zL}6TSbG;p0V8ws_qr_g%W9Dtb%wz{c|(}Xp$1Z`^-DlLk4Wa21*>BS5X*x z`=*y!wZ3S(Eqb=0UzB#S-^X21Ri+V6sU}d`RE=ufs)P+NBfRi765p~X>+#l{Rr zLzRB`yfx#sTg%(3;*X?vqzZw58E2=^n5N!2cJfMTZB3d-=o_(PmErvmf25v;*{^la zw5mW#ekobsZTgyeF?k%Pm$Ep_$t5EbsX*TbS~JD-vd78Y%8FNv;sV(eJ~83QBuQ(u z=4?p0MsbAEw)QAuNGm{_KF>dyq{%vo`Hcn11kjE6`r_FKSc-m=A;{$=3JG-RD;as> zbRwYLf#Vuko}=~cQLKgPL*O9~S;3TS*4C`Xl~GK_+%5fb_8I<{D}ByJBfx3qBgDYK z1#)x>b0-X;1)!rmMiQwF&}r04&J+xV%Eg%G1DZm`qs}^}=!{BZdnQqryhdISDxD2` z6vGs4hqqSy@AU%26&Q?K8XbaT&}l?YFdN|=&}k)0q*6r$_a@q%BM>3fy#PRbzb8Rm z_XPmQ;puQ03n5c66ltJfE<{oZA{W*Sxsj)N8NOT+2&4*!dOc^bnk2)E>L=njIoA2P zuHVh($0RaAW6oCLYiUO{q0&kaW9` zChlW*+dp#pdY6VS8F_Zbvdo0Ykgd&e#;@79!0CFDl61ou>A7uSu44+F74^aQILdcb za?IMMSf?~9O+yFlB_ceVo5~4zS(k9NUeog;boUQ39UGS^$~WFUAnsDk3=<2memjFy zl%ua0$&D@b%NLb1WUDm?VK_^?CTK{FjiD(ol&7W-#-}!JaVn$UGk6zOGs0pBJhBfD zdu_lYkw{co0ohE#Ec(xIH`u@{4?)H*9e(g)jdTZ9Bmz&)P5R_~X0Ky8;jRxg%QudP zLuAkGtKG%w<@;-(pghd)EtKE2G{0f0bV-{(gnGKt)IDi>?0FOFNa^Yg$7DLe&O70c zWYd>r55v3~RsQt37&@v{^ZdYNplY%T^oLsHcLa1wosMm)?UoSmApqhIM3Sv3KvNRm zKp!d2<()yiV<`*atU`k;6|nd!GxsT%JbL0(cr>(bVFNv6)dQ+C+TMYxR=d|K5@hcm z>!?lF5!9{um@@U1G72NgHoBb)ZbC7x(5X*i8z!YagjDy~yqWa0BF6mrV zPjXwiW45l`OuTkRH4>wkl=yf)43C92gmow4}dR2G`**`C)M<(r#XI z3ISNdPWOjdsa97(Nw>Mw@QLDXsL%+y|MdoNW=C-n4Or%AowK_EF1*vuug~nMxYPDP zlHvM7WQTkO%A=RK%}=eQO+5_1CPc(fHOSqqVh-0-SHSYoX290`r#@CEP@rqSEzjdR zOsJ=2sO`1irYqg4HA8*N&Mp)({dp@t&e~1Ij>5zaJUM#?T82|42MXHA3o>1tZKmgrOy>=` zid{=U{N_(_?QXP?W!6pBQQetvpK&sdMx2u*M6-0Gb7CHu?dUJ=L)Ztk*fH=+_1Ug9 z*kjZTWM={kkMMhZ$=9UL&NKW3D5k7}CxXF{cGwf-j5U81lIjJ3GN8*?e493!d5!tt z2Wd4lP@WI~FzSd?$;wUSjM_n39P|b(3=3wFBVOpGm2)#CepC?ml=TS{k^-nzNx|W| zh>INjU|^wkdgjhwS*ATm{jDiR3>tI$7*KAr`ileep3vY}FI?!q&uRD01Og1;U^>t+ zP6Sb(2*BVB5T6R5;fz>uNsf(5`}fUz?I`voBs~Jaxx*@Me`?2?-57C4uHRs9K7wt8 zqTL{W4J@XqP!!7UZSkg0^>^T5$H~F1oaUgbtTs)E9K}9 zNZ%0g&ibgg;|oEs?1x~1GIQO#7-N24l89j*w#`HUO)J1M2HC7Yh)bJcgcNfz1U68a zg~1F(358^CHZquD_XLYBATwt*vx@}_D`4|;9)4sjynVx!`2>jmsC#?I3cRHlnh7p? z!JfCc`ZfcKJn`f78ZYGqK=ZZ}a?nCw{HCsUMd>fSmly9*+5ij^5{|H?7Re)PWE&O^1G2I)Z^=-{3EsA8 z;DSnlZc>nuMJ_-{aVJIjAr(M88M;t{G-OO4I+Z#q!5VoSUOFCII@v%Szke3LtyNug zPUy8*46-sYwCcKeu%=heB9FS8D#PmG&tq|_b@8KE?<0+(%Z86IO0*HQR)@v$dUA4f zywL^|29ty9))chu>MMi_%F7|t_|#anlEt!+hE|D(Yk@tSXj8wusv7Oe;VEp?RS{v+ z0-x<@(|DqGBalS)0fQUr)RjbnoZTkum z42RspV75D2#_&0Nv7oIXvz(Z=8-){GVHjd$Jh9P9bKT8|`@snCo(G~1E5^PFB&igI z=_vC={HgP%bS729PNHLFJY&=Unu^#Ii7|zp8%)qMEcPBzDL*FCw2&NSp*#_fH%gc9}V@H^M4cNa_bm zs?H{gug0!cvY{+$1yv2K(EMJb=ZxeDAdDm?i}lPfVr;uWPLMAYmb+ws(^ZWf%OxJR z8^a% zbSzgYHpF^4FkB#0E=15{XBAm6fMV{5pmsjReg$jPgq&1{I;9czsKm0VoV)K>8JnlM z#uAa7(qpgDcSVdclMZR0#Y#ghG;b@&xe95fxhFam54ts^S8HmJK`o~i|Q&HbLa zK`rJ`Npcy&HSmyxqoAlnG`+Y;ly6R@#jc3vLn#Cu=hVL*yR)a(##lvmjXq z945MPZJ=ps@KG6ZQi}CY!BrSSq?OOkV1vvwC4F>eDkEDbTO~3Ek`?(naSf_(F#xux zkd?ODHg#QCoRzk*%`~;mG|t)TqO;{n_J(?|g`DD{aO-@GFV#i04P3VbxR*VMvQQo6 zxbtY$P&bx=U|2NcL!Dohf}Fgm3V%Ytt1k(}#;?RP67bBd`@(uclBcIZZa|hb)&WCTe$Ke50Gq!yb z(-|#yfa68`r&r;%r1elQq3>PZL(lP0h$1f5IKhj$!9x!}XN>SwdMc65ILnJ-@-Epr z!R`Q(gPQI3+omf1(oy=#;JHq$U@2WD`}osjk^;}1_ElIaZo0`w)0ajd>xojBq*gnI?qKBz{X@RaUSp?`nL0 zbT|f6M7%>3#~>!t6Wlh?eB+1qC&|STvS85F#d+unjMw6s_7Ii1= z2*o_oxK@=&s7Vu}nkG@ZN|w}|$~dH1ajfy4kVvteSomxzLVS~h3tE=zz1=%=MrE_? zFv)hR_u@~!3mMjs0?VI`ntcP*EXDYEqI8&h{F8$ZHiscW=|B*qwpw%f}l z5v&`I;4iin?@!O`&vxNlemXAtvS5F1a^LXBytH9oo89R4eJ{=owL0(y8os;IrB7`b zE@0=s;+ztU-MzgDN&t9QFg|~Y9$7~BP>#O;zRp4;_gwcmb!6%feW&vwD(raOX&9x) zUH)!-*H)&cAOFUU7*nv;k$zM0cHjFI{wtLAO^R69n*9U4RnbyIQbYcdwMF`Ek0u~< zm|xTuX3^BR1dJ@y3J%H)4q|gj4^59w%8*uj_A}@Gs)DY&d~v7Ts_kv#xcf2I*`;dD z#|$w)p*8}}iT3Ap!}IfH!*km9_SYL|Zz?&cJz#-P6iXhO8nX7I5%&+cYLJ)92VRamH!aw z*PW{;;lzbl#0rXqAMDWLxNdQJ?+Y5W6YW*eMq>Zo-mf`2QO)E4NQ0p@f6deY%Yh2G zN&H~V!b2;hc2mWVuhPK*;4)MnCCFHT5(#>5e`Oy8)oET}|FpT=8i3+Cejo|5`HR_v zb$v^LgU+BFy*KxV@4oV5U@-0rcn!Vg0Ty6%-3FT5B{3V!o z>53ndbs4&-dTv4WjPkD)RR=r`6s}t3gP9t_STI2EKTbq=z?pjMtj=0H4|$=P<7)h( z@dadx`Y%(%2RgYO3J!Ho-WvUDjV+m~`h73X>9I()WXwpi^-@?58Gd`p8y_M3cH|hg zD~Z-_JZ7uu7AR)Xp=-mpX| zPSnU>BNNTVN@d{_UCN{!-Smmsh9=cxWG0>;sHxIcJ3Box8rBQk-_Ehkuyu zF!4U1-BK7UaTcTJLu-e^SGR{dq;T3DfNaQF!Ft8ee{C7qUD^ZBp6yaKruZj`C+!l+ z!42dbO)2CNHF|tAE>jy- ztOlMm`vLAf8z}h5)|fQg{sDYB>n(y|GtSpGkm#!?%GITaK~tb(=)$EAmS(?0%3wAV zD3Z`2voNl0QadIl*{>5S#CNGu=#b5kXw6z~4Y=SNLpQPq=vH;}0i@C=;-K-F@$va# zajmyH{jjr}=^h=E%;Wq8_=n1QQgn-0{9(ZeS|k8%uAk2S0-;?Zs=_v5&$%-y8#0(L zXVE_AfW&_liau4~=oUIY+8&22<3kc4?$yb?geZqeoH&r#TcKHWOdqN&x&5wW_TJ45?ZhtVa!%p@>MF|PX>lZ7?4$*$Tk}S&A05|FL$IAzxb%?tU z7uHDHP#VI?40T9#gF}NlOXV@$-pe&R*{eV8=rJAU42GbUC74*6NoD-Kd929$pzUc) z!4!Cz%2s9g&pq|)PWA_W=LHi%4FikDA0_lUWrrYf7TF3X&ODmXCd{0}Xkd2SR=S64vpQ@8 z@)o7pU(fS%PkTv_#Cj0&05T!g$y4wgS2vd^*dL;Eo}2uc;Ep2A9DT!=VO3?V4jU6b z&cH~vmZrBaCju=H7&|-GQ{Gu(ZL!FnU#$Yv+IX2h;T(5IgkR|fN1`0puIs7R<97+) zz8UufU+lp3P!OH#Pz<8sqj4It6E380r+T^vLFv=TQUuOgWP;E9@(m*e=nJugd6cj* zf(0VgFBJ{&wd83NHTfOL^!V0>v-ZG-fZ$rd2zoDoLg1A} zgQzKuhHfSo#b^@O#Wv}zHi=u$o21Mu=;=Ya5*fu78O^8O+t2ZH9THm?)h-?+72C@` zc-dK5-uFH4lUTPSN@#dLYJ;oLZnzPkr_t)b=-};DgP>Yk>#$nxc7q9tJHz1UP;U|# zJC%FK$L!??#&01J2yOR;Yp91SZY&X6_E~H<{Fm>VmcyAhDDq)z&~88xA|0T}+zb3V zUXD9nQ`v5JC%s;20Jp|+?DjjhXm@aIJCUvt>oBj6`hSky>UPG~boD@!348s(t0X)XoRwGpnZ!-{6G@bP&j#*X6e_TTjT<{LI;fc5dg`sS zfu~foYZl`3e^K_1;gz*Z*J#IfR&3iHCmq|iZQEF}&5qMy$F^-79VZ=jjFacx`#T%w z-TS-FpLNY^{k&(*x<^%w8pCA(m-hf4iQ3qS_xyrm*K1#@#uSq{`8WJ<-w*@PPoBaT z>U;D9O&fulF+GNxNGyW4Hv&B#E`x<>|CitjRfGhW+qHh?VpbGsS?mJ%Eqm_z)BDFu`f)U0|0bg3kPx^GW+5gPFm zk^yBq(B-uTLi6D>>*a|sfZ&P-#@_yL1271*qi`l|X#(BBHleu&?;A+zzIDCzSwcGcrwdd z&iw|2#nDNl@TM!nVGlTh{)#UL^3VHAmx=iNV!>HjDjc_(@)`BZ17I}3O zdd|7>At6Ir+yQp-YHGnC;<~k5kqKz=l)xH-l7Op0BN}ER?y)UV%Yx#2oNBd+sYonh=r2fC3>DPm~IF7#}_tETAzv2|`Bz@myH=S6AAKC7(&m)W<&93<)S1@H9BYppG z*$`4<(WEQ5*F-BP0!)cVfFJ!X$75B<_U=RWBq7$)v}#cj{CoH}$wyX#!g|A4Xtb-M zknSB=^~ay6@4#-j$FLCpJ$=;o7+TPG(p_p^*^;%2a-f}sQ-?6K*g`!2&twejLUBa^ z1)17}4k&Gc1~nSE8U-^48oAmO*;sWlt9DXp&H#-@anGS-Wn{Y}Rv~JZ{a9}~gc@lr zgiZbc#w@J%M4Iu8^Ppm?G1tY95K>Mu!vG|hCXqgDHQL(Zmc(&I#NMo^1>y^=)I&Q^ zXv&WWlb?9IZ{uxvDSUj&6Jn(+#!Wm8Uo&-k5{E;Pm)>Sum<^Q(4K>oKivV9u)H(h@ zEl~jR5$gzCx%u%Q>0M}?$ckN9WW9i2A%3LOmOYpfr6{}F%CgH!{}JJpJ5c|=Sa1xg zJybJ^GD|Y$U@i>##no8zQi%vdxnU{1@@&KB;4P=~ZF5tX&-a}jcrmp$ISOn}y_Vs> z9c9e;G`CO@Xf{JbGde*2u2kHpl)I}ye4VoSgt{RldTF2@A1{v}5P}L+*4MVZq|A2(?a}{4H)(3l{%arn3!IS#aZ@$SVPtQbhvNBBv;p=Q9M{CMrbqE^1 z-eO3pA2{)|!K!9J2vub+^s#a`RtIqp*PYBikL~NeRqq)Tq>JOnuW}X^kut9Bt4Zw* znLKnt)ku6=B2C#4Qu;D|_03j(jf$VFOs6HT`=D?yThBj~ zc%jaFtFGcwhrqiYy3k!-J?LD1+qyWj-ki3da)u;F5)$LcZ(dy5>^pk(%;KHpF#bSHK5!FpcR_e`b`?cD%IY~KYl^H& zU_ylLS)~5uU?YRC+HrA69)TnER5Yh?n=xt6)z2K{~3DC1LHdR1ThK%yvZEd?X6%2-1?oa4b29iQ1s;(7;^r>6$kNv znq+id>WII=rWYgSp%^u(5kYS;q=tHdW(^Yt)&jz0?lMa{`&60q zBWgmEV={7bRWP%4M)4Ge>U6t)d=1+pb@i&Kv;t;G=)t`+r8 zojXD_ttLIX#ssx7t@e&!-cKh`$+_Q7SzvU{2JX1e5Oo`L%M^^UMlh{7AkEykvDlDa z!U%tqwkU!l0^k`6&j~&1fX;ymfFh^~#Fa6aH>YJRoEn9!P+CbTY2;B9ThbGqMvsHc z3Io^-TU=1!HK!Fi5G_7qpgG}-yGQ)qG< zRH$v+0uV4~p=AoopfPJ4anu33ESaUdIVj^&8KP!5;F6Wd*t+@2*d>(&%!Aq{wbGHx zQhPaMhF%k!HsrEl5etb^@&nl&eQXl*WbCqgn$&+pZ;g{52j*&M6ITGx`{;s>BZ{~; zSc;e#wHb!{6{R&9=o^XaW8AiEBftnYwLg+-e+J6OO#m6=Iod}KNA(f2lfR~p(D4Lk zTQ%&mf)6y`2_*+^mVz{gM)C$J#?NdBTX7>szoyml@s!z1v!?UFoC2+ah9;Zm*&88M zo*wPV-TLh7dZk-$-Azb2N{gM!VzOfw#J-N!(C>fE0ZWcIt)7HZF#?%A1R0*B54E{h zOpjj8;z-Jml>IbMGAs=aoCDdA3}79_+swAxJ%a^D_MA2Xv#B31F%j*r7K;ShMDMb} zM;O(>b(Cm_UYkXVzWXrv2~1mMZU$cNy?CeAdoA^-&DTB>dtZi0&d2Q(KCZC-1HArK zH`I=ZuB(00^7KDDI{%TDr{HAj@M%r*&x+&!M}RdaS@$nm9&kIqcs&(@#!mqSU>X=S z21;VYGz4UTsU^g18icdMa}!@_+pJorKV`hpl8t5t67DeGjCq(@(h=(*C+0j%IGY_# zj80^{y*(T;2dMIn?_p4|Dmd~8ck-ZK(xfLk$dCC_&nvM}vnrVZCaBZRsjQZuIO>pS zJE~R%rLBEWJ095D%Y0o1Q0&_?u_M`$p1LS2!^I28Uw<5-$(C~kU3#BsmjA$Ga66X ze{#Oju(=_XfWTk=_9Oh5$pM{?$|G+N1w%F3KqWMm95Ak7m>w_f688e-^|hw$ zem9ktcNn^#Nab2XPCMmBWGpkeRB5SpphjT0aCo?IUAEJm_t|r}ej?BArR!6~dFvz` zQMkI>*0!7aJUriF)&brcbL(kh5dQn_0?I=h%lDYRSG^}EMGh<=j%tNrW@Ap9qLD_o z4-q*u{_>HY4vUKLs@UQN^Tb|kbXF}+s-=o_-OsxX6|*;()lZwsH0!KE?kCn?{Me(i zv&vW{rM*s`o^N$wY)&mgZqdg`s0(0i-+E&GO}hZtU8Vq^brG5Wv!CuV79Xk+R1f7XPmR3`sg6MAPybVP%v zrw;+OeWIoM`i;MbUXc+Xno!A(yznxVQG(0m)>d1Q3dcAA0TVJ12(^RqC4xgR8oxP+ z2DVydbt?mZdYa?=@XN(R+Rrb!`-Tvr8w~wD_-GF@8<^>YR(tL1u_hv5umxu70&Eac z2!J0Jx;<5`dYlfB;)TB3*UwXiX^6iRxabj+wcLETBdXecJ&Ex3A^F7Tt8X*iB$an& zE7Fb1IhNhPBXJGWz|C|4GitoY@qS6a49M(`CH=*%QqEb8nb(v_1B+n>*;R>r|D-kq zEW(4%;dbH0gm>y6LUwS|+v^&L#qorLpTE*E1-^jN&W|E%V3pLCw)}jT?w`F%kECn` zVLNw~>;Bs4w{LTj7;?~b3c(WjHP|!FpDOX{HZ*Zcu~A&n8Z}VNHfGrUMP+m;7rwy3 zL8;a8@SgU9X^FtL{FgDEoP$rMN`ryXVjo1Z3@@^WBSX?iKU*hmpm}3A&erd{(UXc5BeHABcN%9d)TV?xZm9)Ye?rSOej(Zhr;e37U>q z*I!UI!|y(mpk?e~w3dEww;DSg5pF5Q@H)nwnVN?hJojx=O@rv;2u+&<^m=G)h~wyG zZz!P;Wx}9^$vFPS2UV3Rj-I5_^&tl;)l4Q1@NsC(elQ3B)ZYFpAtE}VG4Fo{+n3KJ zXWsw+!Djk5CG@|wR*F@u<>w91{l?lFadVtPHuC@U$W=B-tOP_F~2bLUJDHcAw{*6 z5)~P&hVgHhqp8nclA33es;R)U@++X2=%_OHJt_=R?Po?Z4~0ZJ4vE7iqOLh(^QBGN z*fNZ(cHkH4>!d*SDY(~S6ET4Dc7R{lHRS^dOW zSrz@Gll_A9gtj=Un66Hf*funPs!p@awnu8ML{=MP_BoSxjMfrW4^_*d9{|8q>B?jE za}YaK0??p~n-AE>u5-SBi+$u_{7Gy%mvJ2C{=4;P!#j2R(<|rKvVYeHN)K4euU<&_ z_F96ljg^r8K716Xgoy?dTK5+e*VS&Wb$l`o8cLFNi-88?BX>u~Z6ett<)MPUb{- z->+n|C37R6`}Vua!X35b)4NCrvTl9O^Qpa;RYoKzCOx7J53^237o9v0^jOVG)&R-g z+CV@H_dd$=PndM(LJmG=D~;eiIYC__f~CU#Hq)^Ulr|;GiK3vT#KPkKAs=CL)Z3w^ zG#k^)oq%s_EG?xuhgQSUDoFLS!_ngNW^6_puxlOkPfe(5ya1%(!Y=CV-Pb{*UY10$ zvB25h?o8uHlek<5ql$w_5YmKZv9Bf34q7dc&$!F-XI(!CaBu&_#Nrx`HY5V)XOj)o zMJl)@SH2DzIfhNtrsqm&vmM_zacV(~<8iE>11fRGx%Q#v|c;U^%u@l6H1rX!)ssFxP|sOb();4BqKGrDQ=7juX>Fc5i_Fy>5Nf z)sEbFZzSL)blm`8zt3_~kQE&>jk1~B=~qLbw^+P_|2;oLVZz$Xm0ki5g zUnB$@enm9d^$lZ7t){kNe)bA+%XFREi8Jwr0Ri(m7x-}9YebALn3Pg~g}eeHWv9N5 z{`g^RPrGFZIDho#O9Zek;No3D@j$-n!m2TB5dbQ6JK_v%EoCQ!)G&kook*Y>rwekFqY?r3~6<0 z1pyBeiZimh{0}$Hp~4f|LWSmjO4HbPaZIW5g|KddpN`9)oU&ice0 za7fDOV!~o-t`ND|4LVInVk+^FGXVsZf{Y!^v5`O;0;k3xYjnJPIvw=Z!@`OU1aOI%08ZU)Zc1rAtZnFAcH52|BiGj<8dD zeTR4EZ>yCz*0o58@F+}AIr|SZ-AGzTHFxFlU%)Dj0&LY;OOP(T$o9c8<8Tu#5N)@@HytJEh+aQ^}(}M5WQn^{ZZ!d&3vAh)Jy|Q64>5{4HGYtR( z8gv-bM5Ehd)L0Uvv64>H*OT4^n2!v4zoI-MxO@g4u8h0H<# zkLi&?%yW0a*WBc7I8%(ds6Ku6Qjd!iw;v~V62Xp$oPt$vgwoYfgX|tBw`WG!$hd87 z^z0hWpi!_&FTk5{z?hA^$xzEcjuLA%#CCf^vfy??qdly-nPJlcZF=M$TRW_IW}y{l zAmtdFaiiUduEt(V-Nw__)#%BKf!cgZ`h%N~tk zu4(1A(~)cHJHoq5dOuNDJ+aO(_wDSSpcTMM)vuG?pdVt9D;sQ=M#Z8nva5Sm!b`il zQ9uG!1xCrA!2;f$$lLVYsRw6tYySXyD#^Q$2Y+M@F!PQ4?sWDGmr_8F1R|)kLKnrD z%UQSq#VoR7iX-$Sp1P7Bk~p1qkhiAOoI)p8T-DFkd7n&|G$yjI2-rCLbJgMf@kvBBgH)V&!aD zF~+)&g9ScQZ=ARKsO5zjca$o}nL@alG!m-<2DhnZKqEOaP|74JP0g7?x&yXS>teQM zsVb?!eL&)OY%vEZ+e!h(v`~|8I9tsWmticb303eg6Y5ulCD?=PkNAhUJ9YSz`nskm z>pSJ1K?>>=B|I7R(S?oIw_+(hnz%H9z0ZiCr5}vDu+T0mZLfp6M*u`GympJ&;X@}| zupO!Iv<@1KO`O}k_cvR;zvnJ}|7~YVWsO(5;j`phMEWma;@?j9A9J-THB0w-G4xI} z#z=e+Vq)}qbR{BA!~q-n(2xerUgE$2V)7XXQ35;&O_n-5Ar2|`HhY&Bzy(*;eCm9v z{98|))r*)C-f%*&_ZZi`1>5bG?*l!nJktC71=5$W>zoi5boisfl^8gb^F9-F6kbYT z6lw{Mqh#NK7+&edfyS zU_9D55L}t}R_LWop>aR~IhY<;u#%3}j{tLvYR3}d{Z+XB1&d)|ScNrhVv|m1IqB5K zNk`^zzC&R~rqJ9*Ekil6&B!Fla(yn^Mwd1x3BFg5wI6#a#uD%c|HvAf^Rv>Y0_P7sln%a}zGxlhLE4K-db<|>5>g3rOW++>oNYlTxh({a; zcM3mE9n=Hc2d}ue;99+gs8ncW$xaz$5>i>dJe1NQyb!T9p3Dz9+Q71blc#V$!1xl9 z#~>fF8)UgkinGl6%fA8%H3I&+V^DQ&lxbiJfS^5oEm@U^Qs~#u1QTPC^gIN6L5?qE zad@jkza|aDZW^{$qCwUJI;N5hz=T}s>9o?%?W0m%evHPE5TAZ8}p+eJObp8Y{IH6dxd18eqH}36xq^xq9Bc>GVI}l5u^yWO-eFb4Ehu_B&i9C@9lZo1A#Pi znD!$ox=0l0(xU(qmmL6e2aPddn`sAd*>s~17yhE_88hrr=R?G5rA{Ww&^P7j_nS*g zIU2=oQ}m~a9@A}8wEIdX&`e;D(^i^v#<5h9=&jAN0_cA3yw~}#S*ANGb+)nbT#;rx~3KJ?Yv3pds7$5ogyWt z-uzbr#gJ3G4ch|7Dk`UjdG%AfXA8R$`Qxv5mpuetQS;{@zC>ZiT-hy9?2YdF1|SG< z&}40XVoVsXaMs4Xs6yl+-Qwp2MP;c&JD1@y5LyK%`ZEn*o~8%nHPGPRBO4JO69Pbw ziyT?|*nSUcoq|>!56O`^qC+u-1WRykU&kuCB*155yTTQanMt0D2ea}B)CaKgNYoP{ z&hi3*{?H6$yEP${g3eW-LYsPUn0obFlv7DXZq)*L569s)H)CB*3JTG zZo`qsjT^T2JN|gh4WEn-44y$;fIFgKt&cny6omXCfh2F(5I$P~Wlx@QBgCyhxaWp6 zRi9h5Qsx@u3bI{;Xe$rD<3-f*<;DD51%}mb2HMY9)DY7RDp_D_QmcY02`9p z90Bp_2UJHtNQpm8)}^s@D;5QK3?unQ@&o z<)thd^5M_H=0b5NSuSepHb~JhqXa}c_fSbX48_oTxV<=(z9+ztDH(IM=NcO)9+R$?4WvicM|ex z;7(VC3vWAZr8AZ&9gJyv$PPW`%6CUM80@>vTqYi`pZY9*eWc#DxKEU_sBPWQKK9dqNwRlI3S{VL(swTL2}&YqNDVN^+Lx5`&7`6p-${e(B<|K){=85+CTJN;csu}WoI zUYQyFy)6deaFJLpJ(A>Izzs@=(8oxEgeqcGg(Tz$62(EaL7KPykuKDE?}ua(aRkMX z`3Kd$Wk$R#rrF*&*Tu=nLylkRMcjA&E)b6|j8SxUF$UnxF|EcEoA72VEopHwY& z>|ID>hsH>4myjSrxavWz%Dz8xv+^YLu2F`?+xcy1 zJsWD%0pjgjQ5Tt4pK>egzw8EFSt+RbUo)7Hoy7Bt-_6g!oOe3CC~y$EXvfA?q}_zS z8tYd|&ZljZ-NBX6K^dpJ@9cC0!;NrZ4T=Is{gUPTy?U5t8}XtbbuH_ydNA;GdR5!n z%-M1c8`Lp?bKj2p;Z7 z2H<1snTZ3r48?)#OvqF?1pVoZ2Xf)Uv85HZL007$25#K z$TAZQ`*V2wPxtss<=9cF_Tp)*--Fbec*C*t_}Sog8a$y{OY;9*;`~K!18i#tYJZAk zDFMEGA^9(n`cJ@H{ly=B5%3}BHcHk{CJ;X?G)8Knle(jIR#BiLDS`=R6r?z(mT@lE z7qXgR%1SI*y!hR(;&X^Y1hwB5sF5aFrsH1&i-paiMNZxY6L1P?j!lQ9Cn%srF z{jw(yoarAPsWH=K9(w&Gyv2JE2vOH0xcW-hb--d9AJKlNj zJzIo|)f0R_fAv9coTcj*VuYhzCfsfH>p&nI?ze^bUU3`Vg1sNW7@JoOVT|Dw51m0u z90sHP%g46|8aa!Wo~dUF3qe6#7RVzE z6&CmHv1L2izYX^T67c`f@$lG^51UvH+@V(@3Loj3Gqu;Br%u#y%vyW>((orQv{z$F zO|8qJ?bcE;g08$It?W6D zC|khVagr zFOQPnnAD(M+m~5Xu&^_Y2&84HI~d9)XF8vXE8JNDc`L+8_uC8KCl*vz0YA=Rr=5|7 zxRDh3kVU4hLA!N0zngG`O|WqJVUZQBy8_8bZQ+ocLT^Vw(BB;ezFw)$Ficx`;4_qw zeYG)X&~dCy>X)mh5XW)_VcEkTM0G9pAlptNNt+DHdN26XR(R0Sy10iuE9$7%Q_WpH zOz5H$W9?!iSQ^WqQ(;V7t$ZCC%jhW9`#htQweML!U~3klo-}KW6KY*53!CXY1=8OH zYklLVY;^b2Wg|R?``LkZ(X?udUD?4G$Y*8u^(I$4cW33N>Z{`L_bYR&nnqX^@o#?l zJFl5P1Q%6>X*Ad>Xk1?*wvShWK_HHn2J+Y7g4x30l!x`NIq)ffWHMe4>pC8aj@wG> zu&O1oomeHNR6nbj;s8$K_%904LNMHd8KLORZYeDC@F z{UDNFt?0!k2XWl*5&kFXJ@}}6f{GG?H@!Hvw#I8#`0WiL*SdkJXq6n z4}X-9eAi8Y)tYXy1|Dy7GT9uKAu*(h&cr4iUbOq#eM-AS-f2KjY_OU&r}=g7FWHo` z$!U8bnn#!>vdYvvJZdUAXmYFHRx0NVD1ae4_3}C8mAAZs&kU_|GU=9eg*MIDI;vF2 zN#y`-xgiR5Ztn&X4>8S7hX@1QenO64o5A~p)Rv~z+vnRJHGN=)t##C-%5`Vu@0d#z z#J+I8eOYj%eYjkheB=4*(#A;HeU?yo#_rV~b$)x?MZyX}UT=u%nh`5W#)3QJw=neLgms`DV8I5mI9#mWu;%(Wr@Lw_Tfj(|#S!+8q|Tz&14X8s@aE{^IPQJ zwsxq#F8utNB_kd7vZ`VwlyS>knP}a)der$(6t-ote8L#b`xk?8izfUi13qlwBsq~p z(K@*qUiBH?X??QEUJ}c17@B0$sNF}0H4@n)B#u02cU3AU9`)!sgu3^PgH#3c86t{W zR9cMarsZjGz~egq7_4r7DA9xP0u=vMZ>$vRQ%)SkJGW>OZb~V1Tl7c<EW^mfk-%RPUwCZ-;WH9;nsdVvKwV`cq=}Kr4_Cy416FyawTy z11>3gAI6Tc%*%%?DxzoAcD2~S078~XlI)`X?GDtV;$C_Hx^1#) zMg|A#WvA)(H@)pI+50_%BZIk7wNbu7->GQ`CHGZ39PfSCQh@00k@NWWJGXBiB;*%y%&ZMumbKvFKTA@blg*QE zI~3o@=$`aNKWNoSrO6aTwza6lbOmT+k?$rfO@4=nq3pV-hLF=DMYoTaUp_XM z4!Mxstg7Mv({XB6@30zT;V3aiWVOboJiB^1pJ;82Dr%JNLK*EmBtNNFy542-+{wW# zF=3>!l>{Ih7wSdVZ<5M~W2mz?Rz$x}*X!cF4Xv!i&cnNqs?H#l%% zdBDFWJ9eABI!Q^2k}Bf_1^EnP+KxhwOVh5BgD*u6nXyQTWYwU&X-ZYM#HdZ9U&$kyw~DL*wVdz$zMalP0IO;K)813n*`lg1Ow| zsTOan*fxQ=WY zYgb7)=d354z%f%ZvraNkJwgWZDgGL*pa9@M@tLj4jE-Ki07P;Y<-jY)!<6&((Um)k zm1bO=XLlD>8W1R7JV9`&1e6To+%sEIBVQV`*9_fD#+w;iCZTw>IW)hoAC#eud`cIw zRFkiBav=2uW;L1Ns!9`^PY7PtBe>Ic;}^Lm+;*UHBvs_p8R23)wJOzOnfj@r5>5c; zt4BvoTH^WiXx5O-Oi&UtOJ3oW^0wpbujsqaeZ_Z?j{@gc8+xj9@gr)Js~za`CC1pk zE;>#QLJ->K$KP|?LOo<>9>I7M1ZVL%H!55sM75CZdg~-O5PFrNPvr)bBjF0uEgZP` z5G>Ya)YHjNRExaI5U-kI2~#TvxCks~9N*+T;!tSYN@V3vlU6plSFFqHM|S;{?H=>Ixy#NWRf1tw>lk&93Vn z=lL6CR3N_0oCLt_6P!~rfp+t>Ixyr9}+m9sYC#*UF zjpuKK+p*5`)}xdu4D8<7qWUgI`aMm~(D;g*9i%~nH?#x>+ybK|o4GPm4jGHAAAJGs z?hQN#EJdf-GH(;HQ$fEmE&fkYLTGkj5fz*qi3b-Nw&~R26diSOb#gh0p5olZ`rHJ+ zAA6F;)RDR7YZqH&qRWo>$mpvlc=otF+qWIc*YFe%vdLSjd|&vu{fK|=w*GYmrkkrm z`hJptTj0NZq53a{{@>8VKg#_QLa_Xh*7$TF7?EfTyx2P?h=i1I3DmAtO*SH-~3_o?VEhjCysOD zLDr+Sov8+cM;Ew-f0<+=vLwiSowdx~T5K8}oH9l4d2Hp`vjcejA^(FCaJ_Lv^-FcT3gJGaE)AZV5Y3}WM zx#GiYsKmMAJ9bp=rp8Vu%sXfgL;hwOP}fnXSxZ?L`rTe^Mfb_0>k3COrj6~0we=}8 z6dzW9)auv8f2gV0$MunZvYu46fqvM3j5T~de>e4LpN41AIYtel%2r_86mq((}m6*IAHGZxPmti0%vdf0S&-}MGYxg4Sy8{>1o+0?Jp zfhZE)U0EeC-|7p_9EuN8b!Kse@~sLu1UhyqcPUd|+Ua6>%$Z-fve22z6+NF<;-!r+ z(YUj2_`IpnEo^^`iG0BCK-O$~ZIakjg|Jdo8eLVScgu$0Yz@>{HF)%AJBjQl@J;6zSyuX! z4&!54O1?ZUU3&6x$~mq-gY*1y&)YU$A;+$Rh#G25hU*Il^iFB321=Xpw~FK!6raDu z%-Rcdq8{UZ6>$Rn8P6}a7KbI4J`~YPo0R{p_xF^3E}mCNpg2}`)(3vRzNIbl&pGF0 zF@p>rbq7T3=%gm}$3%XR$HcYZr#UjcLcU}df}by4Xz6_rYx40qO|9XroP-DDh+~RdOQ;BeG{`kmP+J_ z-US|+*>Oz7s=6b|fGbjxBUJullKyWBThn*}UGkjVk)B>71wzG^s zuSXp9P2b+0u26aqG;r!#l7%7DidSbGAhKxS0pvg*BJO+-hhHHH`(LqBY3a8PQpY<> z8qZ#;ceZRHtHyOpdr5~MRMLMfKl2B_kKBqVxOrkl#`peM@msg*hSzUN-K>knDHun> zx1Q!lw(Vk;AX`1hA9gNiho>%7F_!o&a1E$b@Z@=aH=L1pjGZxvrqXmxZsH)}oly3= zxa=sjHaZb`kd1Yn!D^qXAr%+rWGM^2CyA-R<%j1+%N?ZF>Srp_qamdSUL-j=%Xkh_ z$!2@x5&^?r&sU6d0BqZMRTen&DPnR;>$g0C^aR{DCWl_~=ObM%6NP!ggE079zf^6` zS|Y7!+_0*rzeow=MOSFq&rT6Zgv@D|P172l&ymr(kkR1*!* zfz-`%YM#c?V z-Q6f6YtV;zL3zjdM9`{8Qa|ftm))c@E#@)a)L|ocdI@*@Q3R2;23FZEXf;GY>sjkr zr#sqha`_1eKq`%U1<;dVM3{<=#fIsEXMa`G-L&2D;X9)rbsIrCZ{Ld0pWP54g9vjU zJ*u{Q0d!iLlxrEI3Pz`keb19cQy6_Y?3h2TswmHR;1gUZrjaL~MSDMYjOFpz%OMnb zb|KPO%CavVIHs+Y1`S!X7^QJI9Ct7eR#lhWb$6+L&$iYz)Xyr9FxnPb5h4GXy3Kii z63O_GqjQySnCq0(O|!sziOD3rFKSDEcN??{PW_;WF)R@$#yIg6J?Uh&kRtI!xshbnOe&BaW7R@9BbYF9pRuEwW6E=C0G(d= z2ok)Ra3fE|vO`hEf}w6#DYJ654uxL&gET-J<7Z7gv~Ef)3sQ2I{$HB;O|N2 zQ>eny#PF{~L-vnH8B;gYzZ*0aE5FEp8Z^B#(4VQnPTVL!c2U|9sh}&c3YlR@h~cDZ z=m@=@C{-)Wg}KEY`;*6q&ssdLejD?!YlfyGHftK?dbs25y3Edf**{9V{DN^!1_pq@ z7oD)cnrEu$?*XGeoWoie<)S1#oX1L7o4bl9KCtPkRAc|jYczAV@!;k$A0-4?hyx_4 ze(ab_R-0(DS=cft-5BjCD0jw7x)*R;99=^K_x4 z37$R2uSqqTl;j|nB6XeatPV#CcX}HL+D^9`sbm*QtHElG2eOAixv7pydjpl~o%FzA z4HJ#u2>k+x(vWt0seyv&kYWZb@HzGZ{Ve@=-5^YN?SAN}tFuDa6GT?)FMYO3!qVpA zS#gO0K@Mc~g7o$B*3D)Bs$*z%2myED3#-|9Xr3x2OtBRPEn-Xfb2qa{z5Mx? z;A7%-SQHW^MR5qqK8Q)1kD_It#zlw>lFJU-N|cE#hYWKgN$1F)l+<6WAAr-;GU{OoLgFN>woELrx9t%nL`(7J zg->-g(wgAy$rBY6x+pwi8r=}@bh$fU6Ui(W9FjJtFElyT$&`NoG<5#!dNe-B@jCd- zOr@VFpYH#1J^mv+|9>{g0gz@FQZs#Z6XuZ3c{fMnG$hXcspGSp`o828KE)DsRI+ zTeU60IQT;BN{uKmzGVl*gKD7Cc<=`^l_>4x@2RQR+l$J#+vNwsF9bW)U}()YDvo)w z^L_Ym^g;8OfjE&WqQt$v03ZuLf=J@XKp%0w9-jMw3M4pd`ea<2AKNtrVbVk3QCugI zFc;u5dHHtwmqqohu0$!`1^rB-=JlPY;v_=~`htA7WkZT&{?#hjbROfki%*1Cp=amt zh3TzSrUk1z^c7lSu=*x8$p<4;-PD7jcrz*U_w3LKP1tt0p6@T-o?8kagFsPJ?gPI+s3R zuE(@AYgpgwLn>^R4Zf%dr?49;gW;Y#n^Uid1e^DLwK;H_t_uoSY%MM3pESk0D6vg% zNRqUf>~n(YoJ$@s#^q^EPrJxyxrIm(Dlf@t_<)MwqFf#P!-8rY_$xp%)1P?OcP{0j zMqkKChm4DkxNJwv%)Soqv7>L=F>Bwp@@mYl>jn2;6Wi@`DBJXBxKw>6Hsb#tE`N^^ z61jc>1GNpaykB0j{`HUA^nb0MBR z22+4w0n#d~`(^8qpNad&_GgdzF(?RVi@=5Oo$Z{7%z7gc;kWd#nZ~2#dLO;!#%)Nc zVVdE7^L+eAwN$Jr3@ec;cdyhGFPC)nPM61yiG~gAw~dmR1E2hjJ21gFybUh(=J0bH|%g!w^Q8eu@X+% zAnEmla373VN*J@dUwFL1$PblzURF@p9~<4`&**@wt7&^5gsZ5kjj*w{T4I zRi~7-vJ2y@5eY?w-17fJ*gG(Z(rsItdzWo7Fns8ataFj#T=nh{MWiNc9TL%~!24ba%9s|*Mb7-%R+ z$P8XvTj!eYh5*QLAIw4!D|xXB9+tuyhRxCE%sdh%HDAmW`=^f8uej>6RV;zgY@T^5 z#qsa+qLas!m(4b%I{|pNr{{gL#|+nV=6B_DSj*q8FX&(ACk)(JeJkaJsI5 z(tO1ngH6VY;>nOD%lY8~>sKdqPDUWvk)fm@@IVZW<9D7PCtZ^(9trr44;As}o$@zc zhobt>P3@rGz1M>9z-JnhGfsp^`8y*jg+k7_nKkn#aa$r*bjvsZ=_T#H9Wn5$nD5H%`BF4AT-IbmMZ79>z6<4(J&z?6vQacm+M1-?JX5K zqE^Y7T9Kj5vEx>iKtot5o>=!co`~)#8n$Z45cUg4()KWz3If{G!g0c%jAw4~lj2 zmTb>8`>@_f9gD=EikqDxlt^Ahmp1)`=Mu~%0J2eFMUl29xTwkks|`!S?lIfK1Ib+i ztD8N{+D+{?AziP@;L*ojU%h#O0q5D~jBOI`ka1)-fk1I&oy{rM?p zHel?EP$Pm#jzgbr%Q6b=;MGZ>J4!*ba*1ipG7y(2evUBDJd@O{CUbbOFF{LPQ-5r2 zI6f5Fj0qp!nD}D4wd4U^Jea^wTG@Z48kc4DfZ8NI$+0Y59kn9Hq-LD<3^m2tW;ga984)mRb+YUm)^&#M>*0<@`+dUC9hE7&L>*n05t32-49 z13{8+@?AMH#m2drrrxuehk7cRPDa-%U3Qgt#g$7pGtR5**K%*^|xGHJA=cX8GW18$*`hcs=rnD7_ zW@0+&%*w$oBaw?-OAi*hFkZWT-g~_6v>h>N=QQG1R`XX4N(ik z#kzW6QCbpNlu}jmq8*K#Az@4e)D@e6vTb?K>2x=UGj07#{@5*EBh6309Zr&+XcB8&6$a!^SE zb?j(pG-E|X@@Jw#?utqc`3mjTUHdep9yus%HPJ!!Km=CfN#cjxwnt z=XQ}iEpn$>>!fXgEOMt?;F!Hkeh*fgZRr`JaUK@yv>NiuA}@$bmD68N4m-_g!tt2s zRNF-)F_?LRZ7J^LC%SI%*yXtc{`3UgX#WSDYnAZBoF)JBDF_>i4gquKoL9P4go&5f z1<1I)CdPwei3AY&8$6oilGT?a*_Q*qL$Pm zK0W2*OC)(Ln2~j_2@|kC{k{h^w2fpk5ox=4_sZxZHX8~JL@(+(7r!nh`tv_{bQOd= z;}G<5ZPD@SIj@VY^j1)fQ(?|0qGoO7Bs#sJMA4xEv*#hOaqEOp+^ zSAXSL0_jM$zkSTR+>XA&nXWj$y0E<1XlN;+85-c4GHTc%s`B9A*iiRif3kN{bs3aeEo0qj5leO27r2wmv-84eu=ZC`;w{ z#EExDG&b})Y3?0$m^87`z95(1u-)WDi?A@}cT_$s363n>hTn7Gcl|>tY%I#?e3W@h zabKt@!RdBHXjyrg`awffZI+j+QB#P5Vw-YIDw;~=Zays{y`Oca_PXdLn0KuB2EZP>O$TfwSL+DM(9o+<=1~A9Vsukc3)xx&Vs4K*Bw$;^OIEs&gOW z53ml;`AI#k^rbcA{H;g_oF{o1COQBu=KRrSmNnjcd9h+;_`Tz0`0Zmn5$aKIPRLT5 z1Alizmg8@C?Bq8TslYUgEtd=FHV_lWHlnhuM{qs1QE<>JyJsc|uwK?%>0RwnuUO6O zRCc|XEi0WgT!JiWe>c)4Ix&NBf7$yCkrv1F`?U7yP+OzqG7KItO+M@ZCu$B?Lf&W( zTh>|lZ7$K&ZNTET)1h)jp7W9QSz4fK0O0OFYjY0Lb5a)FcLq#BY_H_+z~guzU7MKW zZJBpNj&(gUhL3A*xikE51v9B|-+T}3e+=n|m2D{_QT;Ur(l&iYicUI1o9F#K)q35a zDs?*;DDJk95$$J~H3b-}3O-pvBS-vsOy5X(&I6>$m6hb3;Y9_dZ9zsE5#{04dTf4S zDy*H!>z&C(d}$OdJmKOnzC~C7&=o=MCv(Fe~d+uN(?a zE@Q3^*IVHV-S2W%A0|NN9JzWD1E#Z!=*~RXmylDwQyO!{G)eB}(hjBE7!?~YNB@Gvs!{jVi49#{ z%Gc_n=?+NqOzQuvr`kMk-db;{HN_J0(58J7-8ISd37cve_L)(-P=_7mwD6?;OiH1W7FTvJGAtkouyTF3r>pIZ#-VkR~`rm}j*w!oUTbWI62 z-D=_v2F5mDq2w2al(sM*u`3qb2&~tt?PDgKj{XAFwrMT>G#UfM>ki<8XqY8*_STUX zi^;zEJS$$+AWj8{`N|F^q9C+_2$!& z+`t;Ui3+I{L{7Wq2*?#&BHXXS*K56Xa6S>>eByKr!LATDidKlHPFk9;r}p?xh+*u9^eNZ~u|ha)%CqNS)ffoA)(sy@VDj%aQEMk1I}qFnHL zA>xMDI(k>Z`$9aIxmB4`dJuDun=XLx8F}bfo%NaF{QCVJ>Ju;X9rQgsb5ZAV)3c0- zEFZ@t(Y;8S#NI$I_5L3$CzI)dp1>bfspfy<6e}40vz7Y~PH|Dfg!BO|oRAHl3uyZD zI~_wMF9hUhFfuwG5P+Gi#GiWIzVQU+Q$}g1=mk#a50r@4U)&IKTM!7jzx`ENRggQR zx9rDYW1hc%S?Z4UPm$b$h%)OIH!GXZG@1rO!M1DIt^85mmN>9@4#C zP$pz5s<3mys`rl)_c=)bV13|6GP63Vlq7!-vJ*jliz%2nCymml!Aozt=+2}buK3=i z(9Sb;xnP%bMsRSZ)rqcus;Zeq2f~A|XuH)Uq>Q98q7BNCTW)7vUq;kneOWn3eJ6l; zr!ahcD~!CIsT#M{f1zOhjCYni!=Eqp4O*|uBC=Mq7(?&F3Nx@M=KW8lmzg{hKwgXr z4^MI)M4msnY?}Zy42529C}>1$bY3V4Imj8%D{~tRpN&eg%Q4a2>6d@zz+NcrFCvBAI3fU9SXneLT?q^Cd^X49}%DnTDJPM1`Avl zF|K+)rfR@*0n0do*SVI8^vi5hrZ1@dA17TVPCLyfN8avpv*1;|D7;TiQk9NA$Y9sH z#+g`B53MoU4cjKmC{XOv>$~WD(d@If_2X{Ly@egdxd;Pu9KG~dymMCrozZg4Zd9zY zLa^!JQs`jwh8dDfcEv{7?a?I>DfEZVYCmMaa6MojhvzCL_Lyr>PdYj8DAPs^PwRXA45Z%<35ex&KJx+#F!8 zj>TM{4swU+d{7{SJ&6#W!ArtRW(x%9lKbbBat5%qe-T2c772*yLusJzmb&7L|>WUv+1GL;p{yQGkC2)AA>B zWd9R6qW-VK^Z)!s{7Z9e`iUPQDxrK!r_&Nb6*czC3#robrt=qYD&hbTS>Z9x&Nl*I zT#YkgubYvi(WX7*Kwvab*3G_-Sa(-Zp$Euk6KkHZ zQv6KqQt?N`Q0qF&{tZsSaHvUSsXB>3&z6HTM^BEZ%B#xXON{`2Na>J>f*1---8|PWNXX?ZKLvi( zKO!^XDm=^$?zCQ*OueceRuM=QN9^n zI`B_?a~gBhs-dNHIPWq?1P8Bx5h2pCl7%;U1~Cs}Zf&LRIgqLG0`LTWpXw&zU-N!c zY~T)EI!oFjSQ8~2QBikg&ep`a5HNL|=1Kmmlf*zk_!ibXB$&6sgZVDv| z{mv-|$KGr<74Zf~MNBA))RPk-Egs{+87WBl5=1j?$_&A!J=09j3uhH%cpNJkh`I>r zT$@4Bv~p`#a*1Hj_B8@C@*q4%V_e$R2T~EqDwYO2`g{$fD_Jp$eHnlickbJ-6@*Ud zbrM3t0@d}jqOo=I{(CZL*Nf0XxL7fS-lQaqi3KgFknrP~{kA24#=dx$J*dr*Y4*$LzD}U)5Xa0~`;VpQ4w$4QaGICElnd#}Z^{&63+Le1cdh6G-ck-wiE8(&afTB z3I_{TG|AVn6!E}}v*f{)c`8Eqyqt!qI=mY$`dYivo@y7hcA!$#0@|Xvm>k-9)mH>0x{Zl-dH*FVrdqP}Wsi|2eku@{ATgmUM2 zB8<4(v-~gyOSMRlTy%;2mJnC17%}^@S_M4OAZ0Nw0R&?pP}Ji+JnT?C^IcdT%>}P< zE&_1h%X)C;zrl(B1c>hh&|e{chnz&^*tmx{lk76A8|xp%NDCMTFQ|G$_c?Gf1~96S{apMVlTqrIY6m^G3?69%ty}H z@c|OB%;-nK&RyU9cmjwKzbDvyalzfdE9Ro4NX=?fS)Y$js3T9cmFyT_=mw=x;H4%a`%U7WZ^Y_KeJZuhLbx zOjlN@@2+IrjOKukF-wjyJUgWhWeulz7iiU)N@CzN-U9}^SV#Dfj{!^G}Qlz^D5`&)WO;^AW@ZrJ8O`~~A~;OALC zS9_hG>mdGrpW6-&KmM2hvoTJRm-_M9A!S~Q%%>yqr}IM|76|c={d6&f3CPMImxSVI zvOY9#arXx|WnEe0zgTeH0KUkT&SXF<>dGyp+-l5BW;}QD_-K9ox&fg{U$xNJ`GX!e zvxquggn07sHc*#2=6Kd57P9{8*Xv#^67--T0Z{Xe*NIt9FLQr=)n90y>CI7+mU-f6 z&Bj{!(8Hnl*7n1SN;KX+(`P*SUg67~cq4eDEFoU^jAau!rOwxUMlk)JLUCR0C=-%U zi_b>!5BOpFvbYf*H)m2}HJ=@Q5YFy6;#M7@UPhBBf>A!dl>k(XCr0xRRW{$xzadgU zk|eDVEnsYNu4wB{B@btcJtiq|Xjf*=6)pn%xT$q)q$3kSMkK_0sL>N*YcZ%F!2@q^ z@2O~|PTqgnlb1s#7#=Q?yVpR=ERK(|;p{3I5!Y(i&>q{S^H9ai3>SI|@alpuEvW69 zs_wccRS+?@TI)mWYKkD-z^MOb*?R@K0_hBK?tPD2=`-%7ZU*2EeWBfR9{efN>?`n% zDVVVyByk;AdkGH`oT>S@u-QL%eZI|z=$@a16xR=oiR}M!xc`G%kfidifwY3|4V!|E zCQMf$N(){sJP9%CUe*>$#}``*A*wkjA?2tFf~IB6%+LUKl+AoPR5-;&XEk43#gw8w z+f1=svXqm4JSOw$@FtL5c%7z|tc4y}3u`j%ee8Md;xXf5-1GI6^9^zX_#rR^$XclX zOJ;o6mI(nZaR44z03y0v*0vO4FS$gysRw;8(!Tx=Li8W|}X_k&Mq|hH8I5>O> zO^LQRA7)>PR_SL!QI;TIhmL4pTdqe?W$!8+1gH`e5}7Hryn|JYBw4W+Er)Q`l;CbI>LU5dMN@e* zETxiL#$qNjNL;*SB42lqwz?QfS5`8m+Hb41(A@r5Xu`2@37}-QWfw&tEv~E5_#DYy zHX`57gd*V@Z5GvJLlz{qzHC~#&`e2i3Lk79NID~WdBbn?I|w2fwp$OKmjWR>n{%V2 zqxr2DnmYqnXd1V#C2zcIS< zA21i9i^v4Vb}97zGx_CaF>Gi#OFSXQ4=|qP8*=aR9TN=iXh;n05n#Wkp*x%w;>Scb z`k4%v7&=%J&Vo|Q#}*Sqongr+wCLVXyKJchuw$=qL1HN``vY4WL&cIBf;hR2Fw4ao z5O2O}yE}=_vK=aDn|*BPpGcCi&cOSNFVXA`9<})kSPz0~i|Y~)zKgh-Cw^A^*h^FI z)3uZZ^v^}eFPKwVqr@P#*J>+rD4Q{}*$TqDV7KK(5#)vgn$B|J1`bF0#sk`?mk8P? z@m6d32Ax~wCMcNZmIT^oxCG)Wf43$TzSV*|>D`jU=%mqI2*exN#{32IYdVv3- z5)d1Mdte>BQYRmG69(J!14ua;2j98Djc=0yD+>o~bIMo|0JlX`rX{}cq|cY3u@Vqr z6$}|8-XwF2^Lch}bH}mRaV2Sl7(?r)qCk;wvH0-9V4r=t$*0udk2iT8Ph2SO8R}}M zCgh_-xz=ZxLfC-7Jscia7IP)MUzH!WaU20L4bjYW7|^mHs`WwiiM|mPQWI~+dZEl& zzBw+b^N5W3dpx%7+;CN$GS_|AkKSuz_gqa6iKVVl&pkq=c5k|7O)@fC9RDUSVr;V-u7DyBza>31J>XQHw$pFm5Zaisrqwy@U^>__5Hu6|)T8>a&{m}(wQ3B>IC=bq`y zV@Fd58_L{70;jE2h<$<$9D7vViq+*e)M;5{oQazKW^7xE^fTR9`~X0dA9QuEjpfey zBVepg65O4XuK`2P&3##hwwc>ujO;Y*>>R$a z-15pB?qZ9voHsIZ%4~9ml6HTw?FmTY{)#Me^)$cLu1{;Q0LnV0@+SX@@i`RVxYvLl z#;>P2KWWB%$e6qh7yNjJL>K<)W&_YIusm#z*N7sh4$>;&H5OCF8{I(KPA3QN@GM2; zR!_x;xwrAJsuekk+K&9ZJ$7YqO~H!HEh1aU-K`{++Ba8$L#E2KHEeS*qq--G8@C3$ zMVHr(Z~9@|R%%V2hz<>tIa^34mLaGq#gBF-@_)L&j<4aQHcO zPPzoi_Z6(HjR97S>}Dpd6xq(-dzf1)b}G_q;s@DdN8VJj83U+P>}*h;jpkh8IoNWB z-uy}Ns|^I$&gXA`U^;H8;82i7P zBl(h*pY*kst6|f8(W`{#S3S&}my^W+KmdTi0tuzS7*!UC8^zLB7n3cK0L?HKeyUS5 zip4UTA4C@tn7K?Bke;7&(zuw^!MnY`IvMVHw%@znxxCJ+P<8P0tv(u4u8JiPx(d1<)N?+g z4><^3WD5-1Z!~WN3Qs)u&O! z`+hHF4~CR*Tqq}qGzxkiEdgd@rOd^~`o^s6c|%LyOx1L+?lEN~i@cIjk)Zv>c_hPj zve_78Cv|dDy5>~GY4kt-n)FEEVt|l$URCTB=M53NsRjj^lOyV43yp9ap@guy-fhEm zD5Bwb>?+W-^7i6%-IFW6=a1hj3wz( zGOiskwD1yrfcL-wlW6vEIbU<~sOg@Wni|)SMpNA>XDdp8pD_sB=;Ir!n%Z?eC=)`{V>xE`J9jLroR*76 z8aq`}O61kNw&kKHf8c1r$-xsq!SN&C<;OG0`OOt57JO{9b zE;L`fr5pCXG%u=*$a?8d{b|)8^tT)eOw3SJ>^>Nivr+Ks;Ck9?%Yf|Zz+wo?)3%Mz(wkAS0!#RQ^^Vd}L5v&| zjCT97hu@6tX&)84vw9n>D?&5qmxeW(w?W*2u8ug(#zh%YG6PugLWa)Oy7NmAJqDTu z)x-BoHO=5Y%>Ixv`{& z9L$_36}BPgO}HIO9wPr+?eT$ETtYSN7)-&5Fv zSTaU_xuBNYj#OsKdQJ*P@$_G;WVcei-5hC*3&nZGZ;TH3Z0XiFH&aob5&?r7n5X{z z9Ib%Y9GIt#gDvEp5jF8lGW5I1BqrZDqwxZ)NT3Ccr%p zApFg{;l5I8jd@4L$qk7;(R{@gjp|-v3eCMtFyUd&ZcO-TJ6N%5>G5F@U%JR8@ z^khcqFp6ghPxW2U7rx@+ptlu#3&V;trbFu_C23Vf5*_Y!{$k_O;v3&4$mRI?K*dF_ zfO6&}{?`*pj$q2UntLz`2wp-&f%)L7N|hxLYTo= zjQQd0EkHU$Y;#2v84L@RTC_V|A86a5TQ7Hh>i zaGrr?N@)xyT#JLIhWv|PSyV=4NyorM>H&IshO}FawrnnC64*kia^Z|jI4Arq#bKj< z7OsH6C0MQjqQ z(LJ|55b{r(;<+(!CPf2GZTtn|b_?G92Sf+}MI8Qa^<~TYj9%Gb{9t+$YE#1_P(4&?bl%9ebFK!sF)Lk!Bv+T&t;QX%t#CtjIHW zHzj#oh%ILq`pOg~W6q2xQ7X8PqoyC)Dt&FV3r_SV+*Q5|Ln=brQ;T>BTE7os~b3l#bTJ#QLE{Y-DzcY zESg=st|H1N<77g$&hEVu8~FDR>r*Vhhbh}-(K(smr6Z_SiI*c(hZHjlyEGmCIh8cH zuAC_Y5gD*Jz*b?v6|1SzP8(ltL*1lo7w{n#Q=(rzmOlLBt~(FY{I9A)K6ROQDzFKw zcs4N1(OgC}mJu*mtCk9*A0PfuokH&*k&#P8E}=}$;vPqJGsW+X_>1y z5|bT}jVd_{+FV?}o)OmFV{z76-fM}ituu<02D&YbO_@4- ze%QNd#TKwemyLGm>AGcV>Jc}s*6Gzeg#3AIG-~)X6ek7WuE&DiUtiE5A_9%uovnlB&mewoZT1k#~k*g4Sf4o8y=Z(}h^tk{ICL z40KBK>-5<7;hy&`2%u1atx$kkH0Sf1ul@7#&nJGYH@IjIK%tHnqtl!7Mvivf6473_`3mHsSDb%j{_;R$ z!FWuvUd-&2$k2v%u?lHpLHm}DSKL);E;dfjG5#guJK61W1Vy~-DIyT<^F{3EU4`O# z3iWJn!{S8>O~OSA^}^ELrSh$Fgw7q{^bX^tPxQJ9kA(eU_3>E891G!%<%5ch!m9hd z&;_sP{e7LL$4+PL0WN4g&?5-QoIaGRLgyC{LgVP(=8;Dm-w^+@B(Houe-`tfG5>+naGVS3kIaW_3m|IHhKm$(*3x(0KoZ^{3 z{D`7fIYAv^o}a}A^yrL&3juRbiaaJnop4Ye5u?CK%E+j5mJ2ULvv9#%GIz*~z)J{T z+W9o151bMY6M`zU7mG+$Vh4){l5aI%-T{-Gvhbn!GPsh0m?U+^z zxUSKK<;P{^cN1(jjR{jOknvImd_h74ay}h@ZkIIaJICkMGU{y$tx5mQDx>VUMmtk3&9KP(z1niXT0;L5mxZgl0NW+w__B z^%Ioe*`8ir0=IBYUqaBKbyaDf-*9#bdUx z{QbH6pNL#N%}UCvpXeFWPnFPr7o6=ZrJO7s&Hf#67Nw-7fTZ#hqMe*=cmVUyw}Yf6 zg*p>7*yObvgvRFm&1VZfHOp%t^Slb_uf`arHn}IE9UpR#gsM=aBp0EI>?N93-g)41 zz*DF{eR+lM!F-S>^OyU1^V<73^LqR1yyvesXf5nB!D_hN?-YX4ep56J+n|gJIn9B0 zfZ>-ALS4>4M<6{(u-Mn|F|cA<>>x0raCFUM;X`7?JYaPs07vWk&CQ+Ro#BJwz2T#u zEJDWSq#Xmz4vLRYFC911O`LBGx}X5F)e=T6l-fA0rR0=ogM5E85)+-7g_*=$)1YtG zRC%~%BSRo)BAHaZrGW8?CV4YK(lSHXWT%^eRG|ri1L9p}q7nii%c8f*z*9kBGd_g{ zVmR|*yJRpsuAw*`Rrs35fjWvUr4?pyrCN1F-lZkeTffkBg2iX8{|9~u_C$Q;=Y1^lzE`ryio z@L99*}f6>yW_oPY(ebw|Jh2ATA54t0)gH^j+nOvbkR>WR1?=TV8_jUg7<^JUOrTlYnM>xnaC1CWPZIs~Ad? z5cOVBs@TH8H|F|hVxCEBp}2B$^n4rXBAwWhqBZ<3Mmzn3T3W*yb;XdmnSOp~1Ir3~ z_|!wrrues&-`Bv>1M!kyG}h;8MQs31y#5!5H0){QFvVC4WXCB7pN_+{xUR$pnd%36 zxo~#=8y&!H^9b1R28!Ik4M4v^AdZ|O(>C5l=%2MuFgR%{7+qu-gcO0*{Yf^{)d-j0 zCI|KFA_j5W)g~g@D;^KAlP4JsZM+;eslzWdV4q>D41pqN1Tyem)7Y^0P|CBIC%Ka` zvfNqI)70(-E%$sR$+w2EyS1R-F)5bAL9og^rKqnr;QBJPdm@W>F{p5;auaYSi4Oqz zWG1suoYDz?LW^`Cks#dF+Jocd+L^#6db27N(f0`ax_)DgTbH7@QEaLdW|tx6z$Ty7>~F4YJrE#hsP)DuBh-*=kJN%n0TaS}AI zZ{&DYG(znv@TZ)w)QV?!!SmFAX)=_2h^R3o+B|jQCVsu1upHa5?cfb*7D|2ic4Vy_F?OYsG)Za|H&5z(w-(9qnCict!-gUed715qtyw%R2T?#NF6v zugLFb1)cHZO8l=#Oa(j3f1ej#@)8n1tpQ*9O%)biOV0_9%i*o4HsOD`b8ES4GnKm``1o}lg^K`b z!<9Gx?T)by#BKiQ06CwvxKgnhEO`OxGfYUkTrCZUVzOW`Ggll8vn<1EG!1$4A1}rw zU28OKDc8rY_sV`i`$|@m2nCu*o0@i3GkI^VFKLAwc^~+bP}F&kH(YuxJNfBT$?Nb!1!9l3BD$ ziT!&JpF!2JF<*nM9ChRzcBsDX4f_@=fCKY(N%yddiNA>Lluc-Qg*Sy_Fk^pk}fvw1;R%2#EJj>Cers^wBt>Iq_F$~`mZDWM`Gs+RhZoR zasOE${x2xb|NjX82a2;u^;HFP1^Fvm6=X1#X_d(-(!hW+&;XsoX<@IGPD2u)*H;cV3F1LO~;XzvwFNv*MeFmh+Y46$gt!D|jn< z02N~tFVXIcV1;22>XoU94>%DGFUKk`M(2;2rYdEyFiyVKVcuh8SMot}s|Uo8jmP{P z&A`Hs7bZ=Z-+eje(^Y!lJ__!qtImYUvpVi$(`E#f$x}@1s~#8oB|K-Zr+m;;3R-97 z1{(VB;tdrv4TR#bBzjCSaC%5_lo~;z-K6VDr4{DAfbse%N-0c6g4n>=s{D>1UiyLn zJO#Y?WJ%44K-_68)k0b;B8IGf$BZnm5N}JWzpYk`XC^g?XO^=1>-O)fv_D=`;c)Nq3wCqUq7;%jqLwG!gJX<D|cQGG06#tNpxac=m>s@cAVt0b}{>8A9ShueH=rhZ4KdaI{^O{Omi=#^1F}G_k=;hSZb`X2_h>zKo~<@8WadjA(Nw#y${^NRacKBQ7^P6h_Hr zs9Wf1=*;qJ5#+>3%6XX#_aUOV#n_6)`TPisKmuaf6k#jTn900tU)NO2vfn&F`C)}bL)k=Sv7#dq=!UvoGL;ZB(Y{=5o) z@&)^ZIJ39hojM}}tQ7?!Q*X00vyVEU?a{wE^Y@k zcS0ts^M|BHVr~rlK8KKUTCf=KoizDXM?7x-P^jRkd1-r%)A+G_`{&U6)+Co!k1OyX zt|}CMovIE_V0cs8HlhvxJ{2r}OI;jD&Z-ieOmEIor1TRAdU!I_r!$)%ee@u4hUw8o zzpkSsxm*=CS7ldFX4Fy%(^)pClpdIJ_mmx}xv>y>gQ)0jR_zicI;Zm6nU3MYwT;#q z5VUqTmb<8UL{rlBR_I4mk?)+V&z`08|4SacvKUz@p}Jh>|Mw7dBsmd|wX+~z1oWuH zu$w8!K|YrJj0i{kRJiaId*Cqs35EFZ0?I%r$W1?y=CZ|5aRI zI>Ud?@(f!U==VWfYA_h1w5c4mg+Z00$c+JZaq~9m)HP8HMp*B2zqs_>2OP6q_N)*9qLr<;X)hN#L`n+RnOx(f{t^~=;z-S2u`1Ica9eM7|y%f|& z4ilTY?!QxUm%kTrIe?zWng_g|4rU+kCWr^K8cKE=!mp?GV)qL)sq!On{~yNQfl1Q0 z+w$%*x@_B(W!tuGb=g*zZQHhO+qTigF8i(jIcMTLb7G!(Co=K_;_@11M^_FB1o zt-y%d0k&3PCQ=kTsj8qH$~Kivx$1(bD@)pMDe}k{+WvUl?SVQq?G|_k7=bxP_~TIB z(Y;!bO-b|tffx=zkB%(-;bQc{;~;pDFbAEMf<2a*c4p(;IX_q$X)~1v>D`t1{?`pPQ`d4pwEU zQSbBHwGJj}U2XCYz|*VFIGZ@u*0XJOMvPH<%>&CMbxf)#aX^GmQe8?eu|VVu!qMdy zd6}wYI-O^H(l2&L8Slc{+7Lczp6#k?6~rX|HGF|lS6T$n4Wk6x}t zjlB;4{&OWgx}woABq>T>qLs>Hql?K>Q|JwYh6ngj*H47GGEayj*Ax?GZ(8fm@lw0{ zP2#H@G~8Vo!D)6O0JKOwz;>oKnEZT3@km|OWE7U|hCSK-e%XUWtv#c}fkeeE{@lBK z*etE46%+hIjl3!R4b0b+xy*fyD*ENLZkA|#2wYa~e1Svp$#%Hq+8}7A099hFl zMWf@6aGj&Se3?*pgTdE|nr~sH!k-Fm@s9YJILBvxvoGhC>~SA?ZU0Wfhc8I(fN5>* z=bwg|gP;FX9mp$SyW9M3^vu4!jQ(x%;&+#zWNu?-W%94>-jLFa9I^n)C%EKK6V#z_ zRj@>i19&Ie?dCHu28K0^ek8c<;7gR?$!S1CgFf9m?k9G(G&jb~r^0Z{M!Y(36I;XB z6`O7M({{^F=gY&}8~hL3+tx4*ZVUY;zb5cy%yV3m#A`+`cRW(oqcZ}&Ic|>Qw1#am z)jOJsh{eu?kNDC`r~)H+7h$oOcChzG$|Hv24!Mzj^teYah?c8ouZZ=pl5 z*+CHB(_z^tN{pOSZx9GfRfQKJ$8>gF=293O z17OyrxG1IiP?j-L(zNX!=FeAcw1LTHj)2SF++!hJmZkP8rl0je5`N&8qH`r&)J;%9 zI^WmK51A^LZ~@EVX1g%28p#;V6wxCYN}^tza~QdjG@9TjYV&(Fp?(NX`{1TO7O)a- z{+R6zPUlX3m^>uEiC{Iekjod?++Hm1oI94Y-@qS}mK#z_Tocs!Lq(iw`AfMD6}=Ek z<$q%<*9f!KDc6B)_FIqB%`sjn^L$&Sr?giqr$#+q&24-4GyPJ!5D3Ei{2x5(lE>gz z;Wwng_2S*0CaRG;O0he_FrxgXC-krSf z9E_jOR~8L+$f+Ex7yif`>~!+}Dy&>QM6%2|eAoWi9N+K9`8Wi8geNZ65Bf`g?8Xnq zFK#Y&B4OkF4dSpPZH=Uugp#D8ouaI3ZZI|8g`TFPk(70wm;~Y!LeS{I8zkcYyped@?YSpNc*`yBxf2h^Pib$~p0y}LA9;X~m{ z@z9lSwYOWO8n*^A!w=}cNWry)hPr&;}#AZ9}lT0IXG)lcy znWjmozKU~?iAk?Z96$=MDD;UNO7O}<@>B8guGU+CImH-@6da&{CYG5cSke+M+N%4b zhxoGg>?u%bW}2B5g)YDa!&H_Qfw+|}o3pDxZ-6m*0PQ+MlSHy{6_Et&p;JPY#}RM? z+oFG8>sE3xRz`W%-L-!G$kx)>)tG4301=lwb$k2{+u!Q*dPb(LBZnb^4Plp2<{8q{ ztwUw4MNUWV08cuI4W{Y1GAMDxV{XuN6N_wXt9}-4k@uol2foT2TmeU>$I0e%S?dEH z)u>JLq*l35B3G=_lX}w4%WWMA?{d9YlbOHl!O=%SBlTbeBXkDFk{1-W|5`=SoW1|D zVcz*|9v#czw*p+96Jczn#j_7SCay0%O!J-b#(EX{EHE7NEHQ|UNd*mDto3%bE={9k z*Pp0!?^G~qMO!pR;UC$y#W6-%z-0?bxsy*~s1_W(!uWW@R3rluk84r6uNY>ZNP3)7 ztuir%Q`+8#{P?m~{)4n4z4(ai8CD|IA`KN8b*XsUq&dOOaxLs#lXfo?Y<6!O|P1)(KdN1*F{!9!rJ{M)LEUm2{9A6Z90e@AQ|msJ8YvN*Ndh zCH)kqUWi3(P+MjmrNYlikDl#^jV>$rF+%ybpjQfSh*K9xM3NuB&OrswQQ|IOZ^g=6r+7EcZedDN4;UtK)Xd< z1`Zl~gudn9vp@xzx?kgb9sAvl#vgQCiU1ltsW|g=zv2dQHfJY0v=h?%(*u-tW$qzl zSQXK40u_5m5@3zKT8Q?EuTP7pPWJ%_pUCT&gr=uAIY`PhGS5|nmG@r=rbd4x>| zJyu<&Pi&?|Fvck)yYB=@6H2y-O=ZY4tGA1geGBQ`2VEbF?zyA;8U26%|4&7NY_t3= z-vGWffd5-%SF!tc()`~lds5=YKb3vBhw{E(6AZDF2u%cVRPT>UM>+^jNNFx97zc_k z9c&U9bO~o=R`)5#`^%7EPI%{|AkwU)NN|npsEEt)*sJGmDlP5vg=nj>2DRt$wW&EjW?ai240#@TUv?ZAh02 zosMyOmu^XGEu34B4FEppHC%JqWP0gq^f-g?A@9JU2{*%_tNR0uT4o+K&u4a@orug* z7))4NQ)&Uh&Lu)`Gweqt4~CeQ-_oeMebHP=+|RnNg2=$=|dZd zl5+Sn8$H5E1&J2T-7lx?d!t@DDi%=FBOflUfryEDwv@J^)9cMUEO}W1o zYBrUXQDAm0P%!oVX2N|D-uyL7I?b$O%q&}S8avRNXaS_h*~;u3rtlelZj30~AC1;% zAO4t9xj}-FMpZMJa}LDzZe|V!+_Z&AWACOu{njOA)48IR$ed8CN7t;}H`kwpuEF}u zP%ZW$^|VO&gn?{?fgPMDctfYTLS2Dz$%0)lEo(9u2Be8MKgyz^D)Iv3r0$KntoiU1 zFXl+aGpr>FP&^~+qFo;doz&!FZ4gYc*#L1b(W?ymdRq6(nBMu-*AokC(QNmoLikfS z#B)@#If!BzLrk2O`}qHTJN^+k>xt4KjK6Qk?030m`nRS2f7N*sX%4gSY%B)%D5g?18&WclKml60nRU+*8c*u7Y~!i0nc`altkij2u9gSCK2w7x(= z2^j)aB5}x^C<4m&@<=n7zpCyXtu@ySgH9{&@(yig_A@RV0h)W8-?h46p^g(K-KL$U z>Y?avY;Lmn@n!TJ6W_Y(7&Ch*KmBFz6-UUe<+WWsZ`r6RYrLYxqp4A8n`rzcAirC$ znxV22v&(G8u3d22f|JRkN!cL=5Dc|-ylm6r{Hy6HQYb{$xX1bdSBSETEh;;Y1Kd`= zqIn9tZE{rDo|7RHq`*4j69g#?n?~yJlQ_4H)!N3>J$MoIJ!uk1#q-)aolCO;d-JB< z`W!_%LfCl034CZss>x*A+B%woTTU`DeZx9qxtWG!gf@2~zac!sa6pl&YO6gGHn=Db zQh9Q>E!?xU#t_&Z70Mt!6nUZ6AvpG|HIsy7Ax%n21wJGBEN-&xPZ;JhonB$jP+P_4 zn!&m@p_Cl4=(Qx3G*sA+m%(20pqxy!6as|MeKeZ@gYbNa!=aMsQGkUJx8p7QiDtq%iErkt=L!I_LN8rP^@%!A_v8lVi-x);uOY8@7BG9nq7&KB}|3%XM=g@+%@_#3{ z{O2f_d zWYf~$E$VuUch5%7oKN{`)4I>qx$XIR8$FfHhNkk&PZxE;>e2DWg#NA!SgDY&A|=9)TROmcf$N|Yr;sT zT}IPESJmN67@6VD!0E_5+DOdyDQ7JvCn!nHl{OAlVM$lD~J_O-e}X_3M?>7vT~_)^%=I^KOr((bK4Mw~!@1PWGX^x)Ws61 zV+;k#v9VPSB}}xY-;9 z6$Ig5Cc_sd7YDbwteQ`l6~m2{3lae|S}l-nylu+65tWss4Xh3BVH60{(Ydbo%+{Gi&%5uy(Ux4i00%oQhRv~_%|cZ?PR=~% zkhOG-g_e&poIY%_Rh~EzY<}0ToR%Ry*>X#ol(Hp|GN~{iR;ltK-nW~~`%8?wNPN5W zG)O!xZBdq$jRs645k+{GPDo8ZSNg$zncixGRpXoTaun@5x9F>~N!4Mjw27pwRfwxA z-DOQS22i&KxEgP&*ug(_+|q`1ksISd`aPL=779HqMvxO;c)|ru*D+5Syv)g`C@or7bdlP3NNsDCeCl`dxXZHLY7MWIuc}<2G_<$gK6#Zjy?+_YRRuQwxIcXKpC=ylyf~3w5i0_ z^W+*1AF4FHON`8+U3R zn7lFXveSrbU(&sK$O3Z4eHq>$wX!NC#pwpl(~ZnK<8&iO9f-r*8D0!-~ZTJ4FRc>b7l+6F2)8b$X~P1XRCYrhI?FUax22# zFW~mZZJq6&yd`RqaSvIinvw;_RI-I=$hlo51bh3 zp*F(T=yUHH<(wEboE(AbI(MIxN(wIv85?20%3kO9ERxwb7s2lAiFwK4vK_7YW*O7& zBh^ozb8Zhl{7-d`Q7(Ip<$GC_>)SAx`QN|rzau!Tzx6p`TciIJ=>E51UX|L}H^zhT z#Z&EPpD3iDfTF;B5#LJD2BSNQD2~RFoEyp!yaoX`IbGS%0NI92`sAJPHjU0lq5`a< zDUl{uCV6BVe#XYtUw;A652AW}xc~Fnb>-td`TlYJ!1rS_BFE%HC@0Vd)BTjXPgi(w z=6B$TF-j480ORy-Wo|I2v#k68()7=y5mIhK&>WP>5|UDX4kCdB1;0{IT7yP^Sw>?k zp-NzYhz8O=D#_Vssi-2^mIP)BJ*k0a{{m8W+zmizu5>!;mwz53ceQMJUSR=t9@>U# z$$&?{xhX~1sZsGciS@J{d&cBkt?7_p-PxcBabZ-5Rkk>mY^hK$D?a(}eGJ#d((_W7 zhY68`<|FlVlR!-xVoauu=Te*VXq&V`(zRt$zv)_PY9C*V43eMwP_l+B6GO}sIIs`v zs+k+pPJuuB_BT!#F76nNshpZu3MBHV_DbPm>=(>)_BH4Cc#uot+Yyggg%aol2j#*L zBBG(;V-lJ$^G?wQl>^C<`agOJ+LkOtC=ZJawhl`Y>JV+#;RIQ#M;Mb5z=Q;QGuHL-G#GU{1x^1S z6So58{tOd0;XW-lEu1$vhHcbAPi2BO+jeR+w((g3=MsE zshE%MOT!n?v6A_sInADWRS~7c?~xeloKJ8=sPSIdSRC~O@IBEjrm6Qd4vH;MjuM+H zOVr5NUH0n(TqOTGb?>kFMPZrQcUI)FR4&=-O84QnDCZv5WW2RZ(ZbDle}jEE>$U~r zp2DB_2VZ*X#A9xovs<;#)q-nEY<@e9$cyf#`#ac5_DcJjJSxQVvEbxnp1zCV z%N($kL{>Xd0whx*%qer9HDHI&!xQ1P4ulo(Q@;;;6kC)369?Mg3NGkgTX<$3Cp-Z5 zjv_4pung-c@8gJgU9z(k2#GZV7N{YaN#h2|!Y=B9TaqBR3$(tK&Itm)A8M&UJjR>= zCLQTK6R#CWTxg2*IXJA52vL)lyGO=4ZM2Z~UNH#B8X_}9O8_$&B&>g@Q%;CN6%u6q zawY6|A!`QYIz-<~nEU~JC*5VN(veqIHB$BcS%m}So}*j!be-I~LVn6Rbna4N#$UIi z2TJ!;8Ea#+7T_i&-Y%UM?z+ZB7(m;z*?ZVy2AEe*1KK%-4A=!|vq{>qf|8C{(gTyV zP>Q)VNi+X0tH$R^T!9^sK!*`EVwa+!p~X9QjHX(~qSwBy4DF(~DGpqXNlFqsJ81mO zb9Vbh$hJt3=)P!7#a2X#?lJD3U&(VsOhWT0xkaGxeo}WrX2E1IUDB6G+b(s4Jc1$dmO>;QQTK`S<`uGr4;`<_s@zSsU_{6BHmhUe2G*yy zrL-S|=Q>ZimH&%#m|;($SWG7{YVcpY=KeuRdi8(cXMdL=YsCMTGW36rcdb%;aYYe9 z_~cv(oazlmkf%rL{lSq4*4ayt9w;0e_#|Y8FewX zgxmW$;riu02&)SD zGj3Mj($1pQo->dXquOsYQj|GzIreT3;rv!Sv_2;I1_N*9CNP)*c7&OmQl3Fyk~$kn zebsvrgO$j9rjf|H+A`85gR(|NUv?3v5ti;!((fV2jn#Q1Q<#Jyy?rKpFj`bQO;Ss@ zP^z!lhK%1t&_i_d2F7prtWsj-HZ#>ogcFB4tF~nnXn~byp^mbsZTbURXZPIyxr1rq z5N71)x4=9e6Cpf1>r&;Ef@8eoaJ{i4QjHI%?qnSV5tj}*rH(B#6{_J;p&{@J=r3-h zwH79>;@l#Pl;rZ+fTno7jRqb}*6$m2XfWT1oI*B$zrlzSojTo#*VH2vN z_r*oA2F^_OC^*-Q=FK?SdnwnLIomkJh08&hiWxf@mKmgpPGT}S&r7GpxK(if9Nky$?{5lNYpvTy^&xK~3)-(5_VCnwT-ke633qV-34T2S>y8lw4pHq6iR zuzxW7U-bLJX~xEN595NJVJZo7B86SpvoRAs*PylZ*Q6tdTr{a`zYIHo5lXV2i_^S{ z9k@`O=WV22(x@7f!9{1Viu|Hs-8A(D{E+es5M?-*35aU1;ul0lWLh-_m^ibC9I>)j zZh@o!s7E++>JCbAE+2T{(jA~?HNA+MTIzSr-%{xo5Dwv17rIpX;KnTa^aLIeCZ7 zfMFXXQ2ba@RKtHM`0z7jnIg^stD&|@fJ$PkjMG5T+HShbdnla2Nx6nMa@G<^8(G0F zGQigaYgvu;%%RDsmb`OWn z%-k+$sEh`HsYA~$9;pJ*(_aOjar8hh)=D_j>D&!4>QbfW|85UUbuBn}bH+9sQAw;t ztd=?T_uNKLwd+AyDEL!ZSDQsp#WCDb`{hk69yzqUr$g{keDSr2E{qkLyxQ#i8#VK5#R|Omqzxy5%$4t9s&r1M#XIM+M3@|EMZG(P} z%M=21j}=!fR_&#Vu^9cUIIOtM@Ej~-ceCdTJ3EIalZQ+)Xmu~?0n`>A@w{(wLzb$K zHDR9L!8Zg8-PEa!~4@#|UI3hUsh)L+9saWPl7}UB> zqKLhQLu`*6!Khv~BN=Tlk6oHp2WL7qO7}073!)laK7Wg($-MNesokpn-IPrVw9u_D z|G32d8QJt6eV&lI^Nu{OIbHAyIKHOg5iy*SI3-b4i~#fGDE$C&R(9X>8Pa&I*w=Q# zQP4@(RiD?NjLmJ@4*KO0d*;T?+3`^r7GqVUhF(Q8R$c z(NVsH1N5r;>~Dv0TAjRHTK8i#X7dvl0J%V2T@!&&9oXW^{mc^S0w7U%uZ<17ob z4N7&lC57ios>E)7B?kxaguF^zmOoRM1W){kK9<#gIV&SBy=jAg!8*kpiv(Y?7T(Gh ziF%#}SC}>w>Ar#G=s(ifLrS{U*o!(;wKUjK;Pz{1J?6&xYXEoB8(5;R&Qni+d8mp9 zErYus#1H*K?K-#N&Cv}b^THUIwF)NCxs~!8opd|f&<$o&T32MOWZQMm(^q9zE3?m4 zJ(A>P0t5Ex_JjzGj;o!I%i{<9e%`+Z!v9n69I$K%C854U%`yL9>fQgDp=?rfcSAA5 z^&!__9Ak`)m6xO_0sRpQLwo@%jt*Jz+m6K-+{W( z7uJ{xMdG7f-1OBH+49qA3>;;lblOrW?7OqsEwVVuNq?n+o)re>=8^zUCYZ@&oizR zYltc10e3CustmQjQM1{qaf#V!d% z)K;C-x0=CB3>O#N5r5m7*AYzV^Q^N$3P`(b-g{2`^LUuhP(Y6?g14z1m^rzLfP_{{ zMFf&%u_?w{BPJ}-UmiT%rew(wru`$>;xP#R>E05tu4_`>h)1D`m)PeagLHF6KJf0Y zy`xt;bt5t!5_URC{W3W&GOeRYS3yMAFnN^+X?cp!m1@Hza&DqqY_iZ`(bh0yqR5)U zYt-RB^fSeP>Kv0e0$`;UgnZ$Ta%8WkeF}9eM#>D|T`S+KAIqpS$ zyo>NgMMS12eM6*PkBlm)61Z-=P7B>I$|8CUem`X>foD<h8k;T8%wb(*w60Q;XVu&b{Hq-U*b zruaw|F;5a%O+m5A=(4C>$l}|kNN+iufm{hH&ZHWXR!WB?n5<@9GrZhgrDuXqX1jsF zl4Hj}+)}@5di{70UQv-9o;=iaTL9Oc_wVmTy5 zc$okk@3uKihcYhQ3y*ISr(+hqAXS@>b|Q(aw(Ps&m@S2#A|k<|Uyf8JH#J<67%3T5 zU>$YkimHeu%_bDDN``oAIPFsC% z#;Hf~;M88uYU4>;VUe;!9QY>}5PUO>x5&-RpT?lJydA_{b21mU$U_|dULBQ#w%p_p z16GbUxqb({U+!*vP#i(I3m(J@CQzK=iJegZ6MjzqlqjG$D4v}9tDqd1K8)Z6b4MB} zh)DNSv`(IzT1?@gw4x-T$5LT09}>ZgRDqUkTGOzSygEwQ8QH!GafMKk=C<*GKKgmp zc1Xc6VUX>2%&mrG`iPn5f(Zaiz~qz&SXtA1A7@-hCXhWW{c7GGa0SC6w~MtaU+V6? z0BU07`TM5kvKlth=#0VwBt~Ak7p!gE`AlF`SwVB!(N+ABnOzV#pw{oQ) z8@Ga=cff^#2kZjRQR=}Pvoc~fd2Qrv(7Pht=G$u#N@jF>YnQaa@##N`ZUXw*7%#A3 zIX{Rj=nB0wj%~Kj1Qob};U!hD)0SY4830md+sQ#~!pe;!fHRns+FNLEk1fb!33SN3 z3rYY&%!K;q?~Zb;fd^vt16-CDF=BPf=)v!IDZGq67=1AIsdF61N$n&btW!+h)gWlr z@PWz(NP_xQs+;1Ut-$m_EZ-2tW#9w#mC2T%gI}$)C>TNqB!XL;@|{z~mwxNLuMEsN z2!JLMbzdl&{=bSVe`OlconocGRA*%#8eORKBVF;4BY0py*nj?nCyc&hpYm$fp}Qm= z5ik`+!7^HmLGyLame`cq{(YlFgzfeI%KvqO8*RjxA-J`HH^0 za4Fb?-k?K*4%4U1DW@hs%fkT4!&)HePdOye&qko2TM6lob@VVz7_+sV@8fUnF)~cv)oP8^rotl(qO_#ue;_vH#JfldespPr!8~R zH0zD6&Z?yW05-rqQ!@e@a9kg1=L&LexpwM_M624ZSvjyG*(?d@X=RmoM*a-uYk2DH zqdR0%JkPi>?HtnUf_-YMfVk1+KCR)6)$~Sz|NIxM<)0a-p(l6XKOo}B_wb(J-$~-i z28LE9|7DH&Z9FUv~6p4Lsk5YkXkJeMf=2S{k2Ox37@u1qE{v2TPQ zes7H6X1kPDc{$ATTo>=oSku9E&J5j;686SAGozhhpn#%y!Q=Ekdrlp`DED_=7^16? z_bR#&BBl3l0*auN2r<%krtxOJwQR^brehZOSwv`8!cp$Cg z*bQTX!>4P0*t8B^Vz&!j@>jCTXlU%Ww-?i-vUJ)*nWkMA{4o8{J*6q3qd821^p@O2 zU~v^^R>qth4PKHL%Mr5Bgw(`liW*h^>~hzs$X{b8lHh{2+u^?1>@L3GgO>wH8jt)~ zqm-du`8<`Pk>yf`MR^Dd{6e&|(q{7(feuvWvYr0$vl_#xQ%=^%<~nnypBslJs|h6NfGkSDk` z>Wv8$Yv3)-ZARly%ciSb^g6*#W3`qZmxDZwP6g%o*Wtw5^v*lxTaDa%R`ww)o7@5C zSP=QcY;IF#F6R27*v%$T15B45yGh;g&$wm0SFG5u8@HQNT|8=TFjgUiqRZ`+l{$*) z(!LiuE$em{7O_bNts%&5iI>GjqyFN`^%bq|nE3_>1rF|&dvIi!WS%ajm#u^a+Itl0 zi#MQBFnMj1U~(+n1CC&H%!hT8^owOe^?DZSedWPw6!eAF%O1hfawCF64>&e%xZP@& zZ98}Th6_wIUAye>f&IjTD4oOfUveF6)b#@|(r4U6c8UBR@-ZVF(cyi}t8n&7S@rBz;q8PTa~qJ7^bQg>{w>GR2817cqQxCV9BL`jhw4H;reBVUK_pf> zsSU!f`Rnm#lFG(4EEPgoW~s#!xFPQkepeL1zq({?ZO@LM=9to_rhy~(%&L93{E z{J>`UfP=@|D4yR{xLNf(kf`38wAQViVqr+qha?RjB z{iIa9$DY)mT8V`bw}z#32cv{9s5jZX*ZXe}=%4eA_6G5*;hXnmB>cZ@I{wG`{%_c~ zNFB;c=>hlaGozW#+q;OA-<-q3PjVpw! zz?reskQpgA-F|dq=3N6W-Q8=t^;=S|?#UFrJp#QWL0_5v6^;RPlf+#S+A%f~uZ3va zu~wL!<^wLA_twbo7T3jVCmLV;nK0$A7^CXJ2;BT<3M17GHD=GS?Q@?k>3cQKpIgt* z=YT-I@ta*a6E`T| zM^xjbwyLb@1)!`o11vB!0kZvAmxMx>KP?5on-iX^phN_3onbbzkj>f4R1ciZ&k1FC zJYt!v?t_Rl%?xYhBAgw!wOx5~gFP43Lw&U}hHm|0`{Z*n(tgwf)c0a4{JON3N>>Ya z<8JhzY7{$}Mmw6^#;qTwi@EblwAF_9Xs&hQ(Y1ddGz!mV^?NTsv4((DH0H%3vUSF} zuv9;m1(U_)F%)&xRM^I#g(mFYf>M^b5hKzZLpk=$o`icvCMZi^1WPj#=@M<$!AyIh zbOQe-{uQ7}BFkPiZRyxrA%8Ld8H)xNKe_PzidH{kc16CGUzNe5%CswzXr)2AP#A!+ zNg4+z!YrlPJJP2|W*w#FS`J4fHyf?jI^#Zd^EGk_Hb){x{mDWXDYTow)J&D9odojn zOOO>URz9f|`JF%meFH;h<9C82Fp|V+>zu6I*^3@JUTUU^jE(>I_pO3dUCq zi;*?Q%4bCIxfaZ~H_T%*XxxQJVfHJu+hzsW!G~1=!P1B`i1vrcNz0W;egFzf6fYZ% z>?<`C2~+CYO@jy9ve7V7e6(kaov?88Q6 z_yXZIEPl017?fV(#%nd?hCtRvq39WuWx9>28xno8I7+io6=h#1C?;YZ%{|r`YKI`G z406&1lSsmf9L=ef@=2GjVQVO=laiqz)GD)Kv=&a#n9I|%>iTbLvjLVURs-MPkeu~G zf1e9gb<70Ri$2}3Bx-2`ROpO;Dpb`WD$2H>l;)d1wCl^>_eMh!ReISKd1osXlM4B0 z@V!*ikZ!CvGx}<4Yu5{FEjC39l))QWQD%iRF^&;P2&T@07(Gn01%(V~aWr>IYtt%& z$%cntbE`2Q5P5XzO#NTw3%7BQ|6o%BW20_HcWL)%22B|@lwC=4KT))TwNS14=?14W zP_D-(WTEOX#WyM1!C8Q_u+xmbOy)5HN;ybb)eM|3kdTZRKG;mKC&$5*`tC`T)p;^T z%%@6z71c4@3>sNDRiNR|28fzaYRL~_ojRMNYL(WC9xI17OBqfdsCyZNRn|_dIfPZouSzyc8dR)Nh3Vwgsy2%nSlX)_{y}je)tWi7PFMvG za<^kAo{$cQY51$f`$lg>TO4K|-=}VP2_r@4)mSj+T<u4Pfo@F_o5eJfzGF~Rk*8qBiQ8}WcP>hV$5}KpDK#{9V1;!jVGb4%vv5=m{ z&QY2;@*RmcXe^t=6tc^qyw_3?jjQY1l4GzoBy-|mruI}#5|tfhs}2^LXlZegc7Lw= zWA7p^E7arDHa}Am)m^0!u}LL{LjdiUcRC}gAezWj=DXz5FXf2Yt|n5oT^afx?PSNR zJp6ZfDGK6NbVIJ7!~AX3B2C}fnmF7O6Eji%nEQ?eeogmBY2f)q;s&^82B~Nq4O{E6Uj}Ln zR%1NXI*0VCg3+)_9G2AjkXGr&_ti)}F*n`wNtu0YsAzTxpPBRN3U+0;=I6N^1tBkP z1$T3~%+-#=$}yQ|hNeOeQBS1Iy1lkju3?h(lSP-!sc0}@zmCV;)9Z(Xkq&PFQ*?v{ zM)X+Zbygkjzo+ax9Q##f%U=4fcM^-o>dky;J9={%+0hhq9P-$mGEQ$@w1u`F3|Cb= z+P%8rFP!Iw>e6j!Ieg=kUMGt}6|vy&4udq*0l7)vIe>B5 z=5N3e!db&HxX9T?5enwFql(m}crA=P@q63;1 zK91}}_-Jp5$^@jrl0Tlv3c={}OSO=xLWg85NHCV70Z<(FIb-}NK3%0k2}gsiG6!-z z7VH=B3TTp*5qtCg_j&X53^>PmV7&BJB9!6JLGZb3I@^O8SGM~yYBIOQ8MyK)1J|JU zJW-#n`*Wp)!zx}-#&xPk6nJ5daHwPr!Y$`0mD@FC^UgsTn)f_Bs`NNoYM-!RPq)nFYI8$$Ag@{f)iP5#POfmC(-1e7pTws2UgDzko< z>`-*6(*%TAgv4B+rlvqaHr)kUb!am2Rf+p?18E*wz?cXP>YEm*eb zJ5qE`)Miq!cD!J*lndNpxs|c+cj{O^+TVvlGQJF3tStj7`ltlXfHT%jurm@<9KNvg z1IjzOJhsu^1`5%03eI8n$rkof;N+#bW8Oi4DsHlPgBU|YN`usaNdZ5GfK2l}Tj5-` z^_&k=95W!E7jceX1}=VzGyUh>k;DQ z6j^0Snzt#{uWkQ~k%S6txvO|92T@svkQ>#AP5L5|6$7zqjLMch1-(1^V>z1cTc1jd zq0Vgu=KJVf#gTpkW(NWfj?ClqgWDN0510WFRZHFtujPGhp`_V+4Hn8Df2CpFi<95$ ze!tHNWs9#jBtwsF+_?C)5YrT+qFlz_M1Sei@SNSFZCae&(Dv_hx~1m~c_6vQ6&zux zvgQc=gff9{ex?O5v$b}O$K;8!t6s#y*+@3+hsaxbl2Fgt6jQl|Qms#!Up*FXUiNW? zaUkzYPyFGLYWuK8#Q{RM{i){7Ce@-Rt*Y~< zHk4FO$kzA8D_YrbCPZsDSFAX8nN?$7YRp|KQRu2oEG(1U;w*>#jnRUjLhB=+V)w53 zdEkr?uLh6YY}1D;00zbYvQ{qP->%4oYpGs`^13VVhz_+QB=qMi=jrwCra2k+>E`{78 z=G&4h;Wa!1kP%^|of~0{CJ-m&VhqMopH1yGsjQU!iGuzPi$?E`;1?l{f-D3JWQrMk z)9CiQH(PnrY)m%S)1Vad)zu%CfZj2^9#OWI?{pFL@7*B$e=DN6+x?e@ z;+ zc4g0E)5BR!!i?ckeR>$KTv91Wm6I|dPna=wiFU|IfGK^_e3b75 z+?X+K#&Q}{r5Lwa@9HpQO(nzSvYc=Bt%RPE8+s+F65 zX;l{6B1-bMv0Kl4?aC)g z6vkY^qneO6na^Qn({0KcXSm9xVx3)ju-Xc1ifzKidd6C%EoDdEw)Fve=A#6&icP~> zdBYN`+V@bSZ53~8%SWN;Be3$^V8A-3xl~C%l3cl7`_4AI)6TZpUQu5Dpj;uSU#rv#Ama- z8k5*J3UO<*G&D-*O`&{UhF}GE7yDtqeiAvOk>kjF;!XRkecyKIxONgg6F5^iqmpCE zyW(y0Ed3(QG?n4S-YAGmXj}&dyJ7qk_KyCT+a)pr0qR4#aKm9De=J(c8#3bafx~Ic zjI%W2D|7;Js=Z@h_W5&s)E)IN#V9u}3#n_W=x?9j47?2QaD6Lkn>M>pbhvtwQ*bB% zNsZ9QpVonDuXp&fS*3_>5D(ylakaGbq)2BdXJ}_o;rHRG!QwgM%3=2rFsUcbD}&W< zL2QG(3^UXaLpJGzb%b>WOaK?Di{>>_7qN?KOvDaymz@hVY(#7p&q2IUZ;Qup9u#aQ znYz@~)-`fg!pAgB)C}ggFA{jS`y{UR5ZZ~e`&nxa0r;+DBe&BAoTI!Q2WhN!(cC(0 zP%IphKyDbsQ_@zE)4z5h2)A}IvzG>evj=-Xc`E}#{%3@ur+4%Mp&qG?+x(s%*A>Xc zcfg`7Sp?a-G?5ymFl3X!v@6I;Q)f^h^`RyQy;HjD*{|5!EpIsE@UCAIG{90FkOh zpCgRkolp}*f_B@*?6w+^F-ol-|EGZDg@)R#au*`_s+ZDU55R>dWa|@gZAWthtE9Cr zo7@OiU}(>07vv8tL}ivCu%roqnqV6bw!>T$`Ttn^5_qV)@Bfh&ijv4uDTVC27ExIv zOLmINU~DnNjJ2pnC?Zm{kRmB5ZBmw0v{EFkQnnT;N>BUxKi8Je%x9LqzyG{m^YeY4 z-!t#`x#ymH?z!ildvC2Ux$b%PY`sxR0==axH;aUMo_t+Fc0Svc{iW*ON0mTln%k3e zTMd@Grk!5-TDxiL!YA8yM3H>tA73dZO8gcuQr0gqjePz#Ep@Y|aAl?dv0y66>1l;S;s@{Z8RY9~GI!g4 z=jV0nuZypnMjoAOyPPJwS20xk)8XqY9%pGqo^@$Ics*&GwYfN!kcr}dUimKMR+2R!)1%!1!mT)JR2_CWj8@1n;FA`+(;wEF}; z`4Y8jfkjnIvBfINh&KuW9~HkU#3_i@zdsZ6N^$+=69T(dOiod@iTNC>WXoU1x6;5o zZt-%HQJIPYmO@Ti7Zpp?b36nj;%lcLtBog2yg0T*LT*_@go9LInAB7Et>fJ1HO?S) z3frv`TDX0^3x7_A@nacFhu5l&$H&@iQ`%aV`KB!BM)aJgrYR3*?c}xiBKYJkwdBPp zM@c2Y*KzX|NKf{4=%#-Q`flvJJbaVN3LhiI(NiOD6E`e*d}~UTvPN_Mr2XDMHQc_o zB(6C0)3+@6oUq1Ok0lQ^8e^^`m$X(JENyJ$|Jk8nKRy3ycd`HLk!ODy8R*NT{Ia2y3hm?yVBV+fS>+asz)!p*_ z=Ng{e$*WqOZsuuBTJF6pD@Je|HEh4NghBS(1)nSDT(>&o{&i-d`)1fEd__DTaeA7n z{i2)GN1Of;(thJR?ZAogQSsJIjV^g#Oww-6FkLVs{qdOE3X|*K7kX@%`CGHN(wOp1 zY=q>pU@vvc1v;l^$8J~uEt-@Tm-H#g$?wVB^&73@Z%vWe$SXfBwZS8_K~AB(K)uQR zx$RcDaOdiPMT-p6($*~bcGz#p!P6PPXu4KO4{~lz-*VC9;rEEB=}%9jR!D6~&gMO$ zp%=LDrha?t`YrlXzey1%5T`ygx+NV&pW=1<05LcIP=jLVKH)cC4jxFbId8MX%11=~ zzO+Tf%ZkM|!WD~*nzM*sr%Z3i-_<5+rjkK3dqD-wMFs*c;T+sXGF zrX8E-5*oC_-DGp@I+aC|TP{Co$Xxt2S|e%Jq;Iw}uH^>i+473+J?!~nwrRK29R90< z)BMkv3!VML^WY2LXQz9Pv85T~@Bim@$F|qvG5@?Xj}oIK-rjUM+$-ak`EaeV%P-ol zVCQK!b0(jNU-_&fPEwXmbhOYXWlx79qi#x6bntgCjGg787!%i5>3ZEw9jRMHc7S4N|DMSWn?4d?l7WU^+$lWl2_oS*3G zH&+$^{-LmcvnDxG{&Hy0lj@muk@HeyCy2VuaQLG;av@1hDV4bFZP<6cu~k&nw{ti8 zTsn96>lat!^p+jGRRSBrj;6Qly}e#S>dBd@fz|D!&L^KZaP4XR$%RxeVn(;}*nsKk z?b4nP)vw#WI6vh-7lNi5Np_VUo&S~O7ok5slKb7G4cdP3dur64@UeUrTpycow{2gm zpCsktf;h^{_Q;;*^i7NYYZLh$JpQ-G16l%Ymlg~JY?j`-IMv4uY=f7N%~Q6+?E`ZJ zCf(81zR^bL_xM2bgv*8|6*R|yTG=BJ2SrQy6nEC%2z-BePil4nJ?)BiXw9?QQhOWkAHoBqF;XV-J+ICUh&ImNnrvO=VcG_R9nqUc_Q4i zW!FUhaM|V^L945HB{btVMaX})J$2=3T52z!r?AwxAHfpGcc=0b?W%Udd60YwRnp4a zFBUY19RAO(zBDR$ou-eMT{H3gj(f+ah5F3>A$PFL^=P+C(IHm}ofE1Lsfk+JasrJ( z*Tti@cS>&BP_r~R-sZ0QH$$?|js;3h-tpRPd56~Q(YdX0rTp;6@)OC*M#uE13$M2L zm*f;RDJ1@g@u5k4ndiQ4{+*&|zWfKtX)enXQYJbSW-L{S^s~+^YU|N7o~2V`Ll#e| z%xf-vbb9@y6#JrHyb-uIp&AkPmsv!OSB&=g0o;!Wl86 zY#*3Nn@G(36sBin@giC4UuiTqy7Y;Gm1)Xqfswza|CDL8Y*?HAETeT6zi&b}{p#n2lc&bCh<#nO zy>9cG;>14$^~LLrI%k+GG##9@vN(K~-&$WEk37AP6Jn(+uK(B|{eHZU=l-^LY6pU! ze#zFpyI|x`Lp~|Kw*2TDBEKzN6b|gURX17adt%0Z-|xYfTu;6>NPY0+z;sEIsRrU- z6g`d)CHzp-yt;Oo{rVSx90I?#a9*U z=iWb>F)y|1j%J*hWTeNeoex6RpK!WKrPSW&YWUV|({LDqnhWVi89Oed@+M^986QMF1V=4$@x(ur%F zCS8gDY_%kIPmJ_)zKbz>=VL}Bjq{J)`u0uO!?E1aYqB63yTISB?#C(yP3*J$;m`fncV*yB62(bpSWt6ox+MqQqiqj6hMuJ!S(|xZZN8^x<)zewwc5AWEGt)c?9o;`a`yDT zyDF~tO)`^~r08VoLuc z2^niIoR=o^l8VH-(|Bi@JaIGEIUEopVI?T5P~lj+g8X%rU1Vv`e?b=%qrz>M-8Zhk z?O&1QBfe0|uV=AX^&9t<`yz?&R31wTZc6o^JViiRGWq-7kK*oyCq@w8cQ(!ckQQV@ zdn58|86nDdQe%=+phw31)sliA1vjqm5t=pMviwIL<>0%Uk5pX(&TlKx{~Fes(w!4M zhCX{6G0RJQeVV7tiJ7s%AKQ2C_Qn8`vqCEpUXn7 zzDe!k`@QA2Pp1oi?eCU5rS0RC_UMOnw1kDckQ#P!KjnbG$LjD?TkjK8 z?Y$2c_t4+1rnc<}GO5~a{O#bm6ms$;-sGRc)|HFby;b;mQCnf$yc(0)JMW%vjn5tb zpZ54-$rF*18)Eq%&U>w=eMe%-=k6TJ=4Zhzac`%lcfQ*n)>@#O`8v$b#Eq7_`in8` zv}p2cdcNR}Z50M0{4ak+jN9K9s91HTSU3F4{*e70)0$QvcxUqQ55xTmBCd1CPlG5_ z93l;tSLO_OufeN923%NLxiwT7#cw!gWmJ27@$x<5cSot2ndN!7yDv5{Gq&7vInOER zxtm$mD$`Y4>0?@Rgsc^%MP_;>TweJ7_*M(HFqGf&AAiDKrPwy63<)oB{MJ0oG=?7VhsWUgBbU9Bp%K=ake6v3Jh z6( zPW~<{S9kW5Pw%>~VQ1@}fqEDj_bP$ZDtv;1-d7Z?hP zwzkAo=|C}&9-L`boM<&oW5kQ z>oHpQaKo=(*Y^{O+I;vE)Wu&`bzZKBjZ^PBDPA?@yjuJrb-`MXPcxF{95Ztf>`T;*K{HHIvEm|X)v0eM)qg8Ls z5*L^0)k@hM-9mqRVehSOpEMEK5g~3TRgwwGmUrh^2`5=i5s~PL&|KqMqTp^++vII3 zIzgcKQeuare)f#!rm3^N=kA<&X}-<^Cus+ggv_se!Q?ju&0cb6k9N(ePq0&n^XODo zN&ofMw$x2cblQm(JIB3wqW3y&{n4LFS1(!1?wqla-qy8GyrDwL&|yWX)MTR{wssch z-h`?gw~deASx)aZkKfb&^4`Mg-5(ykIy3&(kE@f#K7}>To=P`Z-z%1NKV)lWuE5wT z(ZsV;KkQ5!U!znJ@W?xD(u5BuYhU?FiZ0X=_}V^y)Z6c^*%g|q?WN)&@s;-Ve$u-$ z8n!N!Fxpac<5KGOtJ?%7eH2u16mna3IKb+#jKxW>M~@Cw7cO=2s<@P$6dk45p%tZi zEBdl}M3djk$Em%tm1(_a-G2&JruR;(+!Z`ZL*k&v?rRf5bVu`-CrSK-8{^g=?eQ>| zQcU>nAe7+rhk9Y(lH4Z4o2pOj#KC2x(6u*moY^m!vSgW5k(bIYo%=TsD$yj--@ zy!DOw)|<3LyJmYBFCfboG`TKoR`1LlTTpP%wrcdIPi}X+gpS`i>^T1W+y&Eb^0dT< z845**EP9u7k@xAx!ik4n~(>;4qJOOdhLG}kX6^vaTnm(}Z}O-DbgB6J(C6c;e$$rAlEN^_=DwYYTPsWQvL z6=`|2hqHoGvSS@qe+)Nk(5t&MHFvdI0^2 zk9@+L{eI&U{X6-dtuLv^z9gP(8t3ACG%e))2j7CF)T+%g)s8b)cMwjjz4U9m`mYbZ z`o@{71)5S$%@Q$kAM0}j-VlrmIM{L~`04iO&7aAwE9)Oj+G{d-=JUmy7f-J{sHJGL zW~^0k@`j#9sTZN0iyF1C~U zF&oz5Ze^<#Tu=VTHDr~xNor_ zOxCAc#Lr~1!5fOWx96UiPRI{^kKR|>`Fv|{jOH%2wV8+2-rj$@)~~0@ z>DB9}M{SFoKYY%u&J_5qVEsW|aMsVG$^Lgv-4H63voR8|knHiaGgAAm{gEc#s(ypG z#VEE~eY5;`aq>#?-kkZXmCNs0EKy!hJn(5>%)S${f4g$w;%B>yD6v^Q&R3Awq*`pCXgb^5woYafdnlk!^+PM?vo zOd#vhhL8KZHH9le^@Oq&31V*G)5R6NfS~r^u29ZJT|yi z&Dds3svSEEOyk_one4kAF>>;k%p48yH`p zeTTeTdPSE^?pbn&_}k8(mX4AmL%xraEWSA|xQmHq(l?`5`djqRMU(P40V+=^QjAs5i4 zwx*-^;N4^!eMHi9G*7DH@H=l!M=uwdHp=9i?6;fW=Buj&Bnc!5ST4SGi!dTdKzVUm z0$r3LS(>O7{cAUbsgog0W%+pWfb@SOr?~BpmsZ;d#sAsyz_jtm*&d7IO2uPMZQkd$ zC)?QMu9E-sU0eUkPGy~BlNNIWgNYa3^F+x9Td#0V6xN*o$LnS0i;7D9i-bp4PLCF~ zk2WLfCQCfe+mkML!o&J%MdGN@_b1(!J2%ScS@DSa_eFbO6%p?zn~EFLMbBSTm=Jya zoP|I^;Pvp_Y4LGYi%wk~Yeb!UWMbHzkf`8@Hb;|)szTMs)86jE=cC>)`(aQ)$|_gmd|&=u(zfzF4MNX-oo8LBKd^n_*WGLKY_#80Tov5) zqa=80TsN_}qjhGn@#F3HwOYm=yXij7Pr0jeQ@)4!lF8M&rs_vM1v&(1e{{^RoJd=8 zzwG49_&pa-w?FV(Q@TiOYh;;~Xz_@(qK~DXhNRW`b$b0UPrrHMjvf{ zUM4)|k-1T18*fnhMqEbc!8X&;MvJ4;984z&J|&W`t%71-J!@VRZ*{dYJl0+!L(I>g8hQ8Ks-;hbcFmc!XYZO*sqXW8uDjoQC!ccC_Dplp z;|rgP0vpRTH>=DSg3R~y8<&6keX?2OEXHr@yf)i+v)jdD{%?z>MjJ>@>wY%!XpYr~ zZ~Pmc2@8jwJE0PpH)8Ya6LMiOaWcZY#~Nmw{C$G5zWJQQ{9>>ASCsBO=^fQ6qu*@# zK;hw=Z#kpxajR;K`9cvss->pg%Y{|*v(@xsq^kCaTsPjbx1xNjU(w`eht)SNpKbTh_({C_!D_oBrsyeq3`n(B42<1ZN9wVrmUp^_>;vW1jHqF(`6>{jvI0&1OgHnBpv#|gY3gH zcK%)-o(yZZ-I;%c9)fj#1?!x`{2v=r{lZ8C78z*w1h!^`^q=I1wvS$6XILA(HFj^z z$?2`fMb+G7WX6e>)@WsZ5}tGVA@Rca=Vw}Z`Zi`ZO)$8n%d_Ihi%$`Cx3aXdd%x^o zeUT?3c7gPRQ%^6GK0Y}w>@lXCr)c!~YbV#|C5NR*IE@)&6#rm{roBLB!kjMB%A}q8 z6AxykuCjwLDDM8V)iEkxoSX#~Bq(n^zuWoUhlsRfub=n2_MF}<&~|2moz*^7E74Y6 zqaS83EiS05tWmm8>rR+6S+v3Uma!O56Aw8gc+xrX^)iQU6id+dY(3h3!d%fmZ>E~4 z%GfWn)*BuVD$~+AyL9Yf%@hUly>;0-<`$!)?l)ar7t2{|N1CRK7?sRaJeXBP%sC?Wu{rKOd zo4g+V+FE<_u}w?8^5^Xz9Y6Rq3%CkqkJH-LIA3Swoy7D{qs%8YkfH+41{a)JDpFk7 zO>>WT@4Ar1_hZv@kwdd0q9W9z-K(cP9v?a3rl;4#o@kyQk7AA1#(UAD zi`6fUz7Q&A?xmJ`!R)Zf4Y`JZ2BP5or}?8hqpFrtK54DU-nK8dd|AN+zS4U)KCWl* zRvk*do2P<3+<`B49_=$8d$=`~6k2EzMc$tW~1bJF>3%wUH905w|JcN>{?>r5pE1r3h83y!XR4>RPe zd@OM*JR*8xONNt+TExLEGpT-d^gKa5%B~z`a(LHUhql}M^AfJLZt8tJoupU3(t1jovDcsVCLGS}-4;pNlicnn zLbKKL?4-qg+gm7G?O@oW<)*qfH~-=1r*lgx%N;e~(yE2^cNVOfpRw0-UZz5iBt`J) zoUEgjPLE&Y*DMQAH=cZDvX8j@it(!h?wdJY{uB%SX2p=Ci@vLX5K*!;` z|1;Cu9T;_d2PYVae)pmi>ynYd@mD;J@MJX z?ZvoBR?{sy$CU(?ip{293yUqBdhl9G+UNrU31z8A_o(qI*?5QUvgdRDz4-cp$GQIV zNrl%;Hcb`Yx=!wdlEpl-NWDb6Y+;x9QR#%p=n_4xM(K*u4K-)n+I`3TrrK++vBIVNOmM&SHd#Z8llhaFo^_UZn>&z9{Wqskh_T{J()+$-yyaiWZ3+nFY zSM@SlUb6m3PE&nY)`@M`c;c%ag%nG#AL=cNbQkYBu#9BAwoS6aIWv3A_stK-tXSu} zXrsZ3&7BSh&gngWeR}n!)1~kDqD{Zf;x`n}KRcbc;@vF6i{mAwW|$n_o)3@7D!0Bf z4cgW!zs_yOx(OxL+WH@@e9r6_s!O((no$+BF`IAU!ChV#rmvXF4-XFC`LOVJNaLBf z{rMNSt{>r-)SgD!ca7xM>uJ%Ucys1XMPJhSZ5q?RjqZLOKdSfG4pqYzmpS3DKXw>CC$QMEL;cZg22C0EZ7h;N}KuACw5xH|u-yZ)tT(>5QniP7Q} zy%4?2p-Hm+BM*ONebvQ@vs;(7ym8y$H$ML7^(Q%gh5i+B)17BUp3o3}ShAkd^fJO% zIVeuM&O*iH&w{wHP@6j`*G^1~p-pQ&bl~~LbH=h^uKw{?gf{GmKieqrNhYY{;LGI` z#jbsxMo!qdwr!o@E|;_3%u#4$KNzD$n#D75~6+V@)Z&O zn>QUUOF5^uFaP0dv-@*_WzFZqt7|;$3g#@9kD<&~ExMU9dZl9J>Yh)ca{rCoRd4qc z{6EhK5nkBcgN^ulhVX%(06TwuA0a}w0s0?9O8Q+xfVgAur+fsY(TRCe3|&B*+r|+H zBK^PX`@eZ~^!CQkPpu5B%}q`09aODM{~{3j5QhDTAUyOBi2N+z4k6G;)G$9!5)FbG ztOV||$~>9yyHfbV)n-GVJo<~_zlUC4w%X9#n(^l~g0>9-@S`p8#s2&RC}N1d@8|Y* zMvOmq&f**C<3b=`10VDYpMhWWzq>O0cWB{0_+O&GfTKMT<2cAEsaL{w>wElzRgTKzBmofg-z=IY-g{Z|glr$K(Frv9W_%JOD z)Gq~HHFXdQ{^rpa!U6#EaEzfJ*~^I-5IRsy&4~2q&^Kv59s=Pzd{Hg-;3tpX6U2aI zMD+9}8F&$c;GA`TIK>D?Fe-_^1qcZMhEfBApFFx2l?@msL}SF%l2=>V4nX06iGsYr zPafTf#)L`sBn9-T&4EZ;gD>Mt8^Pv8!1@I0L%VE)pFBD#ggqWgX2@vBXyD_@hLTk1 z5G>JQILHrz!rwgl+%Rr%@liYUd$*K;H<$M~;(`Urn930*`14hae zSmI%uTy%mFFTf9;M6jWff{0X-7n|{7lj#+%32ICN8L{I*A8fBHOviIb8c?ng!nh> z$0+BW6`FdsAR`s*1!X7(KY8>~j~P%cVa_DeNbu~1x1Ucal|`2zZ@$I<(HHB@1j6xF zp1v*Jzo3~-jGz=xVu0UTl2>2y$_i8psSuiK5S0S!mk>V^jZt7P?J*&XKwwia9_c|~ z_?t)9@!-Ka+5t37=^rE9s4*=oRlsM@hJHsGjKNPH{fs9*91G+5m43Uo0KAPmcpI$S zmhfW)LQjYp^$%qHzHUwwJhufJc@KI8JA(fN;et`fWRfTAF#@jwzR&?IR8EVv?CVrK zJhacl%B^PYE0k}TOdu@LU>tArLRn$qw^Hm%R7w-L(YFwG%otQW{LP~qCE+1OupDtH z6iAmg{drZEKsW#)6n1>LrZb>fgYAZq26}+C??b4|j~*aghHj-nK&Ot8(YqWMwa@1n zgoIH2JVHZAG&I@cdsc-0#Nyts0Emzl!sUW!O+Wa_qlZ?rMjr|w@VW@WiaU~dHOCVO zQD8gRK`noS3s~mfLZIhG)m*1SthCUSaTeJBfITRF`%w(`z^^gb`G2^W z0~UbSaD-QTnEyv4bkq1yMvHR&!VV9=#j$6*l#`)%LSXL01}4JtBe1Tk5*lRF}O+>n;d>N`MSv`zwx82aSV-)J-9LgzaWsXnBEM<9pm z0`=I<#M3u(K*ZHx1v7?#kSfK ztEXS_1UVppXP9sjR^lNIe@K=QtNTyp0Vn8G3Un&gNyx9l#|jChlK++}497#m&(Ve? zb5@Q(*tCMtkyW}g;Mqf_0IslNAI>7oWY73jwO}C@;C1I>`r+JW&X^7)T8Jl+Mp{B5 zlOV1d+{7C$c;8rALhkSd5_CP$3=GM`ZMY;(Br59&_5F&6mCpcWF_@$p1}!?B39T>E zl^O89CSefcTl&%9^)puM&M8uVRy0F@bwW^%5(|T$Jo*v1JPb3e*-q*Kg!HRl;KyjK zi49yTG8u9FU^Pf$vE)EeskQo+yA?<#NDa*z6bSz2(cfh;U^xWPhQb2Yp=f!dlJ8ys zxCLMApnjXf2uLN8X^=sH^+KQa%!p*K06gU(V+t{9vfK`sr{Ie<__|yM+<{$vR-FN| z0Up2%eNd{h|AUew`wueU5xwBy7)+`J0qnZcNbiIY#Q}be4O8ym1N4s@n7Klzuy|u` zC$n4-P!5yp&v6F1V382u0sEv(qA9)=xC5S!APDp6oIwcq3+}my6^5yw7sVhn#1}o@ z=h?T6F&cnpcHXG@t=lYGFiT85nB3YM)A zh1Xu2X8_1bpd4jj8T{nYV^6a}cZ38VnHWf7r4HsDVr-UmLNOyUtQDEMO!cvfwj|6~ z_M&jh+MrnQH;=vu_xFR@H=F)7VWct1+mGyrzu4*PE=kJ-F~}hY!g>zt*b2(=YVnb^|xPcPm*gR3=4JniW5|PXvR4uFha6R;s5IA=O zj7DzU-~#loLSzgA0x03=vdg{%BTh(z6tv;+s5N_lssz?F8W_6Iwf{tiuOgql#L6sy zeG6X*B!)hD^k;YR;Qt1=16qPrzXS4@-V|yeGX>fUJ>cGPG#`Ll;EU~r+l}lg9I22o z#0OOs-gXm}QGI}(m^UOfvdi$ROk9>7kNyW1EqoTGZM+Xq*7gAy6W000HvKybKF4>{sR}z`G%tYM z9(Izw{gg8YeiVpIXkX(By^I+Ig3&U@r9#1Lj=1=uPBFc;mJaF=fw>5qD~K7(%gKP? zjs@_(GB!j%oK!v%m^Xg?@n%?oTm?;|4Y9#b9^F=uOLS(jQCL~n-nkd8=E~uVohicP z@PJXi(gUJZuzEDZ6a8?bKqT_AYy0A(ClCndAs>V7JNwzV$RuxKXaJ;-`;vc=5P~sF z+=n~mzuXOA-4fu0Wd`*CfAi?#bMbIZ$f1FQp!kUQzAVyBhB-+MA{)=M@%7J|%Ps?RT> z_|VCZ6wWLlf-DiH?z05ApCBaGo7Pz3L83f|4_X%WcN0G7#=YaNMZ-YIffWFDl5w@= z0+gLnk<9-|rfqWunR`HHtO?9^#)G${kbT$-e1C-J_HiJvy#S*LTyo`v$VuANi7KHy zAT0%?#SR29A|AFCDG(~8>>)4CUS__99k(w5?&Puk50ea9S03G+#2qd>$&v9s(dW}a zDWqN)YFNps{&)<7@^ZrM8Ch|13z#vA+qDP9hQE3AtN`wCX)-8=w<3A^G8-V0eDeuH zwl^@m1N~r^%0JAnmt-khn zTUHdb`Z5>;cGj$6iD63g3!p%n60;t`SL!1}k^8MM_7q@J#`?tc*Q`Vwgf}MB?5SZ~ zkQ|Q@{`Mbe_%sx8VO@L8J60r?6rz_QF#u)bxnOXVEuA|O7!oEjx~mD_xM1MACBB+Z zVw<5ienM|x*EefmHfN5tP>xH;-fT#91mb41*@%0-hbu5 z@ATsxLL*wC730D3^)Mr8ybu=*IND;>mSnfDoB1FVNry-mJB^qL|8GqAE!q_xV1N$A zltRB?GdxG8vf{A^?-0O^aosnzAM+AAL<%|t>mppi5SA7mIJ|O7C+8i0v5RxzSvBlj}Ci5Jp)2v`+;f*%TPA>cmMo3ln2;d@WqP% zn-e}Iz{@nWZ}TJww-g15pSs4%ngY;h@r<>U-Z|{W_YMsRFeZ6~`mhncc-_m9D70Jv zv+8_c82seXi{`RN4PNG}Gzgc8c?yP9$-oC${yu#MCQ=02sfYa-tkt7Qc$(kc zkFW(s_yaQ~c8oT%K{22~{ssY}2@~p>2JsokC|}<(t3;{UqBB9|_rVunXX1**tR*#C z3S%lTlsquO&^VBcGEScD0}V-ohL{d&1OCG1h%tMT!IA@066}mqN!FAQgD_|o$}F?t zM3JZTWV2=6(6D6K+L!dcQ8{&XwJeRP}CGn3wE%}pp2|< ziwBxu9~u-yp@wkmo7RNuGf)-5Ef{&&A<+YA63h%h8ti47n$c1l*q|bXI8Z2tem)$U zLwD7rH9>PKKvP)Pv1b`O3I|y9P(njEpf`P4NL&sLsD}n%m37&c4SE2DM)F!lHi-!G zgW^paB8?VKp>i_hEr*VUn*i4~CN~x4z=mrmG%}|d_3?6O(p@XxIgX$(aiGHXi7=#r zSoH~7TEnCa!7*~>94M#>`<`wEiV~o}MipgnPcAzOI}(wTnm*ARJe#1iEg%Dgl|O9- zdvFJ8D7k-^l7swzK5EOwz|c4dUu;>?#Z_!5K=uGQmp5QpcCcTIHd?KS)HTfew*9_q z&wTf9b+CfiF2k59+q;@I(UA0Pi_1+$K31xQ20-y8Lr72@$OZPW5-fbbn;_IaFAm&c zI#Z!WJ^A18p?uJf%uIrOpxMqWCsD8>nB5rS;DQj=B>(1XkyFeZdEtOL@ZQJ%KP!};b3(+0>G@rJ~nLr?YXB;4vP;kX+fb{Kz_f_{=hX#7U zNW=#}JT?C6a_DqkXb(06zpa5act7N_(2!-`c0{rdPI?OoKF{WD+#A4#!~sJnrPat9 zduZzDFB0QCr|(eO*E4mmM{Qg$zV#9xg(<{W+qz97f!LByeKtHm@=_@^BGXXI#QLxoB>$@4G z9Jp}d?-@m8;I9bHjbxB+BuM8rtjVw}#QnX22b7vo$fRNZ-UwBsga$eIf;oE0{Ow26 zzS4!Yu(Rh2hh!*$b|h~Sl>|#jd@FrwmZ-2DvOOQf7>8QMd%Tu#l7yKBoeIsel2b?p z7BaB>O=h6LKl%qAi(vr8gBb~FF0J9Yt1W2l9VBB=Jfg>Fa!xp-fYSF&+M1fD0aGP$YcpQyI;pFoi)iDZ}o+ z{wzFDRKkVa0V-`Kp~1r{XJ_{KW>xesyDtsMQYh5Mkg^h zmMd76Cj=0Byw}W7bdQEBbPRUxjXH>n-goQ{DFOCh!~DEhMeZAU&h5;Dh4}&SJjxjL zx8`w&Yj4A>52WTX39^(`kjt|vV~h>!jJR3Vbrb$2Y~efk)QCv zS^0oV4SOqKdLy9vKe>V(W>@B{;f2i-Pw?M3I56LYo>YeFapt7iG<4ciF4F*|JHVccIJ&Oxe7By@ywgysi z02S3O10&yKjz$M!lWV za;T6c%mfl_%Hxza7bMoC5Xf*1ran-`Ki)V&?oCJSU|t~^3T=dV7dbmTo%rSJOZhXQiHtA#9G|G%C zj{X9O{#=dufF|+PcU3#({TrZK4q*m%R=u>8JF31~EL1ecp2+yr(Lia?Sp$>djkM;9 z$N||lN5lJ6MtJKBYIBF6A6sS+Wyd`Y>#pgptG#d%#%L`RJYho}Z5QtF;kpH563vt9 zht7^OcM6IY#LV~6GWHS(-6=c_QQCY@Zb+C>(cG&h{NXwjxD!gDtFc30^fx!CjxbuZ|xp7Ek3a3}S zZh%&4Wi$4R(y0G|m6-%-aDKbPgsb4y;4liq302!gxFo~wL>*oRim;~Gol#f=VcS^P zIL9s@?F{g+OlY3OAXFj_mzmM<3KK6&&J&Rl@9I+=~2Z}#q2 z4~A~t1Klb!1l(7|?Scp0?+r+hSo6fW3ko6n8u5C%!%(e+?KwFN;xacp#HDa2?cW3@ zeh)Q{IK2w)6CuDU83qOXM`VS`MPdSp>s;a?(+Og(0C;SN)p)Xo=5V@2PI`{v4)BP- zAWXr=!(Y6(0L8!Sr%&3(^ldy~rawRtvKZwy2C@R?keP|Nw=M_mm(KwIp@V@G3&Ml! zKNdT*`ELWKBT*DuY@MZ)i}du3s%Q7Xe=q%fg)8rP%km{2dixb zJHzfaE;_^oD9bHuB=F=j6O$hRwggNESnN;7SYr3(Oi3^;v%UlhVT)61zbZq>eGSHprBd^ zR;y_Ly^cJiLGlpj&RH01d3KEh1+&aZ9pN7N_jSOUV?b`KyO3>W4M+?l1yNuN2p_Y8 z_=mb1RvyLR(ZCN6ee&qpEi5rz4A^-gBje2BS&<7q_K6KF%dNEjt2k5NmcJ|pVIhe^n1Mmv{FODTpBKJHCq&+hvH%ac5#+>P z7Zdpt56v1Xf>`X~To%tQ2nCp3&|K`;`tu7HibA#{`Jk&R(CL8w+bZ!A9H@s@>$p8j zg%HsO@~q03MqeWE;{++zIM~bzKtt<}|E5@JklGk#Hf-PT6~IFtat5rgYeBHV0gD$q z04yrE!xk)!n7|b*yBuzWOYf!0P~>xOCZnf0IFV~`e0A_+C;oR_^;aRkLzv2yrZt;@fYy7Mk@&l+My9<<{T2VO?qGw<-jKG47i)gg>% z#sg%&a|MZY})+!RBqQAu;)KIvdms5FY`MJ*E+-X%zfLf!|bh3 zi+$IC^k17aSeVKtazVo;aIWELFHod7C=#2B^L@{e5w7J#@z&ppTgFk;U;lbZC%*!& zJS3pk7_e?|#(x|*pz^Ely-?&5@xfP`h-h2{a47&cz^KgV69@32g2jKRb#H4|&J_WD zl`+`?@e2pKe<*jqec|#NQOJ;8h0qGSq^6Zz0myNN7SF-88*VA1)F+P z7&(@`fg#`__r~HrWoCyCtCxWf@|tVM;*t0gna*`a7xapZhF;|dRVxl6z~4OjaaIrm z#~~qM3l%&*I0uK3xsMz7JF6Soe;T$QuwMAbI2NKA!ew)i)Cq#r83~PIu6SZqU)+HM z?F2|Q609)tFBWFOGk9+FuNQ_yRYauB;J-(yo4#r}Z=xs4VMVZLVzoK{&O@MfRTyg6 z?CmtT_JG-kfc6I|7^v|FT&w52?x)bCSZaWl zsb#N0bxR;5!)|>Tsc`1-f{PBIsxvUq5AFqll}!H?qxh}y&k1$?46Q*I8Nn)h=#xi} z*WrTcug37DE%uSfS&cD`)Nl;sJ=UH-#q(0~ij0PK;%Gv8Rj!&3`ha3S75j6LS_>ri4l@Imob4q+V5 zj1Q??l289B&tZWV^OHcc2BG?%qIt>@%Tp^zeHdVWYBZ{?X_qzVc`pnwtRkd9^~~YO zaN+s@8MZ*s-M`FX19RZ{_e}w$h#R9>aScQV*kcXID~zVCk??}3;0QQRqajV8se9BI zj$nW18%sZLl4qo60EuHLvR+fe36A^{mOzHU5JOnQ$C0pq+Yw6g>^+H4BTF5|hL^uZ z4czgmZEHI8%u1NE7i0K>1phC5_)hkP&<3e3FhK;tRsojHa}r0k{+uIPw1?7+{k*-0 zwGN-{^;D%pjnKBa&^D|t&8Kj|)^~j~98jlt`t>Em*zhr1-sB-&BFl@C#^du3jKGW( z)E|+*wKvZOnMZ@m&>zA;26vJr#xP&;*W~)OYgWnyInO+-vz#D#q=l~l=jZt95H|$~<&JD_&Vn#%_&X+)dfKAVss{bPaZZnvB zSz@S%P%rP-!efD}&>#S1>gYz}wBGCRa~-A?)B|=feWkrnVudhapbwVu;A{MVm{I~d z|Bn*y*oAJdHXBh{aIoGZ|3G~ovIK_pD;U<;+)lw9HatVEV7W7lMnuPrykD2VBmMx7 zh~2%?U&swOyG;c7pY~o0U7-j`f`?)E%G`)sY<$%pFM1;(18Sdy{Lhe;pmE%g%@s0Q zv%;mg(80bGFBTPNbuqvdyxJqNRRagw6ko`hf;w<=EF+-D$+CE=avM*;abM%POR*o2pHvOb_B3^ z8~7kcuyl+7PEZpX;>Ub<8A)(kO9Cii3|Kcd$F+eq2-?0e4D|u$2sd+Z77j+`FyU+j z7=#O;_+Y#fI?nl|tHy3QOq<_fH6%ayYxtW--+=dXBoG)A)z6b=2A2Rahi3gb;Oa-e zioU@N@C#;unHW^5DL6tc^;)B$ZAtOLJ&1#(T=IL$TVwEV=q`Imk`8_H=*}~7@BoTY zS^aWt%A6(d1Os(CBm||0P*7_dXW`?p^;oMve<{j>K80D7VOaVq;KTXA&KsPCV#Re(#li2-7qQmjuFd|t;DsZ?IG8$RFs;9!jsu60lUbjr zU-o*@l)eEHx=dRMgLqw&6C&GfN5y9;W`&^DhpJPGDYyMeZ``PbtUll!XKpS>&qd7xD@{AWNWVm7praRDh|NAIj zGH__3?+HlwSKiDDLLEF$V{FfRn8udPVBAW*>CH8bi;nty*xjVT`=Nb@LRnUOAjT&F zH+^Qxf$M`*E>>kz!nkE*ZVT!R|5Hw{B4AeO0k4k@vNvb3LNPzSXEGj*Z6Drze!&k(NCF!2k zfSL)Yu%j{bfhQ-9a)U|>AqL`{8b$&KmJ0321i+Kr+Z#_`t2-3=`}@*wn=2(}t#l0Xf;5`14Qz zm4vB~LEd5xz^rOmk-Yo%)XaSd=5+;Z7Yn=UJO@~NsD)w`Pg2$<-dzKh5C$QEAx67V z<*Z<>;i(=k8^0h@zXKl#rd|07@jzK4M)I)q>f zVISKOinx!3j?N|mH!pB6!*EZ%@_*!po1oa-&Vk5{rs}*C0N3yuh8%XH>ALoBI1@wQ zkPglcH4^*WbcHSGH62$NirDx;>nE~*Y*y0;azE>gEobY)jI<6aL9pm%FIb@?JOf{DVjnA^ zdwjK^3iLoWc5-TjTaWN3)BfBO%SW=&gJGjqOjwx&um|Cb?a3GK*~9kVlf=sDP#aGF zatB|D7B1MHEbV2FOCyD#qF>KYD!QPGg`xC*En6A~@aF*@E4J?^&hV^<ldUFj6l!@0IfRMc=($~kNv|H?6Po{Pe!f2-m-8HIM*>SMi|@>k01*R zwkLrduyhxxW9!n!fVAk*HLSEfurq}}Ci?g1jEF%*4?lR!4IZS!SFrf)-GwILG|TxJ z$D08kdu*1ko+1TzOJ1?~4hmfi3bw;2__hF7uzlsgL(5AlJlu+Q`Ug1s|DSNhn-8mI zSzmd^y9l_?LenfT{By_ukNkZ*ki(eq^?B1Vai1XclP{1vV2E3U{y!1Z1}9#82_Cm> z$}RwQbP^7`@wQ6%e~|#6C3xnaR(R`@;KdXqt`ud-0*7Wv!wSFfkqPcUtG?NfvBtV5b;iIhF(iSxheA4JVFTgx+gO1KnW#wwwkl_`at( zjY*#H8WW3P-06z8g(0A#JG`-|otkV>O~@=z(JX%N&-5S1VNl(L?<~yV3eskUI`Fd}V?U&tt4iM6!wjg%U>I(77Dp`vVVr;Omka zlpO&23)G7RPMyaQ*coOTynaL0T<)B|G6N*N3SaEt3(#c=+=s_vZN{82huwmK589nG zU%(2Mxdgp&N7V&1W1~yqv61HnHYkIcZHO^gItbKs)8M;{K0{%tBp8C`pos7{kIuJ{ zwTy%4eM5q!@gn?$8?zrd!8mqe#Vi5k?*S5Q$L?CongAU^=8P?nc*v^|u!TWC*ve7GXg1h=cM1L7S71A^goGm3 zOGE#@g9#m5i7vm9dy0O`XVt|zoe$1uKnUvtlO#6zvv1SCa^QDD&8C`T6URZlun1!> z$0f64=zo5Z#5wDK`g+sssW5z}2{AU|)oyMG`g2+AGPJd~s#Z3Ek~}0CBSXg=)(m~G z{1}FM!%fO)W4!N$5O!`zwy~@HD|B@@6wP7d&$z;WV`0~pBT_H{gWbLX!@_oW<0&>Q zq5Va+!^Z_HlQOt{>98fZyZrHt^Fc`QzcJt&)H3^1=@wv6|G|Wa9eG0Ktnr7XriV8I zpJJ4}vEBhtQUN#)tY<2^#*P9uWym4J;aTY@T%*z)5)lMC)b?WIr~Nnoi2z@IH*0^X zgCKu7$d65lc06DW-*@#H+6O}!S8iHy_5@Me0LH}u*v!Y4hdq7#KhWT}WtOe;>21&! zIep+ZWd| zE6)T&8{UBz#G35>_y0(N--ZXLPZz0y{F8tLdytLzl{JACiHgdC828iJ&U-r^+hi$% z12KiL1H0SN^@9x)Iv~Z_%cfON4ux%hLXb3LR}e>xXOR;ks`XXw_lJ~y2E}p>hr*^? zf`pe=U`l?9j9oE#0tX5QQbfQ1U`z1vXz4CDSva}7f^lP@cm`_%YpDMYBcYd*(bk(ir&En2*l#DVEGl?;R?hb{(w%KWiPJz)pTV(UEi65V6Mp|#XIEfQCzlirk4qCYAUeeQL;{UFbQ@x1 z0K89&H;p6l-=2wWp-&ThM(ns!Y^t8rp* zgtB>@og^f9;g}y0C`&OFi~~Db=4rBlg`&9Ou`RyH(K*W1@LVsU3_Kv#f7fcW!$z;Q z4M%6C^oaYnpO%BtsZ0@q_56Rq$CsWUHfrSI0fl1=Ae;?Yqc8LJhJ@e0tYbV4M+aSp zflvuYPO&R*Cpb95YG|_N!Ea5&!u?Ot8*#l%gMensiG}M`z?Nlky3p4Ira>SMZ||^g z2_px7D{SlCWu`zYwm~bDhlT*k_U5^-tEgh5bXNCgYW*j4ejyJJ-Bj@4ar)wR}IyIs4x(f_#& zj=taAuZEp-IPUq+`Jd2E?9gEH1nJd?`=|8IPwC06=0*mF4Y(6==G+rFLZhuI;AzzYn?c{@m@~( z^-yci^F?YxF3FHQMgL!tGIXhK)2+UJnooqa3_=X5N3139US4CY_i(5x0>0IFM5S-|A9wt9#z?{ook=W!-ibW0Vgf=>LtH>Wi;lwMR1xsU|2+L! zT^2#NL;f_fJ((#Bk8V~}%#WTWHi?2-=N|7+)(oj2Oz#ipsAu8NSjqD>LASPc}Cxzc}Qz5+6 z=m*yLy(v4IV(!Lqcg5jZ&50NK*fpGrin-D*-Aj&yo)6j!^$`0&JqzCvW{$W&n{{)C zLRhp)_jxbP!3sJhj(q6Gxhv>`S?xhEq9t#&PwE)>Ggwgd_PnK-fq8FzR^B3_C01AV z4yT%$v|;Wgu4zaN6H$}W-ukox7SIUiVt%}!iYYy_;{}s##Yr@zg-E`-Wp&)wL!CAj zM@p`ZliHx2Wxjg-=!(l)k`woRxe zCO{J(X`HX|dp)sPf8D=%WLdbt5;!rX_iO%N(sSBN%)oN=tKd8h)P=AK7*1w?$@Raa zrv}khi_=Td5%EzX%lO|fZ?d(9DRizW{Iunb*MB%FzCkqJ*-iff;@FBaGM+>viJdJZ z_X~-Ta=C@QulHUJ8%Rgl;ZGR<3RTR=?&v^%4G7oN{q`1mrsXl&qtPYyto!ZvfA&9t zT>Hvac!A!nK3Qky%ebNaShrRvAx>hIN8?)Yc*UH?E1>WSa~z#8pYpe=C(pTnaw;gj ziIDdstD`hF36*eusNl5eDn$Dh;oF07b{VFQ(=Req3E`G2PfFThg6S27*WS)ZRZPfC z$fbcaoq5iqH*49<5vPme-+$wq>&2)gXl$}u#A)f;ULNe*5jf)+5$;ib7VZvx{#s== z@Yy%0vHBI={oTg^%HO%@EP(N`28zS!mO+A)9!Q#5mCxp&DFFoNx>x%8LS- zviy5c9ShrqhzQ}&C22$7{cIsI*irb3T(0A4S>o{6I#L9mX!_(N9s8p54)j55{acr1 ziP-8|)L_kH1sXJ&KUN<%za@q*5-ENQEB5XsOlJUeOpoLw%R%vcSgbU={bWg@qo{%# zp%S6XhJE*BM$DrTirri+XlVQ(mRmS}!tXNEOXAp}bmu&mwhV^yG>H9Fd8M9I4^A-QaO+lRPR z#Y&3PVW)CKr*X(#09i-N#FI%KLtwGDks~v~~@7o|q2! zhFE^mcJqSLlJE%;(TTdm_#X}l@)dum*PP+4k?+|x#5Bb`DX)Y;UJLmfG`({V=t*#5 zYFcCL#Thd0$q&?dCnn$}QKtP!t?cV3C$FX5cm>~$#(b!M9B~w9^48)j4o`G5#JUPrR0V#-rlF|?#1jw;;9burs<6{*C3~hCB+RUWMS9Ft~CY4G9 zb~b@-Cg$Tw)!8}^Li8^pot-vTNAHR#=)C1@hFk)fHmVu_&3dy4|SF!(Qo$-a?pIu2CTmNFEjbypaExs z__(tiqNI_x(AADe2Vft7S0KPwyNUz*iM$i))T{bQ_Uzqsq^j>dOXf1Af~C+z&!Mq^ z6%|xq7yC+h66Q`pU-pm!m7Mppypx*m#3;+4z@gdb?_T1d#;_!N&kY;(EW3g0*!!+M zAr2Y@FNH}FB*rWI3@>JNzjBX|POahZbWbcfTpXXR475>bntCPS>+A%rm?G_VIc*9; zmeUm#mZ}@0)Syc$wx&no<>e3&J9I(o;b5F<6)RQEry!~5Ql5!D>wu&R^w5MDc;^8U zB+1bs-jRv%;rJXV5+aL}FAkRMT3Yj8CK4dDa5L@%Vvtd ziYGqB6yKTle7_x!7E7|Las)P>0bTfE6-3YVht5$=VlE^W=O4_tdG`t8{QKg9agbg^MOu|xjVD$td9|iBZK{+_5_0Pb2 zt*jCL8Kpt$Zec=A*sK_wFBDh5$M4wp4KWZlEyZ>|m4_BPhRg=-@^sg!10Ki$YlO+A z{!0nuZ&wqU50`o7P3wyl*-5D>Nd7g64x2Y9CT`!~Kt;bVU;~aV-D=fBh+-M+gNkCK zrvhw|N4psE-?c|h{2c=R2P3Cd>D*QdkVRX64_2+MRtZMO&QQ|M;zB=VxRL>W$d+!? zN+Is{g0E9Qx9Ok^UUFs0B(o%^>*OPVKZ1Il&LE|u1cj38N*Mf$zZZ9_0l~*0j8K)% z)X2h%-dMtr$GvG%{yB`r3z3}4rf|3fa!kgJpr%BNHER^!3=!J8dB4fVWb3RA*CA3s zA<}&d%Kp1gA=t-m43zdgM~WbP>xPj%`%EL@g+At!9sjpx;Wqe86(ls;LAf8zAEy+H zP!`6m?r86({ykvjEzqT*;(pa%nxkD}6uv|a$v8tHY3+fJJU6d~wfljBmVJi7d zIKMD#qz`O_=4F@lBFH~}TP6{FK{OGG{g6}N=xFaM^!RuU>05_dXmK?d&*z-SSq#1zIm{jhD7Vurlzu~{L$jC5GbsjnxiFt`dj9W5PsG%F5d8NY zLFO~=@A>H5nw3G_vA*Bk4p2dWqTamsqbQVk7D>DOrO7_{32sXhIG|lRA1)vqH<8P$ z>}7n%I;9YC*n1b$0juS(=BAN=AI|Sf>T0Q5qh_vvPC(|P(BtxnLdz?Pg^l5Bk35Kh z8I*?^&@!WBF-d4Ns54K!OAbBn?~Z+|0lzd1nP!mlrA6?+pGB8M?w9E7TmVA31fkH8 zx30)XHaqAmiqGtB?91~<*~{E4wN@rsWSJ8mU*1MWh6R;-0crGvG-xEfU7e33Wtj7d_NP(&wIPJ zhvvNw;8Xxp6Hac*8`w8soK}*9wmEFIH#Y*rN~C;hVoThmpugktGCy;Ugt(+_xq-^w zrKG#cuRRqaXUqc+s%C6|U>PTNQt#@f9fSTv@(x)a2iJfIZeld#M)lN?)qi%(;SgC zH%|Wk{^yPuBzxGZDnaZY%SDWi4~XmUh(Fwou8TA4XBbbWwD)els{{~NVBLh;+w?Q& zi}e>rH6I~!?s@@_L^(_Z`1`KUXD z_!V|pfq)hr#RF~AA&4F2b*%HwwW9FH` zL@eO?=er#14}sc31hi{&WQuAMz9F=F;c=u9D7ry1&P2*l(|HsuOZdlWV;qg5=HGeE z1oZ4uvD(G3fGLFBPR0FfrWCOGFqtvbdA}%NI)>O5>tkvREeu>V9F-0U=O4vlrrI;Q zM(6dIHruDHMy6dH?nRm$8A0y*+sZznZM2A3=EG!@o}j!e-d3 zPjq~YHY7nOa=B~l&Kbl0!K!C+}-6jVN204-`=hC8Obq3htxnHz$%aUpDbmk%R#%TWDG`dWg zKUP*odI^wzJiut4U+FQ(S?2#|%qBtCJ28w@rp$oTzLXko0P#8eRsJ>t{AT*t+#B=C!qRE%!l>vgQX90Vhy zh3ot{S*DCVLNQe&<-AvveO33uRk#ASOH_y~Ir623)QG$od4HG`b&uSm72*eIajQNa z9uS*C;pCxy`H}43LDy8zA!Aii@bw(r%gTCJab)Ed!gbZ|iOLB0xH(q-p$UQQoPd1j zzz-}_hAU$>bI0ZQy*|J_U^X;iC#T60`1KPLxJ^{GTLuVwHxx>{p|4jeft56v_?+b; z*d=%uAQ4&(-1$ubIA78^>)W+>1y5x+e9`6Af};vRWyI|H*F87(qO5rexN%Gt-B{kr zrGT)LwW`M;1$djKfY=jiDI~>TeeK+|f|!eW3TS*;Es<0TIQ(!_;8!e1)8JP$1uVE~ z2@hZIE~AEB7z9h5VU_}3-&M)NCwS_=`T90)3fS{TC4r2Q<+6*{u;*G9p=fjjNb59{FnD!pceli(BMgwc`CT!PgWr0mnlw+D6 zev|?aU5&torI6`o(C=(wIVWG5b`3(a?E^ytWC1LcOh1EudTYzMWc>EVuyRR}AUu!0 zho^~>sqhb93rS@dZ6XE@_vIQ*YFi5#1H_GH?y}~E4;QhrigyzlO@03?ut^$Cw`Q7Q zsi+a&B6Coq(P%8^npH1I)1mOGrg) z=Lwq@eonHsvU&`EhXPGMgTC(o%ZMZu7h>?5b{llXpf&o{iCd~gbbOt4iB0*ah0cn@ z=iE(mVm>!`fkiYj>S}jw{7cpYSO;}AAbf6%)bK^>;zifY2UnhZ5rN=50fCY(HqS0m z%^|6zSCzVYMj<4pp=hG#24=2P%f#2u$!yo`c0f+JS5{CPbiz7|G!msM54;`{ua!~F zQop=`tPD8=)ljiT?p8zf{Zm-6?0F}D)k|X$l&s-L)aVNDvye$rP3QA%4DN-h$J-8gG$7u>pOXohMTRf0WU=ECx#zoB>ExAv&-JD-vl%cmtcp!PgZ}AjMYuQz7%5#) zZz#LwN+BfLAS48u6NbD~OCf1k1$O4Y%T9FWM1;m7-1IZ(Z|5!{=bcPO-{-;m(K*p33inLwKR^};C3*EWyQC2BaVwC6_XUKvfzg~rvdUh4= zXFal0123tL{hw>CXo~%yT?i_)+fuHP3KG65F4a2_ejaK_Lwk-c!Q&bYjsAa;F^ky%id{-!+Ci-d96)~|*eYRZ~DW;Wb z*S8OQ0^d81a-yy&kg#xjai%&3zN|LA8ULK`-z63(!`I^LebJh0rNf#nTahNN&lLLi zl0|CZB@L?ilKqqIU{GG&h5o(vm|+`nT;P72q<4)FF6TY%`cF zYk*Rp*z{Bx3-%wSynEuUp00aQTcx|1ts7pbBal=@rDZuZdy)CxBJ zI;ke%>pR_f(%*$Kk4=~dZByLnuA0IxhILy-_lW0c_J)+gba0Wlpr-QeWhobbRykhI zsGM90_a7z*PhtKMrkIHjZL|8>p*axNY`8jIN9)HahL&-T)YVhs`6(l2k|GWqJi$>3 zF|+zmtpDvE*tcprUTC}NQ`EpqI!M}^TsA>4tfz2r8c5dfR71ixXxR5sVv{-R`NnAm zmY6Z^gze|~?h_wMKQ0ns?aD%&o#h?*g(z3p8dLNE^ zRjjIlgLV`~lv2*Y*FjvpCE+ZdOoDU(Z~7VZRh*P#dnLuhiFx74*iS!yfnRj@5_M9u|rF5!)+PpR3$%l|q*EA1StQT}u$HSLYP|L&Hz2SKWAT8R!$QPgvU&df}=B-!o zIVKPTGFm^Z2vklaLy}VWRB`^A_GyqJ5-gk|!jh$`UMHVfMYdsOkQ^Ztn7*@G3Q5hE zo0)A*JU+3y(NS2xPa2?-h_CvbzkPKY2DQ7Ht!aa%sU(n5i<7Q@C4R7~HB%9jUtFkG z)D?RN?+fk*7g^~p3|8A_t3a1jMi-~4L)rK9b5RJ<JbcY>d_A#SBzAmGVJbBAHrT41g^wNdp-k~$_;`1ua_Z+#4=cx(F{s>z zgD;vu9p=5O1xFQ;_{Zt`N^8PxbG0uT$mj$DJPnLB{#HvNX#q=}i{|vE+%_u^t zlWG&IPWK;xyp@c&Pxrr?g=LYFuesP;NB6P2V?MeI19S0cO9=TaZ>#8;B%D-^U)0b^pOenjyk*_bm{ez&2hC|E$0}lB<(TQN zW3k{+Ye1nRO_4dnkvZv-C1RX<7QTAE_GuUV6*CDns{%euR?OiMt_|sDY#fQrr9eWy zd1h5Hqd*UFzkSj|uhk5*}o&WMeUx zDlHg*)XpE1QpdSjr^hUIlX={CF9Y+lHCdGC3EkFV}jhpybbI z@3eK=o|wWeJJ&@8xXcu;29|636`tjTY0$%Bsoj*Zn2(+v7CZQxE?_N0@&bQU zG^cyZ;j$wa3D~v~-3ZKPGyNm$N3%zg=^Fodh;neZXwf6Xb9ycf{H>IgRo`yHOc@-e zjzHA;nUL}>UfeVv<}uT(l#fhNMRI^e-m>Os>(3?d zHCroTqUkkS6$c-F=>5$bF2ffdLg93wziNRhcnNP{qT274`?wnvvJ5<^E=)gz{@NlH zJaKUvQPY|?F!|7EtbB{K6E?!)3~DJPjqBC5=&gm3%X|?$sFMWjP)WpBO5A~V9$`?5 z76FQe_D#oB63D2i$*(}GWXN8q-i%kj?TG9iySR1zJL)hLIEhAGTeor@<7V?8k zWejtCS;zWC;bW)aV{~Km4{Now{E4+cxTEGEOsoJ>1pUOYLS?lKGLtE}xLE)Te&$~G zwu*A9fDlcjMs#y&`quLWs+YzG1U-aamg=OML(=~C1^b-th}p31A1b(_UaFb=LK3tI zqUDI4|Bj!=py!u{4H{a*?`vr(mE_z;cy_P41Z&fq2!?bsWpzgj3HjFdVQlqV6=8jE z@rN~@>1WWV;lPLV!G-T`m1z=2A<7tGL=Sr(cI?MoZ8iF;W;9+!Bo^_boBz{!8q{{# zOl?;qEv1rFTY>Y0V%Hld#;ag;N|)D@_p8Deb$K?6KI_7q z;}K)3))aOTTc1$F!k50LernhjNS|HKL!BZ2H8toG_QNKz>dw=6)>}94B9^?akVdMD zsJ~a}Nne=e=MKUy;-Z^s;3XBYwnmK)oiK-wa5oyDdVNqsf=eMnBgFQKnXvi?&+L&C zE&TFW61kZYCaZgke71~8a$ci57f5x&yt-mu?Fe0bfwD3gI@19&bn|^)rvJkKF1{_! zrrP7^t;+RLUQNSv+Ys)&h5svVzTvn1{r0)Cn6(vVjSGuRKP+jATgL3G<*wM-G%J6} z>8!^zqcKeysVkJSn2bNK7~4WQa0#N-2AC*y=+AZ*QSoWEx-{s)R!jC+ExDV7$87Xb zU5jXB0!Zr2YmM_mUE5F{&=&rR`l|R6l4OnY-Kq71*f$T0(e0vLi6RXx<>E`RU&|?l zI%0+E2ctj|G5rks(alsa@xiZN2uj}!6^(+(XnJz)paNV*F}5vcpIHuJrJd-A@cjgFtTKkK#IZQ-CYFd~Eb#YYO}7$NZSKO|T+dH>uWKTlWTe!_WfC z-d5OVn$trCx@f#+l6ldfgI5uB48~&(fSSPcGw6d7lymT<9=iQyVkm6J6>bf9)6bya z@QZS636o(Hcr*R4(XF8Z_7WvcqpS32b-5(E8>&-d}Q2>F)y!G!Urm& zh5I(a@05c}8k~C``;=T5{{R>qZT0@ITsiqdJI*m<{8C1C{mGd6ebCw%2qUXYG;+JV zItISR=am~e#<2qWyCK3hz?>?I@%hkKomMPo#pL~b!pxbkm11Za1G-zZ{V;bZUP$2PvoE4D{x{tdy96h&O}6~W5fh8u;k2#ZDC zK}(N9!_`tqs%EnG?f^VlW@U@`OSew@PgY69S4{f_+G%B=nA`ZHikOc&tV-D*gF z*w+)QVtTe{Iu`F-Sncr^Zsio)XDOBB-24&_w<(DzkQ4q%ZTjU|3kmrqx4DDUl5Q}! zLI~5IB;53VXd#h|={2_=n!7T*C>PeRbbVa@u?j~1bmm^3GN3=Ea|zR->*L8^RDjD& z;r=YE7T=oCG!XQ_ODod*Um5w{*sjotE@;ErmF}BZ3Re*a3X8o*+0_w9TG?Qqh>q#7 zvcF(ub%^q}l~F~*SH>o{O}A%48T+9OdORmb9aZo$>Tq-F)~F~-jCs` z{o#H->sLZ3=6e{eo5`WJ(*6(W1%-7r!7mbkQ7~jUhA(0UB;Q)_UnE;02IX`D|%!nAxR-k%Q#(POb2aD zWJE~D_j?)7e|uy+At!pb&&$+GhTE{Q-N?3nM0Pa?{TH;7t~BZL`c@S%=UQ09(A}Dp z)c=B9$}R(Dg)iO!S^t9NCEcybKmNbs<{MP!p4o@oL?Q4S!W6n|rk_DydD?%#%qOkv zTG5#uU3q~&e-kBZv_+=<2c$B_eJ0@eUG`-vyDgW-%=8rs*^Q4Tw9-aK>csNPSY7EV z{jrC=w3cvvH*2*8ERv>MJT|gUTp=r~Khd?O@wwl2^;~?N9sj3m?VZq-19V2W_39i_ z&mp6txQ=b-utxTEsK}KVh|gb&$>QVj*|3tZQ#5z!!MNYa>In)xZ^HKCNEX;6Rkpd& ztYhUc!$O#0Yr=W+Ru(w@HLNB{5bxXv@2ejZk_R7vq2g>sc*E}e7rcDqnK%AnnaN=6 z4$Gm1tWckLV`xLayiP&tP3(r#sICE?Z_DHlxy0r?4g7gP^SkG zYd|h_q#ZSJ5gI%{FOw=?xb9p!1Z74(D3NC9&$+WkC~3BfozCnm21OQyBHhS5Zu%a=7e;P)(fZg0}3XqtPCa%SQMF)$q<3 zrO=*Q^!IgG5Qwr^*En3(79S9QfqH4C2#mLYMbbA$HtJv26)V9oaM7~q@G$jUe1%Ng zKDX3$D54Xrik3~?C#mO-MQ6kWtIy=VunM zlQHIMN&HhOlZJEWFEQZ0vE{Eo0sH=Ggc!Dadx^bQx*63Kn_ z&5pD<9O|*np2Eqv6s~xX$`FX9byB`I|+4`}ap}^4UI24_p5~NYw?2 zkJhYD%4da5#{Kq`9h#F}p40*L4~--@9aPft=hga6i1Ts^pH8m;u z42~g0VO!6cn22{ng-rY@xgGA5z}?;LgzETpB6;HS`0lqnlatA zmU8l${@vnz@EJTR4yzU#3ReuXlu5?5dOULQ&J8tA0i~PCL|OFxG+Yg3bOH|KG0pXK z?-J-0AZDj|ZZ8jF=kpI^y+rFm&8RHU@x^(d*X;akZ)GXw=1J!EGSxCNPq#p?K%cf= zV$(A`(k=Z2hhX;_xD&>nZRCk}>BXkiXqiqM zji&Bl#7L^OPBSc_kqj)kmyRuwgs$#$bam;Dn8Oka$oPWWv#tDt_7EJq!N;2@>e&Vh zNZRV+w0?;=kcu{>=r_4e)%MRwf)vly7VdT!HfNbrQlz#`=FLflNSlM1I>Ik|vdYYt z@0M~$n;eB)S$%+`>!zPUuQ`!bMwy6Kb>~pX3Fp2tO9OV!rkhb1>7=hJ;w|^+z!TMUc>c%u97VvF&_7pg=$5&fp1h_FoH$d zx@KNl;FZN(lBT1H-I-Gl(}_b|rFP1X$Eym^O_VIs0TXmo{YNXo=+RLoCOy1|1 zk*G{^lu_N8vTJ9%LUrahGF>aAoKoVMj-lBe44Yio_-qkPzPh672qcwMxYFy93yb0d zBNyR8sm}JQX!x4>?9!te`!Jt<0YW?FE$gX*mr=*_?)z3bV+Cx5O1cK|+dt|n=HX9a zg;T_ZRe*eiKMGy1xg2!no|jnV^XID`d)Pas?8z5*GU{qAltQ~DCWNyui&*~`U$Q1d zL??@Ye zTd<6W#nFDq?p|48lQF>TJ~ivMges3fl{DCu?QIFIpXeJ`E(QJH4u=wVK%CTQ{s^^@ zNm6}7&h1+`80ve3HV<{-1#y<~@fFv-PUPX&P~31R&V!gq{0Pf zbr(voRs;R5h#mDSr?p8I08MycFs%ZGC`M7aLg{{!Ntyu=PJE{s^MjdzR|1yYe zlbNfd`Z1+EsKvw^p8lWTq~}81OT)$@RmYCM)e%Ul<727GY2I*DZ_v~+`3zfql(?db zhOdrd8@FD(2v}b;b*y@<3SLGXBf6v%tBt1i&f>zR_LV0JdH54Bc$^%)922;XziLE2 zL2qP%V?~cT6s+~{1XfQo^FeiD`Wf^dZ7#B<^(2x4dtA+FAUkR~6Csc)KYL@6Fjl#4AWZhUmvwx(obXDwf8@H4MwmM3&koXpJBnuu8jgFb5XJDUnZ?s zyC4=|di*&NP`3`^pfQ?|ewseo8WGW9Iw3CJiU#fvP*#XanZF`dPuxD5;f8AaYhog5 z`TJ(eZj&RQl~tZR84wenopoG=sP?{?a4l9NKsdBa2)Ewx32~Z`1h&6rTyrHyLQ}h)5g`HMVEX!C5I`-_qZ9A10g|R^j+<=J?m3e-SPQ9vUh& z+<=GoV%7uA7B=Qg5Z^?|A&UAU)6#0kAm3pC-h=p3l>k5OCkN~k6%)x9K>qiumwg5r z+tZ_lx;aW5HRGHyyNkgblnwQX=Lol)*seQiVY6PXSa<445ix z?;uGyZ+L|+PGpc%wqEov31zW^JXB%743R`-QswnKm|X4lk6vE^;VK4cg~s_?De|EH zI$fkTv@?X8pbOD)42@CjavTt{vpfu~wUt#RBHW-+vJ~b5X3qPfxx=S}5O8gboI(aH z6@%18MjD@oGlyiOoU)#2w483ttkU1I~Z^Pu@y_g7AV!YIEMqHIblMKjZp0;@N z5YBiTHt0x(`0%hy( zw1WKeo*1$=5?|QJB>cG>YzF)Up}s->z*52VGw46uSB5JtjW$PG7upMHxaAd&+4qSU zwk|}z^wSRS9JLN3^?_+oy#>Ay$CWDmdX}te>$FU~$3b4ty~79|*QT%#3=&>yIL+>?Q$(<#_%VSIl;MG#%C{FNXRj{%V=* zfH`czukxT7*o=hlzazT0JG2?5%Mv~naEMh!!TLROmGQ%f19knhA_;ZmSnESuu$p;< zq8`%hbySWf-MPd;Rdr5&NL~tre7Q_sVDy<8F zdHn)QpoPkY7zse*S8nEGWRPi{&h*OxxDt?QWirN2aUzfzo6=&@fMG@#@EJNEmGKhyG~7NSUPoo1Z(Gcy;|w7U%=uCNK(GNHv)w2`po5byIf**M%S! z<`)X%;ap|7{4p~@+qL@Hx)sJ7f)d4%1iA1Z5W~u z4Vy0w5{PXg(3R70qC3M3AOH0^D^G181sdJ2FPFeW z0|lMH(hc$yox&mSc(j2zi$f;yYMT3NMx$@L9x9{~U$R*ioo^VS)f#N530kH75Z?>-^y_LKFp-B;V-Yt?1QwP5H7WZrWZx9jbAL0^vP=jGV}*+ z`We_uAfB)@UlJj1Tvmb3Vf2oO)oFFRL;c5o?8CSXZ8R_70iSth2;Ap*d4S{y8cpi4Rg@IOHF+@LnUVm z3&(u^fihfigQ{1tZ4z^PS)c>fc@AWF!EeMN#ii%_`j-Z5wOazi zq(SN3XK_5KYG`)$p&xg^KG{na&SZq{U*r%aOQD&4f_@r;sIk3(usHV0<;Y(*#Y(R&|J&O5wOh95^TjL03`=8y#ln4h8N>44NMKdK4;#`%MIntpCQ2 z?z3b3I!^1Di8)6D*I(J)ddz?wiI^Amkt5)HZ(YCn7hT}JO%QhJuG*w1QAA|ZD3}Dc zzKk{@X>xmdS(Tp;hA3?HQif6qatx-TK$0P@bhLeIG^g{}3K{YYl4HP0JDE8!x%VE_ zbR;wFLr`u7B6q_`5r#mv2;$3p*}+RarUR)nG)eQZ%`Z}D(%VcdZj|_xJA4zorLMiu zK3)n|a;c-VL`QQGCWa`wGaR`1@L!$b8-1~0rBUMQED6J41LsSEip4V~$ab42_6Y`H4)hdg0-n840jQ|CGLhDw z;a__Yq;MKiKyowv40?BiBz6EEjx?76gS6?^un;@bSPDa?0nKWKG~~DNV~)$jka~U8 zJ{MSNQ$zh{y~?08vy;8QW&T_=gn-~3`?n1AB7IGspau*=%`?9rGon>+<|+a?04?xZFPvCJPksrj0KqG}H@JEJ*s&etO6G0pdw zCcefq{S12h?LUqvBtzq)|*E#&xvH&`XKdRF@JIsIrkVCZzl6B>xX?guw zWBO%oVGa1dozi%n;xsWh&}VKce`A<859GOh8?&qlXcTRxpFv-Cx1&{CuRymNKJC0~ k`Ly%&>RhvpPe7o*Z!RQ7E2|zkd*pn-D4SKCJuIRBA3; allErrorNumbers = new TreeMap<>(); + Map mysqlErrorNumbersToNames = new HashMap<>(); + + // Integer errorNumber = null; + + // + // First create a list of all 'known' error numbers that are mapped. + // + for (Integer errorNumber : MysqlErrorNumbers.mysqlToSql99State.keySet()) { + allErrorNumbers.put(errorNumber, errorNumber); + } + + // + // Now create a list of the actual MySQL error numbers we know about + // + java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class.getDeclaredFields(); + + for (int i = 0; i < possibleFields.length; i++) { + String fieldName = possibleFields[i].getName(); + + if (fieldName.startsWith("ER_")) { + mysqlErrorNumbersToNames.put(possibleFields[i].get(null), fieldName); + } + } + + System.out.println(""); + + for (Integer errorNumber : allErrorNumbers.keySet()) { + String sql92State = MysqlErrorNumbers.mysqlToSql99(errorNumber.intValue()); + + System.out.println(" "); + } + + System.out.println(""); + } +} diff --git a/mysql-connector-j-8.0.31/src/build/java/documentation/PropertiesDocGenerator.java b/mysql-connector-j-8.0.31/src/build/java/documentation/PropertiesDocGenerator.java new file mode 100644 index 0000000..cbe37eb --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/java/documentation/PropertiesDocGenerator.java @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package documentation; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import com.mysql.cj.conf.PropertyDefinition; +import com.mysql.cj.conf.PropertyDefinitions; + +/** + * Creates docbook table of connection properties from ConnectionProperties class. + */ +public class PropertiesDocGenerator { + + public static void main(String[] args) { + System.out.println(exposeAsXml()); + } + + static class XmlMap { + protected Map>> ordered = new TreeMap<>(); + protected Map> alpha = new TreeMap<>(); + } + + /** + * Returns a description of the connection properties as an XML document. + * + * @return the connection properties as an XML document. + */ + public static String exposeAsXml() { + StringBuilder xmlBuf = new StringBuilder(); + xmlBuf.append(""); + + int numCategories = PropertyDefinitions.PROPERTY_CATEGORIES.length; + + Map propertyListByCategory = new HashMap<>(); + + for (int i = 0; i < numCategories; i++) { + propertyListByCategory.put(PropertyDefinitions.PROPERTY_CATEGORIES[i], new XmlMap()); + } + + for (PropertyDefinition pdef : PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.values()) { + XmlMap sortMaps = propertyListByCategory.get(pdef.getCategory()); + int orderInCategory = pdef.getOrder(); + + if (orderInCategory == Integer.MIN_VALUE) { + sortMaps.alpha.put(pdef.getName(), pdef); + } else { + Integer order = Integer.valueOf(orderInCategory); + Map> orderMap = sortMaps.ordered.get(order); + + if (orderMap == null) { + orderMap = new TreeMap<>(); + sortMaps.ordered.put(order, orderMap); + } + + orderMap.put(pdef.getName(), pdef); + } + } + + for (int j = 0; j < numCategories; j++) { + XmlMap sortMaps = propertyListByCategory.get(PropertyDefinitions.PROPERTY_CATEGORIES[j]); + + xmlBuf.append("\n "); + + for (Map> orderedEl : sortMaps.ordered.values()) { + for (PropertyDefinition pdef : orderedEl.values()) { + xmlBuf.append("\n \n"); + xmlBuf.append(" "); + String escapedDescription = pdef.getDescription(); + escapedDescription = escapedDescription.replace("&", "&").replace("<", "<").replace(">", ">"); + + xmlBuf.append(escapedDescription); + xmlBuf.append("\n "); + } + } + + for (PropertyDefinition pdef : sortMaps.alpha.values()) { + xmlBuf.append("\n \n"); + xmlBuf.append(" "); + xmlBuf.append(pdef.getDescription()); + xmlBuf.append("\n "); + } + + xmlBuf.append("\n "); + } + + xmlBuf.append("\n"); + + return xmlBuf.toString(); + } +} diff --git a/mysql-connector-j-8.0.31/src/build/java/instrumentation/AddMethods.java b/mysql-connector-j-8.0.31/src/build/java/instrumentation/AddMethods.java new file mode 100644 index 0000000..740b9f9 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/java/instrumentation/AddMethods.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package instrumentation; + +import java.util.Collection; + +import com.mysql.cj.conf.BooleanPropertyDefinition; +import com.mysql.cj.conf.EnumPropertyDefinition; +import com.mysql.cj.conf.IntegerPropertyDefinition; +import com.mysql.cj.conf.LongPropertyDefinition; +import com.mysql.cj.conf.MemorySizePropertyDefinition; +import com.mysql.cj.conf.PropertyDefinition; +import com.mysql.cj.conf.PropertyDefinitions; +import com.mysql.cj.conf.StringPropertyDefinition; +import com.mysql.cj.jdbc.MysqlDataSource; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.CtNewMethod; +import javassist.bytecode.DuplicateMemberException; + +public class AddMethods { + private static boolean verbose = false; + + public static void main(String[] args) throws Exception { + + System.out.println("Applying AddMethods."); + + verbose = "true".equalsIgnoreCase(args[1]); + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(args[0]); + + sysOut("---"); + CtClass clazz = pool.get(MysqlDataSource.class.getName()); + sysOut("Add properties setters/getters to " + clazz.getName()); + addPropertiesGettersSetters(clazz, PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.values()); + clazz.writeFile(args[0]); + + } + + private static void sysOut(String s) { + if (verbose) { + System.out.println(s); + } + } + + private static void addPropertiesGettersSetters(CtClass clazz, Collection> propertyDefinitions) throws Exception { + for (PropertyDefinition def : propertyDefinitions) { + if (def.getCategory().equals(PropertyDefinitions.CATEGORY_XDEVAPI)) { + continue; + } + String pname = def.hasCcAlias() ? def.getCcAlias() : def.getName(); + + if (def instanceof StringPropertyDefinition) { + addGetter(clazz, pname, String.class.getName(), "getStringRuntimeProperty"); + addSetter(clazz, pname, String.class.getName(), "setStringRuntimeProperty"); + + } else if (def instanceof BooleanPropertyDefinition) { + addGetter(clazz, pname, Boolean.TYPE.getName(), "getBooleanRuntimeProperty"); + addSetter(clazz, pname, Boolean.TYPE.getName(), "setBooleanRuntimeProperty"); + + } else if (def instanceof IntegerPropertyDefinition) { + addGetter(clazz, pname, Integer.TYPE.getName(), "getIntegerRuntimeProperty"); + addSetter(clazz, pname, Integer.TYPE.getName(), "setIntegerRuntimeProperty"); + + } else if (def instanceof LongPropertyDefinition) { + addGetter(clazz, pname, Long.TYPE.getName(), "getLongRuntimeProperty"); + addSetter(clazz, pname, Long.TYPE.getName(), "setLongRuntimeProperty"); + + } else if (def instanceof MemorySizePropertyDefinition) { + addGetter(clazz, pname, Integer.TYPE.getName(), "getMemorySizeRuntimeProperty"); + addSetter(clazz, pname, Integer.TYPE.getName(), "setMemorySizeRuntimeProperty"); + + } else if (def instanceof EnumPropertyDefinition) { + addGetter(clazz, pname, String.class.getName(), "getEnumRuntimeProperty"); + addSetter(clazz, pname, "java.lang.String", "setEnumRuntimeProperty"); + + } else { + throw new Exception("Unknown " + def.getName() + " property type."); + } + } + } + + private static void addGetter(CtClass clazz, String pname, String paramType, String getPropertyMethod) throws Exception { + String mname = "get" + pname.substring(0, 1).toUpperCase() + pname.substring(1); + String mbody = "public " + paramType + " " + mname + "() throws java.sql.SQLException { return " + getPropertyMethod + "(\"" + pname + "\");}"; + sysOut(mbody); + try { + CtMethod m = CtNewMethod.make(mbody, clazz); + clazz.addMethod(m); + sysOut(m.toString()); + } catch (DuplicateMemberException ex) { + // ignore + } + } + + private static void addSetter(CtClass clazz, String pname, String paramType, String setPropertyMethod) throws Exception { + String mname = "set" + pname.substring(0, 1).toUpperCase() + pname.substring(1); + String mbody = "public void " + mname + "(" + paramType + " value) throws java.sql.SQLException { " + setPropertyMethod + "(\"" + pname + + "\", value);}"; + sysOut(mbody); + try { + CtMethod m = CtNewMethod.make(mbody, clazz); + clazz.addMethod(m); + sysOut(m.toString()); + } catch (DuplicateMemberException ex) { + // ignore + } + } +} diff --git a/mysql-connector-j-8.0.31/src/build/java/instrumentation/CommonChecks.java b/mysql-connector-j-8.0.31/src/build/java/instrumentation/CommonChecks.java new file mode 100644 index 0000000..8d25a7b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/java/instrumentation/CommonChecks.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package instrumentation; + +import java.sql.Savepoint; +import java.util.Map; + +import com.mysql.cj.jdbc.ConnectionImpl; +import com.mysql.cj.jdbc.ConnectionWrapper; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; + +public class CommonChecks { + private static boolean verbose = false; + + public static void main(String[] args) throws Exception { + + System.out.println("Applying CommonChecks."); + + verbose = "true".equalsIgnoreCase(args[1]); + + ClassPool pool = ClassPool.getDefault(); + pool.insertClassPath(args[0]); + + // params classes + CtClass ctClazz = pool.get(Class.class.getName()); + //CtClass ctClob = pool.get(java.sql.Clob.class.getName()); + //CtClass ctBindValue = pool.get(BindValue.class.getName()); + CtClass ctBool = pool.get(boolean.class.getName()); + //CtClass ctBoolArray = pool.get(boolean[].class.getName()); + //CtClass ctByteArray2 = pool.get(byte[][].class.getName()); + //CtClass ctBuffer = pool.get(Buffer.class.getName()); + //CtClass ctExecutor = pool.get(Executor.class.getName()); + //CtClass ctFieldArray = pool.get(Field[].class.getName()); + CtClass ctInt = pool.get(int.class.getName()); + CtClass ctIntArray = pool.get(int[].class.getName()); + //CtClass ctInputStreamArray = pool.get(InputStream[].class.getName()); + //CtClass ctLong = pool.get(long.class.getName()); + CtClass ctMap = pool.get(Map.class.getName()); + //CtClass ctMysqlSavepoint = pool.get(MysqlSavepoint.class.getName()); + CtClass ctObjectArray = pool.get(Object[].class.getName()); + //CtClass ctProperties = pool.get(Properties.class.getName()); + //CtClass ctReader = pool.get(Reader.class.getName()); + CtClass ctSavepoint = pool.get(Savepoint.class.getName()); + //CtClass ctStatement = pool.get(Statement.class.getName()); + CtClass ctString = pool.get(String.class.getName()); + CtClass ctStringArray = pool.get(String[].class.getName()); + + CtClass clazz = pool.get(ConnectionImpl.class.getName()); + // addClosedCheck(clazz.getDeclaredMethod("changeUser", new CtClass[] { ctString, ctString })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctBool })); + // addClosedCheck(clazz.getDeclaredMethod("commit", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt })); + // addClosedCheck(clazz.getDeclaredMethod("getMetaData", new CtClass[] { ctBool, ctBool })); + // addClosedCheck(clazz.getDeclaredMethod("getNetworkTimeout", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("getSchema", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("isAutoCommitNonDefaultOnServer", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("isServerLocal", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz })); + // addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt })); + // addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] { ctSavepoint })); + // addClosedCheck(clazz.getDeclaredMethod("setAutoCommit", new CtClass[] { ctBool })); + // addClosedCheck(clazz.getDeclaredMethod("setCatalog", new CtClass[] { ctString })); + // addClosedCheck(clazz.getDeclaredMethod("setNetworkTimeout", new CtClass[] { ctExecutor, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("setReadOnly", new CtClass[] { ctBool })); + // addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctMysqlSavepoint })); + // addClosedCheck(clazz.getDeclaredMethod("setSchema", new CtClass[] { ctString })); + // addClosedCheck(clazz.getDeclaredMethod("setTransactionIsolation", new CtClass[] { ctInt })); + addClosedCheck(clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { ctInt, ctInt, ctInt })); + clazz.writeFile(args[0]); + + clazz = pool.get(ConnectionWrapper.class.getName()); + addClosedCheck(clazz.getDeclaredMethod("changeUser", new CtClass[] { ctString, ctString })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctIntArray })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctStringArray })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("commit", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("clearWarnings", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createArrayOf", new CtClass[] { ctString, ctObjectArray })); + addClosedCheck(clazz.getDeclaredMethod("createBlob", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createClob", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createNClob", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("createSQLXML", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("createStruct", new CtClass[] { ctString, ctObjectArray })); + addClosedCheck(clazz.getDeclaredMethod("getAutoCommit", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getCatalog", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getClientInfo", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getClientInfo", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("getDatabase", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getHoldability", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("getProcessHost", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getMetaData", new CtClass[] {})); + // addClosedCheck(clazz.getDeclaredMethod("getNetworkTimeout", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getTransactionIsolation", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getTypeMap", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("getWarnings", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("isReadOnly", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("isReadOnly", new CtClass[] { ctBool })); + //addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz })); + addClosedCheck(clazz.getDeclaredMethod("nativeSQL", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString, ctInt, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt })); + // addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctStringArray })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctIntArray })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctStringArray })); + addClosedCheck(clazz.getDeclaredMethod("releaseSavepoint", new CtClass[] { ctSavepoint })); + addClosedCheck(clazz.getDeclaredMethod("resetServerState", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] { ctSavepoint })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctIntArray })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctStringArray })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("setAutoCommit", new CtClass[] { ctBool })); + addClosedCheck(clazz.getDeclaredMethod("setCatalog", new CtClass[] { ctString })); + // addClosedCheck(clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctString, ctString })); + // addClosedCheck(clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctProperties })); + addClosedCheck(clazz.getDeclaredMethod("setDatabase", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("setHoldability", new CtClass[] { ctInt })); + // addClosedCheck(clazz.getDeclaredMethod("setNetworkTimeout", new CtClass[] { ctExecutor, ctInt })); + addClosedCheck(clazz.getDeclaredMethod("setReadOnly", new CtClass[] { ctBool })); + addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] {})); + addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("setSchema", new CtClass[] { ctString })); + addClosedCheck(clazz.getDeclaredMethod("setTransactionIsolation", new CtClass[] { ctInt })); + addClosedCheck(clazz.getDeclaredMethod("setTypeMap", new CtClass[] { ctMap })); + addClosedCheck(clazz.getDeclaredMethod("shutdownServer", new CtClass[] {})); + //addClosedCheck(clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { ctInt, ctInt, ctInt })); + clazz.writeFile(args[0]); + + //clazz = pool.get(MultiHostMySQLConnection.class.getName()); + //addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz })); + //clazz.writeFile(args[0]); + + } + + private static void addClosedCheck(CtMethod m) throws Exception { + sysOut(m.toString()); + m.insertBefore("checkClosed();"); + } + + private static void sysOut(String s) { + if (verbose) { + System.out.println(s); + } + } + +} diff --git a/mysql-connector-j-8.0.31/src/build/java/instrumentation/TranslateExceptions.java b/mysql-connector-j-8.0.31/src/build/java/instrumentation/TranslateExceptions.java new file mode 100644 index 0000000..608b4cb --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/java/instrumentation/TranslateExceptions.java @@ -0,0 +1,735 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package instrumentation; + +import java.lang.reflect.Method; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Savepoint; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import com.mysql.cj.QueryBindings; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.jdbc.Blob; +import com.mysql.cj.jdbc.BlobFromLocator; +import com.mysql.cj.jdbc.CallableStatement; +import com.mysql.cj.jdbc.CallableStatement.CallableStatementParamInfo; +import com.mysql.cj.jdbc.ClientPreparedStatement; +import com.mysql.cj.jdbc.Clob; +import com.mysql.cj.jdbc.ConnectionImpl; +import com.mysql.cj.jdbc.ConnectionWrapper; +import com.mysql.cj.jdbc.DatabaseMetaData; +import com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema; +import com.mysql.cj.jdbc.JdbcConnection; +import com.mysql.cj.jdbc.JdbcStatement; +import com.mysql.cj.jdbc.MysqlConnectionPoolDataSource; +import com.mysql.cj.jdbc.MysqlDataSource; +import com.mysql.cj.jdbc.MysqlParameterMetadata; +import com.mysql.cj.jdbc.MysqlPooledConnection; +import com.mysql.cj.jdbc.MysqlSQLXML; +import com.mysql.cj.jdbc.MysqlSavepoint; +import com.mysql.cj.jdbc.MysqlXAConnection; +import com.mysql.cj.jdbc.MysqlXADataSource; +import com.mysql.cj.jdbc.MysqlXid; +import com.mysql.cj.jdbc.NClob; +import com.mysql.cj.jdbc.NonRegisteringDriver; +import com.mysql.cj.jdbc.ServerPreparedStatement; +import com.mysql.cj.jdbc.StatementImpl; +import com.mysql.cj.jdbc.SuspendableXAConnection; +import com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping; +import com.mysql.cj.jdbc.ha.LoadBalancedConnection; +import com.mysql.cj.jdbc.ha.LoadBalancedMySQLConnection; +import com.mysql.cj.jdbc.ha.MultiHostMySQLConnection; +import com.mysql.cj.jdbc.ha.ReplicationConnection; +import com.mysql.cj.jdbc.ha.ReplicationMySQLConnection; +import com.mysql.cj.jdbc.result.ResultSetImpl; +import com.mysql.cj.jdbc.result.ResultSetInternalMethods; +import com.mysql.cj.jdbc.result.ResultSetMetaData; +import com.mysql.cj.jdbc.result.UpdatableResultSet; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.Message; + +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.NotFoundException; + +public class TranslateExceptions { + + private static CtClass runTimeException = null; + private static ClassPool pool = ClassPool.getDefault(); + private static Map> processed = new TreeMap<>(); + + private static String EXCEPTION_INTERCEPTOR_GETTER = "getExceptionInterceptor()"; + private static String EXCEPTION_INTERCEPTOR_MEMBER = "this.exceptionInterceptor"; + private static boolean verbose = false; + + public static void main(String[] args) throws Exception { + + System.out.println("Applying TranslateExceptions."); + + verbose = "true".equalsIgnoreCase(args[1]); + + pool.insertClassPath(args[0]); + processed.clear(); + + runTimeException = pool.get(CJException.class.getName()); + + // params classes + //CtClass ctServerPreparedQueryBindValue = pool.get(ServerPreparedQueryBindValue.class.getName()); + CtClass ctQueryBindings = pool.get(QueryBindings.class.getName()); + //CtClass ctByteArray = pool.get(byte[].class.getName()); + CtClass ctColumnDefinition = pool.get(ColumnDefinition.class.getName()); + + CtClass ctLongArray = pool.get(long[].class.getName()); + //CtClass ctInputStream = pool.get(InputStream.class.getName()); + CtClass ctJdbcConnection = pool.get(JdbcConnection.class.getName()); + CtClass ctMysqlSavepoint = pool.get(MysqlSavepoint.class.getName()); + //CtClass ctPacketPayload = pool.get(PacketPayload.class.getName()); + CtClass ctProperties = pool.get(Properties.class.getName()); + CtClass ctResultSet = pool.get(ResultSet.class.getName()); + CtClass ctResultSetInternalMethods = pool.get(ResultSetInternalMethods.class.getName()); + CtClass ctStatement = pool.get(java.sql.Statement.class.getName()); + CtClass ctStatementImpl = pool.get(StatementImpl.class.getName()); + CtClass ctString = pool.get(String.class.getName()); + + CtClass ctMessageBody = pool.get(Message.class.getName()); + + // class we want to instrument + CtClass clazz; + + /* + * java.sql.Blob + */ + // com.mysql.cj.jdbc.Blob implements java.sql.Blob, OutputStreamWatcher + clazz = pool.get(Blob.class.getName()); + instrumentJdbcMethods(clazz, java.sql.Blob.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.BlobFromLocator implements java.sql.Blob + clazz = pool.get(BlobFromLocator.class.getName()); + instrumentJdbcMethods(clazz, java.sql.Blob.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * java.sql.CallableStatement + */ + // com.mysql.cj.jdbc.CallableStatement extends PreparedStatement implements java.sql.CallableStatement + clazz = pool.get(CallableStatement.class.getName()); + instrumentJdbcMethods(clazz, java.sql.CallableStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER); + instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER); + // non-JDBC + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkIsOutputParam", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkParameterIndexBounds", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkReadOnlyProcedure", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("convertGetProcedureColumnsToInternalDescriptors", new CtClass[] { ctResultSet }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("determineParameterTypes", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("fakeParameterTypes", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("fixParameterName", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("generateParameterMap", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getNamedParamIndex", new CtClass[] { ctString, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getOutputParameters", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("mapOutputParameterIndexToRsIndex", new CtClass[] { CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("retrieveOutParams", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setInOutParamsOnServer", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setOutParams", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * com.mysql.cj.jdbc.StatementWrapper extends WrapperBase implements Statement + */ + // TODO: Does it's own typical exception wrapping, could be instrumented with different catch method + + /* + * com.mysql.cj.jdbc.PreparedStatementWrapper extends StatementWrapper implements PreparedStatement + */ + // TODO: Does it's own typical exception wrapping, could be instrumented with different catch method + + /* + * com.mysql.cj.jdbc.CallableStatementWrapper extends PreparedStatementWrapper implements CallableStatement + */ + // TODO: Does it's own typical exception wrapping, could be instrumented with different catch method + + /* + * java.sql.Clob + */ + // com.mysql.cj.jdbc.Clob implements java.sql.Clob, OutputStreamWatcher, WriterWatcher + clazz = pool.get(Clob.class.getName()); + instrumentJdbcMethods(clazz, java.sql.Clob.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * + * java.sql.Connection extends java.sql.Wrapper + * ----> com.mysql.cj.jdbc.JdbcConnection extends java.sql.Connection, MysqlConnection + * ----------> com.mysql.cj.jdbc.ConnectionImpl + * ----------> com.mysql.cj.jdbc.LoadBalancedConnection extends JdbcConnection + * -------------> com.mysql.cj.jdbc.LoadBalancedMySQLConnection extends MultiHostMySQLConnection implements LoadBalancedConnection + * ----------> com.mysql.cj.jdbc.MultiHostMySQLConnection + * -------> com.mysql.cj.jdbc.ReplicationConnection implements JdbcConnection, PingTarget + * -------> com.mysql.cj.jdbc.ConnectionWrapper + */ + // ConnectionImpl extends AbstractJdbcConnection implements JdbcConnection + clazz = pool.get(ConnectionImpl.class.getName()); + instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER); + // non-JDBC + catchRuntimeException(clazz, + clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, CtClass.intType, CtClass.intType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("createNewIO", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getMetaData", new CtClass[] { CtClass.booleanType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("handleAutoCommitDefaults", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctMysqlSavepoint }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { CtClass.intType, CtClass.intType, CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("rollbackNoChecks", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setupServerForTruncationChecks", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.LoadBalancedMySQLConnection extends MultiHostMySQLConnection implements LoadBalancedConnection + clazz = pool.get(LoadBalancedMySQLConnection.class.getName()); + instrumentJdbcMethods(clazz, LoadBalancedConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // MultiHostMySQLConnection implements JdbcConnection + clazz = pool.get(MultiHostMySQLConnection.class.getName()); + instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.ReplicationConnection implements JdbcConnection, PingTarget + clazz = pool.get(ReplicationMySQLConnection.class.getName()); + instrumentJdbcMethods(clazz, ReplicationConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // ConnectionWrapper extends WrapperBase implements JdbcConnection + clazz = pool.get(ConnectionWrapper.class.getName()); + instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + // non-JDBC + catchRuntimeException(clazz, clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_MEMBER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString, CtClass.intType, CtClass.intType }), + EXCEPTION_INTERCEPTOR_MEMBER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctString, ctString }), EXCEPTION_INTERCEPTOR_MEMBER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctProperties }), EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * java.sql.DatabaseMetaData extends java.sql.Wrapper + */ + // com.mysql.cj.jdbc.DatabaseMetaData implements java.sql.DatabaseMetaData + clazz = pool.get(DatabaseMetaData.class.getName()); + instrumentJdbcMethods(clazz, java.sql.DatabaseMetaData.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema extends DatabaseMetaData + clazz = pool.get(DatabaseMetaDataUsingInfoSchema.class.getName()); + instrumentJdbcMethods(clazz, java.sql.DatabaseMetaData.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * java.sql.Driver + */ + // com.mysql.cj.jdbc.Driver extends NonRegisteringDriver implements java.sql.Driver + clazz = pool.get(NonRegisteringDriver.class.getName()); + instrumentJdbcMethods(clazz, java.sql.Driver.class); + clazz.writeFile(args[0]); + + /* + * java.sql.NClob + */ + // com.mysql.cj.jdbc.NClob extends Clob implements java.sql.NClob + clazz = pool.get(NClob.class.getName()); + instrumentJdbcMethods(clazz, java.sql.NClob.class); + clazz.writeFile(args[0]); + + /* + * java.sql.ParameterMetaData extends java.sql.Wrapper + */ + // com.mysql.cj.jdbc.CallableStatement.CallableStatementParamInfo implements ParameterMetaData + clazz = pool.get(CallableStatementParamInfo.class.getName()); + instrumentJdbcMethods(clazz, java.sql.ParameterMetaData.class); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.MysqlParameterMetadata implements ParameterMetaData + clazz = pool.get(MysqlParameterMetadata.class.getName()); + instrumentJdbcMethods(clazz, java.sql.ParameterMetaData.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * java.sql.PreparedStatement extends java.sql.Statement (java.sql.Statement extends java.sql.Wrapper) + */ + // com.mysql.cj.jdbc.ClientPreparedStatement extends com.mysql.cj.jdbc.StatementImpl implements java.sql.PreparedStatement + clazz = pool.get(ClientPreparedStatement.class.getName()); + instrumentJdbcMethods(clazz, java.sql.PreparedStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER); + instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER); + // non-JDBC + catchRuntimeException(clazz, clazz.getDeclaredMethod("toString", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkBounds", new CtClass[] { CtClass.intType, CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkReadOnlySafeStatement", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeBatchWithMultiValuesClause", new CtClass[] { CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeBatchSerially", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, + clazz.getDeclaredMethod("executeInternal", + new CtClass[] { CtClass.intType, ctMessageBody, CtClass.booleanType, CtClass.booleanType, ctColumnDefinition, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executePreparedBatchAsMultiStatement", new CtClass[] { CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { CtClass.booleanType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { ctQueryBindings, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("generateMultiStatementForBatch", new CtClass[] { CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getBytesRepresentation", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getParameterBindings", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("initializeFromQueryInfo", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("isNull", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("prepareBatchedInsertSQL", new CtClass[] { ctJdbcConnection, CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + // catchRuntimeException(clazz, + // clazz.getDeclaredMethod("setBytes", new CtClass[] { CtClass.intType, ctByteArray, CtClass.booleanType, CtClass.booleanType }), + // EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setRetrieveGeneratedKeys", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * com.mysql.cj.jdbc.ServerPreparedStatement extends ClientPreparedStatement + */ + clazz = pool.get(ServerPreparedStatement.class.getName()); + instrumentJdbcMethods(clazz, java.sql.PreparedStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER); + instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER); + // non-JDBC + catchRuntimeException(clazz, clazz.getDeclaredMethod("toString", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getBinding", new CtClass[] { CtClass.intType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, + clazz.getDeclaredMethod("executeInternal", + new CtClass[] { CtClass.intType, ctMessageBody, CtClass.booleanType, CtClass.booleanType, ctColumnDefinition, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + //catchRuntimeException(clazz, clazz.getDeclaredMethod("isRewritableWithMultiValueClause", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("realClose", new CtClass[] { CtClass.booleanType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("serverExecute", new CtClass[] { CtClass.intType, CtClass.booleanType, ctColumnDefinition }), + EXCEPTION_INTERCEPTOR_GETTER); + //catchRuntimeException(clazz, clazz.getDeclaredMethod("serverLongData", new CtClass[] { CtClass.intType, ctServerPreparedQueryBindValue }), + // EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("serverPrepare", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * java.sql.ResultSet extends java.sql.Wrapper + */ + // com.mysql.cj.jdbc.ResultSetImpl implements com.mysql.cj.jdbc.ResultSetInternalMethods (extends java.sql.ResultSet) + clazz = pool.get(ResultSetImpl.class.getName()); + instrumentJdbcMethods(clazz, ResultSetInternalMethods.class, false, EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.UpdatableResultSet extends ResultSetImpl + clazz = pool.get(UpdatableResultSet.class.getName()); + instrumentJdbcMethods(clazz, ResultSetInternalMethods.class, false, EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("generateStatements", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * java.sql.ResultSetMetaData extends java.sql.Wrapper + */ + // com.mysql.cj.jdbc.ResultSetMetaData implements java.sql.ResultSetMetaData + clazz = pool.get(ResultSetMetaData.class.getName()); + instrumentJdbcMethods(clazz, java.sql.ResultSetMetaData.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * java.sql.Savepoint + */ + // com.mysql.cj.jdbc.MysqlSavepoint implements java.sql.Savepoint + clazz = pool.get(MysqlSavepoint.class.getName()); + instrumentJdbcMethods(clazz, Savepoint.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * java.sql.Statement extends java.sql.Wrapper + */ + // com.mysql.cj.jdbc.StatementImpl implements com.mysql.cj.jdbc.Statement (extends java.sql.Statement) + clazz = pool.get(StatementImpl.class.getName()); + instrumentJdbcMethods(clazz, JdbcStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER); + // non-JDBC + catchRuntimeException(clazz, clazz.getDeclaredMethod("createResultSetUsingServerFetch", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("doPingInstead", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeInternal", new CtClass[] { ctString, CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, + clazz.getDeclaredMethod("executeBatchUsingMultiQueries", new CtClass[] { CtClass.booleanType, CtClass.intType, CtClass.intType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { ctString, CtClass.booleanType, CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("executeSimpleNonQuery", new CtClass[] { ctJdbcConnection, ctString }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("generatePingResultSet", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getBatchedGeneratedKeys", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getBatchedGeneratedKeys", new CtClass[] { ctStatement }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getGeneratedKeysInternal", new CtClass[] { CtClass.longType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getLastInsertID", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getLongUpdateCount", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getOpenResultSetCount", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getResultSetInternal", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("processMultiCountsAndKeys", new CtClass[] { ctStatementImpl, CtClass.intType, ctLongArray }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("removeOpenResultSet", new CtClass[] { ctResultSetInternalMethods }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("resetCancelledState", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setHoldResultsOpenOverClose", new CtClass[] { CtClass.booleanType }), + EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setResultSetConcurrency", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("useServerFetch", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + catchRuntimeException(clazz, clazz.getDeclaredMethod("checkCancelTimeout", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER); + clazz.writeFile(args[0]); + + /* + * java.sql.SQLXML + */ + // com.mysql.cj.jdbc.MysqlSQLXML implements SQLXML + clazz = pool.get(MysqlSQLXML.class.getName()); + instrumentJdbcMethods(clazz, java.sql.SQLXML.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * javax.sql.ConnectionPoolDataSource + */ + // MysqlConnectionPoolDataSource extends MysqlDataSource implements ConnectionPoolDataSource + clazz = pool.get(MysqlConnectionPoolDataSource.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.ConnectionPoolDataSource.class); + clazz.writeFile(args[0]); + + /* + * javax.sql.DataSource + */ + // MysqlDataSource extends JdbcPropertySetImpl implements DataSource, Referenceable, Serializable, JdbcPropertySet + clazz = pool.get(MysqlDataSource.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.DataSource.class); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getStringRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setStringRuntimeProperty", new CtClass[] { ctString, ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getBooleanRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setBooleanRuntimeProperty", new CtClass[] { ctString, CtClass.booleanType }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getIntegerRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setIntegerRuntimeProperty", new CtClass[] { ctString, CtClass.intType }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getLongRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setLongRuntimeProperty", new CtClass[] { ctString, CtClass.longType }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getMemorySizeRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setMemorySizeRuntimeProperty", new CtClass[] { ctString, CtClass.intType }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("getEnumRuntimeProperty", new CtClass[] { ctString }), null); + catchRuntimeException(clazz, clazz.getDeclaredMethod("setEnumRuntimeProperty", new CtClass[] { ctString, ctString }), null); + clazz.writeFile(args[0]); + + /* + * javax.sql.PooledConnection + */ + // com.mysql.cj.jdbc.MysqlPooledConnection + clazz = pool.get(MysqlPooledConnection.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.PooledConnection.class, false, EXCEPTION_INTERCEPTOR_MEMBER); + clazz.writeFile(args[0]); + + /* + * javax.sql.XAConnection + * javax.transaction.xa.XAResource + */ + // com.mysql.cj.jdbc.MysqlXAConnection extends MysqlPooledConnection implements XAConnection, XAResource + clazz = pool.get(MysqlXAConnection.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.XAConnection.class); + clazz.writeFile(args[0]); + + // com.mysql.cj.jdbc.SuspendableXAConnection extends MysqlPooledConnection implements XAConnection, XAResource + clazz = pool.get(SuspendableXAConnection.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.XAConnection.class); + clazz.writeFile(args[0]); + + /* + * javax.sql.XADataSource + */ + // com.mysql.cj.jdbc.MysqlXADataSource extends MysqlDataSource implements javax.sql.XADataSource + clazz = pool.get(MysqlXADataSource.class.getName()); + instrumentJdbcMethods(clazz, javax.sql.DataSource.class); + instrumentJdbcMethods(clazz, javax.sql.XADataSource.class); + clazz.writeFile(args[0]); + + /* + * javax.transaction.xa.Xid + */ + // com.mysql.cj.jdbc.MysqlXid implements Xid + clazz = pool.get(MysqlXid.class.getName()); + instrumentJdbcMethods(clazz, javax.transaction.xa.Xid.class); + clazz.writeFile(args[0]); + + /* + * TODO: + * java.sql.DataTruncation + */ + // com.mysql.cj.jdbc.exceptions.MysqlDataTruncation extends DataTruncation + + /* + * TODO: + * java.sql.SQLException + */ + // com.mysql.cj.jdbc.exceptions.NotUpdatable extends SQLException + // com.mysql.cj.jdbc.exceptions.OperationNotSupportedException extends SQLException + // com.mysql.cj.jdbc.exceptions.PacketTooBigException extends SQLException + + /* + * TODO: + * java.sql.SQLNonTransientException + */ + // com.mysql.cj.jdbc.exceptions.MySQLQueryInterruptedException extends SQLNonTransientException + // com.mysql.cj.jdbc.exceptions.MySQLStatementCancelledException extends SQLNonTransientException + + /* + * TODO: + * java.sql.SQLRecoverableException + */ + // com.mysql.cj.jdbc.exceptions.CommunicationsException extends SQLRecoverableException implements StreamingNotifiable + // ---> com.mysql.cj.jdbc.exceptions.ConnectionFeatureNotAvailableException extends CommunicationsException + + /* + * TODO: + * java.sql.SQLTransientException + * ---> java.sql.SQLTimeoutException + */ + // com.mysql.cj.jdbc.exceptions.MySQLTimeoutException extends SQLTimeoutException + + /* + * TODO: + * java.sql.SQLTransientException + * ---> java.sql.SQLTransactionRollbackException + */ + // com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException extends SQLTransactionRollbackException implements DeadlockTimeoutRollbackMarker + + /* + * TODO: + * com.mysql.cj.jdbc.MysqlXAException extends javax.transaction.xa.XAException + */ + + /* + * These classes have no implementations in c/J: + * + * java.sql.Array + * java.sql.BatchUpdateException + * java.sql.ClientInfoStatus + * java.sql.Date + * java.sql.DriverManager + * java.sql.DriverPropertyInfo + * java.sql.PseudoColumnUsage + * java.sql.Ref + * java.sql.RowId + * java.sql.RowIdLifetime + * java.sql.SQLClientInfoException + * java.sql.SQLData + * java.sql.SQLDataException + * java.sql.SQLFeatureNotSupportedException + * java.sql.SQLInput + * java.sql.SQLIntegrityConstraintViolationException + * java.sql.SQLInvalidAuthorizationSpecException + * java.sql.SQLNonTransientConnectionException + * java.sql.SQLOutput + * java.sql.SQLPermission + * java.sql.SQLSyntaxErrorException + * java.sql.SQLTransientConnectionException + * java.sql.SQLWarning + * java.sql.Struct + * java.sql.Time + * java.sql.Timestamp + * java.sql.Types + * + * javax.sql.CommonDataSource + * javax.sql.ConnectionEvent + * javax.sql.ConnectionEventListener + * javax.sql.RowSet + * javax.sql.RowSetEvent + * javax.sql.RowSetInternal + * javax.sql.RowSetListener + * javax.sql.RowSetMetaData + * javax.sql.RowSetReader + * javax.sql.RowSetWriter + * javax.sql.StatementEvent + * javax.sql.StatementEventListener + * + * javax.sql.rowset.BaseRowSet + * javax.sql.rowset.CachedRowSet + * javax.sql.rowset.FilteredRowSet + * javax.sql.rowset.JdbcRowSet + * javax.sql.rowset.Joinable + * javax.sql.rowset.JoinRowSet + * javax.sql.rowset.Predicate + * javax.sql.rowset.RowSetFactory + * javax.sql.rowset.RowSetMetaDataImpl + * javax.sql.rowset.RowSetProvider + * javax.sql.rowset.RowSetWarning + * javax.sql.rowset.WebRowSet + * + * javax.sql.rowset.serial.SerialArray + * javax.sql.rowset.serial.SerialBlob + * javax.sql.rowset.serial.SerialClob + * javax.sql.rowset.serial.SerialDatalink + * javax.sql.rowset.serial.SerialException + * javax.sql.rowset.serial.SerialJavaObject + * javax.sql.rowset.serial.SerialRef + * javax.sql.rowset.serial.SerialStruct + * javax.sql.rowset.serial.SQLInputImpl + * javax.sql.rowset.serial.SQLOutputImpl + * + * javax.sql.rowset.spi.SyncFactory + * javax.sql.rowset.spi.SyncFactoryException + * javax.sql.rowset.spi.SyncProvider + * javax.sql.rowset.spi.SyncProviderException + * javax.sql.rowset.spi.SyncResolver + * javax.sql.rowset.spi.TransactionalWriter + * javax.sql.rowset.spi.XmlReader + * javax.sql.rowset.spi.XmlWriter + */ + } + + private static void instrumentJdbcMethods(CtClass cjClazz, Class jdbcClass) throws Exception { + instrumentJdbcMethods(cjClazz, jdbcClass, false, null); + } + + /** + * Instruments methods of cjClazz defined in jdbcClass. + * + * @param cjClazz + * CtClass to be instrumented. + * @param jdbcClass + * Class from JDBC specification where methods descriptors to be get. + * @param declaredMethodsOnly + * true - instrument methods declared in this class, false - also instrument inherited methods + * @param exceptionInterceptorStr + * exception interceptor reference as a string + * @throws Exception + * if an error occurs + */ + private static void instrumentJdbcMethods(CtClass cjClazz, Class jdbcClass, boolean declaredMethodsOnly, String exceptionInterceptorStr) + throws Exception { + sysOutPrintln("---"); + sysOutPrintln(cjClazz.getName()); + + Method[] methods; + if (declaredMethodsOnly) { + // instrument methods declared in this class which throws SQLException + methods = jdbcClass.getDeclaredMethods(); + } else { + // instrument all methods, declared in this class and it's superclasses, which throws SQLException + methods = jdbcClass.getMethods(); + } + + for (Method method : methods) { + CtMethod ctm = null; + String prefix = "SKIPPED: "; + for (Class exc : method.getExceptionTypes()) { + if (exc.equals(SQLException.class)) { + prefix = "INSTRUMENTING... "; + String jdbcClassName = method.getName(); + List params = new LinkedList<>(); + for (Class param : method.getParameterTypes()) { + params.add(pool.get(param.getName())); + } + try { + ctm = cjClazz.getDeclaredMethod(jdbcClassName, params.toArray(new CtClass[0])); + } catch (NotFoundException ex) { + // Just ignoring because the only reason is that the method is implemented in superclass + prefix = "NOT FOUND: "; + } + break; + } + } + sysOutPrint(prefix); + sysOutPrint(method.toGenericString()); + if (ctm != null) { + if (catchRuntimeException(cjClazz, ctm, exceptionInterceptorStr, false)) { + sysOutPrint(" ... DONE."); + } else { + sysOutPrint(" ... ALREADY PROCESSED!!!"); + } + } + sysOutPrintln(""); + } + + } + + private static void catchRuntimeException(CtClass clazz, CtMethod m, String exceptionInterceptorStr) throws Exception { + catchRuntimeException(clazz, m, exceptionInterceptorStr, true); + } + + private static boolean catchRuntimeException(CtClass clazz, CtMethod m, String exceptionInterceptorStr, boolean log) throws Exception { + if (isProcessed(clazz.getClassFile().getName(), m)) { + if (log) { + sysOutPrintln("ALREADY PROCESSED!!! " + m); + } + return false; + } + if (log) { + sysOutPrintln(m + ", " + exceptionInterceptorStr); + } + if (exceptionInterceptorStr == null) { + m.addCatch("{throw " + SQLExceptionsMapping.class.getName() + ".translateException(ex);}", runTimeException, "ex"); + } else { + m.addCatch("{throw " + SQLExceptionsMapping.class.getName() + ".translateException(ex, " + exceptionInterceptorStr + ");}", runTimeException, "ex"); + } + processed.get(clazz.getClassFile().getName()).add(m); + return true; + } + + private static boolean isProcessed(String fileName, CtMethod m) throws Exception { + List methods = processed.get(fileName); + if (methods != null) { + if (methods.contains(m)) { + return true; + } + } else { + processed.put(fileName, new LinkedList()); + } + return false; + } + + private static void sysOutPrint(String s) { + if (verbose) { + System.out.print(s); + } + } + + private static void sysOutPrintln(String s) { + if (verbose) { + System.out.println(s); + } + } + +} diff --git a/mysql-connector-j-8.0.31/src/build/misc/Product.wxs b/mysql-connector-j-8.0.31/src/build/misc/Product.wxs new file mode 100644 index 0000000..fce27b7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/Product.wxs @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/changelog b/mysql-connector-j-8.0.31/src/build/misc/debian.in/changelog new file mode 100644 index 0000000..b369e2a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/changelog @@ -0,0 +1,5 @@ +@PRODUCT_NAME@@PACKAGE_SUFFIX@ (@MYSQL_CJ_VERSION@@MYSQL_CJ_VERSION_SNAPSHOT@@DEB_VERSION_SUFFIX@@ID_RELEASE@) @CODENAME@; urgency=low + + * For release notes, please refer to https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/ + + -- @MAINTAINER_EMAIL@ @PACKAGE_TIMESTAMP@ diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/compat b/mysql-connector-j-8.0.31/src/build/misc/debian.in/compat new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/compat @@ -0,0 +1 @@ +11 diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/control b/mysql-connector-j-8.0.31/src/build/misc/debian.in/control new file mode 100644 index 0000000..691443a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/control @@ -0,0 +1,17 @@ +Source: @PRODUCT_NAME@@PACKAGE_SUFFIX@ +Section: database +Priority: optional +Maintainer: Oracle MySQL Product Engineering Team +Standards-Version: 3.9.2 +Build-Depends: debhelper (>= 8.9.4) +Homepage: http://dev.mysql.com/downloads/connector/j/ + +Package: @PRODUCT_NAME@@PACKAGE_SUFFIX@ +Section: database +Architecture: all +Depends: ${shlibs:Depends}, ${misc:Depends} +Replaces: mysql-connector-java@PACKAGE_SUFFIX@ (<< 8.0.31) +Breaks: mysql-connector-java@PACKAGE_SUFFIX@ (<< 8.0.31) +Provides: mysql-connector-java@PACKAGE_SUFFIX@ +Description: MySQL Connector/J + Standardized MySQL database driver for Java diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/copyright b/mysql-connector-j-8.0.31/src/build/misc/debian.in/copyright new file mode 100644 index 0000000..75df281 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/copyright @@ -0,0 +1,9 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: @PRODUCT@ +Upstream-Contact: MySQL Release Engineering +Source: http://dev.mysql.com/ + +Files: * +Copyright: 2002, 2021, Oracle and/or its affiliates. +License: + For licensing information see the LICENSE file in this distribution. diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/install b/mysql-connector-j-8.0.31/src/build/misc/debian.in/install new file mode 100644 index 0000000..1f6c4e4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/install @@ -0,0 +1,8 @@ +@DIR_PACKAGE@/@PRODUCT_NAME@-@VERSION_FULL@.jar usr/share/java + +#legal +@DIR_PACKAGE@/@LIC_FILE@ usr/share/doc/@PRODUCT_NAME@@PACKAGE_SUFFIX@ +@DIR_PACKAGE@/README usr/share/doc/@PRODUCT_NAME@@PACKAGE_SUFFIX@ +@DIR_PACKAGE@/CHANGES usr/share/doc/@PRODUCT_NAME@@PACKAGE_SUFFIX@ +@DIR_PACKAGE@/INFO_SRC usr/share/doc/@PRODUCT_NAME@@PACKAGE_SUFFIX@ +@DIR_PACKAGE@/INFO_BIN usr/share/doc/@PRODUCT_NAME@@PACKAGE_SUFFIX@ diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/rules b/mysql-connector-j-8.0.31/src/build/misc/debian.in/rules new file mode 100644 index 0000000..693b5c5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/rules @@ -0,0 +1,77 @@ +#!/usr/bin/make -f +# Copyright (c) 2016, 2022, Oracle and/or its affiliates. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License, version 2.0, as published by the +# Free Software Foundation. +# +# This program is also distributed with certain software (including but not +# limited to OpenSSL) that is licensed under separate terms, as designated in a +# particular file or component or in included license documentation. The +# authors of MySQL hereby grant you an additional permission to link the +# program and your derivative works with the separately licensed software that +# they have included with MySQL. +# +# Without limiting anything contained in the foregoing, this file, which is +# part of MySQL Connector/J, is also subject to the Universal FOSS Exception, +# version 1.0, a copy of which can be found at +# http://oss.oracle.com/licenses/universal-foss-exception. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, +# for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +upstream_version := $(shell dpkg-parsechangelog | sed -n -e'/^Version: / { s/Version: //; s/-[^-]\+$$//; p }') +base_version = $(shell echo $(upstream_version) | sed -e's/r[0-9]\+$$//') + +ANT_COMMON_OPTIONS=\ + -Dcom.mysql.cj.build.dir.driver=build/driver \ + -Dcom.mysql.cj.extra.libs=@WITH_JARDEPS@ \ + -Dcom.mysql.cj.build.driver.version.status=@MYSQL_CJ_VERSION_STATUS@ \ + -Dcom.mysql.cj.build.driver.version.extra=@MYSQL_CJ_VERSION_EXTRA@ \ + -Dcom.mysql.cj.build.driver.version.snapshot=@MYSQL_CJ_VERSION_SNAPSHOT@ \ + -Dcom.mysql.cj.build.driver.extraName=@MYSQL_CJ_EXTRA_NAME@ \ + -Dcom.mysql.cj.dist.licenseUrl=@MYSQL_CJ_LICENSEURL@ \ + -Djava.awt.headless=true + +ifeq ($(ANT_HOME),) +ANT_CMD=ant +else +ANT_CMD=$(ANT_HOME)/bin/ant +endif + +ANT_OPTS=-Xmx512M + +ifneq ($(JAVA_HOME),) +ANT_JAVA_OPT=-Dcom.mysql.cj.build.jdk=$(JAVA_HOME) +endif + +ifneq ($(COMMERCIAL),) +ANT_COM_OPT=-Dcom.mysql.cj.build.commercial=true +endif + +%: + #dh $@ --with autoreconf + dh $@ + +override_dh_auto_configure: + +override_dh_auto_build: + echo $(PATH) + echo $(JAVA_HOME) + $(ANT_CMD) \ + $(ANT_COMMON_OPTIONS) \ + $(ANT_JAVA_OPT) \ + $(ANT_COM_OPT) \ + package-no-sources + +override_dh_auto_clean: + $(ANT_CMD) $(ANT_COMMON_OPTIONS) clean + +override_dh_installchangelogs: + dh_installchangelogs -XCHANGES diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/source/format b/mysql-connector-j-8.0.31/src/build/misc/debian.in/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/mysql-connector-j-8.0.31/src/build/misc/debian.in/watch b/mysql-connector-j-8.0.31/src/build/misc/debian.in/watch new file mode 100644 index 0000000..ee25517 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/debian.in/watch @@ -0,0 +1,2 @@ +version=3 +http://mysql.osuosl.org/Downloads/@PRODUCT_NAME@-(.+)\.tar\.gz diff --git a/mysql-connector-j-8.0.31/src/build/misc/pom-relocation.xml b/mysql-connector-j-8.0.31/src/build/misc/pom-relocation.xml new file mode 100644 index 0000000..bbff9fb --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/pom-relocation.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + mysql + @MYSQL_CJ_EXTENDED_PROD_NAME_RELOCATION@ + @MYSQL_CJ_VERSION@ + + + + com.mysql + @MYSQL_CJ_EXTENDED_PROD_NAME@ + MySQL Connector/J artifacts moved to reverse-DNS compliant Maven 2+ coordinates. + + + diff --git a/mysql-connector-j-8.0.31/src/build/misc/pom.xml b/mysql-connector-j-8.0.31/src/build/misc/pom.xml new file mode 100644 index 0000000..923772f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/pom.xml @@ -0,0 +1,74 @@ + + + + 4.0.0 + + com.mysql + @MYSQL_CJ_EXTENDED_PROD_NAME@ + @MYSQL_CJ_VERSION@ + jar + + MySQL Connector/J + JDBC Type 4 driver for MySQL. + http://dev.mysql.com/doc/connector-j/en/ + + + Oracle Corporation + http://www.oracle.com + + + + @MYSQL_CJ_LICENSE_NAME@ + repo + For detailed license information see the LICENSE file in this distribution. + + + + + scm:git:git@github.com:mysql/mysql-connector-j.git + https://github.com/mysql/mysql-connector-j + + + + + com.google.protobuf + protobuf-java + 3.19.4 + + + + com.oracle.oci.sdk + oci-java-sdk-common + 2.14.1 + true + + + diff --git a/mysql-connector-j-8.0.31/src/build/misc/rpm.spec.in b/mysql-connector-j-8.0.31/src/build/misc/rpm.spec.in new file mode 100644 index 0000000..565ee48 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/build/misc/rpm.spec.in @@ -0,0 +1,202 @@ +# Copyright (c) 2017, 2022, Oracle and/or its affiliates. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License, version 2.0, as published by the +# Free Software Foundation. +# +# This program is also distributed with certain software (including but not +# limited to OpenSSL) that is licensed under separate terms, as designated in a +# particular file or component or in included license documentation. The +# authors of MySQL hereby grant you an additional permission to link the +# program and your derivative works with the separately licensed software that +# they have included with MySQL. +# +# Without limiting anything contained in the foregoing, this file, which is +# part of MySQL Connector/J, is also subject to the Universal FOSS Exception, +# version 1.0, a copy of which can be found at +# http://oss.oracle.com/licenses/universal-foss-exception. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, +# for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +# You can pass these options to "rpmbuild" +# +# --define="commercial " +# --define="with_ant " +# --define="with_java " +# --define="with_jardeps " +# --define="with_docs " +# +# The 'with_docs' option should have a path that points out +# +# /en/html/connector-j.html +# /en/html/mvl.css (not really used) +# /en/pdf/connector-j.pdf +# /en/txt/connector-j.txt + +# Some linux distributions doesn't set the "dist" macro. There is a +# list how to identify dists here +# https://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto + +# SuSE will not set "dist", others do +%if 0%{?suse_version} == 1315 +%global dist .sles12 +%global sles12 1 +%endif + +%if 0%{?suse_version} == 1500 +%global dist .sl15 +%global sles15 1 +%endif + +%if 0%{?commercial:1} +%global lic_tag Commercial +%else +%global lic_tag GPLv2 +%endif + +Summary: Standardized MySQL database driver for Java +Name: @MYSQL_CJ_EXTENDED_PROD_NAME@@MYSQL_CJ_RPM_PACKAGE_SUFFIX@ +Version: @MYSQL_CJ_VERSION_NUMERIC@ +Release: @MYSQL_CJ_RPM_RELEASE_FULL@%{?dist} +Epoch: 1 +License: %{lic_tag} +Group: Development/Libraries +URL: http://dev.mysql.com/downloads/connector/j/ +Source0: https://cdn.mysql.com/Downloads/Connector-J/@MYSQL_CJ_FULL_PROD_NAME@.tar.gz + +BuildRoot: %{_tmppath}/%{name}-%{version}-build +BuildArch: noarch + +Obsoletes: mysql-connector-java@MYSQL_CJ_RPM_PACKAGE_SUFFIX@ < %{version}-%{release} +Provides: mysql-connector-java@MYSQL_CJ_RPM_PACKAGE_SUFFIX@ = %{version}-%{release} + +%if 0%{?commercial:1} +Obsoletes: mysql-connector-java < %{version}-%{release} +Provides: mysql-connector-java = %{version}-%{release} +Obsoletes: @MYSQL_CJ_EXTENDED_PROD_NAME@ < %{version}-%{release} +Provides: @MYSQL_CJ_EXTENDED_PROD_NAME@ = %{version}-%{release} +%endif + +%if 0%{!?with_ant:1} +BuildRequires: ant +%endif + +%if 0%{!?with_java:1} +BuildRequires: java-devel >= 1:1.8.0 +%endif + +%if 0%{?sles12:1} || 0%{?sles15:1} +Requires: java-headless >= 1.8.0 +%else +Requires: java-headless >= 1:1.8.0 +%endif + +%description +MySQL provides connectivity for client applications developed in the +Java programming language with @MYSQL_CJ_DISPLAY_PROD_NAME@, a driver that +implements the [Java Database Connectivity (JDBC) API] +(http://www.oracle.com/technetwork/java/javase/jdbc/). + +@MYSQL_CJ_DISPLAY_PROD_NAME@ @MYSQL_CJ_VERSION_SERIES@ is a JDBC Type 4 driver that is compatible with +the [JDBC 4.2](http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) +specification. The Type 4 designation means that the driver is a pure +Java implementation of the MySQL protocol and does not rely on the +MySQL client libraries. + +For detailed information please visit the official +[@MYSQL_CJ_DISPLAY_PROD_NAME@ documentation] +(http://dev.mysql.com/doc/connector-j/en/). + +%prep +%setup -q -n @MYSQL_CJ_FULL_PROD_NAME@ + +%build +COMMON_OPTIONS="\ + -Dcom.mysql.cj.build.dir.driver=build/driver + -Dcom.mysql.cj.extra.libs=%{with_jardeps} \ + -Dcom.mysql.cj.build.driver.version.status=@MYSQL_CJ_VERSION_STATUS@ \ + -Dcom.mysql.cj.build.driver.version.extra=@MYSQL_CJ_VERSION_EXTRA@ \ + -Dcom.mysql.cj.build.driver.version.snapshot=@MYSQL_CJ_VERSION_SNAPSHOT@ \ + -Dcom.mysql.cj.build.driver.extraName=@MYSQL_CJ_EXTRA_NAME@ \ + -Dcom.mysql.cj.dist.licenseUrl=@MYSQL_CJ_LICENSEURL@ \ + -Djava.awt.headless=true" + +%if 0%{?with_ant:1} +export ANT_HOME=%{with_ant} +export ANT_CMD="${ANT_HOME}/bin/ant" +%else +export ANT_CMD="ant" +%endif + +export ANT_OPTS=-Xmx512M + +%if 0%{?with_java:1} +export JAVA_HOME=%{with_java} +export PATH=${JAVA_HOME}/bin:$PATH +COMMON_OPTIONS="${COMMON_OPTIONS} -Dcom.mysql.cj.build.jdk=${JAVA_HOME}" +%endif + +%if 0%{?commercial:1} +COMMON_OPTIONS="${COMMON_OPTIONS} -Dcom.mysql.cj.build.commercial=true" +%endif + +# Get the file revision-info.properties again because it was excluded +# from SOURCES +cp %{_tmppath}/@MYSQL_CJ_FULL_PROD_NAME@/revision-info.properties . + +${ANT_CMD} \ + ${COMMON_OPTIONS} \ + package-no-sources + +# We use the 'package-no-sources' as there are changes done only +# when creating a package, 'build' is not enough. To make it a bit easier +# in the install step, we rename the directory with the content +mv @DIR_PACKAGE@ package-content + +# The 'package' target doesn't copy the HTML or PDF doc like 'dist', +# we copy it here +%if 0%{?with_docs:1} +mkdir -p package-content/docs +cp %{with_docs}/en/html/connector-j.html package-content/docs/ +cp %{with_docs}/en/html/mvl.css package-content/docs/ +cp %{with_docs}/en/pdf/connector-j.pdf package-content/docs/ +cp %{with_docs}/en/txt/connector-j.txt package-content/docs/ +%endif + +%install +install -d -m 0755 %{buildroot}%{_javadir} +install -p -m 0644 package-content/@MYSQL_CJ_FULL_PROD_NAME@.jar %{buildroot}%{_javadir}/%{name}.jar + +%clean +rm -rf %{buildroot} + +%files +%doc package-content/CHANGES +# EL6 doesn't like 'license' macro here, so we use 'doc' +%doc package-content/LICENSE +%doc package-content/README +%doc package-content/INFO_BIN +%doc package-content/INFO_SRC + +%if 0%{?with_docs:1} +# README.txt is a rename of "connector-j.txt" +%doc package-content/docs/connector-j.txt +%doc package-content/docs/connector-j.pdf +%doc package-content/docs/connector-j.html +%doc package-content/docs/mvl.css +%endif + +%{_javadir}/%{name}.jar + +%changelog +* Mon Nov 27 2017 MySQL Release Engineering - 8.0.9-1 +- Set more in "build.xml" +* Tue Mar 14 2017 MySQL Release Engineering - 6.0.7-1 +- initial package diff --git a/mysql-connector-j-8.0.31/src/demo/java/demo/x/devapi/DevApiSample.java b/mysql-connector-j-8.0.31/src/demo/java/demo/x/devapi/DevApiSample.java new file mode 100644 index 0000000..4ef89e7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/demo/java/demo/x/devapi/DevApiSample.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package demo.x.devapi; + +import com.mysql.cj.xdevapi.Collection; +import com.mysql.cj.xdevapi.DbDoc; +import com.mysql.cj.xdevapi.DbDocImpl; +import com.mysql.cj.xdevapi.DocResult; +import com.mysql.cj.xdevapi.JsonNumber; +import com.mysql.cj.xdevapi.JsonString; +import com.mysql.cj.xdevapi.Schema; +import com.mysql.cj.xdevapi.Session; +import com.mysql.cj.xdevapi.SessionFactory; + +/* + * Sample program showing how to use Connector/J's Dev API support. + */ +public class DevApiSample { + public static void main(String[] args) { + Session session = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password1234"); + System.err.println("Connected!"); + Schema schema = session.getDefaultSchema(); + System.err.println("Default schema is: " + schema); + + documentWalkthrough(schema); + } + + public static void documentWalkthrough(Schema schema) { + // document walthrough + Collection coll = schema.createCollection("myBooks", /* reuseExisting? */ true); + DbDoc newDoc = new DbDocImpl().add("isbn", new JsonString().setValue("12345")); + newDoc.add("title", new JsonString().setValue("Effi Briest")); + newDoc.add("author", new JsonString().setValue("Theodor Fontane")); + newDoc.add("currentlyReadingPage", new JsonNumber().setValue(String.valueOf(42))); + coll.add(newDoc).execute(); + + // note: "$" prefix for document paths is optional. "$.title.somethingElse[0]" is the same as "title.somethingElse[0]" in document expressions + DocResult docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute(); + DbDoc book = docs.next(); + System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page " + + ((JsonNumber) book.get("currentlyReadingPage")).getInteger()); + + // increment the page number and fetch it again + coll.modify("$.isbn = 12345").set("$.currentlyReadingPage", ((JsonNumber) book.get("currentlyReadingPage")).getInteger() + 1).execute(); + + docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute(); + book = docs.next(); + System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page " + + ((JsonNumber) book.get("currentlyReadingPage")).getInteger()); + + // remove the doc + coll.remove("true").execute(); + System.err.println("Number of books in collection: " + coll.count()); + + schema.dropCollection(coll.getName()); + } +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/Mysqlx.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/Mysqlx.java new file mode 100644 index 0000000..a5fd4ac --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/Mysqlx.java @@ -0,0 +1,3431 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx.proto + +public final class Mysqlx { + private Mysqlx() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ClientMessagesOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.ClientMessages) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *IDs of messages that can be sent from client to the server.
    +   *@note
    +   *This message is never sent on the wire. It is only used to let ``protoc``:
    +   *-  generate constants
    +   *-  check for uniqueness
    +   * 
    + * + * Protobuf type {@code Mysqlx.ClientMessages} + */ + public static final class ClientMessages extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.ClientMessages) + ClientMessagesOrBuilder { + private static final long serialVersionUID = 0L; + // Use ClientMessages.newBuilder() to construct. + private ClientMessages(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ClientMessages() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ClientMessages(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ClientMessages( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ClientMessages_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ClientMessages_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.class, com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.ClientMessages.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * CON_CAPABILITIES_GET = 1; + */ + CON_CAPABILITIES_GET(1), + /** + * CON_CAPABILITIES_SET = 2; + */ + CON_CAPABILITIES_SET(2), + /** + * CON_CLOSE = 3; + */ + CON_CLOSE(3), + /** + * SESS_AUTHENTICATE_START = 4; + */ + SESS_AUTHENTICATE_START(4), + /** + * SESS_AUTHENTICATE_CONTINUE = 5; + */ + SESS_AUTHENTICATE_CONTINUE(5), + /** + * SESS_RESET = 6; + */ + SESS_RESET(6), + /** + * SESS_CLOSE = 7; + */ + SESS_CLOSE(7), + /** + * SQL_STMT_EXECUTE = 12; + */ + SQL_STMT_EXECUTE(12), + /** + * CRUD_FIND = 17; + */ + CRUD_FIND(17), + /** + * CRUD_INSERT = 18; + */ + CRUD_INSERT(18), + /** + * CRUD_UPDATE = 19; + */ + CRUD_UPDATE(19), + /** + * CRUD_DELETE = 20; + */ + CRUD_DELETE(20), + /** + * EXPECT_OPEN = 24; + */ + EXPECT_OPEN(24), + /** + * EXPECT_CLOSE = 25; + */ + EXPECT_CLOSE(25), + /** + * CRUD_CREATE_VIEW = 30; + */ + CRUD_CREATE_VIEW(30), + /** + * CRUD_MODIFY_VIEW = 31; + */ + CRUD_MODIFY_VIEW(31), + /** + * CRUD_DROP_VIEW = 32; + */ + CRUD_DROP_VIEW(32), + /** + * PREPARE_PREPARE = 40; + */ + PREPARE_PREPARE(40), + /** + * PREPARE_EXECUTE = 41; + */ + PREPARE_EXECUTE(41), + /** + * PREPARE_DEALLOCATE = 42; + */ + PREPARE_DEALLOCATE(42), + /** + * CURSOR_OPEN = 43; + */ + CURSOR_OPEN(43), + /** + * CURSOR_CLOSE = 44; + */ + CURSOR_CLOSE(44), + /** + * CURSOR_FETCH = 45; + */ + CURSOR_FETCH(45), + /** + * COMPRESSION = 46; + */ + COMPRESSION(46), + ; + + /** + * CON_CAPABILITIES_GET = 1; + */ + public static final int CON_CAPABILITIES_GET_VALUE = 1; + /** + * CON_CAPABILITIES_SET = 2; + */ + public static final int CON_CAPABILITIES_SET_VALUE = 2; + /** + * CON_CLOSE = 3; + */ + public static final int CON_CLOSE_VALUE = 3; + /** + * SESS_AUTHENTICATE_START = 4; + */ + public static final int SESS_AUTHENTICATE_START_VALUE = 4; + /** + * SESS_AUTHENTICATE_CONTINUE = 5; + */ + public static final int SESS_AUTHENTICATE_CONTINUE_VALUE = 5; + /** + * SESS_RESET = 6; + */ + public static final int SESS_RESET_VALUE = 6; + /** + * SESS_CLOSE = 7; + */ + public static final int SESS_CLOSE_VALUE = 7; + /** + * SQL_STMT_EXECUTE = 12; + */ + public static final int SQL_STMT_EXECUTE_VALUE = 12; + /** + * CRUD_FIND = 17; + */ + public static final int CRUD_FIND_VALUE = 17; + /** + * CRUD_INSERT = 18; + */ + public static final int CRUD_INSERT_VALUE = 18; + /** + * CRUD_UPDATE = 19; + */ + public static final int CRUD_UPDATE_VALUE = 19; + /** + * CRUD_DELETE = 20; + */ + public static final int CRUD_DELETE_VALUE = 20; + /** + * EXPECT_OPEN = 24; + */ + public static final int EXPECT_OPEN_VALUE = 24; + /** + * EXPECT_CLOSE = 25; + */ + public static final int EXPECT_CLOSE_VALUE = 25; + /** + * CRUD_CREATE_VIEW = 30; + */ + public static final int CRUD_CREATE_VIEW_VALUE = 30; + /** + * CRUD_MODIFY_VIEW = 31; + */ + public static final int CRUD_MODIFY_VIEW_VALUE = 31; + /** + * CRUD_DROP_VIEW = 32; + */ + public static final int CRUD_DROP_VIEW_VALUE = 32; + /** + * PREPARE_PREPARE = 40; + */ + public static final int PREPARE_PREPARE_VALUE = 40; + /** + * PREPARE_EXECUTE = 41; + */ + public static final int PREPARE_EXECUTE_VALUE = 41; + /** + * PREPARE_DEALLOCATE = 42; + */ + public static final int PREPARE_DEALLOCATE_VALUE = 42; + /** + * CURSOR_OPEN = 43; + */ + public static final int CURSOR_OPEN_VALUE = 43; + /** + * CURSOR_CLOSE = 44; + */ + public static final int CURSOR_CLOSE_VALUE = 44; + /** + * CURSOR_FETCH = 45; + */ + public static final int CURSOR_FETCH_VALUE = 45; + /** + * COMPRESSION = 46; + */ + public static final int COMPRESSION_VALUE = 46; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return CON_CAPABILITIES_GET; + case 2: return CON_CAPABILITIES_SET; + case 3: return CON_CLOSE; + case 4: return SESS_AUTHENTICATE_START; + case 5: return SESS_AUTHENTICATE_CONTINUE; + case 6: return SESS_RESET; + case 7: return SESS_CLOSE; + case 12: return SQL_STMT_EXECUTE; + case 17: return CRUD_FIND; + case 18: return CRUD_INSERT; + case 19: return CRUD_UPDATE; + case 20: return CRUD_DELETE; + case 24: return EXPECT_OPEN; + case 25: return EXPECT_CLOSE; + case 30: return CRUD_CREATE_VIEW; + case 31: return CRUD_MODIFY_VIEW; + case 32: return CRUD_DROP_VIEW; + case 40: return PREPARE_PREPARE; + case 41: return PREPARE_EXECUTE; + case 42: return PREPARE_DEALLOCATE; + case 43: return CURSOR_OPEN; + case 44: return CURSOR_CLOSE; + case 45: return CURSOR_FETCH; + case 46: return COMPRESSION; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.ClientMessages.Type) + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.Mysqlx.ClientMessages)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages other = (com.mysql.cj.x.protobuf.Mysqlx.ClientMessages) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.Mysqlx.ClientMessages prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *IDs of messages that can be sent from client to the server.
    +     *@note
    +     *This message is never sent on the wire. It is only used to let ``protoc``:
    +     *-  generate constants
    +     *-  check for uniqueness
    +     * 
    + * + * Protobuf type {@code Mysqlx.ClientMessages} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.ClientMessages) + com.mysql.cj.x.protobuf.Mysqlx.ClientMessagesOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ClientMessages_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ClientMessages_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.class, com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ClientMessages_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages build() { + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages buildPartial() { + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages result = new com.mysql.cj.x.protobuf.Mysqlx.ClientMessages(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.Mysqlx.ClientMessages) { + return mergeFrom((com.mysql.cj.x.protobuf.Mysqlx.ClientMessages)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.Mysqlx.ClientMessages other) { + if (other == com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.Mysqlx.ClientMessages) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.ClientMessages) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.ClientMessages) + private static final com.mysql.cj.x.protobuf.Mysqlx.ClientMessages DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.Mysqlx.ClientMessages(); + } + + public static com.mysql.cj.x.protobuf.Mysqlx.ClientMessages getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ClientMessages parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ClientMessages(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ServerMessagesOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.ServerMessages) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *IDs of messages that can be sent from server to client.
    +   *@note
    +   *This message is never sent on the wire. It is only used to let ``protoc``:
    +   *-  generate constants
    +   *-  check for uniqueness
    +   * 
    + * + * Protobuf type {@code Mysqlx.ServerMessages} + */ + public static final class ServerMessages extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.ServerMessages) + ServerMessagesOrBuilder { + private static final long serialVersionUID = 0L; + // Use ServerMessages.newBuilder() to construct. + private ServerMessages(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ServerMessages() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ServerMessages(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ServerMessages( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ServerMessages_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ServerMessages_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.class, com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.ServerMessages.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * OK = 0; + */ + OK(0), + /** + * ERROR = 1; + */ + ERROR(1), + /** + * CONN_CAPABILITIES = 2; + */ + CONN_CAPABILITIES(2), + /** + * SESS_AUTHENTICATE_CONTINUE = 3; + */ + SESS_AUTHENTICATE_CONTINUE(3), + /** + * SESS_AUTHENTICATE_OK = 4; + */ + SESS_AUTHENTICATE_OK(4), + /** + *
    +       * NOTICE has to stay at 11 forever
    +       * 
    + * + * NOTICE = 11; + */ + NOTICE(11), + /** + * RESULTSET_COLUMN_META_DATA = 12; + */ + RESULTSET_COLUMN_META_DATA(12), + /** + * RESULTSET_ROW = 13; + */ + RESULTSET_ROW(13), + /** + * RESULTSET_FETCH_DONE = 14; + */ + RESULTSET_FETCH_DONE(14), + /** + * RESULTSET_FETCH_SUSPENDED = 15; + */ + RESULTSET_FETCH_SUSPENDED(15), + /** + * RESULTSET_FETCH_DONE_MORE_RESULTSETS = 16; + */ + RESULTSET_FETCH_DONE_MORE_RESULTSETS(16), + /** + * SQL_STMT_EXECUTE_OK = 17; + */ + SQL_STMT_EXECUTE_OK(17), + /** + * RESULTSET_FETCH_DONE_MORE_OUT_PARAMS = 18; + */ + RESULTSET_FETCH_DONE_MORE_OUT_PARAMS(18), + /** + * COMPRESSION = 19; + */ + COMPRESSION(19), + ; + + /** + * OK = 0; + */ + public static final int OK_VALUE = 0; + /** + * ERROR = 1; + */ + public static final int ERROR_VALUE = 1; + /** + * CONN_CAPABILITIES = 2; + */ + public static final int CONN_CAPABILITIES_VALUE = 2; + /** + * SESS_AUTHENTICATE_CONTINUE = 3; + */ + public static final int SESS_AUTHENTICATE_CONTINUE_VALUE = 3; + /** + * SESS_AUTHENTICATE_OK = 4; + */ + public static final int SESS_AUTHENTICATE_OK_VALUE = 4; + /** + *
    +       * NOTICE has to stay at 11 forever
    +       * 
    + * + * NOTICE = 11; + */ + public static final int NOTICE_VALUE = 11; + /** + * RESULTSET_COLUMN_META_DATA = 12; + */ + public static final int RESULTSET_COLUMN_META_DATA_VALUE = 12; + /** + * RESULTSET_ROW = 13; + */ + public static final int RESULTSET_ROW_VALUE = 13; + /** + * RESULTSET_FETCH_DONE = 14; + */ + public static final int RESULTSET_FETCH_DONE_VALUE = 14; + /** + * RESULTSET_FETCH_SUSPENDED = 15; + */ + public static final int RESULTSET_FETCH_SUSPENDED_VALUE = 15; + /** + * RESULTSET_FETCH_DONE_MORE_RESULTSETS = 16; + */ + public static final int RESULTSET_FETCH_DONE_MORE_RESULTSETS_VALUE = 16; + /** + * SQL_STMT_EXECUTE_OK = 17; + */ + public static final int SQL_STMT_EXECUTE_OK_VALUE = 17; + /** + * RESULTSET_FETCH_DONE_MORE_OUT_PARAMS = 18; + */ + public static final int RESULTSET_FETCH_DONE_MORE_OUT_PARAMS_VALUE = 18; + /** + * COMPRESSION = 19; + */ + public static final int COMPRESSION_VALUE = 19; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 0: return OK; + case 1: return ERROR; + case 2: return CONN_CAPABILITIES; + case 3: return SESS_AUTHENTICATE_CONTINUE; + case 4: return SESS_AUTHENTICATE_OK; + case 11: return NOTICE; + case 12: return RESULTSET_COLUMN_META_DATA; + case 13: return RESULTSET_ROW; + case 14: return RESULTSET_FETCH_DONE; + case 15: return RESULTSET_FETCH_SUSPENDED; + case 16: return RESULTSET_FETCH_DONE_MORE_RESULTSETS; + case 17: return SQL_STMT_EXECUTE_OK; + case 18: return RESULTSET_FETCH_DONE_MORE_OUT_PARAMS; + case 19: return COMPRESSION; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.ServerMessages.Type) + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.Mysqlx.ServerMessages)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages other = (com.mysql.cj.x.protobuf.Mysqlx.ServerMessages) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.Mysqlx.ServerMessages prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *IDs of messages that can be sent from server to client.
    +     *@note
    +     *This message is never sent on the wire. It is only used to let ``protoc``:
    +     *-  generate constants
    +     *-  check for uniqueness
    +     * 
    + * + * Protobuf type {@code Mysqlx.ServerMessages} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.ServerMessages) + com.mysql.cj.x.protobuf.Mysqlx.ServerMessagesOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ServerMessages_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ServerMessages_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.class, com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_ServerMessages_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages build() { + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages buildPartial() { + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages result = new com.mysql.cj.x.protobuf.Mysqlx.ServerMessages(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.Mysqlx.ServerMessages) { + return mergeFrom((com.mysql.cj.x.protobuf.Mysqlx.ServerMessages)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.Mysqlx.ServerMessages other) { + if (other == com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.Mysqlx.ServerMessages) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.ServerMessages) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.ServerMessages) + private static final com.mysql.cj.x.protobuf.Mysqlx.ServerMessages DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.Mysqlx.ServerMessages(); + } + + public static com.mysql.cj.x.protobuf.Mysqlx.ServerMessages getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ServerMessages parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ServerMessages(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface OkOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Ok) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string msg = 1; + * @return Whether the msg field is set. + */ + boolean hasMsg(); + /** + * optional string msg = 1; + * @return The msg. + */ + java.lang.String getMsg(); + /** + * optional string msg = 1; + * @return The bytes for msg. + */ + com.google.protobuf.ByteString + getMsgBytes(); + } + /** + * Protobuf type {@code Mysqlx.Ok} + */ + public static final class Ok extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Ok) + OkOrBuilder { + private static final long serialVersionUID = 0L; + // Use Ok.newBuilder() to construct. + private Ok(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Ok() { + msg_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Ok(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Ok( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + msg_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Ok_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Ok_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.Ok.class, com.mysql.cj.x.protobuf.Mysqlx.Ok.Builder.class); + } + + private int bitField0_; + public static final int MSG_FIELD_NUMBER = 1; + private volatile java.lang.Object msg_; + /** + * optional string msg = 1; + * @return Whether the msg field is set. + */ + @java.lang.Override + public boolean hasMsg() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional string msg = 1; + * @return The msg. + */ + @java.lang.Override + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } + } + /** + * optional string msg = 1; + * @return The bytes for msg. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, msg_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, msg_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.Mysqlx.Ok)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.Mysqlx.Ok other = (com.mysql.cj.x.protobuf.Mysqlx.Ok) obj; + + if (hasMsg() != other.hasMsg()) return false; + if (hasMsg()) { + if (!getMsg() + .equals(other.getMsg())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasMsg()) { + hash = (37 * hash) + MSG_FIELD_NUMBER; + hash = (53 * hash) + getMsg().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Ok parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.Mysqlx.Ok prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Ok} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Ok) + com.mysql.cj.x.protobuf.Mysqlx.OkOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Ok_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Ok_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.Ok.class, com.mysql.cj.x.protobuf.Mysqlx.Ok.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.Mysqlx.Ok.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + msg_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Ok_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Ok getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.Mysqlx.Ok.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Ok build() { + com.mysql.cj.x.protobuf.Mysqlx.Ok result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Ok buildPartial() { + com.mysql.cj.x.protobuf.Mysqlx.Ok result = new com.mysql.cj.x.protobuf.Mysqlx.Ok(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.msg_ = msg_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.Mysqlx.Ok) { + return mergeFrom((com.mysql.cj.x.protobuf.Mysqlx.Ok)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.Mysqlx.Ok other) { + if (other == com.mysql.cj.x.protobuf.Mysqlx.Ok.getDefaultInstance()) return this; + if (other.hasMsg()) { + bitField0_ |= 0x00000001; + msg_ = other.msg_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.Mysqlx.Ok parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.Mysqlx.Ok) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object msg_ = ""; + /** + * optional string msg = 1; + * @return Whether the msg field is set. + */ + public boolean hasMsg() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional string msg = 1; + * @return The msg. + */ + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string msg = 1; + * @return The bytes for msg. + */ + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string msg = 1; + * @param value The msg to set. + * @return This builder for chaining. + */ + public Builder setMsg( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + msg_ = value; + onChanged(); + return this; + } + /** + * optional string msg = 1; + * @return This builder for chaining. + */ + public Builder clearMsg() { + bitField0_ = (bitField0_ & ~0x00000001); + msg_ = getDefaultInstance().getMsg(); + onChanged(); + return this; + } + /** + * optional string msg = 1; + * @param value The bytes for msg to set. + * @return This builder for chaining. + */ + public Builder setMsgBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + msg_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Ok) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Ok) + private static final com.mysql.cj.x.protobuf.Mysqlx.Ok DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.Mysqlx.Ok(); + } + + public static com.mysql.cj.x.protobuf.Mysqlx.Ok getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Ok parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Ok(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Ok getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ErrorOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Error) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** severity of the error message 
    +     * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return Whether the severity field is set. + */ + boolean hasSeverity(); + /** + *
    +     ** severity of the error message 
    +     * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return The severity. + */ + com.mysql.cj.x.protobuf.Mysqlx.Error.Severity getSeverity(); + + /** + *
    +     ** error code 
    +     * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + boolean hasCode(); + /** + *
    +     ** error code 
    +     * 
    + * + * required uint32 code = 2; + * @return The code. + */ + int getCode(); + + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return Whether the sqlState field is set. + */ + boolean hasSqlState(); + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return The sqlState. + */ + java.lang.String getSqlState(); + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return The bytes for sqlState. + */ + com.google.protobuf.ByteString + getSqlStateBytes(); + + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + boolean hasMsg(); + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return The msg. + */ + java.lang.String getMsg(); + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + com.google.protobuf.ByteString + getMsgBytes(); + } + /** + * Protobuf type {@code Mysqlx.Error} + */ + public static final class Error extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Error) + ErrorOrBuilder { + private static final long serialVersionUID = 0L; + // Use Error.newBuilder() to construct. + private Error(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Error() { + severity_ = 0; + sqlState_ = ""; + msg_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Error(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Error( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.Error.Severity value = com.mysql.cj.x.protobuf.Mysqlx.Error.Severity.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + severity_ = rawValue; + } + break; + } + case 16: { + bitField0_ |= 0x00000002; + code_ = input.readUInt32(); + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000008; + msg_ = bs; + break; + } + case 34: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + sqlState_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Error_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Error_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.Error.class, com.mysql.cj.x.protobuf.Mysqlx.Error.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Error.Severity} + */ + public enum Severity + implements com.google.protobuf.ProtocolMessageEnum { + /** + * ERROR = 0; + */ + ERROR(0), + /** + * FATAL = 1; + */ + FATAL(1), + ; + + /** + * ERROR = 0; + */ + public static final int ERROR_VALUE = 0; + /** + * FATAL = 1; + */ + public static final int FATAL_VALUE = 1; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Severity valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Severity forNumber(int value) { + switch (value) { + case 0: return ERROR; + case 1: return FATAL; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Severity> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Severity findValueByNumber(int number) { + return Severity.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.Error.getDescriptor().getEnumTypes().get(0); + } + + private static final Severity[] VALUES = values(); + + public static Severity valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Severity(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Error.Severity) + } + + private int bitField0_; + public static final int SEVERITY_FIELD_NUMBER = 1; + private int severity_; + /** + *
    +     ** severity of the error message 
    +     * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return Whether the severity field is set. + */ + @java.lang.Override public boolean hasSeverity() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** severity of the error message 
    +     * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return The severity. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.Mysqlx.Error.Severity getSeverity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.Error.Severity result = com.mysql.cj.x.protobuf.Mysqlx.Error.Severity.valueOf(severity_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.Error.Severity.ERROR : result; + } + + public static final int CODE_FIELD_NUMBER = 2; + private int code_; + /** + *
    +     ** error code 
    +     * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + @java.lang.Override + public boolean hasCode() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** error code 
    +     * 
    + * + * required uint32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + + public static final int SQL_STATE_FIELD_NUMBER = 4; + private volatile java.lang.Object sqlState_; + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return Whether the sqlState field is set. + */ + @java.lang.Override + public boolean hasSqlState() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return The sqlState. + */ + @java.lang.Override + public java.lang.String getSqlState() { + java.lang.Object ref = sqlState_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sqlState_ = s; + } + return s; + } + } + /** + *
    +     ** SQL state 
    +     * 
    + * + * required string sql_state = 4; + * @return The bytes for sqlState. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSqlStateBytes() { + java.lang.Object ref = sqlState_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sqlState_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MSG_FIELD_NUMBER = 3; + private volatile java.lang.Object msg_; + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + @java.lang.Override + public boolean hasMsg() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return The msg. + */ + @java.lang.Override + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } + } + /** + *
    +     ** human-readable error message 
    +     * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCode()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasSqlState()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasMsg()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, severity_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt32(2, code_); + } + if (((bitField0_ & 0x00000008) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, msg_); + } + if (((bitField0_ & 0x00000004) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, sqlState_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, severity_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, code_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, msg_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, sqlState_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.Mysqlx.Error)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.Mysqlx.Error other = (com.mysql.cj.x.protobuf.Mysqlx.Error) obj; + + if (hasSeverity() != other.hasSeverity()) return false; + if (hasSeverity()) { + if (severity_ != other.severity_) return false; + } + if (hasCode() != other.hasCode()) return false; + if (hasCode()) { + if (getCode() + != other.getCode()) return false; + } + if (hasSqlState() != other.hasSqlState()) return false; + if (hasSqlState()) { + if (!getSqlState() + .equals(other.getSqlState())) return false; + } + if (hasMsg() != other.hasMsg()) return false; + if (hasMsg()) { + if (!getMsg() + .equals(other.getMsg())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSeverity()) { + hash = (37 * hash) + SEVERITY_FIELD_NUMBER; + hash = (53 * hash) + severity_; + } + if (hasCode()) { + hash = (37 * hash) + CODE_FIELD_NUMBER; + hash = (53 * hash) + getCode(); + } + if (hasSqlState()) { + hash = (37 * hash) + SQL_STATE_FIELD_NUMBER; + hash = (53 * hash) + getSqlState().hashCode(); + } + if (hasMsg()) { + hash = (37 * hash) + MSG_FIELD_NUMBER; + hash = (53 * hash) + getMsg().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.Mysqlx.Error parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.Mysqlx.Error prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Error} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Error) + com.mysql.cj.x.protobuf.Mysqlx.ErrorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Error_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Error_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.Mysqlx.Error.class, com.mysql.cj.x.protobuf.Mysqlx.Error.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.Mysqlx.Error.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + severity_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + code_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + sqlState_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + msg_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.Mysqlx.internal_static_Mysqlx_Error_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Error getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.Mysqlx.Error.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Error build() { + com.mysql.cj.x.protobuf.Mysqlx.Error result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Error buildPartial() { + com.mysql.cj.x.protobuf.Mysqlx.Error result = new com.mysql.cj.x.protobuf.Mysqlx.Error(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.severity_ = severity_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.code_ = code_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.sqlState_ = sqlState_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000008; + } + result.msg_ = msg_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.Mysqlx.Error) { + return mergeFrom((com.mysql.cj.x.protobuf.Mysqlx.Error)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.Mysqlx.Error other) { + if (other == com.mysql.cj.x.protobuf.Mysqlx.Error.getDefaultInstance()) return this; + if (other.hasSeverity()) { + setSeverity(other.getSeverity()); + } + if (other.hasCode()) { + setCode(other.getCode()); + } + if (other.hasSqlState()) { + bitField0_ |= 0x00000004; + sqlState_ = other.sqlState_; + onChanged(); + } + if (other.hasMsg()) { + bitField0_ |= 0x00000008; + msg_ = other.msg_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCode()) { + return false; + } + if (!hasSqlState()) { + return false; + } + if (!hasMsg()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.Mysqlx.Error parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.Mysqlx.Error) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int severity_ = 0; + /** + *
    +       ** severity of the error message 
    +       * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return Whether the severity field is set. + */ + @java.lang.Override public boolean hasSeverity() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** severity of the error message 
    +       * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return The severity. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Error.Severity getSeverity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.Error.Severity result = com.mysql.cj.x.protobuf.Mysqlx.Error.Severity.valueOf(severity_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.Error.Severity.ERROR : result; + } + /** + *
    +       ** severity of the error message 
    +       * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @param value The severity to set. + * @return This builder for chaining. + */ + public Builder setSeverity(com.mysql.cj.x.protobuf.Mysqlx.Error.Severity value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + severity_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** severity of the error message 
    +       * 
    + * + * optional .Mysqlx.Error.Severity severity = 1 [default = ERROR]; + * @return This builder for chaining. + */ + public Builder clearSeverity() { + bitField0_ = (bitField0_ & ~0x00000001); + severity_ = 0; + onChanged(); + return this; + } + + private int code_ ; + /** + *
    +       ** error code 
    +       * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + @java.lang.Override + public boolean hasCode() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** error code 
    +       * 
    + * + * required uint32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + /** + *
    +       ** error code 
    +       * 
    + * + * required uint32 code = 2; + * @param value The code to set. + * @return This builder for chaining. + */ + public Builder setCode(int value) { + bitField0_ |= 0x00000002; + code_ = value; + onChanged(); + return this; + } + /** + *
    +       ** error code 
    +       * 
    + * + * required uint32 code = 2; + * @return This builder for chaining. + */ + public Builder clearCode() { + bitField0_ = (bitField0_ & ~0x00000002); + code_ = 0; + onChanged(); + return this; + } + + private java.lang.Object sqlState_ = ""; + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @return Whether the sqlState field is set. + */ + public boolean hasSqlState() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @return The sqlState. + */ + public java.lang.String getSqlState() { + java.lang.Object ref = sqlState_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sqlState_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @return The bytes for sqlState. + */ + public com.google.protobuf.ByteString + getSqlStateBytes() { + java.lang.Object ref = sqlState_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sqlState_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @param value The sqlState to set. + * @return This builder for chaining. + */ + public Builder setSqlState( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + sqlState_ = value; + onChanged(); + return this; + } + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @return This builder for chaining. + */ + public Builder clearSqlState() { + bitField0_ = (bitField0_ & ~0x00000004); + sqlState_ = getDefaultInstance().getSqlState(); + onChanged(); + return this; + } + /** + *
    +       ** SQL state 
    +       * 
    + * + * required string sql_state = 4; + * @param value The bytes for sqlState to set. + * @return This builder for chaining. + */ + public Builder setSqlStateBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + sqlState_ = value; + onChanged(); + return this; + } + + private java.lang.Object msg_ = ""; + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + public boolean hasMsg() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @return The msg. + */ + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @param value The msg to set. + * @return This builder for chaining. + */ + public Builder setMsg( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + msg_ = value; + onChanged(); + return this; + } + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @return This builder for chaining. + */ + public Builder clearMsg() { + bitField0_ = (bitField0_ & ~0x00000008); + msg_ = getDefaultInstance().getMsg(); + onChanged(); + return this; + } + /** + *
    +       ** human-readable error message 
    +       * 
    + * + * required string msg = 3; + * @param value The bytes for msg to set. + * @return This builder for chaining. + */ + public Builder setMsgBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + msg_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Error) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Error) + private static final com.mysql.cj.x.protobuf.Mysqlx.Error DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.Mysqlx.Error(); + } + + public static com.mysql.cj.x.protobuf.Mysqlx.Error getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Error parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Error(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.Error getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int CLIENT_MESSAGE_ID_FIELD_NUMBER = 100001; + /** + * extend .google.protobuf.MessageOptions { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + com.google.protobuf.DescriptorProtos.MessageOptions, + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type> clientMessageId = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.class, + null); + public static final int SERVER_MESSAGE_ID_FIELD_NUMBER = 100002; + /** + * extend .google.protobuf.MessageOptions { ... } + */ + public static final + com.google.protobuf.GeneratedMessage.GeneratedExtension< + com.google.protobuf.DescriptorProtos.MessageOptions, + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type> serverMessageId = com.google.protobuf.GeneratedMessage + .newFileScopedGeneratedExtension( + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.class, + null); + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_ClientMessages_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_ClientMessages_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_ServerMessages_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_ServerMessages_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Ok_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Ok_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Error_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Error_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\014mysqlx.proto\022\006Mysqlx\032 google/protobuf/" + + "descriptor.proto\"\374\003\n\016ClientMessages\"\351\003\n\004" + + "Type\022\030\n\024CON_CAPABILITIES_GET\020\001\022\030\n\024CON_CA" + + "PABILITIES_SET\020\002\022\r\n\tCON_CLOSE\020\003\022\033\n\027SESS_" + + "AUTHENTICATE_START\020\004\022\036\n\032SESS_AUTHENTICAT" + + "E_CONTINUE\020\005\022\016\n\nSESS_RESET\020\006\022\016\n\nSESS_CLO" + + "SE\020\007\022\024\n\020SQL_STMT_EXECUTE\020\014\022\r\n\tCRUD_FIND\020" + + "\021\022\017\n\013CRUD_INSERT\020\022\022\017\n\013CRUD_UPDATE\020\023\022\017\n\013C" + + "RUD_DELETE\020\024\022\017\n\013EXPECT_OPEN\020\030\022\020\n\014EXPECT_" + + "CLOSE\020\031\022\024\n\020CRUD_CREATE_VIEW\020\036\022\024\n\020CRUD_MO" + + "DIFY_VIEW\020\037\022\022\n\016CRUD_DROP_VIEW\020 \022\023\n\017PREPA" + + "RE_PREPARE\020(\022\023\n\017PREPARE_EXECUTE\020)\022\026\n\022PRE" + + "PARE_DEALLOCATE\020*\022\017\n\013CURSOR_OPEN\020+\022\020\n\014CU" + + "RSOR_CLOSE\020,\022\020\n\014CURSOR_FETCH\020-\022\017\n\013COMPRE" + + "SSION\020.\"\363\002\n\016ServerMessages\"\340\002\n\004Type\022\006\n\002O" + + "K\020\000\022\t\n\005ERROR\020\001\022\025\n\021CONN_CAPABILITIES\020\002\022\036\n" + + "\032SESS_AUTHENTICATE_CONTINUE\020\003\022\030\n\024SESS_AU" + + "THENTICATE_OK\020\004\022\n\n\006NOTICE\020\013\022\036\n\032RESULTSET" + + "_COLUMN_META_DATA\020\014\022\021\n\rRESULTSET_ROW\020\r\022\030" + + "\n\024RESULTSET_FETCH_DONE\020\016\022\035\n\031RESULTSET_FE" + + "TCH_SUSPENDED\020\017\022(\n$RESULTSET_FETCH_DONE_" + + "MORE_RESULTSETS\020\020\022\027\n\023SQL_STMT_EXECUTE_OK" + + "\020\021\022(\n$RESULTSET_FETCH_DONE_MORE_OUT_PARA" + + "MS\020\022\022\017\n\013COMPRESSION\020\023\"\027\n\002Ok\022\013\n\003msg\030\001 \001(\t" + + ":\004\220\3520\000\"\216\001\n\005Error\022/\n\010severity\030\001 \001(\0162\026.Mys" + + "qlx.Error.Severity:\005ERROR\022\014\n\004code\030\002 \002(\r\022" + + "\021\n\tsql_state\030\004 \002(\t\022\013\n\003msg\030\003 \002(\t\" \n\010Sever" + + "ity\022\t\n\005ERROR\020\000\022\t\n\005FATAL\020\001:\004\220\3520\001:Y\n\021clien" + + "t_message_id\022\037.google.protobuf.MessageOp" + + "tions\030\241\215\006 \001(\0162\033.Mysqlx.ClientMessages.Ty" + + "pe:Y\n\021server_message_id\022\037.google.protobu" + + "f.MessageOptions\030\242\215\006 \001(\0162\033.Mysqlx.Server" + + "Messages.TypeB\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.google.protobuf.DescriptorProtos.getDescriptor(), + }); + internal_static_Mysqlx_ClientMessages_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_ClientMessages_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_ClientMessages_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_ServerMessages_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_ServerMessages_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_ServerMessages_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Ok_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Ok_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Ok_descriptor, + new java.lang.String[] { "Msg", }); + internal_static_Mysqlx_Error_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Error_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Error_descriptor, + new java.lang.String[] { "Severity", "Code", "SqlState", "Msg", }); + clientMessageId.internalInit(descriptor.getExtensions().get(0)); + serverMessageId.internalInit(descriptor.getExtensions().get(1)); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.google.protobuf.DescriptorProtos.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxConnection.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxConnection.java new file mode 100644 index 0000000..e5248d9 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxConnection.java @@ -0,0 +1,4199 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_connection.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxConnection { + private MysqlxConnection() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface CapabilityOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.Capability) + com.google.protobuf.MessageOrBuilder { + + /** + * required string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + * required string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + * required string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue(); + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder(); + } + /** + *
    +   **
    +   *Capability
    +   *A tuple of a ``name`` and a @ref Mysqlx::Datatypes::Any
    +   * 
    + * + * Protobuf type {@code Mysqlx.Connection.Capability} + */ + public static final class Capability extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.Capability) + CapabilityOrBuilder { + private static final long serialVersionUID = 0L; + // Use Capability.newBuilder() to construct. + private Capability(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Capability() { + name_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Capability(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Capability( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = value_.toBuilder(); + } + value_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(value_); + value_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capability_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capability_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Capability.class, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value_; + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasValue()) { + memoizedIsInitialized = 0; + return false; + } + if (!getValue().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getValue()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getValue()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Capability)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.Capability other = (com.mysql.cj.x.protobuf.MysqlxConnection.Capability) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.Capability prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Capability
    +     *A tuple of a ``name`` and a @ref Mysqlx::Datatypes::Any
    +     * 
    + * + * Protobuf type {@code Mysqlx.Connection.Capability} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.Capability) + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capability_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capability_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Capability.class, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.Capability.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (valueBuilder_ == null) { + value_ = null; + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capability_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.Capability.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability build() { + com.mysql.cj.x.protobuf.MysqlxConnection.Capability result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.Capability result = new com.mysql.cj.x.protobuf.MysqlxConnection.Capability(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (valueBuilder_ == null) { + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Capability) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.Capability)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.Capability other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.Capability.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasValue()) { + mergeValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + if (!hasValue()) { + return false; + } + if (!getValue().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.Capability parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.Capability) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> valueBuilder_; + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue() { + if (valueBuilder_ == null) { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } else { + return valueBuilder_.getMessage(); + } + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder setValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + value_ = value; + onChanged(); + } else { + valueBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder setValue( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (valueBuilder_ == null) { + value_ = builderForValue.build(); + onChanged(); + } else { + valueBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder mergeValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + value_ != null && + value_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()) { + value_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.newBuilder(value_).mergeFrom(value).buildPartial(); + } else { + value_ = value; + } + onChanged(); + } else { + valueBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = null; + onChanged(); + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder getValueBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getValueFieldBuilder().getBuilder(); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilder(); + } else { + return value_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder>( + getValue(), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.Capability) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.Capability) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.Capability DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.Capability(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capability getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Capability parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Capability(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CapabilitiesOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.Capabilities) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + java.util.List + getCapabilitiesList(); + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + com.mysql.cj.x.protobuf.MysqlxConnection.Capability getCapabilities(int index); + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + int getCapabilitiesCount(); + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + java.util.List + getCapabilitiesOrBuilderList(); + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder getCapabilitiesOrBuilder( + int index); + } + /** + *
    +   **
    +   *Capabilities
    +   *list of Capability
    +   * 
    + * + * Protobuf type {@code Mysqlx.Connection.Capabilities} + */ + public static final class Capabilities extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.Capabilities) + CapabilitiesOrBuilder { + private static final long serialVersionUID = 0L; + // Use Capabilities.newBuilder() to construct. + private Capabilities(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Capabilities() { + capabilities_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Capabilities(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Capabilities( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + capabilities_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + capabilities_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxConnection.Capability.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + capabilities_ = java.util.Collections.unmodifiableList(capabilities_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capabilities_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capabilities_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.class, com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder.class); + } + + public static final int CAPABILITIES_FIELD_NUMBER = 1; + private java.util.List capabilities_; + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + @java.lang.Override + public java.util.List getCapabilitiesList() { + return capabilities_; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + @java.lang.Override + public java.util.List + getCapabilitiesOrBuilderList() { + return capabilities_; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + @java.lang.Override + public int getCapabilitiesCount() { + return capabilities_.size(); + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability getCapabilities(int index) { + return capabilities_.get(index); + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder getCapabilitiesOrBuilder( + int index) { + return capabilities_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getCapabilitiesCount(); i++) { + if (!getCapabilities(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < capabilities_.size(); i++) { + output.writeMessage(1, capabilities_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < capabilities_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, capabilities_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities other = (com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities) obj; + + if (!getCapabilitiesList() + .equals(other.getCapabilitiesList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getCapabilitiesCount() > 0) { + hash = (37 * hash) + CAPABILITIES_FIELD_NUMBER; + hash = (53 * hash) + getCapabilitiesList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Capabilities
    +     *list of Capability
    +     * 
    + * + * Protobuf type {@code Mysqlx.Connection.Capabilities} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.Capabilities) + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capabilities_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capabilities_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.class, com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCapabilitiesFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (capabilitiesBuilder_ == null) { + capabilities_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + capabilitiesBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Capabilities_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities build() { + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities result = new com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities(this); + int from_bitField0_ = bitField0_; + if (capabilitiesBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + capabilities_ = java.util.Collections.unmodifiableList(capabilities_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.capabilities_ = capabilities_; + } else { + result.capabilities_ = capabilitiesBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance()) return this; + if (capabilitiesBuilder_ == null) { + if (!other.capabilities_.isEmpty()) { + if (capabilities_.isEmpty()) { + capabilities_ = other.capabilities_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureCapabilitiesIsMutable(); + capabilities_.addAll(other.capabilities_); + } + onChanged(); + } + } else { + if (!other.capabilities_.isEmpty()) { + if (capabilitiesBuilder_.isEmpty()) { + capabilitiesBuilder_.dispose(); + capabilitiesBuilder_ = null; + capabilities_ = other.capabilities_; + bitField0_ = (bitField0_ & ~0x00000001); + capabilitiesBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getCapabilitiesFieldBuilder() : null; + } else { + capabilitiesBuilder_.addAllMessages(other.capabilities_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getCapabilitiesCount(); i++) { + if (!getCapabilities(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List capabilities_ = + java.util.Collections.emptyList(); + private void ensureCapabilitiesIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + capabilities_ = new java.util.ArrayList(capabilities_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capability, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder> capabilitiesBuilder_; + + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public java.util.List getCapabilitiesList() { + if (capabilitiesBuilder_ == null) { + return java.util.Collections.unmodifiableList(capabilities_); + } else { + return capabilitiesBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public int getCapabilitiesCount() { + if (capabilitiesBuilder_ == null) { + return capabilities_.size(); + } else { + return capabilitiesBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability getCapabilities(int index) { + if (capabilitiesBuilder_ == null) { + return capabilities_.get(index); + } else { + return capabilitiesBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder setCapabilities( + int index, com.mysql.cj.x.protobuf.MysqlxConnection.Capability value) { + if (capabilitiesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCapabilitiesIsMutable(); + capabilities_.set(index, value); + onChanged(); + } else { + capabilitiesBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder setCapabilities( + int index, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder builderForValue) { + if (capabilitiesBuilder_ == null) { + ensureCapabilitiesIsMutable(); + capabilities_.set(index, builderForValue.build()); + onChanged(); + } else { + capabilitiesBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder addCapabilities(com.mysql.cj.x.protobuf.MysqlxConnection.Capability value) { + if (capabilitiesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCapabilitiesIsMutable(); + capabilities_.add(value); + onChanged(); + } else { + capabilitiesBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder addCapabilities( + int index, com.mysql.cj.x.protobuf.MysqlxConnection.Capability value) { + if (capabilitiesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCapabilitiesIsMutable(); + capabilities_.add(index, value); + onChanged(); + } else { + capabilitiesBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder addCapabilities( + com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder builderForValue) { + if (capabilitiesBuilder_ == null) { + ensureCapabilitiesIsMutable(); + capabilities_.add(builderForValue.build()); + onChanged(); + } else { + capabilitiesBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder addCapabilities( + int index, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder builderForValue) { + if (capabilitiesBuilder_ == null) { + ensureCapabilitiesIsMutable(); + capabilities_.add(index, builderForValue.build()); + onChanged(); + } else { + capabilitiesBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder addAllCapabilities( + java.lang.Iterable values) { + if (capabilitiesBuilder_ == null) { + ensureCapabilitiesIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, capabilities_); + onChanged(); + } else { + capabilitiesBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder clearCapabilities() { + if (capabilitiesBuilder_ == null) { + capabilities_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + capabilitiesBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public Builder removeCapabilities(int index) { + if (capabilitiesBuilder_ == null) { + ensureCapabilitiesIsMutable(); + capabilities_.remove(index); + onChanged(); + } else { + capabilitiesBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder getCapabilitiesBuilder( + int index) { + return getCapabilitiesFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder getCapabilitiesOrBuilder( + int index) { + if (capabilitiesBuilder_ == null) { + return capabilities_.get(index); } else { + return capabilitiesBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public java.util.List + getCapabilitiesOrBuilderList() { + if (capabilitiesBuilder_ != null) { + return capabilitiesBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(capabilities_); + } + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder addCapabilitiesBuilder() { + return getCapabilitiesFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxConnection.Capability.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder addCapabilitiesBuilder( + int index) { + return getCapabilitiesFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Connection.Capability capabilities = 1; + */ + public java.util.List + getCapabilitiesBuilderList() { + return getCapabilitiesFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capability, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder> + getCapabilitiesFieldBuilder() { + if (capabilitiesBuilder_ == null) { + capabilitiesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capability, com.mysql.cj.x.protobuf.MysqlxConnection.Capability.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilityOrBuilder>( + capabilities_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + capabilities_ = null; + } + return capabilitiesBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.Capabilities) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.Capabilities) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Capabilities parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Capabilities(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CapabilitiesGetOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.CapabilitiesGet) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Get supported connection capabilities and their current state.
    +   *@returns @ref Mysqlx::Connection::Capabilities or @ref Mysqlx::Error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Connection.CapabilitiesGet} + */ + public static final class CapabilitiesGet extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.CapabilitiesGet) + CapabilitiesGetOrBuilder { + private static final long serialVersionUID = 0L; + // Use CapabilitiesGet.newBuilder() to construct. + private CapabilitiesGet(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CapabilitiesGet() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CapabilitiesGet(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CapabilitiesGet( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesGet_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.class, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet other = (com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Get supported connection capabilities and their current state.
    +     *@returns @ref Mysqlx::Connection::Capabilities or @ref Mysqlx::Error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Connection.CapabilitiesGet} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.CapabilitiesGet) + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGetOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesGet_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.class, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet build() { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet result = new com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.CapabilitiesGet) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.CapabilitiesGet) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CapabilitiesGet parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CapabilitiesGet(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CapabilitiesSetOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.CapabilitiesSet) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return Whether the capabilities field is set. + */ + boolean hasCapabilities(); + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return The capabilities. + */ + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getCapabilities(); + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder getCapabilitiesOrBuilder(); + } + /** + *
    +   **
    +   *Set connection capabilities atomically.
    +   *Only provided values are changed; other values are left
    +   *unchanged. If any of the changes fails, all changes are
    +   *discarded.
    +   *@pre active sessions == 0
    +   *@returns @ref Mysqlx::Ok  or @ref Mysqlx::Error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Connection.CapabilitiesSet} + */ + public static final class CapabilitiesSet extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.CapabilitiesSet) + CapabilitiesSetOrBuilder { + private static final long serialVersionUID = 0L; + // Use CapabilitiesSet.newBuilder() to construct. + private CapabilitiesSet(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CapabilitiesSet() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CapabilitiesSet(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CapabilitiesSet( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = capabilities_.toBuilder(); + } + capabilities_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(capabilities_); + capabilities_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesSet_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.class, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.Builder.class); + } + + private int bitField0_; + public static final int CAPABILITIES_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities capabilities_; + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return Whether the capabilities field is set. + */ + @java.lang.Override + public boolean hasCapabilities() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return The capabilities. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getCapabilities() { + return capabilities_ == null ? com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance() : capabilities_; + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder getCapabilitiesOrBuilder() { + return capabilities_ == null ? com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance() : capabilities_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCapabilities()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCapabilities().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCapabilities()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCapabilities()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet other = (com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet) obj; + + if (hasCapabilities() != other.hasCapabilities()) return false; + if (hasCapabilities()) { + if (!getCapabilities() + .equals(other.getCapabilities())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCapabilities()) { + hash = (37 * hash) + CAPABILITIES_FIELD_NUMBER; + hash = (53 * hash) + getCapabilities().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Set connection capabilities atomically.
    +     *Only provided values are changed; other values are left
    +     *unchanged. If any of the changes fails, all changes are
    +     *discarded.
    +     *@pre active sessions == 0
    +     *@returns @ref Mysqlx::Ok  or @ref Mysqlx::Error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Connection.CapabilitiesSet} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.CapabilitiesSet) + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSetOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesSet_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.class, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCapabilitiesFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (capabilitiesBuilder_ == null) { + capabilities_ = null; + } else { + capabilitiesBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet build() { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet result = new com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (capabilitiesBuilder_ == null) { + result.capabilities_ = capabilities_; + } else { + result.capabilities_ = capabilitiesBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet.getDefaultInstance()) return this; + if (other.hasCapabilities()) { + mergeCapabilities(other.getCapabilities()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCapabilities()) { + return false; + } + if (!getCapabilities().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities capabilities_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities, com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder> capabilitiesBuilder_; + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return Whether the capabilities field is set. + */ + public boolean hasCapabilities() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + * @return The capabilities. + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities getCapabilities() { + if (capabilitiesBuilder_ == null) { + return capabilities_ == null ? com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance() : capabilities_; + } else { + return capabilitiesBuilder_.getMessage(); + } + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public Builder setCapabilities(com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities value) { + if (capabilitiesBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + capabilities_ = value; + onChanged(); + } else { + capabilitiesBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public Builder setCapabilities( + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder builderForValue) { + if (capabilitiesBuilder_ == null) { + capabilities_ = builderForValue.build(); + onChanged(); + } else { + capabilitiesBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public Builder mergeCapabilities(com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities value) { + if (capabilitiesBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + capabilities_ != null && + capabilities_ != com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance()) { + capabilities_ = + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.newBuilder(capabilities_).mergeFrom(value).buildPartial(); + } else { + capabilities_ = value; + } + onChanged(); + } else { + capabilitiesBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public Builder clearCapabilities() { + if (capabilitiesBuilder_ == null) { + capabilities_ = null; + onChanged(); + } else { + capabilitiesBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder getCapabilitiesBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCapabilitiesFieldBuilder().getBuilder(); + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder getCapabilitiesOrBuilder() { + if (capabilitiesBuilder_ != null) { + return capabilitiesBuilder_.getMessageOrBuilder(); + } else { + return capabilities_ == null ? + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.getDefaultInstance() : capabilities_; + } + } + /** + * required .Mysqlx.Connection.Capabilities capabilities = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities, com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder> + getCapabilitiesFieldBuilder() { + if (capabilitiesBuilder_ == null) { + capabilitiesBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities, com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities.Builder, com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesOrBuilder>( + getCapabilities(), + getParentForChildren(), + isClean()); + capabilities_ = null; + } + return capabilitiesBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.CapabilitiesSet) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.CapabilitiesSet) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CapabilitiesSet parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CapabilitiesSet(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CloseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.Close) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Announce to the server that the client wants to close the connection.
    +   *It discards any session state of the server.
    +   *@returns @ref Mysqlx::Ok
    +   * 
    + * + * Protobuf type {@code Mysqlx.Connection.Close} + */ + public static final class Close extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.Close) + CloseOrBuilder { + private static final long serialVersionUID = 0L; + // Use Close.newBuilder() to construct. + private Close(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Close() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Close(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Close( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Close.class, com.mysql.cj.x.protobuf.MysqlxConnection.Close.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Close)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.Close other = (com.mysql.cj.x.protobuf.MysqlxConnection.Close) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.Close prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Announce to the server that the client wants to close the connection.
    +     *It discards any session state of the server.
    +     *@returns @ref Mysqlx::Ok
    +     * 
    + * + * Protobuf type {@code Mysqlx.Connection.Close} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.Close) + com.mysql.cj.x.protobuf.MysqlxConnection.CloseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Close.class, com.mysql.cj.x.protobuf.MysqlxConnection.Close.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.Close.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Close_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Close getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.Close.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Close build() { + com.mysql.cj.x.protobuf.MysqlxConnection.Close result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Close buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.Close result = new com.mysql.cj.x.protobuf.MysqlxConnection.Close(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Close) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.Close)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.Close other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.Close.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.Close parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.Close) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.Close) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.Close) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.Close DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.Close(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Close getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Close parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Close(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Close getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CompressionOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Connection.Compression) + com.google.protobuf.MessageOrBuilder { + + /** + * optional uint64 uncompressed_size = 1; + * @return Whether the uncompressedSize field is set. + */ + boolean hasUncompressedSize(); + /** + * optional uint64 uncompressed_size = 1; + * @return The uncompressedSize. + */ + long getUncompressedSize(); + + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return Whether the serverMessages field is set. + */ + boolean hasServerMessages(); + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return The serverMessages. + */ + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type getServerMessages(); + + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return Whether the clientMessages field is set. + */ + boolean hasClientMessages(); + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return The clientMessages. + */ + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type getClientMessages(); + + /** + * required bytes payload = 4; + * @return Whether the payload field is set. + */ + boolean hasPayload(); + /** + * required bytes payload = 4; + * @return The payload. + */ + com.google.protobuf.ByteString getPayload(); + } + /** + * Protobuf type {@code Mysqlx.Connection.Compression} + */ + public static final class Compression extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Connection.Compression) + CompressionOrBuilder { + private static final long serialVersionUID = 0L; + // Use Compression.newBuilder() to construct. + private Compression(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Compression() { + serverMessages_ = 0; + clientMessages_ = 1; + payload_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Compression(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Compression( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + uncompressedSize_ = input.readUInt64(); + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type value = com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + serverMessages_ = rawValue; + } + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type value = com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + clientMessages_ = rawValue; + } + break; + } + case 34: { + bitField0_ |= 0x00000008; + payload_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Compression_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Compression_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Compression.class, com.mysql.cj.x.protobuf.MysqlxConnection.Compression.Builder.class); + } + + private int bitField0_; + public static final int UNCOMPRESSED_SIZE_FIELD_NUMBER = 1; + private long uncompressedSize_; + /** + * optional uint64 uncompressed_size = 1; + * @return Whether the uncompressedSize field is set. + */ + @java.lang.Override + public boolean hasUncompressedSize() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint64 uncompressed_size = 1; + * @return The uncompressedSize. + */ + @java.lang.Override + public long getUncompressedSize() { + return uncompressedSize_; + } + + public static final int SERVER_MESSAGES_FIELD_NUMBER = 2; + private int serverMessages_; + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return Whether the serverMessages field is set. + */ + @java.lang.Override public boolean hasServerMessages() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return The serverMessages. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type getServerMessages() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type result = com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.valueOf(serverMessages_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.OK : result; + } + + public static final int CLIENT_MESSAGES_FIELD_NUMBER = 3; + private int clientMessages_; + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return Whether the clientMessages field is set. + */ + @java.lang.Override public boolean hasClientMessages() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return The clientMessages. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type getClientMessages() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type result = com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.valueOf(clientMessages_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.CON_CAPABILITIES_GET : result; + } + + public static final int PAYLOAD_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString payload_; + /** + * required bytes payload = 4; + * @return Whether the payload field is set. + */ + @java.lang.Override + public boolean hasPayload() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bytes payload = 4; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasPayload()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt64(1, uncompressedSize_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, serverMessages_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeEnum(3, clientMessages_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeBytes(4, payload_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, uncompressedSize_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, serverMessages_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, clientMessages_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, payload_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Compression)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxConnection.Compression other = (com.mysql.cj.x.protobuf.MysqlxConnection.Compression) obj; + + if (hasUncompressedSize() != other.hasUncompressedSize()) return false; + if (hasUncompressedSize()) { + if (getUncompressedSize() + != other.getUncompressedSize()) return false; + } + if (hasServerMessages() != other.hasServerMessages()) return false; + if (hasServerMessages()) { + if (serverMessages_ != other.serverMessages_) return false; + } + if (hasClientMessages() != other.hasClientMessages()) return false; + if (hasClientMessages()) { + if (clientMessages_ != other.clientMessages_) return false; + } + if (hasPayload() != other.hasPayload()) return false; + if (hasPayload()) { + if (!getPayload() + .equals(other.getPayload())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasUncompressedSize()) { + hash = (37 * hash) + UNCOMPRESSED_SIZE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getUncompressedSize()); + } + if (hasServerMessages()) { + hash = (37 * hash) + SERVER_MESSAGES_FIELD_NUMBER; + hash = (53 * hash) + serverMessages_; + } + if (hasClientMessages()) { + hash = (37 * hash) + CLIENT_MESSAGES_FIELD_NUMBER; + hash = (53 * hash) + clientMessages_; + } + if (hasPayload()) { + hash = (37 * hash) + PAYLOAD_FIELD_NUMBER; + hash = (53 * hash) + getPayload().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxConnection.Compression prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Connection.Compression} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Connection.Compression) + com.mysql.cj.x.protobuf.MysqlxConnection.CompressionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Compression_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Compression_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxConnection.Compression.class, com.mysql.cj.x.protobuf.MysqlxConnection.Compression.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxConnection.Compression.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + uncompressedSize_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + serverMessages_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + clientMessages_ = 1; + bitField0_ = (bitField0_ & ~0x00000004); + payload_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.internal_static_Mysqlx_Connection_Compression_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Compression getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxConnection.Compression.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Compression build() { + com.mysql.cj.x.protobuf.MysqlxConnection.Compression result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Compression buildPartial() { + com.mysql.cj.x.protobuf.MysqlxConnection.Compression result = new com.mysql.cj.x.protobuf.MysqlxConnection.Compression(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.uncompressedSize_ = uncompressedSize_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.serverMessages_ = serverMessages_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.clientMessages_ = clientMessages_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000008; + } + result.payload_ = payload_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxConnection.Compression) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxConnection.Compression)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxConnection.Compression other) { + if (other == com.mysql.cj.x.protobuf.MysqlxConnection.Compression.getDefaultInstance()) return this; + if (other.hasUncompressedSize()) { + setUncompressedSize(other.getUncompressedSize()); + } + if (other.hasServerMessages()) { + setServerMessages(other.getServerMessages()); + } + if (other.hasClientMessages()) { + setClientMessages(other.getClientMessages()); + } + if (other.hasPayload()) { + setPayload(other.getPayload()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasPayload()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxConnection.Compression parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxConnection.Compression) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long uncompressedSize_ ; + /** + * optional uint64 uncompressed_size = 1; + * @return Whether the uncompressedSize field is set. + */ + @java.lang.Override + public boolean hasUncompressedSize() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional uint64 uncompressed_size = 1; + * @return The uncompressedSize. + */ + @java.lang.Override + public long getUncompressedSize() { + return uncompressedSize_; + } + /** + * optional uint64 uncompressed_size = 1; + * @param value The uncompressedSize to set. + * @return This builder for chaining. + */ + public Builder setUncompressedSize(long value) { + bitField0_ |= 0x00000001; + uncompressedSize_ = value; + onChanged(); + return this; + } + /** + * optional uint64 uncompressed_size = 1; + * @return This builder for chaining. + */ + public Builder clearUncompressedSize() { + bitField0_ = (bitField0_ & ~0x00000001); + uncompressedSize_ = 0L; + onChanged(); + return this; + } + + private int serverMessages_ = 0; + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return Whether the serverMessages field is set. + */ + @java.lang.Override public boolean hasServerMessages() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return The serverMessages. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type getServerMessages() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type result = com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.valueOf(serverMessages_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type.OK : result; + } + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @param value The serverMessages to set. + * @return This builder for chaining. + */ + public Builder setServerMessages(com.mysql.cj.x.protobuf.Mysqlx.ServerMessages.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + serverMessages_ = value.getNumber(); + onChanged(); + return this; + } + /** + * optional .Mysqlx.ServerMessages.Type server_messages = 2; + * @return This builder for chaining. + */ + public Builder clearServerMessages() { + bitField0_ = (bitField0_ & ~0x00000002); + serverMessages_ = 0; + onChanged(); + return this; + } + + private int clientMessages_ = 1; + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return Whether the clientMessages field is set. + */ + @java.lang.Override public boolean hasClientMessages() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return The clientMessages. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type getClientMessages() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type result = com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.valueOf(clientMessages_); + return result == null ? com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type.CON_CAPABILITIES_GET : result; + } + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @param value The clientMessages to set. + * @return This builder for chaining. + */ + public Builder setClientMessages(com.mysql.cj.x.protobuf.Mysqlx.ClientMessages.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + clientMessages_ = value.getNumber(); + onChanged(); + return this; + } + /** + * optional .Mysqlx.ClientMessages.Type client_messages = 3; + * @return This builder for chaining. + */ + public Builder clearClientMessages() { + bitField0_ = (bitField0_ & ~0x00000004); + clientMessages_ = 1; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes payload = 4; + * @return Whether the payload field is set. + */ + @java.lang.Override + public boolean hasPayload() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * required bytes payload = 4; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + /** + * required bytes payload = 4; + * @param value The payload to set. + * @return This builder for chaining. + */ + public Builder setPayload(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + payload_ = value; + onChanged(); + return this; + } + /** + * required bytes payload = 4; + * @return This builder for chaining. + */ + public Builder clearPayload() { + bitField0_ = (bitField0_ & ~0x00000008); + payload_ = getDefaultInstance().getPayload(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Connection.Compression) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Connection.Compression) + private static final com.mysql.cj.x.protobuf.MysqlxConnection.Compression DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxConnection.Compression(); + } + + public static com.mysql.cj.x.protobuf.MysqlxConnection.Compression getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Compression parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Compression(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxConnection.Compression getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_Capability_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_Capability_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_Capabilities_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_Capabilities_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_CapabilitiesGet_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_CapabilitiesSet_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_Close_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_Close_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Connection_Compression_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Connection_Compression_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\027mysqlx_connection.proto\022\021Mysqlx.Connec" + + "tion\032\026mysqlx_datatypes.proto\032\014mysqlx.pro" + + "to\"@\n\nCapability\022\014\n\004name\030\001 \002(\t\022$\n\005value\030" + + "\002 \002(\0132\025.Mysqlx.Datatypes.Any\"I\n\014Capabili" + + "ties\0223\n\014capabilities\030\001 \003(\0132\035.Mysqlx.Conn" + + "ection.Capability:\004\220\3520\002\"\027\n\017CapabilitiesG" + + "et:\004\210\3520\001\"N\n\017CapabilitiesSet\0225\n\014capabilit" + + "ies\030\001 \002(\0132\037.Mysqlx.Connection.Capabiliti" + + "es:\004\210\3520\002\"\r\n\005Close:\004\210\3520\003\"\257\001\n\013Compression\022" + + "\031\n\021uncompressed_size\030\001 \001(\004\0224\n\017server_mes" + + "sages\030\002 \001(\0162\033.Mysqlx.ServerMessages.Type" + + "\0224\n\017client_messages\030\003 \001(\0162\033.Mysqlx.Clien" + + "tMessages.Type\022\017\n\007payload\030\004 \002(\014:\010\220\3520\023\210\3520" + + ".B\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + }); + internal_static_Mysqlx_Connection_Capability_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Connection_Capability_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_Capability_descriptor, + new java.lang.String[] { "Name", "Value", }); + internal_static_Mysqlx_Connection_Capabilities_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Connection_Capabilities_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_Capabilities_descriptor, + new java.lang.String[] { "Capabilities", }); + internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Connection_CapabilitiesGet_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_CapabilitiesGet_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Connection_CapabilitiesSet_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_CapabilitiesSet_descriptor, + new java.lang.String[] { "Capabilities", }); + internal_static_Mysqlx_Connection_Close_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Connection_Close_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_Close_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Connection_Compression_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_Mysqlx_Connection_Compression_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Connection_Compression_descriptor, + new java.lang.String[] { "UncompressedSize", "ServerMessages", "ClientMessages", "Payload", }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCrud.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCrud.java new file mode 100644 index 0000000..598ee5d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCrud.java @@ -0,0 +1,26427 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_crud.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxCrud { + private MysqlxCrud() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + *
    +   **
    +   *DataModel to use for filters, names, ...
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Crud.DataModel} + */ + public enum DataModel + implements com.google.protobuf.ProtocolMessageEnum { + /** + * DOCUMENT = 1; + */ + DOCUMENT(1), + /** + * TABLE = 2; + */ + TABLE(2), + ; + + /** + * DOCUMENT = 1; + */ + public static final int DOCUMENT_VALUE = 1; + /** + * TABLE = 2; + */ + public static final int TABLE_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static DataModel valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static DataModel forNumber(int value) { + switch (value) { + case 1: return DOCUMENT; + case 2: return TABLE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + DataModel> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public DataModel findValueByNumber(int number) { + return DataModel.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor().getEnumTypes().get(0); + } + + private static final DataModel[] VALUES = values(); + + public static DataModel valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private DataModel(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.DataModel) + } + + /** + *
    +   **
    +   *ViewAlgorithm defines how MySQL Server processes the view
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Crud.ViewAlgorithm} + */ + public enum ViewAlgorithm + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +     ** MySQL chooses which algorithm to use 
    +     * 
    + * + * UNDEFINED = 1; + */ + UNDEFINED(1), + /** + *
    +     ** the text of a statement that refers to the view and the view
    +     *definition are merged 
    +     * 
    + * + * MERGE = 2; + */ + MERGE(2), + /** + *
    +     ** the view are retrieved into a temporary table 
    +     * 
    + * + * TEMPTABLE = 3; + */ + TEMPTABLE(3), + ; + + /** + *
    +     ** MySQL chooses which algorithm to use 
    +     * 
    + * + * UNDEFINED = 1; + */ + public static final int UNDEFINED_VALUE = 1; + /** + *
    +     ** the text of a statement that refers to the view and the view
    +     *definition are merged 
    +     * 
    + * + * MERGE = 2; + */ + public static final int MERGE_VALUE = 2; + /** + *
    +     ** the view are retrieved into a temporary table 
    +     * 
    + * + * TEMPTABLE = 3; + */ + public static final int TEMPTABLE_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ViewAlgorithm valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ViewAlgorithm forNumber(int value) { + switch (value) { + case 1: return UNDEFINED; + case 2: return MERGE; + case 3: return TEMPTABLE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ViewAlgorithm> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ViewAlgorithm findValueByNumber(int number) { + return ViewAlgorithm.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor().getEnumTypes().get(1); + } + + private static final ViewAlgorithm[] VALUES = values(); + + public static ViewAlgorithm valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ViewAlgorithm(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.ViewAlgorithm) + } + + /** + *
    +   **
    +   *ViewSqlSecurity defines the security context in which the view is going to be
    +   *executed; this means that VIEW can be executed with current user permissions or
    +   *with permissions of the user who defined the VIEW
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Crud.ViewSqlSecurity} + */ + public enum ViewSqlSecurity + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +     ** use current user permissions 
    +     * 
    + * + * INVOKER = 1; + */ + INVOKER(1), + /** + *
    +     ** use permissions of the user who defined the VIEW 
    +     * 
    + * + * DEFINER = 2; + */ + DEFINER(2), + ; + + /** + *
    +     ** use current user permissions 
    +     * 
    + * + * INVOKER = 1; + */ + public static final int INVOKER_VALUE = 1; + /** + *
    +     ** use permissions of the user who defined the VIEW 
    +     * 
    + * + * DEFINER = 2; + */ + public static final int DEFINER_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ViewSqlSecurity valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ViewSqlSecurity forNumber(int value) { + switch (value) { + case 1: return INVOKER; + case 2: return DEFINER; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ViewSqlSecurity> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ViewSqlSecurity findValueByNumber(int number) { + return ViewSqlSecurity.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor().getEnumTypes().get(2); + } + + private static final ViewSqlSecurity[] VALUES = values(); + + public static ViewSqlSecurity valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ViewSqlSecurity(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.ViewSqlSecurity) + } + + /** + *
    +   **
    +   *ViewCheckOption limits the write operations done on a `VIEW`
    +   *(`INSERT`, `UPDATE`, `DELETE`) to rows in which the `WHERE` clause is `TRUE`
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Crud.ViewCheckOption} + */ + public enum ViewCheckOption + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +     ** the view WHERE clause is checked, but no underlying views are checked 
    +     * 
    + * + * LOCAL = 1; + */ + LOCAL(1), + /** + *
    +     ** the view WHERE clause is checked, then checking recurses
    +     *to underlying views 
    +     * 
    + * + * CASCADED = 2; + */ + CASCADED(2), + ; + + /** + *
    +     ** the view WHERE clause is checked, but no underlying views are checked 
    +     * 
    + * + * LOCAL = 1; + */ + public static final int LOCAL_VALUE = 1; + /** + *
    +     ** the view WHERE clause is checked, then checking recurses
    +     *to underlying views 
    +     * 
    + * + * CASCADED = 2; + */ + public static final int CASCADED_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ViewCheckOption valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ViewCheckOption forNumber(int value) { + switch (value) { + case 1: return LOCAL; + case 2: return CASCADED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ViewCheckOption> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ViewCheckOption findValueByNumber(int number) { + return ViewCheckOption.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor().getEnumTypes().get(3); + } + + private static final ViewCheckOption[] VALUES = values(); + + public static ViewCheckOption valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ViewCheckOption(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.ViewCheckOption) + } + + public interface ColumnOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Column) + com.google.protobuf.MessageOrBuilder { + + /** + * optional string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + * optional string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + * optional string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string alias = 2; + * @return Whether the alias field is set. + */ + boolean hasAlias(); + /** + * optional string alias = 2; + * @return The alias. + */ + java.lang.String getAlias(); + /** + * optional string alias = 2; + * @return The bytes for alias. + */ + com.google.protobuf.ByteString + getAliasBytes(); + + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + java.util.List + getDocumentPathList(); + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index); + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + int getDocumentPathCount(); + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + java.util.List + getDocumentPathOrBuilderList(); + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index); + } + /** + * Protobuf type {@code Mysqlx.Crud.Column} + */ + public static final class Column extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Column) + ColumnOrBuilder { + private static final long serialVersionUID = 0L; + // Use Column.newBuilder() to construct. + private Column(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Column() { + name_ = ""; + alias_ = ""; + documentPath_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Column(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Column( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + alias_ = bs; + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + documentPath_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + documentPath_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + documentPath_ = java.util.Collections.unmodifiableList(documentPath_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Column_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Column_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Column.class, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * optional string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * optional string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ALIAS_FIELD_NUMBER = 2; + private volatile java.lang.Object alias_; + /** + * optional string alias = 2; + * @return Whether the alias field is set. + */ + @java.lang.Override + public boolean hasAlias() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string alias = 2; + * @return The alias. + */ + @java.lang.Override + public java.lang.String getAlias() { + java.lang.Object ref = alias_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + alias_ = s; + } + return s; + } + } + /** + * optional string alias = 2; + * @return The bytes for alias. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getAliasBytes() { + java.lang.Object ref = alias_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + alias_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DOCUMENT_PATH_FIELD_NUMBER = 3; + private java.util.List documentPath_; + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + @java.lang.Override + public java.util.List getDocumentPathList() { + return documentPath_; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + @java.lang.Override + public java.util.List + getDocumentPathOrBuilderList() { + return documentPath_; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + @java.lang.Override + public int getDocumentPathCount() { + return documentPath_.size(); + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index) { + return documentPath_.get(index); + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index) { + return documentPath_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getDocumentPathCount(); i++) { + if (!getDocumentPath(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, alias_); + } + for (int i = 0; i < documentPath_.size(); i++) { + output.writeMessage(3, documentPath_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, alias_); + } + for (int i = 0; i < documentPath_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, documentPath_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Column)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Column other = (com.mysql.cj.x.protobuf.MysqlxCrud.Column) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasAlias() != other.hasAlias()) return false; + if (hasAlias()) { + if (!getAlias() + .equals(other.getAlias())) return false; + } + if (!getDocumentPathList() + .equals(other.getDocumentPathList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasAlias()) { + hash = (37 * hash) + ALIAS_FIELD_NUMBER; + hash = (53 * hash) + getAlias().hashCode(); + } + if (getDocumentPathCount() > 0) { + hash = (37 * hash) + DOCUMENT_PATH_FIELD_NUMBER; + hash = (53 * hash) + getDocumentPathList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Column prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Crud.Column} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Column) + com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Column_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Column_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Column.class, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Column.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getDocumentPathFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + alias_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + if (documentPathBuilder_ == null) { + documentPath_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + documentPathBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Column_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Column getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Column.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Column build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Column result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Column buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Column result = new com.mysql.cj.x.protobuf.MysqlxCrud.Column(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.alias_ = alias_; + if (documentPathBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + documentPath_ = java.util.Collections.unmodifiableList(documentPath_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.documentPath_ = documentPath_; + } else { + result.documentPath_ = documentPathBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Column) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Column)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Column other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Column.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasAlias()) { + bitField0_ |= 0x00000002; + alias_ = other.alias_; + onChanged(); + } + if (documentPathBuilder_ == null) { + if (!other.documentPath_.isEmpty()) { + if (documentPath_.isEmpty()) { + documentPath_ = other.documentPath_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureDocumentPathIsMutable(); + documentPath_.addAll(other.documentPath_); + } + onChanged(); + } + } else { + if (!other.documentPath_.isEmpty()) { + if (documentPathBuilder_.isEmpty()) { + documentPathBuilder_.dispose(); + documentPathBuilder_ = null; + documentPath_ = other.documentPath_; + bitField0_ = (bitField0_ & ~0x00000004); + documentPathBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getDocumentPathFieldBuilder() : null; + } else { + documentPathBuilder_.addAllMessages(other.documentPath_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getDocumentPathCount(); i++) { + if (!getDocumentPath(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Column parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Column) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * optional string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * optional string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * optional string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object alias_ = ""; + /** + * optional string alias = 2; + * @return Whether the alias field is set. + */ + public boolean hasAlias() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string alias = 2; + * @return The alias. + */ + public java.lang.String getAlias() { + java.lang.Object ref = alias_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + alias_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string alias = 2; + * @return The bytes for alias. + */ + public com.google.protobuf.ByteString + getAliasBytes() { + java.lang.Object ref = alias_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + alias_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string alias = 2; + * @param value The alias to set. + * @return This builder for chaining. + */ + public Builder setAlias( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + alias_ = value; + onChanged(); + return this; + } + /** + * optional string alias = 2; + * @return This builder for chaining. + */ + public Builder clearAlias() { + bitField0_ = (bitField0_ & ~0x00000002); + alias_ = getDefaultInstance().getAlias(); + onChanged(); + return this; + } + /** + * optional string alias = 2; + * @param value The bytes for alias to set. + * @return This builder for chaining. + */ + public Builder setAliasBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + alias_ = value; + onChanged(); + return this; + } + + private java.util.List documentPath_ = + java.util.Collections.emptyList(); + private void ensureDocumentPathIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + documentPath_ = new java.util.ArrayList(documentPath_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder> documentPathBuilder_; + + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public java.util.List getDocumentPathList() { + if (documentPathBuilder_ == null) { + return java.util.Collections.unmodifiableList(documentPath_); + } else { + return documentPathBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public int getDocumentPathCount() { + if (documentPathBuilder_ == null) { + return documentPath_.size(); + } else { + return documentPathBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index) { + if (documentPathBuilder_ == null) { + return documentPath_.get(index); + } else { + return documentPathBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder setDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.set(index, value); + onChanged(); + } else { + documentPathBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder setDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.set(index, builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder addDocumentPath(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.add(value); + onChanged(); + } else { + documentPathBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder addDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.add(index, value); + onChanged(); + } else { + documentPathBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder addDocumentPath( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.add(builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder addDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.add(index, builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder addAllDocumentPath( + java.lang.Iterable values) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, documentPath_); + onChanged(); + } else { + documentPathBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder clearDocumentPath() { + if (documentPathBuilder_ == null) { + documentPath_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + documentPathBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public Builder removeDocumentPath(int index) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.remove(index); + onChanged(); + } else { + documentPathBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder getDocumentPathBuilder( + int index) { + return getDocumentPathFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index) { + if (documentPathBuilder_ == null) { + return documentPath_.get(index); } else { + return documentPathBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public java.util.List + getDocumentPathOrBuilderList() { + if (documentPathBuilder_ != null) { + return documentPathBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(documentPath_); + } + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder addDocumentPathBuilder() { + return getDocumentPathFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder addDocumentPathBuilder( + int index) { + return getDocumentPathFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 3; + */ + public java.util.List + getDocumentPathBuilderList() { + return getDocumentPathFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder> + getDocumentPathFieldBuilder() { + if (documentPathBuilder_ == null) { + documentPathBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder>( + documentPath_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + documentPath_ = null; + } + return documentPathBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Column) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Column) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Column DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Column(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Column getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Column parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Column(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Column getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ProjectionOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Projection) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return Whether the source field is set. + */ + boolean hasSource(); + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return The source. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getSource(); + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getSourceOrBuilder(); + + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return Whether the alias field is set. + */ + boolean hasAlias(); + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return The alias. + */ + java.lang.String getAlias(); + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return The bytes for alias. + */ + com.google.protobuf.ByteString + getAliasBytes(); + } + /** + * Protobuf type {@code Mysqlx.Crud.Projection} + */ + public static final class Projection extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Projection) + ProjectionOrBuilder { + private static final long serialVersionUID = 0L; + // Use Projection.newBuilder() to construct. + private Projection(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Projection() { + alias_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Projection(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Projection( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = source_.toBuilder(); + } + source_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(source_); + source_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + alias_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Projection_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Projection_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Projection.class, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder.class); + } + + private int bitField0_; + public static final int SOURCE_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr source_; + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return Whether the source field is set. + */ + @java.lang.Override + public boolean hasSource() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return The source. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getSource() { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : source_; + } + /** + *
    +     ** the expression identifying an element from the source data,
    +     *which can include a column identifier or any expression 
    +     * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getSourceOrBuilder() { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : source_; + } + + public static final int ALIAS_FIELD_NUMBER = 2; + private volatile java.lang.Object alias_; + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return Whether the alias field is set. + */ + @java.lang.Override + public boolean hasAlias() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return The alias. + */ + @java.lang.Override + public java.lang.String getAlias() { + java.lang.Object ref = alias_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + alias_ = s; + } + return s; + } + } + /** + *
    +     ** optional alias. Required for DOCUMENTs (clients may use
    +     *the source string as default) 
    +     * 
    + * + * optional string alias = 2; + * @return The bytes for alias. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getAliasBytes() { + java.lang.Object ref = alias_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + alias_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasSource()) { + memoizedIsInitialized = 0; + return false; + } + if (!getSource().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getSource()); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, alias_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getSource()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, alias_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Projection)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Projection other = (com.mysql.cj.x.protobuf.MysqlxCrud.Projection) obj; + + if (hasSource() != other.hasSource()) return false; + if (hasSource()) { + if (!getSource() + .equals(other.getSource())) return false; + } + if (hasAlias() != other.hasAlias()) return false; + if (hasAlias()) { + if (!getAlias() + .equals(other.getAlias())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSource()) { + hash = (37 * hash) + SOURCE_FIELD_NUMBER; + hash = (53 * hash) + getSource().hashCode(); + } + if (hasAlias()) { + hash = (37 * hash) + ALIAS_FIELD_NUMBER; + hash = (53 * hash) + getAlias().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Projection prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Crud.Projection} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Projection) + com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Projection_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Projection_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Projection.class, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Projection.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getSourceFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (sourceBuilder_ == null) { + source_ = null; + } else { + sourceBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + alias_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Projection_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Projection.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Projection result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Projection result = new com.mysql.cj.x.protobuf.MysqlxCrud.Projection(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (sourceBuilder_ == null) { + result.source_ = source_; + } else { + result.source_ = sourceBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.alias_ = alias_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Projection) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Projection)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Projection other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Projection.getDefaultInstance()) return this; + if (other.hasSource()) { + mergeSource(other.getSource()); + } + if (other.hasAlias()) { + bitField0_ |= 0x00000002; + alias_ = other.alias_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasSource()) { + return false; + } + if (!getSource().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Projection parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Projection) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr source_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> sourceBuilder_; + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return Whether the source field is set. + */ + public boolean hasSource() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + * @return The source. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getSource() { + if (sourceBuilder_ == null) { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : source_; + } else { + return sourceBuilder_.getMessage(); + } + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public Builder setSource(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (sourceBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + source_ = value; + onChanged(); + } else { + sourceBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public Builder setSource( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (sourceBuilder_ == null) { + source_ = builderForValue.build(); + onChanged(); + } else { + sourceBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public Builder mergeSource(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (sourceBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + source_ != null && + source_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + source_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(source_).mergeFrom(value).buildPartial(); + } else { + source_ = value; + } + onChanged(); + } else { + sourceBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public Builder clearSource() { + if (sourceBuilder_ == null) { + source_ = null; + onChanged(); + } else { + sourceBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getSourceBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getSourceFieldBuilder().getBuilder(); + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getSourceOrBuilder() { + if (sourceBuilder_ != null) { + return sourceBuilder_.getMessageOrBuilder(); + } else { + return source_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : source_; + } + } + /** + *
    +       ** the expression identifying an element from the source data,
    +       *which can include a column identifier or any expression 
    +       * 
    + * + * required .Mysqlx.Expr.Expr source = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getSourceFieldBuilder() { + if (sourceBuilder_ == null) { + sourceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getSource(), + getParentForChildren(), + isClean()); + source_ = null; + } + return sourceBuilder_; + } + + private java.lang.Object alias_ = ""; + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @return Whether the alias field is set. + */ + public boolean hasAlias() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @return The alias. + */ + public java.lang.String getAlias() { + java.lang.Object ref = alias_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + alias_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @return The bytes for alias. + */ + public com.google.protobuf.ByteString + getAliasBytes() { + java.lang.Object ref = alias_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + alias_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @param value The alias to set. + * @return This builder for chaining. + */ + public Builder setAlias( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + alias_ = value; + onChanged(); + return this; + } + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @return This builder for chaining. + */ + public Builder clearAlias() { + bitField0_ = (bitField0_ & ~0x00000002); + alias_ = getDefaultInstance().getAlias(); + onChanged(); + return this; + } + /** + *
    +       ** optional alias. Required for DOCUMENTs (clients may use
    +       *the source string as default) 
    +       * 
    + * + * optional string alias = 2; + * @param value The bytes for alias to set. + * @return This builder for chaining. + */ + public Builder setAliasBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + alias_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Projection) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Projection) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Projection DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Projection(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Projection getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Projection parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Projection(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CollectionOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Collection) + com.google.protobuf.MessageOrBuilder { + + /** + * required string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + * required string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + * required string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string schema = 2; + * @return Whether the schema field is set. + */ + boolean hasSchema(); + /** + * optional string schema = 2; + * @return The schema. + */ + java.lang.String getSchema(); + /** + * optional string schema = 2; + * @return The bytes for schema. + */ + com.google.protobuf.ByteString + getSchemaBytes(); + } + /** + * Protobuf type {@code Mysqlx.Crud.Collection} + */ + public static final class Collection extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Collection) + CollectionOrBuilder { + private static final long serialVersionUID = 0L; + // Use Collection.newBuilder() to construct. + private Collection(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Collection() { + name_ = ""; + schema_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Collection(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Collection( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + schema_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Collection_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Collection_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.class, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SCHEMA_FIELD_NUMBER = 2; + private volatile java.lang.Object schema_; + /** + * optional string schema = 2; + * @return Whether the schema field is set. + */ + @java.lang.Override + public boolean hasSchema() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string schema = 2; + * @return The schema. + */ + @java.lang.Override + public java.lang.String getSchema() { + java.lang.Object ref = schema_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schema_ = s; + } + return s; + } + } + /** + * optional string schema = 2; + * @return The bytes for schema. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSchemaBytes() { + java.lang.Object ref = schema_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schema_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, schema_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, schema_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Collection)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Collection other = (com.mysql.cj.x.protobuf.MysqlxCrud.Collection) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasSchema() != other.hasSchema()) return false; + if (hasSchema()) { + if (!getSchema() + .equals(other.getSchema())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasSchema()) { + hash = (37 * hash) + SCHEMA_FIELD_NUMBER; + hash = (53 * hash) + getSchema().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Collection prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Crud.Collection} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Collection) + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Collection_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Collection_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.class, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + schema_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Collection_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection result = new com.mysql.cj.x.protobuf.MysqlxCrud.Collection(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.schema_ = schema_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Collection) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Collection)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Collection other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasSchema()) { + bitField0_ |= 0x00000002; + schema_ = other.schema_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Collection) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object schema_ = ""; + /** + * optional string schema = 2; + * @return Whether the schema field is set. + */ + public boolean hasSchema() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string schema = 2; + * @return The schema. + */ + public java.lang.String getSchema() { + java.lang.Object ref = schema_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schema_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string schema = 2; + * @return The bytes for schema. + */ + public com.google.protobuf.ByteString + getSchemaBytes() { + java.lang.Object ref = schema_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schema_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string schema = 2; + * @param value The schema to set. + * @return This builder for chaining. + */ + public Builder setSchema( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + schema_ = value; + onChanged(); + return this; + } + /** + * optional string schema = 2; + * @return This builder for chaining. + */ + public Builder clearSchema() { + bitField0_ = (bitField0_ & ~0x00000002); + schema_ = getDefaultInstance().getSchema(); + onChanged(); + return this; + } + /** + * optional string schema = 2; + * @param value The bytes for schema to set. + * @return This builder for chaining. + */ + public Builder setSchemaBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + schema_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Collection) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Collection) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Collection DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Collection(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Collection getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Collection parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Collection(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface LimitOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Limit) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required uint64 row_count = 1; + * @return Whether the rowCount field is set. + */ + boolean hasRowCount(); + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required uint64 row_count = 1; + * @return The rowCount. + */ + long getRowCount(); + + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional uint64 offset = 2; + * @return Whether the offset field is set. + */ + boolean hasOffset(); + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional uint64 offset = 2; + * @return The offset. + */ + long getOffset(); + } + /** + * Protobuf type {@code Mysqlx.Crud.Limit} + */ + public static final class Limit extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Limit) + LimitOrBuilder { + private static final long serialVersionUID = 0L; + // Use Limit.newBuilder() to construct. + private Limit(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Limit() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Limit(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Limit( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + rowCount_ = input.readUInt64(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + offset_ = input.readUInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Limit_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Limit_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.class, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder.class); + } + + private int bitField0_; + public static final int ROW_COUNT_FIELD_NUMBER = 1; + private long rowCount_; + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required uint64 row_count = 1; + * @return Whether the rowCount field is set. + */ + @java.lang.Override + public boolean hasRowCount() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required uint64 row_count = 1; + * @return The rowCount. + */ + @java.lang.Override + public long getRowCount() { + return rowCount_; + } + + public static final int OFFSET_FIELD_NUMBER = 2; + private long offset_; + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional uint64 offset = 2; + * @return Whether the offset field is set. + */ + @java.lang.Override + public boolean hasOffset() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional uint64 offset = 2; + * @return The offset. + */ + @java.lang.Override + public long getOffset() { + return offset_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasRowCount()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt64(1, rowCount_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt64(2, offset_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(1, rowCount_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, offset_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Limit)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Limit other = (com.mysql.cj.x.protobuf.MysqlxCrud.Limit) obj; + + if (hasRowCount() != other.hasRowCount()) return false; + if (hasRowCount()) { + if (getRowCount() + != other.getRowCount()) return false; + } + if (hasOffset() != other.hasOffset()) return false; + if (hasOffset()) { + if (getOffset() + != other.getOffset()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasRowCount()) { + hash = (37 * hash) + ROW_COUNT_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getRowCount()); + } + if (hasOffset()) { + hash = (37 * hash) + OFFSET_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getOffset()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Limit prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Crud.Limit} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Limit) + com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Limit_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Limit_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.class, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Limit.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + rowCount_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + offset_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Limit_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit result = new com.mysql.cj.x.protobuf.MysqlxCrud.Limit(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.rowCount_ = rowCount_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.offset_ = offset_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Limit) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Limit)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Limit other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance()) return this; + if (other.hasRowCount()) { + setRowCount(other.getRowCount()); + } + if (other.hasOffset()) { + setOffset(other.getOffset()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasRowCount()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Limit) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long rowCount_ ; + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required uint64 row_count = 1; + * @return Whether the rowCount field is set. + */ + @java.lang.Override + public boolean hasRowCount() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required uint64 row_count = 1; + * @return The rowCount. + */ + @java.lang.Override + public long getRowCount() { + return rowCount_; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required uint64 row_count = 1; + * @param value The rowCount to set. + * @return This builder for chaining. + */ + public Builder setRowCount(long value) { + bitField0_ |= 0x00000001; + rowCount_ = value; + onChanged(); + return this; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required uint64 row_count = 1; + * @return This builder for chaining. + */ + public Builder clearRowCount() { + bitField0_ = (bitField0_ & ~0x00000001); + rowCount_ = 0L; + onChanged(); + return this; + } + + private long offset_ ; + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional uint64 offset = 2; + * @return Whether the offset field is set. + */ + @java.lang.Override + public boolean hasOffset() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional uint64 offset = 2; + * @return The offset. + */ + @java.lang.Override + public long getOffset() { + return offset_; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional uint64 offset = 2; + * @param value The offset to set. + * @return This builder for chaining. + */ + public Builder setOffset(long value) { + bitField0_ |= 0x00000002; + offset_ = value; + onChanged(); + return this; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional uint64 offset = 2; + * @return This builder for chaining. + */ + public Builder clearOffset() { + bitField0_ = (bitField0_ & ~0x00000002); + offset_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Limit) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Limit) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Limit DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Limit(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Limit getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Limit parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Limit(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface LimitExprOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.LimitExpr) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return Whether the rowCount field is set. + */ + boolean hasRowCount(); + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return The rowCount. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getRowCount(); + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getRowCountOrBuilder(); + + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return Whether the offset field is set. + */ + boolean hasOffset(); + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return The offset. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getOffset(); + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getOffsetOrBuilder(); + } + /** + *
    +   **
    +   *LimitExpr, in comparison to Limit, is able to specify that row_count and
    +   *offset are placeholders.
    +   *This message support expressions of following types Expr/literal/UINT,
    +   *Expr/PLACEHOLDER.
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.LimitExpr} + */ + public static final class LimitExpr extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.LimitExpr) + LimitExprOrBuilder { + private static final long serialVersionUID = 0L; + // Use LimitExpr.newBuilder() to construct. + private LimitExpr(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private LimitExpr() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new LimitExpr(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private LimitExpr( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = rowCount_.toBuilder(); + } + rowCount_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(rowCount_); + rowCount_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = offset_.toBuilder(); + } + offset_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(offset_); + offset_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_LimitExpr_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_LimitExpr_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.class, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder.class); + } + + private int bitField0_; + public static final int ROW_COUNT_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr rowCount_; + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return Whether the rowCount field is set. + */ + @java.lang.Override + public boolean hasRowCount() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return The rowCount. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getRowCount() { + return rowCount_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : rowCount_; + } + /** + *
    +     ** maximum rows to filter 
    +     * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getRowCountOrBuilder() { + return rowCount_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : rowCount_; + } + + public static final int OFFSET_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr offset_; + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return Whether the offset field is set. + */ + @java.lang.Override + public boolean hasOffset() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return The offset. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getOffset() { + return offset_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : offset_; + } + /** + *
    +     ** maximum rows to skip before applying the row_count 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getOffsetOrBuilder() { + return offset_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : offset_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasRowCount()) { + memoizedIsInitialized = 0; + return false; + } + if (!getRowCount().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (hasOffset()) { + if (!getOffset().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getRowCount()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getOffset()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getRowCount()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getOffset()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr other = (com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr) obj; + + if (hasRowCount() != other.hasRowCount()) return false; + if (hasRowCount()) { + if (!getRowCount() + .equals(other.getRowCount())) return false; + } + if (hasOffset() != other.hasOffset()) return false; + if (hasOffset()) { + if (!getOffset() + .equals(other.getOffset())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasRowCount()) { + hash = (37 * hash) + ROW_COUNT_FIELD_NUMBER; + hash = (53 * hash) + getRowCount().hashCode(); + } + if (hasOffset()) { + hash = (37 * hash) + OFFSET_FIELD_NUMBER; + hash = (53 * hash) + getOffset().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *LimitExpr, in comparison to Limit, is able to specify that row_count and
    +     *offset are placeholders.
    +     *This message support expressions of following types Expr/literal/UINT,
    +     *Expr/PLACEHOLDER.
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.LimitExpr} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.LimitExpr) + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_LimitExpr_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_LimitExpr_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.class, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getRowCountFieldBuilder(); + getOffsetFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (rowCountBuilder_ == null) { + rowCount_ = null; + } else { + rowCountBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (offsetBuilder_ == null) { + offset_ = null; + } else { + offsetBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_LimitExpr_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr build() { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr result = new com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (rowCountBuilder_ == null) { + result.rowCount_ = rowCount_; + } else { + result.rowCount_ = rowCountBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + if (offsetBuilder_ == null) { + result.offset_ = offset_; + } else { + result.offset_ = offsetBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance()) return this; + if (other.hasRowCount()) { + mergeRowCount(other.getRowCount()); + } + if (other.hasOffset()) { + mergeOffset(other.getOffset()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasRowCount()) { + return false; + } + if (!getRowCount().isInitialized()) { + return false; + } + if (hasOffset()) { + if (!getOffset().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr rowCount_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> rowCountBuilder_; + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return Whether the rowCount field is set. + */ + public boolean hasRowCount() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + * @return The rowCount. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getRowCount() { + if (rowCountBuilder_ == null) { + return rowCount_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : rowCount_; + } else { + return rowCountBuilder_.getMessage(); + } + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public Builder setRowCount(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (rowCountBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + rowCount_ = value; + onChanged(); + } else { + rowCountBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public Builder setRowCount( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (rowCountBuilder_ == null) { + rowCount_ = builderForValue.build(); + onChanged(); + } else { + rowCountBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public Builder mergeRowCount(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (rowCountBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + rowCount_ != null && + rowCount_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + rowCount_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(rowCount_).mergeFrom(value).buildPartial(); + } else { + rowCount_ = value; + } + onChanged(); + } else { + rowCountBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public Builder clearRowCount() { + if (rowCountBuilder_ == null) { + rowCount_ = null; + onChanged(); + } else { + rowCountBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getRowCountBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getRowCountFieldBuilder().getBuilder(); + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getRowCountOrBuilder() { + if (rowCountBuilder_ != null) { + return rowCountBuilder_.getMessageOrBuilder(); + } else { + return rowCount_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : rowCount_; + } + } + /** + *
    +       ** maximum rows to filter 
    +       * 
    + * + * required .Mysqlx.Expr.Expr row_count = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getRowCountFieldBuilder() { + if (rowCountBuilder_ == null) { + rowCountBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getRowCount(), + getParentForChildren(), + isClean()); + rowCount_ = null; + } + return rowCountBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr offset_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> offsetBuilder_; + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return Whether the offset field is set. + */ + public boolean hasOffset() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + * @return The offset. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getOffset() { + if (offsetBuilder_ == null) { + return offset_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : offset_; + } else { + return offsetBuilder_.getMessage(); + } + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public Builder setOffset(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (offsetBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + offset_ = value; + onChanged(); + } else { + offsetBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public Builder setOffset( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (offsetBuilder_ == null) { + offset_ = builderForValue.build(); + onChanged(); + } else { + offsetBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public Builder mergeOffset(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (offsetBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + offset_ != null && + offset_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + offset_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(offset_).mergeFrom(value).buildPartial(); + } else { + offset_ = value; + } + onChanged(); + } else { + offsetBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public Builder clearOffset() { + if (offsetBuilder_ == null) { + offset_ = null; + onChanged(); + } else { + offsetBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getOffsetBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getOffsetFieldBuilder().getBuilder(); + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getOffsetOrBuilder() { + if (offsetBuilder_ != null) { + return offsetBuilder_.getMessageOrBuilder(); + } else { + return offset_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : offset_; + } + } + /** + *
    +       ** maximum rows to skip before applying the row_count 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr offset = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getOffsetFieldBuilder() { + if (offsetBuilder_ == null) { + offsetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getOffset(), + getParentForChildren(), + isClean()); + offset_ = null; + } + return offsetBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.LimitExpr) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.LimitExpr) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public LimitExpr parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new LimitExpr(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface OrderOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Order) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return Whether the expr field is set. + */ + boolean hasExpr(); + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return The expr. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getExpr(); + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getExprOrBuilder(); + + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return Whether the direction field is set. + */ + boolean hasDirection(); + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return The direction. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction getDirection(); + } + /** + *
    +   **
    +   *Sort order
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.Order} + */ + public static final class Order extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Order) + OrderOrBuilder { + private static final long serialVersionUID = 0L; + // Use Order.newBuilder() to construct. + private Order(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Order() { + direction_ = 1; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Order(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Order( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = expr_.toBuilder(); + } + expr_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(expr_); + expr_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction value = com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + direction_ = rawValue; + } + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Order_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Order_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.class, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Crud.Order.Direction} + */ + public enum Direction + implements com.google.protobuf.ProtocolMessageEnum { + /** + * ASC = 1; + */ + ASC(1), + /** + * DESC = 2; + */ + DESC(2), + ; + + /** + * ASC = 1; + */ + public static final int ASC_VALUE = 1; + /** + * DESC = 2; + */ + public static final int DESC_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Direction valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Direction forNumber(int value) { + switch (value) { + case 1: return ASC; + case 2: return DESC; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Direction> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Direction findValueByNumber(int number) { + return Direction.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDescriptor().getEnumTypes().get(0); + } + + private static final Direction[] VALUES = values(); + + public static Direction valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Direction(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.Order.Direction) + } + + private int bitField0_; + public static final int EXPR_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr expr_; + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return Whether the expr field is set. + */ + @java.lang.Override + public boolean hasExpr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return The expr. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getExpr() { + return expr_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : expr_; + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getExprOrBuilder() { + return expr_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : expr_; + } + + public static final int DIRECTION_FIELD_NUMBER = 2; + private int direction_; + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return Whether the direction field is set. + */ + @java.lang.Override public boolean hasDirection() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return The direction. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction getDirection() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction result = com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction.valueOf(direction_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction.ASC : result; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasExpr()) { + memoizedIsInitialized = 0; + return false; + } + if (!getExpr().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getExpr()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, direction_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getExpr()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, direction_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Order)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Order other = (com.mysql.cj.x.protobuf.MysqlxCrud.Order) obj; + + if (hasExpr() != other.hasExpr()) return false; + if (hasExpr()) { + if (!getExpr() + .equals(other.getExpr())) return false; + } + if (hasDirection() != other.hasDirection()) return false; + if (hasDirection()) { + if (direction_ != other.direction_) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasExpr()) { + hash = (37 * hash) + EXPR_FIELD_NUMBER; + hash = (53 * hash) + getExpr().hashCode(); + } + if (hasDirection()) { + hash = (37 * hash) + DIRECTION_FIELD_NUMBER; + hash = (53 * hash) + direction_; + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Order prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Sort order
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Order} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Order) + com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Order_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Order_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.class, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Order.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getExprFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (exprBuilder_ == null) { + expr_ = null; + } else { + exprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + direction_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Order_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Order result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Order result = new com.mysql.cj.x.protobuf.MysqlxCrud.Order(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (exprBuilder_ == null) { + result.expr_ = expr_; + } else { + result.expr_ = exprBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.direction_ = direction_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Order) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Order)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Order other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()) return this; + if (other.hasExpr()) { + mergeExpr(other.getExpr()); + } + if (other.hasDirection()) { + setDirection(other.getDirection()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasExpr()) { + return false; + } + if (!getExpr().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Order parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Order) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr expr_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> exprBuilder_; + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return Whether the expr field is set. + */ + public boolean hasExpr() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + * @return The expr. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getExpr() { + if (exprBuilder_ == null) { + return expr_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : expr_; + } else { + return exprBuilder_.getMessage(); + } + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public Builder setExpr(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (exprBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + expr_ = value; + onChanged(); + } else { + exprBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public Builder setExpr( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (exprBuilder_ == null) { + expr_ = builderForValue.build(); + onChanged(); + } else { + exprBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public Builder mergeExpr(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (exprBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + expr_ != null && + expr_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + expr_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(expr_).mergeFrom(value).buildPartial(); + } else { + expr_ = value; + } + onChanged(); + } else { + exprBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public Builder clearExpr() { + if (exprBuilder_ == null) { + expr_ = null; + onChanged(); + } else { + exprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getExprBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getExprFieldBuilder().getBuilder(); + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getExprOrBuilder() { + if (exprBuilder_ != null) { + return exprBuilder_.getMessageOrBuilder(); + } else { + return expr_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : expr_; + } + } + /** + * required .Mysqlx.Expr.Expr expr = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getExprFieldBuilder() { + if (exprBuilder_ == null) { + exprBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getExpr(), + getParentForChildren(), + isClean()); + expr_ = null; + } + return exprBuilder_; + } + + private int direction_ = 1; + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return Whether the direction field is set. + */ + @java.lang.Override public boolean hasDirection() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return The direction. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction getDirection() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction result = com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction.valueOf(direction_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction.ASC : result; + } + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @param value The direction to set. + * @return This builder for chaining. + */ + public Builder setDirection(com.mysql.cj.x.protobuf.MysqlxCrud.Order.Direction value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + direction_ = value.getNumber(); + onChanged(); + return this; + } + /** + * optional .Mysqlx.Crud.Order.Direction direction = 2 [default = ASC]; + * @return This builder for chaining. + */ + public Builder clearDirection() { + bitField0_ = (bitField0_ & ~0x00000002); + direction_ = 1; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Order) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Order) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Order DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Order(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Order getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Order parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Order(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface UpdateOperationOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.UpdateOperation) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return Whether the source field is set. + */ + boolean hasSource(); + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return The source. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getSource(); + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getSourceOrBuilder(); + + /** + *
    +     ** the type of operation to be performed 
    +     * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return Whether the operation field is set. + */ + boolean hasOperation(); + /** + *
    +     ** the type of operation to be performed 
    +     * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return The operation. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType getOperation(); + + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return The value. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue(); + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder(); + } + /** + * Protobuf type {@code Mysqlx.Crud.UpdateOperation} + */ + public static final class UpdateOperation extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.UpdateOperation) + UpdateOperationOrBuilder { + private static final long serialVersionUID = 0L; + // Use UpdateOperation.newBuilder() to construct. + private UpdateOperation(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private UpdateOperation() { + operation_ = 1; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new UpdateOperation(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private UpdateOperation( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = source_.toBuilder(); + } + source_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(source_); + source_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType value = com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + operation_ = rawValue; + } + break; + } + case 26: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = value_.toBuilder(); + } + value_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(value_); + value_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_UpdateOperation_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_UpdateOperation_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.class, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Crud.UpdateOperation.UpdateType} + */ + public enum UpdateType + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +       ** only allowed for TABLE 
    +       * 
    + * + * SET = 1; + */ + SET(1), + /** + *
    +       ** no value (removes the identified path from a object or array) 
    +       * 
    + * + * ITEM_REMOVE = 2; + */ + ITEM_REMOVE(2), + /** + *
    +       ** sets the new value on the identified path 
    +       * 
    + * + * ITEM_SET = 3; + */ + ITEM_SET(3), + /** + *
    +       ** replaces a value if the path exists 
    +       * 
    + * + * ITEM_REPLACE = 4; + */ + ITEM_REPLACE(4), + /** + *
    +       ** source and value must be documents 
    +       * 
    + * + * ITEM_MERGE = 5; + */ + ITEM_MERGE(5), + /** + *
    +       ** insert the value in the array at the index identified in the source path 
    +       * 
    + * + * ARRAY_INSERT = 6; + */ + ARRAY_INSERT(6), + /** + *
    +       ** append the value on the array at the identified path 
    +       * 
    + * + * ARRAY_APPEND = 7; + */ + ARRAY_APPEND(7), + /** + *
    +       ** merge JSON object value with the provided patch expression 
    +       * 
    + * + * MERGE_PATCH = 8; + */ + MERGE_PATCH(8), + ; + + /** + *
    +       ** only allowed for TABLE 
    +       * 
    + * + * SET = 1; + */ + public static final int SET_VALUE = 1; + /** + *
    +       ** no value (removes the identified path from a object or array) 
    +       * 
    + * + * ITEM_REMOVE = 2; + */ + public static final int ITEM_REMOVE_VALUE = 2; + /** + *
    +       ** sets the new value on the identified path 
    +       * 
    + * + * ITEM_SET = 3; + */ + public static final int ITEM_SET_VALUE = 3; + /** + *
    +       ** replaces a value if the path exists 
    +       * 
    + * + * ITEM_REPLACE = 4; + */ + public static final int ITEM_REPLACE_VALUE = 4; + /** + *
    +       ** source and value must be documents 
    +       * 
    + * + * ITEM_MERGE = 5; + */ + public static final int ITEM_MERGE_VALUE = 5; + /** + *
    +       ** insert the value in the array at the index identified in the source path 
    +       * 
    + * + * ARRAY_INSERT = 6; + */ + public static final int ARRAY_INSERT_VALUE = 6; + /** + *
    +       ** append the value on the array at the identified path 
    +       * 
    + * + * ARRAY_APPEND = 7; + */ + public static final int ARRAY_APPEND_VALUE = 7; + /** + *
    +       ** merge JSON object value with the provided patch expression 
    +       * 
    + * + * MERGE_PATCH = 8; + */ + public static final int MERGE_PATCH_VALUE = 8; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static UpdateType valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static UpdateType forNumber(int value) { + switch (value) { + case 1: return SET; + case 2: return ITEM_REMOVE; + case 3: return ITEM_SET; + case 4: return ITEM_REPLACE; + case 5: return ITEM_MERGE; + case 6: return ARRAY_INSERT; + case 7: return ARRAY_APPEND; + case 8: return MERGE_PATCH; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + UpdateType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public UpdateType findValueByNumber(int number) { + return UpdateType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.getDescriptor().getEnumTypes().get(0); + } + + private static final UpdateType[] VALUES = values(); + + public static UpdateType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private UpdateType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.UpdateOperation.UpdateType) + } + + private int bitField0_; + public static final int SOURCE_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier source_; + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return Whether the source field is set. + */ + @java.lang.Override + public boolean hasSource() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return The source. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getSource() { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : source_; + } + /** + *
    +     ** specification of the value to be updated
    +     *- if data_model is TABLE, a column name may be specified and also
    +     *a document path, if the column has type JSON
    +     *- if data_model is DOCUMENT, only document paths are allowed
    +     *@note in both cases, schema and table must be not set 
    +     * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getSourceOrBuilder() { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : source_; + } + + public static final int OPERATION_FIELD_NUMBER = 2; + private int operation_; + /** + *
    +     ** the type of operation to be performed 
    +     * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return Whether the operation field is set. + */ + @java.lang.Override public boolean hasOperation() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** the type of operation to be performed 
    +     * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return The operation. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType getOperation() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType result = com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType.valueOf(operation_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType.SET : result; + } + + public static final int VALUE_FIELD_NUMBER = 3; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr value_; + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return The value. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + /** + *
    +     ** an expression to be computed as the new value for the operation 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasSource()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasOperation()) { + memoizedIsInitialized = 0; + return false; + } + if (!getSource().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (hasValue()) { + if (!getValue().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getSource()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, operation_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(3, getValue()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getSource()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, operation_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getValue()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation other = (com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation) obj; + + if (hasSource() != other.hasSource()) return false; + if (hasSource()) { + if (!getSource() + .equals(other.getSource())) return false; + } + if (hasOperation() != other.hasOperation()) return false; + if (hasOperation()) { + if (operation_ != other.operation_) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasSource()) { + hash = (37 * hash) + SOURCE_FIELD_NUMBER; + hash = (53 * hash) + getSource().hashCode(); + } + if (hasOperation()) { + hash = (37 * hash) + OPERATION_FIELD_NUMBER; + hash = (53 * hash) + operation_; + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Crud.UpdateOperation} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.UpdateOperation) + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_UpdateOperation_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_UpdateOperation_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.class, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getSourceFieldBuilder(); + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (sourceBuilder_ == null) { + source_ = null; + } else { + sourceBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + operation_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + if (valueBuilder_ == null) { + value_ = null; + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_UpdateOperation_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation build() { + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation result = new com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (sourceBuilder_ == null) { + result.source_ = source_; + } else { + result.source_ = sourceBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.operation_ = operation_; + if (((from_bitField0_ & 0x00000004) != 0)) { + if (valueBuilder_ == null) { + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.getDefaultInstance()) return this; + if (other.hasSource()) { + mergeSource(other.getSource()); + } + if (other.hasOperation()) { + setOperation(other.getOperation()); + } + if (other.hasValue()) { + mergeValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasSource()) { + return false; + } + if (!hasOperation()) { + return false; + } + if (!getSource().isInitialized()) { + return false; + } + if (hasValue()) { + if (!getValue().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier source_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder> sourceBuilder_; + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return Whether the source field is set. + */ + public boolean hasSource() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + * @return The source. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getSource() { + if (sourceBuilder_ == null) { + return source_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : source_; + } else { + return sourceBuilder_.getMessage(); + } + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public Builder setSource(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier value) { + if (sourceBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + source_ = value; + onChanged(); + } else { + sourceBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public Builder setSource( + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder builderForValue) { + if (sourceBuilder_ == null) { + source_ = builderForValue.build(); + onChanged(); + } else { + sourceBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public Builder mergeSource(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier value) { + if (sourceBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + source_ != null && + source_ != com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance()) { + source_ = + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.newBuilder(source_).mergeFrom(value).buildPartial(); + } else { + source_ = value; + } + onChanged(); + } else { + sourceBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public Builder clearSource() { + if (sourceBuilder_ == null) { + source_ = null; + onChanged(); + } else { + sourceBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder getSourceBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getSourceFieldBuilder().getBuilder(); + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getSourceOrBuilder() { + if (sourceBuilder_ != null) { + return sourceBuilder_.getMessageOrBuilder(); + } else { + return source_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : source_; + } + } + /** + *
    +       ** specification of the value to be updated
    +       *- if data_model is TABLE, a column name may be specified and also
    +       *a document path, if the column has type JSON
    +       *- if data_model is DOCUMENT, only document paths are allowed
    +       *@note in both cases, schema and table must be not set 
    +       * 
    + * + * required .Mysqlx.Expr.ColumnIdentifier source = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder> + getSourceFieldBuilder() { + if (sourceBuilder_ == null) { + sourceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder>( + getSource(), + getParentForChildren(), + isClean()); + source_ = null; + } + return sourceBuilder_; + } + + private int operation_ = 1; + /** + *
    +       ** the type of operation to be performed 
    +       * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return Whether the operation field is set. + */ + @java.lang.Override public boolean hasOperation() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** the type of operation to be performed 
    +       * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return The operation. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType getOperation() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType result = com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType.valueOf(operation_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType.SET : result; + } + /** + *
    +       ** the type of operation to be performed 
    +       * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @param value The operation to set. + * @return This builder for chaining. + */ + public Builder setOperation(com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + operation_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** the type of operation to be performed 
    +       * 
    + * + * required .Mysqlx.Crud.UpdateOperation.UpdateType operation = 2; + * @return This builder for chaining. + */ + public Builder clearOperation() { + bitField0_ = (bitField0_ & ~0x00000002); + operation_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr value_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> valueBuilder_; + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + * @return The value. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue() { + if (valueBuilder_ == null) { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } else { + return valueBuilder_.getMessage(); + } + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public Builder setValue(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + value_ = value; + onChanged(); + } else { + valueBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public Builder setValue( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (valueBuilder_ == null) { + value_ = builderForValue.build(); + onChanged(); + } else { + valueBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public Builder mergeValue(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + value_ != null && + value_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + value_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(value_).mergeFrom(value).buildPartial(); + } else { + value_ = value; + } + onChanged(); + } else { + valueBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = null; + onChanged(); + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getValueBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getValueFieldBuilder().getBuilder(); + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilder(); + } else { + return value_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + } + /** + *
    +       ** an expression to be computed as the new value for the operation 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr value = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getValue(), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.UpdateOperation) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.UpdateOperation) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public UpdateOperation parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new UpdateOperation(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FindOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Find) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + boolean hasDataModel(); + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel(); + + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + java.util.List + getProjectionList(); + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Projection getProjection(int index); + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + int getProjectionCount(); + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + java.util.List + getProjectionOrBuilderList(); + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder getProjectionOrBuilder( + int index); + + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + java.util.List + getArgsList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + int getArgsCount(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return Whether the criteria field is set. + */ + boolean hasCriteria(); + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return The criteria. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria(); + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder(); + + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return Whether the limit field is set. + */ + boolean hasLimit(); + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return The limit. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit(); + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder(); + + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + java.util.List + getOrderList(); + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index); + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + int getOrderCount(); + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + java.util.List + getOrderOrBuilderList(); + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index); + + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + java.util.List + getGroupingList(); + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGrouping(int index); + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + int getGroupingCount(); + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + java.util.List + getGroupingOrBuilderList(); + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingOrBuilder( + int index); + + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return Whether the groupingCriteria field is set. + */ + boolean hasGroupingCriteria(); + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return The groupingCriteria. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGroupingCriteria(); + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingCriteriaOrBuilder(); + + /** + *
    +     ** perform row locking on matches 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return Whether the locking field is set. + */ + boolean hasLocking(); + /** + *
    +     ** perform row locking on matches 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return The locking. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock getLocking(); + + /** + *
    +     ** additional options how to handle locked rows 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return Whether the lockingOptions field is set. + */ + boolean hasLockingOptions(); + /** + *
    +     ** additional options how to handle locked rows 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return The lockingOptions. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions getLockingOptions(); + + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return Whether the limitExpr field is set. + */ + boolean hasLimitExpr(); + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return The limitExpr. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr(); + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder(); + } + /** + *
    +   **
    +   *Find Documents/Rows in a Collection/Table
    +   *@startuml
    +   *client -> server: Find
    +   *... one or more Resultset ...
    +   *@enduml
    +   *@returns @ref Mysqlx::Resultset
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.Find} + */ + public static final class Find extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Find) + FindOrBuilder { + private static final long serialVersionUID = 0L; + // Use Find.newBuilder() to construct. + private Find(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Find() { + dataModel_ = 1; + projection_ = java.util.Collections.emptyList(); + args_ = java.util.Collections.emptyList(); + order_ = java.util.Collections.emptyList(); + grouping_ = java.util.Collections.emptyList(); + locking_ = 1; + lockingOptions_ = 1; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Find(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Find( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 18: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000002; + dataModel_ = rawValue; + } + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + projection_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + projection_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Projection.PARSER, extensionRegistry)); + break; + } + case 42: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = criteria_.toBuilder(); + } + criteria_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(criteria_); + criteria_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 50: { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = limit_.toBuilder(); + } + limit_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Limit.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limit_); + limit_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 58: { + if (!((mutable_bitField0_ & 0x00000040) != 0)) { + order_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000040; + } + order_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Order.PARSER, extensionRegistry)); + break; + } + case 66: { + if (!((mutable_bitField0_ & 0x00000080) != 0)) { + grouping_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000080; + } + grouping_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry)); + break; + } + case 74: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = groupingCriteria_.toBuilder(); + } + groupingCriteria_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(groupingCriteria_); + groupingCriteria_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 90: { + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry)); + break; + } + case 96: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock value = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(12, rawValue); + } else { + bitField0_ |= 0x00000020; + locking_ = rawValue; + } + break; + } + case 104: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions value = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(13, rawValue); + } else { + bitField0_ |= 0x00000040; + lockingOptions_ = rawValue; + } + break; + } + case 114: { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) != 0)) { + subBuilder = limitExpr_.toBuilder(); + } + limitExpr_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limitExpr_); + limitExpr_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + projection_ = java.util.Collections.unmodifiableList(projection_); + } + if (((mutable_bitField0_ & 0x00000040) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + } + if (((mutable_bitField0_ & 0x00000080) != 0)) { + grouping_ = java.util.Collections.unmodifiableList(grouping_); + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Find_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Find_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Find.class, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Crud.Find.RowLock} + */ + public enum RowLock + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +       ** Lock matching rows against updates 
    +       * 
    + * + * SHARED_LOCK = 1; + */ + SHARED_LOCK(1), + /** + *
    +       ** Lock matching rows so no other transaction can read or write to it 
    +       * 
    + * + * EXCLUSIVE_LOCK = 2; + */ + EXCLUSIVE_LOCK(2), + ; + + /** + *
    +       ** Lock matching rows against updates 
    +       * 
    + * + * SHARED_LOCK = 1; + */ + public static final int SHARED_LOCK_VALUE = 1; + /** + *
    +       ** Lock matching rows so no other transaction can read or write to it 
    +       * 
    + * + * EXCLUSIVE_LOCK = 2; + */ + public static final int EXCLUSIVE_LOCK_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static RowLock valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static RowLock forNumber(int value) { + switch (value) { + case 1: return SHARED_LOCK; + case 2: return EXCLUSIVE_LOCK; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + RowLock> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public RowLock findValueByNumber(int number) { + return RowLock.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDescriptor().getEnumTypes().get(0); + } + + private static final RowLock[] VALUES = values(); + + public static RowLock valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private RowLock(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.Find.RowLock) + } + + /** + * Protobuf enum {@code Mysqlx.Crud.Find.RowLockOptions} + */ + public enum RowLockOptions + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +       ** Do not wait to acquire row lock, fail with an error
    +       *if a requested row is locked 
    +       * 
    + * + * NOWAIT = 1; + */ + NOWAIT(1), + /** + *
    +       ** Do not wait to acquire a row lock,
    +       *remove locked rows from the result set 
    +       * 
    + * + * SKIP_LOCKED = 2; + */ + SKIP_LOCKED(2), + ; + + /** + *
    +       ** Do not wait to acquire row lock, fail with an error
    +       *if a requested row is locked 
    +       * 
    + * + * NOWAIT = 1; + */ + public static final int NOWAIT_VALUE = 1; + /** + *
    +       ** Do not wait to acquire a row lock,
    +       *remove locked rows from the result set 
    +       * 
    + * + * SKIP_LOCKED = 2; + */ + public static final int SKIP_LOCKED_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static RowLockOptions valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static RowLockOptions forNumber(int value) { + switch (value) { + case 1: return NOWAIT; + case 2: return SKIP_LOCKED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + RowLockOptions> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public RowLockOptions findValueByNumber(int number) { + return RowLockOptions.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDescriptor().getEnumTypes().get(1); + } + + private static final RowLockOptions[] VALUES = values(); + + public static RowLockOptions valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private RowLockOptions(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Crud.Find.RowLockOptions) + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** collection in which to find 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DATA_MODEL_FIELD_NUMBER = 3; + private int dataModel_; + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + + public static final int PROJECTION_FIELD_NUMBER = 4; + private java.util.List projection_; + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + @java.lang.Override + public java.util.List getProjectionList() { + return projection_; + } + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + @java.lang.Override + public java.util.List + getProjectionOrBuilderList() { + return projection_; + } + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + @java.lang.Override + public int getProjectionCount() { + return projection_.size(); + } + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection getProjection(int index) { + return projection_.get(index); + } + /** + *
    +     ** list of column projections that shall be returned 
    +     * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder getProjectionOrBuilder( + int index) { + return projection_.get(index); + } + + public static final int ARGS_FIELD_NUMBER = 11; + private java.util.List args_; + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int CRITERIA_FIELD_NUMBER = 5; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return Whether the criteria field is set. + */ + @java.lang.Override + public boolean hasCriteria() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return The criteria. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + /** + *
    +     ** filter criteria 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + + public static final int LIMIT_FIELD_NUMBER = 6; + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return Whether the limit field is set. + */ + @java.lang.Override + public boolean hasLimit() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return The limit. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + + public static final int ORDER_FIELD_NUMBER = 7; + private java.util.List order_; + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + @java.lang.Override + public java.util.List getOrderList() { + return order_; + } + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + @java.lang.Override + public java.util.List + getOrderOrBuilderList() { + return order_; + } + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + @java.lang.Override + public int getOrderCount() { + return order_.size(); + } + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + return order_.get(index); + } + /** + *
    +     ** sort-order in which the rows/document shall be returned in 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + return order_.get(index); + } + + public static final int GROUPING_FIELD_NUMBER = 8; + private java.util.List grouping_; + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + @java.lang.Override + public java.util.List getGroupingList() { + return grouping_; + } + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + @java.lang.Override + public java.util.List + getGroupingOrBuilderList() { + return grouping_; + } + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + @java.lang.Override + public int getGroupingCount() { + return grouping_.size(); + } + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGrouping(int index) { + return grouping_.get(index); + } + /** + *
    +     ** column expression list for aggregation (GROUP BY) 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingOrBuilder( + int index) { + return grouping_.get(index); + } + + public static final int GROUPING_CRITERIA_FIELD_NUMBER = 9; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr groupingCriteria_; + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return Whether the groupingCriteria field is set. + */ + @java.lang.Override + public boolean hasGroupingCriteria() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return The groupingCriteria. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGroupingCriteria() { + return groupingCriteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : groupingCriteria_; + } + /** + *
    +     ** filter criteria for aggregated groups 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingCriteriaOrBuilder() { + return groupingCriteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : groupingCriteria_; + } + + public static final int LOCKING_FIELD_NUMBER = 12; + private int locking_; + /** + *
    +     ** perform row locking on matches 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return Whether the locking field is set. + */ + @java.lang.Override public boolean hasLocking() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +     ** perform row locking on matches 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return The locking. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock getLocking() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock result = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock.valueOf(locking_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock.SHARED_LOCK : result; + } + + public static final int LOCKING_OPTIONS_FIELD_NUMBER = 13; + private int lockingOptions_; + /** + *
    +     ** additional options how to handle locked rows 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return Whether the lockingOptions field is set. + */ + @java.lang.Override public boolean hasLockingOptions() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +     ** additional options how to handle locked rows 
    +     * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return The lockingOptions. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions getLockingOptions() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions result = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions.valueOf(lockingOptions_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions.NOWAIT : result; + } + + public static final int LIMIT_EXPR_FIELD_NUMBER = 14; + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return Whether the limitExpr field is set. + */ + @java.lang.Override + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return The limitExpr. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + /** + *
    +     ** numbers of rows that shall be skipped and returned
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getProjectionCount(); i++) { + if (!getProjection(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getGroupingCount(); i++) { + if (!getGrouping(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasGroupingCriteria()) { + if (!getGroupingCriteria().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(2, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(3, dataModel_); + } + for (int i = 0; i < projection_.size(); i++) { + output.writeMessage(4, projection_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(5, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(6, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + output.writeMessage(7, order_.get(i)); + } + for (int i = 0; i < grouping_.size(); i++) { + output.writeMessage(8, grouping_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(9, getGroupingCriteria()); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(11, args_.get(i)); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeEnum(12, locking_); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeEnum(13, lockingOptions_); + } + if (((bitField0_ & 0x00000080) != 0)) { + output.writeMessage(14, getLimitExpr()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, dataModel_); + } + for (int i = 0; i < projection_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, projection_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, order_.get(i)); + } + for (int i = 0; i < grouping_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, grouping_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, getGroupingCriteria()); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(11, args_.get(i)); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(12, locking_); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(13, lockingOptions_); + } + if (((bitField0_ & 0x00000080) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(14, getLimitExpr()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Find)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Find other = (com.mysql.cj.x.protobuf.MysqlxCrud.Find) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDataModel() != other.hasDataModel()) return false; + if (hasDataModel()) { + if (dataModel_ != other.dataModel_) return false; + } + if (!getProjectionList() + .equals(other.getProjectionList())) return false; + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasCriteria() != other.hasCriteria()) return false; + if (hasCriteria()) { + if (!getCriteria() + .equals(other.getCriteria())) return false; + } + if (hasLimit() != other.hasLimit()) return false; + if (hasLimit()) { + if (!getLimit() + .equals(other.getLimit())) return false; + } + if (!getOrderList() + .equals(other.getOrderList())) return false; + if (!getGroupingList() + .equals(other.getGroupingList())) return false; + if (hasGroupingCriteria() != other.hasGroupingCriteria()) return false; + if (hasGroupingCriteria()) { + if (!getGroupingCriteria() + .equals(other.getGroupingCriteria())) return false; + } + if (hasLocking() != other.hasLocking()) return false; + if (hasLocking()) { + if (locking_ != other.locking_) return false; + } + if (hasLockingOptions() != other.hasLockingOptions()) return false; + if (hasLockingOptions()) { + if (lockingOptions_ != other.lockingOptions_) return false; + } + if (hasLimitExpr() != other.hasLimitExpr()) return false; + if (hasLimitExpr()) { + if (!getLimitExpr() + .equals(other.getLimitExpr())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDataModel()) { + hash = (37 * hash) + DATA_MODEL_FIELD_NUMBER; + hash = (53 * hash) + dataModel_; + } + if (getProjectionCount() > 0) { + hash = (37 * hash) + PROJECTION_FIELD_NUMBER; + hash = (53 * hash) + getProjectionList().hashCode(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasCriteria()) { + hash = (37 * hash) + CRITERIA_FIELD_NUMBER; + hash = (53 * hash) + getCriteria().hashCode(); + } + if (hasLimit()) { + hash = (37 * hash) + LIMIT_FIELD_NUMBER; + hash = (53 * hash) + getLimit().hashCode(); + } + if (getOrderCount() > 0) { + hash = (37 * hash) + ORDER_FIELD_NUMBER; + hash = (53 * hash) + getOrderList().hashCode(); + } + if (getGroupingCount() > 0) { + hash = (37 * hash) + GROUPING_FIELD_NUMBER; + hash = (53 * hash) + getGroupingList().hashCode(); + } + if (hasGroupingCriteria()) { + hash = (37 * hash) + GROUPING_CRITERIA_FIELD_NUMBER; + hash = (53 * hash) + getGroupingCriteria().hashCode(); + } + if (hasLocking()) { + hash = (37 * hash) + LOCKING_FIELD_NUMBER; + hash = (53 * hash) + locking_; + } + if (hasLockingOptions()) { + hash = (37 * hash) + LOCKING_OPTIONS_FIELD_NUMBER; + hash = (53 * hash) + lockingOptions_; + } + if (hasLimitExpr()) { + hash = (37 * hash) + LIMIT_EXPR_FIELD_NUMBER; + hash = (53 * hash) + getLimitExpr().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Find prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Find Documents/Rows in a Collection/Table
    +     *@startuml
    +     *client -> server: Find
    +     *... one or more Resultset ...
    +     *@enduml
    +     *@returns @ref Mysqlx::Resultset
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Find} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Find) + com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Find_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Find_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Find.class, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Find.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getProjectionFieldBuilder(); + getArgsFieldBuilder(); + getCriteriaFieldBuilder(); + getLimitFieldBuilder(); + getOrderFieldBuilder(); + getGroupingFieldBuilder(); + getGroupingCriteriaFieldBuilder(); + getLimitExprFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + dataModel_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + if (projectionBuilder_ == null) { + projection_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + projectionBuilder_.clear(); + } + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + argsBuilder_.clear(); + } + if (criteriaBuilder_ == null) { + criteria_ = null; + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (limitBuilder_ == null) { + limit_ = null; + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + } else { + orderBuilder_.clear(); + } + if (groupingBuilder_ == null) { + grouping_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000080); + } else { + groupingBuilder_.clear(); + } + if (groupingCriteriaBuilder_ == null) { + groupingCriteria_ = null; + } else { + groupingCriteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + locking_ = 1; + bitField0_ = (bitField0_ & ~0x00000200); + lockingOptions_ = 1; + bitField0_ = (bitField0_ & ~0x00000400); + if (limitExprBuilder_ == null) { + limitExpr_ = null; + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Find_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Find result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Find result = new com.mysql.cj.x.protobuf.MysqlxCrud.Find(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.dataModel_ = dataModel_; + if (projectionBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + projection_ = java.util.Collections.unmodifiableList(projection_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.projection_ = projection_; + } else { + result.projection_ = projectionBuilder_.build(); + } + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000010) != 0)) { + if (criteriaBuilder_ == null) { + result.criteria_ = criteria_; + } else { + result.criteria_ = criteriaBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + if (limitBuilder_ == null) { + result.limit_ = limit_; + } else { + result.limit_ = limitBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (orderBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.order_ = order_; + } else { + result.order_ = orderBuilder_.build(); + } + if (groupingBuilder_ == null) { + if (((bitField0_ & 0x00000080) != 0)) { + grouping_ = java.util.Collections.unmodifiableList(grouping_); + bitField0_ = (bitField0_ & ~0x00000080); + } + result.grouping_ = grouping_; + } else { + result.grouping_ = groupingBuilder_.build(); + } + if (((from_bitField0_ & 0x00000100) != 0)) { + if (groupingCriteriaBuilder_ == null) { + result.groupingCriteria_ = groupingCriteria_; + } else { + result.groupingCriteria_ = groupingCriteriaBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000200) != 0)) { + to_bitField0_ |= 0x00000020; + } + result.locking_ = locking_; + if (((from_bitField0_ & 0x00000400) != 0)) { + to_bitField0_ |= 0x00000040; + } + result.lockingOptions_ = lockingOptions_; + if (((from_bitField0_ & 0x00000800) != 0)) { + if (limitExprBuilder_ == null) { + result.limitExpr_ = limitExpr_; + } else { + result.limitExpr_ = limitExprBuilder_.build(); + } + to_bitField0_ |= 0x00000080; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Find) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Find)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Find other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDataModel()) { + setDataModel(other.getDataModel()); + } + if (projectionBuilder_ == null) { + if (!other.projection_.isEmpty()) { + if (projection_.isEmpty()) { + projection_ = other.projection_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureProjectionIsMutable(); + projection_.addAll(other.projection_); + } + onChanged(); + } + } else { + if (!other.projection_.isEmpty()) { + if (projectionBuilder_.isEmpty()) { + projectionBuilder_.dispose(); + projectionBuilder_ = null; + projection_ = other.projection_; + bitField0_ = (bitField0_ & ~0x00000004); + projectionBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getProjectionFieldBuilder() : null; + } else { + projectionBuilder_.addAllMessages(other.projection_); + } + } + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000008); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasCriteria()) { + mergeCriteria(other.getCriteria()); + } + if (other.hasLimit()) { + mergeLimit(other.getLimit()); + } + if (orderBuilder_ == null) { + if (!other.order_.isEmpty()) { + if (order_.isEmpty()) { + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureOrderIsMutable(); + order_.addAll(other.order_); + } + onChanged(); + } + } else { + if (!other.order_.isEmpty()) { + if (orderBuilder_.isEmpty()) { + orderBuilder_.dispose(); + orderBuilder_ = null; + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000040); + orderBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getOrderFieldBuilder() : null; + } else { + orderBuilder_.addAllMessages(other.order_); + } + } + } + if (groupingBuilder_ == null) { + if (!other.grouping_.isEmpty()) { + if (grouping_.isEmpty()) { + grouping_ = other.grouping_; + bitField0_ = (bitField0_ & ~0x00000080); + } else { + ensureGroupingIsMutable(); + grouping_.addAll(other.grouping_); + } + onChanged(); + } + } else { + if (!other.grouping_.isEmpty()) { + if (groupingBuilder_.isEmpty()) { + groupingBuilder_.dispose(); + groupingBuilder_ = null; + grouping_ = other.grouping_; + bitField0_ = (bitField0_ & ~0x00000080); + groupingBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getGroupingFieldBuilder() : null; + } else { + groupingBuilder_.addAllMessages(other.grouping_); + } + } + } + if (other.hasGroupingCriteria()) { + mergeGroupingCriteria(other.getGroupingCriteria()); + } + if (other.hasLocking()) { + setLocking(other.getLocking()); + } + if (other.hasLockingOptions()) { + setLockingOptions(other.getLockingOptions()); + } + if (other.hasLimitExpr()) { + mergeLimitExpr(other.getLimitExpr()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + for (int i = 0; i < getProjectionCount(); i++) { + if (!getProjection(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getGroupingCount(); i++) { + if (!getGrouping(i).isInitialized()) { + return false; + } + } + if (hasGroupingCriteria()) { + if (!getGroupingCriteria().isInitialized()) { + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Find parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Find) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** collection in which to find 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private int dataModel_ = 1; + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @param value The dataModel to set. + * @return This builder for chaining. + */ + public Builder setDataModel(com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + dataModel_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return This builder for chaining. + */ + public Builder clearDataModel() { + bitField0_ = (bitField0_ & ~0x00000002); + dataModel_ = 1; + onChanged(); + return this; + } + + private java.util.List projection_ = + java.util.Collections.emptyList(); + private void ensureProjectionIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + projection_ = new java.util.ArrayList(projection_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Projection, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder> projectionBuilder_; + + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public java.util.List getProjectionList() { + if (projectionBuilder_ == null) { + return java.util.Collections.unmodifiableList(projection_); + } else { + return projectionBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public int getProjectionCount() { + if (projectionBuilder_ == null) { + return projection_.size(); + } else { + return projectionBuilder_.getCount(); + } + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection getProjection(int index) { + if (projectionBuilder_ == null) { + return projection_.get(index); + } else { + return projectionBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder setProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Projection value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.set(index, value); + onChanged(); + } else { + projectionBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder setProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.set(index, builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder addProjection(com.mysql.cj.x.protobuf.MysqlxCrud.Projection value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.add(value); + onChanged(); + } else { + projectionBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder addProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Projection value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.add(index, value); + onChanged(); + } else { + projectionBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder addProjection( + com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.add(builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder addProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.add(index, builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder addAllProjection( + java.lang.Iterable values) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, projection_); + onChanged(); + } else { + projectionBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder clearProjection() { + if (projectionBuilder_ == null) { + projection_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + projectionBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public Builder removeProjection(int index) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.remove(index); + onChanged(); + } else { + projectionBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder getProjectionBuilder( + int index) { + return getProjectionFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder getProjectionOrBuilder( + int index) { + if (projectionBuilder_ == null) { + return projection_.get(index); } else { + return projectionBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public java.util.List + getProjectionOrBuilderList() { + if (projectionBuilder_ != null) { + return projectionBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(projection_); + } + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder addProjectionBuilder() { + return getProjectionFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Projection.getDefaultInstance()); + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder addProjectionBuilder( + int index) { + return getProjectionFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.getDefaultInstance()); + } + /** + *
    +       ** list of column projections that shall be returned 
    +       * 
    + * + * repeated .Mysqlx.Crud.Projection projection = 4; + */ + public java.util.List + getProjectionBuilderList() { + return getProjectionFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Projection, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder> + getProjectionFieldBuilder() { + if (projectionBuilder_ == null) { + projectionBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Projection, com.mysql.cj.x.protobuf.MysqlxCrud.Projection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ProjectionOrBuilder>( + projection_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + projection_ = null; + } + return projectionBuilder_; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> argsBuilder_; + + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 11; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + args_, + ((bitField0_ & 0x00000008) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> criteriaBuilder_; + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return Whether the criteria field is set. + */ + public boolean hasCriteria() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + * @return The criteria. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + if (criteriaBuilder_ == null) { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } else { + return criteriaBuilder_.getMessage(); + } + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public Builder setCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + criteria_ = value; + onChanged(); + } else { + criteriaBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public Builder setCriteria( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (criteriaBuilder_ == null) { + criteria_ = builderForValue.build(); + onChanged(); + } else { + criteriaBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public Builder mergeCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) && + criteria_ != null && + criteria_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + criteria_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(criteria_).mergeFrom(value).buildPartial(); + } else { + criteria_ = value; + } + onChanged(); + } else { + criteriaBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public Builder clearCriteria() { + if (criteriaBuilder_ == null) { + criteria_ = null; + onChanged(); + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getCriteriaBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getCriteriaFieldBuilder().getBuilder(); + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + if (criteriaBuilder_ != null) { + return criteriaBuilder_.getMessageOrBuilder(); + } else { + return criteria_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + } + /** + *
    +       ** filter criteria 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getCriteriaFieldBuilder() { + if (criteriaBuilder_ == null) { + criteriaBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getCriteria(), + getParentForChildren(), + isClean()); + criteria_ = null; + } + return criteriaBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> limitBuilder_; + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return Whether the limit field is set. + */ + public boolean hasLimit() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + * @return The limit. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + if (limitBuilder_ == null) { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } else { + return limitBuilder_.getMessage(); + } + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public Builder setLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limit_ = value; + onChanged(); + } else { + limitBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public Builder setLimit( + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder builderForValue) { + if (limitBuilder_ == null) { + limit_ = builderForValue.build(); + onChanged(); + } else { + limitBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public Builder mergeLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0) && + limit_ != null && + limit_ != com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance()) { + limit_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.newBuilder(limit_).mergeFrom(value).buildPartial(); + } else { + limit_ = value; + } + onChanged(); + } else { + limitBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public Builder clearLimit() { + if (limitBuilder_ == null) { + limit_ = null; + onChanged(); + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder getLimitBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getLimitFieldBuilder().getBuilder(); + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + if (limitBuilder_ != null) { + return limitBuilder_.getMessageOrBuilder(); + } else { + return limit_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 6; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> + getLimitFieldBuilder() { + if (limitBuilder_ == null) { + limitBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder>( + getLimit(), + getParentForChildren(), + isClean()); + limit_ = null; + } + return limitBuilder_; + } + + private java.util.List order_ = + java.util.Collections.emptyList(); + private void ensureOrderIsMutable() { + if (!((bitField0_ & 0x00000040) != 0)) { + order_ = new java.util.ArrayList(order_); + bitField0_ |= 0x00000040; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> orderBuilder_; + + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public java.util.List getOrderList() { + if (orderBuilder_ == null) { + return java.util.Collections.unmodifiableList(order_); + } else { + return orderBuilder_.getMessageList(); + } + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public int getOrderCount() { + if (orderBuilder_ == null) { + return order_.size(); + } else { + return orderBuilder_.getCount(); + } + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + if (orderBuilder_ == null) { + return order_.get(index); + } else { + return orderBuilder_.getMessage(index); + } + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.set(index, value); + onChanged(); + } else { + orderBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.set(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder addOrder(com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(value); + onChanged(); + } else { + orderBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(index, value); + onChanged(); + } else { + orderBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder addOrder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder addAllOrder( + java.lang.Iterable values) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, order_); + onChanged(); + } else { + orderBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder clearOrder() { + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + } else { + orderBuilder_.clear(); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public Builder removeOrder(int index) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.remove(index); + onChanged(); + } else { + orderBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder getOrderBuilder( + int index) { + return getOrderFieldBuilder().getBuilder(index); + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + if (orderBuilder_ == null) { + return order_.get(index); } else { + return orderBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public java.util.List + getOrderOrBuilderList() { + if (orderBuilder_ != null) { + return orderBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(order_); + } + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder() { + return getOrderFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder( + int index) { + return getOrderFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** sort-order in which the rows/document shall be returned in 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 7; + */ + public java.util.List + getOrderBuilderList() { + return getOrderFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> + getOrderFieldBuilder() { + if (orderBuilder_ == null) { + orderBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder>( + order_, + ((bitField0_ & 0x00000040) != 0), + getParentForChildren(), + isClean()); + order_ = null; + } + return orderBuilder_; + } + + private java.util.List grouping_ = + java.util.Collections.emptyList(); + private void ensureGroupingIsMutable() { + if (!((bitField0_ & 0x00000080) != 0)) { + grouping_ = new java.util.ArrayList(grouping_); + bitField0_ |= 0x00000080; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> groupingBuilder_; + + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public java.util.List getGroupingList() { + if (groupingBuilder_ == null) { + return java.util.Collections.unmodifiableList(grouping_); + } else { + return groupingBuilder_.getMessageList(); + } + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public int getGroupingCount() { + if (groupingBuilder_ == null) { + return grouping_.size(); + } else { + return groupingBuilder_.getCount(); + } + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGrouping(int index) { + if (groupingBuilder_ == null) { + return grouping_.get(index); + } else { + return groupingBuilder_.getMessage(index); + } + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder setGrouping( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (groupingBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureGroupingIsMutable(); + grouping_.set(index, value); + onChanged(); + } else { + groupingBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder setGrouping( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (groupingBuilder_ == null) { + ensureGroupingIsMutable(); + grouping_.set(index, builderForValue.build()); + onChanged(); + } else { + groupingBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder addGrouping(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (groupingBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureGroupingIsMutable(); + grouping_.add(value); + onChanged(); + } else { + groupingBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder addGrouping( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (groupingBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureGroupingIsMutable(); + grouping_.add(index, value); + onChanged(); + } else { + groupingBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder addGrouping( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (groupingBuilder_ == null) { + ensureGroupingIsMutable(); + grouping_.add(builderForValue.build()); + onChanged(); + } else { + groupingBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder addGrouping( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (groupingBuilder_ == null) { + ensureGroupingIsMutable(); + grouping_.add(index, builderForValue.build()); + onChanged(); + } else { + groupingBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder addAllGrouping( + java.lang.Iterable values) { + if (groupingBuilder_ == null) { + ensureGroupingIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, grouping_); + onChanged(); + } else { + groupingBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder clearGrouping() { + if (groupingBuilder_ == null) { + grouping_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000080); + onChanged(); + } else { + groupingBuilder_.clear(); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public Builder removeGrouping(int index) { + if (groupingBuilder_ == null) { + ensureGroupingIsMutable(); + grouping_.remove(index); + onChanged(); + } else { + groupingBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getGroupingBuilder( + int index) { + return getGroupingFieldBuilder().getBuilder(index); + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingOrBuilder( + int index) { + if (groupingBuilder_ == null) { + return grouping_.get(index); } else { + return groupingBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public java.util.List + getGroupingOrBuilderList() { + if (groupingBuilder_ != null) { + return groupingBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(grouping_); + } + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addGroupingBuilder() { + return getGroupingFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addGroupingBuilder( + int index) { + return getGroupingFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** column expression list for aggregation (GROUP BY) 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr grouping = 8; + */ + public java.util.List + getGroupingBuilderList() { + return getGroupingFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getGroupingFieldBuilder() { + if (groupingBuilder_ == null) { + groupingBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + grouping_, + ((bitField0_ & 0x00000080) != 0), + getParentForChildren(), + isClean()); + grouping_ = null; + } + return groupingBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr groupingCriteria_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> groupingCriteriaBuilder_; + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return Whether the groupingCriteria field is set. + */ + public boolean hasGroupingCriteria() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + * @return The groupingCriteria. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getGroupingCriteria() { + if (groupingCriteriaBuilder_ == null) { + return groupingCriteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : groupingCriteria_; + } else { + return groupingCriteriaBuilder_.getMessage(); + } + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public Builder setGroupingCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (groupingCriteriaBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + groupingCriteria_ = value; + onChanged(); + } else { + groupingCriteriaBuilder_.setMessage(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public Builder setGroupingCriteria( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (groupingCriteriaBuilder_ == null) { + groupingCriteria_ = builderForValue.build(); + onChanged(); + } else { + groupingCriteriaBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000100; + return this; + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public Builder mergeGroupingCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (groupingCriteriaBuilder_ == null) { + if (((bitField0_ & 0x00000100) != 0) && + groupingCriteria_ != null && + groupingCriteria_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + groupingCriteria_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(groupingCriteria_).mergeFrom(value).buildPartial(); + } else { + groupingCriteria_ = value; + } + onChanged(); + } else { + groupingCriteriaBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public Builder clearGroupingCriteria() { + if (groupingCriteriaBuilder_ == null) { + groupingCriteria_ = null; + onChanged(); + } else { + groupingCriteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getGroupingCriteriaBuilder() { + bitField0_ |= 0x00000100; + onChanged(); + return getGroupingCriteriaFieldBuilder().getBuilder(); + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getGroupingCriteriaOrBuilder() { + if (groupingCriteriaBuilder_ != null) { + return groupingCriteriaBuilder_.getMessageOrBuilder(); + } else { + return groupingCriteria_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : groupingCriteria_; + } + } + /** + *
    +       ** filter criteria for aggregated groups 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr grouping_criteria = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getGroupingCriteriaFieldBuilder() { + if (groupingCriteriaBuilder_ == null) { + groupingCriteriaBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getGroupingCriteria(), + getParentForChildren(), + isClean()); + groupingCriteria_ = null; + } + return groupingCriteriaBuilder_; + } + + private int locking_ = 1; + /** + *
    +       ** perform row locking on matches 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return Whether the locking field is set. + */ + @java.lang.Override public boolean hasLocking() { + return ((bitField0_ & 0x00000200) != 0); + } + /** + *
    +       ** perform row locking on matches 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return The locking. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock getLocking() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock result = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock.valueOf(locking_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock.SHARED_LOCK : result; + } + /** + *
    +       ** perform row locking on matches 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @param value The locking to set. + * @return This builder for chaining. + */ + public Builder setLocking(com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000200; + locking_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** perform row locking on matches 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLock locking = 12; + * @return This builder for chaining. + */ + public Builder clearLocking() { + bitField0_ = (bitField0_ & ~0x00000200); + locking_ = 1; + onChanged(); + return this; + } + + private int lockingOptions_ = 1; + /** + *
    +       ** additional options how to handle locked rows 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return Whether the lockingOptions field is set. + */ + @java.lang.Override public boolean hasLockingOptions() { + return ((bitField0_ & 0x00000400) != 0); + } + /** + *
    +       ** additional options how to handle locked rows 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return The lockingOptions. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions getLockingOptions() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions result = com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions.valueOf(lockingOptions_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions.NOWAIT : result; + } + /** + *
    +       ** additional options how to handle locked rows 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @param value The lockingOptions to set. + * @return This builder for chaining. + */ + public Builder setLockingOptions(com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000400; + lockingOptions_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** additional options how to handle locked rows 
    +       * 
    + * + * optional .Mysqlx.Crud.Find.RowLockOptions locking_options = 13; + * @return This builder for chaining. + */ + public Builder clearLockingOptions() { + bitField0_ = (bitField0_ & ~0x00000400); + lockingOptions_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> limitExprBuilder_; + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return Whether the limitExpr field is set. + */ + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000800) != 0); + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + * @return The limitExpr. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + if (limitExprBuilder_ == null) { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } else { + return limitExprBuilder_.getMessage(); + } + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public Builder setLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limitExpr_ = value; + onChanged(); + } else { + limitExprBuilder_.setMessage(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public Builder setLimitExpr( + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder builderForValue) { + if (limitExprBuilder_ == null) { + limitExpr_ = builderForValue.build(); + onChanged(); + } else { + limitExprBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000800; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public Builder mergeLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (((bitField0_ & 0x00000800) != 0) && + limitExpr_ != null && + limitExpr_ != com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance()) { + limitExpr_ = + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.newBuilder(limitExpr_).mergeFrom(value).buildPartial(); + } else { + limitExpr_ = value; + } + onChanged(); + } else { + limitExprBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000800; + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public Builder clearLimitExpr() { + if (limitExprBuilder_ == null) { + limitExpr_ = null; + onChanged(); + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder getLimitExprBuilder() { + bitField0_ |= 0x00000800; + onChanged(); + return getLimitExprFieldBuilder().getBuilder(); + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + if (limitExprBuilder_ != null) { + return limitExprBuilder_.getMessageOrBuilder(); + } else { + return limitExpr_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + } + /** + *
    +       ** numbers of rows that shall be skipped and returned
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 14; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> + getLimitExprFieldBuilder() { + if (limitExprBuilder_ == null) { + limitExprBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder>( + getLimitExpr(), + getParentForChildren(), + isClean()); + limitExpr_ = null; + } + return limitExprBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Find) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Find) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Find DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Find(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Find getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Find parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Find(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface InsertOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Insert) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + boolean hasDataModel(); + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel(); + + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + java.util.List + getProjectionList(); + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Column getProjection(int index); + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + int getProjectionCount(); + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + java.util.List + getProjectionOrBuilderList(); + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder getProjectionOrBuilder( + int index); + + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + java.util.List + getRowList(); + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getRow(int index); + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + int getRowCount(); + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + java.util.List + getRowOrBuilderList(); + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder getRowOrBuilder( + int index); + + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + java.util.List + getArgsList(); + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index); + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + int getArgsCount(); + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** true if this should be treated as an Upsert
    +     *(that is, update on duplicate key) 
    +     * 
    + * + * optional bool upsert = 6 [default = false]; + * @return Whether the upsert field is set. + */ + boolean hasUpsert(); + /** + *
    +     ** true if this should be treated as an Upsert
    +     *(that is, update on duplicate key) 
    +     * 
    + * + * optional bool upsert = 6 [default = false]; + * @return The upsert. + */ + boolean getUpsert(); + } + /** + *
    +   **
    +   *Insert documents/rows into a collection/table
    +   *@returns @ref Mysqlx::Resultset
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.Insert} + */ + public static final class Insert extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Insert) + InsertOrBuilder { + private static final long serialVersionUID = 0L; + // Use Insert.newBuilder() to construct. + private Insert(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Insert() { + dataModel_ = 1; + projection_ = java.util.Collections.emptyList(); + row_ = java.util.Collections.emptyList(); + args_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Insert(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Insert( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + dataModel_ = rawValue; + } + break; + } + case 26: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + projection_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + projection_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Column.PARSER, extensionRegistry)); + break; + } + case 34: { + if (!((mutable_bitField0_ & 0x00000008) != 0)) { + row_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000008; + } + row_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.PARSER, extensionRegistry)); + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000010) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry)); + break; + } + case 48: { + bitField0_ |= 0x00000004; + upsert_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + projection_ = java.util.Collections.unmodifiableList(projection_); + } + if (((mutable_bitField0_ & 0x00000008) != 0)) { + row_ = java.util.Collections.unmodifiableList(row_); + } + if (((mutable_bitField0_ & 0x00000010) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.class, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder.class); + } + + public interface TypedRowOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Insert.TypedRow) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + java.util.List + getFieldList(); + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getField(int index); + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + int getFieldCount(); + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + java.util.List + getFieldOrBuilderList(); + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getFieldOrBuilder( + int index); + } + /** + *
    +     ** set of fields to insert as a one row 
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Insert.TypedRow} + */ + public static final class TypedRow extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Insert.TypedRow) + TypedRowOrBuilder { + private static final long serialVersionUID = 0L; + // Use TypedRow.newBuilder() to construct. + private TypedRow(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private TypedRow() { + field_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new TypedRow(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private TypedRow( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + field_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + field_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + field_ = java.util.Collections.unmodifiableList(field_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_TypedRow_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.class, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder.class); + } + + public static final int FIELD_FIELD_NUMBER = 1; + private java.util.List field_; + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + @java.lang.Override + public java.util.List getFieldList() { + return field_; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + @java.lang.Override + public java.util.List + getFieldOrBuilderList() { + return field_; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + @java.lang.Override + public int getFieldCount() { + return field_.size(); + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getField(int index) { + return field_.get(index); + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getFieldOrBuilder( + int index) { + return field_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getFieldCount(); i++) { + if (!getField(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < field_.size(); i++) { + output.writeMessage(1, field_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < field_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, field_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow other = (com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow) obj; + + if (!getFieldList() + .equals(other.getFieldList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getFieldCount() > 0) { + hash = (37 * hash) + FIELD_FIELD_NUMBER; + hash = (53 * hash) + getFieldList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +       ** set of fields to insert as a one row 
    +       * 
    + * + * Protobuf type {@code Mysqlx.Crud.Insert.TypedRow} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Insert.TypedRow) + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_TypedRow_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.class, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFieldFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (fieldBuilder_ == null) { + field_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + fieldBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow result = new com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow(this); + int from_bitField0_ = bitField0_; + if (fieldBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + field_ = java.util.Collections.unmodifiableList(field_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.field_ = field_; + } else { + result.field_ = fieldBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.getDefaultInstance()) return this; + if (fieldBuilder_ == null) { + if (!other.field_.isEmpty()) { + if (field_.isEmpty()) { + field_ = other.field_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFieldIsMutable(); + field_.addAll(other.field_); + } + onChanged(); + } + } else { + if (!other.field_.isEmpty()) { + if (fieldBuilder_.isEmpty()) { + fieldBuilder_.dispose(); + fieldBuilder_ = null; + field_ = other.field_; + bitField0_ = (bitField0_ & ~0x00000001); + fieldBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getFieldFieldBuilder() : null; + } else { + fieldBuilder_.addAllMessages(other.field_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getFieldCount(); i++) { + if (!getField(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List field_ = + java.util.Collections.emptyList(); + private void ensureFieldIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + field_ = new java.util.ArrayList(field_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> fieldBuilder_; + + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public java.util.List getFieldList() { + if (fieldBuilder_ == null) { + return java.util.Collections.unmodifiableList(field_); + } else { + return fieldBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public int getFieldCount() { + if (fieldBuilder_ == null) { + return field_.size(); + } else { + return fieldBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getField(int index) { + if (fieldBuilder_ == null) { + return field_.get(index); + } else { + return fieldBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder setField( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (fieldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFieldIsMutable(); + field_.set(index, value); + onChanged(); + } else { + fieldBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder setField( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (fieldBuilder_ == null) { + ensureFieldIsMutable(); + field_.set(index, builderForValue.build()); + onChanged(); + } else { + fieldBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder addField(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (fieldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFieldIsMutable(); + field_.add(value); + onChanged(); + } else { + fieldBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder addField( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (fieldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFieldIsMutable(); + field_.add(index, value); + onChanged(); + } else { + fieldBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder addField( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (fieldBuilder_ == null) { + ensureFieldIsMutable(); + field_.add(builderForValue.build()); + onChanged(); + } else { + fieldBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder addField( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (fieldBuilder_ == null) { + ensureFieldIsMutable(); + field_.add(index, builderForValue.build()); + onChanged(); + } else { + fieldBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder addAllField( + java.lang.Iterable values) { + if (fieldBuilder_ == null) { + ensureFieldIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, field_); + onChanged(); + } else { + fieldBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder clearField() { + if (fieldBuilder_ == null) { + field_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + fieldBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public Builder removeField(int index) { + if (fieldBuilder_ == null) { + ensureFieldIsMutable(); + field_.remove(index); + onChanged(); + } else { + fieldBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getFieldBuilder( + int index) { + return getFieldFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getFieldOrBuilder( + int index) { + if (fieldBuilder_ == null) { + return field_.get(index); } else { + return fieldBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public java.util.List + getFieldOrBuilderList() { + if (fieldBuilder_ != null) { + return fieldBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(field_); + } + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addFieldBuilder() { + return getFieldFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addFieldBuilder( + int index) { + return getFieldFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expr.Expr field = 1; + */ + public java.util.List + getFieldBuilderList() { + return getFieldFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getFieldFieldBuilder() { + if (fieldBuilder_ == null) { + fieldBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + field_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + field_ = null; + } + return fieldBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Insert.TypedRow) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Insert.TypedRow) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public TypedRow parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new TypedRow(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** collection to insert into 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DATA_MODEL_FIELD_NUMBER = 2; + private int dataModel_; + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + + public static final int PROJECTION_FIELD_NUMBER = 3; + private java.util.List projection_; + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + @java.lang.Override + public java.util.List getProjectionList() { + return projection_; + } + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + @java.lang.Override + public java.util.List + getProjectionOrBuilderList() { + return projection_; + } + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + @java.lang.Override + public int getProjectionCount() { + return projection_.size(); + } + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Column getProjection(int index) { + return projection_.get(index); + } + /** + *
    +     ** name of the columns to insert data into
    +     *(empty if data_model is DOCUMENT) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder getProjectionOrBuilder( + int index) { + return projection_.get(index); + } + + public static final int ROW_FIELD_NUMBER = 4; + private java.util.List row_; + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + @java.lang.Override + public java.util.List getRowList() { + return row_; + } + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + @java.lang.Override + public java.util.List + getRowOrBuilderList() { + return row_; + } + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + @java.lang.Override + public int getRowCount() { + return row_.size(); + } + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getRow(int index) { + return row_.get(index); + } + /** + *
    +     ** set of rows to insert into the collection/table (a single expression
    +     *with a JSON document literal or an OBJECT expression) 
    +     * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder getRowOrBuilder( + int index) { + return row_.get(index); + } + + public static final int ARGS_FIELD_NUMBER = 5; + private java.util.List args_; + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** values for parameters used in row expressions 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int UPSERT_FIELD_NUMBER = 6; + private boolean upsert_; + /** + *
    +     ** true if this should be treated as an Upsert
    +     *(that is, update on duplicate key) 
    +     * 
    + * + * optional bool upsert = 6 [default = false]; + * @return Whether the upsert field is set. + */ + @java.lang.Override + public boolean hasUpsert() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** true if this should be treated as an Upsert
    +     *(that is, update on duplicate key) 
    +     * 
    + * + * optional bool upsert = 6 [default = false]; + * @return The upsert. + */ + @java.lang.Override + public boolean getUpsert() { + return upsert_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getProjectionCount(); i++) { + if (!getProjection(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getRowCount(); i++) { + if (!getRow(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, dataModel_); + } + for (int i = 0; i < projection_.size(); i++) { + output.writeMessage(3, projection_.get(i)); + } + for (int i = 0; i < row_.size(); i++) { + output.writeMessage(4, row_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(5, args_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBool(6, upsert_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, dataModel_); + } + for (int i = 0; i < projection_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, projection_.get(i)); + } + for (int i = 0; i < row_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, row_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, args_.get(i)); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(6, upsert_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Insert)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Insert other = (com.mysql.cj.x.protobuf.MysqlxCrud.Insert) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDataModel() != other.hasDataModel()) return false; + if (hasDataModel()) { + if (dataModel_ != other.dataModel_) return false; + } + if (!getProjectionList() + .equals(other.getProjectionList())) return false; + if (!getRowList() + .equals(other.getRowList())) return false; + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasUpsert() != other.hasUpsert()) return false; + if (hasUpsert()) { + if (getUpsert() + != other.getUpsert()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDataModel()) { + hash = (37 * hash) + DATA_MODEL_FIELD_NUMBER; + hash = (53 * hash) + dataModel_; + } + if (getProjectionCount() > 0) { + hash = (37 * hash) + PROJECTION_FIELD_NUMBER; + hash = (53 * hash) + getProjectionList().hashCode(); + } + if (getRowCount() > 0) { + hash = (37 * hash) + ROW_FIELD_NUMBER; + hash = (53 * hash) + getRowList().hashCode(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasUpsert()) { + hash = (37 * hash) + UPSERT_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getUpsert()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Insert prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Insert documents/rows into a collection/table
    +     *@returns @ref Mysqlx::Resultset
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Insert} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Insert) + com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.class, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Insert.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getProjectionFieldBuilder(); + getRowFieldBuilder(); + getArgsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + dataModel_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + if (projectionBuilder_ == null) { + projection_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + projectionBuilder_.clear(); + } + if (rowBuilder_ == null) { + row_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + } else { + rowBuilder_.clear(); + } + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + argsBuilder_.clear(); + } + upsert_ = false; + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Insert_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert result = new com.mysql.cj.x.protobuf.MysqlxCrud.Insert(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.dataModel_ = dataModel_; + if (projectionBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + projection_ = java.util.Collections.unmodifiableList(projection_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.projection_ = projection_; + } else { + result.projection_ = projectionBuilder_.build(); + } + if (rowBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0)) { + row_ = java.util.Collections.unmodifiableList(row_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.row_ = row_; + } else { + result.row_ = rowBuilder_.build(); + } + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.upsert_ = upsert_; + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Insert) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Insert)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Insert other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDataModel()) { + setDataModel(other.getDataModel()); + } + if (projectionBuilder_ == null) { + if (!other.projection_.isEmpty()) { + if (projection_.isEmpty()) { + projection_ = other.projection_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureProjectionIsMutable(); + projection_.addAll(other.projection_); + } + onChanged(); + } + } else { + if (!other.projection_.isEmpty()) { + if (projectionBuilder_.isEmpty()) { + projectionBuilder_.dispose(); + projectionBuilder_ = null; + projection_ = other.projection_; + bitField0_ = (bitField0_ & ~0x00000004); + projectionBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getProjectionFieldBuilder() : null; + } else { + projectionBuilder_.addAllMessages(other.projection_); + } + } + } + if (rowBuilder_ == null) { + if (!other.row_.isEmpty()) { + if (row_.isEmpty()) { + row_ = other.row_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureRowIsMutable(); + row_.addAll(other.row_); + } + onChanged(); + } + } else { + if (!other.row_.isEmpty()) { + if (rowBuilder_.isEmpty()) { + rowBuilder_.dispose(); + rowBuilder_ = null; + row_ = other.row_; + bitField0_ = (bitField0_ & ~0x00000008); + rowBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getRowFieldBuilder() : null; + } else { + rowBuilder_.addAllMessages(other.row_); + } + } + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000010); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasUpsert()) { + setUpsert(other.getUpsert()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + for (int i = 0; i < getProjectionCount(); i++) { + if (!getProjection(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getRowCount(); i++) { + if (!getRow(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Insert) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** collection to insert into 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private int dataModel_ = 1; + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @param value The dataModel to set. + * @return This builder for chaining. + */ + public Builder setDataModel(com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + dataModel_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return This builder for chaining. + */ + public Builder clearDataModel() { + bitField0_ = (bitField0_ & ~0x00000002); + dataModel_ = 1; + onChanged(); + return this; + } + + private java.util.List projection_ = + java.util.Collections.emptyList(); + private void ensureProjectionIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + projection_ = new java.util.ArrayList(projection_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Column, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder> projectionBuilder_; + + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public java.util.List getProjectionList() { + if (projectionBuilder_ == null) { + return java.util.Collections.unmodifiableList(projection_); + } else { + return projectionBuilder_.getMessageList(); + } + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public int getProjectionCount() { + if (projectionBuilder_ == null) { + return projection_.size(); + } else { + return projectionBuilder_.getCount(); + } + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Column getProjection(int index) { + if (projectionBuilder_ == null) { + return projection_.get(index); + } else { + return projectionBuilder_.getMessage(index); + } + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder setProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Column value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.set(index, value); + onChanged(); + } else { + projectionBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder setProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.set(index, builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder addProjection(com.mysql.cj.x.protobuf.MysqlxCrud.Column value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.add(value); + onChanged(); + } else { + projectionBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder addProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Column value) { + if (projectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureProjectionIsMutable(); + projection_.add(index, value); + onChanged(); + } else { + projectionBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder addProjection( + com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.add(builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder addProjection( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder builderForValue) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.add(index, builderForValue.build()); + onChanged(); + } else { + projectionBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder addAllProjection( + java.lang.Iterable values) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, projection_); + onChanged(); + } else { + projectionBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder clearProjection() { + if (projectionBuilder_ == null) { + projection_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + projectionBuilder_.clear(); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public Builder removeProjection(int index) { + if (projectionBuilder_ == null) { + ensureProjectionIsMutable(); + projection_.remove(index); + onChanged(); + } else { + projectionBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder getProjectionBuilder( + int index) { + return getProjectionFieldBuilder().getBuilder(index); + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder getProjectionOrBuilder( + int index) { + if (projectionBuilder_ == null) { + return projection_.get(index); } else { + return projectionBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public java.util.List + getProjectionOrBuilderList() { + if (projectionBuilder_ != null) { + return projectionBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(projection_); + } + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder addProjectionBuilder() { + return getProjectionFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Column.getDefaultInstance()); + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder addProjectionBuilder( + int index) { + return getProjectionFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Column.getDefaultInstance()); + } + /** + *
    +       ** name of the columns to insert data into
    +       *(empty if data_model is DOCUMENT) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Column projection = 3; + */ + public java.util.List + getProjectionBuilderList() { + return getProjectionFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Column, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder> + getProjectionFieldBuilder() { + if (projectionBuilder_ == null) { + projectionBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Column, com.mysql.cj.x.protobuf.MysqlxCrud.Column.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.ColumnOrBuilder>( + projection_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + projection_ = null; + } + return projectionBuilder_; + } + + private java.util.List row_ = + java.util.Collections.emptyList(); + private void ensureRowIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + row_ = new java.util.ArrayList(row_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder> rowBuilder_; + + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public java.util.List getRowList() { + if (rowBuilder_ == null) { + return java.util.Collections.unmodifiableList(row_); + } else { + return rowBuilder_.getMessageList(); + } + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public int getRowCount() { + if (rowBuilder_ == null) { + return row_.size(); + } else { + return rowBuilder_.getCount(); + } + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow getRow(int index) { + if (rowBuilder_ == null) { + return row_.get(index); + } else { + return rowBuilder_.getMessage(index); + } + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder setRow( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow value) { + if (rowBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowIsMutable(); + row_.set(index, value); + onChanged(); + } else { + rowBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder setRow( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder builderForValue) { + if (rowBuilder_ == null) { + ensureRowIsMutable(); + row_.set(index, builderForValue.build()); + onChanged(); + } else { + rowBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder addRow(com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow value) { + if (rowBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowIsMutable(); + row_.add(value); + onChanged(); + } else { + rowBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder addRow( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow value) { + if (rowBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureRowIsMutable(); + row_.add(index, value); + onChanged(); + } else { + rowBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder addRow( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder builderForValue) { + if (rowBuilder_ == null) { + ensureRowIsMutable(); + row_.add(builderForValue.build()); + onChanged(); + } else { + rowBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder addRow( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder builderForValue) { + if (rowBuilder_ == null) { + ensureRowIsMutable(); + row_.add(index, builderForValue.build()); + onChanged(); + } else { + rowBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder addAllRow( + java.lang.Iterable values) { + if (rowBuilder_ == null) { + ensureRowIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, row_); + onChanged(); + } else { + rowBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder clearRow() { + if (rowBuilder_ == null) { + row_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + rowBuilder_.clear(); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public Builder removeRow(int index) { + if (rowBuilder_ == null) { + ensureRowIsMutable(); + row_.remove(index); + onChanged(); + } else { + rowBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder getRowBuilder( + int index) { + return getRowFieldBuilder().getBuilder(index); + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder getRowOrBuilder( + int index) { + if (rowBuilder_ == null) { + return row_.get(index); } else { + return rowBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public java.util.List + getRowOrBuilderList() { + if (rowBuilder_ != null) { + return rowBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(row_); + } + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder addRowBuilder() { + return getRowFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.getDefaultInstance()); + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder addRowBuilder( + int index) { + return getRowFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.getDefaultInstance()); + } + /** + *
    +       ** set of rows to insert into the collection/table (a single expression
    +       *with a JSON document literal or an OBJECT expression) 
    +       * 
    + * + * repeated .Mysqlx.Crud.Insert.TypedRow row = 4; + */ + public java.util.List + getRowBuilderList() { + return getRowFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder> + getRowFieldBuilder() { + if (rowBuilder_ == null) { + rowBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRowOrBuilder>( + row_, + ((bitField0_ & 0x00000008) != 0), + getParentForChildren(), + isClean()); + row_ = null; + } + return rowBuilder_; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000010) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> argsBuilder_; + + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in row expressions 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 5; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + args_, + ((bitField0_ & 0x00000010) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private boolean upsert_ ; + /** + *
    +       ** true if this should be treated as an Upsert
    +       *(that is, update on duplicate key) 
    +       * 
    + * + * optional bool upsert = 6 [default = false]; + * @return Whether the upsert field is set. + */ + @java.lang.Override + public boolean hasUpsert() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +       ** true if this should be treated as an Upsert
    +       *(that is, update on duplicate key) 
    +       * 
    + * + * optional bool upsert = 6 [default = false]; + * @return The upsert. + */ + @java.lang.Override + public boolean getUpsert() { + return upsert_; + } + /** + *
    +       ** true if this should be treated as an Upsert
    +       *(that is, update on duplicate key) 
    +       * 
    + * + * optional bool upsert = 6 [default = false]; + * @param value The upsert to set. + * @return This builder for chaining. + */ + public Builder setUpsert(boolean value) { + bitField0_ |= 0x00000020; + upsert_ = value; + onChanged(); + return this; + } + /** + *
    +       ** true if this should be treated as an Upsert
    +       *(that is, update on duplicate key) 
    +       * 
    + * + * optional bool upsert = 6 [default = false]; + * @return This builder for chaining. + */ + public Builder clearUpsert() { + bitField0_ = (bitField0_ & ~0x00000020); + upsert_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Insert) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Insert) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Insert DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Insert(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Insert getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Insert parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Insert(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface UpdateOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Update) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** datamodel that the operations refer to  
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + boolean hasDataModel(); + /** + *
    +     ** datamodel that the operations refer to  
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel(); + + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return Whether the criteria field is set. + */ + boolean hasCriteria(); + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return The criteria. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria(); + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder(); + + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return Whether the limit field is set. + */ + boolean hasLimit(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return The limit. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder(); + + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + java.util.List + getOrderList(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + int getOrderCount(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + java.util.List + getOrderOrBuilderList(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index); + + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + java.util.List + getOperationList(); + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getOperation(int index); + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + int getOperationCount(); + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + java.util.List + getOperationOrBuilderList(); + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder getOperationOrBuilder( + int index); + + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + java.util.List + getArgsList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + int getArgsCount(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return Whether the limitExpr field is set. + */ + boolean hasLimitExpr(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return The limitExpr. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder(); + } + /** + *
    +   **
    +   *Update documents/rows in a collection/table
    +   *@returns @ref Mysqlx::Resultset
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.Update} + */ + public static final class Update extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Update) + UpdateOrBuilder { + private static final long serialVersionUID = 0L; + // Use Update.newBuilder() to construct. + private Update(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Update() { + dataModel_ = 1; + order_ = java.util.Collections.emptyList(); + operation_ = java.util.Collections.emptyList(); + args_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Update(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Update( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 18: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000002; + dataModel_ = rawValue; + } + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = criteria_.toBuilder(); + } + criteria_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(criteria_); + criteria_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 42: { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = limit_.toBuilder(); + } + limit_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Limit.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limit_); + limit_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 50: { + if (!((mutable_bitField0_ & 0x00000010) != 0)) { + order_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + order_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Order.PARSER, extensionRegistry)); + break; + } + case 58: { + if (!((mutable_bitField0_ & 0x00000020) != 0)) { + operation_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000020; + } + operation_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.PARSER, extensionRegistry)); + break; + } + case 66: { + if (!((mutable_bitField0_ & 0x00000040) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000040; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry)); + break; + } + case 74: { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = limitExpr_.toBuilder(); + } + limitExpr_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limitExpr_); + limitExpr_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000010) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + } + if (((mutable_bitField0_ & 0x00000020) != 0)) { + operation_ = java.util.Collections.unmodifiableList(operation_); + } + if (((mutable_bitField0_ & 0x00000040) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Update_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Update_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Update.class, com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder.class); + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DATA_MODEL_FIELD_NUMBER = 3; + private int dataModel_; + /** + *
    +     ** datamodel that the operations refer to  
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** datamodel that the operations refer to  
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + + public static final int CRITERIA_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return Whether the criteria field is set. + */ + @java.lang.Override + public boolean hasCriteria() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return The criteria. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + + public static final int LIMIT_FIELD_NUMBER = 5; + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return Whether the limit field is set. + */ + @java.lang.Override + public boolean hasLimit() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return The limit. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + + public static final int ORDER_FIELD_NUMBER = 6; + private java.util.List order_; + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + @java.lang.Override + public java.util.List getOrderList() { + return order_; + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + @java.lang.Override + public java.util.List + getOrderOrBuilderList() { + return order_; + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + @java.lang.Override + public int getOrderCount() { + return order_.size(); + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + return order_.get(index); + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + return order_.get(index); + } + + public static final int OPERATION_FIELD_NUMBER = 7; + private java.util.List operation_; + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + @java.lang.Override + public java.util.List getOperationList() { + return operation_; + } + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + @java.lang.Override + public java.util.List + getOperationOrBuilderList() { + return operation_; + } + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + @java.lang.Override + public int getOperationCount() { + return operation_.size(); + } + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getOperation(int index) { + return operation_.get(index); + } + /** + *
    +     ** list of operations to be applied.
    +     *Valid operations will depend on the data_model 
    +     * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder getOperationOrBuilder( + int index) { + return operation_.get(index); + } + + public static final int ARGS_FIELD_NUMBER = 8; + private java.util.List args_; + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int LIMIT_EXPR_FIELD_NUMBER = 9; + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return Whether the limitExpr field is set. + */ + @java.lang.Override + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return The limitExpr. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getOperationCount(); i++) { + if (!getOperation(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(2, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(3, dataModel_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(4, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(5, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + output.writeMessage(6, order_.get(i)); + } + for (int i = 0; i < operation_.size(); i++) { + output.writeMessage(7, operation_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(8, args_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(9, getLimitExpr()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, dataModel_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, order_.get(i)); + } + for (int i = 0; i < operation_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, operation_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, args_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, getLimitExpr()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Update)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Update other = (com.mysql.cj.x.protobuf.MysqlxCrud.Update) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDataModel() != other.hasDataModel()) return false; + if (hasDataModel()) { + if (dataModel_ != other.dataModel_) return false; + } + if (hasCriteria() != other.hasCriteria()) return false; + if (hasCriteria()) { + if (!getCriteria() + .equals(other.getCriteria())) return false; + } + if (hasLimit() != other.hasLimit()) return false; + if (hasLimit()) { + if (!getLimit() + .equals(other.getLimit())) return false; + } + if (!getOrderList() + .equals(other.getOrderList())) return false; + if (!getOperationList() + .equals(other.getOperationList())) return false; + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasLimitExpr() != other.hasLimitExpr()) return false; + if (hasLimitExpr()) { + if (!getLimitExpr() + .equals(other.getLimitExpr())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDataModel()) { + hash = (37 * hash) + DATA_MODEL_FIELD_NUMBER; + hash = (53 * hash) + dataModel_; + } + if (hasCriteria()) { + hash = (37 * hash) + CRITERIA_FIELD_NUMBER; + hash = (53 * hash) + getCriteria().hashCode(); + } + if (hasLimit()) { + hash = (37 * hash) + LIMIT_FIELD_NUMBER; + hash = (53 * hash) + getLimit().hashCode(); + } + if (getOrderCount() > 0) { + hash = (37 * hash) + ORDER_FIELD_NUMBER; + hash = (53 * hash) + getOrderList().hashCode(); + } + if (getOperationCount() > 0) { + hash = (37 * hash) + OPERATION_FIELD_NUMBER; + hash = (53 * hash) + getOperationList().hashCode(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasLimitExpr()) { + hash = (37 * hash) + LIMIT_EXPR_FIELD_NUMBER; + hash = (53 * hash) + getLimitExpr().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Update prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Update documents/rows in a collection/table
    +     *@returns @ref Mysqlx::Resultset
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Update} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Update) + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Update_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Update_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Update.class, com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Update.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getCriteriaFieldBuilder(); + getLimitFieldBuilder(); + getOrderFieldBuilder(); + getOperationFieldBuilder(); + getArgsFieldBuilder(); + getLimitExprFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + dataModel_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + if (criteriaBuilder_ == null) { + criteria_ = null; + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (limitBuilder_ == null) { + limit_ = null; + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + orderBuilder_.clear(); + } + if (operationBuilder_ == null) { + operation_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + } else { + operationBuilder_.clear(); + } + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + } else { + argsBuilder_.clear(); + } + if (limitExprBuilder_ == null) { + limitExpr_ = null; + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Update_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Update getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Update build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Update result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Update buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Update result = new com.mysql.cj.x.protobuf.MysqlxCrud.Update(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.dataModel_ = dataModel_; + if (((from_bitField0_ & 0x00000004) != 0)) { + if (criteriaBuilder_ == null) { + result.criteria_ = criteria_; + } else { + result.criteria_ = criteriaBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + if (limitBuilder_ == null) { + result.limit_ = limit_; + } else { + result.limit_ = limitBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (orderBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.order_ = order_; + } else { + result.order_ = orderBuilder_.build(); + } + if (operationBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0)) { + operation_ = java.util.Collections.unmodifiableList(operation_); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.operation_ = operation_; + } else { + result.operation_ = operationBuilder_.build(); + } + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000080) != 0)) { + if (limitExprBuilder_ == null) { + result.limitExpr_ = limitExpr_; + } else { + result.limitExpr_ = limitExprBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Update) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Update)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Update other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDataModel()) { + setDataModel(other.getDataModel()); + } + if (other.hasCriteria()) { + mergeCriteria(other.getCriteria()); + } + if (other.hasLimit()) { + mergeLimit(other.getLimit()); + } + if (orderBuilder_ == null) { + if (!other.order_.isEmpty()) { + if (order_.isEmpty()) { + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureOrderIsMutable(); + order_.addAll(other.order_); + } + onChanged(); + } + } else { + if (!other.order_.isEmpty()) { + if (orderBuilder_.isEmpty()) { + orderBuilder_.dispose(); + orderBuilder_ = null; + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000010); + orderBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getOrderFieldBuilder() : null; + } else { + orderBuilder_.addAllMessages(other.order_); + } + } + } + if (operationBuilder_ == null) { + if (!other.operation_.isEmpty()) { + if (operation_.isEmpty()) { + operation_ = other.operation_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureOperationIsMutable(); + operation_.addAll(other.operation_); + } + onChanged(); + } + } else { + if (!other.operation_.isEmpty()) { + if (operationBuilder_.isEmpty()) { + operationBuilder_.dispose(); + operationBuilder_ = null; + operation_ = other.operation_; + bitField0_ = (bitField0_ & ~0x00000020); + operationBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getOperationFieldBuilder() : null; + } else { + operationBuilder_.addAllMessages(other.operation_); + } + } + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000040); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasLimitExpr()) { + mergeLimitExpr(other.getLimitExpr()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getOperationCount(); i++) { + if (!getOperation(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Update parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Update) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private int dataModel_ = 1; + /** + *
    +       ** datamodel that the operations refer to  
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** datamodel that the operations refer to  
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return The dataModel. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + /** + *
    +       ** datamodel that the operations refer to  
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @param value The dataModel to set. + * @return This builder for chaining. + */ + public Builder setDataModel(com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + dataModel_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** datamodel that the operations refer to  
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 3; + * @return This builder for chaining. + */ + public Builder clearDataModel() { + bitField0_ = (bitField0_ & ~0x00000002); + dataModel_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> criteriaBuilder_; + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return Whether the criteria field is set. + */ + public boolean hasCriteria() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + * @return The criteria. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + if (criteriaBuilder_ == null) { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } else { + return criteriaBuilder_.getMessage(); + } + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public Builder setCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + criteria_ = value; + onChanged(); + } else { + criteriaBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public Builder setCriteria( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (criteriaBuilder_ == null) { + criteria_ = builderForValue.build(); + onChanged(); + } else { + criteriaBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public Builder mergeCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + criteria_ != null && + criteria_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + criteria_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(criteria_).mergeFrom(value).buildPartial(); + } else { + criteria_ = value; + } + onChanged(); + } else { + criteriaBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public Builder clearCriteria() { + if (criteriaBuilder_ == null) { + criteria_ = null; + onChanged(); + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getCriteriaBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCriteriaFieldBuilder().getBuilder(); + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + if (criteriaBuilder_ != null) { + return criteriaBuilder_.getMessageOrBuilder(); + } else { + return criteria_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getCriteriaFieldBuilder() { + if (criteriaBuilder_ == null) { + criteriaBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getCriteria(), + getParentForChildren(), + isClean()); + criteria_ = null; + } + return criteriaBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> limitBuilder_; + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return Whether the limit field is set. + */ + public boolean hasLimit() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + * @return The limit. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + if (limitBuilder_ == null) { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } else { + return limitBuilder_.getMessage(); + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public Builder setLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limit_ = value; + onChanged(); + } else { + limitBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public Builder setLimit( + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder builderForValue) { + if (limitBuilder_ == null) { + limit_ = builderForValue.build(); + onChanged(); + } else { + limitBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public Builder mergeLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + limit_ != null && + limit_ != com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance()) { + limit_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.newBuilder(limit_).mergeFrom(value).buildPartial(); + } else { + limit_ = value; + } + onChanged(); + } else { + limitBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public Builder clearLimit() { + if (limitBuilder_ == null) { + limit_ = null; + onChanged(); + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder getLimitBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getLimitFieldBuilder().getBuilder(); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + if (limitBuilder_ != null) { + return limitBuilder_.getMessageOrBuilder(); + } else { + return limit_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> + getLimitFieldBuilder() { + if (limitBuilder_ == null) { + limitBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder>( + getLimit(), + getParentForChildren(), + isClean()); + limit_ = null; + } + return limitBuilder_; + } + + private java.util.List order_ = + java.util.Collections.emptyList(); + private void ensureOrderIsMutable() { + if (!((bitField0_ & 0x00000010) != 0)) { + order_ = new java.util.ArrayList(order_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> orderBuilder_; + + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public java.util.List getOrderList() { + if (orderBuilder_ == null) { + return java.util.Collections.unmodifiableList(order_); + } else { + return orderBuilder_.getMessageList(); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public int getOrderCount() { + if (orderBuilder_ == null) { + return order_.size(); + } else { + return orderBuilder_.getCount(); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + if (orderBuilder_ == null) { + return order_.get(index); + } else { + return orderBuilder_.getMessage(index); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.set(index, value); + onChanged(); + } else { + orderBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.set(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder addOrder(com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(value); + onChanged(); + } else { + orderBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(index, value); + onChanged(); + } else { + orderBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder addOrder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder addAllOrder( + java.lang.Iterable values) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, order_); + onChanged(); + } else { + orderBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder clearOrder() { + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + orderBuilder_.clear(); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public Builder removeOrder(int index) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.remove(index); + onChanged(); + } else { + orderBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder getOrderBuilder( + int index) { + return getOrderFieldBuilder().getBuilder(index); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + if (orderBuilder_ == null) { + return order_.get(index); } else { + return orderBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public java.util.List + getOrderOrBuilderList() { + if (orderBuilder_ != null) { + return orderBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(order_); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder() { + return getOrderFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder( + int index) { + return getOrderFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 6; + */ + public java.util.List + getOrderBuilderList() { + return getOrderFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> + getOrderFieldBuilder() { + if (orderBuilder_ == null) { + orderBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder>( + order_, + ((bitField0_ & 0x00000010) != 0), + getParentForChildren(), + isClean()); + order_ = null; + } + return orderBuilder_; + } + + private java.util.List operation_ = + java.util.Collections.emptyList(); + private void ensureOperationIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + operation_ = new java.util.ArrayList(operation_); + bitField0_ |= 0x00000020; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder> operationBuilder_; + + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public java.util.List getOperationList() { + if (operationBuilder_ == null) { + return java.util.Collections.unmodifiableList(operation_); + } else { + return operationBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public int getOperationCount() { + if (operationBuilder_ == null) { + return operation_.size(); + } else { + return operationBuilder_.getCount(); + } + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation getOperation(int index) { + if (operationBuilder_ == null) { + return operation_.get(index); + } else { + return operationBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder setOperation( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation value) { + if (operationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOperationIsMutable(); + operation_.set(index, value); + onChanged(); + } else { + operationBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder setOperation( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder builderForValue) { + if (operationBuilder_ == null) { + ensureOperationIsMutable(); + operation_.set(index, builderForValue.build()); + onChanged(); + } else { + operationBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder addOperation(com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation value) { + if (operationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOperationIsMutable(); + operation_.add(value); + onChanged(); + } else { + operationBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder addOperation( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation value) { + if (operationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOperationIsMutable(); + operation_.add(index, value); + onChanged(); + } else { + operationBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder addOperation( + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder builderForValue) { + if (operationBuilder_ == null) { + ensureOperationIsMutable(); + operation_.add(builderForValue.build()); + onChanged(); + } else { + operationBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder addOperation( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder builderForValue) { + if (operationBuilder_ == null) { + ensureOperationIsMutable(); + operation_.add(index, builderForValue.build()); + onChanged(); + } else { + operationBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder addAllOperation( + java.lang.Iterable values) { + if (operationBuilder_ == null) { + ensureOperationIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, operation_); + onChanged(); + } else { + operationBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder clearOperation() { + if (operationBuilder_ == null) { + operation_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + } else { + operationBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public Builder removeOperation(int index) { + if (operationBuilder_ == null) { + ensureOperationIsMutable(); + operation_.remove(index); + onChanged(); + } else { + operationBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder getOperationBuilder( + int index) { + return getOperationFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder getOperationOrBuilder( + int index) { + if (operationBuilder_ == null) { + return operation_.get(index); } else { + return operationBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public java.util.List + getOperationOrBuilderList() { + if (operationBuilder_ != null) { + return operationBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(operation_); + } + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder addOperationBuilder() { + return getOperationFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.getDefaultInstance()); + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder addOperationBuilder( + int index) { + return getOperationFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.getDefaultInstance()); + } + /** + *
    +       ** list of operations to be applied.
    +       *Valid operations will depend on the data_model 
    +       * 
    + * + * repeated .Mysqlx.Crud.UpdateOperation operation = 7; + */ + public java.util.List + getOperationBuilderList() { + return getOperationFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder> + getOperationFieldBuilder() { + if (operationBuilder_ == null) { + operationBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperationOrBuilder>( + operation_, + ((bitField0_ & 0x00000020) != 0), + getParentForChildren(), + isClean()); + operation_ = null; + } + return operationBuilder_; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000040) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000040; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> argsBuilder_; + + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 8; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + args_, + ((bitField0_ & 0x00000040) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> limitExprBuilder_; + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return Whether the limitExpr field is set. + */ + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + * @return The limitExpr. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + if (limitExprBuilder_ == null) { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } else { + return limitExprBuilder_.getMessage(); + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public Builder setLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limitExpr_ = value; + onChanged(); + } else { + limitExprBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public Builder setLimitExpr( + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder builderForValue) { + if (limitExprBuilder_ == null) { + limitExpr_ = builderForValue.build(); + onChanged(); + } else { + limitExprBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public Builder mergeLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (((bitField0_ & 0x00000080) != 0) && + limitExpr_ != null && + limitExpr_ != com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance()) { + limitExpr_ = + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.newBuilder(limitExpr_).mergeFrom(value).buildPartial(); + } else { + limitExpr_ = value; + } + onChanged(); + } else { + limitExprBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public Builder clearLimitExpr() { + if (limitExprBuilder_ == null) { + limitExpr_ = null; + onChanged(); + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder getLimitExprBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getLimitExprFieldBuilder().getBuilder(); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + if (limitExprBuilder_ != null) { + return limitExprBuilder_.getMessageOrBuilder(); + } else { + return limitExpr_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> + getLimitExprFieldBuilder() { + if (limitExprBuilder_ == null) { + limitExprBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder>( + getLimitExpr(), + getParentForChildren(), + isClean()); + limitExpr_ = null; + } + return limitExprBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Update) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Update) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Update DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Update(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Update getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Update parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Update(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Update getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface DeleteOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.Delete) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + boolean hasDataModel(); + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel(); + + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return Whether the criteria field is set. + */ + boolean hasCriteria(); + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return The criteria. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria(); + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder(); + + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return Whether the limit field is set. + */ + boolean hasLimit(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return The limit. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder(); + + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + java.util.List + getOrderList(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + int getOrderCount(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + java.util.List + getOrderOrBuilderList(); + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index); + + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + java.util.List + getArgsList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + int getArgsCount(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return Whether the limitExpr field is set. + */ + boolean hasLimitExpr(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return The limitExpr. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr(); + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder(); + } + /** + *
    +   **
    +   *Delete documents/rows from a Collection/Table
    +   *@returns @ref Mysqlx::Resultset
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.Delete} + */ + public static final class Delete extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.Delete) + DeleteOrBuilder { + private static final long serialVersionUID = 0L; + // Use Delete.newBuilder() to construct. + private Delete(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Delete() { + dataModel_ = 1; + order_ = java.util.Collections.emptyList(); + args_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Delete(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Delete( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + dataModel_ = rawValue; + } + break; + } + case 26: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = criteria_.toBuilder(); + } + criteria_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(criteria_); + criteria_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = limit_.toBuilder(); + } + limit_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Limit.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limit_); + limit_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 42: { + if (!((mutable_bitField0_ & 0x00000010) != 0)) { + order_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000010; + } + order_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Order.PARSER, extensionRegistry)); + break; + } + case 50: { + if (!((mutable_bitField0_ & 0x00000020) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000020; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry)); + break; + } + case 58: { + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = limitExpr_.toBuilder(); + } + limitExpr_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(limitExpr_); + limitExpr_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000010) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + } + if (((mutable_bitField0_ & 0x00000020) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Delete_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Delete_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.class, com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder.class); + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** collection to change 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DATA_MODEL_FIELD_NUMBER = 2; + private int dataModel_; + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** data model that the operations refer to 
    +     * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + + public static final int CRITERIA_FIELD_NUMBER = 3; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return Whether the criteria field is set. + */ + @java.lang.Override + public boolean hasCriteria() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return The criteria. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + /** + *
    +     ** filter expression to match rows that the operations will apply on 
    +     * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + + public static final int LIMIT_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return Whether the limit field is set. + */ + @java.lang.Override + public boolean hasLimit() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return The limit. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + + public static final int ORDER_FIELD_NUMBER = 5; + private java.util.List order_; + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + @java.lang.Override + public java.util.List getOrderList() { + return order_; + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + @java.lang.Override + public java.util.List + getOrderOrBuilderList() { + return order_; + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + @java.lang.Override + public int getOrderCount() { + return order_.size(); + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + return order_.get(index); + } + /** + *
    +     ** specifies order of matched rows 
    +     * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + return order_.get(index); + } + + public static final int ARGS_FIELD_NUMBER = 6; + private java.util.List args_; + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** values for parameters used in filter expression 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int LIMIT_EXPR_FIELD_NUMBER = 7; + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return Whether the limitExpr field is set. + */ + @java.lang.Override + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return The limitExpr. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + /** + *
    +     ** limits the number of rows to match
    +     *(user can set one of: limit, limit_expr) 
    +     * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, dataModel_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(3, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(4, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + output.writeMessage(5, order_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(6, args_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(7, getLimitExpr()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, dataModel_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getCriteria()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getLimit()); + } + for (int i = 0; i < order_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, order_.get(i)); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, args_.get(i)); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, getLimitExpr()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Delete)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.Delete other = (com.mysql.cj.x.protobuf.MysqlxCrud.Delete) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDataModel() != other.hasDataModel()) return false; + if (hasDataModel()) { + if (dataModel_ != other.dataModel_) return false; + } + if (hasCriteria() != other.hasCriteria()) return false; + if (hasCriteria()) { + if (!getCriteria() + .equals(other.getCriteria())) return false; + } + if (hasLimit() != other.hasLimit()) return false; + if (hasLimit()) { + if (!getLimit() + .equals(other.getLimit())) return false; + } + if (!getOrderList() + .equals(other.getOrderList())) return false; + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasLimitExpr() != other.hasLimitExpr()) return false; + if (hasLimitExpr()) { + if (!getLimitExpr() + .equals(other.getLimitExpr())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDataModel()) { + hash = (37 * hash) + DATA_MODEL_FIELD_NUMBER; + hash = (53 * hash) + dataModel_; + } + if (hasCriteria()) { + hash = (37 * hash) + CRITERIA_FIELD_NUMBER; + hash = (53 * hash) + getCriteria().hashCode(); + } + if (hasLimit()) { + hash = (37 * hash) + LIMIT_FIELD_NUMBER; + hash = (53 * hash) + getLimit().hashCode(); + } + if (getOrderCount() > 0) { + hash = (37 * hash) + ORDER_FIELD_NUMBER; + hash = (53 * hash) + getOrderList().hashCode(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasLimitExpr()) { + hash = (37 * hash) + LIMIT_EXPR_FIELD_NUMBER; + hash = (53 * hash) + getLimitExpr().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.Delete prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Delete documents/rows from a Collection/Table
    +     *@returns @ref Mysqlx::Resultset
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.Delete} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.Delete) + com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Delete_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Delete_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.class, com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.Delete.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getCriteriaFieldBuilder(); + getLimitFieldBuilder(); + getOrderFieldBuilder(); + getArgsFieldBuilder(); + getLimitExprFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + dataModel_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + if (criteriaBuilder_ == null) { + criteria_ = null; + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (limitBuilder_ == null) { + limit_ = null; + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + } else { + orderBuilder_.clear(); + } + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + } else { + argsBuilder_.clear(); + } + if (limitExprBuilder_ == null) { + limitExpr_ = null; + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_Delete_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete build() { + com.mysql.cj.x.protobuf.MysqlxCrud.Delete result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.Delete result = new com.mysql.cj.x.protobuf.MysqlxCrud.Delete(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.dataModel_ = dataModel_; + if (((from_bitField0_ & 0x00000004) != 0)) { + if (criteriaBuilder_ == null) { + result.criteria_ = criteria_; + } else { + result.criteria_ = criteriaBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + if (limitBuilder_ == null) { + result.limit_ = limit_; + } else { + result.limit_ = limitBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (orderBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0)) { + order_ = java.util.Collections.unmodifiableList(order_); + bitField0_ = (bitField0_ & ~0x00000010); + } + result.order_ = order_; + } else { + result.order_ = orderBuilder_.build(); + } + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000040) != 0)) { + if (limitExprBuilder_ == null) { + result.limitExpr_ = limitExpr_; + } else { + result.limitExpr_ = limitExprBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.Delete) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.Delete)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.Delete other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDataModel()) { + setDataModel(other.getDataModel()); + } + if (other.hasCriteria()) { + mergeCriteria(other.getCriteria()); + } + if (other.hasLimit()) { + mergeLimit(other.getLimit()); + } + if (orderBuilder_ == null) { + if (!other.order_.isEmpty()) { + if (order_.isEmpty()) { + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000010); + } else { + ensureOrderIsMutable(); + order_.addAll(other.order_); + } + onChanged(); + } + } else { + if (!other.order_.isEmpty()) { + if (orderBuilder_.isEmpty()) { + orderBuilder_.dispose(); + orderBuilder_ = null; + order_ = other.order_; + bitField0_ = (bitField0_ & ~0x00000010); + orderBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getOrderFieldBuilder() : null; + } else { + orderBuilder_.addAllMessages(other.order_); + } + } + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000020); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasLimitExpr()) { + mergeLimitExpr(other.getLimitExpr()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + if (hasCriteria()) { + if (!getCriteria().isInitialized()) { + return false; + } + } + if (hasLimit()) { + if (!getLimit().isInitialized()) { + return false; + } + } + for (int i = 0; i < getOrderCount(); i++) { + if (!getOrder(i).isInitialized()) { + return false; + } + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + if (hasLimitExpr()) { + if (!getLimitExpr().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.Delete parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.Delete) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** collection to change 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private int dataModel_ = 1; + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return Whether the dataModel field is set. + */ + @java.lang.Override public boolean hasDataModel() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return The dataModel. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DataModel getDataModel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.DataModel result = com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.valueOf(dataModel_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.DataModel.DOCUMENT : result; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @param value The dataModel to set. + * @return This builder for chaining. + */ + public Builder setDataModel(com.mysql.cj.x.protobuf.MysqlxCrud.DataModel value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + dataModel_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** data model that the operations refer to 
    +       * 
    + * + * optional .Mysqlx.Crud.DataModel data_model = 2; + * @return This builder for chaining. + */ + public Builder clearDataModel() { + bitField0_ = (bitField0_ & ~0x00000002); + dataModel_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr criteria_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> criteriaBuilder_; + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return Whether the criteria field is set. + */ + public boolean hasCriteria() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + * @return The criteria. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getCriteria() { + if (criteriaBuilder_ == null) { + return criteria_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } else { + return criteriaBuilder_.getMessage(); + } + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public Builder setCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + criteria_ = value; + onChanged(); + } else { + criteriaBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public Builder setCriteria( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (criteriaBuilder_ == null) { + criteria_ = builderForValue.build(); + onChanged(); + } else { + criteriaBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public Builder mergeCriteria(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (criteriaBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + criteria_ != null && + criteria_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + criteria_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(criteria_).mergeFrom(value).buildPartial(); + } else { + criteria_ = value; + } + onChanged(); + } else { + criteriaBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public Builder clearCriteria() { + if (criteriaBuilder_ == null) { + criteria_ = null; + onChanged(); + } else { + criteriaBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getCriteriaBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCriteriaFieldBuilder().getBuilder(); + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getCriteriaOrBuilder() { + if (criteriaBuilder_ != null) { + return criteriaBuilder_.getMessageOrBuilder(); + } else { + return criteria_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : criteria_; + } + } + /** + *
    +       ** filter expression to match rows that the operations will apply on 
    +       * 
    + * + * optional .Mysqlx.Expr.Expr criteria = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getCriteriaFieldBuilder() { + if (criteriaBuilder_ == null) { + criteriaBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getCriteria(), + getParentForChildren(), + isClean()); + criteria_ = null; + } + return criteriaBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Limit limit_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> limitBuilder_; + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return Whether the limit field is set. + */ + public boolean hasLimit() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + * @return The limit. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit getLimit() { + if (limitBuilder_ == null) { + return limit_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } else { + return limitBuilder_.getMessage(); + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public Builder setLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limit_ = value; + onChanged(); + } else { + limitBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public Builder setLimit( + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder builderForValue) { + if (limitBuilder_ == null) { + limit_ = builderForValue.build(); + onChanged(); + } else { + limitBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public Builder mergeLimit(com.mysql.cj.x.protobuf.MysqlxCrud.Limit value) { + if (limitBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + limit_ != null && + limit_ != com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance()) { + limit_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.newBuilder(limit_).mergeFrom(value).buildPartial(); + } else { + limit_ = value; + } + onChanged(); + } else { + limitBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public Builder clearLimit() { + if (limitBuilder_ == null) { + limit_ = null; + onChanged(); + } else { + limitBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder getLimitBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getLimitFieldBuilder().getBuilder(); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder getLimitOrBuilder() { + if (limitBuilder_ != null) { + return limitBuilder_.getMessageOrBuilder(); + } else { + return limit_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Limit.getDefaultInstance() : limit_; + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.Limit limit = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder> + getLimitFieldBuilder() { + if (limitBuilder_ == null) { + limitBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Limit, com.mysql.cj.x.protobuf.MysqlxCrud.Limit.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitOrBuilder>( + getLimit(), + getParentForChildren(), + isClean()); + limit_ = null; + } + return limitBuilder_; + } + + private java.util.List order_ = + java.util.Collections.emptyList(); + private void ensureOrderIsMutable() { + if (!((bitField0_ & 0x00000010) != 0)) { + order_ = new java.util.ArrayList(order_); + bitField0_ |= 0x00000010; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> orderBuilder_; + + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public java.util.List getOrderList() { + if (orderBuilder_ == null) { + return java.util.Collections.unmodifiableList(order_); + } else { + return orderBuilder_.getMessageList(); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public int getOrderCount() { + if (orderBuilder_ == null) { + return order_.size(); + } else { + return orderBuilder_.getCount(); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order getOrder(int index) { + if (orderBuilder_ == null) { + return order_.get(index); + } else { + return orderBuilder_.getMessage(index); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.set(index, value); + onChanged(); + } else { + orderBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder setOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.set(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder addOrder(com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(value); + onChanged(); + } else { + orderBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order value) { + if (orderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOrderIsMutable(); + order_.add(index, value); + onChanged(); + } else { + orderBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder addOrder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder addOrder( + int index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder builderForValue) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.add(index, builderForValue.build()); + onChanged(); + } else { + orderBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder addAllOrder( + java.lang.Iterable values) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, order_); + onChanged(); + } else { + orderBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder clearOrder() { + if (orderBuilder_ == null) { + order_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + } else { + orderBuilder_.clear(); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public Builder removeOrder(int index) { + if (orderBuilder_ == null) { + ensureOrderIsMutable(); + order_.remove(index); + onChanged(); + } else { + orderBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder getOrderBuilder( + int index) { + return getOrderFieldBuilder().getBuilder(index); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder getOrderOrBuilder( + int index) { + if (orderBuilder_ == null) { + return order_.get(index); } else { + return orderBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public java.util.List + getOrderOrBuilderList() { + if (orderBuilder_ != null) { + return orderBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(order_); + } + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder() { + return getOrderFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder addOrderBuilder( + int index) { + return getOrderFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxCrud.Order.getDefaultInstance()); + } + /** + *
    +       ** specifies order of matched rows 
    +       * 
    + * + * repeated .Mysqlx.Crud.Order order = 5; + */ + public java.util.List + getOrderBuilderList() { + return getOrderFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder> + getOrderFieldBuilder() { + if (orderBuilder_ == null) { + orderBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Order, com.mysql.cj.x.protobuf.MysqlxCrud.Order.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.OrderOrBuilder>( + order_, + ((bitField0_ & 0x00000010) != 0), + getParentForChildren(), + isClean()); + order_ = null; + } + return orderBuilder_; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000020; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> argsBuilder_; + + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** values for parameters used in filter expression 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar args = 6; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + args_, + ((bitField0_ & 0x00000020) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr limitExpr_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> limitExprBuilder_; + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return Whether the limitExpr field is set. + */ + public boolean hasLimitExpr() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + * @return The limitExpr. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr getLimitExpr() { + if (limitExprBuilder_ == null) { + return limitExpr_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } else { + return limitExprBuilder_.getMessage(); + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public Builder setLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + limitExpr_ = value; + onChanged(); + } else { + limitExprBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public Builder setLimitExpr( + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder builderForValue) { + if (limitExprBuilder_ == null) { + limitExpr_ = builderForValue.build(); + onChanged(); + } else { + limitExprBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public Builder mergeLimitExpr(com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr value) { + if (limitExprBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0) && + limitExpr_ != null && + limitExpr_ != com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance()) { + limitExpr_ = + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.newBuilder(limitExpr_).mergeFrom(value).buildPartial(); + } else { + limitExpr_ = value; + } + onChanged(); + } else { + limitExprBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public Builder clearLimitExpr() { + if (limitExprBuilder_ == null) { + limitExpr_ = null; + onChanged(); + } else { + limitExprBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder getLimitExprBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getLimitExprFieldBuilder().getBuilder(); + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder getLimitExprOrBuilder() { + if (limitExprBuilder_ != null) { + return limitExprBuilder_.getMessageOrBuilder(); + } else { + return limitExpr_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.getDefaultInstance() : limitExpr_; + } + } + /** + *
    +       ** limits the number of rows to match
    +       *(user can set one of: limit, limit_expr) 
    +       * 
    + * + * optional .Mysqlx.Crud.LimitExpr limit_expr = 7; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder> + getLimitExprFieldBuilder() { + if (limitExprBuilder_ == null) { + limitExprBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.LimitExprOrBuilder>( + getLimitExpr(), + getParentForChildren(), + isClean()); + limitExpr_ = null; + } + return limitExprBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.Delete) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.Delete) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.Delete DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.Delete(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Delete parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Delete(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CreateViewOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.CreateView) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + boolean hasDefiner(); + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The definer. + */ + java.lang.String getDefiner(); + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + com.google.protobuf.ByteString + getDefinerBytes(); + + /** + *
    +     ** defines how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return Whether the algorithm field is set. + */ + boolean hasAlgorithm(); + /** + *
    +     ** defines how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return The algorithm. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm(); + + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return Whether the security field is set. + */ + boolean hasSecurity(); + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return The security. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity(); + + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + boolean hasCheck(); + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck(); + + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + java.util.List + getColumnList(); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + int getColumnCount(); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + java.lang.String getColumn(int index); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + com.google.protobuf.ByteString + getColumnBytes(int index); + + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + boolean hasStmt(); + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt(); + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder(); + + /** + *
    +     ** if true then suppress error when created view already exists;
    +     *just replace it 
    +     * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return Whether the replaceExisting field is set. + */ + boolean hasReplaceExisting(); + /** + *
    +     ** if true then suppress error when created view already exists;
    +     *just replace it 
    +     * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return The replaceExisting. + */ + boolean getReplaceExisting(); + } + /** + *
    +   **
    +   *CreateView create view based on indicated @ref Mysqlx::Crud::Find message
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.CreateView} + */ + public static final class CreateView extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.CreateView) + CreateViewOrBuilder { + private static final long serialVersionUID = 0L; + // Use CreateView.newBuilder() to construct. + private CreateView(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CreateView() { + definer_ = ""; + algorithm_ = 1; + security_ = 2; + check_ = 1; + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CreateView(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private CreateView( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + definer_ = bs; + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + algorithm_ = rawValue; + } + break; + } + case 32: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(4, rawValue); + } else { + bitField0_ |= 0x00000008; + security_ = rawValue; + } + break; + } + case 40: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(5, rawValue); + } else { + bitField0_ |= 0x00000010; + check_ = rawValue; + } + break; + } + case 50: { + com.google.protobuf.ByteString bs = input.readBytes(); + if (!((mutable_bitField0_ & 0x00000020) != 0)) { + column_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000020; + } + column_.add(bs); + break; + } + case 58: { + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) != 0)) { + subBuilder = stmt_.toBuilder(); + } + stmt_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Find.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(stmt_); + stmt_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + case 64: { + bitField0_ |= 0x00000040; + replaceExisting_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000020) != 0)) { + column_ = column_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_CreateView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_CreateView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.class, com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.Builder.class); + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** name of the VIEW object, which should be created 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DEFINER_FIELD_NUMBER = 2; + private volatile java.lang.Object definer_; + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + @java.lang.Override + public boolean hasDefiner() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The definer. + */ + @java.lang.Override + public java.lang.String getDefiner() { + java.lang.Object ref = definer_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + definer_ = s; + } + return s; + } + } + /** + *
    +     ** user name of the definer, if the value isn't set then the definer
    +     *is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getDefinerBytes() { + java.lang.Object ref = definer_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + definer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ALGORITHM_FIELD_NUMBER = 3; + private int algorithm_; + /** + *
    +     ** defines how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return Whether the algorithm field is set. + */ + @java.lang.Override public boolean hasAlgorithm() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** defines how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return The algorithm. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(algorithm_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.UNDEFINED : result; + } + + public static final int SECURITY_FIELD_NUMBER = 4; + private int security_; + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return Whether the security field is set. + */ + @java.lang.Override public boolean hasSecurity() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return The security. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(security_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.DEFINER : result; + } + + public static final int CHECK_FIELD_NUMBER = 5; + private int check_; + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + @java.lang.Override public boolean hasCheck() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(check_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.LOCAL : result; + } + + public static final int COLUMN_FIELD_NUMBER = 6; + private com.google.protobuf.LazyStringList column_; + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + public com.google.protobuf.ProtocolStringList + getColumnList() { + return column_; + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + public int getColumnCount() { + return column_.size(); + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + public java.lang.String getColumn(int index) { + return column_.get(index); + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + public com.google.protobuf.ByteString + getColumnBytes(int index) { + return column_.getByteString(index); + } + + public static final int STMT_FIELD_NUMBER = 7; + private com.mysql.cj.x.protobuf.MysqlxCrud.Find stmt_; + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + + public static final int REPLACE_EXISTING_FIELD_NUMBER = 8; + private boolean replaceExisting_; + /** + *
    +     ** if true then suppress error when created view already exists;
    +     *just replace it 
    +     * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return Whether the replaceExisting field is set. + */ + @java.lang.Override + public boolean hasReplaceExisting() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +     ** if true then suppress error when created view already exists;
    +     *just replace it 
    +     * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return The replaceExisting. + */ + @java.lang.Override + public boolean getReplaceExisting() { + return replaceExisting_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasStmt()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (!getStmt().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, definer_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeEnum(3, algorithm_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeEnum(4, security_); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeEnum(5, check_); + } + for (int i = 0; i < column_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, column_.getRaw(i)); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(7, getStmt()); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeBool(8, replaceExisting_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, definer_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, algorithm_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(4, security_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(5, check_); + } + { + int dataSize = 0; + for (int i = 0; i < column_.size(); i++) { + dataSize += computeStringSizeNoTag(column_.getRaw(i)); + } + size += dataSize; + size += 1 * getColumnList().size(); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, getStmt()); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(8, replaceExisting_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.CreateView)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView other = (com.mysql.cj.x.protobuf.MysqlxCrud.CreateView) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDefiner() != other.hasDefiner()) return false; + if (hasDefiner()) { + if (!getDefiner() + .equals(other.getDefiner())) return false; + } + if (hasAlgorithm() != other.hasAlgorithm()) return false; + if (hasAlgorithm()) { + if (algorithm_ != other.algorithm_) return false; + } + if (hasSecurity() != other.hasSecurity()) return false; + if (hasSecurity()) { + if (security_ != other.security_) return false; + } + if (hasCheck() != other.hasCheck()) return false; + if (hasCheck()) { + if (check_ != other.check_) return false; + } + if (!getColumnList() + .equals(other.getColumnList())) return false; + if (hasStmt() != other.hasStmt()) return false; + if (hasStmt()) { + if (!getStmt() + .equals(other.getStmt())) return false; + } + if (hasReplaceExisting() != other.hasReplaceExisting()) return false; + if (hasReplaceExisting()) { + if (getReplaceExisting() + != other.getReplaceExisting()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDefiner()) { + hash = (37 * hash) + DEFINER_FIELD_NUMBER; + hash = (53 * hash) + getDefiner().hashCode(); + } + if (hasAlgorithm()) { + hash = (37 * hash) + ALGORITHM_FIELD_NUMBER; + hash = (53 * hash) + algorithm_; + } + if (hasSecurity()) { + hash = (37 * hash) + SECURITY_FIELD_NUMBER; + hash = (53 * hash) + security_; + } + if (hasCheck()) { + hash = (37 * hash) + CHECK_FIELD_NUMBER; + hash = (53 * hash) + check_; + } + if (getColumnCount() > 0) { + hash = (37 * hash) + COLUMN_FIELD_NUMBER; + hash = (53 * hash) + getColumnList().hashCode(); + } + if (hasStmt()) { + hash = (37 * hash) + STMT_FIELD_NUMBER; + hash = (53 * hash) + getStmt().hashCode(); + } + if (hasReplaceExisting()) { + hash = (37 * hash) + REPLACE_EXISTING_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getReplaceExisting()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.CreateView prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *CreateView create view based on indicated @ref Mysqlx::Crud::Find message
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.CreateView} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.CreateView) + com.mysql.cj.x.protobuf.MysqlxCrud.CreateViewOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_CreateView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_CreateView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.class, com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getStmtFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + definer_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + algorithm_ = 1; + bitField0_ = (bitField0_ & ~0x00000004); + security_ = 2; + bitField0_ = (bitField0_ & ~0x00000008); + check_ = 1; + bitField0_ = (bitField0_ & ~0x00000010); + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + if (stmtBuilder_ == null) { + stmt_ = null; + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + replaceExisting_ = false; + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_CreateView_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CreateView getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CreateView build() { + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CreateView buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView result = new com.mysql.cj.x.protobuf.MysqlxCrud.CreateView(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.definer_ = definer_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.algorithm_ = algorithm_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000008; + } + result.security_ = security_; + if (((from_bitField0_ & 0x00000010) != 0)) { + to_bitField0_ |= 0x00000010; + } + result.check_ = check_; + if (((bitField0_ & 0x00000020) != 0)) { + column_ = column_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.column_ = column_; + if (((from_bitField0_ & 0x00000040) != 0)) { + if (stmtBuilder_ == null) { + result.stmt_ = stmt_; + } else { + result.stmt_ = stmtBuilder_.build(); + } + to_bitField0_ |= 0x00000020; + } + if (((from_bitField0_ & 0x00000080) != 0)) { + result.replaceExisting_ = replaceExisting_; + to_bitField0_ |= 0x00000040; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.CreateView) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.CreateView)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.CreateView other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.CreateView.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDefiner()) { + bitField0_ |= 0x00000002; + definer_ = other.definer_; + onChanged(); + } + if (other.hasAlgorithm()) { + setAlgorithm(other.getAlgorithm()); + } + if (other.hasSecurity()) { + setSecurity(other.getSecurity()); + } + if (other.hasCheck()) { + setCheck(other.getCheck()); + } + if (!other.column_.isEmpty()) { + if (column_.isEmpty()) { + column_ = other.column_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureColumnIsMutable(); + column_.addAll(other.column_); + } + onChanged(); + } + if (other.hasStmt()) { + mergeStmt(other.getStmt()); + } + if (other.hasReplaceExisting()) { + setReplaceExisting(other.getReplaceExisting()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!hasStmt()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + if (!getStmt().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.CreateView parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.CreateView) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** name of the VIEW object, which should be created 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private java.lang.Object definer_ = ""; + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + public boolean hasDefiner() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @return The definer. + */ + public java.lang.String getDefiner() { + java.lang.Object ref = definer_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + definer_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + public com.google.protobuf.ByteString + getDefinerBytes() { + java.lang.Object ref = definer_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + definer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @param value The definer to set. + * @return This builder for chaining. + */ + public Builder setDefiner( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + definer_ = value; + onChanged(); + return this; + } + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @return This builder for chaining. + */ + public Builder clearDefiner() { + bitField0_ = (bitField0_ & ~0x00000002); + definer_ = getDefaultInstance().getDefiner(); + onChanged(); + return this; + } + /** + *
    +       ** user name of the definer, if the value isn't set then the definer
    +       *is current user 
    +       * 
    + * + * optional string definer = 2; + * @param value The bytes for definer to set. + * @return This builder for chaining. + */ + public Builder setDefinerBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + definer_ = value; + onChanged(); + return this; + } + + private int algorithm_ = 1; + /** + *
    +       ** defines how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return Whether the algorithm field is set. + */ + @java.lang.Override public boolean hasAlgorithm() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** defines how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return The algorithm. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(algorithm_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.UNDEFINED : result; + } + /** + *
    +       ** defines how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @param value The algorithm to set. + * @return This builder for chaining. + */ + public Builder setAlgorithm(com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + algorithm_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** defines how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3 [default = UNDEFINED]; + * @return This builder for chaining. + */ + public Builder clearAlgorithm() { + bitField0_ = (bitField0_ & ~0x00000004); + algorithm_ = 1; + onChanged(); + return this; + } + + private int security_ = 2; + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return Whether the security field is set. + */ + @java.lang.Override public boolean hasSecurity() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return The security. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(security_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.DEFINER : result; + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @param value The security to set. + * @return This builder for chaining. + */ + public Builder setSecurity(com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + security_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4 [default = DEFINER]; + * @return This builder for chaining. + */ + public Builder clearSecurity() { + bitField0_ = (bitField0_ & ~0x00000008); + security_ = 2; + onChanged(); + return this; + } + + private int check_ = 1; + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + @java.lang.Override public boolean hasCheck() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(check_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.LOCAL : result; + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @param value The check to set. + * @return This builder for chaining. + */ + public Builder setCheck(com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + check_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return This builder for chaining. + */ + public Builder clearCheck() { + bitField0_ = (bitField0_ & ~0x00000010); + check_ = 1; + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureColumnIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + column_ = new com.google.protobuf.LazyStringArrayList(column_); + bitField0_ |= 0x00000020; + } + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + public com.google.protobuf.ProtocolStringList + getColumnList() { + return column_.getUnmodifiableView(); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + public int getColumnCount() { + return column_.size(); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + public java.lang.String getColumn(int index) { + return column_.get(index); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + public com.google.protobuf.ByteString + getColumnBytes(int index) { + return column_.getByteString(index); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index to set the value at. + * @param value The column to set. + * @return This builder for chaining. + */ + public Builder setColumn( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.set(index, value); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param value The column to add. + * @return This builder for chaining. + */ + public Builder addColumn( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.add(value); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param values The column to add. + * @return This builder for chaining. + */ + public Builder addAllColumn( + java.lang.Iterable values) { + ensureColumnIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, column_); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return This builder for chaining. + */ + public Builder clearColumn() { + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param value The bytes of the column to add. + * @return This builder for chaining. + */ + public Builder addColumnBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.add(value); + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Find stmt_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> stmtBuilder_; + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + public boolean hasStmt() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt() { + if (stmtBuilder_ == null) { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } else { + return stmtBuilder_.getMessage(); + } + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public Builder setStmt(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (stmtBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + stmt_ = value; + onChanged(); + } else { + stmtBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public Builder setStmt( + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder builderForValue) { + if (stmtBuilder_ == null) { + stmt_ = builderForValue.build(); + onChanged(); + } else { + stmtBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public Builder mergeStmt(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (stmtBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0) && + stmt_ != null && + stmt_ != com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance()) { + stmt_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Find.newBuilder(stmt_).mergeFrom(value).buildPartial(); + } else { + stmt_ = value; + } + onChanged(); + } else { + stmtBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public Builder clearStmt() { + if (stmtBuilder_ == null) { + stmt_ = null; + onChanged(); + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder getStmtBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getStmtFieldBuilder().getBuilder(); + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder() { + if (stmtBuilder_ != null) { + return stmtBuilder_.getMessageOrBuilder(); + } else { + return stmt_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * required .Mysqlx.Crud.Find stmt = 7; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> + getStmtFieldBuilder() { + if (stmtBuilder_ == null) { + stmtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder>( + getStmt(), + getParentForChildren(), + isClean()); + stmt_ = null; + } + return stmtBuilder_; + } + + private boolean replaceExisting_ ; + /** + *
    +       ** if true then suppress error when created view already exists;
    +       *just replace it 
    +       * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return Whether the replaceExisting field is set. + */ + @java.lang.Override + public boolean hasReplaceExisting() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + *
    +       ** if true then suppress error when created view already exists;
    +       *just replace it 
    +       * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return The replaceExisting. + */ + @java.lang.Override + public boolean getReplaceExisting() { + return replaceExisting_; + } + /** + *
    +       ** if true then suppress error when created view already exists;
    +       *just replace it 
    +       * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @param value The replaceExisting to set. + * @return This builder for chaining. + */ + public Builder setReplaceExisting(boolean value) { + bitField0_ |= 0x00000080; + replaceExisting_ = value; + onChanged(); + return this; + } + /** + *
    +       ** if true then suppress error when created view already exists;
    +       *just replace it 
    +       * 
    + * + * optional bool replace_existing = 8 [default = false]; + * @return This builder for chaining. + */ + public Builder clearReplaceExisting() { + bitField0_ = (bitField0_ & ~0x00000080); + replaceExisting_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.CreateView) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.CreateView) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.CreateView DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.CreateView(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.CreateView getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CreateView parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new CreateView(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CreateView getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ModifyViewOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.ModifyView) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + boolean hasDefiner(); + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The definer. + */ + java.lang.String getDefiner(); + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + com.google.protobuf.ByteString + getDefinerBytes(); + + /** + *
    +     ** defined how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return Whether the algorithm field is set. + */ + boolean hasAlgorithm(); + /** + *
    +     ** defined how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return The algorithm. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm(); + + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return Whether the security field is set. + */ + boolean hasSecurity(); + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return The security. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity(); + + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + boolean hasCheck(); + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck(); + + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + java.util.List + getColumnList(); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + int getColumnCount(); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + java.lang.String getColumn(int index); + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + com.google.protobuf.ByteString + getColumnBytes(int index); + + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + boolean hasStmt(); + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt(); + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder(); + } + /** + *
    +   **
    +   *ModifyView modify existing view based on indicated
    +   *@ref Mysqlx::Crud::Find message
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.ModifyView} + */ + public static final class ModifyView extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.ModifyView) + ModifyViewOrBuilder { + private static final long serialVersionUID = 0L; + // Use ModifyView.newBuilder() to construct. + private ModifyView(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ModifyView() { + definer_ = ""; + algorithm_ = 1; + security_ = 1; + check_ = 1; + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ModifyView(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ModifyView( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + definer_ = bs; + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + algorithm_ = rawValue; + } + break; + } + case 32: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(4, rawValue); + } else { + bitField0_ |= 0x00000008; + security_ = rawValue; + } + break; + } + case 40: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption value = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(5, rawValue); + } else { + bitField0_ |= 0x00000010; + check_ = rawValue; + } + break; + } + case 50: { + com.google.protobuf.ByteString bs = input.readBytes(); + if (!((mutable_bitField0_ & 0x00000020) != 0)) { + column_ = new com.google.protobuf.LazyStringArrayList(); + mutable_bitField0_ |= 0x00000020; + } + column_.add(bs); + break; + } + case 58: { + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) != 0)) { + subBuilder = stmt_.toBuilder(); + } + stmt_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Find.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(stmt_); + stmt_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000020) != 0)) { + column_ = column_.getUnmodifiableView(); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_ModifyView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_ModifyView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.class, com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.Builder.class); + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** name of the VIEW object, which should be modified 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int DEFINER_FIELD_NUMBER = 2; + private volatile java.lang.Object definer_; + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + @java.lang.Override + public boolean hasDefiner() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The definer. + */ + @java.lang.Override + public java.lang.String getDefiner() { + java.lang.Object ref = definer_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + definer_ = s; + } + return s; + } + } + /** + *
    +     ** user name of the definer,
    +     *if the value isn't set then the definer is current user 
    +     * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getDefinerBytes() { + java.lang.Object ref = definer_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + definer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ALGORITHM_FIELD_NUMBER = 3; + private int algorithm_; + /** + *
    +     ** defined how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return Whether the algorithm field is set. + */ + @java.lang.Override public boolean hasAlgorithm() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** defined how MySQL Server processes the view 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return The algorithm. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(algorithm_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.UNDEFINED : result; + } + + public static final int SECURITY_FIELD_NUMBER = 4; + private int security_; + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return Whether the security field is set. + */ + @java.lang.Override public boolean hasSecurity() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** defines the security context in which the view is going be executed 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return The security. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(security_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.INVOKER : result; + } + + public static final int CHECK_FIELD_NUMBER = 5; + private int check_; + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + @java.lang.Override public boolean hasCheck() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** limits the write operations done on a VIEW 
    +     * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(check_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.LOCAL : result; + } + + public static final int COLUMN_FIELD_NUMBER = 6; + private com.google.protobuf.LazyStringList column_; + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + public com.google.protobuf.ProtocolStringList + getColumnList() { + return column_; + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + public int getColumnCount() { + return column_.size(); + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + public java.lang.String getColumn(int index) { + return column_.get(index); + } + /** + *
    +     ** defines the list of aliases for column names specified in `stmt` 
    +     * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + public com.google.protobuf.ByteString + getColumnBytes(int index) { + return column_.getByteString(index); + } + + public static final int STMT_FIELD_NUMBER = 7; + private com.mysql.cj.x.protobuf.MysqlxCrud.Find stmt_; + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + /** + *
    +     ** Mysqlx.Crud.Find message from which the SELECT statement
    +     *is going to be build 
    +     * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + if (hasStmt()) { + if (!getStmt().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, definer_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeEnum(3, algorithm_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeEnum(4, security_); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeEnum(5, check_); + } + for (int i = 0; i < column_.size(); i++) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, column_.getRaw(i)); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(7, getStmt()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, definer_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, algorithm_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(4, security_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(5, check_); + } + { + int dataSize = 0; + for (int i = 0; i < column_.size(); i++) { + dataSize += computeStringSizeNoTag(column_.getRaw(i)); + } + size += dataSize; + size += 1 * getColumnList().size(); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, getStmt()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView other = (com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasDefiner() != other.hasDefiner()) return false; + if (hasDefiner()) { + if (!getDefiner() + .equals(other.getDefiner())) return false; + } + if (hasAlgorithm() != other.hasAlgorithm()) return false; + if (hasAlgorithm()) { + if (algorithm_ != other.algorithm_) return false; + } + if (hasSecurity() != other.hasSecurity()) return false; + if (hasSecurity()) { + if (security_ != other.security_) return false; + } + if (hasCheck() != other.hasCheck()) return false; + if (hasCheck()) { + if (check_ != other.check_) return false; + } + if (!getColumnList() + .equals(other.getColumnList())) return false; + if (hasStmt() != other.hasStmt()) return false; + if (hasStmt()) { + if (!getStmt() + .equals(other.getStmt())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasDefiner()) { + hash = (37 * hash) + DEFINER_FIELD_NUMBER; + hash = (53 * hash) + getDefiner().hashCode(); + } + if (hasAlgorithm()) { + hash = (37 * hash) + ALGORITHM_FIELD_NUMBER; + hash = (53 * hash) + algorithm_; + } + if (hasSecurity()) { + hash = (37 * hash) + SECURITY_FIELD_NUMBER; + hash = (53 * hash) + security_; + } + if (hasCheck()) { + hash = (37 * hash) + CHECK_FIELD_NUMBER; + hash = (53 * hash) + check_; + } + if (getColumnCount() > 0) { + hash = (37 * hash) + COLUMN_FIELD_NUMBER; + hash = (53 * hash) + getColumnList().hashCode(); + } + if (hasStmt()) { + hash = (37 * hash) + STMT_FIELD_NUMBER; + hash = (53 * hash) + getStmt().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *ModifyView modify existing view based on indicated
    +     *@ref Mysqlx::Crud::Find message
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.ModifyView} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.ModifyView) + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyViewOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_ModifyView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_ModifyView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.class, com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + getStmtFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + definer_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + algorithm_ = 1; + bitField0_ = (bitField0_ & ~0x00000004); + security_ = 1; + bitField0_ = (bitField0_ & ~0x00000008); + check_ = 1; + bitField0_ = (bitField0_ & ~0x00000010); + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + if (stmtBuilder_ == null) { + stmt_ = null; + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_ModifyView_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView build() { + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView result = new com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.definer_ = definer_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.algorithm_ = algorithm_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000008; + } + result.security_ = security_; + if (((from_bitField0_ & 0x00000010) != 0)) { + to_bitField0_ |= 0x00000010; + } + result.check_ = check_; + if (((bitField0_ & 0x00000020) != 0)) { + column_ = column_.getUnmodifiableView(); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.column_ = column_; + if (((from_bitField0_ & 0x00000040) != 0)) { + if (stmtBuilder_ == null) { + result.stmt_ = stmt_; + } else { + result.stmt_ = stmtBuilder_.build(); + } + to_bitField0_ |= 0x00000020; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasDefiner()) { + bitField0_ |= 0x00000002; + definer_ = other.definer_; + onChanged(); + } + if (other.hasAlgorithm()) { + setAlgorithm(other.getAlgorithm()); + } + if (other.hasSecurity()) { + setSecurity(other.getSecurity()); + } + if (other.hasCheck()) { + setCheck(other.getCheck()); + } + if (!other.column_.isEmpty()) { + if (column_.isEmpty()) { + column_ = other.column_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureColumnIsMutable(); + column_.addAll(other.column_); + } + onChanged(); + } + if (other.hasStmt()) { + mergeStmt(other.getStmt()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + if (hasStmt()) { + if (!getStmt().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** name of the VIEW object, which should be modified 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private java.lang.Object definer_ = ""; + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @return Whether the definer field is set. + */ + public boolean hasDefiner() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @return The definer. + */ + public java.lang.String getDefiner() { + java.lang.Object ref = definer_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + definer_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @return The bytes for definer. + */ + public com.google.protobuf.ByteString + getDefinerBytes() { + java.lang.Object ref = definer_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + definer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @param value The definer to set. + * @return This builder for chaining. + */ + public Builder setDefiner( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + definer_ = value; + onChanged(); + return this; + } + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @return This builder for chaining. + */ + public Builder clearDefiner() { + bitField0_ = (bitField0_ & ~0x00000002); + definer_ = getDefaultInstance().getDefiner(); + onChanged(); + return this; + } + /** + *
    +       ** user name of the definer,
    +       *if the value isn't set then the definer is current user 
    +       * 
    + * + * optional string definer = 2; + * @param value The bytes for definer to set. + * @return This builder for chaining. + */ + public Builder setDefinerBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + definer_ = value; + onChanged(); + return this; + } + + private int algorithm_ = 1; + /** + *
    +       ** defined how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return Whether the algorithm field is set. + */ + @java.lang.Override public boolean hasAlgorithm() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** defined how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return The algorithm. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm getAlgorithm() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.valueOf(algorithm_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm.UNDEFINED : result; + } + /** + *
    +       ** defined how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @param value The algorithm to set. + * @return This builder for chaining. + */ + public Builder setAlgorithm(com.mysql.cj.x.protobuf.MysqlxCrud.ViewAlgorithm value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + algorithm_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** defined how MySQL Server processes the view 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewAlgorithm algorithm = 3; + * @return This builder for chaining. + */ + public Builder clearAlgorithm() { + bitField0_ = (bitField0_ & ~0x00000004); + algorithm_ = 1; + onChanged(); + return this; + } + + private int security_ = 1; + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return Whether the security field is set. + */ + @java.lang.Override public boolean hasSecurity() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return The security. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity getSecurity() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.valueOf(security_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity.INVOKER : result; + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @param value The security to set. + * @return This builder for chaining. + */ + public Builder setSecurity(com.mysql.cj.x.protobuf.MysqlxCrud.ViewSqlSecurity value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + security_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** defines the security context in which the view is going be executed 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewSqlSecurity security = 4; + * @return This builder for chaining. + */ + public Builder clearSecurity() { + bitField0_ = (bitField0_ & ~0x00000008); + security_ = 1; + onChanged(); + return this; + } + + private int check_ = 1; + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return Whether the check field is set. + */ + @java.lang.Override public boolean hasCheck() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return The check. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption getCheck() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption result = com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.valueOf(check_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption.LOCAL : result; + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @param value The check to set. + * @return This builder for chaining. + */ + public Builder setCheck(com.mysql.cj.x.protobuf.MysqlxCrud.ViewCheckOption value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + check_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** limits the write operations done on a VIEW 
    +       * 
    + * + * optional .Mysqlx.Crud.ViewCheckOption check = 5; + * @return This builder for chaining. + */ + public Builder clearCheck() { + bitField0_ = (bitField0_ & ~0x00000010); + check_ = 1; + onChanged(); + return this; + } + + private com.google.protobuf.LazyStringList column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + private void ensureColumnIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + column_ = new com.google.protobuf.LazyStringArrayList(column_); + bitField0_ |= 0x00000020; + } + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return A list containing the column. + */ + public com.google.protobuf.ProtocolStringList + getColumnList() { + return column_.getUnmodifiableView(); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return The count of column. + */ + public int getColumnCount() { + return column_.size(); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index of the element to return. + * @return The column at the given index. + */ + public java.lang.String getColumn(int index) { + return column_.get(index); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index of the value to return. + * @return The bytes of the column at the given index. + */ + public com.google.protobuf.ByteString + getColumnBytes(int index) { + return column_.getByteString(index); + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param index The index to set the value at. + * @param value The column to set. + * @return This builder for chaining. + */ + public Builder setColumn( + int index, java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.set(index, value); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param value The column to add. + * @return This builder for chaining. + */ + public Builder addColumn( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.add(value); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param values The column to add. + * @return This builder for chaining. + */ + public Builder addAllColumn( + java.lang.Iterable values) { + ensureColumnIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, column_); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @return This builder for chaining. + */ + public Builder clearColumn() { + column_ = com.google.protobuf.LazyStringArrayList.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + /** + *
    +       ** defines the list of aliases for column names specified in `stmt` 
    +       * 
    + * + * repeated string column = 6; + * @param value The bytes of the column to add. + * @return This builder for chaining. + */ + public Builder addColumnBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureColumnIsMutable(); + column_.add(value); + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Find stmt_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> stmtBuilder_; + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return Whether the stmt field is set. + */ + public boolean hasStmt() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + * @return The stmt. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getStmt() { + if (stmtBuilder_ == null) { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } else { + return stmtBuilder_.getMessage(); + } + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public Builder setStmt(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (stmtBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + stmt_ = value; + onChanged(); + } else { + stmtBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public Builder setStmt( + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder builderForValue) { + if (stmtBuilder_ == null) { + stmt_ = builderForValue.build(); + onChanged(); + } else { + stmtBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public Builder mergeStmt(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (stmtBuilder_ == null) { + if (((bitField0_ & 0x00000040) != 0) && + stmt_ != null && + stmt_ != com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance()) { + stmt_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Find.newBuilder(stmt_).mergeFrom(value).buildPartial(); + } else { + stmt_ = value; + } + onChanged(); + } else { + stmtBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public Builder clearStmt() { + if (stmtBuilder_ == null) { + stmt_ = null; + onChanged(); + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder getStmtBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getStmtFieldBuilder().getBuilder(); + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getStmtOrBuilder() { + if (stmtBuilder_ != null) { + return stmtBuilder_.getMessageOrBuilder(); + } else { + return stmt_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : stmt_; + } + } + /** + *
    +       ** Mysqlx.Crud.Find message from which the SELECT statement
    +       *is going to be build 
    +       * 
    + * + * optional .Mysqlx.Crud.Find stmt = 7; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> + getStmtFieldBuilder() { + if (stmtBuilder_ == null) { + stmtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder>( + getStmt(), + getParentForChildren(), + isClean()); + stmt_ = null; + } + return stmtBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.ModifyView) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.ModifyView) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ModifyView parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ModifyView(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.ModifyView getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface DropViewOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Crud.DropView) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + boolean hasCollection(); + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection(); + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder(); + + /** + *
    +     ** if true then suppress error when deleted view does not exists 
    +     * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return Whether the ifExists field is set. + */ + boolean hasIfExists(); + /** + *
    +     ** if true then suppress error when deleted view does not exists 
    +     * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return The ifExists. + */ + boolean getIfExists(); + } + /** + *
    +   **
    +   *DropView removing existing view
    +   * 
    + * + * Protobuf type {@code Mysqlx.Crud.DropView} + */ + public static final class DropView extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Crud.DropView) + DropViewOrBuilder { + private static final long serialVersionUID = 0L; + // Use DropView.newBuilder() to construct. + private DropView(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private DropView() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new DropView(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DropView( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = collection_.toBuilder(); + } + collection_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Collection.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(collection_); + collection_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + bitField0_ |= 0x00000002; + ifExists_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_DropView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_DropView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.DropView.class, com.mysql.cj.x.protobuf.MysqlxCrud.DropView.Builder.class); + } + + private int bitField0_; + public static final int COLLECTION_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + @java.lang.Override + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + /** + *
    +     ** name of the VIEW object, which should be deleted 
    +     * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + + public static final int IF_EXISTS_FIELD_NUMBER = 2; + private boolean ifExists_; + /** + *
    +     ** if true then suppress error when deleted view does not exists 
    +     * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return Whether the ifExists field is set. + */ + @java.lang.Override + public boolean hasIfExists() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** if true then suppress error when deleted view does not exists 
    +     * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return The ifExists. + */ + @java.lang.Override + public boolean getIfExists() { + return ifExists_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCollection()) { + memoizedIsInitialized = 0; + return false; + } + if (!getCollection().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBool(2, ifExists_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getCollection()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, ifExists_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCrud.DropView)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCrud.DropView other = (com.mysql.cj.x.protobuf.MysqlxCrud.DropView) obj; + + if (hasCollection() != other.hasCollection()) return false; + if (hasCollection()) { + if (!getCollection() + .equals(other.getCollection())) return false; + } + if (hasIfExists() != other.hasIfExists()) return false; + if (hasIfExists()) { + if (getIfExists() + != other.getIfExists()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCollection()) { + hash = (37 * hash) + COLLECTION_FIELD_NUMBER; + hash = (53 * hash) + getCollection().hashCode(); + } + if (hasIfExists()) { + hash = (37 * hash) + IF_EXISTS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getIfExists()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCrud.DropView prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *DropView removing existing view
    +     * 
    + * + * Protobuf type {@code Mysqlx.Crud.DropView} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Crud.DropView) + com.mysql.cj.x.protobuf.MysqlxCrud.DropViewOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_DropView_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_DropView_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCrud.DropView.class, com.mysql.cj.x.protobuf.MysqlxCrud.DropView.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCrud.DropView.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCollectionFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (collectionBuilder_ == null) { + collection_ = null; + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + ifExists_ = false; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.internal_static_Mysqlx_Crud_DropView_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DropView getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCrud.DropView.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DropView build() { + com.mysql.cj.x.protobuf.MysqlxCrud.DropView result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DropView buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCrud.DropView result = new com.mysql.cj.x.protobuf.MysqlxCrud.DropView(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (collectionBuilder_ == null) { + result.collection_ = collection_; + } else { + result.collection_ = collectionBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.ifExists_ = ifExists_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCrud.DropView) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCrud.DropView)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCrud.DropView other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCrud.DropView.getDefaultInstance()) return this; + if (other.hasCollection()) { + mergeCollection(other.getCollection()); + } + if (other.hasIfExists()) { + setIfExists(other.getIfExists()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCollection()) { + return false; + } + if (!getCollection().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCrud.DropView parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCrud.DropView) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxCrud.Collection collection_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> collectionBuilder_; + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return Whether the collection field is set. + */ + public boolean hasCollection() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + * @return The collection. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection getCollection() { + if (collectionBuilder_ == null) { + return collection_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } else { + return collectionBuilder_.getMessage(); + } + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + collection_ = value; + onChanged(); + } else { + collectionBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder setCollection( + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder builderForValue) { + if (collectionBuilder_ == null) { + collection_ = builderForValue.build(); + onChanged(); + } else { + collectionBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder mergeCollection(com.mysql.cj.x.protobuf.MysqlxCrud.Collection value) { + if (collectionBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + collection_ != null && + collection_ != com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance()) { + collection_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.newBuilder(collection_).mergeFrom(value).buildPartial(); + } else { + collection_ = value; + } + onChanged(); + } else { + collectionBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public Builder clearCollection() { + if (collectionBuilder_ == null) { + collection_ = null; + onChanged(); + } else { + collectionBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder getCollectionBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getCollectionFieldBuilder().getBuilder(); + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder getCollectionOrBuilder() { + if (collectionBuilder_ != null) { + return collectionBuilder_.getMessageOrBuilder(); + } else { + return collection_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Collection.getDefaultInstance() : collection_; + } + } + /** + *
    +       ** name of the VIEW object, which should be deleted 
    +       * 
    + * + * required .Mysqlx.Crud.Collection collection = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder> + getCollectionFieldBuilder() { + if (collectionBuilder_ == null) { + collectionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Collection, com.mysql.cj.x.protobuf.MysqlxCrud.Collection.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.CollectionOrBuilder>( + getCollection(), + getParentForChildren(), + isClean()); + collection_ = null; + } + return collectionBuilder_; + } + + private boolean ifExists_ ; + /** + *
    +       ** if true then suppress error when deleted view does not exists 
    +       * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return Whether the ifExists field is set. + */ + @java.lang.Override + public boolean hasIfExists() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** if true then suppress error when deleted view does not exists 
    +       * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return The ifExists. + */ + @java.lang.Override + public boolean getIfExists() { + return ifExists_; + } + /** + *
    +       ** if true then suppress error when deleted view does not exists 
    +       * 
    + * + * optional bool if_exists = 2 [default = false]; + * @param value The ifExists to set. + * @return This builder for chaining. + */ + public Builder setIfExists(boolean value) { + bitField0_ |= 0x00000002; + ifExists_ = value; + onChanged(); + return this; + } + /** + *
    +       ** if true then suppress error when deleted view does not exists 
    +       * 
    + * + * optional bool if_exists = 2 [default = false]; + * @return This builder for chaining. + */ + public Builder clearIfExists() { + bitField0_ = (bitField0_ & ~0x00000002); + ifExists_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Crud.DropView) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Crud.DropView) + private static final com.mysql.cj.x.protobuf.MysqlxCrud.DropView DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCrud.DropView(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCrud.DropView getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public DropView parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DropView(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DropView getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Column_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Column_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Projection_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Projection_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Collection_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Collection_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Limit_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Limit_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_LimitExpr_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_LimitExpr_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Order_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Order_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_UpdateOperation_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_UpdateOperation_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Find_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Find_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Insert_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Insert_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Insert_TypedRow_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Update_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Update_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_Delete_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_Delete_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_CreateView_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_CreateView_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_ModifyView_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_ModifyView_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Crud_DropView_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Crud_DropView_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\021mysqlx_crud.proto\022\013Mysqlx.Crud\032\014mysqlx" + + ".proto\032\021mysqlx_expr.proto\032\026mysqlx_dataty" + + "pes.proto\"[\n\006Column\022\014\n\004name\030\001 \001(\t\022\r\n\005ali" + + "as\030\002 \001(\t\0224\n\rdocument_path\030\003 \003(\0132\035.Mysqlx" + + ".Expr.DocumentPathItem\">\n\nProjection\022!\n\006" + + "source\030\001 \002(\0132\021.Mysqlx.Expr.Expr\022\r\n\005alias" + + "\030\002 \001(\t\"*\n\nCollection\022\014\n\004name\030\001 \002(\t\022\016\n\006sc" + + "hema\030\002 \001(\t\"*\n\005Limit\022\021\n\trow_count\030\001 \002(\004\022\016" + + "\n\006offset\030\002 \001(\004\"T\n\tLimitExpr\022$\n\trow_count" + + "\030\001 \002(\0132\021.Mysqlx.Expr.Expr\022!\n\006offset\030\002 \001(" + + "\0132\021.Mysqlx.Expr.Expr\"~\n\005Order\022\037\n\004expr\030\001 " + + "\002(\0132\021.Mysqlx.Expr.Expr\0224\n\tdirection\030\002 \001(" + + "\0162\034.Mysqlx.Crud.Order.Direction:\003ASC\"\036\n\t" + + "Direction\022\007\n\003ASC\020\001\022\010\n\004DESC\020\002\"\254\002\n\017UpdateO" + + "peration\022-\n\006source\030\001 \002(\0132\035.Mysqlx.Expr.C" + + "olumnIdentifier\022:\n\toperation\030\002 \002(\0162\'.Mys" + + "qlx.Crud.UpdateOperation.UpdateType\022 \n\005v" + + "alue\030\003 \001(\0132\021.Mysqlx.Expr.Expr\"\213\001\n\nUpdate" + + "Type\022\007\n\003SET\020\001\022\017\n\013ITEM_REMOVE\020\002\022\014\n\010ITEM_S" + + "ET\020\003\022\020\n\014ITEM_REPLACE\020\004\022\016\n\nITEM_MERGE\020\005\022\020" + + "\n\014ARRAY_INSERT\020\006\022\020\n\014ARRAY_APPEND\020\007\022\017\n\013ME" + + "RGE_PATCH\020\010\"\352\004\n\004Find\022+\n\ncollection\030\002 \002(\013" + + "2\027.Mysqlx.Crud.Collection\022*\n\ndata_model\030" + + "\003 \001(\0162\026.Mysqlx.Crud.DataModel\022+\n\nproject" + + "ion\030\004 \003(\0132\027.Mysqlx.Crud.Projection\022&\n\004ar" + + "gs\030\013 \003(\0132\030.Mysqlx.Datatypes.Scalar\022#\n\010cr" + + "iteria\030\005 \001(\0132\021.Mysqlx.Expr.Expr\022!\n\005limit" + + "\030\006 \001(\0132\022.Mysqlx.Crud.Limit\022!\n\005order\030\007 \003(" + + "\0132\022.Mysqlx.Crud.Order\022#\n\010grouping\030\010 \003(\0132" + + "\021.Mysqlx.Expr.Expr\022,\n\021grouping_criteria\030" + + "\t \001(\0132\021.Mysqlx.Expr.Expr\022*\n\007locking\030\014 \001(" + + "\0162\031.Mysqlx.Crud.Find.RowLock\0229\n\017locking_" + + "options\030\r \001(\0162 .Mysqlx.Crud.Find.RowLock" + + "Options\022*\n\nlimit_expr\030\016 \001(\0132\026.Mysqlx.Cru" + + "d.LimitExpr\".\n\007RowLock\022\017\n\013SHARED_LOCK\020\001\022" + + "\022\n\016EXCLUSIVE_LOCK\020\002\"-\n\016RowLockOptions\022\n\n" + + "\006NOWAIT\020\001\022\017\n\013SKIP_LOCKED\020\002:\004\210\3520\021\"\250\002\n\006Ins" + + "ert\022+\n\ncollection\030\001 \002(\0132\027.Mysqlx.Crud.Co" + + "llection\022*\n\ndata_model\030\002 \001(\0162\026.Mysqlx.Cr" + + "ud.DataModel\022\'\n\nprojection\030\003 \003(\0132\023.Mysql" + + "x.Crud.Column\022)\n\003row\030\004 \003(\0132\034.Mysqlx.Crud" + + ".Insert.TypedRow\022&\n\004args\030\005 \003(\0132\030.Mysqlx." + + "Datatypes.Scalar\022\025\n\006upsert\030\006 \001(\010:\005false\032" + + ",\n\010TypedRow\022 \n\005field\030\001 \003(\0132\021.Mysqlx.Expr" + + ".Expr:\004\210\3520\022\"\327\002\n\006Update\022+\n\ncollection\030\002 \002" + + "(\0132\027.Mysqlx.Crud.Collection\022*\n\ndata_mode" + + "l\030\003 \001(\0162\026.Mysqlx.Crud.DataModel\022#\n\010crite" + + "ria\030\004 \001(\0132\021.Mysqlx.Expr.Expr\022!\n\005limit\030\005 " + + "\001(\0132\022.Mysqlx.Crud.Limit\022!\n\005order\030\006 \003(\0132\022" + + ".Mysqlx.Crud.Order\022/\n\toperation\030\007 \003(\0132\034." + + "Mysqlx.Crud.UpdateOperation\022&\n\004args\030\010 \003(" + + "\0132\030.Mysqlx.Datatypes.Scalar\022*\n\nlimit_exp" + + "r\030\t \001(\0132\026.Mysqlx.Crud.LimitExpr:\004\210\3520\023\"\246\002" + + "\n\006Delete\022+\n\ncollection\030\001 \002(\0132\027.Mysqlx.Cr" + + "ud.Collection\022*\n\ndata_model\030\002 \001(\0162\026.Mysq" + + "lx.Crud.DataModel\022#\n\010criteria\030\003 \001(\0132\021.My" + + "sqlx.Expr.Expr\022!\n\005limit\030\004 \001(\0132\022.Mysqlx.C" + + "rud.Limit\022!\n\005order\030\005 \003(\0132\022.Mysqlx.Crud.O" + + "rder\022&\n\004args\030\006 \003(\0132\030.Mysqlx.Datatypes.Sc" + + "alar\022*\n\nlimit_expr\030\007 \001(\0132\026.Mysqlx.Crud.L" + + "imitExpr:\004\210\3520\024\"\302\002\n\nCreateView\022+\n\ncollect" + + "ion\030\001 \002(\0132\027.Mysqlx.Crud.Collection\022\017\n\007de" + + "finer\030\002 \001(\t\0228\n\talgorithm\030\003 \001(\0162\032.Mysqlx." + + "Crud.ViewAlgorithm:\tUNDEFINED\0227\n\010securit" + + "y\030\004 \001(\0162\034.Mysqlx.Crud.ViewSqlSecurity:\007D" + + "EFINER\022+\n\005check\030\005 \001(\0162\034.Mysqlx.Crud.View" + + "CheckOption\022\016\n\006column\030\006 \003(\t\022\037\n\004stmt\030\007 \002(" + + "\0132\021.Mysqlx.Crud.Find\022\037\n\020replace_existing" + + "\030\010 \001(\010:\005false:\004\210\3520\036\"\215\002\n\nModifyView\022+\n\nco" + + "llection\030\001 \002(\0132\027.Mysqlx.Crud.Collection\022" + + "\017\n\007definer\030\002 \001(\t\022-\n\talgorithm\030\003 \001(\0162\032.My" + + "sqlx.Crud.ViewAlgorithm\022.\n\010security\030\004 \001(" + + "\0162\034.Mysqlx.Crud.ViewSqlSecurity\022+\n\005check" + + "\030\005 \001(\0162\034.Mysqlx.Crud.ViewCheckOption\022\016\n\006" + + "column\030\006 \003(\t\022\037\n\004stmt\030\007 \001(\0132\021.Mysqlx.Crud" + + ".Find:\004\210\3520\037\"W\n\010DropView\022+\n\ncollection\030\001 " + + "\002(\0132\027.Mysqlx.Crud.Collection\022\030\n\tif_exist" + + "s\030\002 \001(\010:\005false:\004\210\3520 *$\n\tDataModel\022\014\n\010DOC" + + "UMENT\020\001\022\t\n\005TABLE\020\002*8\n\rViewAlgorithm\022\r\n\tU" + + "NDEFINED\020\001\022\t\n\005MERGE\020\002\022\r\n\tTEMPTABLE\020\003*+\n\017" + + "ViewSqlSecurity\022\013\n\007INVOKER\020\001\022\013\n\007DEFINER\020" + + "\002**\n\017ViewCheckOption\022\t\n\005LOCAL\020\001\022\014\n\010CASCA" + + "DED\020\002B\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxExpr.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + }); + internal_static_Mysqlx_Crud_Column_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Crud_Column_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Column_descriptor, + new java.lang.String[] { "Name", "Alias", "DocumentPath", }); + internal_static_Mysqlx_Crud_Projection_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Crud_Projection_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Projection_descriptor, + new java.lang.String[] { "Source", "Alias", }); + internal_static_Mysqlx_Crud_Collection_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Crud_Collection_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Collection_descriptor, + new java.lang.String[] { "Name", "Schema", }); + internal_static_Mysqlx_Crud_Limit_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Crud_Limit_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Limit_descriptor, + new java.lang.String[] { "RowCount", "Offset", }); + internal_static_Mysqlx_Crud_LimitExpr_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Crud_LimitExpr_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_LimitExpr_descriptor, + new java.lang.String[] { "RowCount", "Offset", }); + internal_static_Mysqlx_Crud_Order_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_Mysqlx_Crud_Order_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Order_descriptor, + new java.lang.String[] { "Expr", "Direction", }); + internal_static_Mysqlx_Crud_UpdateOperation_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_Mysqlx_Crud_UpdateOperation_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_UpdateOperation_descriptor, + new java.lang.String[] { "Source", "Operation", "Value", }); + internal_static_Mysqlx_Crud_Find_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_Mysqlx_Crud_Find_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Find_descriptor, + new java.lang.String[] { "Collection", "DataModel", "Projection", "Args", "Criteria", "Limit", "Order", "Grouping", "GroupingCriteria", "Locking", "LockingOptions", "LimitExpr", }); + internal_static_Mysqlx_Crud_Insert_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_Mysqlx_Crud_Insert_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Insert_descriptor, + new java.lang.String[] { "Collection", "DataModel", "Projection", "Row", "Args", "Upsert", }); + internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor = + internal_static_Mysqlx_Crud_Insert_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Crud_Insert_TypedRow_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Insert_TypedRow_descriptor, + new java.lang.String[] { "Field", }); + internal_static_Mysqlx_Crud_Update_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_Mysqlx_Crud_Update_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Update_descriptor, + new java.lang.String[] { "Collection", "DataModel", "Criteria", "Limit", "Order", "Operation", "Args", "LimitExpr", }); + internal_static_Mysqlx_Crud_Delete_descriptor = + getDescriptor().getMessageTypes().get(10); + internal_static_Mysqlx_Crud_Delete_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_Delete_descriptor, + new java.lang.String[] { "Collection", "DataModel", "Criteria", "Limit", "Order", "Args", "LimitExpr", }); + internal_static_Mysqlx_Crud_CreateView_descriptor = + getDescriptor().getMessageTypes().get(11); + internal_static_Mysqlx_Crud_CreateView_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_CreateView_descriptor, + new java.lang.String[] { "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt", "ReplaceExisting", }); + internal_static_Mysqlx_Crud_ModifyView_descriptor = + getDescriptor().getMessageTypes().get(12); + internal_static_Mysqlx_Crud_ModifyView_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_ModifyView_descriptor, + new java.lang.String[] { "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt", }); + internal_static_Mysqlx_Crud_DropView_descriptor = + getDescriptor().getMessageTypes().get(13); + internal_static_Mysqlx_Crud_DropView_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Crud_DropView_descriptor, + new java.lang.String[] { "Collection", "IfExists", }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxExpr.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCursor.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCursor.java new file mode 100644 index 0000000..9699a42 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxCursor.java @@ -0,0 +1,3301 @@ +/* + * Copyright (c) 2019, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_cursor.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxCursor { + private MysqlxCursor() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface OpenOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Cursor.Open) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned cursor ID; the ID is going to represent
    +     *the new cursor and assigned to it the statement 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + boolean hasCursorId(); + /** + *
    +     ** client-side assigned cursor ID; the ID is going to represent
    +     *the new cursor and assigned to it the statement 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + int getCursorId(); + + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return Whether the stmt field is set. + */ + boolean hasStmt(); + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return The stmt. + */ + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getStmt(); + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder getStmtOrBuilder(); + + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + boolean hasFetchRows(); + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + long getFetchRows(); + } + /** + *
    +   **
    +   *Open a cursor
    +   *@startuml
    +   *client -> server: Open
    +   *alt Success
    +   *... none or partial Resultsets or full Resultsets ...
    +   *client <- server: StmtExecuteOk
    +   *else Failure
    +   *client <- server: Error
    +   *end alt
    +   *@enduml
    +   *@returns @ref Mysqlx::Ok
    +   * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Open} + */ + public static final class Open extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Cursor.Open) + OpenOrBuilder { + private static final long serialVersionUID = 0L; + // Use Open.newBuilder() to construct. + private Open(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Open() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Open(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Open( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + cursorId_ = input.readUInt32(); + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = stmt_.toBuilder(); + } + stmt_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(stmt_); + stmt_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 40: { + bitField0_ |= 0x00000004; + fetchRows_ = input.readUInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Open.class, com.mysql.cj.x.protobuf.MysqlxCursor.Open.Builder.class); + } + + public interface OneOfMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Cursor.Open.OneOfMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type getType(); + + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return Whether the prepareExecute field is set. + */ + boolean hasPrepareExecute(); + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return The prepareExecute. + */ + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getPrepareExecute(); + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder getPrepareExecuteOrBuilder(); + } + /** + * Protobuf type {@code Mysqlx.Cursor.Open.OneOfMessage} + */ + public static final class OneOfMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Cursor.Open.OneOfMessage) + OneOfMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use OneOfMessage.newBuilder() to construct. + private OneOfMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private OneOfMessage() { + type_ = 0; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new OneOfMessage(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private OneOfMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type value = com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = prepareExecute_.toBuilder(); + } + prepareExecute_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(prepareExecute_); + prepareExecute_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_OneOfMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.class, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Cursor.Open.OneOfMessage.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * PREPARE_EXECUTE = 0; + */ + PREPARE_EXECUTE(0), + ; + + /** + * PREPARE_EXECUTE = 0; + */ + public static final int PREPARE_EXECUTE_VALUE = 0; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 0: return PREPARE_EXECUTE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Cursor.Open.OneOfMessage.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type result = com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type.PREPARE_EXECUTE : result; + } + + public static final int PREPARE_EXECUTE_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxPrepare.Execute prepareExecute_; + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return Whether the prepareExecute field is set. + */ + @java.lang.Override + public boolean hasPrepareExecute() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return The prepareExecute. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getPrepareExecute() { + return prepareExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance() : prepareExecute_; + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder getPrepareExecuteOrBuilder() { + return prepareExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance() : prepareExecute_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + if (hasPrepareExecute()) { + if (!getPrepareExecute().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getPrepareExecute()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getPrepareExecute()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage other = (com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasPrepareExecute() != other.hasPrepareExecute()) return false; + if (hasPrepareExecute()) { + if (!getPrepareExecute() + .equals(other.getPrepareExecute())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasPrepareExecute()) { + hash = (37 * hash) + PREPARE_EXECUTE_FIELD_NUMBER; + hash = (53 * hash) + getPrepareExecute().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Cursor.Open.OneOfMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Cursor.Open.OneOfMessage) + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_OneOfMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.class, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getPrepareExecuteFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (prepareExecuteBuilder_ == null) { + prepareExecute_ = null; + } else { + prepareExecuteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage build() { + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage result = new com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (prepareExecuteBuilder_ == null) { + result.prepareExecute_ = prepareExecute_; + } else { + result.prepareExecute_ = prepareExecuteBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasPrepareExecute()) { + mergePrepareExecute(other.getPrepareExecute()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + if (hasPrepareExecute()) { + if (!getPrepareExecute().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 0; + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type result = com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type.PREPARE_EXECUTE : result; + } + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Cursor.Open.OneOfMessage.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 0; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxPrepare.Execute prepareExecute_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute, com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder> prepareExecuteBuilder_; + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return Whether the prepareExecute field is set. + */ + public boolean hasPrepareExecute() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + * @return The prepareExecute. + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getPrepareExecute() { + if (prepareExecuteBuilder_ == null) { + return prepareExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance() : prepareExecute_; + } else { + return prepareExecuteBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public Builder setPrepareExecute(com.mysql.cj.x.protobuf.MysqlxPrepare.Execute value) { + if (prepareExecuteBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + prepareExecute_ = value; + onChanged(); + } else { + prepareExecuteBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public Builder setPrepareExecute( + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder builderForValue) { + if (prepareExecuteBuilder_ == null) { + prepareExecute_ = builderForValue.build(); + onChanged(); + } else { + prepareExecuteBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public Builder mergePrepareExecute(com.mysql.cj.x.protobuf.MysqlxPrepare.Execute value) { + if (prepareExecuteBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + prepareExecute_ != null && + prepareExecute_ != com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance()) { + prepareExecute_ = + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.newBuilder(prepareExecute_).mergeFrom(value).buildPartial(); + } else { + prepareExecute_ = value; + } + onChanged(); + } else { + prepareExecuteBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public Builder clearPrepareExecute() { + if (prepareExecuteBuilder_ == null) { + prepareExecute_ = null; + onChanged(); + } else { + prepareExecuteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder getPrepareExecuteBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getPrepareExecuteFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder getPrepareExecuteOrBuilder() { + if (prepareExecuteBuilder_ != null) { + return prepareExecuteBuilder_.getMessageOrBuilder(); + } else { + return prepareExecute_ == null ? + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance() : prepareExecute_; + } + } + /** + * optional .Mysqlx.Prepare.Execute prepare_execute = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute, com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder> + getPrepareExecuteFieldBuilder() { + if (prepareExecuteBuilder_ == null) { + prepareExecuteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute, com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder>( + getPrepareExecute(), + getParentForChildren(), + isClean()); + prepareExecute_ = null; + } + return prepareExecuteBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Cursor.Open.OneOfMessage) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Cursor.Open.OneOfMessage) + private static final com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public OneOfMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new OneOfMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int CURSOR_ID_FIELD_NUMBER = 1; + private int cursorId_; + /** + *
    +     ** client-side assigned cursor ID; the ID is going to represent
    +     *the new cursor and assigned to it the statement 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned cursor ID; the ID is going to represent
    +     *the new cursor and assigned to it the statement 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + + public static final int STMT_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage stmt_; + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return The stmt. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getStmt() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance() : stmt_; + } + /** + *
    +     ** statement for which the resultset is going to be iterated through by the cursor 
    +     * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder getStmtOrBuilder() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance() : stmt_; + } + + public static final int FETCH_ROWS_FIELD_NUMBER = 5; + private long fetchRows_; + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + @java.lang.Override + public boolean hasFetchRows() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + @java.lang.Override + public long getFetchRows() { + return fetchRows_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCursorId()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasStmt()) { + memoizedIsInitialized = 0; + return false; + } + if (!getStmt().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, cursorId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(4, getStmt()); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeUInt64(5, fetchRows_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, cursorId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getStmt()); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(5, fetchRows_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Open)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCursor.Open other = (com.mysql.cj.x.protobuf.MysqlxCursor.Open) obj; + + if (hasCursorId() != other.hasCursorId()) return false; + if (hasCursorId()) { + if (getCursorId() + != other.getCursorId()) return false; + } + if (hasStmt() != other.hasStmt()) return false; + if (hasStmt()) { + if (!getStmt() + .equals(other.getStmt())) return false; + } + if (hasFetchRows() != other.hasFetchRows()) return false; + if (hasFetchRows()) { + if (getFetchRows() + != other.getFetchRows()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCursorId()) { + hash = (37 * hash) + CURSOR_ID_FIELD_NUMBER; + hash = (53 * hash) + getCursorId(); + } + if (hasStmt()) { + hash = (37 * hash) + STMT_FIELD_NUMBER; + hash = (53 * hash) + getStmt().hashCode(); + } + if (hasFetchRows()) { + hash = (37 * hash) + FETCH_ROWS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getFetchRows()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCursor.Open prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Open a cursor
    +     *@startuml
    +     *client -> server: Open
    +     *alt Success
    +     *... none or partial Resultsets or full Resultsets ...
    +     *client <- server: StmtExecuteOk
    +     *else Failure
    +     *client <- server: Error
    +     *end alt
    +     *@enduml
    +     *@returns @ref Mysqlx::Ok
    +     * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Open} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Cursor.Open) + com.mysql.cj.x.protobuf.MysqlxCursor.OpenOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Open.class, com.mysql.cj.x.protobuf.MysqlxCursor.Open.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCursor.Open.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getStmtFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + cursorId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (stmtBuilder_ == null) { + stmt_ = null; + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + fetchRows_ = 0L; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Open_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.Open.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open build() { + com.mysql.cj.x.protobuf.MysqlxCursor.Open result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCursor.Open result = new com.mysql.cj.x.protobuf.MysqlxCursor.Open(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.cursorId_ = cursorId_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + if (stmtBuilder_ == null) { + result.stmt_ = stmt_; + } else { + result.stmt_ = stmtBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.fetchRows_ = fetchRows_; + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Open) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCursor.Open)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCursor.Open other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCursor.Open.getDefaultInstance()) return this; + if (other.hasCursorId()) { + setCursorId(other.getCursorId()); + } + if (other.hasStmt()) { + mergeStmt(other.getStmt()); + } + if (other.hasFetchRows()) { + setFetchRows(other.getFetchRows()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCursorId()) { + return false; + } + if (!hasStmt()) { + return false; + } + if (!getStmt().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCursor.Open parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCursor.Open) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int cursorId_ ; + /** + *
    +       ** client-side assigned cursor ID; the ID is going to represent
    +       *the new cursor and assigned to it the statement 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned cursor ID; the ID is going to represent
    +       *the new cursor and assigned to it the statement 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + /** + *
    +       ** client-side assigned cursor ID; the ID is going to represent
    +       *the new cursor and assigned to it the statement 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @param value The cursorId to set. + * @return This builder for chaining. + */ + public Builder setCursorId(int value) { + bitField0_ |= 0x00000001; + cursorId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned cursor ID; the ID is going to represent
    +       *the new cursor and assigned to it the statement 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return This builder for chaining. + */ + public Builder clearCursorId() { + bitField0_ = (bitField0_ & ~0x00000001); + cursorId_ = 0; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage stmt_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder> stmtBuilder_; + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return Whether the stmt field is set. + */ + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + * @return The stmt. + */ + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage getStmt() { + if (stmtBuilder_ == null) { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance() : stmt_; + } else { + return stmtBuilder_.getMessage(); + } + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public Builder setStmt(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage value) { + if (stmtBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + stmt_ = value; + onChanged(); + } else { + stmtBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public Builder setStmt( + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder builderForValue) { + if (stmtBuilder_ == null) { + stmt_ = builderForValue.build(); + onChanged(); + } else { + stmtBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public Builder mergeStmt(com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage value) { + if (stmtBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + stmt_ != null && + stmt_ != com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance()) { + stmt_ = + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.newBuilder(stmt_).mergeFrom(value).buildPartial(); + } else { + stmt_ = value; + } + onChanged(); + } else { + stmtBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public Builder clearStmt() { + if (stmtBuilder_ == null) { + stmt_ = null; + onChanged(); + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder getStmtBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getStmtFieldBuilder().getBuilder(); + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder getStmtOrBuilder() { + if (stmtBuilder_ != null) { + return stmtBuilder_.getMessageOrBuilder(); + } else { + return stmt_ == null ? + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.getDefaultInstance() : stmt_; + } + } + /** + *
    +       ** statement for which the resultset is going to be iterated through by the cursor 
    +       * 
    + * + * required .Mysqlx.Cursor.Open.OneOfMessage stmt = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder> + getStmtFieldBuilder() { + if (stmtBuilder_ == null) { + stmtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxCursor.Open.OneOfMessageOrBuilder>( + getStmt(), + getParentForChildren(), + isClean()); + stmt_ = null; + } + return stmtBuilder_; + } + + private long fetchRows_ ; + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + @java.lang.Override + public boolean hasFetchRows() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + @java.lang.Override + public long getFetchRows() { + return fetchRows_; + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @param value The fetchRows to set. + * @return This builder for chaining. + */ + public Builder setFetchRows(long value) { + bitField0_ |= 0x00000004; + fetchRows_ = value; + onChanged(); + return this; + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return This builder for chaining. + */ + public Builder clearFetchRows() { + bitField0_ = (bitField0_ & ~0x00000004); + fetchRows_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Cursor.Open) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Cursor.Open) + private static final com.mysql.cj.x.protobuf.MysqlxCursor.Open DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCursor.Open(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Open getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Open parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Open(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Open getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FetchOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Cursor.Fetch) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned cursor ID; must be already open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + boolean hasCursorId(); + /** + *
    +     ** client-side assigned cursor ID; must be already open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + int getCursorId(); + + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + boolean hasFetchRows(); + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + long getFetchRows(); + } + /** + *
    +   **
    +   *Fetch next portion of data from a cursor
    +   *@startuml
    +   *client -> server: Fetch
    +   *alt Success
    +   *... none or partial Resultsets or full Resultsets ...
    +   *client <- server: StmtExecuteOk
    +   *else
    +   *client <- server: Error
    +   *end
    +   *@enduml
    +   * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Fetch} + */ + public static final class Fetch extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Cursor.Fetch) + FetchOrBuilder { + private static final long serialVersionUID = 0L; + // Use Fetch.newBuilder() to construct. + private Fetch(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Fetch() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Fetch(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Fetch( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + cursorId_ = input.readUInt32(); + break; + } + case 40: { + bitField0_ |= 0x00000002; + fetchRows_ = input.readUInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Fetch_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Fetch_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.class, com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.Builder.class); + } + + private int bitField0_; + public static final int CURSOR_ID_FIELD_NUMBER = 1; + private int cursorId_; + /** + *
    +     ** client-side assigned cursor ID; must be already open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned cursor ID; must be already open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + + public static final int FETCH_ROWS_FIELD_NUMBER = 5; + private long fetchRows_; + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + @java.lang.Override + public boolean hasFetchRows() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** number of rows that should be retrieved from sequential cursor 
    +     * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + @java.lang.Override + public long getFetchRows() { + return fetchRows_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCursorId()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, cursorId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt64(5, fetchRows_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, cursorId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(5, fetchRows_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Fetch)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch other = (com.mysql.cj.x.protobuf.MysqlxCursor.Fetch) obj; + + if (hasCursorId() != other.hasCursorId()) return false; + if (hasCursorId()) { + if (getCursorId() + != other.getCursorId()) return false; + } + if (hasFetchRows() != other.hasFetchRows()) return false; + if (hasFetchRows()) { + if (getFetchRows() + != other.getFetchRows()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCursorId()) { + hash = (37 * hash) + CURSOR_ID_FIELD_NUMBER; + hash = (53 * hash) + getCursorId(); + } + if (hasFetchRows()) { + hash = (37 * hash) + FETCH_ROWS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getFetchRows()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCursor.Fetch prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Fetch next portion of data from a cursor
    +     *@startuml
    +     *client -> server: Fetch
    +     *alt Success
    +     *... none or partial Resultsets or full Resultsets ...
    +     *client <- server: StmtExecuteOk
    +     *else
    +     *client <- server: Error
    +     *end
    +     *@enduml
    +     * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Fetch} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Cursor.Fetch) + com.mysql.cj.x.protobuf.MysqlxCursor.FetchOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Fetch_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Fetch_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.class, com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + cursorId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + fetchRows_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Fetch_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Fetch getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Fetch build() { + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Fetch buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch result = new com.mysql.cj.x.protobuf.MysqlxCursor.Fetch(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.cursorId_ = cursorId_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.fetchRows_ = fetchRows_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Fetch) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCursor.Fetch)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCursor.Fetch other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCursor.Fetch.getDefaultInstance()) return this; + if (other.hasCursorId()) { + setCursorId(other.getCursorId()); + } + if (other.hasFetchRows()) { + setFetchRows(other.getFetchRows()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCursorId()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCursor.Fetch parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCursor.Fetch) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int cursorId_ ; + /** + *
    +       ** client-side assigned cursor ID; must be already open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned cursor ID; must be already open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + /** + *
    +       ** client-side assigned cursor ID; must be already open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @param value The cursorId to set. + * @return This builder for chaining. + */ + public Builder setCursorId(int value) { + bitField0_ |= 0x00000001; + cursorId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned cursor ID; must be already open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return This builder for chaining. + */ + public Builder clearCursorId() { + bitField0_ = (bitField0_ & ~0x00000001); + cursorId_ = 0; + onChanged(); + return this; + } + + private long fetchRows_ ; + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return Whether the fetchRows field is set. + */ + @java.lang.Override + public boolean hasFetchRows() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return The fetchRows. + */ + @java.lang.Override + public long getFetchRows() { + return fetchRows_; + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @param value The fetchRows to set. + * @return This builder for chaining. + */ + public Builder setFetchRows(long value) { + bitField0_ |= 0x00000002; + fetchRows_ = value; + onChanged(); + return this; + } + /** + *
    +       ** number of rows that should be retrieved from sequential cursor 
    +       * 
    + * + * optional uint64 fetch_rows = 5; + * @return This builder for chaining. + */ + public Builder clearFetchRows() { + bitField0_ = (bitField0_ & ~0x00000002); + fetchRows_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Cursor.Fetch) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Cursor.Fetch) + private static final com.mysql.cj.x.protobuf.MysqlxCursor.Fetch DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCursor.Fetch(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Fetch getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Fetch parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Fetch(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Fetch getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CloseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Cursor.Close) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned cursor ID; must be allocated/open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + boolean hasCursorId(); + /** + *
    +     ** client-side assigned cursor ID; must be allocated/open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + int getCursorId(); + } + /** + *
    +   **
    +   *Close cursor
    +   *@startuml
    +   *client -> server: Close
    +   *alt Success
    +   *client <- server: Ok
    +   *else Failure
    +   *client <- server: Error
    +   *end
    +   *@enduml
    +   *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Close} + */ + public static final class Close extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Cursor.Close) + CloseOrBuilder { + private static final long serialVersionUID = 0L; + // Use Close.newBuilder() to construct. + private Close(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Close() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Close(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Close( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + cursorId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Close.class, com.mysql.cj.x.protobuf.MysqlxCursor.Close.Builder.class); + } + + private int bitField0_; + public static final int CURSOR_ID_FIELD_NUMBER = 1; + private int cursorId_; + /** + *
    +     ** client-side assigned cursor ID; must be allocated/open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned cursor ID; must be allocated/open 
    +     * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCursorId()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, cursorId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, cursorId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Close)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxCursor.Close other = (com.mysql.cj.x.protobuf.MysqlxCursor.Close) obj; + + if (hasCursorId() != other.hasCursorId()) return false; + if (hasCursorId()) { + if (getCursorId() + != other.getCursorId()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasCursorId()) { + hash = (37 * hash) + CURSOR_ID_FIELD_NUMBER; + hash = (53 * hash) + getCursorId(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxCursor.Close prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Close cursor
    +     *@startuml
    +     *client -> server: Close
    +     *alt Success
    +     *client <- server: Ok
    +     *else Failure
    +     *client <- server: Error
    +     *end
    +     *@enduml
    +     *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Cursor.Close} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Cursor.Close) + com.mysql.cj.x.protobuf.MysqlxCursor.CloseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxCursor.Close.class, com.mysql.cj.x.protobuf.MysqlxCursor.Close.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxCursor.Close.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + cursorId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.internal_static_Mysqlx_Cursor_Close_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Close getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxCursor.Close.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Close build() { + com.mysql.cj.x.protobuf.MysqlxCursor.Close result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Close buildPartial() { + com.mysql.cj.x.protobuf.MysqlxCursor.Close result = new com.mysql.cj.x.protobuf.MysqlxCursor.Close(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.cursorId_ = cursorId_; + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxCursor.Close) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxCursor.Close)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxCursor.Close other) { + if (other == com.mysql.cj.x.protobuf.MysqlxCursor.Close.getDefaultInstance()) return this; + if (other.hasCursorId()) { + setCursorId(other.getCursorId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCursorId()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxCursor.Close parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxCursor.Close) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int cursorId_ ; + /** + *
    +       ** client-side assigned cursor ID; must be allocated/open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return Whether the cursorId field is set. + */ + @java.lang.Override + public boolean hasCursorId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned cursor ID; must be allocated/open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return The cursorId. + */ + @java.lang.Override + public int getCursorId() { + return cursorId_; + } + /** + *
    +       ** client-side assigned cursor ID; must be allocated/open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @param value The cursorId to set. + * @return This builder for chaining. + */ + public Builder setCursorId(int value) { + bitField0_ |= 0x00000001; + cursorId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned cursor ID; must be allocated/open 
    +       * 
    + * + * required uint32 cursor_id = 1; + * @return This builder for chaining. + */ + public Builder clearCursorId() { + bitField0_ = (bitField0_ & ~0x00000001); + cursorId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Cursor.Close) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Cursor.Close) + private static final com.mysql.cj.x.protobuf.MysqlxCursor.Close DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxCursor.Close(); + } + + public static com.mysql.cj.x.protobuf.MysqlxCursor.Close getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Close parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Close(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCursor.Close getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Cursor_Open_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Cursor_Open_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Cursor_Open_OneOfMessage_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Cursor_Fetch_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Cursor_Fetch_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Cursor_Close_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Cursor_Close_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\023mysqlx_cursor.proto\022\rMysqlx.Cursor\032\014my" + + "sqlx.proto\032\024mysqlx_prepare.proto\"\370\001\n\004Ope" + + "n\022\021\n\tcursor_id\030\001 \002(\r\022.\n\004stmt\030\004 \002(\0132 .Mys" + + "qlx.Cursor.Open.OneOfMessage\022\022\n\nfetch_ro" + + "ws\030\005 \001(\004\032\222\001\n\014OneOfMessage\0223\n\004type\030\001 \002(\0162" + + "%.Mysqlx.Cursor.Open.OneOfMessage.Type\0220" + + "\n\017prepare_execute\030\002 \001(\0132\027.Mysqlx.Prepare" + + ".Execute\"\033\n\004Type\022\023\n\017PREPARE_EXECUTE\020\000:\004\210" + + "\3520+\"4\n\005Fetch\022\021\n\tcursor_id\030\001 \002(\r\022\022\n\nfetch" + + "_rows\030\005 \001(\004:\004\210\3520-\" \n\005Close\022\021\n\tcursor_id\030" + + "\001 \002(\r:\004\210\3520,B\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxPrepare.getDescriptor(), + }); + internal_static_Mysqlx_Cursor_Open_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Cursor_Open_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Cursor_Open_descriptor, + new java.lang.String[] { "CursorId", "Stmt", "FetchRows", }); + internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor = + internal_static_Mysqlx_Cursor_Open_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Cursor_Open_OneOfMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Cursor_Open_OneOfMessage_descriptor, + new java.lang.String[] { "Type", "PrepareExecute", }); + internal_static_Mysqlx_Cursor_Fetch_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Cursor_Fetch_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Cursor_Fetch_descriptor, + new java.lang.String[] { "CursorId", "FetchRows", }); + internal_static_Mysqlx_Cursor_Close_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Cursor_Close_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Cursor_Close_descriptor, + new java.lang.String[] { "CursorId", }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxPrepare.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxDatatypes.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxDatatypes.java new file mode 100644 index 0000000..50eabf5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxDatatypes.java @@ -0,0 +1,6923 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_datatypes.proto + +public final class MysqlxDatatypes { + private MysqlxDatatypes() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ScalarOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Scalar) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type getType(); + + /** + * optional sint64 v_signed_int = 2; + * @return Whether the vSignedInt field is set. + */ + boolean hasVSignedInt(); + /** + * optional sint64 v_signed_int = 2; + * @return The vSignedInt. + */ + long getVSignedInt(); + + /** + * optional uint64 v_unsigned_int = 3; + * @return Whether the vUnsignedInt field is set. + */ + boolean hasVUnsignedInt(); + /** + * optional uint64 v_unsigned_int = 3; + * @return The vUnsignedInt. + */ + long getVUnsignedInt(); + + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return Whether the vOctets field is set. + */ + boolean hasVOctets(); + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return The vOctets. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getVOctets(); + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder getVOctetsOrBuilder(); + + /** + * optional double v_double = 6; + * @return Whether the vDouble field is set. + */ + boolean hasVDouble(); + /** + * optional double v_double = 6; + * @return The vDouble. + */ + double getVDouble(); + + /** + * optional float v_float = 7; + * @return Whether the vFloat field is set. + */ + boolean hasVFloat(); + /** + * optional float v_float = 7; + * @return The vFloat. + */ + float getVFloat(); + + /** + * optional bool v_bool = 8; + * @return Whether the vBool field is set. + */ + boolean hasVBool(); + /** + * optional bool v_bool = 8; + * @return The vBool. + */ + boolean getVBool(); + + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return Whether the vString field is set. + */ + boolean hasVString(); + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return The vString. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getVString(); + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder getVStringOrBuilder(); + } + /** + *
    +   * a scalar
    +   * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar} + */ + public static final class Scalar extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Scalar) + ScalarOrBuilder { + private static final long serialVersionUID = 0L; + // Use Scalar.newBuilder() to construct. + private Scalar(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Scalar() { + type_ = 1; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Scalar(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Scalar( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type value = com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 16: { + bitField0_ |= 0x00000002; + vSignedInt_ = input.readSInt64(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + vUnsignedInt_ = input.readUInt64(); + break; + } + case 42: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = vOctets_.toBuilder(); + } + vOctets_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(vOctets_); + vOctets_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 49: { + bitField0_ |= 0x00000010; + vDouble_ = input.readDouble(); + break; + } + case 61: { + bitField0_ |= 0x00000020; + vFloat_ = input.readFloat(); + break; + } + case 64: { + bitField0_ |= 0x00000040; + vBool_ = input.readBool(); + break; + } + case 74: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) != 0)) { + subBuilder = vString_.toBuilder(); + } + vString_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(vString_); + vString_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Datatypes.Scalar.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * V_SINT = 1; + */ + V_SINT(1), + /** + * V_UINT = 2; + */ + V_UINT(2), + /** + * V_NULL = 3; + */ + V_NULL(3), + /** + * V_OCTETS = 4; + */ + V_OCTETS(4), + /** + * V_DOUBLE = 5; + */ + V_DOUBLE(5), + /** + * V_FLOAT = 6; + */ + V_FLOAT(6), + /** + * V_BOOL = 7; + */ + V_BOOL(7), + /** + * V_STRING = 8; + */ + V_STRING(8), + ; + + /** + * V_SINT = 1; + */ + public static final int V_SINT_VALUE = 1; + /** + * V_UINT = 2; + */ + public static final int V_UINT_VALUE = 2; + /** + * V_NULL = 3; + */ + public static final int V_NULL_VALUE = 3; + /** + * V_OCTETS = 4; + */ + public static final int V_OCTETS_VALUE = 4; + /** + * V_DOUBLE = 5; + */ + public static final int V_DOUBLE_VALUE = 5; + /** + * V_FLOAT = 6; + */ + public static final int V_FLOAT_VALUE = 6; + /** + * V_BOOL = 7; + */ + public static final int V_BOOL_VALUE = 7; + /** + * V_STRING = 8; + */ + public static final int V_STRING_VALUE = 8; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return V_SINT; + case 2: return V_UINT; + case 3: return V_NULL; + case 4: return V_OCTETS; + case 5: return V_DOUBLE; + case 6: return V_FLOAT; + case 7: return V_BOOL; + case 8: return V_STRING; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Datatypes.Scalar.Type) + } + + public interface StringOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Scalar.String) + com.google.protobuf.MessageOrBuilder { + + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + * required bytes value = 1; + * @return The value. + */ + com.google.protobuf.ByteString getValue(); + + /** + * optional uint64 collation = 2; + * @return Whether the collation field is set. + */ + boolean hasCollation(); + /** + * optional uint64 collation = 2; + * @return The collation. + */ + long getCollation(); + } + /** + *
    +     ** a string with a charset/collation 
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar.String} + */ + public static final class String extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Scalar.String) + StringOrBuilder { + private static final long serialVersionUID = 0L; + // Use String.newBuilder() to construct. + private String(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private String() { + value_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new String(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private String( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + bitField0_ |= 0x00000001; + value_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + collation_ = input.readUInt64(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_String_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_String_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder.class); + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString value_; + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required bytes value = 1; + * @return The value. + */ + @java.lang.Override + public com.google.protobuf.ByteString getValue() { + return value_; + } + + public static final int COLLATION_FIELD_NUMBER = 2; + private long collation_; + /** + * optional uint64 collation = 2; + * @return Whether the collation field is set. + */ + @java.lang.Override + public boolean hasCollation() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint64 collation = 2; + * @return The collation. + */ + @java.lang.Override + public long getCollation() { + return collation_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasValue()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeBytes(1, value_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt64(2, collation_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, value_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(2, collation_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String) obj; + + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (hasCollation() != other.hasCollation()) return false; + if (hasCollation()) { + if (getCollation() + != other.getCollation()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + if (hasCollation()) { + hash = (37 * hash) + COLLATION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCollation()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +       ** a string with a charset/collation 
    +       * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar.String} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Scalar.String) + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_String_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_String_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + value_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + collation_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_String_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.collation_ = collation_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + if (other.hasCollation()) { + setCollation(other.getCollation()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasValue()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required bytes value = 1; + * @return The value. + */ + @java.lang.Override + public com.google.protobuf.ByteString getValue() { + return value_; + } + /** + * required bytes value = 1; + * @param value The value to set. + * @return This builder for chaining. + */ + public Builder setValue(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * required bytes value = 1; + * @return This builder for chaining. + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + + private long collation_ ; + /** + * optional uint64 collation = 2; + * @return Whether the collation field is set. + */ + @java.lang.Override + public boolean hasCollation() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint64 collation = 2; + * @return The collation. + */ + @java.lang.Override + public long getCollation() { + return collation_; + } + /** + * optional uint64 collation = 2; + * @param value The collation to set. + * @return This builder for chaining. + */ + public Builder setCollation(long value) { + bitField0_ |= 0x00000002; + collation_ = value; + onChanged(); + return this; + } + /** + * optional uint64 collation = 2; + * @return This builder for chaining. + */ + public Builder clearCollation() { + bitField0_ = (bitField0_ & ~0x00000002); + collation_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Scalar.String) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Scalar.String) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public String parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new String(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface OctetsOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Scalar.Octets) + com.google.protobuf.MessageOrBuilder { + + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + * required bytes value = 1; + * @return The value. + */ + com.google.protobuf.ByteString getValue(); + + /** + * optional uint32 content_type = 2; + * @return Whether the contentType field is set. + */ + boolean hasContentType(); + /** + * optional uint32 content_type = 2; + * @return The contentType. + */ + int getContentType(); + } + /** + *
    +     ** an opaque octet sequence, with an optional content_type
    +     *See @ref Mysqlx::Resultset::ContentType_BYTES for list of known values. 
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar.Octets} + */ + public static final class Octets extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Scalar.Octets) + OctetsOrBuilder { + private static final long serialVersionUID = 0L; + // Use Octets.newBuilder() to construct. + private Octets(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Octets() { + value_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Octets(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Octets( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + bitField0_ |= 0x00000001; + value_ = input.readBytes(); + break; + } + case 16: { + bitField0_ |= 0x00000002; + contentType_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_Octets_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder.class); + } + + private int bitField0_; + public static final int VALUE_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString value_; + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required bytes value = 1; + * @return The value. + */ + @java.lang.Override + public com.google.protobuf.ByteString getValue() { + return value_; + } + + public static final int CONTENT_TYPE_FIELD_NUMBER = 2; + private int contentType_; + /** + * optional uint32 content_type = 2; + * @return Whether the contentType field is set. + */ + @java.lang.Override + public boolean hasContentType() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint32 content_type = 2; + * @return The contentType. + */ + @java.lang.Override + public int getContentType() { + return contentType_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasValue()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeBytes(1, value_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt32(2, contentType_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, value_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, contentType_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets) obj; + + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (hasContentType() != other.hasContentType()) return false; + if (hasContentType()) { + if (getContentType() + != other.getContentType()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + if (hasContentType()) { + hash = (37 * hash) + CONTENT_TYPE_FIELD_NUMBER; + hash = (53 * hash) + getContentType(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +       ** an opaque octet sequence, with an optional content_type
    +       *See @ref Mysqlx::Resultset::ContentType_BYTES for list of known values. 
    +       * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar.Octets} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Scalar.Octets) + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_Octets_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + value_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + contentType_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.value_ = value_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.contentType_ = contentType_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance()) return this; + if (other.hasValue()) { + setValue(other.getValue()); + } + if (other.hasContentType()) { + setContentType(other.getContentType()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasValue()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.ByteString value_ = com.google.protobuf.ByteString.EMPTY; + /** + * required bytes value = 1; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required bytes value = 1; + * @return The value. + */ + @java.lang.Override + public com.google.protobuf.ByteString getValue() { + return value_; + } + /** + * required bytes value = 1; + * @param value The value to set. + * @return This builder for chaining. + */ + public Builder setValue(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + value_ = value; + onChanged(); + return this; + } + /** + * required bytes value = 1; + * @return This builder for chaining. + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000001); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + + private int contentType_ ; + /** + * optional uint32 content_type = 2; + * @return Whether the contentType field is set. + */ + @java.lang.Override + public boolean hasContentType() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional uint32 content_type = 2; + * @return The contentType. + */ + @java.lang.Override + public int getContentType() { + return contentType_; + } + /** + * optional uint32 content_type = 2; + * @param value The contentType to set. + * @return This builder for chaining. + */ + public Builder setContentType(int value) { + bitField0_ |= 0x00000002; + contentType_ = value; + onChanged(); + return this; + } + /** + * optional uint32 content_type = 2; + * @return This builder for chaining. + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000002); + contentType_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Scalar.Octets) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Scalar.Octets) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Octets parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Octets(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type result = com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type.V_SINT : result; + } + + public static final int V_SIGNED_INT_FIELD_NUMBER = 2; + private long vSignedInt_; + /** + * optional sint64 v_signed_int = 2; + * @return Whether the vSignedInt field is set. + */ + @java.lang.Override + public boolean hasVSignedInt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional sint64 v_signed_int = 2; + * @return The vSignedInt. + */ + @java.lang.Override + public long getVSignedInt() { + return vSignedInt_; + } + + public static final int V_UNSIGNED_INT_FIELD_NUMBER = 3; + private long vUnsignedInt_; + /** + * optional uint64 v_unsigned_int = 3; + * @return Whether the vUnsignedInt field is set. + */ + @java.lang.Override + public boolean hasVUnsignedInt() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional uint64 v_unsigned_int = 3; + * @return The vUnsignedInt. + */ + @java.lang.Override + public long getVUnsignedInt() { + return vUnsignedInt_; + } + + public static final int V_OCTETS_FIELD_NUMBER = 5; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets vOctets_; + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return Whether the vOctets field is set. + */ + @java.lang.Override + public boolean hasVOctets() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return The vOctets. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getVOctets() { + return vOctets_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance() : vOctets_; + } + /** + *
    +     * 4 is unused, was Null which doesn't have a storage anymore
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder getVOctetsOrBuilder() { + return vOctets_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance() : vOctets_; + } + + public static final int V_DOUBLE_FIELD_NUMBER = 6; + private double vDouble_; + /** + * optional double v_double = 6; + * @return Whether the vDouble field is set. + */ + @java.lang.Override + public boolean hasVDouble() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional double v_double = 6; + * @return The vDouble. + */ + @java.lang.Override + public double getVDouble() { + return vDouble_; + } + + public static final int V_FLOAT_FIELD_NUMBER = 7; + private float vFloat_; + /** + * optional float v_float = 7; + * @return Whether the vFloat field is set. + */ + @java.lang.Override + public boolean hasVFloat() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional float v_float = 7; + * @return The vFloat. + */ + @java.lang.Override + public float getVFloat() { + return vFloat_; + } + + public static final int V_BOOL_FIELD_NUMBER = 8; + private boolean vBool_; + /** + * optional bool v_bool = 8; + * @return Whether the vBool field is set. + */ + @java.lang.Override + public boolean hasVBool() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional bool v_bool = 8; + * @return The vBool. + */ + @java.lang.Override + public boolean getVBool() { + return vBool_; + } + + public static final int V_STRING_FIELD_NUMBER = 9; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String vString_; + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return Whether the vString field is set. + */ + @java.lang.Override + public boolean hasVString() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return The vString. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getVString() { + return vString_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance() : vString_; + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder getVStringOrBuilder() { + return vString_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance() : vString_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + if (hasVOctets()) { + if (!getVOctets().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasVString()) { + if (!getVString().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeSInt64(2, vSignedInt_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeUInt64(3, vUnsignedInt_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(5, getVOctets()); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeDouble(6, vDouble_); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeFloat(7, vFloat_); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeBool(8, vBool_); + } + if (((bitField0_ & 0x00000080) != 0)) { + output.writeMessage(9, getVString()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeSInt64Size(2, vSignedInt_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(3, vUnsignedInt_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getVOctets()); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeDoubleSize(6, vDouble_); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeFloatSize(7, vFloat_); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(8, vBool_); + } + if (((bitField0_ & 0x00000080) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, getVString()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasVSignedInt() != other.hasVSignedInt()) return false; + if (hasVSignedInt()) { + if (getVSignedInt() + != other.getVSignedInt()) return false; + } + if (hasVUnsignedInt() != other.hasVUnsignedInt()) return false; + if (hasVUnsignedInt()) { + if (getVUnsignedInt() + != other.getVUnsignedInt()) return false; + } + if (hasVOctets() != other.hasVOctets()) return false; + if (hasVOctets()) { + if (!getVOctets() + .equals(other.getVOctets())) return false; + } + if (hasVDouble() != other.hasVDouble()) return false; + if (hasVDouble()) { + if (java.lang.Double.doubleToLongBits(getVDouble()) + != java.lang.Double.doubleToLongBits( + other.getVDouble())) return false; + } + if (hasVFloat() != other.hasVFloat()) return false; + if (hasVFloat()) { + if (java.lang.Float.floatToIntBits(getVFloat()) + != java.lang.Float.floatToIntBits( + other.getVFloat())) return false; + } + if (hasVBool() != other.hasVBool()) return false; + if (hasVBool()) { + if (getVBool() + != other.getVBool()) return false; + } + if (hasVString() != other.hasVString()) return false; + if (hasVString()) { + if (!getVString() + .equals(other.getVString())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasVSignedInt()) { + hash = (37 * hash) + V_SIGNED_INT_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getVSignedInt()); + } + if (hasVUnsignedInt()) { + hash = (37 * hash) + V_UNSIGNED_INT_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getVUnsignedInt()); + } + if (hasVOctets()) { + hash = (37 * hash) + V_OCTETS_FIELD_NUMBER; + hash = (53 * hash) + getVOctets().hashCode(); + } + if (hasVDouble()) { + hash = (37 * hash) + V_DOUBLE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + java.lang.Double.doubleToLongBits(getVDouble())); + } + if (hasVFloat()) { + hash = (37 * hash) + V_FLOAT_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits( + getVFloat()); + } + if (hasVBool()) { + hash = (37 * hash) + V_BOOL_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getVBool()); + } + if (hasVString()) { + hash = (37 * hash) + V_STRING_FIELD_NUMBER; + hash = (53 * hash) + getVString().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     * a scalar
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Scalar} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Scalar) + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getVOctetsFieldBuilder(); + getVStringFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + vSignedInt_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + vUnsignedInt_ = 0L; + bitField0_ = (bitField0_ & ~0x00000004); + if (vOctetsBuilder_ == null) { + vOctets_ = null; + } else { + vOctetsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + vDouble_ = 0D; + bitField0_ = (bitField0_ & ~0x00000010); + vFloat_ = 0F; + bitField0_ = (bitField0_ & ~0x00000020); + vBool_ = false; + bitField0_ = (bitField0_ & ~0x00000040); + if (vStringBuilder_ == null) { + vString_ = null; + } else { + vStringBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Scalar_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.vSignedInt_ = vSignedInt_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.vUnsignedInt_ = vUnsignedInt_; + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + if (vOctetsBuilder_ == null) { + result.vOctets_ = vOctets_; + } else { + result.vOctets_ = vOctetsBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.vDouble_ = vDouble_; + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.vFloat_ = vFloat_; + to_bitField0_ |= 0x00000020; + } + if (((from_bitField0_ & 0x00000040) != 0)) { + result.vBool_ = vBool_; + to_bitField0_ |= 0x00000040; + } + if (((from_bitField0_ & 0x00000080) != 0)) { + if (vStringBuilder_ == null) { + result.vString_ = vString_; + } else { + result.vString_ = vStringBuilder_.build(); + } + to_bitField0_ |= 0x00000080; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasVSignedInt()) { + setVSignedInt(other.getVSignedInt()); + } + if (other.hasVUnsignedInt()) { + setVUnsignedInt(other.getVUnsignedInt()); + } + if (other.hasVOctets()) { + mergeVOctets(other.getVOctets()); + } + if (other.hasVDouble()) { + setVDouble(other.getVDouble()); + } + if (other.hasVFloat()) { + setVFloat(other.getVFloat()); + } + if (other.hasVBool()) { + setVBool(other.getVBool()); + } + if (other.hasVString()) { + mergeVString(other.getVString()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + if (hasVOctets()) { + if (!getVOctets().isInitialized()) { + return false; + } + } + if (hasVString()) { + if (!getVString().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 1; + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type result = com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type.V_SINT : result; + } + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Datatypes.Scalar.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + onChanged(); + return this; + } + + private long vSignedInt_ ; + /** + * optional sint64 v_signed_int = 2; + * @return Whether the vSignedInt field is set. + */ + @java.lang.Override + public boolean hasVSignedInt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional sint64 v_signed_int = 2; + * @return The vSignedInt. + */ + @java.lang.Override + public long getVSignedInt() { + return vSignedInt_; + } + /** + * optional sint64 v_signed_int = 2; + * @param value The vSignedInt to set. + * @return This builder for chaining. + */ + public Builder setVSignedInt(long value) { + bitField0_ |= 0x00000002; + vSignedInt_ = value; + onChanged(); + return this; + } + /** + * optional sint64 v_signed_int = 2; + * @return This builder for chaining. + */ + public Builder clearVSignedInt() { + bitField0_ = (bitField0_ & ~0x00000002); + vSignedInt_ = 0L; + onChanged(); + return this; + } + + private long vUnsignedInt_ ; + /** + * optional uint64 v_unsigned_int = 3; + * @return Whether the vUnsignedInt field is set. + */ + @java.lang.Override + public boolean hasVUnsignedInt() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional uint64 v_unsigned_int = 3; + * @return The vUnsignedInt. + */ + @java.lang.Override + public long getVUnsignedInt() { + return vUnsignedInt_; + } + /** + * optional uint64 v_unsigned_int = 3; + * @param value The vUnsignedInt to set. + * @return This builder for chaining. + */ + public Builder setVUnsignedInt(long value) { + bitField0_ |= 0x00000004; + vUnsignedInt_ = value; + onChanged(); + return this; + } + /** + * optional uint64 v_unsigned_int = 3; + * @return This builder for chaining. + */ + public Builder clearVUnsignedInt() { + bitField0_ = (bitField0_ & ~0x00000004); + vUnsignedInt_ = 0L; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets vOctets_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder> vOctetsBuilder_; + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return Whether the vOctets field is set. + */ + public boolean hasVOctets() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + * @return The vOctets. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets getVOctets() { + if (vOctetsBuilder_ == null) { + return vOctets_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance() : vOctets_; + } else { + return vOctetsBuilder_.getMessage(); + } + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public Builder setVOctets(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets value) { + if (vOctetsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + vOctets_ = value; + onChanged(); + } else { + vOctetsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public Builder setVOctets( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder builderForValue) { + if (vOctetsBuilder_ == null) { + vOctets_ = builderForValue.build(); + onChanged(); + } else { + vOctetsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public Builder mergeVOctets(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets value) { + if (vOctetsBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + vOctets_ != null && + vOctets_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance()) { + vOctets_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.newBuilder(vOctets_).mergeFrom(value).buildPartial(); + } else { + vOctets_ = value; + } + onChanged(); + } else { + vOctetsBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public Builder clearVOctets() { + if (vOctetsBuilder_ == null) { + vOctets_ = null; + onChanged(); + } else { + vOctetsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder getVOctetsBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getVOctetsFieldBuilder().getBuilder(); + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder getVOctetsOrBuilder() { + if (vOctetsBuilder_ != null) { + return vOctetsBuilder_.getMessageOrBuilder(); + } else { + return vOctets_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.getDefaultInstance() : vOctets_; + } + } + /** + *
    +       * 4 is unused, was Null which doesn't have a storage anymore
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar.Octets v_octets = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder> + getVOctetsFieldBuilder() { + if (vOctetsBuilder_ == null) { + vOctetsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Octets.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.OctetsOrBuilder>( + getVOctets(), + getParentForChildren(), + isClean()); + vOctets_ = null; + } + return vOctetsBuilder_; + } + + private double vDouble_ ; + /** + * optional double v_double = 6; + * @return Whether the vDouble field is set. + */ + @java.lang.Override + public boolean hasVDouble() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional double v_double = 6; + * @return The vDouble. + */ + @java.lang.Override + public double getVDouble() { + return vDouble_; + } + /** + * optional double v_double = 6; + * @param value The vDouble to set. + * @return This builder for chaining. + */ + public Builder setVDouble(double value) { + bitField0_ |= 0x00000010; + vDouble_ = value; + onChanged(); + return this; + } + /** + * optional double v_double = 6; + * @return This builder for chaining. + */ + public Builder clearVDouble() { + bitField0_ = (bitField0_ & ~0x00000010); + vDouble_ = 0D; + onChanged(); + return this; + } + + private float vFloat_ ; + /** + * optional float v_float = 7; + * @return Whether the vFloat field is set. + */ + @java.lang.Override + public boolean hasVFloat() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional float v_float = 7; + * @return The vFloat. + */ + @java.lang.Override + public float getVFloat() { + return vFloat_; + } + /** + * optional float v_float = 7; + * @param value The vFloat to set. + * @return This builder for chaining. + */ + public Builder setVFloat(float value) { + bitField0_ |= 0x00000020; + vFloat_ = value; + onChanged(); + return this; + } + /** + * optional float v_float = 7; + * @return This builder for chaining. + */ + public Builder clearVFloat() { + bitField0_ = (bitField0_ & ~0x00000020); + vFloat_ = 0F; + onChanged(); + return this; + } + + private boolean vBool_ ; + /** + * optional bool v_bool = 8; + * @return Whether the vBool field is set. + */ + @java.lang.Override + public boolean hasVBool() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional bool v_bool = 8; + * @return The vBool. + */ + @java.lang.Override + public boolean getVBool() { + return vBool_; + } + /** + * optional bool v_bool = 8; + * @param value The vBool to set. + * @return This builder for chaining. + */ + public Builder setVBool(boolean value) { + bitField0_ |= 0x00000040; + vBool_ = value; + onChanged(); + return this; + } + /** + * optional bool v_bool = 8; + * @return This builder for chaining. + */ + public Builder clearVBool() { + bitField0_ = (bitField0_ & ~0x00000040); + vBool_ = false; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String vString_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder> vStringBuilder_; + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return Whether the vString field is set. + */ + public boolean hasVString() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + * @return The vString. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String getVString() { + if (vStringBuilder_ == null) { + return vString_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance() : vString_; + } else { + return vStringBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public Builder setVString(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String value) { + if (vStringBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + vString_ = value; + onChanged(); + } else { + vStringBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public Builder setVString( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder builderForValue) { + if (vStringBuilder_ == null) { + vString_ = builderForValue.build(); + onChanged(); + } else { + vStringBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public Builder mergeVString(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String value) { + if (vStringBuilder_ == null) { + if (((bitField0_ & 0x00000080) != 0) && + vString_ != null && + vString_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance()) { + vString_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.newBuilder(vString_).mergeFrom(value).buildPartial(); + } else { + vString_ = value; + } + onChanged(); + } else { + vStringBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public Builder clearVString() { + if (vStringBuilder_ == null) { + vString_ = null; + onChanged(); + } else { + vStringBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder getVStringBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getVStringFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder getVStringOrBuilder() { + if (vStringBuilder_ != null) { + return vStringBuilder_.getMessageOrBuilder(); + } else { + return vString_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.getDefaultInstance() : vString_; + } + } + /** + * optional .Mysqlx.Datatypes.Scalar.String v_string = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder> + getVStringFieldBuilder() { + if (vStringBuilder_ == null) { + vStringBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.String.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.StringOrBuilder>( + getVString(), + getParentForChildren(), + isClean()); + vString_ = null; + } + return vStringBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Scalar) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Scalar) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Scalar parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Scalar(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ObjectOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Object) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + java.util.List + getFldList(); + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getFld(int index); + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + int getFldCount(); + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + java.util.List + getFldOrBuilderList(); + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index); + } + /** + *
    +   **
    +   *An object
    +   * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Object} + */ + public static final class Object extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Object) + ObjectOrBuilder { + private static final long serialVersionUID = 0L; + // Use Object.newBuilder() to construct. + private Object(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Object() { + fld_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Object(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Object( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + fld_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + fld_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + fld_ = java.util.Collections.unmodifiableList(fld_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder.class); + } + + public interface ObjectFieldOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Object.ObjectField) + com.google.protobuf.MessageOrBuilder { + + /** + * required string key = 1; + * @return Whether the key field is set. + */ + boolean hasKey(); + /** + * required string key = 1; + * @return The key. + */ + java.lang.String getKey(); + /** + * required string key = 1; + * @return The bytes for key. + */ + com.google.protobuf.ByteString + getKeyBytes(); + + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue(); + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder(); + } + /** + * Protobuf type {@code Mysqlx.Datatypes.Object.ObjectField} + */ + public static final class ObjectField extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Object.ObjectField) + ObjectFieldOrBuilder { + private static final long serialVersionUID = 0L; + // Use ObjectField.newBuilder() to construct. + private ObjectField(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ObjectField() { + key_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ObjectField(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ObjectField( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + key_ = bs; + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = value_.toBuilder(); + } + value_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(value_); + value_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_ObjectField_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder.class); + } + + private int bitField0_; + public static final int KEY_FIELD_NUMBER = 1; + private volatile java.lang.Object key_; + /** + * required string key = 1; + * @return Whether the key field is set. + */ + @java.lang.Override + public boolean hasKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string key = 1; + * @return The key. + */ + @java.lang.Override + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + key_ = s; + } + return s; + } + } + /** + * required string key = 1; + * @return The bytes for key. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value_; + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasKey()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasValue()) { + memoizedIsInitialized = 0; + return false; + } + if (!getValue().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, key_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getValue()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, key_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getValue()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField) obj; + + if (hasKey() != other.hasKey()) return false; + if (hasKey()) { + if (!getKey() + .equals(other.getKey())) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasKey()) { + hash = (37 * hash) + KEY_FIELD_NUMBER; + hash = (53 * hash) + getKey().hashCode(); + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Datatypes.Object.ObjectField} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Object.ObjectField) + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_ObjectField_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + key_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (valueBuilder_ == null) { + value_ = null; + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.key_ = key_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (valueBuilder_ == null) { + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.getDefaultInstance()) return this; + if (other.hasKey()) { + bitField0_ |= 0x00000001; + key_ = other.key_; + onChanged(); + } + if (other.hasValue()) { + mergeValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasKey()) { + return false; + } + if (!hasValue()) { + return false; + } + if (!getValue().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object key_ = ""; + /** + * required string key = 1; + * @return Whether the key field is set. + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string key = 1; + * @return The key. + */ + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + key_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string key = 1; + * @return The bytes for key. + */ + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string key = 1; + * @param value The key to set. + * @return This builder for chaining. + */ + public Builder setKey( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + key_ = value; + onChanged(); + return this; + } + /** + * required string key = 1; + * @return This builder for chaining. + */ + public Builder clearKey() { + bitField0_ = (bitField0_ & ~0x00000001); + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + /** + * required string key = 1; + * @param value The bytes for key to set. + * @return This builder for chaining. + */ + public Builder setKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + key_ = value; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> valueBuilder_; + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + * @return The value. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue() { + if (valueBuilder_ == null) { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } else { + return valueBuilder_.getMessage(); + } + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder setValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + value_ = value; + onChanged(); + } else { + valueBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder setValue( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (valueBuilder_ == null) { + value_ = builderForValue.build(); + onChanged(); + } else { + valueBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder mergeValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + value_ != null && + value_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()) { + value_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.newBuilder(value_).mergeFrom(value).buildPartial(); + } else { + value_ = value; + } + onChanged(); + } else { + valueBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = null; + onChanged(); + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder getValueBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getValueFieldBuilder().getBuilder(); + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilder(); + } else { + return value_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance() : value_; + } + } + /** + * required .Mysqlx.Datatypes.Any value = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder>( + getValue(), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Object.ObjectField) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Object.ObjectField) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ObjectField parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ObjectField(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int FLD_FIELD_NUMBER = 1; + private java.util.List fld_; + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + @java.lang.Override + public java.util.List getFldList() { + return fld_; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + @java.lang.Override + public java.util.List + getFldOrBuilderList() { + return fld_; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + @java.lang.Override + public int getFldCount() { + return fld_.size(); + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getFld(int index) { + return fld_.get(index); + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index) { + return fld_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getFldCount(); i++) { + if (!getFld(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < fld_.size(); i++) { + output.writeMessage(1, fld_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < fld_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, fld_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Object)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Object) obj; + + if (!getFldList() + .equals(other.getFldList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getFldCount() > 0) { + hash = (37 * hash) + FLD_FIELD_NUMBER; + hash = (53 * hash) + getFldList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *An object
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Object} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Object) + com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFldFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (fldBuilder_ == null) { + fld_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + fldBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Object_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Object(this); + int from_bitField0_ = bitField0_; + if (fldBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + fld_ = java.util.Collections.unmodifiableList(fld_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.fld_ = fld_; + } else { + result.fld_ = fldBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Object) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Object)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance()) return this; + if (fldBuilder_ == null) { + if (!other.fld_.isEmpty()) { + if (fld_.isEmpty()) { + fld_ = other.fld_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFldIsMutable(); + fld_.addAll(other.fld_); + } + onChanged(); + } + } else { + if (!other.fld_.isEmpty()) { + if (fldBuilder_.isEmpty()) { + fldBuilder_.dispose(); + fldBuilder_ = null; + fld_ = other.fld_; + bitField0_ = (bitField0_ & ~0x00000001); + fldBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getFldFieldBuilder() : null; + } else { + fldBuilder_.addAllMessages(other.fld_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getFldCount(); i++) { + if (!getFld(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Object) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List fld_ = + java.util.Collections.emptyList(); + private void ensureFldIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + fld_ = new java.util.ArrayList(fld_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder> fldBuilder_; + + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public java.util.List getFldList() { + if (fldBuilder_ == null) { + return java.util.Collections.unmodifiableList(fld_); + } else { + return fldBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public int getFldCount() { + if (fldBuilder_ == null) { + return fld_.size(); + } else { + return fldBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField getFld(int index) { + if (fldBuilder_ == null) { + return fld_.get(index); + } else { + return fldBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder setFld( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.set(index, value); + onChanged(); + } else { + fldBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder setFld( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.set(index, builderForValue.build()); + onChanged(); + } else { + fldBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder addFld(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.add(value); + onChanged(); + } else { + fldBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder addFld( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.add(index, value); + onChanged(); + } else { + fldBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder addFld( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.add(builderForValue.build()); + onChanged(); + } else { + fldBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder addFld( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.add(index, builderForValue.build()); + onChanged(); + } else { + fldBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder addAllFld( + java.lang.Iterable values) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, fld_); + onChanged(); + } else { + fldBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder clearFld() { + if (fldBuilder_ == null) { + fld_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + fldBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public Builder removeFld(int index) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.remove(index); + onChanged(); + } else { + fldBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder getFldBuilder( + int index) { + return getFldFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index) { + if (fldBuilder_ == null) { + return fld_.get(index); } else { + return fldBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public java.util.List + getFldOrBuilderList() { + if (fldBuilder_ != null) { + return fldBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(fld_); + } + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder addFldBuilder() { + return getFldFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder addFldBuilder( + int index) { + return getFldFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Datatypes.Object.ObjectField fld = 1; + */ + public java.util.List + getFldBuilderList() { + return getFldFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder> + getFldFieldBuilder() { + if (fldBuilder_ == null) { + fldBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectFieldOrBuilder>( + fld_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + fld_ = null; + } + return fldBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Object) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Object) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Object DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Object(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Object parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Object(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ArrayOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Array) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + java.util.List + getValueList(); + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue(int index); + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + int getValueCount(); + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + java.util.List + getValueOrBuilderList(); + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder( + int index); + } + /** + *
    +   **
    +   *An Array
    +   * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Array} + */ + public static final class Array extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Array) + ArrayOrBuilder { + private static final long serialVersionUID = 0L; + // Use Array.newBuilder() to construct. + private Array(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Array() { + value_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Array(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Array( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + value_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + value_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Array_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Array_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder.class); + } + + public static final int VALUE_FIELD_NUMBER = 1; + private java.util.List value_; + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + @java.lang.Override + public java.util.List getValueList() { + return value_; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + @java.lang.Override + public java.util.List + getValueOrBuilderList() { + return value_; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + @java.lang.Override + public int getValueCount() { + return value_.size(); + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue(int index) { + return value_.get(index); + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder( + int index) { + return value_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < value_.size(); i++) { + output.writeMessage(1, value_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < value_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, value_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Array)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Array) obj; + + if (!getValueList() + .equals(other.getValueList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getValueCount() > 0) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValueList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Array prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *An Array
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Array} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Array) + com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Array_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Array_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + valueBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Array_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Array(this); + int from_bitField0_ = bitField0_; + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Array) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Array)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Array other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance()) return this; + if (valueBuilder_ == null) { + if (!other.value_.isEmpty()) { + if (value_.isEmpty()) { + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureValueIsMutable(); + value_.addAll(other.value_); + } + onChanged(); + } + } else { + if (!other.value_.isEmpty()) { + if (valueBuilder_.isEmpty()) { + valueBuilder_.dispose(); + valueBuilder_ = null; + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000001); + valueBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getValueFieldBuilder() : null; + } else { + valueBuilder_.addAllMessages(other.value_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Array) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List value_ = + java.util.Collections.emptyList(); + private void ensureValueIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + value_ = new java.util.ArrayList(value_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> valueBuilder_; + + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public java.util.List getValueList() { + if (valueBuilder_ == null) { + return java.util.Collections.unmodifiableList(value_); + } else { + return valueBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public int getValueCount() { + if (valueBuilder_ == null) { + return value_.size(); + } else { + return valueBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getValue(int index) { + if (valueBuilder_ == null) { + return value_.get(index); + } else { + return valueBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.set(index, value); + onChanged(); + } else { + valueBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.set(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder addValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(value); + onChanged(); + } else { + valueBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(index, value); + onChanged(); + } else { + valueBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder addValue( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder addAllValue( + java.lang.Iterable values) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, value_); + onChanged(); + } else { + valueBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + valueBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public Builder removeValue(int index) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.remove(index); + onChanged(); + } else { + valueBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder getValueBuilder( + int index) { + return getValueFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getValueOrBuilder( + int index) { + if (valueBuilder_ == null) { + return value_.get(index); } else { + return valueBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public java.util.List + getValueOrBuilderList() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(value_); + } + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addValueBuilder() { + return getValueFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addValueBuilder( + int index) { + return getValueFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Datatypes.Any value = 1; + */ + public java.util.List + getValueBuilderList() { + return getValueFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder>( + value_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Array) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Array) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Array DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Array(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Array parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Array(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface AnyOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Datatypes.Any) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type getType(); + + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return Whether the scalar field is set. + */ + boolean hasScalar(); + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return The scalar. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getScalar(); + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getScalarOrBuilder(); + + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return Whether the obj field is set. + */ + boolean hasObj(); + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return The obj. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getObj(); + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder getObjOrBuilder(); + + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return Whether the array field is set. + */ + boolean hasArray(); + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return The array. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getArray(); + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder getArrayOrBuilder(); + } + /** + *
    +   **
    +   *A helper to allow all field types
    +   * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Any} + */ + public static final class Any extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Datatypes.Any) + AnyOrBuilder { + private static final long serialVersionUID = 0L; + // Use Any.newBuilder() to construct. + private Any(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Any() { + type_ = 1; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Any(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Any( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type value = com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = scalar_.toBuilder(); + } + scalar_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(scalar_); + scalar_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = obj_.toBuilder(); + } + obj_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(obj_); + obj_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = array_.toBuilder(); + } + array_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(array_); + array_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Any_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Any_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Datatypes.Any.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * SCALAR = 1; + */ + SCALAR(1), + /** + * OBJECT = 2; + */ + OBJECT(2), + /** + * ARRAY = 3; + */ + ARRAY(3), + ; + + /** + * SCALAR = 1; + */ + public static final int SCALAR_VALUE = 1; + /** + * OBJECT = 2; + */ + public static final int OBJECT_VALUE = 2; + /** + * ARRAY = 3; + */ + public static final int ARRAY_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return SCALAR; + case 2: return OBJECT; + case 3: return ARRAY; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Datatypes.Any.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type result = com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type.SCALAR : result; + } + + public static final int SCALAR_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar scalar_; + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return Whether the scalar field is set. + */ + @java.lang.Override + public boolean hasScalar() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return The scalar. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getScalar() { + return scalar_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : scalar_; + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getScalarOrBuilder() { + return scalar_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : scalar_; + } + + public static final int OBJ_FIELD_NUMBER = 3; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Object obj_; + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return Whether the obj field is set. + */ + @java.lang.Override + public boolean hasObj() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return The obj. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getObj() { + return obj_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance() : obj_; + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder getObjOrBuilder() { + return obj_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance() : obj_; + } + + public static final int ARRAY_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Array array_; + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return Whether the array field is set. + */ + @java.lang.Override + public boolean hasArray() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return The array. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getArray() { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance() : array_; + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder getArrayOrBuilder() { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance() : array_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + if (hasScalar()) { + if (!getScalar().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasObj()) { + if (!getObj().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasArray()) { + if (!getArray().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getScalar()); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(3, getObj()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(4, getArray()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getScalar()); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getObj()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getArray()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Any)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any other = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Any) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasScalar() != other.hasScalar()) return false; + if (hasScalar()) { + if (!getScalar() + .equals(other.getScalar())) return false; + } + if (hasObj() != other.hasObj()) return false; + if (hasObj()) { + if (!getObj() + .equals(other.getObj())) return false; + } + if (hasArray() != other.hasArray()) return false; + if (hasArray()) { + if (!getArray() + .equals(other.getArray())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasScalar()) { + hash = (37 * hash) + SCALAR_FIELD_NUMBER; + hash = (53 * hash) + getScalar().hashCode(); + } + if (hasObj()) { + hash = (37 * hash) + OBJ_FIELD_NUMBER; + hash = (53 * hash) + getObj().hashCode(); + } + if (hasArray()) { + hash = (37 * hash) + ARRAY_FIELD_NUMBER; + hash = (53 * hash) + getArray().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *A helper to allow all field types
    +     * 
    + * + * Protobuf type {@code Mysqlx.Datatypes.Any} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Datatypes.Any) + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Any_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Any_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.class, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getScalarFieldBuilder(); + getObjFieldBuilder(); + getArrayFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + if (scalarBuilder_ == null) { + scalar_ = null; + } else { + scalarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (objBuilder_ == null) { + obj_ = null; + } else { + objBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (arrayBuilder_ == null) { + array_ = null; + } else { + arrayBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.internal_static_Mysqlx_Datatypes_Any_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any build() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any buildPartial() { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any result = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Any(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (scalarBuilder_ == null) { + result.scalar_ = scalar_; + } else { + result.scalar_ = scalarBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + if (objBuilder_ == null) { + result.obj_ = obj_; + } else { + result.obj_ = objBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + if (arrayBuilder_ == null) { + result.array_ = array_; + } else { + result.array_ = arrayBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxDatatypes.Any) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxDatatypes.Any)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any other) { + if (other == com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasScalar()) { + mergeScalar(other.getScalar()); + } + if (other.hasObj()) { + mergeObj(other.getObj()); + } + if (other.hasArray()) { + mergeArray(other.getArray()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + if (hasScalar()) { + if (!getScalar().isInitialized()) { + return false; + } + } + if (hasObj()) { + if (!getObj().isInitialized()) { + return false; + } + } + if (hasArray()) { + if (!getArray().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxDatatypes.Any) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 1; + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type result = com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type.SCALAR : result; + } + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Datatypes.Any.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar scalar_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> scalarBuilder_; + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return Whether the scalar field is set. + */ + public boolean hasScalar() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + * @return The scalar. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getScalar() { + if (scalarBuilder_ == null) { + return scalar_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : scalar_; + } else { + return scalarBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public Builder setScalar(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (scalarBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + scalar_ = value; + onChanged(); + } else { + scalarBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public Builder setScalar( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (scalarBuilder_ == null) { + scalar_ = builderForValue.build(); + onChanged(); + } else { + scalarBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public Builder mergeScalar(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (scalarBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + scalar_ != null && + scalar_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()) { + scalar_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.newBuilder(scalar_).mergeFrom(value).buildPartial(); + } else { + scalar_ = value; + } + onChanged(); + } else { + scalarBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public Builder clearScalar() { + if (scalarBuilder_ == null) { + scalar_ = null; + onChanged(); + } else { + scalarBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getScalarBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getScalarFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getScalarOrBuilder() { + if (scalarBuilder_ != null) { + return scalarBuilder_.getMessageOrBuilder(); + } else { + return scalar_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : scalar_; + } + } + /** + * optional .Mysqlx.Datatypes.Scalar scalar = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getScalarFieldBuilder() { + if (scalarBuilder_ == null) { + scalarBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + getScalar(), + getParentForChildren(), + isClean()); + scalar_ = null; + } + return scalarBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Object obj_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder> objBuilder_; + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return Whether the obj field is set. + */ + public boolean hasObj() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + * @return The obj. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object getObj() { + if (objBuilder_ == null) { + return obj_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance() : obj_; + } else { + return objBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public Builder setObj(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object value) { + if (objBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + obj_ = value; + onChanged(); + } else { + objBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public Builder setObj( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder builderForValue) { + if (objBuilder_ == null) { + obj_ = builderForValue.build(); + onChanged(); + } else { + objBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public Builder mergeObj(com.mysql.cj.x.protobuf.MysqlxDatatypes.Object value) { + if (objBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + obj_ != null && + obj_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance()) { + obj_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.newBuilder(obj_).mergeFrom(value).buildPartial(); + } else { + obj_ = value; + } + onChanged(); + } else { + objBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public Builder clearObj() { + if (objBuilder_ == null) { + obj_ = null; + onChanged(); + } else { + objBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder getObjBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getObjFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder getObjOrBuilder() { + if (objBuilder_ != null) { + return objBuilder_.getMessageOrBuilder(); + } else { + return obj_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.getDefaultInstance() : obj_; + } + } + /** + * optional .Mysqlx.Datatypes.Object obj = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder> + getObjFieldBuilder() { + if (objBuilder_ == null) { + objBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Object, com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ObjectOrBuilder>( + getObj(), + getParentForChildren(), + isClean()); + obj_ = null; + } + return objBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Array array_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array, com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder> arrayBuilder_; + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return Whether the array field is set. + */ + public boolean hasArray() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + * @return The array. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array getArray() { + if (arrayBuilder_ == null) { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance() : array_; + } else { + return arrayBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public Builder setArray(com.mysql.cj.x.protobuf.MysqlxDatatypes.Array value) { + if (arrayBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + array_ = value; + onChanged(); + } else { + arrayBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public Builder setArray( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder builderForValue) { + if (arrayBuilder_ == null) { + array_ = builderForValue.build(); + onChanged(); + } else { + arrayBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public Builder mergeArray(com.mysql.cj.x.protobuf.MysqlxDatatypes.Array value) { + if (arrayBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + array_ != null && + array_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance()) { + array_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.newBuilder(array_).mergeFrom(value).buildPartial(); + } else { + array_ = value; + } + onChanged(); + } else { + arrayBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public Builder clearArray() { + if (arrayBuilder_ == null) { + array_ = null; + onChanged(); + } else { + arrayBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder getArrayBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getArrayFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder getArrayOrBuilder() { + if (arrayBuilder_ != null) { + return arrayBuilder_.getMessageOrBuilder(); + } else { + return array_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.getDefaultInstance() : array_; + } + } + /** + * optional .Mysqlx.Datatypes.Array array = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array, com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder> + getArrayFieldBuilder() { + if (arrayBuilder_ == null) { + arrayBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Array, com.mysql.cj.x.protobuf.MysqlxDatatypes.Array.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ArrayOrBuilder>( + getArray(), + getParentForChildren(), + isClean()); + array_ = null; + } + return arrayBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Datatypes.Any) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Datatypes.Any) + private static final com.mysql.cj.x.protobuf.MysqlxDatatypes.Any DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxDatatypes.Any(); + } + + public static com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Any parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Any(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Scalar_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Scalar_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Scalar_String_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Scalar_String_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Scalar_Octets_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Object_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Object_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Object_ObjectField_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Array_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Array_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Datatypes_Any_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Datatypes_Any_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026mysqlx_datatypes.proto\022\020Mysqlx.Datatyp" + + "es\"\306\003\n\006Scalar\022+\n\004type\030\001 \002(\0162\035.Mysqlx.Dat" + + "atypes.Scalar.Type\022\024\n\014v_signed_int\030\002 \001(\022" + + "\022\026\n\016v_unsigned_int\030\003 \001(\004\0221\n\010v_octets\030\005 \001" + + "(\0132\037.Mysqlx.Datatypes.Scalar.Octets\022\020\n\010v" + + "_double\030\006 \001(\001\022\017\n\007v_float\030\007 \001(\002\022\016\n\006v_bool" + + "\030\010 \001(\010\0221\n\010v_string\030\t \001(\0132\037.Mysqlx.Dataty" + + "pes.Scalar.String\032*\n\006String\022\r\n\005value\030\001 \002" + + "(\014\022\021\n\tcollation\030\002 \001(\004\032-\n\006Octets\022\r\n\005value" + + "\030\001 \002(\014\022\024\n\014content_type\030\002 \001(\r\"m\n\004Type\022\n\n\006" + + "V_SINT\020\001\022\n\n\006V_UINT\020\002\022\n\n\006V_NULL\020\003\022\014\n\010V_OC" + + "TETS\020\004\022\014\n\010V_DOUBLE\020\005\022\013\n\007V_FLOAT\020\006\022\n\n\006V_B" + + "OOL\020\007\022\014\n\010V_STRING\020\010\"}\n\006Object\0221\n\003fld\030\001 \003" + + "(\0132$.Mysqlx.Datatypes.Object.ObjectField" + + "\032@\n\013ObjectField\022\013\n\003key\030\001 \002(\t\022$\n\005value\030\002 " + + "\002(\0132\025.Mysqlx.Datatypes.Any\"-\n\005Array\022$\n\005v" + + "alue\030\001 \003(\0132\025.Mysqlx.Datatypes.Any\"\323\001\n\003An" + + "y\022(\n\004type\030\001 \002(\0162\032.Mysqlx.Datatypes.Any.T" + + "ype\022(\n\006scalar\030\002 \001(\0132\030.Mysqlx.Datatypes.S" + + "calar\022%\n\003obj\030\003 \001(\0132\030.Mysqlx.Datatypes.Ob" + + "ject\022&\n\005array\030\004 \001(\0132\027.Mysqlx.Datatypes.A" + + "rray\")\n\004Type\022\n\n\006SCALAR\020\001\022\n\n\006OBJECT\020\002\022\t\n\005" + + "ARRAY\020\003B\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_Mysqlx_Datatypes_Scalar_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Datatypes_Scalar_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Scalar_descriptor, + new java.lang.String[] { "Type", "VSignedInt", "VUnsignedInt", "VOctets", "VDouble", "VFloat", "VBool", "VString", }); + internal_static_Mysqlx_Datatypes_Scalar_String_descriptor = + internal_static_Mysqlx_Datatypes_Scalar_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Datatypes_Scalar_String_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Scalar_String_descriptor, + new java.lang.String[] { "Value", "Collation", }); + internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor = + internal_static_Mysqlx_Datatypes_Scalar_descriptor.getNestedTypes().get(1); + internal_static_Mysqlx_Datatypes_Scalar_Octets_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Scalar_Octets_descriptor, + new java.lang.String[] { "Value", "ContentType", }); + internal_static_Mysqlx_Datatypes_Object_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Datatypes_Object_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Object_descriptor, + new java.lang.String[] { "Fld", }); + internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor = + internal_static_Mysqlx_Datatypes_Object_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Datatypes_Object_ObjectField_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Object_ObjectField_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_Mysqlx_Datatypes_Array_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Datatypes_Array_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Array_descriptor, + new java.lang.String[] { "Value", }); + internal_static_Mysqlx_Datatypes_Any_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Datatypes_Any_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Datatypes_Any_descriptor, + new java.lang.String[] { "Type", "Scalar", "Obj", "Array", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpect.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpect.java new file mode 100644 index 0000000..4b5ad8f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpect.java @@ -0,0 +1,2583 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_expect.proto + +public final class MysqlxExpect { + private MysqlxExpect() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface OpenOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expect.Open) + com.google.protobuf.MessageOrBuilder { + + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return Whether the op field is set. + */ + boolean hasOp(); + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return The op. + */ + com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation getOp(); + + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + java.util.List + getCondList(); + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getCond(int index); + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + int getCondCount(); + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + java.util.List + getCondOrBuilderList(); + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder getCondOrBuilder( + int index); + } + /** + *
    +   **
    +   *Open an Expect block and set/unset the conditions that have to
    +   *be fulfilled.
    +   *If any of the conditions fail, all enclosed messages will fail
    +   *with a ``Mysqlx::Error`` message.
    +   *@returns @ref Mysqlx::Ok on success, @ref Mysqlx::Error on error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expect.Open} + */ + public static final class Open extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expect.Open) + OpenOrBuilder { + private static final long serialVersionUID = 0L; + // Use Open.newBuilder() to construct. + private Open(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Open() { + op_ = 0; + cond_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Open(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Open( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation value = com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + op_ = rawValue; + } + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + cond_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + cond_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + cond_ = java.util.Collections.unmodifiableList(cond_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.class, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Expect.Open.CtxOperation} + */ + public enum CtxOperation + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +       ** copy the operations from the parent Expect-block 
    +       * 
    + * + * EXPECT_CTX_COPY_PREV = 0; + */ + EXPECT_CTX_COPY_PREV(0), + /** + *
    +       ** start with a empty set of operations 
    +       * 
    + * + * EXPECT_CTX_EMPTY = 1; + */ + EXPECT_CTX_EMPTY(1), + ; + + /** + *
    +       ** copy the operations from the parent Expect-block 
    +       * 
    + * + * EXPECT_CTX_COPY_PREV = 0; + */ + public static final int EXPECT_CTX_COPY_PREV_VALUE = 0; + /** + *
    +       ** start with a empty set of operations 
    +       * 
    + * + * EXPECT_CTX_EMPTY = 1; + */ + public static final int EXPECT_CTX_EMPTY_VALUE = 1; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static CtxOperation valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static CtxOperation forNumber(int value) { + switch (value) { + case 0: return EXPECT_CTX_COPY_PREV; + case 1: return EXPECT_CTX_EMPTY; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + CtxOperation> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public CtxOperation findValueByNumber(int number) { + return CtxOperation.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Open.getDescriptor().getEnumTypes().get(0); + } + + private static final CtxOperation[] VALUES = values(); + + public static CtxOperation valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private CtxOperation(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Expect.Open.CtxOperation) + } + + public interface ConditionOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expect.Open.Condition) + com.google.protobuf.MessageOrBuilder { + + /** + * required uint32 condition_key = 1; + * @return Whether the conditionKey field is set. + */ + boolean hasConditionKey(); + /** + * required uint32 condition_key = 1; + * @return The conditionKey. + */ + int getConditionKey(); + + /** + * optional bytes condition_value = 2; + * @return Whether the conditionValue field is set. + */ + boolean hasConditionValue(); + /** + * optional bytes condition_value = 2; + * @return The conditionValue. + */ + com.google.protobuf.ByteString getConditionValue(); + + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return Whether the op field is set. + */ + boolean hasOp(); + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return The op. + */ + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation getOp(); + } + /** + * Protobuf type {@code Mysqlx.Expect.Open.Condition} + */ + public static final class Condition extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expect.Open.Condition) + ConditionOrBuilder { + private static final long serialVersionUID = 0L; + // Use Condition.newBuilder() to construct. + private Condition(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Condition() { + conditionValue_ = com.google.protobuf.ByteString.EMPTY; + op_ = 0; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Condition(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Condition( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + conditionKey_ = input.readUInt32(); + break; + } + case 18: { + bitField0_ |= 0x00000002; + conditionValue_ = input.readBytes(); + break; + } + case 24: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation value = com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(3, rawValue); + } else { + bitField0_ |= 0x00000004; + op_ = rawValue; + } + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_Condition_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_Condition_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.class, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Expect.Open.Condition.Key} + */ + public enum Key + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +         ** Change error propagation behaviour 
    +         * 
    + * + * EXPECT_NO_ERROR = 1; + */ + EXPECT_NO_ERROR(1), + /** + *
    +         ** Check if X Protocol field exists 
    +         * 
    + * + * EXPECT_FIELD_EXIST = 2; + */ + EXPECT_FIELD_EXIST(2), + /** + *
    +         ** Check if X Protocol supports document _id generation 
    +         * 
    + * + * EXPECT_DOCID_GENERATED = 3; + */ + EXPECT_DOCID_GENERATED(3), + ; + + /** + *
    +         ** Change error propagation behaviour 
    +         * 
    + * + * EXPECT_NO_ERROR = 1; + */ + public static final int EXPECT_NO_ERROR_VALUE = 1; + /** + *
    +         ** Check if X Protocol field exists 
    +         * 
    + * + * EXPECT_FIELD_EXIST = 2; + */ + public static final int EXPECT_FIELD_EXIST_VALUE = 2; + /** + *
    +         ** Check if X Protocol supports document _id generation 
    +         * 
    + * + * EXPECT_DOCID_GENERATED = 3; + */ + public static final int EXPECT_DOCID_GENERATED_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Key valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Key forNumber(int value) { + switch (value) { + case 1: return EXPECT_NO_ERROR; + case 2: return EXPECT_FIELD_EXIST; + case 3: return EXPECT_DOCID_GENERATED; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Key> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Key findValueByNumber(int number) { + return Key.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDescriptor().getEnumTypes().get(0); + } + + private static final Key[] VALUES = values(); + + public static Key valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Key(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Expect.Open.Condition.Key) + } + + /** + * Protobuf enum {@code Mysqlx.Expect.Open.Condition.ConditionOperation} + */ + public enum ConditionOperation + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +         ** set the condition; set, if not set; overwrite, if set 
    +         * 
    + * + * EXPECT_OP_SET = 0; + */ + EXPECT_OP_SET(0), + /** + *
    +         ** unset the condition 
    +         * 
    + * + * EXPECT_OP_UNSET = 1; + */ + EXPECT_OP_UNSET(1), + ; + + /** + *
    +         ** set the condition; set, if not set; overwrite, if set 
    +         * 
    + * + * EXPECT_OP_SET = 0; + */ + public static final int EXPECT_OP_SET_VALUE = 0; + /** + *
    +         ** unset the condition 
    +         * 
    + * + * EXPECT_OP_UNSET = 1; + */ + public static final int EXPECT_OP_UNSET_VALUE = 1; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ConditionOperation valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ConditionOperation forNumber(int value) { + switch (value) { + case 0: return EXPECT_OP_SET; + case 1: return EXPECT_OP_UNSET; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ConditionOperation> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ConditionOperation findValueByNumber(int number) { + return ConditionOperation.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDescriptor().getEnumTypes().get(1); + } + + private static final ConditionOperation[] VALUES = values(); + + public static ConditionOperation valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ConditionOperation(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Expect.Open.Condition.ConditionOperation) + } + + private int bitField0_; + public static final int CONDITION_KEY_FIELD_NUMBER = 1; + private int conditionKey_; + /** + * required uint32 condition_key = 1; + * @return Whether the conditionKey field is set. + */ + @java.lang.Override + public boolean hasConditionKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required uint32 condition_key = 1; + * @return The conditionKey. + */ + @java.lang.Override + public int getConditionKey() { + return conditionKey_; + } + + public static final int CONDITION_VALUE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString conditionValue_; + /** + * optional bytes condition_value = 2; + * @return Whether the conditionValue field is set. + */ + @java.lang.Override + public boolean hasConditionValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional bytes condition_value = 2; + * @return The conditionValue. + */ + @java.lang.Override + public com.google.protobuf.ByteString getConditionValue() { + return conditionValue_; + } + + public static final int OP_FIELD_NUMBER = 3; + private int op_; + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return Whether the op field is set. + */ + @java.lang.Override public boolean hasOp() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return The op. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation getOp() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation result = com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation.valueOf(op_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation.EXPECT_OP_SET : result; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasConditionKey()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, conditionKey_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBytes(2, conditionValue_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeEnum(3, op_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, conditionKey_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, conditionValue_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(3, op_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition other = (com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition) obj; + + if (hasConditionKey() != other.hasConditionKey()) return false; + if (hasConditionKey()) { + if (getConditionKey() + != other.getConditionKey()) return false; + } + if (hasConditionValue() != other.hasConditionValue()) return false; + if (hasConditionValue()) { + if (!getConditionValue() + .equals(other.getConditionValue())) return false; + } + if (hasOp() != other.hasOp()) return false; + if (hasOp()) { + if (op_ != other.op_) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasConditionKey()) { + hash = (37 * hash) + CONDITION_KEY_FIELD_NUMBER; + hash = (53 * hash) + getConditionKey(); + } + if (hasConditionValue()) { + hash = (37 * hash) + CONDITION_VALUE_FIELD_NUMBER; + hash = (53 * hash) + getConditionValue().hashCode(); + } + if (hasOp()) { + hash = (37 * hash) + OP_FIELD_NUMBER; + hash = (53 * hash) + op_; + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Expect.Open.Condition} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expect.Open.Condition) + com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_Condition_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_Condition_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.class, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + conditionKey_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + conditionValue_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + op_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_Condition_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition build() { + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition result = new com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.conditionKey_ = conditionKey_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.conditionValue_ = conditionValue_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.op_ = op_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDefaultInstance()) return this; + if (other.hasConditionKey()) { + setConditionKey(other.getConditionKey()); + } + if (other.hasConditionValue()) { + setConditionValue(other.getConditionValue()); + } + if (other.hasOp()) { + setOp(other.getOp()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasConditionKey()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int conditionKey_ ; + /** + * required uint32 condition_key = 1; + * @return Whether the conditionKey field is set. + */ + @java.lang.Override + public boolean hasConditionKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required uint32 condition_key = 1; + * @return The conditionKey. + */ + @java.lang.Override + public int getConditionKey() { + return conditionKey_; + } + /** + * required uint32 condition_key = 1; + * @param value The conditionKey to set. + * @return This builder for chaining. + */ + public Builder setConditionKey(int value) { + bitField0_ |= 0x00000001; + conditionKey_ = value; + onChanged(); + return this; + } + /** + * required uint32 condition_key = 1; + * @return This builder for chaining. + */ + public Builder clearConditionKey() { + bitField0_ = (bitField0_ & ~0x00000001); + conditionKey_ = 0; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString conditionValue_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes condition_value = 2; + * @return Whether the conditionValue field is set. + */ + @java.lang.Override + public boolean hasConditionValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional bytes condition_value = 2; + * @return The conditionValue. + */ + @java.lang.Override + public com.google.protobuf.ByteString getConditionValue() { + return conditionValue_; + } + /** + * optional bytes condition_value = 2; + * @param value The conditionValue to set. + * @return This builder for chaining. + */ + public Builder setConditionValue(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + conditionValue_ = value; + onChanged(); + return this; + } + /** + * optional bytes condition_value = 2; + * @return This builder for chaining. + */ + public Builder clearConditionValue() { + bitField0_ = (bitField0_ & ~0x00000002); + conditionValue_ = getDefaultInstance().getConditionValue(); + onChanged(); + return this; + } + + private int op_ = 0; + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return Whether the op field is set. + */ + @java.lang.Override public boolean hasOp() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return The op. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation getOp() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation result = com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation.valueOf(op_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation.EXPECT_OP_SET : result; + } + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @param value The op to set. + * @return This builder for chaining. + */ + public Builder setOp(com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.ConditionOperation value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + op_ = value.getNumber(); + onChanged(); + return this; + } + /** + * optional .Mysqlx.Expect.Open.Condition.ConditionOperation op = 3 [default = EXPECT_OP_SET]; + * @return This builder for chaining. + */ + public Builder clearOp() { + bitField0_ = (bitField0_ & ~0x00000004); + op_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expect.Open.Condition) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expect.Open.Condition) + private static final com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Condition parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Condition(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int OP_FIELD_NUMBER = 1; + private int op_; + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return Whether the op field is set. + */ + @java.lang.Override public boolean hasOp() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return The op. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation getOp() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation result = com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation.valueOf(op_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation.EXPECT_CTX_COPY_PREV : result; + } + + public static final int COND_FIELD_NUMBER = 2; + private java.util.List cond_; + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + @java.lang.Override + public java.util.List getCondList() { + return cond_; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + @java.lang.Override + public java.util.List + getCondOrBuilderList() { + return cond_; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + @java.lang.Override + public int getCondCount() { + return cond_.size(); + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getCond(int index) { + return cond_.get(index); + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder getCondOrBuilder( + int index) { + return cond_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getCondCount(); i++) { + if (!getCond(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, op_); + } + for (int i = 0; i < cond_.size(); i++) { + output.writeMessage(2, cond_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, op_); + } + for (int i = 0; i < cond_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, cond_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Open)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpect.Open other = (com.mysql.cj.x.protobuf.MysqlxExpect.Open) obj; + + if (hasOp() != other.hasOp()) return false; + if (hasOp()) { + if (op_ != other.op_) return false; + } + if (!getCondList() + .equals(other.getCondList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOp()) { + hash = (37 * hash) + OP_FIELD_NUMBER; + hash = (53 * hash) + op_; + } + if (getCondCount() > 0) { + hash = (37 * hash) + COND_FIELD_NUMBER; + hash = (53 * hash) + getCondList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpect.Open prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Open an Expect block and set/unset the conditions that have to
    +     *be fulfilled.
    +     *If any of the conditions fail, all enclosed messages will fail
    +     *with a ``Mysqlx::Error`` message.
    +     *@returns @ref Mysqlx::Ok on success, @ref Mysqlx::Error on error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expect.Open} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expect.Open) + com.mysql.cj.x.protobuf.MysqlxExpect.OpenOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.class, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpect.Open.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getCondFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + op_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (condBuilder_ == null) { + cond_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + condBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Open_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Open.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open build() { + com.mysql.cj.x.protobuf.MysqlxExpect.Open result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpect.Open result = new com.mysql.cj.x.protobuf.MysqlxExpect.Open(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.op_ = op_; + if (condBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + cond_ = java.util.Collections.unmodifiableList(cond_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.cond_ = cond_; + } else { + result.cond_ = condBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Open) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpect.Open)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpect.Open other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpect.Open.getDefaultInstance()) return this; + if (other.hasOp()) { + setOp(other.getOp()); + } + if (condBuilder_ == null) { + if (!other.cond_.isEmpty()) { + if (cond_.isEmpty()) { + cond_ = other.cond_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureCondIsMutable(); + cond_.addAll(other.cond_); + } + onChanged(); + } + } else { + if (!other.cond_.isEmpty()) { + if (condBuilder_.isEmpty()) { + condBuilder_.dispose(); + condBuilder_ = null; + cond_ = other.cond_; + bitField0_ = (bitField0_ & ~0x00000002); + condBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getCondFieldBuilder() : null; + } else { + condBuilder_.addAllMessages(other.cond_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getCondCount(); i++) { + if (!getCond(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpect.Open parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpect.Open) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int op_ = 0; + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return Whether the op field is set. + */ + @java.lang.Override public boolean hasOp() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return The op. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation getOp() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation result = com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation.valueOf(op_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation.EXPECT_CTX_COPY_PREV : result; + } + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @param value The op to set. + * @return This builder for chaining. + */ + public Builder setOp(com.mysql.cj.x.protobuf.MysqlxExpect.Open.CtxOperation value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + op_ = value.getNumber(); + onChanged(); + return this; + } + /** + * optional .Mysqlx.Expect.Open.CtxOperation op = 1 [default = EXPECT_CTX_COPY_PREV]; + * @return This builder for chaining. + */ + public Builder clearOp() { + bitField0_ = (bitField0_ & ~0x00000001); + op_ = 0; + onChanged(); + return this; + } + + private java.util.List cond_ = + java.util.Collections.emptyList(); + private void ensureCondIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + cond_ = new java.util.ArrayList(cond_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder, com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder> condBuilder_; + + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public java.util.List getCondList() { + if (condBuilder_ == null) { + return java.util.Collections.unmodifiableList(cond_); + } else { + return condBuilder_.getMessageList(); + } + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public int getCondCount() { + if (condBuilder_ == null) { + return cond_.size(); + } else { + return condBuilder_.getCount(); + } + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition getCond(int index) { + if (condBuilder_ == null) { + return cond_.get(index); + } else { + return condBuilder_.getMessage(index); + } + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder setCond( + int index, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition value) { + if (condBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCondIsMutable(); + cond_.set(index, value); + onChanged(); + } else { + condBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder setCond( + int index, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder builderForValue) { + if (condBuilder_ == null) { + ensureCondIsMutable(); + cond_.set(index, builderForValue.build()); + onChanged(); + } else { + condBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder addCond(com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition value) { + if (condBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCondIsMutable(); + cond_.add(value); + onChanged(); + } else { + condBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder addCond( + int index, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition value) { + if (condBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureCondIsMutable(); + cond_.add(index, value); + onChanged(); + } else { + condBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder addCond( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder builderForValue) { + if (condBuilder_ == null) { + ensureCondIsMutable(); + cond_.add(builderForValue.build()); + onChanged(); + } else { + condBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder addCond( + int index, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder builderForValue) { + if (condBuilder_ == null) { + ensureCondIsMutable(); + cond_.add(index, builderForValue.build()); + onChanged(); + } else { + condBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder addAllCond( + java.lang.Iterable values) { + if (condBuilder_ == null) { + ensureCondIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, cond_); + onChanged(); + } else { + condBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder clearCond() { + if (condBuilder_ == null) { + cond_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + condBuilder_.clear(); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public Builder removeCond(int index) { + if (condBuilder_ == null) { + ensureCondIsMutable(); + cond_.remove(index); + onChanged(); + } else { + condBuilder_.remove(index); + } + return this; + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder getCondBuilder( + int index) { + return getCondFieldBuilder().getBuilder(index); + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder getCondOrBuilder( + int index) { + if (condBuilder_ == null) { + return cond_.get(index); } else { + return condBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public java.util.List + getCondOrBuilderList() { + if (condBuilder_ != null) { + return condBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(cond_); + } + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder addCondBuilder() { + return getCondFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder addCondBuilder( + int index) { + return getCondFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.getDefaultInstance()); + } + /** + * repeated .Mysqlx.Expect.Open.Condition cond = 2; + */ + public java.util.List + getCondBuilderList() { + return getCondFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder, com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder> + getCondFieldBuilder() { + if (condBuilder_ == null) { + condBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition, com.mysql.cj.x.protobuf.MysqlxExpect.Open.Condition.Builder, com.mysql.cj.x.protobuf.MysqlxExpect.Open.ConditionOrBuilder>( + cond_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + cond_ = null; + } + return condBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expect.Open) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expect.Open) + private static final com.mysql.cj.x.protobuf.MysqlxExpect.Open DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpect.Open(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Open getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Open parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Open(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Open getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CloseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expect.Close) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Close a Expect block.
    +   *Closing a Expect block restores the state of the previous Expect
    +   *block for the following messages.
    +   *@returns @ref Mysqlx::Ok on success,  @ref Mysqlx::Error on error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expect.Close} + */ + public static final class Close extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expect.Close) + CloseOrBuilder { + private static final long serialVersionUID = 0L; + // Use Close.newBuilder() to construct. + private Close(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Close() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Close(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Close( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Close.class, com.mysql.cj.x.protobuf.MysqlxExpect.Close.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Close)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpect.Close other = (com.mysql.cj.x.protobuf.MysqlxExpect.Close) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpect.Close prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Close a Expect block.
    +     *Closing a Expect block restores the state of the previous Expect
    +     *block for the following messages.
    +     *@returns @ref Mysqlx::Ok on success,  @ref Mysqlx::Error on error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expect.Close} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expect.Close) + com.mysql.cj.x.protobuf.MysqlxExpect.CloseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpect.Close.class, com.mysql.cj.x.protobuf.MysqlxExpect.Close.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpect.Close.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.internal_static_Mysqlx_Expect_Close_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Close getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpect.Close.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Close build() { + com.mysql.cj.x.protobuf.MysqlxExpect.Close result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Close buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpect.Close result = new com.mysql.cj.x.protobuf.MysqlxExpect.Close(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpect.Close) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpect.Close)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpect.Close other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpect.Close.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpect.Close parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpect.Close) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expect.Close) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expect.Close) + private static final com.mysql.cj.x.protobuf.MysqlxExpect.Close DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpect.Close(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpect.Close getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Close parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Close(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpect.Close getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expect_Open_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expect_Open_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expect_Open_Condition_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expect_Open_Condition_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expect_Close_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expect_Close_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\023mysqlx_expect.proto\022\rMysqlx.Expect\032\014my" + + "sqlx.proto\"\326\003\n\004Open\022B\n\002op\030\001 \001(\0162 .Mysqlx" + + ".Expect.Open.CtxOperation:\024EXPECT_CTX_CO" + + "PY_PREV\022+\n\004cond\030\002 \003(\0132\035.Mysqlx.Expect.Op" + + "en.Condition\032\226\002\n\tCondition\022\025\n\rcondition_" + + "key\030\001 \002(\r\022\027\n\017condition_value\030\002 \001(\014\022K\n\002op" + + "\030\003 \001(\01620.Mysqlx.Expect.Open.Condition.Co" + + "nditionOperation:\rEXPECT_OP_SET\"N\n\003Key\022\023" + + "\n\017EXPECT_NO_ERROR\020\001\022\026\n\022EXPECT_FIELD_EXIS" + + "T\020\002\022\032\n\026EXPECT_DOCID_GENERATED\020\003\"<\n\022Condi" + + "tionOperation\022\021\n\rEXPECT_OP_SET\020\000\022\023\n\017EXPE" + + "CT_OP_UNSET\020\001\">\n\014CtxOperation\022\030\n\024EXPECT_" + + "CTX_COPY_PREV\020\000\022\024\n\020EXPECT_CTX_EMPTY\020\001:\004\210" + + "\3520\030\"\r\n\005Close:\004\210\3520\031B\031\n\027com.mysql.cj.x.pro" + + "tobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + }); + internal_static_Mysqlx_Expect_Open_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Expect_Open_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expect_Open_descriptor, + new java.lang.String[] { "Op", "Cond", }); + internal_static_Mysqlx_Expect_Open_Condition_descriptor = + internal_static_Mysqlx_Expect_Open_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Expect_Open_Condition_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expect_Open_Condition_descriptor, + new java.lang.String[] { "ConditionKey", "ConditionValue", "Op", }); + internal_static_Mysqlx_Expect_Close_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Expect_Close_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expect_Close_descriptor, + new java.lang.String[] { }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpr.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpr.java new file mode 100644 index 0000000..3628a37 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxExpr.java @@ -0,0 +1,11203 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_expr.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxExpr { + private MysqlxExpr() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface ExprOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Expr) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type getType(); + + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return Whether the identifier field is set. + */ + boolean hasIdentifier(); + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return The identifier. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getIdentifier(); + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getIdentifierOrBuilder(); + + /** + * optional string variable = 3; + * @return Whether the variable field is set. + */ + boolean hasVariable(); + /** + * optional string variable = 3; + * @return The variable. + */ + java.lang.String getVariable(); + /** + * optional string variable = 3; + * @return The bytes for variable. + */ + com.google.protobuf.ByteString + getVariableBytes(); + + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return Whether the literal field is set. + */ + boolean hasLiteral(); + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return The literal. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getLiteral(); + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getLiteralOrBuilder(); + + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return Whether the functionCall field is set. + */ + boolean hasFunctionCall(); + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return The functionCall. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getFunctionCall(); + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder getFunctionCallOrBuilder(); + + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return Whether the operator field is set. + */ + boolean hasOperator(); + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return The operator. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Operator getOperator(); + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder getOperatorOrBuilder(); + + /** + * optional uint32 position = 7; + * @return Whether the position field is set. + */ + boolean hasPosition(); + /** + * optional uint32 position = 7; + * @return The position. + */ + int getPosition(); + + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return Whether the object field is set. + */ + boolean hasObject(); + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return The object. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Object getObject(); + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder getObjectOrBuilder(); + + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return Whether the array field is set. + */ + boolean hasArray(); + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return The array. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Array getArray(); + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder getArrayOrBuilder(); + } + /** + *
    +   **
    +   *The "root" of the expression tree.
    +   *If expression type is PLACEHOLDER, then it refers to the value
    +   *of a parameter specified when executing a statement (see args
    +   *field of StmtExecute command). Field position (which must be
    +   *present for such an expression) gives 0-based position of the
    +   *parameter in the parameter list.
    +   *@par production list
    +   *@code{unparsed}
    +   *expr: operator |
    +   *: identifier |
    +   *: function_call |
    +   *: variable |
    +   *: literal |
    +   *: object |
    +   *: array |
    +   *: placeholder
    +   *@endcode
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.Expr} + */ + public static final class Expr extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Expr) + ExprOrBuilder { + private static final long serialVersionUID = 0L; + // Use Expr.newBuilder() to construct. + private Expr(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Expr() { + type_ = 1; + variable_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Expr(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Expr( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type value = com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = identifier_.toBuilder(); + } + identifier_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(identifier_); + identifier_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + variable_ = bs; + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = literal_.toBuilder(); + } + literal_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(literal_); + literal_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 42: { + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = functionCall_.toBuilder(); + } + functionCall_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(functionCall_); + functionCall_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 50: { + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) != 0)) { + subBuilder = operator_.toBuilder(); + } + operator_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Operator.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(operator_); + operator_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + case 56: { + bitField0_ |= 0x00000040; + position_ = input.readUInt32(); + break; + } + case 66: { + com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder subBuilder = null; + if (((bitField0_ & 0x00000080) != 0)) { + subBuilder = object_.toBuilder(); + } + object_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Object.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(object_); + object_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000080; + break; + } + case 74: { + com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder subBuilder = null; + if (((bitField0_ & 0x00000100) != 0)) { + subBuilder = array_.toBuilder(); + } + array_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Array.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(array_); + array_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000100; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Expr_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Expr_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.class, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Expr.Expr.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * IDENT = 1; + */ + IDENT(1), + /** + * LITERAL = 2; + */ + LITERAL(2), + /** + * VARIABLE = 3; + */ + VARIABLE(3), + /** + * FUNC_CALL = 4; + */ + FUNC_CALL(4), + /** + * OPERATOR = 5; + */ + OPERATOR(5), + /** + * PLACEHOLDER = 6; + */ + PLACEHOLDER(6), + /** + * OBJECT = 7; + */ + OBJECT(7), + /** + * ARRAY = 8; + */ + ARRAY(8), + ; + + /** + * IDENT = 1; + */ + public static final int IDENT_VALUE = 1; + /** + * LITERAL = 2; + */ + public static final int LITERAL_VALUE = 2; + /** + * VARIABLE = 3; + */ + public static final int VARIABLE_VALUE = 3; + /** + * FUNC_CALL = 4; + */ + public static final int FUNC_CALL_VALUE = 4; + /** + * OPERATOR = 5; + */ + public static final int OPERATOR_VALUE = 5; + /** + * PLACEHOLDER = 6; + */ + public static final int PLACEHOLDER_VALUE = 6; + /** + * OBJECT = 7; + */ + public static final int OBJECT_VALUE = 7; + /** + * ARRAY = 8; + */ + public static final int ARRAY_VALUE = 8; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return IDENT; + case 2: return LITERAL; + case 3: return VARIABLE; + case 4: return FUNC_CALL; + case 5: return OPERATOR; + case 6: return PLACEHOLDER; + case 7: return OBJECT; + case 8: return ARRAY; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Expr.Expr.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type result = com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type.IDENT : result; + } + + public static final int IDENTIFIER_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier identifier_; + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return Whether the identifier field is set. + */ + @java.lang.Override + public boolean hasIdentifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return The identifier. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getIdentifier() { + return identifier_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : identifier_; + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getIdentifierOrBuilder() { + return identifier_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : identifier_; + } + + public static final int VARIABLE_FIELD_NUMBER = 3; + private volatile java.lang.Object variable_; + /** + * optional string variable = 3; + * @return Whether the variable field is set. + */ + @java.lang.Override + public boolean hasVariable() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional string variable = 3; + * @return The variable. + */ + @java.lang.Override + public java.lang.String getVariable() { + java.lang.Object ref = variable_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + variable_ = s; + } + return s; + } + } + /** + * optional string variable = 3; + * @return The bytes for variable. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getVariableBytes() { + java.lang.Object ref = variable_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + variable_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int LITERAL_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar literal_; + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return Whether the literal field is set. + */ + @java.lang.Override + public boolean hasLiteral() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return The literal. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getLiteral() { + return literal_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : literal_; + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getLiteralOrBuilder() { + return literal_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : literal_; + } + + public static final int FUNCTION_CALL_FIELD_NUMBER = 5; + private com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall functionCall_; + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return Whether the functionCall field is set. + */ + @java.lang.Override + public boolean hasFunctionCall() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return The functionCall. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getFunctionCall() { + return functionCall_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance() : functionCall_; + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder getFunctionCallOrBuilder() { + return functionCall_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance() : functionCall_; + } + + public static final int OPERATOR_FIELD_NUMBER = 6; + private com.mysql.cj.x.protobuf.MysqlxExpr.Operator operator_; + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return Whether the operator field is set. + */ + @java.lang.Override + public boolean hasOperator() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return The operator. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator getOperator() { + return operator_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance() : operator_; + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder getOperatorOrBuilder() { + return operator_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance() : operator_; + } + + public static final int POSITION_FIELD_NUMBER = 7; + private int position_; + /** + * optional uint32 position = 7; + * @return Whether the position field is set. + */ + @java.lang.Override + public boolean hasPosition() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional uint32 position = 7; + * @return The position. + */ + @java.lang.Override + public int getPosition() { + return position_; + } + + public static final int OBJECT_FIELD_NUMBER = 8; + private com.mysql.cj.x.protobuf.MysqlxExpr.Object object_; + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return Whether the object field is set. + */ + @java.lang.Override + public boolean hasObject() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return The object. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object getObject() { + return object_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance() : object_; + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder getObjectOrBuilder() { + return object_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance() : object_; + } + + public static final int ARRAY_FIELD_NUMBER = 9; + private com.mysql.cj.x.protobuf.MysqlxExpr.Array array_; + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return Whether the array field is set. + */ + @java.lang.Override + public boolean hasArray() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return The array. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Array getArray() { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance() : array_; + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder getArrayOrBuilder() { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance() : array_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + if (hasIdentifier()) { + if (!getIdentifier().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasLiteral()) { + if (!getLiteral().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasFunctionCall()) { + if (!getFunctionCall().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasOperator()) { + if (!getOperator().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasObject()) { + if (!getObject().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasArray()) { + if (!getArray().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getIdentifier()); + } + if (((bitField0_ & 0x00000004) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, variable_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(4, getLiteral()); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(5, getFunctionCall()); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(6, getOperator()); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeUInt32(7, position_); + } + if (((bitField0_ & 0x00000080) != 0)) { + output.writeMessage(8, getObject()); + } + if (((bitField0_ & 0x00000100) != 0)) { + output.writeMessage(9, getArray()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getIdentifier()); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, variable_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getLiteral()); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getFunctionCall()); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, getOperator()); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(7, position_); + } + if (((bitField0_ & 0x00000080) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(8, getObject()); + } + if (((bitField0_ & 0x00000100) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(9, getArray()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Expr)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Expr other = (com.mysql.cj.x.protobuf.MysqlxExpr.Expr) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasIdentifier() != other.hasIdentifier()) return false; + if (hasIdentifier()) { + if (!getIdentifier() + .equals(other.getIdentifier())) return false; + } + if (hasVariable() != other.hasVariable()) return false; + if (hasVariable()) { + if (!getVariable() + .equals(other.getVariable())) return false; + } + if (hasLiteral() != other.hasLiteral()) return false; + if (hasLiteral()) { + if (!getLiteral() + .equals(other.getLiteral())) return false; + } + if (hasFunctionCall() != other.hasFunctionCall()) return false; + if (hasFunctionCall()) { + if (!getFunctionCall() + .equals(other.getFunctionCall())) return false; + } + if (hasOperator() != other.hasOperator()) return false; + if (hasOperator()) { + if (!getOperator() + .equals(other.getOperator())) return false; + } + if (hasPosition() != other.hasPosition()) return false; + if (hasPosition()) { + if (getPosition() + != other.getPosition()) return false; + } + if (hasObject() != other.hasObject()) return false; + if (hasObject()) { + if (!getObject() + .equals(other.getObject())) return false; + } + if (hasArray() != other.hasArray()) return false; + if (hasArray()) { + if (!getArray() + .equals(other.getArray())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasIdentifier()) { + hash = (37 * hash) + IDENTIFIER_FIELD_NUMBER; + hash = (53 * hash) + getIdentifier().hashCode(); + } + if (hasVariable()) { + hash = (37 * hash) + VARIABLE_FIELD_NUMBER; + hash = (53 * hash) + getVariable().hashCode(); + } + if (hasLiteral()) { + hash = (37 * hash) + LITERAL_FIELD_NUMBER; + hash = (53 * hash) + getLiteral().hashCode(); + } + if (hasFunctionCall()) { + hash = (37 * hash) + FUNCTION_CALL_FIELD_NUMBER; + hash = (53 * hash) + getFunctionCall().hashCode(); + } + if (hasOperator()) { + hash = (37 * hash) + OPERATOR_FIELD_NUMBER; + hash = (53 * hash) + getOperator().hashCode(); + } + if (hasPosition()) { + hash = (37 * hash) + POSITION_FIELD_NUMBER; + hash = (53 * hash) + getPosition(); + } + if (hasObject()) { + hash = (37 * hash) + OBJECT_FIELD_NUMBER; + hash = (53 * hash) + getObject().hashCode(); + } + if (hasArray()) { + hash = (37 * hash) + ARRAY_FIELD_NUMBER; + hash = (53 * hash) + getArray().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Expr prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *The "root" of the expression tree.
    +     *If expression type is PLACEHOLDER, then it refers to the value
    +     *of a parameter specified when executing a statement (see args
    +     *field of StmtExecute command). Field position (which must be
    +     *present for such an expression) gives 0-based position of the
    +     *parameter in the parameter list.
    +     *@par production list
    +     *@code{unparsed}
    +     *expr: operator |
    +     *: identifier |
    +     *: function_call |
    +     *: variable |
    +     *: literal |
    +     *: object |
    +     *: array |
    +     *: placeholder
    +     *@endcode
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.Expr} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Expr) + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Expr_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Expr_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.class, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getIdentifierFieldBuilder(); + getLiteralFieldBuilder(); + getFunctionCallFieldBuilder(); + getOperatorFieldBuilder(); + getObjectFieldBuilder(); + getArrayFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + if (identifierBuilder_ == null) { + identifier_ = null; + } else { + identifierBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + variable_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + if (literalBuilder_ == null) { + literal_ = null; + } else { + literalBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (functionCallBuilder_ == null) { + functionCall_ = null; + } else { + functionCallBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (operatorBuilder_ == null) { + operator_ = null; + } else { + operatorBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + position_ = 0; + bitField0_ = (bitField0_ & ~0x00000040); + if (objectBuilder_ == null) { + object_ = null; + } else { + objectBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + if (arrayBuilder_ == null) { + array_ = null; + } else { + arrayBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Expr_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr result = new com.mysql.cj.x.protobuf.MysqlxExpr.Expr(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (identifierBuilder_ == null) { + result.identifier_ = identifier_; + } else { + result.identifier_ = identifierBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.variable_ = variable_; + if (((from_bitField0_ & 0x00000008) != 0)) { + if (literalBuilder_ == null) { + result.literal_ = literal_; + } else { + result.literal_ = literalBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + if (functionCallBuilder_ == null) { + result.functionCall_ = functionCall_; + } else { + result.functionCall_ = functionCallBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + if (operatorBuilder_ == null) { + result.operator_ = operator_; + } else { + result.operator_ = operatorBuilder_.build(); + } + to_bitField0_ |= 0x00000020; + } + if (((from_bitField0_ & 0x00000040) != 0)) { + result.position_ = position_; + to_bitField0_ |= 0x00000040; + } + if (((from_bitField0_ & 0x00000080) != 0)) { + if (objectBuilder_ == null) { + result.object_ = object_; + } else { + result.object_ = objectBuilder_.build(); + } + to_bitField0_ |= 0x00000080; + } + if (((from_bitField0_ & 0x00000100) != 0)) { + if (arrayBuilder_ == null) { + result.array_ = array_; + } else { + result.array_ = arrayBuilder_.build(); + } + to_bitField0_ |= 0x00000100; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Expr) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Expr)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Expr other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasIdentifier()) { + mergeIdentifier(other.getIdentifier()); + } + if (other.hasVariable()) { + bitField0_ |= 0x00000004; + variable_ = other.variable_; + onChanged(); + } + if (other.hasLiteral()) { + mergeLiteral(other.getLiteral()); + } + if (other.hasFunctionCall()) { + mergeFunctionCall(other.getFunctionCall()); + } + if (other.hasOperator()) { + mergeOperator(other.getOperator()); + } + if (other.hasPosition()) { + setPosition(other.getPosition()); + } + if (other.hasObject()) { + mergeObject(other.getObject()); + } + if (other.hasArray()) { + mergeArray(other.getArray()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + if (hasIdentifier()) { + if (!getIdentifier().isInitialized()) { + return false; + } + } + if (hasLiteral()) { + if (!getLiteral().isInitialized()) { + return false; + } + } + if (hasFunctionCall()) { + if (!getFunctionCall().isInitialized()) { + return false; + } + } + if (hasOperator()) { + if (!getOperator().isInitialized()) { + return false; + } + } + if (hasObject()) { + if (!getObject().isInitialized()) { + return false; + } + } + if (hasArray()) { + if (!getArray().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Expr) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 1; + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type result = com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type.IDENT : result; + } + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Expr.Expr.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier identifier_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder> identifierBuilder_; + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return Whether the identifier field is set. + */ + public boolean hasIdentifier() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + * @return The identifier. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getIdentifier() { + if (identifierBuilder_ == null) { + return identifier_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : identifier_; + } else { + return identifierBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public Builder setIdentifier(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier value) { + if (identifierBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + identifier_ = value; + onChanged(); + } else { + identifierBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public Builder setIdentifier( + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder builderForValue) { + if (identifierBuilder_ == null) { + identifier_ = builderForValue.build(); + onChanged(); + } else { + identifierBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public Builder mergeIdentifier(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier value) { + if (identifierBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + identifier_ != null && + identifier_ != com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance()) { + identifier_ = + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.newBuilder(identifier_).mergeFrom(value).buildPartial(); + } else { + identifier_ = value; + } + onChanged(); + } else { + identifierBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public Builder clearIdentifier() { + if (identifierBuilder_ == null) { + identifier_ = null; + onChanged(); + } else { + identifierBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder getIdentifierBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getIdentifierFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder getIdentifierOrBuilder() { + if (identifierBuilder_ != null) { + return identifierBuilder_.getMessageOrBuilder(); + } else { + return identifier_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance() : identifier_; + } + } + /** + * optional .Mysqlx.Expr.ColumnIdentifier identifier = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder> + getIdentifierFieldBuilder() { + if (identifierBuilder_ == null) { + identifierBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder>( + getIdentifier(), + getParentForChildren(), + isClean()); + identifier_ = null; + } + return identifierBuilder_; + } + + private java.lang.Object variable_ = ""; + /** + * optional string variable = 3; + * @return Whether the variable field is set. + */ + public boolean hasVariable() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional string variable = 3; + * @return The variable. + */ + public java.lang.String getVariable() { + java.lang.Object ref = variable_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + variable_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string variable = 3; + * @return The bytes for variable. + */ + public com.google.protobuf.ByteString + getVariableBytes() { + java.lang.Object ref = variable_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + variable_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string variable = 3; + * @param value The variable to set. + * @return This builder for chaining. + */ + public Builder setVariable( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + variable_ = value; + onChanged(); + return this; + } + /** + * optional string variable = 3; + * @return This builder for chaining. + */ + public Builder clearVariable() { + bitField0_ = (bitField0_ & ~0x00000004); + variable_ = getDefaultInstance().getVariable(); + onChanged(); + return this; + } + /** + * optional string variable = 3; + * @param value The bytes for variable to set. + * @return This builder for chaining. + */ + public Builder setVariableBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + variable_ = value; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar literal_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> literalBuilder_; + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return Whether the literal field is set. + */ + public boolean hasLiteral() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + * @return The literal. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getLiteral() { + if (literalBuilder_ == null) { + return literal_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : literal_; + } else { + return literalBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public Builder setLiteral(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (literalBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + literal_ = value; + onChanged(); + } else { + literalBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public Builder setLiteral( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (literalBuilder_ == null) { + literal_ = builderForValue.build(); + onChanged(); + } else { + literalBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public Builder mergeLiteral(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (literalBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + literal_ != null && + literal_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()) { + literal_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.newBuilder(literal_).mergeFrom(value).buildPartial(); + } else { + literal_ = value; + } + onChanged(); + } else { + literalBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public Builder clearLiteral() { + if (literalBuilder_ == null) { + literal_ = null; + onChanged(); + } else { + literalBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getLiteralBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getLiteralFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getLiteralOrBuilder() { + if (literalBuilder_ != null) { + return literalBuilder_.getMessageOrBuilder(); + } else { + return literal_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : literal_; + } + } + /** + * optional .Mysqlx.Datatypes.Scalar literal = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getLiteralFieldBuilder() { + if (literalBuilder_ == null) { + literalBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + getLiteral(), + getParentForChildren(), + isClean()); + literal_ = null; + } + return literalBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall functionCall_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder> functionCallBuilder_; + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return Whether the functionCall field is set. + */ + public boolean hasFunctionCall() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + * @return The functionCall. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getFunctionCall() { + if (functionCallBuilder_ == null) { + return functionCall_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance() : functionCall_; + } else { + return functionCallBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public Builder setFunctionCall(com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall value) { + if (functionCallBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + functionCall_ = value; + onChanged(); + } else { + functionCallBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public Builder setFunctionCall( + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder builderForValue) { + if (functionCallBuilder_ == null) { + functionCall_ = builderForValue.build(); + onChanged(); + } else { + functionCallBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public Builder mergeFunctionCall(com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall value) { + if (functionCallBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) && + functionCall_ != null && + functionCall_ != com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance()) { + functionCall_ = + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.newBuilder(functionCall_).mergeFrom(value).buildPartial(); + } else { + functionCall_ = value; + } + onChanged(); + } else { + functionCallBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public Builder clearFunctionCall() { + if (functionCallBuilder_ == null) { + functionCall_ = null; + onChanged(); + } else { + functionCallBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder getFunctionCallBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getFunctionCallFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder getFunctionCallOrBuilder() { + if (functionCallBuilder_ != null) { + return functionCallBuilder_.getMessageOrBuilder(); + } else { + return functionCall_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance() : functionCall_; + } + } + /** + * optional .Mysqlx.Expr.FunctionCall function_call = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder> + getFunctionCallFieldBuilder() { + if (functionCallBuilder_ == null) { + functionCallBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder>( + getFunctionCall(), + getParentForChildren(), + isClean()); + functionCall_ = null; + } + return functionCallBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Operator operator_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Operator, com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder> operatorBuilder_; + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return Whether the operator field is set. + */ + public boolean hasOperator() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + * @return The operator. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator getOperator() { + if (operatorBuilder_ == null) { + return operator_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance() : operator_; + } else { + return operatorBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public Builder setOperator(com.mysql.cj.x.protobuf.MysqlxExpr.Operator value) { + if (operatorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + operator_ = value; + onChanged(); + } else { + operatorBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public Builder setOperator( + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder builderForValue) { + if (operatorBuilder_ == null) { + operator_ = builderForValue.build(); + onChanged(); + } else { + operatorBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public Builder mergeOperator(com.mysql.cj.x.protobuf.MysqlxExpr.Operator value) { + if (operatorBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0) && + operator_ != null && + operator_ != com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance()) { + operator_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.newBuilder(operator_).mergeFrom(value).buildPartial(); + } else { + operator_ = value; + } + onChanged(); + } else { + operatorBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public Builder clearOperator() { + if (operatorBuilder_ == null) { + operator_ = null; + onChanged(); + } else { + operatorBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder getOperatorBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getOperatorFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder getOperatorOrBuilder() { + if (operatorBuilder_ != null) { + return operatorBuilder_.getMessageOrBuilder(); + } else { + return operator_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance() : operator_; + } + } + /** + * optional .Mysqlx.Expr.Operator operator = 6; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Operator, com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder> + getOperatorFieldBuilder() { + if (operatorBuilder_ == null) { + operatorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Operator, com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder>( + getOperator(), + getParentForChildren(), + isClean()); + operator_ = null; + } + return operatorBuilder_; + } + + private int position_ ; + /** + * optional uint32 position = 7; + * @return Whether the position field is set. + */ + @java.lang.Override + public boolean hasPosition() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional uint32 position = 7; + * @return The position. + */ + @java.lang.Override + public int getPosition() { + return position_; + } + /** + * optional uint32 position = 7; + * @param value The position to set. + * @return This builder for chaining. + */ + public Builder setPosition(int value) { + bitField0_ |= 0x00000040; + position_ = value; + onChanged(); + return this; + } + /** + * optional uint32 position = 7; + * @return This builder for chaining. + */ + public Builder clearPosition() { + bitField0_ = (bitField0_ & ~0x00000040); + position_ = 0; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Object object_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object, com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder> objectBuilder_; + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return Whether the object field is set. + */ + public boolean hasObject() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional .Mysqlx.Expr.Object object = 8; + * @return The object. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object getObject() { + if (objectBuilder_ == null) { + return object_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance() : object_; + } else { + return objectBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public Builder setObject(com.mysql.cj.x.protobuf.MysqlxExpr.Object value) { + if (objectBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + object_ = value; + onChanged(); + } else { + objectBuilder_.setMessage(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public Builder setObject( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder builderForValue) { + if (objectBuilder_ == null) { + object_ = builderForValue.build(); + onChanged(); + } else { + objectBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public Builder mergeObject(com.mysql.cj.x.protobuf.MysqlxExpr.Object value) { + if (objectBuilder_ == null) { + if (((bitField0_ & 0x00000080) != 0) && + object_ != null && + object_ != com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance()) { + object_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Object.newBuilder(object_).mergeFrom(value).buildPartial(); + } else { + object_ = value; + } + onChanged(); + } else { + objectBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000080; + return this; + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public Builder clearObject() { + if (objectBuilder_ == null) { + object_ = null; + onChanged(); + } else { + objectBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000080); + return this; + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder getObjectBuilder() { + bitField0_ |= 0x00000080; + onChanged(); + return getObjectFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder getObjectOrBuilder() { + if (objectBuilder_ != null) { + return objectBuilder_.getMessageOrBuilder(); + } else { + return object_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance() : object_; + } + } + /** + * optional .Mysqlx.Expr.Object object = 8; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object, com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder> + getObjectFieldBuilder() { + if (objectBuilder_ == null) { + objectBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object, com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder>( + getObject(), + getParentForChildren(), + isClean()); + object_ = null; + } + return objectBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Array array_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Array, com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder> arrayBuilder_; + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return Whether the array field is set. + */ + public boolean hasArray() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + * optional .Mysqlx.Expr.Array array = 9; + * @return The array. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Array getArray() { + if (arrayBuilder_ == null) { + return array_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance() : array_; + } else { + return arrayBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public Builder setArray(com.mysql.cj.x.protobuf.MysqlxExpr.Array value) { + if (arrayBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + array_ = value; + onChanged(); + } else { + arrayBuilder_.setMessage(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public Builder setArray( + com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder builderForValue) { + if (arrayBuilder_ == null) { + array_ = builderForValue.build(); + onChanged(); + } else { + arrayBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public Builder mergeArray(com.mysql.cj.x.protobuf.MysqlxExpr.Array value) { + if (arrayBuilder_ == null) { + if (((bitField0_ & 0x00000100) != 0) && + array_ != null && + array_ != com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance()) { + array_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Array.newBuilder(array_).mergeFrom(value).buildPartial(); + } else { + array_ = value; + } + onChanged(); + } else { + arrayBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000100; + return this; + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public Builder clearArray() { + if (arrayBuilder_ == null) { + array_ = null; + onChanged(); + } else { + arrayBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000100); + return this; + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder getArrayBuilder() { + bitField0_ |= 0x00000100; + onChanged(); + return getArrayFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder getArrayOrBuilder() { + if (arrayBuilder_ != null) { + return arrayBuilder_.getMessageOrBuilder(); + } else { + return array_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance() : array_; + } + } + /** + * optional .Mysqlx.Expr.Array array = 9; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Array, com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder> + getArrayFieldBuilder() { + if (arrayBuilder_ == null) { + arrayBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Array, com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder>( + getArray(), + getParentForChildren(), + isClean()); + array_ = null; + } + return arrayBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Expr) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Expr) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Expr DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Expr(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Expr getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Expr parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Expr(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface IdentifierOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Identifier) + com.google.protobuf.MessageOrBuilder { + + /** + * required string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + * required string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + * required string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + * optional string schema_name = 2; + * @return Whether the schemaName field is set. + */ + boolean hasSchemaName(); + /** + * optional string schema_name = 2; + * @return The schemaName. + */ + java.lang.String getSchemaName(); + /** + * optional string schema_name = 2; + * @return The bytes for schemaName. + */ + com.google.protobuf.ByteString + getSchemaNameBytes(); + } + /** + *
    +   **
    +   *Identifier: name, schame.name
    +   *@par production list
    +   *@code{unparsed}
    +   *identifier: string "." string |
    +   *: string
    +   *@endcode
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.Identifier} + */ + public static final class Identifier extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Identifier) + IdentifierOrBuilder { + private static final long serialVersionUID = 0L; + // Use Identifier.newBuilder() to construct. + private Identifier(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Identifier() { + name_ = ""; + schemaName_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Identifier(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Identifier( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + schemaName_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Identifier_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Identifier_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.class, com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SCHEMA_NAME_FIELD_NUMBER = 2; + private volatile java.lang.Object schemaName_; + /** + * optional string schema_name = 2; + * @return Whether the schemaName field is set. + */ + @java.lang.Override + public boolean hasSchemaName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string schema_name = 2; + * @return The schemaName. + */ + @java.lang.Override + public java.lang.String getSchemaName() { + java.lang.Object ref = schemaName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schemaName_ = s; + } + return s; + } + } + /** + * optional string schema_name = 2; + * @return The bytes for schemaName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSchemaNameBytes() { + java.lang.Object ref = schemaName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schemaName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, schemaName_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, schemaName_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Identifier)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier other = (com.mysql.cj.x.protobuf.MysqlxExpr.Identifier) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasSchemaName() != other.hasSchemaName()) return false; + if (hasSchemaName()) { + if (!getSchemaName() + .equals(other.getSchemaName())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasSchemaName()) { + hash = (37 * hash) + SCHEMA_NAME_FIELD_NUMBER; + hash = (53 * hash) + getSchemaName().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Identifier prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Identifier: name, schame.name
    +     *@par production list
    +     *@code{unparsed}
    +     *identifier: string "." string |
    +     *: string
    +     *@endcode
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.Identifier} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Identifier) + com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Identifier_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Identifier_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.class, com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + schemaName_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Identifier_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier result = new com.mysql.cj.x.protobuf.MysqlxExpr.Identifier(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.schemaName_ = schemaName_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Identifier) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Identifier)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Identifier other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (other.hasSchemaName()) { + bitField0_ |= 0x00000002; + schemaName_ = other.schemaName_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Identifier) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * required string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object schemaName_ = ""; + /** + * optional string schema_name = 2; + * @return Whether the schemaName field is set. + */ + public boolean hasSchemaName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string schema_name = 2; + * @return The schemaName. + */ + public java.lang.String getSchemaName() { + java.lang.Object ref = schemaName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schemaName_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string schema_name = 2; + * @return The bytes for schemaName. + */ + public com.google.protobuf.ByteString + getSchemaNameBytes() { + java.lang.Object ref = schemaName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schemaName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string schema_name = 2; + * @param value The schemaName to set. + * @return This builder for chaining. + */ + public Builder setSchemaName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + schemaName_ = value; + onChanged(); + return this; + } + /** + * optional string schema_name = 2; + * @return This builder for chaining. + */ + public Builder clearSchemaName() { + bitField0_ = (bitField0_ & ~0x00000002); + schemaName_ = getDefaultInstance().getSchemaName(); + onChanged(); + return this; + } + /** + * optional string schema_name = 2; + * @param value The bytes for schemaName to set. + * @return This builder for chaining. + */ + public Builder setSchemaNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + schemaName_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Identifier) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Identifier) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Identifier DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Identifier(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Identifier parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Identifier(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface DocumentPathItemOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.DocumentPathItem) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type getType(); + + /** + * optional string value = 2; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + * optional string value = 2; + * @return The value. + */ + java.lang.String getValue(); + /** + * optional string value = 2; + * @return The bytes for value. + */ + com.google.protobuf.ByteString + getValueBytes(); + + /** + *
    +     ** used in case of ARRY_INDEX 
    +     * 
    + * + * optional uint32 index = 3; + * @return Whether the index field is set. + */ + boolean hasIndex(); + /** + *
    +     ** used in case of ARRY_INDEX 
    +     * 
    + * + * optional uint32 index = 3; + * @return The index. + */ + int getIndex(); + } + /** + *
    +   **
    +   *Document path item
    +   *@par production list
    +   *@code{unparsed}
    +   *document_path: path_item | path_item document_path
    +   *path_item    : member | array_index | "**"
    +   *member       : "." string | "." "*"
    +   *array_index  : "[" number "]" | "[" "*" "]"
    +   *@endcode
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.DocumentPathItem} + */ + public static final class DocumentPathItem extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.DocumentPathItem) + DocumentPathItemOrBuilder { + private static final long serialVersionUID = 0L; + // Use DocumentPathItem.newBuilder() to construct. + private DocumentPathItem(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private DocumentPathItem() { + type_ = 1; + value_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new DocumentPathItem(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private DocumentPathItem( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type value = com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + value_ = bs; + break; + } + case 24: { + bitField0_ |= 0x00000004; + index_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_DocumentPathItem_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_DocumentPathItem_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.class, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Expr.DocumentPathItem.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + *
    +       **  .member 
    +       * 
    + * + * MEMBER = 1; + */ + MEMBER(1), + /** + *
    +       ** \.* 
    +       * 
    + * + * MEMBER_ASTERISK = 2; + */ + MEMBER_ASTERISK(2), + /** + *
    +       ** [index] 
    +       * 
    + * + * ARRAY_INDEX = 3; + */ + ARRAY_INDEX(3), + /** + *
    +       ** [*] 
    +       * 
    + * + * ARRAY_INDEX_ASTERISK = 4; + */ + ARRAY_INDEX_ASTERISK(4), + /** + *
    +       ** ** 
    +       * 
    + * + * DOUBLE_ASTERISK = 5; + */ + DOUBLE_ASTERISK(5), + ; + + /** + *
    +       **  .member 
    +       * 
    + * + * MEMBER = 1; + */ + public static final int MEMBER_VALUE = 1; + /** + *
    +       ** \.* 
    +       * 
    + * + * MEMBER_ASTERISK = 2; + */ + public static final int MEMBER_ASTERISK_VALUE = 2; + /** + *
    +       ** [index] 
    +       * 
    + * + * ARRAY_INDEX = 3; + */ + public static final int ARRAY_INDEX_VALUE = 3; + /** + *
    +       ** [*] 
    +       * 
    + * + * ARRAY_INDEX_ASTERISK = 4; + */ + public static final int ARRAY_INDEX_ASTERISK_VALUE = 4; + /** + *
    +       ** ** 
    +       * 
    + * + * DOUBLE_ASTERISK = 5; + */ + public static final int DOUBLE_ASTERISK_VALUE = 5; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return MEMBER; + case 2: return MEMBER_ASTERISK; + case 3: return ARRAY_INDEX; + case 4: return ARRAY_INDEX_ASTERISK; + case 5: return DOUBLE_ASTERISK; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Expr.DocumentPathItem.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type result = com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type.MEMBER : result; + } + + public static final int VALUE_FIELD_NUMBER = 2; + private volatile java.lang.Object value_; + /** + * optional string value = 2; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string value = 2; + * @return The value. + */ + @java.lang.Override + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } + } + /** + * optional string value = 2; + * @return The bytes for value. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int INDEX_FIELD_NUMBER = 3; + private int index_; + /** + *
    +     ** used in case of ARRY_INDEX 
    +     * 
    + * + * optional uint32 index = 3; + * @return Whether the index field is set. + */ + @java.lang.Override + public boolean hasIndex() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** used in case of ARRY_INDEX 
    +     * 
    + * + * optional uint32 index = 3; + * @return The index. + */ + @java.lang.Override + public int getIndex() { + return index_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, value_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeUInt32(3, index_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, value_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, index_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem other = (com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (hasIndex() != other.hasIndex()) return false; + if (hasIndex()) { + if (getIndex() + != other.getIndex()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + if (hasIndex()) { + hash = (37 * hash) + INDEX_FIELD_NUMBER; + hash = (53 * hash) + getIndex(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Document path item
    +     *@par production list
    +     *@code{unparsed}
    +     *document_path: path_item | path_item document_path
    +     *path_item    : member | array_index | "**"
    +     *member       : "." string | "." "*"
    +     *array_index  : "[" number "]" | "[" "*" "]"
    +     *@endcode
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.DocumentPathItem} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.DocumentPathItem) + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_DocumentPathItem_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_DocumentPathItem_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.class, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + value_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + index_ = 0; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_DocumentPathItem_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem build() { + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem result = new com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.value_ = value_; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.index_ = index_; + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasValue()) { + bitField0_ |= 0x00000002; + value_ = other.value_; + onChanged(); + } + if (other.hasIndex()) { + setIndex(other.getIndex()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 1; + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type result = com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type.MEMBER : result; + } + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Expr.DocumentPathItem.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + onChanged(); + return this; + } + + private java.lang.Object value_ = ""; + /** + * optional string value = 2; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional string value = 2; + * @return The value. + */ + public java.lang.String getValue() { + java.lang.Object ref = value_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + value_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string value = 2; + * @return The bytes for value. + */ + public com.google.protobuf.ByteString + getValueBytes() { + java.lang.Object ref = value_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + value_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string value = 2; + * @param value The value to set. + * @return This builder for chaining. + */ + public Builder setValue( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + /** + * optional string value = 2; + * @return This builder for chaining. + */ + public Builder clearValue() { + bitField0_ = (bitField0_ & ~0x00000002); + value_ = getDefaultInstance().getValue(); + onChanged(); + return this; + } + /** + * optional string value = 2; + * @param value The bytes for value to set. + * @return This builder for chaining. + */ + public Builder setValueBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + value_ = value; + onChanged(); + return this; + } + + private int index_ ; + /** + *
    +       ** used in case of ARRY_INDEX 
    +       * 
    + * + * optional uint32 index = 3; + * @return Whether the index field is set. + */ + @java.lang.Override + public boolean hasIndex() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** used in case of ARRY_INDEX 
    +       * 
    + * + * optional uint32 index = 3; + * @return The index. + */ + @java.lang.Override + public int getIndex() { + return index_; + } + /** + *
    +       ** used in case of ARRY_INDEX 
    +       * 
    + * + * optional uint32 index = 3; + * @param value The index to set. + * @return This builder for chaining. + */ + public Builder setIndex(int value) { + bitField0_ |= 0x00000004; + index_ = value; + onChanged(); + return this; + } + /** + *
    +       ** used in case of ARRY_INDEX 
    +       * 
    + * + * optional uint32 index = 3; + * @return This builder for chaining. + */ + public Builder clearIndex() { + bitField0_ = (bitField0_ & ~0x00000004); + index_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.DocumentPathItem) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.DocumentPathItem) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public DocumentPathItem parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new DocumentPathItem(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ColumnIdentifierOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.ColumnIdentifier) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + java.util.List + getDocumentPathList(); + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index); + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + int getDocumentPathCount(); + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + java.util.List + getDocumentPathOrBuilderList(); + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index); + + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return The name. + */ + java.lang.String getName(); + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return Whether the tableName field is set. + */ + boolean hasTableName(); + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return The tableName. + */ + java.lang.String getTableName(); + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return The bytes for tableName. + */ + com.google.protobuf.ByteString + getTableNameBytes(); + + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return Whether the schemaName field is set. + */ + boolean hasSchemaName(); + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return The schemaName. + */ + java.lang.String getSchemaName(); + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return The bytes for schemaName. + */ + com.google.protobuf.ByteString + getSchemaNameBytes(); + } + /** + *
    +   **
    +   *Column identifier
    +   *for table: col\@doc_path, tbl.col\@doc_path col, tbl.col, schema.tbl.col
    +   *for document collection: doc_path
    +   * //
    +   *@par production list
    +   *@code{unparsed}
    +   *col_identifier: string "." string "." string |
    +   *: string "." string |
    +   *: string |
    +   *: string "." string "." string "@" document_path |
    +   *: string "." string "@" document_path |
    +   *: string "@" document_path |
    +   *: document_path
    +   *document_path: member | arrayLocation | doubleAsterisk
    +   *member = "." string | "." "*"
    +   *arrayLocation = "[" index "]" | "[" "*" "]"
    +   *doubleAsterisk = "**"
    +   *@endcode
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.ColumnIdentifier} + */ + public static final class ColumnIdentifier extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.ColumnIdentifier) + ColumnIdentifierOrBuilder { + private static final long serialVersionUID = 0L; + // Use ColumnIdentifier.newBuilder() to construct. + private ColumnIdentifier(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ColumnIdentifier() { + documentPath_ = java.util.Collections.emptyList(); + name_ = ""; + tableName_ = ""; + schemaName_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ColumnIdentifier(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ColumnIdentifier( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + documentPath_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + documentPath_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.PARSER, extensionRegistry)); + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + tableName_ = bs; + break; + } + case 34: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + schemaName_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + documentPath_ = java.util.Collections.unmodifiableList(documentPath_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_ColumnIdentifier_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.class, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder.class); + } + + private int bitField0_; + public static final int DOCUMENT_PATH_FIELD_NUMBER = 1; + private java.util.List documentPath_; + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + @java.lang.Override + public java.util.List getDocumentPathList() { + return documentPath_; + } + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + @java.lang.Override + public java.util.List + getDocumentPathOrBuilderList() { + return documentPath_; + } + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + @java.lang.Override + public int getDocumentPathCount() { + return documentPath_.size(); + } + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index) { + return documentPath_.get(index); + } + /** + *
    +     ** document path 
    +     * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index) { + return documentPath_.get(index); + } + + public static final int NAME_FIELD_NUMBER = 2; + private volatile java.lang.Object name_; + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + *
    +     ** name of column 
    +     * 
    + * + * optional string name = 2; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TABLE_NAME_FIELD_NUMBER = 3; + private volatile java.lang.Object tableName_; + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return Whether the tableName field is set. + */ + @java.lang.Override + public boolean hasTableName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return The tableName. + */ + @java.lang.Override + public java.lang.String getTableName() { + java.lang.Object ref = tableName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + tableName_ = s; + } + return s; + } + } + /** + *
    +     ** name of table 
    +     * 
    + * + * optional string table_name = 3; + * @return The bytes for tableName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTableNameBytes() { + java.lang.Object ref = tableName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + tableName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SCHEMA_NAME_FIELD_NUMBER = 4; + private volatile java.lang.Object schemaName_; + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return Whether the schemaName field is set. + */ + @java.lang.Override + public boolean hasSchemaName() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return The schemaName. + */ + @java.lang.Override + public java.lang.String getSchemaName() { + java.lang.Object ref = schemaName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schemaName_ = s; + } + return s; + } + } + /** + *
    +     ** name of schema 
    +     * 
    + * + * optional string schema_name = 4; + * @return The bytes for schemaName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSchemaNameBytes() { + java.lang.Object ref = schemaName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schemaName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getDocumentPathCount(); i++) { + if (!getDocumentPath(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < documentPath_.size(); i++) { + output.writeMessage(1, documentPath_.get(i)); + } + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, tableName_); + } + if (((bitField0_ & 0x00000004) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, schemaName_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < documentPath_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, documentPath_.get(i)); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, tableName_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, schemaName_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier other = (com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier) obj; + + if (!getDocumentPathList() + .equals(other.getDocumentPathList())) return false; + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasTableName() != other.hasTableName()) return false; + if (hasTableName()) { + if (!getTableName() + .equals(other.getTableName())) return false; + } + if (hasSchemaName() != other.hasSchemaName()) return false; + if (hasSchemaName()) { + if (!getSchemaName() + .equals(other.getSchemaName())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getDocumentPathCount() > 0) { + hash = (37 * hash) + DOCUMENT_PATH_FIELD_NUMBER; + hash = (53 * hash) + getDocumentPathList().hashCode(); + } + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasTableName()) { + hash = (37 * hash) + TABLE_NAME_FIELD_NUMBER; + hash = (53 * hash) + getTableName().hashCode(); + } + if (hasSchemaName()) { + hash = (37 * hash) + SCHEMA_NAME_FIELD_NUMBER; + hash = (53 * hash) + getSchemaName().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Column identifier
    +     *for table: col\@doc_path, tbl.col\@doc_path col, tbl.col, schema.tbl.col
    +     *for document collection: doc_path
    +     * //
    +     *@par production list
    +     *@code{unparsed}
    +     *col_identifier: string "." string "." string |
    +     *: string "." string |
    +     *: string |
    +     *: string "." string "." string "@" document_path |
    +     *: string "." string "@" document_path |
    +     *: string "@" document_path |
    +     *: document_path
    +     *document_path: member | arrayLocation | doubleAsterisk
    +     *member = "." string | "." "*"
    +     *arrayLocation = "[" index "]" | "[" "*" "]"
    +     *doubleAsterisk = "**"
    +     *@endcode
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.ColumnIdentifier} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.ColumnIdentifier) + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifierOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_ColumnIdentifier_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.class, com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getDocumentPathFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (documentPathBuilder_ == null) { + documentPath_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + documentPathBuilder_.clear(); + } + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + tableName_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + schemaName_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier build() { + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier result = new com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (documentPathBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + documentPath_ = java.util.Collections.unmodifiableList(documentPath_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.documentPath_ = documentPath_; + } else { + result.documentPath_ = documentPathBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.tableName_ = tableName_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.schemaName_ = schemaName_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier.getDefaultInstance()) return this; + if (documentPathBuilder_ == null) { + if (!other.documentPath_.isEmpty()) { + if (documentPath_.isEmpty()) { + documentPath_ = other.documentPath_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureDocumentPathIsMutable(); + documentPath_.addAll(other.documentPath_); + } + onChanged(); + } + } else { + if (!other.documentPath_.isEmpty()) { + if (documentPathBuilder_.isEmpty()) { + documentPathBuilder_.dispose(); + documentPathBuilder_ = null; + documentPath_ = other.documentPath_; + bitField0_ = (bitField0_ & ~0x00000001); + documentPathBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getDocumentPathFieldBuilder() : null; + } else { + documentPathBuilder_.addAllMessages(other.documentPath_); + } + } + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + if (other.hasTableName()) { + bitField0_ |= 0x00000004; + tableName_ = other.tableName_; + onChanged(); + } + if (other.hasSchemaName()) { + bitField0_ |= 0x00000008; + schemaName_ = other.schemaName_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getDocumentPathCount(); i++) { + if (!getDocumentPath(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List documentPath_ = + java.util.Collections.emptyList(); + private void ensureDocumentPathIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + documentPath_ = new java.util.ArrayList(documentPath_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder> documentPathBuilder_; + + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public java.util.List getDocumentPathList() { + if (documentPathBuilder_ == null) { + return java.util.Collections.unmodifiableList(documentPath_); + } else { + return documentPathBuilder_.getMessageList(); + } + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public int getDocumentPathCount() { + if (documentPathBuilder_ == null) { + return documentPath_.size(); + } else { + return documentPathBuilder_.getCount(); + } + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem getDocumentPath(int index) { + if (documentPathBuilder_ == null) { + return documentPath_.get(index); + } else { + return documentPathBuilder_.getMessage(index); + } + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder setDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.set(index, value); + onChanged(); + } else { + documentPathBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder setDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.set(index, builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder addDocumentPath(com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.add(value); + onChanged(); + } else { + documentPathBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder addDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem value) { + if (documentPathBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureDocumentPathIsMutable(); + documentPath_.add(index, value); + onChanged(); + } else { + documentPathBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder addDocumentPath( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.add(builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder addDocumentPath( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder builderForValue) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.add(index, builderForValue.build()); + onChanged(); + } else { + documentPathBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder addAllDocumentPath( + java.lang.Iterable values) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, documentPath_); + onChanged(); + } else { + documentPathBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder clearDocumentPath() { + if (documentPathBuilder_ == null) { + documentPath_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + documentPathBuilder_.clear(); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public Builder removeDocumentPath(int index) { + if (documentPathBuilder_ == null) { + ensureDocumentPathIsMutable(); + documentPath_.remove(index); + onChanged(); + } else { + documentPathBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder getDocumentPathBuilder( + int index) { + return getDocumentPathFieldBuilder().getBuilder(index); + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder getDocumentPathOrBuilder( + int index) { + if (documentPathBuilder_ == null) { + return documentPath_.get(index); } else { + return documentPathBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public java.util.List + getDocumentPathOrBuilderList() { + if (documentPathBuilder_ != null) { + return documentPathBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(documentPath_); + } + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder addDocumentPathBuilder() { + return getDocumentPathFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance()); + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder addDocumentPathBuilder( + int index) { + return getDocumentPathFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.getDefaultInstance()); + } + /** + *
    +       ** document path 
    +       * 
    + * + * repeated .Mysqlx.Expr.DocumentPathItem document_path = 1; + */ + public java.util.List + getDocumentPathBuilderList() { + return getDocumentPathFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder> + getDocumentPathFieldBuilder() { + if (documentPathBuilder_ == null) { + documentPathBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItem.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.DocumentPathItemOrBuilder>( + documentPath_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + documentPath_ = null; + } + return documentPathBuilder_; + } + + private java.lang.Object name_ = ""; + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + *
    +       ** name of column 
    +       * 
    + * + * optional string name = 2; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + private java.lang.Object tableName_ = ""; + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @return Whether the tableName field is set. + */ + public boolean hasTableName() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @return The tableName. + */ + public java.lang.String getTableName() { + java.lang.Object ref = tableName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + tableName_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @return The bytes for tableName. + */ + public com.google.protobuf.ByteString + getTableNameBytes() { + java.lang.Object ref = tableName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + tableName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @param value The tableName to set. + * @return This builder for chaining. + */ + public Builder setTableName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + tableName_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @return This builder for chaining. + */ + public Builder clearTableName() { + bitField0_ = (bitField0_ & ~0x00000004); + tableName_ = getDefaultInstance().getTableName(); + onChanged(); + return this; + } + /** + *
    +       ** name of table 
    +       * 
    + * + * optional string table_name = 3; + * @param value The bytes for tableName to set. + * @return This builder for chaining. + */ + public Builder setTableNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + tableName_ = value; + onChanged(); + return this; + } + + private java.lang.Object schemaName_ = ""; + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @return Whether the schemaName field is set. + */ + public boolean hasSchemaName() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @return The schemaName. + */ + public java.lang.String getSchemaName() { + java.lang.Object ref = schemaName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + schemaName_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @return The bytes for schemaName. + */ + public com.google.protobuf.ByteString + getSchemaNameBytes() { + java.lang.Object ref = schemaName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + schemaName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @param value The schemaName to set. + * @return This builder for chaining. + */ + public Builder setSchemaName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + schemaName_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @return This builder for chaining. + */ + public Builder clearSchemaName() { + bitField0_ = (bitField0_ & ~0x00000008); + schemaName_ = getDefaultInstance().getSchemaName(); + onChanged(); + return this; + } + /** + *
    +       ** name of schema 
    +       * 
    + * + * optional string schema_name = 4; + * @param value The bytes for schemaName to set. + * @return This builder for chaining. + */ + public Builder setSchemaNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + schemaName_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.ColumnIdentifier) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.ColumnIdentifier) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ColumnIdentifier parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ColumnIdentifier(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FunctionCallOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.FunctionCall) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return The name. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getName(); + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder getNameOrBuilder(); + + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + java.util.List + getParamList(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + int getParamCount(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + java.util.List + getParamOrBuilderList(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index); + } + /** + *
    +   **
    +   *Function call: ``func(a, b, "1", 3)``
    +   *@par production list
    +   *@code{unparsed}
    +   *function_call: `identifier` "(" [ `expr` ["," `expr` ]* ] ")"
    +   *@endcode
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.FunctionCall} + */ + public static final class FunctionCall extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.FunctionCall) + FunctionCallOrBuilder { + private static final long serialVersionUID = 0L; + // Use FunctionCall.newBuilder() to construct. + private FunctionCall(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FunctionCall() { + param_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FunctionCall(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FunctionCall( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) != 0)) { + subBuilder = name_.toBuilder(); + } + name_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(name_); + name_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + param_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + param_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + param_ = java.util.Collections.unmodifiableList(param_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_FunctionCall_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_FunctionCall_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.class, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private com.mysql.cj.x.protobuf.MysqlxExpr.Identifier name_; + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return The name. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getName() { + return name_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance() : name_; + } + /** + *
    +     ** identifier of function; at least name of it 
    +     * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder getNameOrBuilder() { + return name_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance() : name_; + } + + public static final int PARAM_FIELD_NUMBER = 2; + private java.util.List param_; + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public java.util.List getParamList() { + return param_; + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public java.util.List + getParamOrBuilderList() { + return param_; + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public int getParamCount() { + return param_.size(); + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index) { + return param_.get(index); + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index) { + return param_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + if (!getName().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getParamCount(); i++) { + if (!getParam(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getName()); + } + for (int i = 0; i < param_.size(); i++) { + output.writeMessage(2, param_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getName()); + } + for (int i = 0; i < param_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, param_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall other = (com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (!getParamList() + .equals(other.getParamList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (getParamCount() > 0) { + hash = (37 * hash) + PARAM_FIELD_NUMBER; + hash = (53 * hash) + getParamList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Function call: ``func(a, b, "1", 3)``
    +     *@par production list
    +     *@code{unparsed}
    +     *function_call: `identifier` "(" [ `expr` ["," `expr` ]* ] ")"
    +     *@endcode
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.FunctionCall} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.FunctionCall) + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCallOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_FunctionCall_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_FunctionCall_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.class, com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getNameFieldBuilder(); + getParamFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (nameBuilder_ == null) { + name_ = null; + } else { + nameBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + if (paramBuilder_ == null) { + param_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + paramBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_FunctionCall_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall build() { + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall result = new com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + if (nameBuilder_ == null) { + result.name_ = name_; + } else { + result.name_ = nameBuilder_.build(); + } + to_bitField0_ |= 0x00000001; + } + if (paramBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + param_ = java.util.Collections.unmodifiableList(param_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.param_ = param_; + } else { + result.param_ = paramBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall.getDefaultInstance()) return this; + if (other.hasName()) { + mergeName(other.getName()); + } + if (paramBuilder_ == null) { + if (!other.param_.isEmpty()) { + if (param_.isEmpty()) { + param_ = other.param_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureParamIsMutable(); + param_.addAll(other.param_); + } + onChanged(); + } + } else { + if (!other.param_.isEmpty()) { + if (paramBuilder_.isEmpty()) { + paramBuilder_.dispose(); + paramBuilder_ = null; + param_ = other.param_; + bitField0_ = (bitField0_ & ~0x00000002); + paramBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getParamFieldBuilder() : null; + } else { + paramBuilder_.addAllMessages(other.param_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + if (!getName().isInitialized()) { + return false; + } + for (int i = 0; i < getParamCount(); i++) { + if (!getParam(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.mysql.cj.x.protobuf.MysqlxExpr.Identifier name_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier, com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder> nameBuilder_; + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + * @return The name. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier getName() { + if (nameBuilder_ == null) { + return name_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance() : name_; + } else { + return nameBuilder_.getMessage(); + } + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public Builder setName(com.mysql.cj.x.protobuf.MysqlxExpr.Identifier value) { + if (nameBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + onChanged(); + } else { + nameBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public Builder setName( + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder builderForValue) { + if (nameBuilder_ == null) { + name_ = builderForValue.build(); + onChanged(); + } else { + nameBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public Builder mergeName(com.mysql.cj.x.protobuf.MysqlxExpr.Identifier value) { + if (nameBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + name_ != null && + name_ != com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance()) { + name_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.newBuilder(name_).mergeFrom(value).buildPartial(); + } else { + name_ = value; + } + onChanged(); + } else { + nameBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public Builder clearName() { + if (nameBuilder_ == null) { + name_ = null; + onChanged(); + } else { + nameBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder getNameBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getNameFieldBuilder().getBuilder(); + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder getNameOrBuilder() { + if (nameBuilder_ != null) { + return nameBuilder_.getMessageOrBuilder(); + } else { + return name_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.getDefaultInstance() : name_; + } + } + /** + *
    +       ** identifier of function; at least name of it 
    +       * 
    + * + * required .Mysqlx.Expr.Identifier name = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier, com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder> + getNameFieldBuilder() { + if (nameBuilder_ == null) { + nameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Identifier, com.mysql.cj.x.protobuf.MysqlxExpr.Identifier.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.IdentifierOrBuilder>( + getName(), + getParentForChildren(), + isClean()); + name_ = null; + } + return nameBuilder_; + } + + private java.util.List param_ = + java.util.Collections.emptyList(); + private void ensureParamIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + param_ = new java.util.ArrayList(param_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> paramBuilder_; + + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List getParamList() { + if (paramBuilder_ == null) { + return java.util.Collections.unmodifiableList(param_); + } else { + return paramBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public int getParamCount() { + if (paramBuilder_ == null) { + return param_.size(); + } else { + return paramBuilder_.getCount(); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index) { + if (paramBuilder_ == null) { + return param_.get(index); + } else { + return paramBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder setParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.set(index, value); + onChanged(); + } else { + paramBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder setParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.set(index, builderForValue.build()); + onChanged(); + } else { + paramBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.add(value); + onChanged(); + } else { + paramBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.add(index, value); + onChanged(); + } else { + paramBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.add(builderForValue.build()); + onChanged(); + } else { + paramBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.add(index, builderForValue.build()); + onChanged(); + } else { + paramBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addAllParam( + java.lang.Iterable values) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, param_); + onChanged(); + } else { + paramBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder clearParam() { + if (paramBuilder_ == null) { + param_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + paramBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder removeParam(int index) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.remove(index); + onChanged(); + } else { + paramBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getParamBuilder( + int index) { + return getParamFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index) { + if (paramBuilder_ == null) { + return param_.get(index); } else { + return paramBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List + getParamOrBuilderList() { + if (paramBuilder_ != null) { + return paramBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(param_); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addParamBuilder() { + return getParamFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addParamBuilder( + int index) { + return getParamFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List + getParamBuilderList() { + return getParamFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getParamFieldBuilder() { + if (paramBuilder_ == null) { + paramBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + param_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + param_ = null; + } + return paramBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.FunctionCall) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.FunctionCall) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FunctionCall parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FunctionCall(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.FunctionCall getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface OperatorOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Operator) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return The name. + */ + java.lang.String getName(); + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString + getNameBytes(); + + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + java.util.List + getParamList(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + int getParamCount(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + java.util.List + getParamOrBuilderList(); + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index); + } + /** + * Protobuf type {@code Mysqlx.Expr.Operator} + */ + public static final class Operator extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Operator) + OperatorOrBuilder { + private static final long serialVersionUID = 0L; + // Use Operator.newBuilder() to construct. + private Operator(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Operator() { + name_ = ""; + param_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Operator(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Operator( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + name_ = bs; + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + param_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + param_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + param_ = java.util.Collections.unmodifiableList(param_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Operator_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Operator_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.class, com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object name_; + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + *
    +     ** name of operator 
    +     * 
    + * + * required string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PARAM_FIELD_NUMBER = 2; + private java.util.List param_; + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public java.util.List getParamList() { + return param_; + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public java.util.List + getParamOrBuilderList() { + return param_; + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public int getParamCount() { + return param_.size(); + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index) { + return param_.get(index); + } + /** + *
    +     ** list of parameters 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index) { + return param_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getParamCount(); i++) { + if (!getParam(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + for (int i = 0; i < param_.size(); i++) { + output.writeMessage(2, param_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + for (int i = 0; i < param_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, param_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Operator)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Operator other = (com.mysql.cj.x.protobuf.MysqlxExpr.Operator) obj; + + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (!getParamList() + .equals(other.getParamList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (getParamCount() > 0) { + hash = (37 * hash) + PARAM_FIELD_NUMBER; + hash = (53 * hash) + getParamList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Operator prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Expr.Operator} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Operator) + com.mysql.cj.x.protobuf.MysqlxExpr.OperatorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Operator_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Operator_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Operator.class, com.mysql.cj.x.protobuf.MysqlxExpr.Operator.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Operator.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getParamFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (paramBuilder_ == null) { + param_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + paramBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Operator_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Operator result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Operator result = new com.mysql.cj.x.protobuf.MysqlxExpr.Operator(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.name_ = name_; + if (paramBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + param_ = java.util.Collections.unmodifiableList(param_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.param_ = param_; + } else { + result.param_ = paramBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Operator) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Operator)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Operator other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Operator.getDefaultInstance()) return this; + if (other.hasName()) { + bitField0_ |= 0x00000001; + name_ = other.name_; + onChanged(); + } + if (paramBuilder_ == null) { + if (!other.param_.isEmpty()) { + if (param_.isEmpty()) { + param_ = other.param_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureParamIsMutable(); + param_.addAll(other.param_); + } + onChanged(); + } + } else { + if (!other.param_.isEmpty()) { + if (paramBuilder_.isEmpty()) { + paramBuilder_.dispose(); + paramBuilder_ = null; + param_ = other.param_; + bitField0_ = (bitField0_ & ~0x00000002); + paramBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getParamFieldBuilder() : null; + } else { + paramBuilder_.addAllMessages(other.param_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasName()) { + return false; + } + for (int i = 0; i < getParamCount(); i++) { + if (!getParam(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Operator parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Operator) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @return Whether the name field is set. + */ + public boolean hasName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000001); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + *
    +       ** name of operator 
    +       * 
    + * + * required string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + name_ = value; + onChanged(); + return this; + } + + private java.util.List param_ = + java.util.Collections.emptyList(); + private void ensureParamIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + param_ = new java.util.ArrayList(param_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> paramBuilder_; + + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List getParamList() { + if (paramBuilder_ == null) { + return java.util.Collections.unmodifiableList(param_); + } else { + return paramBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public int getParamCount() { + if (paramBuilder_ == null) { + return param_.size(); + } else { + return paramBuilder_.getCount(); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getParam(int index) { + if (paramBuilder_ == null) { + return param_.get(index); + } else { + return paramBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder setParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.set(index, value); + onChanged(); + } else { + paramBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder setParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.set(index, builderForValue.build()); + onChanged(); + } else { + paramBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.add(value); + onChanged(); + } else { + paramBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (paramBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureParamIsMutable(); + param_.add(index, value); + onChanged(); + } else { + paramBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.add(builderForValue.build()); + onChanged(); + } else { + paramBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addParam( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.add(index, builderForValue.build()); + onChanged(); + } else { + paramBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder addAllParam( + java.lang.Iterable values) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, param_); + onChanged(); + } else { + paramBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder clearParam() { + if (paramBuilder_ == null) { + param_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + paramBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public Builder removeParam(int index) { + if (paramBuilder_ == null) { + ensureParamIsMutable(); + param_.remove(index); + onChanged(); + } else { + paramBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getParamBuilder( + int index) { + return getParamFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getParamOrBuilder( + int index) { + if (paramBuilder_ == null) { + return param_.get(index); } else { + return paramBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List + getParamOrBuilderList() { + if (paramBuilder_ != null) { + return paramBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(param_); + } + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addParamBuilder() { + return getParamFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addParamBuilder( + int index) { + return getParamFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of parameters 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr param = 2; + */ + public java.util.List + getParamBuilderList() { + return getParamFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getParamFieldBuilder() { + if (paramBuilder_ == null) { + paramBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + param_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + param_ = null; + } + return paramBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Operator) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Operator) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Operator DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Operator(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Operator getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Operator parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Operator(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Operator getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ObjectOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Object) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + java.util.List + getFldList(); + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getFld(int index); + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + int getFldCount(); + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + java.util.List + getFldOrBuilderList(); + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index); + } + /** + *
    +   **
    +   *An object (with expression values)
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.Object} + */ + public static final class Object extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Object) + ObjectOrBuilder { + private static final long serialVersionUID = 0L; + // Use Object.newBuilder() to construct. + private Object(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Object() { + fld_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Object(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Object( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + fld_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + fld_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + fld_ = java.util.Collections.unmodifiableList(fld_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.class, com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder.class); + } + + public interface ObjectFieldOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Object.ObjectField) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return Whether the key field is set. + */ + boolean hasKey(); + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return The key. + */ + java.lang.String getKey(); + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return The bytes for key. + */ + com.google.protobuf.ByteString + getKeyBytes(); + + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return The value. + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue(); + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder(); + } + /** + * Protobuf type {@code Mysqlx.Expr.Object.ObjectField} + */ + public static final class ObjectField extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Object.ObjectField) + ObjectFieldOrBuilder { + private static final long serialVersionUID = 0L; + // Use ObjectField.newBuilder() to construct. + private ObjectField(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ObjectField() { + key_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ObjectField(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ObjectField( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + key_ = bs; + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = value_.toBuilder(); + } + value_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(value_); + value_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_ObjectField_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_ObjectField_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.class, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder.class); + } + + private int bitField0_; + public static final int KEY_FIELD_NUMBER = 1; + private volatile java.lang.Object key_; + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return Whether the key field is set. + */ + @java.lang.Override + public boolean hasKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return The key. + */ + @java.lang.Override + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + key_ = s; + } + return s; + } + } + /** + *
    +       ** identifier of field 
    +       * 
    + * + * required string key = 1; + * @return The bytes for key. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr value_; + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return The value. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + /** + *
    +       ** value of field 
    +       * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasKey()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasValue()) { + memoizedIsInitialized = 0; + return false; + } + if (!getValue().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, key_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getValue()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, key_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getValue()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField other = (com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField) obj; + + if (hasKey() != other.hasKey()) return false; + if (hasKey()) { + if (!getKey() + .equals(other.getKey())) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasKey()) { + hash = (37 * hash) + KEY_FIELD_NUMBER; + hash = (53 * hash) + getKey().hashCode(); + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Expr.Object.ObjectField} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Object.ObjectField) + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_ObjectField_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_ObjectField_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.class, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + key_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (valueBuilder_ == null) { + value_ = null; + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_ObjectField_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField result = new com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.key_ = key_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (valueBuilder_ == null) { + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.getDefaultInstance()) return this; + if (other.hasKey()) { + bitField0_ |= 0x00000001; + key_ = other.key_; + onChanged(); + } + if (other.hasValue()) { + mergeValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasKey()) { + return false; + } + if (!hasValue()) { + return false; + } + if (!getValue().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object key_ = ""; + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @return Whether the key field is set. + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @return The key. + */ + public java.lang.String getKey() { + java.lang.Object ref = key_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + key_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @return The bytes for key. + */ + public com.google.protobuf.ByteString + getKeyBytes() { + java.lang.Object ref = key_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + key_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @param value The key to set. + * @return This builder for chaining. + */ + public Builder setKey( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + key_ = value; + onChanged(); + return this; + } + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @return This builder for chaining. + */ + public Builder clearKey() { + bitField0_ = (bitField0_ & ~0x00000001); + key_ = getDefaultInstance().getKey(); + onChanged(); + return this; + } + /** + *
    +         ** identifier of field 
    +         * 
    + * + * required string key = 1; + * @param value The bytes for key to set. + * @return This builder for chaining. + */ + public Builder setKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + key_ = value; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxExpr.Expr value_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> valueBuilder_; + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + * @return The value. + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue() { + if (valueBuilder_ == null) { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } else { + return valueBuilder_.getMessage(); + } + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public Builder setValue(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + value_ = value; + onChanged(); + } else { + valueBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public Builder setValue( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (valueBuilder_ == null) { + value_ = builderForValue.build(); + onChanged(); + } else { + valueBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public Builder mergeValue(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + value_ != null && + value_ != com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()) { + value_ = + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.newBuilder(value_).mergeFrom(value).buildPartial(); + } else { + value_ = value; + } + onChanged(); + } else { + valueBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = null; + onChanged(); + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getValueBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getValueFieldBuilder().getBuilder(); + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilder(); + } else { + return value_ == null ? + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance() : value_; + } + } + /** + *
    +         ** value of field 
    +         * 
    + * + * required .Mysqlx.Expr.Expr value = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + getValue(), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Object.ObjectField) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Object.ObjectField) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ObjectField parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ObjectField(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public static final int FLD_FIELD_NUMBER = 1; + private java.util.List fld_; + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + @java.lang.Override + public java.util.List getFldList() { + return fld_; + } + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + @java.lang.Override + public java.util.List + getFldOrBuilderList() { + return fld_; + } + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + @java.lang.Override + public int getFldCount() { + return fld_.size(); + } + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getFld(int index) { + return fld_.get(index); + } + /** + *
    +     ** list of fields 
    +     * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index) { + return fld_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getFldCount(); i++) { + if (!getFld(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < fld_.size(); i++) { + output.writeMessage(1, fld_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < fld_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, fld_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Object)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Object other = (com.mysql.cj.x.protobuf.MysqlxExpr.Object) obj; + + if (!getFldList() + .equals(other.getFldList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getFldCount() > 0) { + hash = (37 * hash) + FLD_FIELD_NUMBER; + hash = (53 * hash) + getFldList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Object prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *An object (with expression values)
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.Object} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Object) + com.mysql.cj.x.protobuf.MysqlxExpr.ObjectOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.class, com.mysql.cj.x.protobuf.MysqlxExpr.Object.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Object.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFldFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (fldBuilder_ == null) { + fld_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + fldBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Object_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Object result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Object result = new com.mysql.cj.x.protobuf.MysqlxExpr.Object(this); + int from_bitField0_ = bitField0_; + if (fldBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + fld_ = java.util.Collections.unmodifiableList(fld_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.fld_ = fld_; + } else { + result.fld_ = fldBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Object) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Object)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Object other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Object.getDefaultInstance()) return this; + if (fldBuilder_ == null) { + if (!other.fld_.isEmpty()) { + if (fld_.isEmpty()) { + fld_ = other.fld_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFldIsMutable(); + fld_.addAll(other.fld_); + } + onChanged(); + } + } else { + if (!other.fld_.isEmpty()) { + if (fldBuilder_.isEmpty()) { + fldBuilder_.dispose(); + fldBuilder_ = null; + fld_ = other.fld_; + bitField0_ = (bitField0_ & ~0x00000001); + fldBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getFldFieldBuilder() : null; + } else { + fldBuilder_.addAllMessages(other.fld_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getFldCount(); i++) { + if (!getFld(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Object parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Object) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List fld_ = + java.util.Collections.emptyList(); + private void ensureFldIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + fld_ = new java.util.ArrayList(fld_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder> fldBuilder_; + + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public java.util.List getFldList() { + if (fldBuilder_ == null) { + return java.util.Collections.unmodifiableList(fld_); + } else { + return fldBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public int getFldCount() { + if (fldBuilder_ == null) { + return fld_.size(); + } else { + return fldBuilder_.getCount(); + } + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField getFld(int index) { + if (fldBuilder_ == null) { + return fld_.get(index); + } else { + return fldBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder setFld( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.set(index, value); + onChanged(); + } else { + fldBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder setFld( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.set(index, builderForValue.build()); + onChanged(); + } else { + fldBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder addFld(com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.add(value); + onChanged(); + } else { + fldBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder addFld( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField value) { + if (fldBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFldIsMutable(); + fld_.add(index, value); + onChanged(); + } else { + fldBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder addFld( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.add(builderForValue.build()); + onChanged(); + } else { + fldBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder addFld( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder builderForValue) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.add(index, builderForValue.build()); + onChanged(); + } else { + fldBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder addAllFld( + java.lang.Iterable values) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, fld_); + onChanged(); + } else { + fldBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder clearFld() { + if (fldBuilder_ == null) { + fld_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + fldBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public Builder removeFld(int index) { + if (fldBuilder_ == null) { + ensureFldIsMutable(); + fld_.remove(index); + onChanged(); + } else { + fldBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder getFldBuilder( + int index) { + return getFldFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder getFldOrBuilder( + int index) { + if (fldBuilder_ == null) { + return fld_.get(index); } else { + return fldBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public java.util.List + getFldOrBuilderList() { + if (fldBuilder_ != null) { + return fldBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(fld_); + } + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder addFldBuilder() { + return getFldFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.getDefaultInstance()); + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder addFldBuilder( + int index) { + return getFldFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.getDefaultInstance()); + } + /** + *
    +       ** list of fields 
    +       * 
    + * + * repeated .Mysqlx.Expr.Object.ObjectField fld = 1; + */ + public java.util.List + getFldBuilderList() { + return getFldFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder> + getFldFieldBuilder() { + if (fldBuilder_ == null) { + fldBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectField.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.Object.ObjectFieldOrBuilder>( + fld_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + fld_ = null; + } + return fldBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Object) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Object) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Object DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Object(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Object getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Object parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Object(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Object getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ArrayOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Expr.Array) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + java.util.List + getValueList(); + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue(int index); + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + int getValueCount(); + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + java.util.List + getValueOrBuilderList(); + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder( + int index); + } + /** + *
    +   **
    +   *An array of expressions
    +   * 
    + * + * Protobuf type {@code Mysqlx.Expr.Array} + */ + public static final class Array extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Expr.Array) + ArrayOrBuilder { + private static final long serialVersionUID = 0L; + // Use Array.newBuilder() to construct. + private Array(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Array() { + value_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Array(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Array( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + value_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + value_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxExpr.Expr.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Array_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Array_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Array.class, com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder.class); + } + + public static final int VALUE_FIELD_NUMBER = 1; + private java.util.List value_; + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + @java.lang.Override + public java.util.List getValueList() { + return value_; + } + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + @java.lang.Override + public java.util.List + getValueOrBuilderList() { + return value_; + } + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + @java.lang.Override + public int getValueCount() { + return value_.size(); + } + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue(int index) { + return value_.get(index); + } + /** + *
    +     ** list of values 
    +     * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder( + int index) { + return value_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < value_.size(); i++) { + output.writeMessage(1, value_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < value_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, value_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Array)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxExpr.Array other = (com.mysql.cj.x.protobuf.MysqlxExpr.Array) obj; + + if (!getValueList() + .equals(other.getValueList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getValueCount() > 0) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValueList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxExpr.Array prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *An array of expressions
    +     * 
    + * + * Protobuf type {@code Mysqlx.Expr.Array} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Expr.Array) + com.mysql.cj.x.protobuf.MysqlxExpr.ArrayOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Array_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Array_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxExpr.Array.class, com.mysql.cj.x.protobuf.MysqlxExpr.Array.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxExpr.Array.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + } else { + valueBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.internal_static_Mysqlx_Expr_Array_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Array getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Array build() { + com.mysql.cj.x.protobuf.MysqlxExpr.Array result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Array buildPartial() { + com.mysql.cj.x.protobuf.MysqlxExpr.Array result = new com.mysql.cj.x.protobuf.MysqlxExpr.Array(this); + int from_bitField0_ = bitField0_; + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxExpr.Array) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxExpr.Array)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxExpr.Array other) { + if (other == com.mysql.cj.x.protobuf.MysqlxExpr.Array.getDefaultInstance()) return this; + if (valueBuilder_ == null) { + if (!other.value_.isEmpty()) { + if (value_.isEmpty()) { + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureValueIsMutable(); + value_.addAll(other.value_); + } + onChanged(); + } + } else { + if (!other.value_.isEmpty()) { + if (valueBuilder_.isEmpty()) { + valueBuilder_.dispose(); + valueBuilder_ = null; + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000001); + valueBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getValueFieldBuilder() : null; + } else { + valueBuilder_.addAllMessages(other.value_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxExpr.Array parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxExpr.Array) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List value_ = + java.util.Collections.emptyList(); + private void ensureValueIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + value_ = new java.util.ArrayList(value_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> valueBuilder_; + + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public java.util.List getValueList() { + if (valueBuilder_ == null) { + return java.util.Collections.unmodifiableList(value_); + } else { + return valueBuilder_.getMessageList(); + } + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public int getValueCount() { + if (valueBuilder_ == null) { + return value_.size(); + } else { + return valueBuilder_.getCount(); + } + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr getValue(int index) { + if (valueBuilder_ == null) { + return value_.get(index); + } else { + return valueBuilder_.getMessage(index); + } + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.set(index, value); + onChanged(); + } else { + valueBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.set(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder addValue(com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(value); + onChanged(); + } else { + valueBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(index, value); + onChanged(); + } else { + valueBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder addValue( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder addAllValue( + java.lang.Iterable values) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, value_); + onChanged(); + } else { + valueBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + valueBuilder_.clear(); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public Builder removeValue(int index) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.remove(index); + onChanged(); + } else { + valueBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder getValueBuilder( + int index) { + return getValueFieldBuilder().getBuilder(index); + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder getValueOrBuilder( + int index) { + if (valueBuilder_ == null) { + return value_.get(index); } else { + return valueBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public java.util.List + getValueOrBuilderList() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(value_); + } + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addValueBuilder() { + return getValueFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder addValueBuilder( + int index) { + return getValueFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.getDefaultInstance()); + } + /** + *
    +       ** list of values 
    +       * 
    + * + * repeated .Mysqlx.Expr.Expr value = 1; + */ + public java.util.List + getValueBuilderList() { + return getValueFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxExpr.Expr, com.mysql.cj.x.protobuf.MysqlxExpr.Expr.Builder, com.mysql.cj.x.protobuf.MysqlxExpr.ExprOrBuilder>( + value_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Expr.Array) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Expr.Array) + private static final com.mysql.cj.x.protobuf.MysqlxExpr.Array DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxExpr.Array(); + } + + public static com.mysql.cj.x.protobuf.MysqlxExpr.Array getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Array parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Array(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxExpr.Array getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Expr_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Expr_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Identifier_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Identifier_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_DocumentPathItem_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_DocumentPathItem_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_ColumnIdentifier_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_FunctionCall_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_FunctionCall_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Operator_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Operator_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Object_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Object_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Object_ObjectField_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Object_ObjectField_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Expr_Array_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Expr_Array_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\021mysqlx_expr.proto\022\013Mysqlx.Expr\032\026mysqlx" + + "_datatypes.proto\"\304\003\n\004Expr\022$\n\004type\030\001 \002(\0162" + + "\026.Mysqlx.Expr.Expr.Type\0221\n\nidentifier\030\002 " + + "\001(\0132\035.Mysqlx.Expr.ColumnIdentifier\022\020\n\010va" + + "riable\030\003 \001(\t\022)\n\007literal\030\004 \001(\0132\030.Mysqlx.D" + + "atatypes.Scalar\0220\n\rfunction_call\030\005 \001(\0132\031" + + ".Mysqlx.Expr.FunctionCall\022\'\n\010operator\030\006 " + + "\001(\0132\025.Mysqlx.Expr.Operator\022\020\n\010position\030\007" + + " \001(\r\022#\n\006object\030\010 \001(\0132\023.Mysqlx.Expr.Objec" + + "t\022!\n\005array\030\t \001(\0132\022.Mysqlx.Expr.Array\"q\n\004" + + "Type\022\t\n\005IDENT\020\001\022\013\n\007LITERAL\020\002\022\014\n\010VARIABLE" + + "\020\003\022\r\n\tFUNC_CALL\020\004\022\014\n\010OPERATOR\020\005\022\017\n\013PLACE" + + "HOLDER\020\006\022\n\n\006OBJECT\020\007\022\t\n\005ARRAY\020\010\"/\n\nIdent" + + "ifier\022\014\n\004name\030\001 \002(\t\022\023\n\013schema_name\030\002 \001(\t" + + "\"\313\001\n\020DocumentPathItem\0220\n\004type\030\001 \002(\0162\".My" + + "sqlx.Expr.DocumentPathItem.Type\022\r\n\005value" + + "\030\002 \001(\t\022\r\n\005index\030\003 \001(\r\"g\n\004Type\022\n\n\006MEMBER\020" + + "\001\022\023\n\017MEMBER_ASTERISK\020\002\022\017\n\013ARRAY_INDEX\020\003\022" + + "\030\n\024ARRAY_INDEX_ASTERISK\020\004\022\023\n\017DOUBLE_ASTE" + + "RISK\020\005\"\177\n\020ColumnIdentifier\0224\n\rdocument_p" + + "ath\030\001 \003(\0132\035.Mysqlx.Expr.DocumentPathItem" + + "\022\014\n\004name\030\002 \001(\t\022\022\n\ntable_name\030\003 \001(\t\022\023\n\013sc" + + "hema_name\030\004 \001(\t\"W\n\014FunctionCall\022%\n\004name\030" + + "\001 \002(\0132\027.Mysqlx.Expr.Identifier\022 \n\005param\030" + + "\002 \003(\0132\021.Mysqlx.Expr.Expr\":\n\010Operator\022\014\n\004" + + "name\030\001 \002(\t\022 \n\005param\030\002 \003(\0132\021.Mysqlx.Expr." + + "Expr\"t\n\006Object\022,\n\003fld\030\001 \003(\0132\037.Mysqlx.Exp" + + "r.Object.ObjectField\032<\n\013ObjectField\022\013\n\003k" + + "ey\030\001 \002(\t\022 \n\005value\030\002 \002(\0132\021.Mysqlx.Expr.Ex" + + "pr\")\n\005Array\022 \n\005value\030\001 \003(\0132\021.Mysqlx.Expr" + + ".ExprB\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + }); + internal_static_Mysqlx_Expr_Expr_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Expr_Expr_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Expr_descriptor, + new java.lang.String[] { "Type", "Identifier", "Variable", "Literal", "FunctionCall", "Operator", "Position", "Object", "Array", }); + internal_static_Mysqlx_Expr_Identifier_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Expr_Identifier_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Identifier_descriptor, + new java.lang.String[] { "Name", "SchemaName", }); + internal_static_Mysqlx_Expr_DocumentPathItem_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Expr_DocumentPathItem_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_DocumentPathItem_descriptor, + new java.lang.String[] { "Type", "Value", "Index", }); + internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Expr_ColumnIdentifier_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_ColumnIdentifier_descriptor, + new java.lang.String[] { "DocumentPath", "Name", "TableName", "SchemaName", }); + internal_static_Mysqlx_Expr_FunctionCall_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Expr_FunctionCall_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_FunctionCall_descriptor, + new java.lang.String[] { "Name", "Param", }); + internal_static_Mysqlx_Expr_Operator_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_Mysqlx_Expr_Operator_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Operator_descriptor, + new java.lang.String[] { "Name", "Param", }); + internal_static_Mysqlx_Expr_Object_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_Mysqlx_Expr_Object_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Object_descriptor, + new java.lang.String[] { "Fld", }); + internal_static_Mysqlx_Expr_Object_ObjectField_descriptor = + internal_static_Mysqlx_Expr_Object_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Expr_Object_ObjectField_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Object_ObjectField_descriptor, + new java.lang.String[] { "Key", "Value", }); + internal_static_Mysqlx_Expr_Array_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_Mysqlx_Expr_Array_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Expr_Array_descriptor, + new java.lang.String[] { "Value", }); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxNotice.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxNotice.java new file mode 100644 index 0000000..80e7a5a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxNotice.java @@ -0,0 +1,5921 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_notice.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxNotice { + private MysqlxNotice() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface FrameOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.Frame) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** the type of the payload 
    +     * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + *
    +     ** the type of the payload 
    +     * 
    + * + * required uint32 type = 1; + * @return The type. + */ + int getType(); + + /** + *
    +     ** global or local notification 
    +     * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return Whether the scope field is set. + */ + boolean hasScope(); + /** + *
    +     ** global or local notification 
    +     * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return The scope. + */ + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope getScope(); + + /** + *
    +     ** the payload of the notification 
    +     * 
    + * + * optional bytes payload = 3; + * @return Whether the payload field is set. + */ + boolean hasPayload(); + /** + *
    +     ** the payload of the notification 
    +     * 
    + * + * optional bytes payload = 3; + * @return The payload. + */ + com.google.protobuf.ByteString getPayload(); + } + /** + *
    +   **
    +   *Common frame for all notices
    +   *| ``.type``                                         | Value |
    +   *|---------------------------------------------------|------ |
    +   *| @ref Mysqlx::Notice::Warning                      | 1     |
    +   *| @ref Mysqlx::Notice::SessionVariableChanged       | 2     |
    +   *| @ref Mysqlx::Notice::SessionStateChanged          | 3     |
    +   *| @ref Mysqlx::Notice::GroupReplicationStateChanged | 4     |
    +   *| @ref Mysqlx::Notice::ServerHello                  | 5     |
    +   * 
    + * + * Protobuf type {@code Mysqlx.Notice.Frame} + */ + public static final class Frame extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.Frame) + FrameOrBuilder { + private static final long serialVersionUID = 0L; + // Use Frame.newBuilder() to construct. + private Frame(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Frame() { + scope_ = 1; + payload_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Frame(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Frame( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + type_ = input.readUInt32(); + break; + } + case 16: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope value = com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(2, rawValue); + } else { + bitField0_ |= 0x00000002; + scope_ = rawValue; + } + break; + } + case 26: { + bitField0_ |= 0x00000004; + payload_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Frame_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Frame_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.class, com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Builder.class); + } + + /** + *
    +     ** scope of notice 
    +     * 
    + * + * Protobuf enum {@code Mysqlx.Notice.Frame.Scope} + */ + public enum Scope + implements com.google.protobuf.ProtocolMessageEnum { + /** + * GLOBAL = 1; + */ + GLOBAL(1), + /** + * LOCAL = 2; + */ + LOCAL(2), + ; + + /** + * GLOBAL = 1; + */ + public static final int GLOBAL_VALUE = 1; + /** + * LOCAL = 2; + */ + public static final int LOCAL_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Scope valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Scope forNumber(int value) { + switch (value) { + case 1: return GLOBAL; + case 2: return LOCAL; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Scope> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Scope findValueByNumber(int number) { + return Scope.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.Frame.getDescriptor().getEnumTypes().get(0); + } + + private static final Scope[] VALUES = values(); + + public static Scope valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Scope(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Notice.Frame.Scope) + } + + /** + *
    +     ** type of notice payload
    +     * 
    + * + * Protobuf enum {@code Mysqlx.Notice.Frame.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * WARNING = 1; + */ + WARNING(1), + /** + * SESSION_VARIABLE_CHANGED = 2; + */ + SESSION_VARIABLE_CHANGED(2), + /** + * SESSION_STATE_CHANGED = 3; + */ + SESSION_STATE_CHANGED(3), + /** + * GROUP_REPLICATION_STATE_CHANGED = 4; + */ + GROUP_REPLICATION_STATE_CHANGED(4), + /** + * SERVER_HELLO = 5; + */ + SERVER_HELLO(5), + ; + + /** + * WARNING = 1; + */ + public static final int WARNING_VALUE = 1; + /** + * SESSION_VARIABLE_CHANGED = 2; + */ + public static final int SESSION_VARIABLE_CHANGED_VALUE = 2; + /** + * SESSION_STATE_CHANGED = 3; + */ + public static final int SESSION_STATE_CHANGED_VALUE = 3; + /** + * GROUP_REPLICATION_STATE_CHANGED = 4; + */ + public static final int GROUP_REPLICATION_STATE_CHANGED_VALUE = 4; + /** + * SERVER_HELLO = 5; + */ + public static final int SERVER_HELLO_VALUE = 5; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return WARNING; + case 2: return SESSION_VARIABLE_CHANGED; + case 3: return SESSION_STATE_CHANGED; + case 4: return GROUP_REPLICATION_STATE_CHANGED; + case 5: return SERVER_HELLO; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.Frame.getDescriptor().getEnumTypes().get(1); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Notice.Frame.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + *
    +     ** the type of the payload 
    +     * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override + public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** the type of the payload 
    +     * 
    + * + * required uint32 type = 1; + * @return The type. + */ + @java.lang.Override + public int getType() { + return type_; + } + + public static final int SCOPE_FIELD_NUMBER = 2; + private int scope_; + /** + *
    +     ** global or local notification 
    +     * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return Whether the scope field is set. + */ + @java.lang.Override public boolean hasScope() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** global or local notification 
    +     * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return The scope. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope getScope() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope result = com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope.valueOf(scope_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope.GLOBAL : result; + } + + public static final int PAYLOAD_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString payload_; + /** + *
    +     ** the payload of the notification 
    +     * 
    + * + * optional bytes payload = 3; + * @return Whether the payload field is set. + */ + @java.lang.Override + public boolean hasPayload() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** the payload of the notification 
    +     * 
    + * + * optional bytes payload = 3; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeEnum(2, scope_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBytes(3, payload_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, scope_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, payload_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.Frame)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.Frame other = (com.mysql.cj.x.protobuf.MysqlxNotice.Frame) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (getType() + != other.getType()) return false; + } + if (hasScope() != other.hasScope()) return false; + if (hasScope()) { + if (scope_ != other.scope_) return false; + } + if (hasPayload() != other.hasPayload()) return false; + if (hasPayload()) { + if (!getPayload() + .equals(other.getPayload())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + getType(); + } + if (hasScope()) { + hash = (37 * hash) + SCOPE_FIELD_NUMBER; + hash = (53 * hash) + scope_; + } + if (hasPayload()) { + hash = (37 * hash) + PAYLOAD_FIELD_NUMBER; + hash = (53 * hash) + getPayload().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.Frame prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Common frame for all notices
    +     *| ``.type``                                         | Value |
    +     *|---------------------------------------------------|------ |
    +     *| @ref Mysqlx::Notice::Warning                      | 1     |
    +     *| @ref Mysqlx::Notice::SessionVariableChanged       | 2     |
    +     *| @ref Mysqlx::Notice::SessionStateChanged          | 3     |
    +     *| @ref Mysqlx::Notice::GroupReplicationStateChanged | 4     |
    +     *| @ref Mysqlx::Notice::ServerHello                  | 5     |
    +     * 
    + * + * Protobuf type {@code Mysqlx.Notice.Frame} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.Frame) + com.mysql.cj.x.protobuf.MysqlxNotice.FrameOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Frame_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Frame_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.class, com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.Frame.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + scope_ = 1; + bitField0_ = (bitField0_ & ~0x00000002); + payload_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Frame_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Frame getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.Frame.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Frame build() { + com.mysql.cj.x.protobuf.MysqlxNotice.Frame result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Frame buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.Frame result = new com.mysql.cj.x.protobuf.MysqlxNotice.Frame(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.type_ = type_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.scope_ = scope_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.payload_ = payload_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.Frame) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.Frame)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.Frame other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.Frame.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasScope()) { + setScope(other.getScope()); + } + if (other.hasPayload()) { + setPayload(other.getPayload()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.Frame parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.Frame) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ ; + /** + *
    +       ** the type of the payload 
    +       * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override + public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** the type of the payload 
    +       * 
    + * + * required uint32 type = 1; + * @return The type. + */ + @java.lang.Override + public int getType() { + return type_; + } + /** + *
    +       ** the type of the payload 
    +       * 
    + * + * required uint32 type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(int value) { + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + *
    +       ** the type of the payload 
    +       * 
    + * + * required uint32 type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 0; + onChanged(); + return this; + } + + private int scope_ = 1; + /** + *
    +       ** global or local notification 
    +       * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return Whether the scope field is set. + */ + @java.lang.Override public boolean hasScope() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** global or local notification 
    +       * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return The scope. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope getScope() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope result = com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope.valueOf(scope_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope.GLOBAL : result; + } + /** + *
    +       ** global or local notification 
    +       * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @param value The scope to set. + * @return This builder for chaining. + */ + public Builder setScope(com.mysql.cj.x.protobuf.MysqlxNotice.Frame.Scope value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + scope_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** global or local notification 
    +       * 
    + * + * optional .Mysqlx.Notice.Frame.Scope scope = 2 [default = GLOBAL]; + * @return This builder for chaining. + */ + public Builder clearScope() { + bitField0_ = (bitField0_ & ~0x00000002); + scope_ = 1; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** the payload of the notification 
    +       * 
    + * + * optional bytes payload = 3; + * @return Whether the payload field is set. + */ + @java.lang.Override + public boolean hasPayload() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** the payload of the notification 
    +       * 
    + * + * optional bytes payload = 3; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + /** + *
    +       ** the payload of the notification 
    +       * 
    + * + * optional bytes payload = 3; + * @param value The payload to set. + * @return This builder for chaining. + */ + public Builder setPayload(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + payload_ = value; + onChanged(); + return this; + } + /** + *
    +       ** the payload of the notification 
    +       * 
    + * + * optional bytes payload = 3; + * @return This builder for chaining. + */ + public Builder clearPayload() { + bitField0_ = (bitField0_ & ~0x00000004); + payload_ = getDefaultInstance().getPayload(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.Frame) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.Frame) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.Frame DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.Frame(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.Frame getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Frame parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Frame(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Frame getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface WarningOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.Warning) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** Note or Warning 
    +     * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return Whether the level field is set. + */ + boolean hasLevel(); + /** + *
    +     ** Note or Warning 
    +     * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return The level. + */ + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level getLevel(); + + /** + *
    +     ** warning code 
    +     * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + boolean hasCode(); + /** + *
    +     ** warning code 
    +     * 
    + * + * required uint32 code = 2; + * @return The code. + */ + int getCode(); + + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + boolean hasMsg(); + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return The msg. + */ + java.lang.String getMsg(); + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + com.google.protobuf.ByteString + getMsgBytes(); + } + /** + *
    +   **
    +   *Server-side warnings and notes
    +   *@par ``.scope`` == ``local``
    +   *``.level``, ``.code`` and ``.msg`` map the content of:
    +   *@code{sql}
    +   *SHOW WARNINGS
    +   *@endcode
    +   *@par ``.scope`` == ``global``
    +   *(undefined) Will be used for global, unstructured messages like:
    +   *-  server is shutting down
    +   *-  a node disconnected from group
    +   *-  schema or table dropped
    +   *| @ref Mysqlx::Notice::Frame Field  | Value                   |
    +   *|-----------------------------------|-------------------------|
    +   *| ``.type``                         | 1                       |
    +   *| ``.scope``                        | ``local`` or ``global`` |
    +   * 
    + * + * Protobuf type {@code Mysqlx.Notice.Warning} + */ + public static final class Warning extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.Warning) + WarningOrBuilder { + private static final long serialVersionUID = 0L; + // Use Warning.newBuilder() to construct. + private Warning(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Warning() { + level_ = 2; + msg_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Warning(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Warning( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level value = com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + level_ = rawValue; + } + break; + } + case 16: { + bitField0_ |= 0x00000002; + code_ = input.readUInt32(); + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + msg_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Warning_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Warning_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.class, com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Notice.Warning.Level} + */ + public enum Level + implements com.google.protobuf.ProtocolMessageEnum { + /** + * NOTE = 1; + */ + NOTE(1), + /** + * WARNING = 2; + */ + WARNING(2), + /** + * ERROR = 3; + */ + ERROR(3), + ; + + /** + * NOTE = 1; + */ + public static final int NOTE_VALUE = 1; + /** + * WARNING = 2; + */ + public static final int WARNING_VALUE = 2; + /** + * ERROR = 3; + */ + public static final int ERROR_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Level valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Level forNumber(int value) { + switch (value) { + case 1: return NOTE; + case 2: return WARNING; + case 3: return ERROR; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Level> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Level findValueByNumber(int number) { + return Level.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.Warning.getDescriptor().getEnumTypes().get(0); + } + + private static final Level[] VALUES = values(); + + public static Level valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Level(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Notice.Warning.Level) + } + + private int bitField0_; + public static final int LEVEL_FIELD_NUMBER = 1; + private int level_; + /** + *
    +     ** Note or Warning 
    +     * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return Whether the level field is set. + */ + @java.lang.Override public boolean hasLevel() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** Note or Warning 
    +     * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return The level. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level getLevel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level result = com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level.valueOf(level_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level.WARNING : result; + } + + public static final int CODE_FIELD_NUMBER = 2; + private int code_; + /** + *
    +     ** warning code 
    +     * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + @java.lang.Override + public boolean hasCode() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** warning code 
    +     * 
    + * + * required uint32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + + public static final int MSG_FIELD_NUMBER = 3; + private volatile java.lang.Object msg_; + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + @java.lang.Override + public boolean hasMsg() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return The msg. + */ + @java.lang.Override + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } + } + /** + *
    +     ** warning message 
    +     * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasCode()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasMsg()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, level_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeUInt32(2, code_); + } + if (((bitField0_ & 0x00000004) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, msg_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, level_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, code_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, msg_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.Warning)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.Warning other = (com.mysql.cj.x.protobuf.MysqlxNotice.Warning) obj; + + if (hasLevel() != other.hasLevel()) return false; + if (hasLevel()) { + if (level_ != other.level_) return false; + } + if (hasCode() != other.hasCode()) return false; + if (hasCode()) { + if (getCode() + != other.getCode()) return false; + } + if (hasMsg() != other.hasMsg()) return false; + if (hasMsg()) { + if (!getMsg() + .equals(other.getMsg())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasLevel()) { + hash = (37 * hash) + LEVEL_FIELD_NUMBER; + hash = (53 * hash) + level_; + } + if (hasCode()) { + hash = (37 * hash) + CODE_FIELD_NUMBER; + hash = (53 * hash) + getCode(); + } + if (hasMsg()) { + hash = (37 * hash) + MSG_FIELD_NUMBER; + hash = (53 * hash) + getMsg().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.Warning prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Server-side warnings and notes
    +     *@par ``.scope`` == ``local``
    +     *``.level``, ``.code`` and ``.msg`` map the content of:
    +     *@code{sql}
    +     *SHOW WARNINGS
    +     *@endcode
    +     *@par ``.scope`` == ``global``
    +     *(undefined) Will be used for global, unstructured messages like:
    +     *-  server is shutting down
    +     *-  a node disconnected from group
    +     *-  schema or table dropped
    +     *| @ref Mysqlx::Notice::Frame Field  | Value                   |
    +     *|-----------------------------------|-------------------------|
    +     *| ``.type``                         | 1                       |
    +     *| ``.scope``                        | ``local`` or ``global`` |
    +     * 
    + * + * Protobuf type {@code Mysqlx.Notice.Warning} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.Warning) + com.mysql.cj.x.protobuf.MysqlxNotice.WarningOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Warning_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Warning_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.class, com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.Warning.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + level_ = 2; + bitField0_ = (bitField0_ & ~0x00000001); + code_ = 0; + bitField0_ = (bitField0_ & ~0x00000002); + msg_ = ""; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_Warning_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Warning getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.Warning.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Warning build() { + com.mysql.cj.x.protobuf.MysqlxNotice.Warning result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Warning buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.Warning result = new com.mysql.cj.x.protobuf.MysqlxNotice.Warning(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.level_ = level_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.code_ = code_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.msg_ = msg_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.Warning) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.Warning)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.Warning other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.Warning.getDefaultInstance()) return this; + if (other.hasLevel()) { + setLevel(other.getLevel()); + } + if (other.hasCode()) { + setCode(other.getCode()); + } + if (other.hasMsg()) { + bitField0_ |= 0x00000004; + msg_ = other.msg_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasCode()) { + return false; + } + if (!hasMsg()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.Warning parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.Warning) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int level_ = 2; + /** + *
    +       ** Note or Warning 
    +       * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return Whether the level field is set. + */ + @java.lang.Override public boolean hasLevel() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** Note or Warning 
    +       * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return The level. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level getLevel() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level result = com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level.valueOf(level_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level.WARNING : result; + } + /** + *
    +       ** Note or Warning 
    +       * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @param value The level to set. + * @return This builder for chaining. + */ + public Builder setLevel(com.mysql.cj.x.protobuf.MysqlxNotice.Warning.Level value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + level_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** Note or Warning 
    +       * 
    + * + * optional .Mysqlx.Notice.Warning.Level level = 1 [default = WARNING]; + * @return This builder for chaining. + */ + public Builder clearLevel() { + bitField0_ = (bitField0_ & ~0x00000001); + level_ = 2; + onChanged(); + return this; + } + + private int code_ ; + /** + *
    +       ** warning code 
    +       * 
    + * + * required uint32 code = 2; + * @return Whether the code field is set. + */ + @java.lang.Override + public boolean hasCode() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** warning code 
    +       * 
    + * + * required uint32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + /** + *
    +       ** warning code 
    +       * 
    + * + * required uint32 code = 2; + * @param value The code to set. + * @return This builder for chaining. + */ + public Builder setCode(int value) { + bitField0_ |= 0x00000002; + code_ = value; + onChanged(); + return this; + } + /** + *
    +       ** warning code 
    +       * 
    + * + * required uint32 code = 2; + * @return This builder for chaining. + */ + public Builder clearCode() { + bitField0_ = (bitField0_ & ~0x00000002); + code_ = 0; + onChanged(); + return this; + } + + private java.lang.Object msg_ = ""; + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @return Whether the msg field is set. + */ + public boolean hasMsg() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @return The msg. + */ + public java.lang.String getMsg() { + java.lang.Object ref = msg_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + msg_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @return The bytes for msg. + */ + public com.google.protobuf.ByteString + getMsgBytes() { + java.lang.Object ref = msg_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + msg_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @param value The msg to set. + * @return This builder for chaining. + */ + public Builder setMsg( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + msg_ = value; + onChanged(); + return this; + } + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @return This builder for chaining. + */ + public Builder clearMsg() { + bitField0_ = (bitField0_ & ~0x00000004); + msg_ = getDefaultInstance().getMsg(); + onChanged(); + return this; + } + /** + *
    +       ** warning message 
    +       * 
    + * + * required string msg = 3; + * @param value The bytes for msg to set. + * @return This builder for chaining. + */ + public Builder setMsgBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + msg_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.Warning) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.Warning) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.Warning DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.Warning(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.Warning getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Warning parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Warning(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.Warning getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface SessionVariableChangedOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.SessionVariableChanged) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return Whether the param field is set. + */ + boolean hasParam(); + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return The param. + */ + java.lang.String getParam(); + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return The bytes for param. + */ + com.google.protobuf.ByteString + getParamBytes(); + + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return Whether the value field is set. + */ + boolean hasValue(); + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return The value. + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue(); + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder(); + } + /** + *
    +   **
    +   *Notify clients about changes to the current session variables.
    +   *Every change to a variable that is accessible through:
    +   *@code{sql}
    +   *SHOW SESSION VARIABLES
    +   *@endcode
    +   *| @ref Mysqlx::Notice::Frame  Field | Value    |
    +   *|-----------------------------------|----------|
    +   *| ``.type``                         | 2        |
    +   *| ``.scope``                        | ``local``|
    +   * 
    + * + * Protobuf type {@code Mysqlx.Notice.SessionVariableChanged} + */ + public static final class SessionVariableChanged extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.SessionVariableChanged) + SessionVariableChangedOrBuilder { + private static final long serialVersionUID = 0L; + // Use SessionVariableChanged.newBuilder() to construct. + private SessionVariableChanged(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SessionVariableChanged() { + param_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new SessionVariableChanged(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SessionVariableChanged( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + param_ = bs; + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = value_.toBuilder(); + } + value_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(value_); + value_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionVariableChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.Builder.class); + } + + private int bitField0_; + public static final int PARAM_FIELD_NUMBER = 1; + private volatile java.lang.Object param_; + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return Whether the param field is set. + */ + @java.lang.Override + public boolean hasParam() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return The param. + */ + @java.lang.Override + public java.lang.String getParam() { + java.lang.Object ref = param_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + param_ = s; + } + return s; + } + } + /** + *
    +     ** name of the variable 
    +     * 
    + * + * required string param = 1; + * @return The bytes for param. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getParamBytes() { + java.lang.Object ref = param_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + param_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int VALUE_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value_; + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return Whether the value field is set. + */ + @java.lang.Override + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return The value. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : value_; + } + /** + *
    +     ** the changed value of param 
    +     * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder() { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : value_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasParam()) { + memoizedIsInitialized = 0; + return false; + } + if (hasValue()) { + if (!getValue().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, param_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getValue()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, param_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getValue()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged other = (com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged) obj; + + if (hasParam() != other.hasParam()) return false; + if (hasParam()) { + if (!getParam() + .equals(other.getParam())) return false; + } + if (hasValue() != other.hasValue()) return false; + if (hasValue()) { + if (!getValue() + .equals(other.getValue())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasParam()) { + hash = (37 * hash) + PARAM_FIELD_NUMBER; + hash = (53 * hash) + getParam().hashCode(); + } + if (hasValue()) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValue().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Notify clients about changes to the current session variables.
    +     *Every change to a variable that is accessible through:
    +     *@code{sql}
    +     *SHOW SESSION VARIABLES
    +     *@endcode
    +     *| @ref Mysqlx::Notice::Frame  Field | Value    |
    +     *|-----------------------------------|----------|
    +     *| ``.type``                         | 2        |
    +     *| ``.scope``                        | ``local``|
    +     * 
    + * + * Protobuf type {@code Mysqlx.Notice.SessionVariableChanged} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.SessionVariableChanged) + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChangedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionVariableChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + param_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + if (valueBuilder_ == null) { + value_ = null; + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged build() { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged result = new com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.param_ = param_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (valueBuilder_ == null) { + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged.getDefaultInstance()) return this; + if (other.hasParam()) { + bitField0_ |= 0x00000001; + param_ = other.param_; + onChanged(); + } + if (other.hasValue()) { + mergeValue(other.getValue()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasParam()) { + return false; + } + if (hasValue()) { + if (!getValue().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object param_ = ""; + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @return Whether the param field is set. + */ + public boolean hasParam() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @return The param. + */ + public java.lang.String getParam() { + java.lang.Object ref = param_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + param_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @return The bytes for param. + */ + public com.google.protobuf.ByteString + getParamBytes() { + java.lang.Object ref = param_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + param_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @param value The param to set. + * @return This builder for chaining. + */ + public Builder setParam( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + param_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @return This builder for chaining. + */ + public Builder clearParam() { + bitField0_ = (bitField0_ & ~0x00000001); + param_ = getDefaultInstance().getParam(); + onChanged(); + return this; + } + /** + *
    +       ** name of the variable 
    +       * 
    + * + * required string param = 1; + * @param value The bytes for param to set. + * @return This builder for chaining. + */ + public Builder setParamBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + param_ = value; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> valueBuilder_; + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return Whether the value field is set. + */ + public boolean hasValue() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + * @return The value. + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue() { + if (valueBuilder_ == null) { + return value_ == null ? com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : value_; + } else { + return valueBuilder_.getMessage(); + } + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder setValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + value_ = value; + onChanged(); + } else { + valueBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder setValue( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (valueBuilder_ == null) { + value_ = builderForValue.build(); + onChanged(); + } else { + valueBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder mergeValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + value_ != null && + value_ != com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()) { + value_ = + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.newBuilder(value_).mergeFrom(value).buildPartial(); + } else { + value_ = value; + } + onChanged(); + } else { + valueBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = null; + onChanged(); + } else { + valueBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getValueBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getValueFieldBuilder().getBuilder(); + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilder(); + } else { + return value_ == null ? + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance() : value_; + } + } + /** + *
    +       ** the changed value of param 
    +       * 
    + * + * optional .Mysqlx.Datatypes.Scalar value = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + getValue(), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.SessionVariableChanged) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.SessionVariableChanged) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SessionVariableChanged parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SessionVariableChanged(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionVariableChanged getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface SessionStateChangedOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.SessionStateChanged) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** parameter key 
    +     * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return Whether the param field is set. + */ + boolean hasParam(); + /** + *
    +     ** parameter key 
    +     * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return The param. + */ + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter getParam(); + + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + java.util.List + getValueList(); + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue(int index); + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + int getValueCount(); + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + java.util.List + getValueOrBuilderList(); + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder( + int index); + } + /** + * Protobuf type {@code Mysqlx.Notice.SessionStateChanged} + */ + public static final class SessionStateChanged extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.SessionStateChanged) + SessionStateChangedOrBuilder { + private static final long serialVersionUID = 0L; + // Use SessionStateChanged.newBuilder() to construct. + private SessionStateChanged(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private SessionStateChanged() { + param_ = 1; + value_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new SessionStateChanged(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private SessionStateChanged( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter value = com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + param_ = rawValue; + } + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + value_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + value_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.PARSER, extensionRegistry)); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionStateChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionStateChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Notice.SessionStateChanged.Parameter} + */ + public enum Parameter + implements com.google.protobuf.ProtocolMessageEnum { + /** + * CURRENT_SCHEMA = 1; + */ + CURRENT_SCHEMA(1), + /** + * ACCOUNT_EXPIRED = 2; + */ + ACCOUNT_EXPIRED(2), + /** + * GENERATED_INSERT_ID = 3; + */ + GENERATED_INSERT_ID(3), + /** + * ROWS_AFFECTED = 4; + */ + ROWS_AFFECTED(4), + /** + * ROWS_FOUND = 5; + */ + ROWS_FOUND(5), + /** + * ROWS_MATCHED = 6; + */ + ROWS_MATCHED(6), + /** + * TRX_COMMITTED = 7; + */ + TRX_COMMITTED(7), + /** + * TRX_ROLLEDBACK = 9; + */ + TRX_ROLLEDBACK(9), + /** + * PRODUCED_MESSAGE = 10; + */ + PRODUCED_MESSAGE(10), + /** + * CLIENT_ID_ASSIGNED = 11; + */ + CLIENT_ID_ASSIGNED(11), + /** + *
    +       * .. more to be added
    +       * 
    + * + * GENERATED_DOCUMENT_IDS = 12; + */ + GENERATED_DOCUMENT_IDS(12), + ; + + /** + * CURRENT_SCHEMA = 1; + */ + public static final int CURRENT_SCHEMA_VALUE = 1; + /** + * ACCOUNT_EXPIRED = 2; + */ + public static final int ACCOUNT_EXPIRED_VALUE = 2; + /** + * GENERATED_INSERT_ID = 3; + */ + public static final int GENERATED_INSERT_ID_VALUE = 3; + /** + * ROWS_AFFECTED = 4; + */ + public static final int ROWS_AFFECTED_VALUE = 4; + /** + * ROWS_FOUND = 5; + */ + public static final int ROWS_FOUND_VALUE = 5; + /** + * ROWS_MATCHED = 6; + */ + public static final int ROWS_MATCHED_VALUE = 6; + /** + * TRX_COMMITTED = 7; + */ + public static final int TRX_COMMITTED_VALUE = 7; + /** + * TRX_ROLLEDBACK = 9; + */ + public static final int TRX_ROLLEDBACK_VALUE = 9; + /** + * PRODUCED_MESSAGE = 10; + */ + public static final int PRODUCED_MESSAGE_VALUE = 10; + /** + * CLIENT_ID_ASSIGNED = 11; + */ + public static final int CLIENT_ID_ASSIGNED_VALUE = 11; + /** + *
    +       * .. more to be added
    +       * 
    + * + * GENERATED_DOCUMENT_IDS = 12; + */ + public static final int GENERATED_DOCUMENT_IDS_VALUE = 12; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Parameter valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Parameter forNumber(int value) { + switch (value) { + case 1: return CURRENT_SCHEMA; + case 2: return ACCOUNT_EXPIRED; + case 3: return GENERATED_INSERT_ID; + case 4: return ROWS_AFFECTED; + case 5: return ROWS_FOUND; + case 6: return ROWS_MATCHED; + case 7: return TRX_COMMITTED; + case 9: return TRX_ROLLEDBACK; + case 10: return PRODUCED_MESSAGE; + case 11: return CLIENT_ID_ASSIGNED; + case 12: return GENERATED_DOCUMENT_IDS; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Parameter> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Parameter findValueByNumber(int number) { + return Parameter.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.getDescriptor().getEnumTypes().get(0); + } + + private static final Parameter[] VALUES = values(); + + public static Parameter valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Parameter(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Notice.SessionStateChanged.Parameter) + } + + private int bitField0_; + public static final int PARAM_FIELD_NUMBER = 1; + private int param_; + /** + *
    +     ** parameter key 
    +     * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return Whether the param field is set. + */ + @java.lang.Override public boolean hasParam() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** parameter key 
    +     * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return The param. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter getParam() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter result = com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter.valueOf(param_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter.CURRENT_SCHEMA : result; + } + + public static final int VALUE_FIELD_NUMBER = 2; + private java.util.List value_; + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public java.util.List getValueList() { + return value_; + } + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public java.util.List + getValueOrBuilderList() { + return value_; + } + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public int getValueCount() { + return value_.size(); + } + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue(int index) { + return value_.get(index); + } + /** + *
    +     ** updated value 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder( + int index) { + return value_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasParam()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, param_); + } + for (int i = 0; i < value_.size(); i++) { + output.writeMessage(2, value_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, param_); + } + for (int i = 0; i < value_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, value_.get(i)); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged other = (com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged) obj; + + if (hasParam() != other.hasParam()) return false; + if (hasParam()) { + if (param_ != other.param_) return false; + } + if (!getValueList() + .equals(other.getValueList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasParam()) { + hash = (37 * hash) + PARAM_FIELD_NUMBER; + hash = (53 * hash) + param_; + } + if (getValueCount() > 0) { + hash = (37 * hash) + VALUE_FIELD_NUMBER; + hash = (53 * hash) + getValueList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Notice.SessionStateChanged} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.SessionStateChanged) + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChangedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionStateChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionStateChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getValueFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + param_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + valueBuilder_.clear(); + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_SessionStateChanged_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged build() { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged result = new com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.param_ = param_; + if (valueBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + value_ = java.util.Collections.unmodifiableList(value_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.value_ = value_; + } else { + result.value_ = valueBuilder_.build(); + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.getDefaultInstance()) return this; + if (other.hasParam()) { + setParam(other.getParam()); + } + if (valueBuilder_ == null) { + if (!other.value_.isEmpty()) { + if (value_.isEmpty()) { + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureValueIsMutable(); + value_.addAll(other.value_); + } + onChanged(); + } + } else { + if (!other.value_.isEmpty()) { + if (valueBuilder_.isEmpty()) { + valueBuilder_.dispose(); + valueBuilder_ = null; + value_ = other.value_; + bitField0_ = (bitField0_ & ~0x00000002); + valueBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getValueFieldBuilder() : null; + } else { + valueBuilder_.addAllMessages(other.value_); + } + } + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasParam()) { + return false; + } + for (int i = 0; i < getValueCount(); i++) { + if (!getValue(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int param_ = 1; + /** + *
    +       ** parameter key 
    +       * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return Whether the param field is set. + */ + @java.lang.Override public boolean hasParam() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** parameter key 
    +       * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return The param. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter getParam() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter result = com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter.valueOf(param_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter.CURRENT_SCHEMA : result; + } + /** + *
    +       ** parameter key 
    +       * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @param value The param to set. + * @return This builder for chaining. + */ + public Builder setParam(com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged.Parameter value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + param_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** parameter key 
    +       * 
    + * + * required .Mysqlx.Notice.SessionStateChanged.Parameter param = 1; + * @return This builder for chaining. + */ + public Builder clearParam() { + bitField0_ = (bitField0_ & ~0x00000001); + param_ = 1; + onChanged(); + return this; + } + + private java.util.List value_ = + java.util.Collections.emptyList(); + private void ensureValueIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + value_ = new java.util.ArrayList(value_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> valueBuilder_; + + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public java.util.List getValueList() { + if (valueBuilder_ == null) { + return java.util.Collections.unmodifiableList(value_); + } else { + return valueBuilder_.getMessageList(); + } + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public int getValueCount() { + if (valueBuilder_ == null) { + return value_.size(); + } else { + return valueBuilder_.getCount(); + } + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar getValue(int index) { + if (valueBuilder_ == null) { + return value_.get(index); + } else { + return valueBuilder_.getMessage(index); + } + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.set(index, value); + onChanged(); + } else { + valueBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder setValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.set(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder addValue(com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(value); + onChanged(); + } else { + valueBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar value) { + if (valueBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureValueIsMutable(); + value_.add(index, value); + onChanged(); + } else { + valueBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder addValue( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder addValue( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder builderForValue) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.add(index, builderForValue.build()); + onChanged(); + } else { + valueBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder addAllValue( + java.lang.Iterable values) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, value_); + onChanged(); + } else { + valueBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder clearValue() { + if (valueBuilder_ == null) { + value_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + valueBuilder_.clear(); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public Builder removeValue(int index) { + if (valueBuilder_ == null) { + ensureValueIsMutable(); + value_.remove(index); + onChanged(); + } else { + valueBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder getValueBuilder( + int index) { + return getValueFieldBuilder().getBuilder(index); + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder getValueOrBuilder( + int index) { + if (valueBuilder_ == null) { + return value_.get(index); } else { + return valueBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public java.util.List + getValueOrBuilderList() { + if (valueBuilder_ != null) { + return valueBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(value_); + } + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addValueBuilder() { + return getValueFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder addValueBuilder( + int index) { + return getValueFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.getDefaultInstance()); + } + /** + *
    +       ** updated value 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Scalar value = 2; + */ + public java.util.List + getValueBuilderList() { + return getValueFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder> + getValueFieldBuilder() { + if (valueBuilder_ == null) { + valueBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar, com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.ScalarOrBuilder>( + value_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + value_ = null; + } + return valueBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.SessionStateChanged) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.SessionStateChanged) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SessionStateChanged parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new SessionStateChanged(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.SessionStateChanged getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GroupReplicationStateChangedOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.GroupReplicationStateChanged) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** type of group replication event 
    +     * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + *
    +     ** type of group replication event 
    +     * 
    + * + * required uint32 type = 1; + * @return The type. + */ + int getType(); + + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return Whether the viewId field is set. + */ + boolean hasViewId(); + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return The viewId. + */ + java.lang.String getViewId(); + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return The bytes for viewId. + */ + com.google.protobuf.ByteString + getViewIdBytes(); + } + /** + *
    +   **
    +   *Notify clients about group replication state changes
    +   *| @ref Mysqlx::Notice::Frame Field  | Value      |
    +   *|-----------------------------------|------------|
    +   *|``.type``                          | 4          |
    +   *|``.scope``                         | ``global`` |
    +   * 
    + * + * Protobuf type {@code Mysqlx.Notice.GroupReplicationStateChanged} + */ + public static final class GroupReplicationStateChanged extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.GroupReplicationStateChanged) + GroupReplicationStateChangedOrBuilder { + private static final long serialVersionUID = 0L; + // Use GroupReplicationStateChanged.newBuilder() to construct. + private GroupReplicationStateChanged(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private GroupReplicationStateChanged() { + viewId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new GroupReplicationStateChanged(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private GroupReplicationStateChanged( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + type_ = input.readUInt32(); + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + viewId_ = bs; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_GroupReplicationStateChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Notice.GroupReplicationStateChanged.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * MEMBERSHIP_QUORUM_LOSS = 1; + */ + MEMBERSHIP_QUORUM_LOSS(1), + /** + * MEMBERSHIP_VIEW_CHANGE = 2; + */ + MEMBERSHIP_VIEW_CHANGE(2), + /** + * MEMBER_ROLE_CHANGE = 3; + */ + MEMBER_ROLE_CHANGE(3), + /** + * MEMBER_STATE_CHANGE = 4; + */ + MEMBER_STATE_CHANGE(4), + ; + + /** + * MEMBERSHIP_QUORUM_LOSS = 1; + */ + public static final int MEMBERSHIP_QUORUM_LOSS_VALUE = 1; + /** + * MEMBERSHIP_VIEW_CHANGE = 2; + */ + public static final int MEMBERSHIP_VIEW_CHANGE_VALUE = 2; + /** + * MEMBER_ROLE_CHANGE = 3; + */ + public static final int MEMBER_ROLE_CHANGE_VALUE = 3; + /** + * MEMBER_STATE_CHANGE = 4; + */ + public static final int MEMBER_STATE_CHANGE_VALUE = 4; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 1: return MEMBERSHIP_QUORUM_LOSS; + case 2: return MEMBERSHIP_VIEW_CHANGE; + case 3: return MEMBER_ROLE_CHANGE; + case 4: return MEMBER_STATE_CHANGE; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Notice.GroupReplicationStateChanged.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + *
    +     ** type of group replication event 
    +     * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override + public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** type of group replication event 
    +     * 
    + * + * required uint32 type = 1; + * @return The type. + */ + @java.lang.Override + public int getType() { + return type_; + } + + public static final int VIEW_ID_FIELD_NUMBER = 2; + private volatile java.lang.Object viewId_; + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return Whether the viewId field is set. + */ + @java.lang.Override + public boolean hasViewId() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return The viewId. + */ + @java.lang.Override + public java.lang.String getViewId() { + java.lang.Object ref = viewId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + viewId_ = s; + } + return s; + } + } + /** + *
    +     ** view identifier 
    +     * 
    + * + * optional string view_id = 2; + * @return The bytes for viewId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getViewIdBytes() { + java.lang.Object ref = viewId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + viewId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, viewId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, viewId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged other = (com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (getType() + != other.getType()) return false; + } + if (hasViewId() != other.hasViewId()) return false; + if (hasViewId()) { + if (!getViewId() + .equals(other.getViewId())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + getType(); + } + if (hasViewId()) { + hash = (37 * hash) + VIEW_ID_FIELD_NUMBER; + hash = (53 * hash) + getViewId().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Notify clients about group replication state changes
    +     *| @ref Mysqlx::Notice::Frame Field  | Value      |
    +     *|-----------------------------------|------------|
    +     *|``.type``                          | 4          |
    +     *|``.scope``                         | ``global`` |
    +     * 
    + * + * Protobuf type {@code Mysqlx.Notice.GroupReplicationStateChanged} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.GroupReplicationStateChanged) + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChangedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_GroupReplicationStateChanged_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.class, com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + viewId_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged build() { + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged result = new com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.type_ = type_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.viewId_ = viewId_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasViewId()) { + bitField0_ |= 0x00000002; + viewId_ = other.viewId_; + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ ; + /** + *
    +       ** type of group replication event 
    +       * 
    + * + * required uint32 type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override + public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** type of group replication event 
    +       * 
    + * + * required uint32 type = 1; + * @return The type. + */ + @java.lang.Override + public int getType() { + return type_; + } + /** + *
    +       ** type of group replication event 
    +       * 
    + * + * required uint32 type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(int value) { + bitField0_ |= 0x00000001; + type_ = value; + onChanged(); + return this; + } + /** + *
    +       ** type of group replication event 
    +       * 
    + * + * required uint32 type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 0; + onChanged(); + return this; + } + + private java.lang.Object viewId_ = ""; + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @return Whether the viewId field is set. + */ + public boolean hasViewId() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @return The viewId. + */ + public java.lang.String getViewId() { + java.lang.Object ref = viewId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + viewId_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @return The bytes for viewId. + */ + public com.google.protobuf.ByteString + getViewIdBytes() { + java.lang.Object ref = viewId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + viewId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @param value The viewId to set. + * @return This builder for chaining. + */ + public Builder setViewId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + viewId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @return This builder for chaining. + */ + public Builder clearViewId() { + bitField0_ = (bitField0_ & ~0x00000002); + viewId_ = getDefaultInstance().getViewId(); + onChanged(); + return this; + } + /** + *
    +       ** view identifier 
    +       * 
    + * + * optional string view_id = 2; + * @param value The bytes for viewId to set. + * @return This builder for chaining. + */ + public Builder setViewIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + viewId_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.GroupReplicationStateChanged) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.GroupReplicationStateChanged) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GroupReplicationStateChanged parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new GroupReplicationStateChanged(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.GroupReplicationStateChanged getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ServerHelloOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Notice.ServerHello) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Notify clients about connection to X Protocol server
    +   *| @ref Mysqlx::Notice::Frame Field  | Value      |
    +   *|-----------------------------------|------------|
    +   *|``.type``                          | 5          |
    +   *|``.scope``                         | ``global`` |
    +   * 
    + * + * Protobuf type {@code Mysqlx.Notice.ServerHello} + */ + public static final class ServerHello extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Notice.ServerHello) + ServerHelloOrBuilder { + private static final long serialVersionUID = 0L; + // Use ServerHello.newBuilder() to construct. + private ServerHello(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ServerHello() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ServerHello(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ServerHello( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_ServerHello_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_ServerHello_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.class, com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello other = (com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Notify clients about connection to X Protocol server
    +     *| @ref Mysqlx::Notice::Frame Field  | Value      |
    +     *|-----------------------------------|------------|
    +     *|``.type``                          | 5          |
    +     *|``.scope``                         | ``global`` |
    +     * 
    + * + * Protobuf type {@code Mysqlx.Notice.ServerHello} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Notice.ServerHello) + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHelloOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_ServerHello_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_ServerHello_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.class, com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.internal_static_Mysqlx_Notice_ServerHello_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello build() { + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello buildPartial() { + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello result = new com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello other) { + if (other == com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Notice.ServerHello) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Notice.ServerHello) + private static final com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello(); + } + + public static com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ServerHello parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ServerHello(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxNotice.ServerHello getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_Frame_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_Frame_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_Warning_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_Warning_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_SessionVariableChanged_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_SessionStateChanged_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_SessionStateChanged_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_GroupReplicationStateChanged_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Notice_ServerHello_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Notice_ServerHello_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\023mysqlx_notice.proto\022\rMysqlx.Notice\032\014my" + + "sqlx.proto\032\026mysqlx_datatypes.proto\"\205\002\n\005F" + + "rame\022\014\n\004type\030\001 \002(\r\0221\n\005scope\030\002 \001(\0162\032.Mysq" + + "lx.Notice.Frame.Scope:\006GLOBAL\022\017\n\007payload" + + "\030\003 \001(\014\"\036\n\005Scope\022\n\n\006GLOBAL\020\001\022\t\n\005LOCAL\020\002\"\203" + + "\001\n\004Type\022\013\n\007WARNING\020\001\022\034\n\030SESSION_VARIABLE" + + "_CHANGED\020\002\022\031\n\025SESSION_STATE_CHANGED\020\003\022#\n" + + "\037GROUP_REPLICATION_STATE_CHANGED\020\004\022\020\n\014SE" + + "RVER_HELLO\020\005:\004\220\3520\013\"\205\001\n\007Warning\0224\n\005level\030" + + "\001 \001(\0162\034.Mysqlx.Notice.Warning.Level:\007WAR" + + "NING\022\014\n\004code\030\002 \002(\r\022\013\n\003msg\030\003 \002(\t\")\n\005Level" + + "\022\010\n\004NOTE\020\001\022\013\n\007WARNING\020\002\022\t\n\005ERROR\020\003\"P\n\026Se" + + "ssionVariableChanged\022\r\n\005param\030\001 \002(\t\022\'\n\005v" + + "alue\030\002 \001(\0132\030.Mysqlx.Datatypes.Scalar\"\361\002\n" + + "\023SessionStateChanged\022;\n\005param\030\001 \002(\0162,.My" + + "sqlx.Notice.SessionStateChanged.Paramete" + + "r\022\'\n\005value\030\002 \003(\0132\030.Mysqlx.Datatypes.Scal" + + "ar\"\363\001\n\tParameter\022\022\n\016CURRENT_SCHEMA\020\001\022\023\n\017" + + "ACCOUNT_EXPIRED\020\002\022\027\n\023GENERATED_INSERT_ID" + + "\020\003\022\021\n\rROWS_AFFECTED\020\004\022\016\n\nROWS_FOUND\020\005\022\020\n" + + "\014ROWS_MATCHED\020\006\022\021\n\rTRX_COMMITTED\020\007\022\022\n\016TR" + + "X_ROLLEDBACK\020\t\022\024\n\020PRODUCED_MESSAGE\020\n\022\026\n\022" + + "CLIENT_ID_ASSIGNED\020\013\022\032\n\026GENERATED_DOCUME" + + "NT_IDS\020\014\"\256\001\n\034GroupReplicationStateChange" + + "d\022\014\n\004type\030\001 \002(\r\022\017\n\007view_id\030\002 \001(\t\"o\n\004Type" + + "\022\032\n\026MEMBERSHIP_QUORUM_LOSS\020\001\022\032\n\026MEMBERSH" + + "IP_VIEW_CHANGE\020\002\022\026\n\022MEMBER_ROLE_CHANGE\020\003" + + "\022\027\n\023MEMBER_STATE_CHANGE\020\004\"\r\n\013ServerHello" + + "B\031\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + }); + internal_static_Mysqlx_Notice_Frame_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Notice_Frame_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_Frame_descriptor, + new java.lang.String[] { "Type", "Scope", "Payload", }); + internal_static_Mysqlx_Notice_Warning_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Notice_Warning_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_Warning_descriptor, + new java.lang.String[] { "Level", "Code", "Msg", }); + internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Notice_SessionVariableChanged_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_SessionVariableChanged_descriptor, + new java.lang.String[] { "Param", "Value", }); + internal_static_Mysqlx_Notice_SessionStateChanged_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Notice_SessionStateChanged_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_SessionStateChanged_descriptor, + new java.lang.String[] { "Param", "Value", }); + internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Notice_GroupReplicationStateChanged_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_GroupReplicationStateChanged_descriptor, + new java.lang.String[] { "Type", "ViewId", }); + internal_static_Mysqlx_Notice_ServerHello_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_Mysqlx_Notice_ServerHello_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Notice_ServerHello_descriptor, + new java.lang.String[] { }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxPrepare.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxPrepare.java new file mode 100644 index 0000000..bd282f3 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxPrepare.java @@ -0,0 +1,4615 @@ +/* + * Copyright (c) 2019, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_prepare.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxPrepare { + private MysqlxPrepare() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface PrepareOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Prepare.Prepare) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned statement ID, which is going to identify
    +     *the result of preparation 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + boolean hasStmtId(); + /** + *
    +     ** client-side assigned statement ID, which is going to identify
    +     *the result of preparation 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + int getStmtId(); + + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return Whether the stmt field is set. + */ + boolean hasStmt(); + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return The stmt. + */ + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getStmt(); + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder getStmtOrBuilder(); + } + /** + *
    +   **
    +   *Prepare a new statement
    +   *@startuml
    +   *client -> server: Prepare
    +   *alt Success
    +   *client <- server: Ok
    +   *else Failure
    +   *client <- server: Error
    +   *end
    +   *@enduml
    +   *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Prepare} + */ + public static final class Prepare extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Prepare.Prepare) + PrepareOrBuilder { + private static final long serialVersionUID = 0L; + // Use Prepare.newBuilder() to construct. + private Prepare(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Prepare() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Prepare(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Prepare( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + stmtId_ = input.readUInt32(); + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = stmt_.toBuilder(); + } + stmt_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(stmt_); + stmt_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.Builder.class); + } + + public interface OneOfMessageOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Prepare.Prepare.OneOfMessage) + com.google.protobuf.MessageOrBuilder { + + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type getType(); + + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return Whether the find field is set. + */ + boolean hasFind(); + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return The find. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Find getFind(); + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getFindOrBuilder(); + + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return Whether the insert field is set. + */ + boolean hasInsert(); + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return The insert. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Insert getInsert(); + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder getInsertOrBuilder(); + + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return Whether the update field is set. + */ + boolean hasUpdate(); + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return The update. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Update getUpdate(); + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder getUpdateOrBuilder(); + + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return Whether the delete field is set. + */ + boolean hasDelete(); + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return The delete. + */ + com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDelete(); + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder getDeleteOrBuilder(); + + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return Whether the stmtExecute field is set. + */ + boolean hasStmtExecute(); + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return The stmtExecute. + */ + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getStmtExecute(); + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder getStmtExecuteOrBuilder(); + } + /** + * Protobuf type {@code Mysqlx.Prepare.Prepare.OneOfMessage} + */ + public static final class OneOfMessage extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Prepare.Prepare.OneOfMessage) + OneOfMessageOrBuilder { + private static final long serialVersionUID = 0L; + // Use OneOfMessage.newBuilder() to construct. + private OneOfMessage(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private OneOfMessage() { + type_ = 0; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new OneOfMessage(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private OneOfMessage( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type value = com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder subBuilder = null; + if (((bitField0_ & 0x00000002) != 0)) { + subBuilder = find_.toBuilder(); + } + find_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Find.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(find_); + find_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000002; + break; + } + case 26: { + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder subBuilder = null; + if (((bitField0_ & 0x00000004) != 0)) { + subBuilder = insert_.toBuilder(); + } + insert_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Insert.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(insert_); + insert_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000004; + break; + } + case 34: { + com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder subBuilder = null; + if (((bitField0_ & 0x00000008) != 0)) { + subBuilder = update_.toBuilder(); + } + update_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Update.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(update_); + update_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000008; + break; + } + case 42: { + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder subBuilder = null; + if (((bitField0_ & 0x00000010) != 0)) { + subBuilder = delete_.toBuilder(); + } + delete_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxCrud.Delete.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(delete_); + delete_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000010; + break; + } + case 50: { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder subBuilder = null; + if (((bitField0_ & 0x00000020) != 0)) { + subBuilder = stmtExecute_.toBuilder(); + } + stmtExecute_ = input.readMessage(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(stmtExecute_); + stmtExecute_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000020; + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder.class); + } + + /** + *
    +       * Determine which of optional fields was set by the client
    +       * (Workaround for missing "oneof" keyword in pb2.5)
    +       * 
    + * + * Protobuf enum {@code Mysqlx.Prepare.Prepare.OneOfMessage.Type} + */ + public enum Type + implements com.google.protobuf.ProtocolMessageEnum { + /** + * FIND = 0; + */ + FIND(0), + /** + * INSERT = 1; + */ + INSERT(1), + /** + * UPDATE = 2; + */ + UPDATE(2), + /** + * DELETE = 4; + */ + DELETE(4), + /** + * STMT = 5; + */ + STMT(5), + ; + + /** + * FIND = 0; + */ + public static final int FIND_VALUE = 0; + /** + * INSERT = 1; + */ + public static final int INSERT_VALUE = 1; + /** + * UPDATE = 2; + */ + public static final int UPDATE_VALUE = 2; + /** + * DELETE = 4; + */ + public static final int DELETE_VALUE = 4; + /** + * STMT = 5; + */ + public static final int STMT_VALUE = 5; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Type valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Type forNumber(int value) { + switch (value) { + case 0: return FIND; + case 1: return INSERT; + case 2: return UPDATE; + case 4: return DELETE; + case 5: return STMT; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Type> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Type findValueByNumber(int number) { + return Type.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDescriptor().getEnumTypes().get(0); + } + + private static final Type[] VALUES = values(); + + public static Type valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Type(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Prepare.Prepare.OneOfMessage.Type) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type result = com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type.FIND : result; + } + + public static final int FIND_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxCrud.Find find_; + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return Whether the find field is set. + */ + @java.lang.Override + public boolean hasFind() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return The find. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getFind() { + return find_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : find_; + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getFindOrBuilder() { + return find_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : find_; + } + + public static final int INSERT_FIELD_NUMBER = 3; + private com.mysql.cj.x.protobuf.MysqlxCrud.Insert insert_; + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return Whether the insert field is set. + */ + @java.lang.Override + public boolean hasInsert() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return The insert. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert getInsert() { + return insert_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance() : insert_; + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder getInsertOrBuilder() { + return insert_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance() : insert_; + } + + public static final int UPDATE_FIELD_NUMBER = 4; + private com.mysql.cj.x.protobuf.MysqlxCrud.Update update_; + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return Whether the update field is set. + */ + @java.lang.Override + public boolean hasUpdate() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return The update. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Update getUpdate() { + return update_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance() : update_; + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder getUpdateOrBuilder() { + return update_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance() : update_; + } + + public static final int DELETE_FIELD_NUMBER = 5; + private com.mysql.cj.x.protobuf.MysqlxCrud.Delete delete_; + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return Whether the delete field is set. + */ + @java.lang.Override + public boolean hasDelete() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return The delete. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDelete() { + return delete_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance() : delete_; + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder getDeleteOrBuilder() { + return delete_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance() : delete_; + } + + public static final int STMT_EXECUTE_FIELD_NUMBER = 6; + private com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute stmtExecute_; + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return Whether the stmtExecute field is set. + */ + @java.lang.Override + public boolean hasStmtExecute() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return The stmtExecute. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getStmtExecute() { + return stmtExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance() : stmtExecute_; + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder getStmtExecuteOrBuilder() { + return stmtExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance() : stmtExecute_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + if (hasFind()) { + if (!getFind().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasInsert()) { + if (!getInsert().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasUpdate()) { + if (!getUpdate().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasDelete()) { + if (!getDelete().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + if (hasStmtExecute()) { + if (!getStmtExecute().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getFind()); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeMessage(3, getInsert()); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeMessage(4, getUpdate()); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeMessage(5, getDelete()); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeMessage(6, getStmtExecute()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getFind()); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getInsert()); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, getUpdate()); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, getDelete()); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, getStmtExecute()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage other = (com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasFind() != other.hasFind()) return false; + if (hasFind()) { + if (!getFind() + .equals(other.getFind())) return false; + } + if (hasInsert() != other.hasInsert()) return false; + if (hasInsert()) { + if (!getInsert() + .equals(other.getInsert())) return false; + } + if (hasUpdate() != other.hasUpdate()) return false; + if (hasUpdate()) { + if (!getUpdate() + .equals(other.getUpdate())) return false; + } + if (hasDelete() != other.hasDelete()) return false; + if (hasDelete()) { + if (!getDelete() + .equals(other.getDelete())) return false; + } + if (hasStmtExecute() != other.hasStmtExecute()) return false; + if (hasStmtExecute()) { + if (!getStmtExecute() + .equals(other.getStmtExecute())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasFind()) { + hash = (37 * hash) + FIND_FIELD_NUMBER; + hash = (53 * hash) + getFind().hashCode(); + } + if (hasInsert()) { + hash = (37 * hash) + INSERT_FIELD_NUMBER; + hash = (53 * hash) + getInsert().hashCode(); + } + if (hasUpdate()) { + hash = (37 * hash) + UPDATE_FIELD_NUMBER; + hash = (53 * hash) + getUpdate().hashCode(); + } + if (hasDelete()) { + hash = (37 * hash) + DELETE_FIELD_NUMBER; + hash = (53 * hash) + getDelete().hashCode(); + } + if (hasStmtExecute()) { + hash = (37 * hash) + STMT_EXECUTE_FIELD_NUMBER; + hash = (53 * hash) + getStmtExecute().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Mysqlx.Prepare.Prepare.OneOfMessage} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Prepare.Prepare.OneOfMessage) + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getFindFieldBuilder(); + getInsertFieldBuilder(); + getUpdateFieldBuilder(); + getDeleteFieldBuilder(); + getStmtExecuteFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (findBuilder_ == null) { + find_ = null; + } else { + findBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + if (insertBuilder_ == null) { + insert_ = null; + } else { + insertBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + if (updateBuilder_ == null) { + update_ = null; + } else { + updateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + if (deleteBuilder_ == null) { + delete_ = null; + } else { + deleteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + if (stmtExecuteBuilder_ == null) { + stmtExecute_ = null; + } else { + stmtExecuteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage build() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage buildPartial() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage result = new com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + if (findBuilder_ == null) { + result.find_ = find_; + } else { + result.find_ = findBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + if (insertBuilder_ == null) { + result.insert_ = insert_; + } else { + result.insert_ = insertBuilder_.build(); + } + to_bitField0_ |= 0x00000004; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + if (updateBuilder_ == null) { + result.update_ = update_; + } else { + result.update_ = updateBuilder_.build(); + } + to_bitField0_ |= 0x00000008; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + if (deleteBuilder_ == null) { + result.delete_ = delete_; + } else { + result.delete_ = deleteBuilder_.build(); + } + to_bitField0_ |= 0x00000010; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + if (stmtExecuteBuilder_ == null) { + result.stmtExecute_ = stmtExecute_; + } else { + result.stmtExecute_ = stmtExecuteBuilder_.build(); + } + to_bitField0_ |= 0x00000020; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage other) { + if (other == com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasFind()) { + mergeFind(other.getFind()); + } + if (other.hasInsert()) { + mergeInsert(other.getInsert()); + } + if (other.hasUpdate()) { + mergeUpdate(other.getUpdate()); + } + if (other.hasDelete()) { + mergeDelete(other.getDelete()); + } + if (other.hasStmtExecute()) { + mergeStmtExecute(other.getStmtExecute()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + if (hasFind()) { + if (!getFind().isInitialized()) { + return false; + } + } + if (hasInsert()) { + if (!getInsert().isInitialized()) { + return false; + } + } + if (hasUpdate()) { + if (!getUpdate().isInitialized()) { + return false; + } + } + if (hasDelete()) { + if (!getDelete().isInitialized()) { + return false; + } + } + if (hasStmtExecute()) { + if (!getStmtExecute().isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 0; + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type result = com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type.FIND : result; + } + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Type value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + * required .Mysqlx.Prepare.Prepare.OneOfMessage.Type type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 0; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Find find_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> findBuilder_; + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return Whether the find field is set. + */ + public boolean hasFind() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * optional .Mysqlx.Crud.Find find = 2; + * @return The find. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find getFind() { + if (findBuilder_ == null) { + return find_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : find_; + } else { + return findBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public Builder setFind(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (findBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + find_ = value; + onChanged(); + } else { + findBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public Builder setFind( + com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder builderForValue) { + if (findBuilder_ == null) { + find_ = builderForValue.build(); + onChanged(); + } else { + findBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public Builder mergeFind(com.mysql.cj.x.protobuf.MysqlxCrud.Find value) { + if (findBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + find_ != null && + find_ != com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance()) { + find_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Find.newBuilder(find_).mergeFrom(value).buildPartial(); + } else { + find_ = value; + } + onChanged(); + } else { + findBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public Builder clearFind() { + if (findBuilder_ == null) { + find_ = null; + onChanged(); + } else { + findBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder getFindBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getFindFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder getFindOrBuilder() { + if (findBuilder_ != null) { + return findBuilder_.getMessageOrBuilder(); + } else { + return find_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Find.getDefaultInstance() : find_; + } + } + /** + * optional .Mysqlx.Crud.Find find = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder> + getFindFieldBuilder() { + if (findBuilder_ == null) { + findBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Find, com.mysql.cj.x.protobuf.MysqlxCrud.Find.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.FindOrBuilder>( + getFind(), + getParentForChildren(), + isClean()); + find_ = null; + } + return findBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Insert insert_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder> insertBuilder_; + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return Whether the insert field is set. + */ + public boolean hasInsert() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + * @return The insert. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert getInsert() { + if (insertBuilder_ == null) { + return insert_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance() : insert_; + } else { + return insertBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public Builder setInsert(com.mysql.cj.x.protobuf.MysqlxCrud.Insert value) { + if (insertBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + insert_ = value; + onChanged(); + } else { + insertBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public Builder setInsert( + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder builderForValue) { + if (insertBuilder_ == null) { + insert_ = builderForValue.build(); + onChanged(); + } else { + insertBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public Builder mergeInsert(com.mysql.cj.x.protobuf.MysqlxCrud.Insert value) { + if (insertBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && + insert_ != null && + insert_ != com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance()) { + insert_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.newBuilder(insert_).mergeFrom(value).buildPartial(); + } else { + insert_ = value; + } + onChanged(); + } else { + insertBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + return this; + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public Builder clearInsert() { + if (insertBuilder_ == null) { + insert_ = null; + onChanged(); + } else { + insertBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder getInsertBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getInsertFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder getInsertOrBuilder() { + if (insertBuilder_ != null) { + return insertBuilder_.getMessageOrBuilder(); + } else { + return insert_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Insert.getDefaultInstance() : insert_; + } + } + /** + * optional .Mysqlx.Crud.Insert insert = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder> + getInsertFieldBuilder() { + if (insertBuilder_ == null) { + insertBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Insert, com.mysql.cj.x.protobuf.MysqlxCrud.Insert.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.InsertOrBuilder>( + getInsert(), + getParentForChildren(), + isClean()); + insert_ = null; + } + return insertBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Update update_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Update, com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder> updateBuilder_; + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return Whether the update field is set. + */ + public boolean hasUpdate() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * optional .Mysqlx.Crud.Update update = 4; + * @return The update. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Update getUpdate() { + if (updateBuilder_ == null) { + return update_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance() : update_; + } else { + return updateBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public Builder setUpdate(com.mysql.cj.x.protobuf.MysqlxCrud.Update value) { + if (updateBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + update_ = value; + onChanged(); + } else { + updateBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public Builder setUpdate( + com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder builderForValue) { + if (updateBuilder_ == null) { + update_ = builderForValue.build(); + onChanged(); + } else { + updateBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public Builder mergeUpdate(com.mysql.cj.x.protobuf.MysqlxCrud.Update value) { + if (updateBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) && + update_ != null && + update_ != com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance()) { + update_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Update.newBuilder(update_).mergeFrom(value).buildPartial(); + } else { + update_ = value; + } + onChanged(); + } else { + updateBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000008; + return this; + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public Builder clearUpdate() { + if (updateBuilder_ == null) { + update_ = null; + onChanged(); + } else { + updateBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder getUpdateBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getUpdateFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder getUpdateOrBuilder() { + if (updateBuilder_ != null) { + return updateBuilder_.getMessageOrBuilder(); + } else { + return update_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Update.getDefaultInstance() : update_; + } + } + /** + * optional .Mysqlx.Crud.Update update = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Update, com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder> + getUpdateFieldBuilder() { + if (updateBuilder_ == null) { + updateBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Update, com.mysql.cj.x.protobuf.MysqlxCrud.Update.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOrBuilder>( + getUpdate(), + getParentForChildren(), + isClean()); + update_ = null; + } + return updateBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxCrud.Delete delete_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Delete, com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder> deleteBuilder_; + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return Whether the delete field is set. + */ + public boolean hasDelete() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + * @return The delete. + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete getDelete() { + if (deleteBuilder_ == null) { + return delete_ == null ? com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance() : delete_; + } else { + return deleteBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public Builder setDelete(com.mysql.cj.x.protobuf.MysqlxCrud.Delete value) { + if (deleteBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + delete_ = value; + onChanged(); + } else { + deleteBuilder_.setMessage(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public Builder setDelete( + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder builderForValue) { + if (deleteBuilder_ == null) { + delete_ = builderForValue.build(); + onChanged(); + } else { + deleteBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public Builder mergeDelete(com.mysql.cj.x.protobuf.MysqlxCrud.Delete value) { + if (deleteBuilder_ == null) { + if (((bitField0_ & 0x00000010) != 0) && + delete_ != null && + delete_ != com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance()) { + delete_ = + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.newBuilder(delete_).mergeFrom(value).buildPartial(); + } else { + delete_ = value; + } + onChanged(); + } else { + deleteBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000010; + return this; + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public Builder clearDelete() { + if (deleteBuilder_ == null) { + delete_ = null; + onChanged(); + } else { + deleteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000010); + return this; + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder getDeleteBuilder() { + bitField0_ |= 0x00000010; + onChanged(); + return getDeleteFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + public com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder getDeleteOrBuilder() { + if (deleteBuilder_ != null) { + return deleteBuilder_.getMessageOrBuilder(); + } else { + return delete_ == null ? + com.mysql.cj.x.protobuf.MysqlxCrud.Delete.getDefaultInstance() : delete_; + } + } + /** + * optional .Mysqlx.Crud.Delete delete = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Delete, com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder> + getDeleteFieldBuilder() { + if (deleteBuilder_ == null) { + deleteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxCrud.Delete, com.mysql.cj.x.protobuf.MysqlxCrud.Delete.Builder, com.mysql.cj.x.protobuf.MysqlxCrud.DeleteOrBuilder>( + getDelete(), + getParentForChildren(), + isClean()); + delete_ = null; + } + return deleteBuilder_; + } + + private com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute stmtExecute_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder> stmtExecuteBuilder_; + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return Whether the stmtExecute field is set. + */ + public boolean hasStmtExecute() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + * @return The stmtExecute. + */ + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getStmtExecute() { + if (stmtExecuteBuilder_ == null) { + return stmtExecute_ == null ? com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance() : stmtExecute_; + } else { + return stmtExecuteBuilder_.getMessage(); + } + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public Builder setStmtExecute(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute value) { + if (stmtExecuteBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + stmtExecute_ = value; + onChanged(); + } else { + stmtExecuteBuilder_.setMessage(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public Builder setStmtExecute( + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder builderForValue) { + if (stmtExecuteBuilder_ == null) { + stmtExecute_ = builderForValue.build(); + onChanged(); + } else { + stmtExecuteBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public Builder mergeStmtExecute(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute value) { + if (stmtExecuteBuilder_ == null) { + if (((bitField0_ & 0x00000020) != 0) && + stmtExecute_ != null && + stmtExecute_ != com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance()) { + stmtExecute_ = + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.newBuilder(stmtExecute_).mergeFrom(value).buildPartial(); + } else { + stmtExecute_ = value; + } + onChanged(); + } else { + stmtExecuteBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000020; + return this; + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public Builder clearStmtExecute() { + if (stmtExecuteBuilder_ == null) { + stmtExecute_ = null; + onChanged(); + } else { + stmtExecuteBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000020); + return this; + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder getStmtExecuteBuilder() { + bitField0_ |= 0x00000020; + onChanged(); + return getStmtExecuteFieldBuilder().getBuilder(); + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder getStmtExecuteOrBuilder() { + if (stmtExecuteBuilder_ != null) { + return stmtExecuteBuilder_.getMessageOrBuilder(); + } else { + return stmtExecute_ == null ? + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance() : stmtExecute_; + } + } + /** + * optional .Mysqlx.Sql.StmtExecute stmt_execute = 6; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder> + getStmtExecuteFieldBuilder() { + if (stmtExecuteBuilder_ == null) { + stmtExecuteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder>( + getStmtExecute(), + getParentForChildren(), + isClean()); + stmtExecute_ = null; + } + return stmtExecuteBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Prepare.Prepare.OneOfMessage) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Prepare.Prepare.OneOfMessage) + private static final com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage(); + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public OneOfMessage parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new OneOfMessage(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private int bitField0_; + public static final int STMT_ID_FIELD_NUMBER = 1; + private int stmtId_; + /** + *
    +     ** client-side assigned statement ID, which is going to identify
    +     *the result of preparation 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned statement ID, which is going to identify
    +     *the result of preparation 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + + public static final int STMT_FIELD_NUMBER = 2; + private com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage stmt_; + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return The stmt. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getStmt() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance() : stmt_; + } + /** + *
    +     ** defines one of following messages to be prepared:
    +     *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +     * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder getStmtOrBuilder() { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance() : stmt_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasStmtId()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasStmt()) { + memoizedIsInitialized = 0; + return false; + } + if (!getStmt().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, stmtId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(2, getStmt()); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, stmtId_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, getStmt()); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare other = (com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare) obj; + + if (hasStmtId() != other.hasStmtId()) return false; + if (hasStmtId()) { + if (getStmtId() + != other.getStmtId()) return false; + } + if (hasStmt() != other.hasStmt()) return false; + if (hasStmt()) { + if (!getStmt() + .equals(other.getStmt())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasStmtId()) { + hash = (37 * hash) + STMT_ID_FIELD_NUMBER; + hash = (53 * hash) + getStmtId(); + } + if (hasStmt()) { + hash = (37 * hash) + STMT_FIELD_NUMBER; + hash = (53 * hash) + getStmt().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Prepare a new statement
    +     *@startuml
    +     *client -> server: Prepare
    +     *alt Success
    +     *client <- server: Ok
    +     *else Failure
    +     *client <- server: Error
    +     *end
    +     *@enduml
    +     *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Prepare} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Prepare.Prepare) + com.mysql.cj.x.protobuf.MysqlxPrepare.PrepareOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getStmtFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + stmtId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (stmtBuilder_ == null) { + stmt_ = null; + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Prepare_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare build() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare buildPartial() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare result = new com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.stmtId_ = stmtId_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + if (stmtBuilder_ == null) { + result.stmt_ = stmt_; + } else { + result.stmt_ = stmtBuilder_.build(); + } + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare other) { + if (other == com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.getDefaultInstance()) return this; + if (other.hasStmtId()) { + setStmtId(other.getStmtId()); + } + if (other.hasStmt()) { + mergeStmt(other.getStmt()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasStmtId()) { + return false; + } + if (!hasStmt()) { + return false; + } + if (!getStmt().isInitialized()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int stmtId_ ; + /** + *
    +       ** client-side assigned statement ID, which is going to identify
    +       *the result of preparation 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned statement ID, which is going to identify
    +       *the result of preparation 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + /** + *
    +       ** client-side assigned statement ID, which is going to identify
    +       *the result of preparation 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @param value The stmtId to set. + * @return This builder for chaining. + */ + public Builder setStmtId(int value) { + bitField0_ |= 0x00000001; + stmtId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned statement ID, which is going to identify
    +       *the result of preparation 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return This builder for chaining. + */ + public Builder clearStmtId() { + bitField0_ = (bitField0_ & ~0x00000001); + stmtId_ = 0; + onChanged(); + return this; + } + + private com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage stmt_; + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder> stmtBuilder_; + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return Whether the stmt field is set. + */ + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + * @return The stmt. + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage getStmt() { + if (stmtBuilder_ == null) { + return stmt_ == null ? com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance() : stmt_; + } else { + return stmtBuilder_.getMessage(); + } + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public Builder setStmt(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage value) { + if (stmtBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + stmt_ = value; + onChanged(); + } else { + stmtBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public Builder setStmt( + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder builderForValue) { + if (stmtBuilder_ == null) { + stmt_ = builderForValue.build(); + onChanged(); + } else { + stmtBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public Builder mergeStmt(com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage value) { + if (stmtBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && + stmt_ != null && + stmt_ != com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance()) { + stmt_ = + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.newBuilder(stmt_).mergeFrom(value).buildPartial(); + } else { + stmt_ = value; + } + onChanged(); + } else { + stmtBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + return this; + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public Builder clearStmt() { + if (stmtBuilder_ == null) { + stmt_ = null; + onChanged(); + } else { + stmtBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder getStmtBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getStmtFieldBuilder().getBuilder(); + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder getStmtOrBuilder() { + if (stmtBuilder_ != null) { + return stmtBuilder_.getMessageOrBuilder(); + } else { + return stmt_ == null ? + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.getDefaultInstance() : stmt_; + } + } + /** + *
    +       ** defines one of following messages to be prepared:
    +       *Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute 
    +       * 
    + * + * required .Mysqlx.Prepare.Prepare.OneOfMessage stmt = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder> + getStmtFieldBuilder() { + if (stmtBuilder_ == null) { + stmtBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage.Builder, com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessageOrBuilder>( + getStmt(), + getParentForChildren(), + isClean()); + stmt_ = null; + } + return stmtBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Prepare.Prepare) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Prepare.Prepare) + private static final com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare(); + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Prepare parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Prepare(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ExecuteOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Prepare.Execute) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + boolean hasStmtId(); + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + int getStmtId(); + + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + java.util.List + getArgsList(); + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index); + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + int getArgsCount(); + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** send only type information for
    +     *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return Whether the compactMetadata field is set. + */ + boolean hasCompactMetadata(); + /** + *
    +     ** send only type information for
    +     *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return The compactMetadata. + */ + boolean getCompactMetadata(); + } + /** + *
    +   **
    +   *Execute already-prepared statement
    +   *@startuml
    +   *client -> server: Execute
    +   *alt Success
    +   *... Resultsets...
    +   *client <- server: StmtExecuteOk
    +   *else Failure
    +   *client <- server: Error
    +   *end
    +   *@enduml
    +   *@returns @ref Mysqlx::Ok
    +   * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Execute} + */ + public static final class Execute extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Prepare.Execute) + ExecuteOrBuilder { + private static final long serialVersionUID = 0L; + // Use Execute.newBuilder() to construct. + private Execute(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Execute() { + args_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Execute(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Execute( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + stmtId_ = input.readUInt32(); + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.PARSER, extensionRegistry)); + break; + } + case 24: { + bitField0_ |= 0x00000002; + compactMetadata_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000002) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Execute_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Execute_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder.class); + } + + private int bitField0_; + public static final int STMT_ID_FIELD_NUMBER = 1; + private int stmtId_; + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + + public static final int ARGS_FIELD_NUMBER = 2; + private java.util.List args_; + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** Arguments to bind to the prepared statement 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int COMPACT_METADATA_FIELD_NUMBER = 3; + private boolean compactMetadata_; + /** + *
    +     ** send only type information for
    +     *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return Whether the compactMetadata field is set. + */ + @java.lang.Override + public boolean hasCompactMetadata() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** send only type information for
    +     *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return The compactMetadata. + */ + @java.lang.Override + public boolean getCompactMetadata() { + return compactMetadata_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasStmtId()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, stmtId_); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(2, args_.get(i)); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBool(3, compactMetadata_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, stmtId_); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, args_.get(i)); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(3, compactMetadata_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Execute)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute other = (com.mysql.cj.x.protobuf.MysqlxPrepare.Execute) obj; + + if (hasStmtId() != other.hasStmtId()) return false; + if (hasStmtId()) { + if (getStmtId() + != other.getStmtId()) return false; + } + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasCompactMetadata() != other.hasCompactMetadata()) return false; + if (hasCompactMetadata()) { + if (getCompactMetadata() + != other.getCompactMetadata()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasStmtId()) { + hash = (37 * hash) + STMT_ID_FIELD_NUMBER; + hash = (53 * hash) + getStmtId(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasCompactMetadata()) { + hash = (37 * hash) + COMPACT_METADATA_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getCompactMetadata()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxPrepare.Execute prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Execute already-prepared statement
    +     *@startuml
    +     *client -> server: Execute
    +     *alt Success
    +     *... Resultsets...
    +     *client <- server: StmtExecuteOk
    +     *else Failure
    +     *client <- server: Error
    +     *end
    +     *@enduml
    +     *@returns @ref Mysqlx::Ok
    +     * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Execute} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Prepare.Execute) + com.mysql.cj.x.protobuf.MysqlxPrepare.ExecuteOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Execute_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Execute_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getArgsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + stmtId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + } else { + argsBuilder_.clear(); + } + compactMetadata_ = false; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Execute_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute build() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute buildPartial() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute result = new com.mysql.cj.x.protobuf.MysqlxPrepare.Execute(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.stmtId_ = stmtId_; + to_bitField0_ |= 0x00000001; + } + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000002); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.compactMetadata_ = compactMetadata_; + to_bitField0_ |= 0x00000002; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Execute) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxPrepare.Execute)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxPrepare.Execute other) { + if (other == com.mysql.cj.x.protobuf.MysqlxPrepare.Execute.getDefaultInstance()) return this; + if (other.hasStmtId()) { + setStmtId(other.getStmtId()); + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000002); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000002); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasCompactMetadata()) { + setCompactMetadata(other.getCompactMetadata()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasStmtId()) { + return false; + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxPrepare.Execute parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxPrepare.Execute) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int stmtId_ ; + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @param value The stmtId to set. + * @return This builder for chaining. + */ + public Builder setStmtId(int value) { + bitField0_ |= 0x00000001; + stmtId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return This builder for chaining. + */ + public Builder clearStmtId() { + bitField0_ = (bitField0_ & ~0x00000001); + stmtId_ = 0; + onChanged(); + return this; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000002) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000002; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> argsBuilder_; + + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + *
    +       ** Arguments to bind to the prepared statement 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder>( + args_, + ((bitField0_ & 0x00000002) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private boolean compactMetadata_ ; + /** + *
    +       ** send only type information for
    +       *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return Whether the compactMetadata field is set. + */ + @java.lang.Override + public boolean hasCompactMetadata() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** send only type information for
    +       *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return The compactMetadata. + */ + @java.lang.Override + public boolean getCompactMetadata() { + return compactMetadata_; + } + /** + *
    +       ** send only type information for
    +       *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @param value The compactMetadata to set. + * @return This builder for chaining. + */ + public Builder setCompactMetadata(boolean value) { + bitField0_ |= 0x00000004; + compactMetadata_ = value; + onChanged(); + return this; + } + /** + *
    +       ** send only type information for
    +       *@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 3 [default = false]; + * @return This builder for chaining. + */ + public Builder clearCompactMetadata() { + bitField0_ = (bitField0_ & ~0x00000004); + compactMetadata_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Prepare.Execute) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Prepare.Execute) + private static final com.mysql.cj.x.protobuf.MysqlxPrepare.Execute DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxPrepare.Execute(); + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Execute parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Execute(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Execute getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface DeallocateOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Prepare.Deallocate) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + boolean hasStmtId(); + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + int getStmtId(); + } + /** + *
    +   **
    +   *Deallocate already-prepared statement
    +   *@startuml
    +   *client -> server: Deallocate
    +   *alt Success
    +   *client <- server: Ok
    +   *else Failure
    +   *client <- server: Error
    +   *end
    +   *@enduml
    +   *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +   * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Deallocate} + */ + public static final class Deallocate extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Prepare.Deallocate) + DeallocateOrBuilder { + private static final long serialVersionUID = 0L; + // Use Deallocate.newBuilder() to construct. + private Deallocate(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Deallocate() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Deallocate(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Deallocate( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + stmtId_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Deallocate_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Deallocate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.Builder.class); + } + + private int bitField0_; + public static final int STMT_ID_FIELD_NUMBER = 1; + private int stmtId_; + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** client-side assigned statement ID, must be already prepared 
    +     * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasStmtId()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeUInt32(1, stmtId_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, stmtId_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate other = (com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate) obj; + + if (hasStmtId() != other.hasStmtId()) return false; + if (hasStmtId()) { + if (getStmtId() + != other.getStmtId()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasStmtId()) { + hash = (37 * hash) + STMT_ID_FIELD_NUMBER; + hash = (53 * hash) + getStmtId(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Deallocate already-prepared statement
    +     *@startuml
    +     *client -> server: Deallocate
    +     *alt Success
    +     *client <- server: Ok
    +     *else Failure
    +     *client <- server: Error
    +     *end
    +     *@enduml
    +     *@returns @ref Mysqlx::Ok or @ref Mysqlx::Error
    +     * 
    + * + * Protobuf type {@code Mysqlx.Prepare.Deallocate} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Prepare.Deallocate) + com.mysql.cj.x.protobuf.MysqlxPrepare.DeallocateOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Deallocate_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Deallocate_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.class, com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + stmtId_ = 0; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.internal_static_Mysqlx_Prepare_Deallocate_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate build() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate buildPartial() { + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate result = new com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.stmtId_ = stmtId_; + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate other) { + if (other == com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate.getDefaultInstance()) return this; + if (other.hasStmtId()) { + setStmtId(other.getStmtId()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasStmtId()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int stmtId_ ; + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return Whether the stmtId field is set. + */ + @java.lang.Override + public boolean hasStmtId() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return The stmtId. + */ + @java.lang.Override + public int getStmtId() { + return stmtId_; + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @param value The stmtId to set. + * @return This builder for chaining. + */ + public Builder setStmtId(int value) { + bitField0_ |= 0x00000001; + stmtId_ = value; + onChanged(); + return this; + } + /** + *
    +       ** client-side assigned statement ID, must be already prepared 
    +       * 
    + * + * required uint32 stmt_id = 1; + * @return This builder for chaining. + */ + public Builder clearStmtId() { + bitField0_ = (bitField0_ & ~0x00000001); + stmtId_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Prepare.Deallocate) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Prepare.Deallocate) + private static final com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate(); + } + + public static com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Deallocate parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Deallocate(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Prepare_Prepare_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Prepare_Prepare_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Prepare_Execute_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Prepare_Execute_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Prepare_Deallocate_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Prepare_Deallocate_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\024mysqlx_prepare.proto\022\016Mysqlx.Prepare\032\014" + + "mysqlx.proto\032\020mysqlx_sql.proto\032\021mysqlx_c" + + "rud.proto\032\026mysqlx_datatypes.proto\"\235\003\n\007Pr" + + "epare\022\017\n\007stmt_id\030\001 \002(\r\0222\n\004stmt\030\002 \002(\0132$.M" + + "ysqlx.Prepare.Prepare.OneOfMessage\032\306\002\n\014O" + + "neOfMessage\0227\n\004type\030\001 \002(\0162).Mysqlx.Prepa" + + "re.Prepare.OneOfMessage.Type\022\037\n\004find\030\002 \001" + + "(\0132\021.Mysqlx.Crud.Find\022#\n\006insert\030\003 \001(\0132\023." + + "Mysqlx.Crud.Insert\022#\n\006update\030\004 \001(\0132\023.Mys" + + "qlx.Crud.Update\022#\n\006delete\030\005 \001(\0132\023.Mysqlx" + + ".Crud.Delete\022-\n\014stmt_execute\030\006 \001(\0132\027.Mys" + + "qlx.Sql.StmtExecute\">\n\004Type\022\010\n\004FIND\020\000\022\n\n" + + "\006INSERT\020\001\022\n\n\006UPDATE\020\002\022\n\n\006DELETE\020\004\022\010\n\004STM" + + "T\020\005:\004\210\3520(\"f\n\007Execute\022\017\n\007stmt_id\030\001 \002(\r\022#\n" + + "\004args\030\002 \003(\0132\025.Mysqlx.Datatypes.Any\022\037\n\020co" + + "mpact_metadata\030\003 \001(\010:\005false:\004\210\3520)\"#\n\nDea" + + "llocate\022\017\n\007stmt_id\030\001 \002(\r:\004\210\3520*B\031\n\027com.my" + + "sql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxSql.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + }); + internal_static_Mysqlx_Prepare_Prepare_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Prepare_Prepare_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Prepare_Prepare_descriptor, + new java.lang.String[] { "StmtId", "Stmt", }); + internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor = + internal_static_Mysqlx_Prepare_Prepare_descriptor.getNestedTypes().get(0); + internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Prepare_Prepare_OneOfMessage_descriptor, + new java.lang.String[] { "Type", "Find", "Insert", "Update", "Delete", "StmtExecute", }); + internal_static_Mysqlx_Prepare_Execute_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Prepare_Execute_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Prepare_Execute_descriptor, + new java.lang.String[] { "StmtId", "Args", "CompactMetadata", }); + internal_static_Mysqlx_Prepare_Deallocate_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Prepare_Deallocate_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Prepare_Deallocate_descriptor, + new java.lang.String[] { "StmtId", }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxSql.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxCrud.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxResultset.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxResultset.java new file mode 100644 index 0000000..5679104 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxResultset.java @@ -0,0 +1,5646 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_resultset.proto + +public final class MysqlxResultset { + private MysqlxResultset() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + /** + *
    +   **
    +   *A hint about the higher-level encoding of a BYTES field
    +   *|type  | value  | description             |
    +   *|------| -------|-------------------------|
    +   *|BYTES | 0x0001 | GEOMETRY (WKB encoding) |
    +   *|BYTES | 0x0002 | JSON (text encoding)    |
    +   *|BYTES | 0x0003 | XML (text encoding)     |
    +   *@note
    +   *this list isn't comprehensive. As a guideline: the field's value is expected
    +   *to pass a validator check on client and server if this field is set.
    +   *If the server adds more internal datatypes that rely on BLOB storage
    +   *like image manipulation, seeking into complex types in BLOBs, ... more
    +   *types will be added.
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Resultset.ContentType_BYTES} + */ + public enum ContentType_BYTES + implements com.google.protobuf.ProtocolMessageEnum { + /** + * GEOMETRY = 1; + */ + GEOMETRY(1), + /** + * JSON = 2; + */ + JSON(2), + /** + * XML = 3; + */ + XML(3), + ; + + /** + * GEOMETRY = 1; + */ + public static final int GEOMETRY_VALUE = 1; + /** + * JSON = 2; + */ + public static final int JSON_VALUE = 2; + /** + * XML = 3; + */ + public static final int XML_VALUE = 3; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ContentType_BYTES valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ContentType_BYTES forNumber(int value) { + switch (value) { + case 1: return GEOMETRY; + case 2: return JSON; + case 3: return XML; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ContentType_BYTES> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ContentType_BYTES findValueByNumber(int number) { + return ContentType_BYTES.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.getDescriptor().getEnumTypes().get(0); + } + + private static final ContentType_BYTES[] VALUES = values(); + + public static ContentType_BYTES valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ContentType_BYTES(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Resultset.ContentType_BYTES) + } + + /** + *
    +   **
    +   *A hint about the higher-level encoding of a DATETIME field
    +   *|type     |value  |description                                |
    +   *|---------|-------|-------------------------------------------|
    +   *|DATE     |0x0001 |DATETIME contains only date part           |
    +   *|DATETIME |0x0002 |DATETIME contains both date and time parts |
    +   * 
    + * + * Protobuf enum {@code Mysqlx.Resultset.ContentType_DATETIME} + */ + public enum ContentType_DATETIME + implements com.google.protobuf.ProtocolMessageEnum { + /** + * DATE = 1; + */ + DATE(1), + /** + * DATETIME = 2; + */ + DATETIME(2), + ; + + /** + * DATE = 1; + */ + public static final int DATE_VALUE = 1; + /** + * DATETIME = 2; + */ + public static final int DATETIME_VALUE = 2; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ContentType_DATETIME valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static ContentType_DATETIME forNumber(int value) { + switch (value) { + case 1: return DATE; + case 2: return DATETIME; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + ContentType_DATETIME> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public ContentType_DATETIME findValueByNumber(int number) { + return ContentType_DATETIME.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.getDescriptor().getEnumTypes().get(1); + } + + private static final ContentType_DATETIME[] VALUES = values(); + + public static ContentType_DATETIME valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private ContentType_DATETIME(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Resultset.ContentType_DATETIME) + } + + public interface FetchDoneMoreOutParamsOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.FetchDoneMoreOutParams) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Resultsets are finished, OUT paramset is next:
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDoneMoreOutParams} + */ + public static final class FetchDoneMoreOutParams extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.FetchDoneMoreOutParams) + FetchDoneMoreOutParamsOrBuilder { + private static final long serialVersionUID = 0L; + // Use FetchDoneMoreOutParams.newBuilder() to construct. + private FetchDoneMoreOutParams(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FetchDoneMoreOutParams() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FetchDoneMoreOutParams(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FetchDoneMoreOutParams( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams other = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Resultsets are finished, OUT paramset is next:
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDoneMoreOutParams} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.FetchDoneMoreOutParams) + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParamsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams build() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams result = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.FetchDoneMoreOutParams) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.FetchDoneMoreOutParams) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FetchDoneMoreOutParams parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FetchDoneMoreOutParams(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreOutParams getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FetchDoneMoreResultsetsOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.FetchDoneMoreResultsets) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Resultset and out-params are finished, but more resultsets available
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDoneMoreResultsets} + */ + public static final class FetchDoneMoreResultsets extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.FetchDoneMoreResultsets) + FetchDoneMoreResultsetsOrBuilder { + private static final long serialVersionUID = 0L; + // Use FetchDoneMoreResultsets.newBuilder() to construct. + private FetchDoneMoreResultsets(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FetchDoneMoreResultsets() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FetchDoneMoreResultsets(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FetchDoneMoreResultsets( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets other = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Resultset and out-params are finished, but more resultsets available
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDoneMoreResultsets} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.FetchDoneMoreResultsets) + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsetsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets build() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets result = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.FetchDoneMoreResultsets) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.FetchDoneMoreResultsets) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FetchDoneMoreResultsets parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FetchDoneMoreResultsets(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneMoreResultsets getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FetchDoneOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.FetchDone) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *All resultsets are finished
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDone} + */ + public static final class FetchDone extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.FetchDone) + FetchDoneOrBuilder { + private static final long serialVersionUID = 0L; + // Use FetchDone.newBuilder() to construct. + private FetchDone(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FetchDone() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FetchDone(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FetchDone( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDone_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDone_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone other = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *All resultsets are finished
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchDone} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.FetchDone) + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDoneOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDone_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDone_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchDone_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone build() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone result = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.FetchDone) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.FetchDone) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FetchDone parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FetchDone(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchDone getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FetchSuspendedOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.FetchSuspended) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Cursor is opened; still, the execution of PrepFetch or PrepExecute ended
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchSuspended} + */ + public static final class FetchSuspended extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.FetchSuspended) + FetchSuspendedOrBuilder { + private static final long serialVersionUID = 0L; + // Use FetchSuspended.newBuilder() to construct. + private FetchSuspended(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private FetchSuspended() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new FetchSuspended(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private FetchSuspended( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchSuspended_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchSuspended_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended other = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Cursor is opened; still, the execution of PrepFetch or PrepExecute ended
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.FetchSuspended} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.FetchSuspended) + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspendedOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchSuspended_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchSuspended_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.class, com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_FetchSuspended_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended build() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended result = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.FetchSuspended) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.FetchSuspended) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FetchSuspended parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new FetchSuspended(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.FetchSuspended getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ColumnMetaDataOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.ColumnMetaData) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** datatype of the field in a row 
    +     * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return Whether the type field is set. + */ + boolean hasType(); + /** + *
    +     ** datatype of the field in a row 
    +     * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return The type. + */ + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType getType(); + + /** + *
    +     ** name of the column 
    +     * 
    + * + * optional bytes name = 2; + * @return Whether the name field is set. + */ + boolean hasName(); + /** + *
    +     ** name of the column 
    +     * 
    + * + * optional bytes name = 2; + * @return The name. + */ + com.google.protobuf.ByteString getName(); + + /** + *
    +     ** name of the column before an alias was applied 
    +     * 
    + * + * optional bytes original_name = 3; + * @return Whether the originalName field is set. + */ + boolean hasOriginalName(); + /** + *
    +     ** name of the column before an alias was applied 
    +     * 
    + * + * optional bytes original_name = 3; + * @return The originalName. + */ + com.google.protobuf.ByteString getOriginalName(); + + /** + *
    +     ** name of the table the column originates from 
    +     * 
    + * + * optional bytes table = 4; + * @return Whether the table field is set. + */ + boolean hasTable(); + /** + *
    +     ** name of the table the column originates from 
    +     * 
    + * + * optional bytes table = 4; + * @return The table. + */ + com.google.protobuf.ByteString getTable(); + + /** + *
    +     ** name of the table the column originates from before an alias was applied 
    +     * 
    + * + * optional bytes original_table = 5; + * @return Whether the originalTable field is set. + */ + boolean hasOriginalTable(); + /** + *
    +     ** name of the table the column originates from before an alias was applied 
    +     * 
    + * + * optional bytes original_table = 5; + * @return The originalTable. + */ + com.google.protobuf.ByteString getOriginalTable(); + + /** + *
    +     ** schema the column originates from 
    +     * 
    + * + * optional bytes schema = 6; + * @return Whether the schema field is set. + */ + boolean hasSchema(); + /** + *
    +     ** schema the column originates from 
    +     * 
    + * + * optional bytes schema = 6; + * @return The schema. + */ + com.google.protobuf.ByteString getSchema(); + + /** + *
    +     ** catalog the schema originates from
    +     *@note
    +     *As there is currently no support for catalogs in MySQL,
    +     *don't expect this field to be set. In the MySQL C/S
    +     *protocol the field had the value ``def`` all the time 
    +     * 
    + * + * optional bytes catalog = 7; + * @return Whether the catalog field is set. + */ + boolean hasCatalog(); + /** + *
    +     ** catalog the schema originates from
    +     *@note
    +     *As there is currently no support for catalogs in MySQL,
    +     *don't expect this field to be set. In the MySQL C/S
    +     *protocol the field had the value ``def`` all the time 
    +     * 
    + * + * optional bytes catalog = 7; + * @return The catalog. + */ + com.google.protobuf.ByteString getCatalog(); + + /** + * optional uint64 collation = 8; + * @return Whether the collation field is set. + */ + boolean hasCollation(); + /** + * optional uint64 collation = 8; + * @return The collation. + */ + long getCollation(); + + /** + *
    +     ** displayed factional decimal digits for floating point and
    +     *fixed point numbers 
    +     * 
    + * + * optional uint32 fractional_digits = 9; + * @return Whether the fractionalDigits field is set. + */ + boolean hasFractionalDigits(); + /** + *
    +     ** displayed factional decimal digits for floating point and
    +     *fixed point numbers 
    +     * 
    + * + * optional uint32 fractional_digits = 9; + * @return The fractionalDigits. + */ + int getFractionalDigits(); + + /** + *
    +     ** maximum count of displayable characters of .type 
    +     * 
    + * + * optional uint32 length = 10; + * @return Whether the length field is set. + */ + boolean hasLength(); + /** + *
    +     ** maximum count of displayable characters of .type 
    +     * 
    + * + * optional uint32 length = 10; + * @return The length. + */ + int getLength(); + + /** + *
    +     ** ``.type`` specific flags
    +     *| Type    | Value  | Description  |
    +     *|---------|--------|--------------|
    +     *| UINT    | 0x0001 | zerofill     |
    +     *| DOUBLE  | 0x0001 | unsigned     |
    +     *| FLOAT   | 0x0001 | unsigned     |
    +     *| DECIMAL | 0x0001 | unsigned     |
    +     *| BYTES   | 0x0001 | rightpad     |
    +     *| Value  | Description     |
    +     *|--------|-----------------|
    +     *| 0x0010 | NOT\_NULL       |
    +     *| 0x0020 | PRIMARY\_KEY    |
    +     *| 0x0040 | UNIQUE\_KEY     |
    +     *| 0x0080 | MULTIPLE\_KEY   |
    +     *| 0x0100 | AUTO\_INCREMENT |
    +     *default: 0 
    +     * 
    + * + * optional uint32 flags = 11; + * @return Whether the flags field is set. + */ + boolean hasFlags(); + /** + *
    +     ** ``.type`` specific flags
    +     *| Type    | Value  | Description  |
    +     *|---------|--------|--------------|
    +     *| UINT    | 0x0001 | zerofill     |
    +     *| DOUBLE  | 0x0001 | unsigned     |
    +     *| FLOAT   | 0x0001 | unsigned     |
    +     *| DECIMAL | 0x0001 | unsigned     |
    +     *| BYTES   | 0x0001 | rightpad     |
    +     *| Value  | Description     |
    +     *|--------|-----------------|
    +     *| 0x0010 | NOT\_NULL       |
    +     *| 0x0020 | PRIMARY\_KEY    |
    +     *| 0x0040 | UNIQUE\_KEY     |
    +     *| 0x0080 | MULTIPLE\_KEY   |
    +     *| 0x0100 | AUTO\_INCREMENT |
    +     *default: 0 
    +     * 
    + * + * optional uint32 flags = 11; + * @return The flags. + */ + int getFlags(); + + /** + *
    +     ** a hint about the higher-level encoding of a BYTES field
    +     *| Type   | Value  | Description             |
    +     *|--------|--------|-------------------------|
    +     *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +     *| BYTES  | 0x0002 | JSON (text encoding)    |
    +     *| BYTES  | 0x0003 | XML (text encoding)     |
    +     *@note
    +     *This list isn't comprehensive. As a guideline: the field's
    +     *value is expected to pass a validator check on client
    +     *and server if this field is set. If the server adds more
    +     *internal data types that rely on BLOB storage like image
    +     *manipulation, seeking into complex types in BLOBs, and
    +     *more types will be added 
    +     * 
    + * + * optional uint32 content_type = 12; + * @return Whether the contentType field is set. + */ + boolean hasContentType(); + /** + *
    +     ** a hint about the higher-level encoding of a BYTES field
    +     *| Type   | Value  | Description             |
    +     *|--------|--------|-------------------------|
    +     *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +     *| BYTES  | 0x0002 | JSON (text encoding)    |
    +     *| BYTES  | 0x0003 | XML (text encoding)     |
    +     *@note
    +     *This list isn't comprehensive. As a guideline: the field's
    +     *value is expected to pass a validator check on client
    +     *and server if this field is set. If the server adds more
    +     *internal data types that rely on BLOB storage like image
    +     *manipulation, seeking into complex types in BLOBs, and
    +     *more types will be added 
    +     * 
    + * + * optional uint32 content_type = 12; + * @return The contentType. + */ + int getContentType(); + } + /** + *
    +   **
    +   *Meta data of a column
    +   *@note
    +   *The encoding used for the different ``bytes`` fields in the
    +   *meta data is externally controlled. See also:
    +   *https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
    +   *@par
    +   *@note
    +   *The server may not set the ``original_{table|name}`` fields
    +   *if they are equal to the plain ``{table|name}`` field.
    +   *@par
    +   *@note
    +   *A client has to reconstruct it like:
    +   *@code{py}
    +   *if .original_name is empty and .name is not empty:
    +   *.original_name = .name
    +   *if .original_table is empty and .table is not empty:
    +   *.original_table = .table
    +   *@endcode
    +   *@par
    +   *@note
    +   *``Compact metadata format`` can be requested by the client.
    +   *In that case, only ``.type`` is set and all other fields are  empty.
    +   *Expected data type of Mysqlx.Resultset.Row per SQL Type for
    +   *non-NULL values:
    +   *| SQL Type          | .type     | .length | .frac\_dig | .flags | .charset |
    +   *|-------------------|-----------|---------|------------|--------|----------|
    +   *| TINY              | SINT      | x       |            |        |          |
    +   *| TINY UNSIGNED     | UINT      | x       |            | x      |          |
    +   *| SHORT             | SINT      | x       |            |        |          |
    +   *| SHORT UNSIGNED    | UINT      | x       |            | x      |          |
    +   *| INT24             | SINT      | x       |            |        |          |
    +   *| INT24 UNSIGNED    | UINT      | x       |            | x      |          |
    +   *| INT               | SINT      | x       |            |        |          |
    +   *| INT UNSIGNED      | UINT      | x       |            | x      |          |
    +   *| LONGLONG          | SINT      | x       |            |        |          |
    +   *| LONGLONG UNSIGNED | UINT      | x       |            | x      |          |
    +   *| DOUBLE            | DOUBLE    | x       | x          | x      |          |
    +   *| FLOAT             | FLOAT     | x       | x          | x      |          |
    +   *| DECIMAL           | DECIMAL   | x       | x          | x      |          |
    +   *| VARCHAR,CHAR,...  | BYTES     | x       |            | x      | x        |
    +   *| GEOMETRY          | BYTES     |         |            |        |          |
    +   *| TIME              | TIME      | x       |            |        |          |
    +   *| DATE              | DATETIME  | x       |            |        |          |
    +   *| DATETIME          | DATETIME  | x       |            |        |          |
    +   *| YEAR              | UINT      | x       |            | x      |          |
    +   *| TIMESTAMP         | DATETIME  | x       |            |        |          |
    +   *| SET               | SET       |         |            |        | x        |
    +   *| ENUM              | ENUM      |         |            |        | x        |
    +   *| NULL              | BYTES     |         |            |        |          |
    +   *| BIT               | BIT       | x       |            |        |          |
    +   *@note
    +   *The SQL "NULL" value is sent as an empty field value in
    +   *@ref Mysqlx::Resultset::Row.
    +   *@par Tip
    +   *The protobuf encoding of primitive data types is described in
    +   *https://developers.google.com/protocol-buffers/docs/encoding
    +   *+ SINT
    +   *- ``.length`` @n
    +   *Maximum number of displayable decimal digits (including
    +   *minus sign) of the type.
    +   *@note
    +   *The valid range is 0-255, but usually you'll see 1-20.
    +   *| SQL Type         | Maximum Digits per Type |
    +   *|------------------|-------------------------|
    +   *| TINY SIGNED      | 4                       |
    +   *| SHORT SIGNED     | 6                       |
    +   *| INT24 SIGNED     | 8                       |
    +   *| INT SIGNED       | 11                      |
    +   *| LONGLONG SIGNED  | 20                      |
    +   *@par Tip
    +   *Definition of ``M`` are in
    +   *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html.
    +   *- ``value``@n
    +   *Variable length encoded signed 64 integer.
    +   *+ UINT
    +   *- ``.flags & 1`` (zerofill) @n
    +   *The client has to left pad with 0's up to .length.
    +   *- ``.length`` @n
    +   *Maximum number of displayable decimal digits of the
    +   *type.
    +   *@note
    +   *The valid range is 0-255, but usually you'll see
    +   *1-20.
    +   *| SQL Type             | max digits per type |
    +   *|----------------------|---------------------|
    +   *| TINY UNSIGNED        | 3                   |
    +   *| SHORT UNSIGNED       | 5                   |
    +   *| INT24 UNSIGNED       | 8                   |
    +   *| INT UNSIGNED         | 10                  |
    +   *| LONGLONG UNSIGNED    | 20                  |
    +   *@par Tip
    +   *Definition of ``M`` are in
    +   *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html.
    +   *- ``value`` @n
    +   *Variable length encoded unsigned 64 integer.
    +   *+ BIT
    +   *- ``.length`` @n
    +   *Maximum number of displayable binary digits.
    +   *@note
    +   *The valid range for M of the ``BIT`` type is 1 - 64.
    +   *@par Tip
    +   *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
    +   *- ``value`` @n
    +   *Variable length encoded unsigned 64 integer.
    +   *+ DOUBLE
    +   *- ``.length`` @n
    +   *Maximum number of displayable decimal digits (including
    +   *the decimal point and ``.fractional_digits``).
    +   *- ``.fractional_digits`` @n
    +   *Maximum number of displayable decimal digits following
    +   *the decimal point.
    +   *- ``value``@n
    +   *Encoded as protobuf's 'double'.
    +   *+ FLOAT
    +   *- ``.length``@n
    +   *Maximum number of displayable decimal digits (including
    +   *the decimal point and ``.fractional_digits``).
    +   *- ``.fractional_digits``@n
    +   *Maximum number of displayable decimal digits following
    +   *the decimal point.
    +   *- ``value``@n
    +   *Encoded as protobuf's 'float'.
    +   *+ BYTES, ENUM
    +   *@note
    +   *BYTES is used for all opaque byte strings that may have a charset:
    +   *-  TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
    +   *-  TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
    +   *-  VARCHAR, VARBINARY
    +   *-  CHAR, BINARY
    +   *-  ENUM
    +   *- ``.length``@n
    +   *Maximum length of characters of the underlying type.
    +   *- ``.flags & 1`` (rightpad) @n
    +   *If the length of the field is less than ``.length``, the
    +   *receiver is supposed to add padding characters to the
    +   *right end of the string. If the ``.charset`` is
    +   *"binary", the padding character is ``0x00``, otherwise
    +   *it is a space character as defined by that character
    +   *set.
    +   *| SQL Type      | .length  | .charset  | .flags   |
    +   *|---------------|----------|-----------|----------|
    +   *| TINYBLOB      | 256      | binary    |          |
    +   *| BLOB          | 65535    | binary    |          |
    +   *| VARCHAR(32)   | 32       | utf8      |          |
    +   *| VARBINARY(32) | 32       | utf8\_bin |          |
    +   *| BINARY(32)    | 32       | binary    | rightpad |
    +   *| CHAR(32)      | 32       | utf8      | rightpad |
    +   *- ``value``
    +   *Sequence of bytes with added one extra ``0x00`` byte at
    +   *the end. To obtain the original string, the extra
    +   *``0x00`` should be removed. The length of the string can
    +   *be acquired with protobuf's field ``length()`` method:
    +   *``length of sequence-of-bytes = length-of-field - 1``
    +   *@note
    +   *The extra byte allows to distinguish between a NULL
    +   *and empty byte sequence.
    +   *+ TIME
    +   *A time value.
    +   *- ``value``@n
    +   *The following bytes sequence:
    +   *``negate [ hour [ minutes [ seconds [ useconds ]]]]``
    +   *-  negate - one byte, should be one of: 0x00 for "+",
    +   *0x01 for "-"
    +   *-  hour - optional variable length encoded unsigned64
    +   *value for the hour
    +   *-  minutes - optional variable length encoded unsigned64
    +   *value for the minutes
    +   *-  seconds - optional variable length encoded unsigned64
    +   *value for the seconds
    +   *-  useconds - optional variable length encoded
    +   *unsigned64 value for the microseconds
    +   *@par Tip
    +   *The protobuf encoding in
    +   *https://developers.google.com/protocol-buffers/docs/encoding.
    +   *@note
    +   *Hour, minutes, seconds, and useconds are optional if
    +   *all the values to the right are 0.
    +   *Example: ``0x00 -> +00:00:00.000000``
    +   *+ DATETIME
    +   *A date or date and time value.
    +   *- ``value`` @n
    +   *A sequence of variants, arranged as follows:
    +   *``| year | month | day | [ | hour | [ | minutes | [ | seconds | [ | useconds | ]]]]``
    +   *-  year - variable length encoded unsigned64 value for
    +   *the year
    +   *-  month - variable length encoded unsigned64 value for
    +   *the month
    +   *-  day - variable length encoded unsigned64 value for
    +   *the day
    +   *-  hour - optional variable length encoded unsigned64
    +   *value for the hour
    +   *-  minutes - optional variable length encoded unsigned64
    +   *value for the minutes
    +   *-  seconds - optional variable length encoded unsigned64
    +   *value for the seconds
    +   *-  useconds - optional variable length encoded
    +   *unsigned64 value for the microseconds
    +   *@note
    +   *Hour, minutes, seconds, useconds are optional if all
    +   *the values to the right are 0.
    +   *- ``.flags``@n
    +   *| Name          | Position |
    +   *|---------------|----------|
    +   *| is\_timestamp | 1        |
    +   *+ DECIMAL
    +   *An arbitrary length number. The number is encoded as a
    +   *single byte indicating the position of the decimal point
    +   *followed by the Packed BCD encoded number. Packed BCD is
    +   *used to simplify conversion to and from strings and other
    +   *native arbitrary precision math data types. See also: packed
    +   *BCD in https://en.wikipedia.org/wiki/Binary-coded_decimal
    +   *- ``.length``
    +   *Maximum number of displayable decimal digits
    +   *(*excluding* the decimal point and sign, but including
    +   *``.fractional_digits``).
    +   *@note
    +   *Should be in the range of 1 - 65.
    +   *- ``.fractional_digits``
    +   *The decimal digits to display out of length.
    +   *@note
    +   *Should be in the range of 0 - 30.
    +   *``value``
    +   *The following bytes sequence:
    +   *``scale | BCD+ sign [0x00]?``
    +   *-  scale - 8bit scale value (number of decimal digit after the '.')
    +   *-  BCD - BCD encoded digits (4 bits for each digit)
    +   *-  sign - sign encoded on 4 bits (0xc = "+", 0xd = "-")
    +   *-  0x0 - last 4bits if length(digits) % 2 == 0
    +   *Example: ``x04 0x12 0x34 0x01
    +   *0xd0 -> -12.3401``
    +   *+ SET
    +   *A list of strings representing a SET of values.
    +   *- ``value``@n
    +   *A sequence of 0 or more of protobuf's bytes (length
    +   *prepended octets) or one of the special sequences with a
    +   *predefined meaning listed below.
    +   *Example (length of the bytes array shown in brackets):
    +   *-  ``[0]`` - the NULL value
    +   *-  ``[1] 0x00`` - a set containing a blank string ''
    +   *-  ``[1] 0x01`` - this would be an invalid value,
    +   *but is to be treated as the empty set
    +   *-  ``[2] 0x01 0x00`` - a set with a single item, which is the '0'
    +   *character
    +   *-  ``[8] 0x03 F O O 0x03 B A R`` - a set with 2 items: FOO,BAR
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.ColumnMetaData} + */ + public static final class ColumnMetaData extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.ColumnMetaData) + ColumnMetaDataOrBuilder { + private static final long serialVersionUID = 0L; + // Use ColumnMetaData.newBuilder() to construct. + private ColumnMetaData(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private ColumnMetaData() { + type_ = 1; + name_ = com.google.protobuf.ByteString.EMPTY; + originalName_ = com.google.protobuf.ByteString.EMPTY; + table_ = com.google.protobuf.ByteString.EMPTY; + originalTable_ = com.google.protobuf.ByteString.EMPTY; + schema_ = com.google.protobuf.ByteString.EMPTY; + catalog_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new ColumnMetaData(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private ColumnMetaData( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + int rawValue = input.readEnum(); + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType value = com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType.valueOf(rawValue); + if (value == null) { + unknownFields.mergeVarintField(1, rawValue); + } else { + bitField0_ |= 0x00000001; + type_ = rawValue; + } + break; + } + case 18: { + bitField0_ |= 0x00000002; + name_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + originalName_ = input.readBytes(); + break; + } + case 34: { + bitField0_ |= 0x00000008; + table_ = input.readBytes(); + break; + } + case 42: { + bitField0_ |= 0x00000010; + originalTable_ = input.readBytes(); + break; + } + case 50: { + bitField0_ |= 0x00000020; + schema_ = input.readBytes(); + break; + } + case 58: { + bitField0_ |= 0x00000040; + catalog_ = input.readBytes(); + break; + } + case 64: { + bitField0_ |= 0x00000080; + collation_ = input.readUInt64(); + break; + } + case 72: { + bitField0_ |= 0x00000100; + fractionalDigits_ = input.readUInt32(); + break; + } + case 80: { + bitField0_ |= 0x00000200; + length_ = input.readUInt32(); + break; + } + case 88: { + bitField0_ |= 0x00000400; + flags_ = input.readUInt32(); + break; + } + case 96: { + bitField0_ |= 0x00000800; + contentType_ = input.readUInt32(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_ColumnMetaData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.class, com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.Builder.class); + } + + /** + * Protobuf enum {@code Mysqlx.Resultset.ColumnMetaData.FieldType} + */ + public enum FieldType + implements com.google.protobuf.ProtocolMessageEnum { + /** + * SINT = 1; + */ + SINT(1), + /** + * UINT = 2; + */ + UINT(2), + /** + * DOUBLE = 5; + */ + DOUBLE(5), + /** + * FLOAT = 6; + */ + FLOAT(6), + /** + * BYTES = 7; + */ + BYTES(7), + /** + * TIME = 10; + */ + TIME(10), + /** + * DATETIME = 12; + */ + DATETIME(12), + /** + * SET = 15; + */ + SET(15), + /** + * ENUM = 16; + */ + ENUM(16), + /** + * BIT = 17; + */ + BIT(17), + /** + * DECIMAL = 18; + */ + DECIMAL(18), + ; + + /** + * SINT = 1; + */ + public static final int SINT_VALUE = 1; + /** + * UINT = 2; + */ + public static final int UINT_VALUE = 2; + /** + * DOUBLE = 5; + */ + public static final int DOUBLE_VALUE = 5; + /** + * FLOAT = 6; + */ + public static final int FLOAT_VALUE = 6; + /** + * BYTES = 7; + */ + public static final int BYTES_VALUE = 7; + /** + * TIME = 10; + */ + public static final int TIME_VALUE = 10; + /** + * DATETIME = 12; + */ + public static final int DATETIME_VALUE = 12; + /** + * SET = 15; + */ + public static final int SET_VALUE = 15; + /** + * ENUM = 16; + */ + public static final int ENUM_VALUE = 16; + /** + * BIT = 17; + */ + public static final int BIT_VALUE = 17; + /** + * DECIMAL = 18; + */ + public static final int DECIMAL_VALUE = 18; + + + public final int getNumber() { + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static FieldType valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static FieldType forNumber(int value) { + switch (value) { + case 1: return SINT; + case 2: return UINT; + case 5: return DOUBLE; + case 6: return FLOAT; + case 7: return BYTES; + case 10: return TIME; + case 12: return DATETIME; + case 15: return SET; + case 16: return ENUM; + case 17: return BIT; + case 18: return DECIMAL; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + FieldType> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public FieldType findValueByNumber(int number) { + return FieldType.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.getDescriptor().getEnumTypes().get(0); + } + + private static final FieldType[] VALUES = values(); + + public static FieldType valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private FieldType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:Mysqlx.Resultset.ColumnMetaData.FieldType) + } + + private int bitField0_; + public static final int TYPE_FIELD_NUMBER = 1; + private int type_; + /** + *
    +     ** datatype of the field in a row 
    +     * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** datatype of the field in a row 
    +     * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return The type. + */ + @java.lang.Override public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType result = com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType.SINT : result; + } + + public static final int NAME_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString name_; + /** + *
    +     ** name of the column 
    +     * 
    + * + * optional bytes name = 2; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** name of the column 
    +     * 
    + * + * optional bytes name = 2; + * @return The name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getName() { + return name_; + } + + public static final int ORIGINAL_NAME_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString originalName_; + /** + *
    +     ** name of the column before an alias was applied 
    +     * 
    + * + * optional bytes original_name = 3; + * @return Whether the originalName field is set. + */ + @java.lang.Override + public boolean hasOriginalName() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** name of the column before an alias was applied 
    +     * 
    + * + * optional bytes original_name = 3; + * @return The originalName. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOriginalName() { + return originalName_; + } + + public static final int TABLE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString table_; + /** + *
    +     ** name of the table the column originates from 
    +     * 
    + * + * optional bytes table = 4; + * @return Whether the table field is set. + */ + @java.lang.Override + public boolean hasTable() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +     ** name of the table the column originates from 
    +     * 
    + * + * optional bytes table = 4; + * @return The table. + */ + @java.lang.Override + public com.google.protobuf.ByteString getTable() { + return table_; + } + + public static final int ORIGINAL_TABLE_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString originalTable_; + /** + *
    +     ** name of the table the column originates from before an alias was applied 
    +     * 
    + * + * optional bytes original_table = 5; + * @return Whether the originalTable field is set. + */ + @java.lang.Override + public boolean hasOriginalTable() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +     ** name of the table the column originates from before an alias was applied 
    +     * 
    + * + * optional bytes original_table = 5; + * @return The originalTable. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOriginalTable() { + return originalTable_; + } + + public static final int SCHEMA_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString schema_; + /** + *
    +     ** schema the column originates from 
    +     * 
    + * + * optional bytes schema = 6; + * @return Whether the schema field is set. + */ + @java.lang.Override + public boolean hasSchema() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +     ** schema the column originates from 
    +     * 
    + * + * optional bytes schema = 6; + * @return The schema. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSchema() { + return schema_; + } + + public static final int CATALOG_FIELD_NUMBER = 7; + private com.google.protobuf.ByteString catalog_; + /** + *
    +     ** catalog the schema originates from
    +     *@note
    +     *As there is currently no support for catalogs in MySQL,
    +     *don't expect this field to be set. In the MySQL C/S
    +     *protocol the field had the value ``def`` all the time 
    +     * 
    + * + * optional bytes catalog = 7; + * @return Whether the catalog field is set. + */ + @java.lang.Override + public boolean hasCatalog() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +     ** catalog the schema originates from
    +     *@note
    +     *As there is currently no support for catalogs in MySQL,
    +     *don't expect this field to be set. In the MySQL C/S
    +     *protocol the field had the value ``def`` all the time 
    +     * 
    + * + * optional bytes catalog = 7; + * @return The catalog. + */ + @java.lang.Override + public com.google.protobuf.ByteString getCatalog() { + return catalog_; + } + + public static final int COLLATION_FIELD_NUMBER = 8; + private long collation_; + /** + * optional uint64 collation = 8; + * @return Whether the collation field is set. + */ + @java.lang.Override + public boolean hasCollation() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional uint64 collation = 8; + * @return The collation. + */ + @java.lang.Override + public long getCollation() { + return collation_; + } + + public static final int FRACTIONAL_DIGITS_FIELD_NUMBER = 9; + private int fractionalDigits_; + /** + *
    +     ** displayed factional decimal digits for floating point and
    +     *fixed point numbers 
    +     * 
    + * + * optional uint32 fractional_digits = 9; + * @return Whether the fractionalDigits field is set. + */ + @java.lang.Override + public boolean hasFractionalDigits() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + *
    +     ** displayed factional decimal digits for floating point and
    +     *fixed point numbers 
    +     * 
    + * + * optional uint32 fractional_digits = 9; + * @return The fractionalDigits. + */ + @java.lang.Override + public int getFractionalDigits() { + return fractionalDigits_; + } + + public static final int LENGTH_FIELD_NUMBER = 10; + private int length_; + /** + *
    +     ** maximum count of displayable characters of .type 
    +     * 
    + * + * optional uint32 length = 10; + * @return Whether the length field is set. + */ + @java.lang.Override + public boolean hasLength() { + return ((bitField0_ & 0x00000200) != 0); + } + /** + *
    +     ** maximum count of displayable characters of .type 
    +     * 
    + * + * optional uint32 length = 10; + * @return The length. + */ + @java.lang.Override + public int getLength() { + return length_; + } + + public static final int FLAGS_FIELD_NUMBER = 11; + private int flags_; + /** + *
    +     ** ``.type`` specific flags
    +     *| Type    | Value  | Description  |
    +     *|---------|--------|--------------|
    +     *| UINT    | 0x0001 | zerofill     |
    +     *| DOUBLE  | 0x0001 | unsigned     |
    +     *| FLOAT   | 0x0001 | unsigned     |
    +     *| DECIMAL | 0x0001 | unsigned     |
    +     *| BYTES   | 0x0001 | rightpad     |
    +     *| Value  | Description     |
    +     *|--------|-----------------|
    +     *| 0x0010 | NOT\_NULL       |
    +     *| 0x0020 | PRIMARY\_KEY    |
    +     *| 0x0040 | UNIQUE\_KEY     |
    +     *| 0x0080 | MULTIPLE\_KEY   |
    +     *| 0x0100 | AUTO\_INCREMENT |
    +     *default: 0 
    +     * 
    + * + * optional uint32 flags = 11; + * @return Whether the flags field is set. + */ + @java.lang.Override + public boolean hasFlags() { + return ((bitField0_ & 0x00000400) != 0); + } + /** + *
    +     ** ``.type`` specific flags
    +     *| Type    | Value  | Description  |
    +     *|---------|--------|--------------|
    +     *| UINT    | 0x0001 | zerofill     |
    +     *| DOUBLE  | 0x0001 | unsigned     |
    +     *| FLOAT   | 0x0001 | unsigned     |
    +     *| DECIMAL | 0x0001 | unsigned     |
    +     *| BYTES   | 0x0001 | rightpad     |
    +     *| Value  | Description     |
    +     *|--------|-----------------|
    +     *| 0x0010 | NOT\_NULL       |
    +     *| 0x0020 | PRIMARY\_KEY    |
    +     *| 0x0040 | UNIQUE\_KEY     |
    +     *| 0x0080 | MULTIPLE\_KEY   |
    +     *| 0x0100 | AUTO\_INCREMENT |
    +     *default: 0 
    +     * 
    + * + * optional uint32 flags = 11; + * @return The flags. + */ + @java.lang.Override + public int getFlags() { + return flags_; + } + + public static final int CONTENT_TYPE_FIELD_NUMBER = 12; + private int contentType_; + /** + *
    +     ** a hint about the higher-level encoding of a BYTES field
    +     *| Type   | Value  | Description             |
    +     *|--------|--------|-------------------------|
    +     *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +     *| BYTES  | 0x0002 | JSON (text encoding)    |
    +     *| BYTES  | 0x0003 | XML (text encoding)     |
    +     *@note
    +     *This list isn't comprehensive. As a guideline: the field's
    +     *value is expected to pass a validator check on client
    +     *and server if this field is set. If the server adds more
    +     *internal data types that rely on BLOB storage like image
    +     *manipulation, seeking into complex types in BLOBs, and
    +     *more types will be added 
    +     * 
    + * + * optional uint32 content_type = 12; + * @return Whether the contentType field is set. + */ + @java.lang.Override + public boolean hasContentType() { + return ((bitField0_ & 0x00000800) != 0); + } + /** + *
    +     ** a hint about the higher-level encoding of a BYTES field
    +     *| Type   | Value  | Description             |
    +     *|--------|--------|-------------------------|
    +     *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +     *| BYTES  | 0x0002 | JSON (text encoding)    |
    +     *| BYTES  | 0x0003 | XML (text encoding)     |
    +     *@note
    +     *This list isn't comprehensive. As a guideline: the field's
    +     *value is expected to pass a validator check on client
    +     *and server if this field is set. If the server adds more
    +     *internal data types that rely on BLOB storage like image
    +     *manipulation, seeking into complex types in BLOBs, and
    +     *more types will be added 
    +     * 
    + * + * optional uint32 content_type = 12; + * @return The contentType. + */ + @java.lang.Override + public int getContentType() { + return contentType_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasType()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeEnum(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBytes(2, name_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBytes(3, originalName_); + } + if (((bitField0_ & 0x00000008) != 0)) { + output.writeBytes(4, table_); + } + if (((bitField0_ & 0x00000010) != 0)) { + output.writeBytes(5, originalTable_); + } + if (((bitField0_ & 0x00000020) != 0)) { + output.writeBytes(6, schema_); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeBytes(7, catalog_); + } + if (((bitField0_ & 0x00000080) != 0)) { + output.writeUInt64(8, collation_); + } + if (((bitField0_ & 0x00000100) != 0)) { + output.writeUInt32(9, fractionalDigits_); + } + if (((bitField0_ & 0x00000200) != 0)) { + output.writeUInt32(10, length_); + } + if (((bitField0_ & 0x00000400) != 0)) { + output.writeUInt32(11, flags_); + } + if (((bitField0_ & 0x00000800) != 0)) { + output.writeUInt32(12, contentType_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(1, type_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, name_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, originalName_); + } + if (((bitField0_ & 0x00000008) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, table_); + } + if (((bitField0_ & 0x00000010) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(5, originalTable_); + } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, schema_); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(7, catalog_); + } + if (((bitField0_ & 0x00000080) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(8, collation_); + } + if (((bitField0_ & 0x00000100) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(9, fractionalDigits_); + } + if (((bitField0_ & 0x00000200) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(10, length_); + } + if (((bitField0_ & 0x00000400) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(11, flags_); + } + if (((bitField0_ & 0x00000800) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(12, contentType_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData other = (com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData) obj; + + if (hasType() != other.hasType()) return false; + if (hasType()) { + if (type_ != other.type_) return false; + } + if (hasName() != other.hasName()) return false; + if (hasName()) { + if (!getName() + .equals(other.getName())) return false; + } + if (hasOriginalName() != other.hasOriginalName()) return false; + if (hasOriginalName()) { + if (!getOriginalName() + .equals(other.getOriginalName())) return false; + } + if (hasTable() != other.hasTable()) return false; + if (hasTable()) { + if (!getTable() + .equals(other.getTable())) return false; + } + if (hasOriginalTable() != other.hasOriginalTable()) return false; + if (hasOriginalTable()) { + if (!getOriginalTable() + .equals(other.getOriginalTable())) return false; + } + if (hasSchema() != other.hasSchema()) return false; + if (hasSchema()) { + if (!getSchema() + .equals(other.getSchema())) return false; + } + if (hasCatalog() != other.hasCatalog()) return false; + if (hasCatalog()) { + if (!getCatalog() + .equals(other.getCatalog())) return false; + } + if (hasCollation() != other.hasCollation()) return false; + if (hasCollation()) { + if (getCollation() + != other.getCollation()) return false; + } + if (hasFractionalDigits() != other.hasFractionalDigits()) return false; + if (hasFractionalDigits()) { + if (getFractionalDigits() + != other.getFractionalDigits()) return false; + } + if (hasLength() != other.hasLength()) return false; + if (hasLength()) { + if (getLength() + != other.getLength()) return false; + } + if (hasFlags() != other.hasFlags()) return false; + if (hasFlags()) { + if (getFlags() + != other.getFlags()) return false; + } + if (hasContentType() != other.hasContentType()) return false; + if (hasContentType()) { + if (getContentType() + != other.getContentType()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasType()) { + hash = (37 * hash) + TYPE_FIELD_NUMBER; + hash = (53 * hash) + type_; + } + if (hasName()) { + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + } + if (hasOriginalName()) { + hash = (37 * hash) + ORIGINAL_NAME_FIELD_NUMBER; + hash = (53 * hash) + getOriginalName().hashCode(); + } + if (hasTable()) { + hash = (37 * hash) + TABLE_FIELD_NUMBER; + hash = (53 * hash) + getTable().hashCode(); + } + if (hasOriginalTable()) { + hash = (37 * hash) + ORIGINAL_TABLE_FIELD_NUMBER; + hash = (53 * hash) + getOriginalTable().hashCode(); + } + if (hasSchema()) { + hash = (37 * hash) + SCHEMA_FIELD_NUMBER; + hash = (53 * hash) + getSchema().hashCode(); + } + if (hasCatalog()) { + hash = (37 * hash) + CATALOG_FIELD_NUMBER; + hash = (53 * hash) + getCatalog().hashCode(); + } + if (hasCollation()) { + hash = (37 * hash) + COLLATION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCollation()); + } + if (hasFractionalDigits()) { + hash = (37 * hash) + FRACTIONAL_DIGITS_FIELD_NUMBER; + hash = (53 * hash) + getFractionalDigits(); + } + if (hasLength()) { + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + getLength(); + } + if (hasFlags()) { + hash = (37 * hash) + FLAGS_FIELD_NUMBER; + hash = (53 * hash) + getFlags(); + } + if (hasContentType()) { + hash = (37 * hash) + CONTENT_TYPE_FIELD_NUMBER; + hash = (53 * hash) + getContentType(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Meta data of a column
    +     *@note
    +     *The encoding used for the different ``bytes`` fields in the
    +     *meta data is externally controlled. See also:
    +     *https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
    +     *@par
    +     *@note
    +     *The server may not set the ``original_{table|name}`` fields
    +     *if they are equal to the plain ``{table|name}`` field.
    +     *@par
    +     *@note
    +     *A client has to reconstruct it like:
    +     *@code{py}
    +     *if .original_name is empty and .name is not empty:
    +     *.original_name = .name
    +     *if .original_table is empty and .table is not empty:
    +     *.original_table = .table
    +     *@endcode
    +     *@par
    +     *@note
    +     *``Compact metadata format`` can be requested by the client.
    +     *In that case, only ``.type`` is set and all other fields are  empty.
    +     *Expected data type of Mysqlx.Resultset.Row per SQL Type for
    +     *non-NULL values:
    +     *| SQL Type          | .type     | .length | .frac\_dig | .flags | .charset |
    +     *|-------------------|-----------|---------|------------|--------|----------|
    +     *| TINY              | SINT      | x       |            |        |          |
    +     *| TINY UNSIGNED     | UINT      | x       |            | x      |          |
    +     *| SHORT             | SINT      | x       |            |        |          |
    +     *| SHORT UNSIGNED    | UINT      | x       |            | x      |          |
    +     *| INT24             | SINT      | x       |            |        |          |
    +     *| INT24 UNSIGNED    | UINT      | x       |            | x      |          |
    +     *| INT               | SINT      | x       |            |        |          |
    +     *| INT UNSIGNED      | UINT      | x       |            | x      |          |
    +     *| LONGLONG          | SINT      | x       |            |        |          |
    +     *| LONGLONG UNSIGNED | UINT      | x       |            | x      |          |
    +     *| DOUBLE            | DOUBLE    | x       | x          | x      |          |
    +     *| FLOAT             | FLOAT     | x       | x          | x      |          |
    +     *| DECIMAL           | DECIMAL   | x       | x          | x      |          |
    +     *| VARCHAR,CHAR,...  | BYTES     | x       |            | x      | x        |
    +     *| GEOMETRY          | BYTES     |         |            |        |          |
    +     *| TIME              | TIME      | x       |            |        |          |
    +     *| DATE              | DATETIME  | x       |            |        |          |
    +     *| DATETIME          | DATETIME  | x       |            |        |          |
    +     *| YEAR              | UINT      | x       |            | x      |          |
    +     *| TIMESTAMP         | DATETIME  | x       |            |        |          |
    +     *| SET               | SET       |         |            |        | x        |
    +     *| ENUM              | ENUM      |         |            |        | x        |
    +     *| NULL              | BYTES     |         |            |        |          |
    +     *| BIT               | BIT       | x       |            |        |          |
    +     *@note
    +     *The SQL "NULL" value is sent as an empty field value in
    +     *@ref Mysqlx::Resultset::Row.
    +     *@par Tip
    +     *The protobuf encoding of primitive data types is described in
    +     *https://developers.google.com/protocol-buffers/docs/encoding
    +     *+ SINT
    +     *- ``.length`` @n
    +     *Maximum number of displayable decimal digits (including
    +     *minus sign) of the type.
    +     *@note
    +     *The valid range is 0-255, but usually you'll see 1-20.
    +     *| SQL Type         | Maximum Digits per Type |
    +     *|------------------|-------------------------|
    +     *| TINY SIGNED      | 4                       |
    +     *| SHORT SIGNED     | 6                       |
    +     *| INT24 SIGNED     | 8                       |
    +     *| INT SIGNED       | 11                      |
    +     *| LONGLONG SIGNED  | 20                      |
    +     *@par Tip
    +     *Definition of ``M`` are in
    +     *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html.
    +     *- ``value``@n
    +     *Variable length encoded signed 64 integer.
    +     *+ UINT
    +     *- ``.flags & 1`` (zerofill) @n
    +     *The client has to left pad with 0's up to .length.
    +     *- ``.length`` @n
    +     *Maximum number of displayable decimal digits of the
    +     *type.
    +     *@note
    +     *The valid range is 0-255, but usually you'll see
    +     *1-20.
    +     *| SQL Type             | max digits per type |
    +     *|----------------------|---------------------|
    +     *| TINY UNSIGNED        | 3                   |
    +     *| SHORT UNSIGNED       | 5                   |
    +     *| INT24 UNSIGNED       | 8                   |
    +     *| INT UNSIGNED         | 10                  |
    +     *| LONGLONG UNSIGNED    | 20                  |
    +     *@par Tip
    +     *Definition of ``M`` are in
    +     *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html.
    +     *- ``value`` @n
    +     *Variable length encoded unsigned 64 integer.
    +     *+ BIT
    +     *- ``.length`` @n
    +     *Maximum number of displayable binary digits.
    +     *@note
    +     *The valid range for M of the ``BIT`` type is 1 - 64.
    +     *@par Tip
    +     *https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
    +     *- ``value`` @n
    +     *Variable length encoded unsigned 64 integer.
    +     *+ DOUBLE
    +     *- ``.length`` @n
    +     *Maximum number of displayable decimal digits (including
    +     *the decimal point and ``.fractional_digits``).
    +     *- ``.fractional_digits`` @n
    +     *Maximum number of displayable decimal digits following
    +     *the decimal point.
    +     *- ``value``@n
    +     *Encoded as protobuf's 'double'.
    +     *+ FLOAT
    +     *- ``.length``@n
    +     *Maximum number of displayable decimal digits (including
    +     *the decimal point and ``.fractional_digits``).
    +     *- ``.fractional_digits``@n
    +     *Maximum number of displayable decimal digits following
    +     *the decimal point.
    +     *- ``value``@n
    +     *Encoded as protobuf's 'float'.
    +     *+ BYTES, ENUM
    +     *@note
    +     *BYTES is used for all opaque byte strings that may have a charset:
    +     *-  TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
    +     *-  TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
    +     *-  VARCHAR, VARBINARY
    +     *-  CHAR, BINARY
    +     *-  ENUM
    +     *- ``.length``@n
    +     *Maximum length of characters of the underlying type.
    +     *- ``.flags & 1`` (rightpad) @n
    +     *If the length of the field is less than ``.length``, the
    +     *receiver is supposed to add padding characters to the
    +     *right end of the string. If the ``.charset`` is
    +     *"binary", the padding character is ``0x00``, otherwise
    +     *it is a space character as defined by that character
    +     *set.
    +     *| SQL Type      | .length  | .charset  | .flags   |
    +     *|---------------|----------|-----------|----------|
    +     *| TINYBLOB      | 256      | binary    |          |
    +     *| BLOB          | 65535    | binary    |          |
    +     *| VARCHAR(32)   | 32       | utf8      |          |
    +     *| VARBINARY(32) | 32       | utf8\_bin |          |
    +     *| BINARY(32)    | 32       | binary    | rightpad |
    +     *| CHAR(32)      | 32       | utf8      | rightpad |
    +     *- ``value``
    +     *Sequence of bytes with added one extra ``0x00`` byte at
    +     *the end. To obtain the original string, the extra
    +     *``0x00`` should be removed. The length of the string can
    +     *be acquired with protobuf's field ``length()`` method:
    +     *``length of sequence-of-bytes = length-of-field - 1``
    +     *@note
    +     *The extra byte allows to distinguish between a NULL
    +     *and empty byte sequence.
    +     *+ TIME
    +     *A time value.
    +     *- ``value``@n
    +     *The following bytes sequence:
    +     *``negate [ hour [ minutes [ seconds [ useconds ]]]]``
    +     *-  negate - one byte, should be one of: 0x00 for "+",
    +     *0x01 for "-"
    +     *-  hour - optional variable length encoded unsigned64
    +     *value for the hour
    +     *-  minutes - optional variable length encoded unsigned64
    +     *value for the minutes
    +     *-  seconds - optional variable length encoded unsigned64
    +     *value for the seconds
    +     *-  useconds - optional variable length encoded
    +     *unsigned64 value for the microseconds
    +     *@par Tip
    +     *The protobuf encoding in
    +     *https://developers.google.com/protocol-buffers/docs/encoding.
    +     *@note
    +     *Hour, minutes, seconds, and useconds are optional if
    +     *all the values to the right are 0.
    +     *Example: ``0x00 -> +00:00:00.000000``
    +     *+ DATETIME
    +     *A date or date and time value.
    +     *- ``value`` @n
    +     *A sequence of variants, arranged as follows:
    +     *``| year | month | day | [ | hour | [ | minutes | [ | seconds | [ | useconds | ]]]]``
    +     *-  year - variable length encoded unsigned64 value for
    +     *the year
    +     *-  month - variable length encoded unsigned64 value for
    +     *the month
    +     *-  day - variable length encoded unsigned64 value for
    +     *the day
    +     *-  hour - optional variable length encoded unsigned64
    +     *value for the hour
    +     *-  minutes - optional variable length encoded unsigned64
    +     *value for the minutes
    +     *-  seconds - optional variable length encoded unsigned64
    +     *value for the seconds
    +     *-  useconds - optional variable length encoded
    +     *unsigned64 value for the microseconds
    +     *@note
    +     *Hour, minutes, seconds, useconds are optional if all
    +     *the values to the right are 0.
    +     *- ``.flags``@n
    +     *| Name          | Position |
    +     *|---------------|----------|
    +     *| is\_timestamp | 1        |
    +     *+ DECIMAL
    +     *An arbitrary length number. The number is encoded as a
    +     *single byte indicating the position of the decimal point
    +     *followed by the Packed BCD encoded number. Packed BCD is
    +     *used to simplify conversion to and from strings and other
    +     *native arbitrary precision math data types. See also: packed
    +     *BCD in https://en.wikipedia.org/wiki/Binary-coded_decimal
    +     *- ``.length``
    +     *Maximum number of displayable decimal digits
    +     *(*excluding* the decimal point and sign, but including
    +     *``.fractional_digits``).
    +     *@note
    +     *Should be in the range of 1 - 65.
    +     *- ``.fractional_digits``
    +     *The decimal digits to display out of length.
    +     *@note
    +     *Should be in the range of 0 - 30.
    +     *``value``
    +     *The following bytes sequence:
    +     *``scale | BCD+ sign [0x00]?``
    +     *-  scale - 8bit scale value (number of decimal digit after the '.')
    +     *-  BCD - BCD encoded digits (4 bits for each digit)
    +     *-  sign - sign encoded on 4 bits (0xc = "+", 0xd = "-")
    +     *-  0x0 - last 4bits if length(digits) % 2 == 0
    +     *Example: ``x04 0x12 0x34 0x01
    +     *0xd0 -> -12.3401``
    +     *+ SET
    +     *A list of strings representing a SET of values.
    +     *- ``value``@n
    +     *A sequence of 0 or more of protobuf's bytes (length
    +     *prepended octets) or one of the special sequences with a
    +     *predefined meaning listed below.
    +     *Example (length of the bytes array shown in brackets):
    +     *-  ``[0]`` - the NULL value
    +     *-  ``[1] 0x00`` - a set containing a blank string ''
    +     *-  ``[1] 0x01`` - this would be an invalid value,
    +     *but is to be treated as the empty set
    +     *-  ``[2] 0x01 0x00`` - a set with a single item, which is the '0'
    +     *character
    +     *-  ``[8] 0x03 F O O 0x03 B A R`` - a set with 2 items: FOO,BAR
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.ColumnMetaData} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.ColumnMetaData) + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaDataOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_ColumnMetaData_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.class, com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + type_ = 1; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + originalName_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + table_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000008); + originalTable_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000010); + schema_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + catalog_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000040); + collation_ = 0L; + bitField0_ = (bitField0_ & ~0x00000080); + fractionalDigits_ = 0; + bitField0_ = (bitField0_ & ~0x00000100); + length_ = 0; + bitField0_ = (bitField0_ & ~0x00000200); + flags_ = 0; + bitField0_ = (bitField0_ & ~0x00000400); + contentType_ = 0; + bitField0_ = (bitField0_ & ~0x00000800); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData build() { + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData result = new com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.type_ = type_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.originalName_ = originalName_; + if (((from_bitField0_ & 0x00000008) != 0)) { + to_bitField0_ |= 0x00000008; + } + result.table_ = table_; + if (((from_bitField0_ & 0x00000010) != 0)) { + to_bitField0_ |= 0x00000010; + } + result.originalTable_ = originalTable_; + if (((from_bitField0_ & 0x00000020) != 0)) { + to_bitField0_ |= 0x00000020; + } + result.schema_ = schema_; + if (((from_bitField0_ & 0x00000040) != 0)) { + to_bitField0_ |= 0x00000040; + } + result.catalog_ = catalog_; + if (((from_bitField0_ & 0x00000080) != 0)) { + result.collation_ = collation_; + to_bitField0_ |= 0x00000080; + } + if (((from_bitField0_ & 0x00000100) != 0)) { + result.fractionalDigits_ = fractionalDigits_; + to_bitField0_ |= 0x00000100; + } + if (((from_bitField0_ & 0x00000200) != 0)) { + result.length_ = length_; + to_bitField0_ |= 0x00000200; + } + if (((from_bitField0_ & 0x00000400) != 0)) { + result.flags_ = flags_; + to_bitField0_ |= 0x00000400; + } + if (((from_bitField0_ & 0x00000800) != 0)) { + result.contentType_ = contentType_; + to_bitField0_ |= 0x00000800; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.getDefaultInstance()) return this; + if (other.hasType()) { + setType(other.getType()); + } + if (other.hasName()) { + setName(other.getName()); + } + if (other.hasOriginalName()) { + setOriginalName(other.getOriginalName()); + } + if (other.hasTable()) { + setTable(other.getTable()); + } + if (other.hasOriginalTable()) { + setOriginalTable(other.getOriginalTable()); + } + if (other.hasSchema()) { + setSchema(other.getSchema()); + } + if (other.hasCatalog()) { + setCatalog(other.getCatalog()); + } + if (other.hasCollation()) { + setCollation(other.getCollation()); + } + if (other.hasFractionalDigits()) { + setFractionalDigits(other.getFractionalDigits()); + } + if (other.hasLength()) { + setLength(other.getLength()); + } + if (other.hasFlags()) { + setFlags(other.getFlags()); + } + if (other.hasContentType()) { + setContentType(other.getContentType()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasType()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private int type_ = 1; + /** + *
    +       ** datatype of the field in a row 
    +       * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return Whether the type field is set. + */ + @java.lang.Override public boolean hasType() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** datatype of the field in a row 
    +       * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return The type. + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType getType() { + @SuppressWarnings("deprecation") + com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType result = com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType.valueOf(type_); + return result == null ? com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType.SINT : result; + } + /** + *
    +       ** datatype of the field in a row 
    +       * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @param value The type to set. + * @return This builder for chaining. + */ + public Builder setType(com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData.FieldType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + type_ = value.getNumber(); + onChanged(); + return this; + } + /** + *
    +       ** datatype of the field in a row 
    +       * 
    + * + * required .Mysqlx.Resultset.ColumnMetaData.FieldType type = 1; + * @return This builder for chaining. + */ + public Builder clearType() { + bitField0_ = (bitField0_ & ~0x00000001); + type_ = 1; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString name_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** name of the column 
    +       * 
    + * + * optional bytes name = 2; + * @return Whether the name field is set. + */ + @java.lang.Override + public boolean hasName() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** name of the column 
    +       * 
    + * + * optional bytes name = 2; + * @return The name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getName() { + return name_; + } + /** + *
    +       ** name of the column 
    +       * 
    + * + * optional bytes name = 2; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of the column 
    +       * 
    + * + * optional bytes name = 2; + * @return This builder for chaining. + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString originalName_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** name of the column before an alias was applied 
    +       * 
    + * + * optional bytes original_name = 3; + * @return Whether the originalName field is set. + */ + @java.lang.Override + public boolean hasOriginalName() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** name of the column before an alias was applied 
    +       * 
    + * + * optional bytes original_name = 3; + * @return The originalName. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOriginalName() { + return originalName_; + } + /** + *
    +       ** name of the column before an alias was applied 
    +       * 
    + * + * optional bytes original_name = 3; + * @param value The originalName to set. + * @return This builder for chaining. + */ + public Builder setOriginalName(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + originalName_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of the column before an alias was applied 
    +       * 
    + * + * optional bytes original_name = 3; + * @return This builder for chaining. + */ + public Builder clearOriginalName() { + bitField0_ = (bitField0_ & ~0x00000004); + originalName_ = getDefaultInstance().getOriginalName(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString table_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** name of the table the column originates from 
    +       * 
    + * + * optional bytes table = 4; + * @return Whether the table field is set. + */ + @java.lang.Override + public boolean hasTable() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** name of the table the column originates from 
    +       * 
    + * + * optional bytes table = 4; + * @return The table. + */ + @java.lang.Override + public com.google.protobuf.ByteString getTable() { + return table_; + } + /** + *
    +       ** name of the table the column originates from 
    +       * 
    + * + * optional bytes table = 4; + * @param value The table to set. + * @return This builder for chaining. + */ + public Builder setTable(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + table_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of the table the column originates from 
    +       * 
    + * + * optional bytes table = 4; + * @return This builder for chaining. + */ + public Builder clearTable() { + bitField0_ = (bitField0_ & ~0x00000008); + table_ = getDefaultInstance().getTable(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString originalTable_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** name of the table the column originates from before an alias was applied 
    +       * 
    + * + * optional bytes original_table = 5; + * @return Whether the originalTable field is set. + */ + @java.lang.Override + public boolean hasOriginalTable() { + return ((bitField0_ & 0x00000010) != 0); + } + /** + *
    +       ** name of the table the column originates from before an alias was applied 
    +       * 
    + * + * optional bytes original_table = 5; + * @return The originalTable. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOriginalTable() { + return originalTable_; + } + /** + *
    +       ** name of the table the column originates from before an alias was applied 
    +       * 
    + * + * optional bytes original_table = 5; + * @param value The originalTable to set. + * @return This builder for chaining. + */ + public Builder setOriginalTable(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000010; + originalTable_ = value; + onChanged(); + return this; + } + /** + *
    +       ** name of the table the column originates from before an alias was applied 
    +       * 
    + * + * optional bytes original_table = 5; + * @return This builder for chaining. + */ + public Builder clearOriginalTable() { + bitField0_ = (bitField0_ & ~0x00000010); + originalTable_ = getDefaultInstance().getOriginalTable(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString schema_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** schema the column originates from 
    +       * 
    + * + * optional bytes schema = 6; + * @return Whether the schema field is set. + */ + @java.lang.Override + public boolean hasSchema() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
    +       ** schema the column originates from 
    +       * 
    + * + * optional bytes schema = 6; + * @return The schema. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSchema() { + return schema_; + } + /** + *
    +       ** schema the column originates from 
    +       * 
    + * + * optional bytes schema = 6; + * @param value The schema to set. + * @return This builder for chaining. + */ + public Builder setSchema(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + schema_ = value; + onChanged(); + return this; + } + /** + *
    +       ** schema the column originates from 
    +       * 
    + * + * optional bytes schema = 6; + * @return This builder for chaining. + */ + public Builder clearSchema() { + bitField0_ = (bitField0_ & ~0x00000020); + schema_ = getDefaultInstance().getSchema(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString catalog_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** catalog the schema originates from
    +       *@note
    +       *As there is currently no support for catalogs in MySQL,
    +       *don't expect this field to be set. In the MySQL C/S
    +       *protocol the field had the value ``def`` all the time 
    +       * 
    + * + * optional bytes catalog = 7; + * @return Whether the catalog field is set. + */ + @java.lang.Override + public boolean hasCatalog() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
    +       ** catalog the schema originates from
    +       *@note
    +       *As there is currently no support for catalogs in MySQL,
    +       *don't expect this field to be set. In the MySQL C/S
    +       *protocol the field had the value ``def`` all the time 
    +       * 
    + * + * optional bytes catalog = 7; + * @return The catalog. + */ + @java.lang.Override + public com.google.protobuf.ByteString getCatalog() { + return catalog_; + } + /** + *
    +       ** catalog the schema originates from
    +       *@note
    +       *As there is currently no support for catalogs in MySQL,
    +       *don't expect this field to be set. In the MySQL C/S
    +       *protocol the field had the value ``def`` all the time 
    +       * 
    + * + * optional bytes catalog = 7; + * @param value The catalog to set. + * @return This builder for chaining. + */ + public Builder setCatalog(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + catalog_ = value; + onChanged(); + return this; + } + /** + *
    +       ** catalog the schema originates from
    +       *@note
    +       *As there is currently no support for catalogs in MySQL,
    +       *don't expect this field to be set. In the MySQL C/S
    +       *protocol the field had the value ``def`` all the time 
    +       * 
    + * + * optional bytes catalog = 7; + * @return This builder for chaining. + */ + public Builder clearCatalog() { + bitField0_ = (bitField0_ & ~0x00000040); + catalog_ = getDefaultInstance().getCatalog(); + onChanged(); + return this; + } + + private long collation_ ; + /** + * optional uint64 collation = 8; + * @return Whether the collation field is set. + */ + @java.lang.Override + public boolean hasCollation() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + * optional uint64 collation = 8; + * @return The collation. + */ + @java.lang.Override + public long getCollation() { + return collation_; + } + /** + * optional uint64 collation = 8; + * @param value The collation to set. + * @return This builder for chaining. + */ + public Builder setCollation(long value) { + bitField0_ |= 0x00000080; + collation_ = value; + onChanged(); + return this; + } + /** + * optional uint64 collation = 8; + * @return This builder for chaining. + */ + public Builder clearCollation() { + bitField0_ = (bitField0_ & ~0x00000080); + collation_ = 0L; + onChanged(); + return this; + } + + private int fractionalDigits_ ; + /** + *
    +       ** displayed factional decimal digits for floating point and
    +       *fixed point numbers 
    +       * 
    + * + * optional uint32 fractional_digits = 9; + * @return Whether the fractionalDigits field is set. + */ + @java.lang.Override + public boolean hasFractionalDigits() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + *
    +       ** displayed factional decimal digits for floating point and
    +       *fixed point numbers 
    +       * 
    + * + * optional uint32 fractional_digits = 9; + * @return The fractionalDigits. + */ + @java.lang.Override + public int getFractionalDigits() { + return fractionalDigits_; + } + /** + *
    +       ** displayed factional decimal digits for floating point and
    +       *fixed point numbers 
    +       * 
    + * + * optional uint32 fractional_digits = 9; + * @param value The fractionalDigits to set. + * @return This builder for chaining. + */ + public Builder setFractionalDigits(int value) { + bitField0_ |= 0x00000100; + fractionalDigits_ = value; + onChanged(); + return this; + } + /** + *
    +       ** displayed factional decimal digits for floating point and
    +       *fixed point numbers 
    +       * 
    + * + * optional uint32 fractional_digits = 9; + * @return This builder for chaining. + */ + public Builder clearFractionalDigits() { + bitField0_ = (bitField0_ & ~0x00000100); + fractionalDigits_ = 0; + onChanged(); + return this; + } + + private int length_ ; + /** + *
    +       ** maximum count of displayable characters of .type 
    +       * 
    + * + * optional uint32 length = 10; + * @return Whether the length field is set. + */ + @java.lang.Override + public boolean hasLength() { + return ((bitField0_ & 0x00000200) != 0); + } + /** + *
    +       ** maximum count of displayable characters of .type 
    +       * 
    + * + * optional uint32 length = 10; + * @return The length. + */ + @java.lang.Override + public int getLength() { + return length_; + } + /** + *
    +       ** maximum count of displayable characters of .type 
    +       * 
    + * + * optional uint32 length = 10; + * @param value The length to set. + * @return This builder for chaining. + */ + public Builder setLength(int value) { + bitField0_ |= 0x00000200; + length_ = value; + onChanged(); + return this; + } + /** + *
    +       ** maximum count of displayable characters of .type 
    +       * 
    + * + * optional uint32 length = 10; + * @return This builder for chaining. + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000200); + length_ = 0; + onChanged(); + return this; + } + + private int flags_ ; + /** + *
    +       ** ``.type`` specific flags
    +       *| Type    | Value  | Description  |
    +       *|---------|--------|--------------|
    +       *| UINT    | 0x0001 | zerofill     |
    +       *| DOUBLE  | 0x0001 | unsigned     |
    +       *| FLOAT   | 0x0001 | unsigned     |
    +       *| DECIMAL | 0x0001 | unsigned     |
    +       *| BYTES   | 0x0001 | rightpad     |
    +       *| Value  | Description     |
    +       *|--------|-----------------|
    +       *| 0x0010 | NOT\_NULL       |
    +       *| 0x0020 | PRIMARY\_KEY    |
    +       *| 0x0040 | UNIQUE\_KEY     |
    +       *| 0x0080 | MULTIPLE\_KEY   |
    +       *| 0x0100 | AUTO\_INCREMENT |
    +       *default: 0 
    +       * 
    + * + * optional uint32 flags = 11; + * @return Whether the flags field is set. + */ + @java.lang.Override + public boolean hasFlags() { + return ((bitField0_ & 0x00000400) != 0); + } + /** + *
    +       ** ``.type`` specific flags
    +       *| Type    | Value  | Description  |
    +       *|---------|--------|--------------|
    +       *| UINT    | 0x0001 | zerofill     |
    +       *| DOUBLE  | 0x0001 | unsigned     |
    +       *| FLOAT   | 0x0001 | unsigned     |
    +       *| DECIMAL | 0x0001 | unsigned     |
    +       *| BYTES   | 0x0001 | rightpad     |
    +       *| Value  | Description     |
    +       *|--------|-----------------|
    +       *| 0x0010 | NOT\_NULL       |
    +       *| 0x0020 | PRIMARY\_KEY    |
    +       *| 0x0040 | UNIQUE\_KEY     |
    +       *| 0x0080 | MULTIPLE\_KEY   |
    +       *| 0x0100 | AUTO\_INCREMENT |
    +       *default: 0 
    +       * 
    + * + * optional uint32 flags = 11; + * @return The flags. + */ + @java.lang.Override + public int getFlags() { + return flags_; + } + /** + *
    +       ** ``.type`` specific flags
    +       *| Type    | Value  | Description  |
    +       *|---------|--------|--------------|
    +       *| UINT    | 0x0001 | zerofill     |
    +       *| DOUBLE  | 0x0001 | unsigned     |
    +       *| FLOAT   | 0x0001 | unsigned     |
    +       *| DECIMAL | 0x0001 | unsigned     |
    +       *| BYTES   | 0x0001 | rightpad     |
    +       *| Value  | Description     |
    +       *|--------|-----------------|
    +       *| 0x0010 | NOT\_NULL       |
    +       *| 0x0020 | PRIMARY\_KEY    |
    +       *| 0x0040 | UNIQUE\_KEY     |
    +       *| 0x0080 | MULTIPLE\_KEY   |
    +       *| 0x0100 | AUTO\_INCREMENT |
    +       *default: 0 
    +       * 
    + * + * optional uint32 flags = 11; + * @param value The flags to set. + * @return This builder for chaining. + */ + public Builder setFlags(int value) { + bitField0_ |= 0x00000400; + flags_ = value; + onChanged(); + return this; + } + /** + *
    +       ** ``.type`` specific flags
    +       *| Type    | Value  | Description  |
    +       *|---------|--------|--------------|
    +       *| UINT    | 0x0001 | zerofill     |
    +       *| DOUBLE  | 0x0001 | unsigned     |
    +       *| FLOAT   | 0x0001 | unsigned     |
    +       *| DECIMAL | 0x0001 | unsigned     |
    +       *| BYTES   | 0x0001 | rightpad     |
    +       *| Value  | Description     |
    +       *|--------|-----------------|
    +       *| 0x0010 | NOT\_NULL       |
    +       *| 0x0020 | PRIMARY\_KEY    |
    +       *| 0x0040 | UNIQUE\_KEY     |
    +       *| 0x0080 | MULTIPLE\_KEY   |
    +       *| 0x0100 | AUTO\_INCREMENT |
    +       *default: 0 
    +       * 
    + * + * optional uint32 flags = 11; + * @return This builder for chaining. + */ + public Builder clearFlags() { + bitField0_ = (bitField0_ & ~0x00000400); + flags_ = 0; + onChanged(); + return this; + } + + private int contentType_ ; + /** + *
    +       ** a hint about the higher-level encoding of a BYTES field
    +       *| Type   | Value  | Description             |
    +       *|--------|--------|-------------------------|
    +       *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +       *| BYTES  | 0x0002 | JSON (text encoding)    |
    +       *| BYTES  | 0x0003 | XML (text encoding)     |
    +       *@note
    +       *This list isn't comprehensive. As a guideline: the field's
    +       *value is expected to pass a validator check on client
    +       *and server if this field is set. If the server adds more
    +       *internal data types that rely on BLOB storage like image
    +       *manipulation, seeking into complex types in BLOBs, and
    +       *more types will be added 
    +       * 
    + * + * optional uint32 content_type = 12; + * @return Whether the contentType field is set. + */ + @java.lang.Override + public boolean hasContentType() { + return ((bitField0_ & 0x00000800) != 0); + } + /** + *
    +       ** a hint about the higher-level encoding of a BYTES field
    +       *| Type   | Value  | Description             |
    +       *|--------|--------|-------------------------|
    +       *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +       *| BYTES  | 0x0002 | JSON (text encoding)    |
    +       *| BYTES  | 0x0003 | XML (text encoding)     |
    +       *@note
    +       *This list isn't comprehensive. As a guideline: the field's
    +       *value is expected to pass a validator check on client
    +       *and server if this field is set. If the server adds more
    +       *internal data types that rely on BLOB storage like image
    +       *manipulation, seeking into complex types in BLOBs, and
    +       *more types will be added 
    +       * 
    + * + * optional uint32 content_type = 12; + * @return The contentType. + */ + @java.lang.Override + public int getContentType() { + return contentType_; + } + /** + *
    +       ** a hint about the higher-level encoding of a BYTES field
    +       *| Type   | Value  | Description             |
    +       *|--------|--------|-------------------------|
    +       *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +       *| BYTES  | 0x0002 | JSON (text encoding)    |
    +       *| BYTES  | 0x0003 | XML (text encoding)     |
    +       *@note
    +       *This list isn't comprehensive. As a guideline: the field's
    +       *value is expected to pass a validator check on client
    +       *and server if this field is set. If the server adds more
    +       *internal data types that rely on BLOB storage like image
    +       *manipulation, seeking into complex types in BLOBs, and
    +       *more types will be added 
    +       * 
    + * + * optional uint32 content_type = 12; + * @param value The contentType to set. + * @return This builder for chaining. + */ + public Builder setContentType(int value) { + bitField0_ |= 0x00000800; + contentType_ = value; + onChanged(); + return this; + } + /** + *
    +       ** a hint about the higher-level encoding of a BYTES field
    +       *| Type   | Value  | Description             |
    +       *|--------|--------|-------------------------|
    +       *| BYTES  | 0x0001 | GEOMETRY (WKB encoding) |
    +       *| BYTES  | 0x0002 | JSON (text encoding)    |
    +       *| BYTES  | 0x0003 | XML (text encoding)     |
    +       *@note
    +       *This list isn't comprehensive. As a guideline: the field's
    +       *value is expected to pass a validator check on client
    +       *and server if this field is set. If the server adds more
    +       *internal data types that rely on BLOB storage like image
    +       *manipulation, seeking into complex types in BLOBs, and
    +       *more types will be added 
    +       * 
    + * + * optional uint32 content_type = 12; + * @return This builder for chaining. + */ + public Builder clearContentType() { + bitField0_ = (bitField0_ & ~0x00000800); + contentType_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.ColumnMetaData) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.ColumnMetaData) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ColumnMetaData parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new ColumnMetaData(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.ColumnMetaData getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RowOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Resultset.Row) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated bytes field = 1; + * @return A list containing the field. + */ + java.util.List getFieldList(); + /** + * repeated bytes field = 1; + * @return The count of field. + */ + int getFieldCount(); + /** + * repeated bytes field = 1; + * @param index The index of the element to return. + * @return The field at the given index. + */ + com.google.protobuf.ByteString getField(int index); + } + /** + *
    +   **
    +   *Row in a Resultset.
    +   *A row is represented as a list of fields encoded as byte blobs.
    +   *Value of each field is encoded as sequence of bytes using
    +   *encoding appropriate for the type of the value given by
    +   *``ColumnMetadata``, as specified in the @ref Mysqlx::Resultset::ColumnMetaData
    +   *description.
    +   * 
    + * + * Protobuf type {@code Mysqlx.Resultset.Row} + */ + public static final class Row extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Resultset.Row) + RowOrBuilder { + private static final long serialVersionUID = 0L; + // Use Row.newBuilder() to construct. + private Row(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Row() { + field_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Row(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Row( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + field_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + field_.add(input.readBytes()); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + field_ = java.util.Collections.unmodifiableList(field_); // C + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_Row_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_Row_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.Row.class, com.mysql.cj.x.protobuf.MysqlxResultset.Row.Builder.class); + } + + public static final int FIELD_FIELD_NUMBER = 1; + private java.util.List field_; + /** + * repeated bytes field = 1; + * @return A list containing the field. + */ + @java.lang.Override + public java.util.List + getFieldList() { + return field_; + } + /** + * repeated bytes field = 1; + * @return The count of field. + */ + public int getFieldCount() { + return field_.size(); + } + /** + * repeated bytes field = 1; + * @param index The index of the element to return. + * @return The field at the given index. + */ + public com.google.protobuf.ByteString getField(int index) { + return field_.get(index); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + for (int i = 0; i < field_.size(); i++) { + output.writeBytes(1, field_.get(i)); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + { + int dataSize = 0; + for (int i = 0; i < field_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream + .computeBytesSizeNoTag(field_.get(i)); + } + size += dataSize; + size += 1 * getFieldList().size(); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxResultset.Row)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxResultset.Row other = (com.mysql.cj.x.protobuf.MysqlxResultset.Row) obj; + + if (!getFieldList() + .equals(other.getFieldList())) return false; + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getFieldCount() > 0) { + hash = (37 * hash) + FIELD_FIELD_NUMBER; + hash = (53 * hash) + getFieldList().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxResultset.Row prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Row in a Resultset.
    +     *A row is represented as a list of fields encoded as byte blobs.
    +     *Value of each field is encoded as sequence of bytes using
    +     *encoding appropriate for the type of the value given by
    +     *``ColumnMetadata``, as specified in the @ref Mysqlx::Resultset::ColumnMetaData
    +     *description.
    +     * 
    + * + * Protobuf type {@code Mysqlx.Resultset.Row} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Resultset.Row) + com.mysql.cj.x.protobuf.MysqlxResultset.RowOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_Row_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_Row_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxResultset.Row.class, com.mysql.cj.x.protobuf.MysqlxResultset.Row.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxResultset.Row.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + field_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.internal_static_Mysqlx_Resultset_Row_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.Row getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxResultset.Row.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.Row build() { + com.mysql.cj.x.protobuf.MysqlxResultset.Row result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.Row buildPartial() { + com.mysql.cj.x.protobuf.MysqlxResultset.Row result = new com.mysql.cj.x.protobuf.MysqlxResultset.Row(this); + int from_bitField0_ = bitField0_; + if (((bitField0_ & 0x00000001) != 0)) { + field_ = java.util.Collections.unmodifiableList(field_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.field_ = field_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxResultset.Row) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxResultset.Row)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxResultset.Row other) { + if (other == com.mysql.cj.x.protobuf.MysqlxResultset.Row.getDefaultInstance()) return this; + if (!other.field_.isEmpty()) { + if (field_.isEmpty()) { + field_ = other.field_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureFieldIsMutable(); + field_.addAll(other.field_); + } + onChanged(); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxResultset.Row parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxResultset.Row) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.util.List field_ = java.util.Collections.emptyList(); + private void ensureFieldIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + field_ = new java.util.ArrayList(field_); + bitField0_ |= 0x00000001; + } + } + /** + * repeated bytes field = 1; + * @return A list containing the field. + */ + public java.util.List + getFieldList() { + return ((bitField0_ & 0x00000001) != 0) ? + java.util.Collections.unmodifiableList(field_) : field_; + } + /** + * repeated bytes field = 1; + * @return The count of field. + */ + public int getFieldCount() { + return field_.size(); + } + /** + * repeated bytes field = 1; + * @param index The index of the element to return. + * @return The field at the given index. + */ + public com.google.protobuf.ByteString getField(int index) { + return field_.get(index); + } + /** + * repeated bytes field = 1; + * @param index The index to set the value at. + * @param value The field to set. + * @return This builder for chaining. + */ + public Builder setField( + int index, com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureFieldIsMutable(); + field_.set(index, value); + onChanged(); + return this; + } + /** + * repeated bytes field = 1; + * @param value The field to add. + * @return This builder for chaining. + */ + public Builder addField(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + ensureFieldIsMutable(); + field_.add(value); + onChanged(); + return this; + } + /** + * repeated bytes field = 1; + * @param values The field to add. + * @return This builder for chaining. + */ + public Builder addAllField( + java.lang.Iterable values) { + ensureFieldIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, field_); + onChanged(); + return this; + } + /** + * repeated bytes field = 1; + * @return This builder for chaining. + */ + public Builder clearField() { + field_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Resultset.Row) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Resultset.Row) + private static final com.mysql.cj.x.protobuf.MysqlxResultset.Row DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxResultset.Row(); + } + + public static com.mysql.cj.x.protobuf.MysqlxResultset.Row getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Row parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Row(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxResultset.Row getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_FetchDone_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_FetchDone_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_FetchSuspended_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_FetchSuspended_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_ColumnMetaData_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Resultset_Row_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Resultset_Row_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\026mysqlx_resultset.proto\022\020Mysqlx.Results" + + "et\032\014mysqlx.proto\"\036\n\026FetchDoneMoreOutPara" + + "ms:\004\220\3520\022\"\037\n\027FetchDoneMoreResultsets:\004\220\3520" + + "\020\"\021\n\tFetchDone:\004\220\3520\016\"\026\n\016FetchSuspended:\004" + + "\220\3520\017\"\245\003\n\016ColumnMetaData\0228\n\004type\030\001 \002(\0162*." + + "Mysqlx.Resultset.ColumnMetaData.FieldTyp" + + "e\022\014\n\004name\030\002 \001(\014\022\025\n\roriginal_name\030\003 \001(\014\022\r" + + "\n\005table\030\004 \001(\014\022\026\n\016original_table\030\005 \001(\014\022\016\n" + + "\006schema\030\006 \001(\014\022\017\n\007catalog\030\007 \001(\014\022\021\n\tcollat" + + "ion\030\010 \001(\004\022\031\n\021fractional_digits\030\t \001(\r\022\016\n\006" + + "length\030\n \001(\r\022\r\n\005flags\030\013 \001(\r\022\024\n\014content_t" + + "ype\030\014 \001(\r\"\202\001\n\tFieldType\022\010\n\004SINT\020\001\022\010\n\004UIN" + + "T\020\002\022\n\n\006DOUBLE\020\005\022\t\n\005FLOAT\020\006\022\t\n\005BYTES\020\007\022\010\n" + + "\004TIME\020\n\022\014\n\010DATETIME\020\014\022\007\n\003SET\020\017\022\010\n\004ENUM\020\020" + + "\022\007\n\003BIT\020\021\022\013\n\007DECIMAL\020\022:\004\220\3520\014\"\032\n\003Row\022\r\n\005f" + + "ield\030\001 \003(\014:\004\220\3520\r*4\n\021ContentType_BYTES\022\014\n" + + "\010GEOMETRY\020\001\022\010\n\004JSON\020\002\022\007\n\003XML\020\003*.\n\024Conten" + + "tType_DATETIME\022\010\n\004DATE\020\001\022\014\n\010DATETIME\020\002B\031" + + "\n\027com.mysql.cj.x.protobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + }); + internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_FetchDoneMoreOutParams_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_FetchDoneMoreResultsets_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Resultset_FetchDone_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Resultset_FetchDone_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_FetchDone_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Resultset_FetchSuspended_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Resultset_FetchSuspended_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_FetchSuspended_descriptor, + new java.lang.String[] { }); + internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Resultset_ColumnMetaData_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_ColumnMetaData_descriptor, + new java.lang.String[] { "Type", "Name", "OriginalName", "Table", "OriginalTable", "Schema", "Catalog", "Collation", "FractionalDigits", "Length", "Flags", "ContentType", }); + internal_static_Mysqlx_Resultset_Row_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_Mysqlx_Resultset_Row_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Resultset_Row_descriptor, + new java.lang.String[] { "Field", }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSession.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSession.java new file mode 100644 index 0000000..132bf59 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSession.java @@ -0,0 +1,3235 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_session.proto + +public final class MysqlxSession { + private MysqlxSession() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface AuthenticateStartOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Session.AuthenticateStart) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return Whether the mechName field is set. + */ + boolean hasMechName(); + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return The mechName. + */ + java.lang.String getMechName(); + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return The bytes for mechName. + */ + com.google.protobuf.ByteString + getMechNameBytes(); + + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 2; + * @return Whether the authData field is set. + */ + boolean hasAuthData(); + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 2; + * @return The authData. + */ + com.google.protobuf.ByteString getAuthData(); + + /** + *
    +     ** initial response 
    +     * 
    + * + * optional bytes initial_response = 3; + * @return Whether the initialResponse field is set. + */ + boolean hasInitialResponse(); + /** + *
    +     ** initial response 
    +     * 
    + * + * optional bytes initial_response = 3; + * @return The initialResponse. + */ + com.google.protobuf.ByteString getInitialResponse(); + } + /** + *
    +   **
    +   *The initial message send from the client to the server to start
    +   *the authentication process.
    +   *@returns @ref Mysqlx::Session::AuthenticateContinue
    +   * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateStart} + */ + public static final class AuthenticateStart extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Session.AuthenticateStart) + AuthenticateStartOrBuilder { + private static final long serialVersionUID = 0L; + // Use AuthenticateStart.newBuilder() to construct. + private AuthenticateStart(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AuthenticateStart() { + mechName_ = ""; + authData_ = com.google.protobuf.ByteString.EMPTY; + initialResponse_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AuthenticateStart(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AuthenticateStart( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + mechName_ = bs; + break; + } + case 18: { + bitField0_ |= 0x00000002; + authData_ = input.readBytes(); + break; + } + case 26: { + bitField0_ |= 0x00000004; + initialResponse_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateStart_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateStart_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.Builder.class); + } + + private int bitField0_; + public static final int MECH_NAME_FIELD_NUMBER = 1; + private volatile java.lang.Object mechName_; + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return Whether the mechName field is set. + */ + @java.lang.Override + public boolean hasMechName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return The mechName. + */ + @java.lang.Override + public java.lang.String getMechName() { + java.lang.Object ref = mechName_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + mechName_ = s; + } + return s; + } + } + /** + *
    +     ** authentication mechanism name 
    +     * 
    + * + * required string mech_name = 1; + * @return The bytes for mechName. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMechNameBytes() { + java.lang.Object ref = mechName_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mechName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int AUTH_DATA_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString authData_; + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 2; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 2; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + + public static final int INITIAL_RESPONSE_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString initialResponse_; + /** + *
    +     ** initial response 
    +     * 
    + * + * optional bytes initial_response = 3; + * @return Whether the initialResponse field is set. + */ + @java.lang.Override + public boolean hasInitialResponse() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** initial response 
    +     * 
    + * + * optional bytes initial_response = 3; + * @return The initialResponse. + */ + @java.lang.Override + public com.google.protobuf.ByteString getInitialResponse() { + return initialResponse_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasMechName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mechName_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBytes(2, authData_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBytes(3, initialResponse_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, mechName_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, authData_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, initialResponse_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart other = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart) obj; + + if (hasMechName() != other.hasMechName()) return false; + if (hasMechName()) { + if (!getMechName() + .equals(other.getMechName())) return false; + } + if (hasAuthData() != other.hasAuthData()) return false; + if (hasAuthData()) { + if (!getAuthData() + .equals(other.getAuthData())) return false; + } + if (hasInitialResponse() != other.hasInitialResponse()) return false; + if (hasInitialResponse()) { + if (!getInitialResponse() + .equals(other.getInitialResponse())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasMechName()) { + hash = (37 * hash) + MECH_NAME_FIELD_NUMBER; + hash = (53 * hash) + getMechName().hashCode(); + } + if (hasAuthData()) { + hash = (37 * hash) + AUTH_DATA_FIELD_NUMBER; + hash = (53 * hash) + getAuthData().hashCode(); + } + if (hasInitialResponse()) { + hash = (37 * hash) + INITIAL_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getInitialResponse().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *The initial message send from the client to the server to start
    +     *the authentication process.
    +     *@returns @ref Mysqlx::Session::AuthenticateContinue
    +     * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateStart} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Session.AuthenticateStart) + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStartOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateStart_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateStart_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + mechName_ = ""; + bitField0_ = (bitField0_ & ~0x00000001); + authData_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + initialResponse_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateStart_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart build() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart result = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.mechName_ = mechName_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.authData_ = authData_; + if (((from_bitField0_ & 0x00000004) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.initialResponse_ = initialResponse_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart.getDefaultInstance()) return this; + if (other.hasMechName()) { + bitField0_ |= 0x00000001; + mechName_ = other.mechName_; + onChanged(); + } + if (other.hasAuthData()) { + setAuthData(other.getAuthData()); + } + if (other.hasInitialResponse()) { + setInitialResponse(other.getInitialResponse()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasMechName()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object mechName_ = ""; + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @return Whether the mechName field is set. + */ + public boolean hasMechName() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @return The mechName. + */ + public java.lang.String getMechName() { + java.lang.Object ref = mechName_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + mechName_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @return The bytes for mechName. + */ + public com.google.protobuf.ByteString + getMechNameBytes() { + java.lang.Object ref = mechName_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + mechName_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @param value The mechName to set. + * @return This builder for chaining. + */ + public Builder setMechName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + mechName_ = value; + onChanged(); + return this; + } + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @return This builder for chaining. + */ + public Builder clearMechName() { + bitField0_ = (bitField0_ & ~0x00000001); + mechName_ = getDefaultInstance().getMechName(); + onChanged(); + return this; + } + /** + *
    +       ** authentication mechanism name 
    +       * 
    + * + * required string mech_name = 1; + * @param value The bytes for mechName to set. + * @return This builder for chaining. + */ + public Builder setMechNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + mechName_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString authData_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 2; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 2; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 2; + * @param value The authData to set. + * @return This builder for chaining. + */ + public Builder setAuthData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + authData_ = value; + onChanged(); + return this; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 2; + * @return This builder for chaining. + */ + public Builder clearAuthData() { + bitField0_ = (bitField0_ & ~0x00000002); + authData_ = getDefaultInstance().getAuthData(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString initialResponse_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** initial response 
    +       * 
    + * + * optional bytes initial_response = 3; + * @return Whether the initialResponse field is set. + */ + @java.lang.Override + public boolean hasInitialResponse() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +       ** initial response 
    +       * 
    + * + * optional bytes initial_response = 3; + * @return The initialResponse. + */ + @java.lang.Override + public com.google.protobuf.ByteString getInitialResponse() { + return initialResponse_; + } + /** + *
    +       ** initial response 
    +       * 
    + * + * optional bytes initial_response = 3; + * @param value The initialResponse to set. + * @return This builder for chaining. + */ + public Builder setInitialResponse(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000004; + initialResponse_ = value; + onChanged(); + return this; + } + /** + *
    +       ** initial response 
    +       * 
    + * + * optional bytes initial_response = 3; + * @return This builder for chaining. + */ + public Builder clearInitialResponse() { + bitField0_ = (bitField0_ & ~0x00000004); + initialResponse_ = getDefaultInstance().getInitialResponse(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Session.AuthenticateStart) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Session.AuthenticateStart) + private static final com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AuthenticateStart parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AuthenticateStart(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface AuthenticateContinueOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Session.AuthenticateContinue) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** authentication data 
    +     * 
    + * + * required bytes auth_data = 1; + * @return Whether the authData field is set. + */ + boolean hasAuthData(); + /** + *
    +     ** authentication data 
    +     * 
    + * + * required bytes auth_data = 1; + * @return The authData. + */ + com.google.protobuf.ByteString getAuthData(); + } + /** + *
    +   **
    +   *Send by client or server after an @ref Mysqlx::Session::AuthenticateStart
    +   *to exchange more authentication data.
    +   *@returns Mysqlx::Session::AuthenticateContinue
    +   * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateContinue} + */ + public static final class AuthenticateContinue extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Session.AuthenticateContinue) + AuthenticateContinueOrBuilder { + private static final long serialVersionUID = 0L; + // Use AuthenticateContinue.newBuilder() to construct. + private AuthenticateContinue(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AuthenticateContinue() { + authData_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AuthenticateContinue(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AuthenticateContinue( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + bitField0_ |= 0x00000001; + authData_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateContinue_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateContinue_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.Builder.class); + } + + private int bitField0_; + public static final int AUTH_DATA_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString authData_; + /** + *
    +     ** authentication data 
    +     * 
    + * + * required bytes auth_data = 1; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** authentication data 
    +     * 
    + * + * required bytes auth_data = 1; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasAuthData()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeBytes(1, authData_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, authData_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue other = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue) obj; + + if (hasAuthData() != other.hasAuthData()) return false; + if (hasAuthData()) { + if (!getAuthData() + .equals(other.getAuthData())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasAuthData()) { + hash = (37 * hash) + AUTH_DATA_FIELD_NUMBER; + hash = (53 * hash) + getAuthData().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Send by client or server after an @ref Mysqlx::Session::AuthenticateStart
    +     *to exchange more authentication data.
    +     *@returns Mysqlx::Session::AuthenticateContinue
    +     * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateContinue} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Session.AuthenticateContinue) + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinueOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateContinue_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateContinue_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + authData_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateContinue_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue build() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue result = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.authData_ = authData_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue.getDefaultInstance()) return this; + if (other.hasAuthData()) { + setAuthData(other.getAuthData()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasAuthData()) { + return false; + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.ByteString authData_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** authentication data 
    +       * 
    + * + * required bytes auth_data = 1; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * required bytes auth_data = 1; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * required bytes auth_data = 1; + * @param value The authData to set. + * @return This builder for chaining. + */ + public Builder setAuthData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + authData_ = value; + onChanged(); + return this; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * required bytes auth_data = 1; + * @return This builder for chaining. + */ + public Builder clearAuthData() { + bitField0_ = (bitField0_ & ~0x00000001); + authData_ = getDefaultInstance().getAuthData(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Session.AuthenticateContinue) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Session.AuthenticateContinue) + private static final com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AuthenticateContinue parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AuthenticateContinue(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface AuthenticateOkOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Session.AuthenticateOk) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 1; + * @return Whether the authData field is set. + */ + boolean hasAuthData(); + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 1; + * @return The authData. + */ + com.google.protobuf.ByteString getAuthData(); + } + /** + *
    +   **
    +   *Sent by the server after successful authentication.
    +   * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateOk} + */ + public static final class AuthenticateOk extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Session.AuthenticateOk) + AuthenticateOkOrBuilder { + private static final long serialVersionUID = 0L; + // Use AuthenticateOk.newBuilder() to construct. + private AuthenticateOk(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private AuthenticateOk() { + authData_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new AuthenticateOk(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private AuthenticateOk( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + bitField0_ |= 0x00000001; + authData_ = input.readBytes(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateOk_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateOk_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.Builder.class); + } + + private int bitField0_; + public static final int AUTH_DATA_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString authData_; + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 1; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** authentication data 
    +     * 
    + * + * optional bytes auth_data = 1; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeBytes(1, authData_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, authData_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk other = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk) obj; + + if (hasAuthData() != other.hasAuthData()) return false; + if (hasAuthData()) { + if (!getAuthData() + .equals(other.getAuthData())) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasAuthData()) { + hash = (37 * hash) + AUTH_DATA_FIELD_NUMBER; + hash = (53 * hash) + getAuthData().hashCode(); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Sent by the server after successful authentication.
    +     * 
    + * + * Protobuf type {@code Mysqlx.Session.AuthenticateOk} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Session.AuthenticateOk) + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOkOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateOk_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateOk_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.class, com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + authData_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_AuthenticateOk_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk build() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk result = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.authData_ = authData_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk.getDefaultInstance()) return this; + if (other.hasAuthData()) { + setAuthData(other.getAuthData()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private com.google.protobuf.ByteString authData_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 1; + * @return Whether the authData field is set. + */ + @java.lang.Override + public boolean hasAuthData() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 1; + * @return The authData. + */ + @java.lang.Override + public com.google.protobuf.ByteString getAuthData() { + return authData_; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 1; + * @param value The authData to set. + * @return This builder for chaining. + */ + public Builder setAuthData(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + authData_ = value; + onChanged(); + return this; + } + /** + *
    +       ** authentication data 
    +       * 
    + * + * optional bytes auth_data = 1; + * @return This builder for chaining. + */ + public Builder clearAuthData() { + bitField0_ = (bitField0_ & ~0x00000001); + authData_ = getDefaultInstance().getAuthData(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Session.AuthenticateOk) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Session.AuthenticateOk) + private static final com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AuthenticateOk parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new AuthenticateOk(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateOk getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface ResetOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Session.Reset) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** if is true the session will be reset, but stays authenticated; otherwise,
    +     *the session will be closed and needs to be authenticated again 
    +     * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return Whether the keepOpen field is set. + */ + boolean hasKeepOpen(); + /** + *
    +     ** if is true the session will be reset, but stays authenticated; otherwise,
    +     *the session will be closed and needs to be authenticated again 
    +     * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return The keepOpen. + */ + boolean getKeepOpen(); + } + /** + *
    +   **
    +   *Reset the current session.
    +   *@returns @ref Mysqlx::Ok
    +   * 
    + * + * Protobuf type {@code Mysqlx.Session.Reset} + */ + public static final class Reset extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Session.Reset) + ResetOrBuilder { + private static final long serialVersionUID = 0L; + // Use Reset.newBuilder() to construct. + private Reset(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Reset() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Reset(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Reset( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + bitField0_ |= 0x00000001; + keepOpen_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Reset_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Reset_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.Reset.class, com.mysql.cj.x.protobuf.MysqlxSession.Reset.Builder.class); + } + + private int bitField0_; + public static final int KEEP_OPEN_FIELD_NUMBER = 1; + private boolean keepOpen_; + /** + *
    +     ** if is true the session will be reset, but stays authenticated; otherwise,
    +     *the session will be closed and needs to be authenticated again 
    +     * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return Whether the keepOpen field is set. + */ + @java.lang.Override + public boolean hasKeepOpen() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** if is true the session will be reset, but stays authenticated; otherwise,
    +     *the session will be closed and needs to be authenticated again 
    +     * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return The keepOpen. + */ + @java.lang.Override + public boolean getKeepOpen() { + return keepOpen_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeBool(1, keepOpen_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, keepOpen_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSession.Reset)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSession.Reset other = (com.mysql.cj.x.protobuf.MysqlxSession.Reset) obj; + + if (hasKeepOpen() != other.hasKeepOpen()) return false; + if (hasKeepOpen()) { + if (getKeepOpen() + != other.getKeepOpen()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasKeepOpen()) { + hash = (37 * hash) + KEEP_OPEN_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getKeepOpen()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSession.Reset prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Reset the current session.
    +     *@returns @ref Mysqlx::Ok
    +     * 
    + * + * Protobuf type {@code Mysqlx.Session.Reset} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Session.Reset) + com.mysql.cj.x.protobuf.MysqlxSession.ResetOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Reset_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Reset_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.Reset.class, com.mysql.cj.x.protobuf.MysqlxSession.Reset.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSession.Reset.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + keepOpen_ = false; + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Reset_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Reset getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.Reset.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Reset build() { + com.mysql.cj.x.protobuf.MysqlxSession.Reset result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Reset buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSession.Reset result = new com.mysql.cj.x.protobuf.MysqlxSession.Reset(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.keepOpen_ = keepOpen_; + to_bitField0_ |= 0x00000001; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSession.Reset) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSession.Reset)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSession.Reset other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSession.Reset.getDefaultInstance()) return this; + if (other.hasKeepOpen()) { + setKeepOpen(other.getKeepOpen()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSession.Reset parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSession.Reset) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private boolean keepOpen_ ; + /** + *
    +       ** if is true the session will be reset, but stays authenticated; otherwise,
    +       *the session will be closed and needs to be authenticated again 
    +       * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return Whether the keepOpen field is set. + */ + @java.lang.Override + public boolean hasKeepOpen() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** if is true the session will be reset, but stays authenticated; otherwise,
    +       *the session will be closed and needs to be authenticated again 
    +       * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return The keepOpen. + */ + @java.lang.Override + public boolean getKeepOpen() { + return keepOpen_; + } + /** + *
    +       ** if is true the session will be reset, but stays authenticated; otherwise,
    +       *the session will be closed and needs to be authenticated again 
    +       * 
    + * + * optional bool keep_open = 1 [default = false]; + * @param value The keepOpen to set. + * @return This builder for chaining. + */ + public Builder setKeepOpen(boolean value) { + bitField0_ |= 0x00000001; + keepOpen_ = value; + onChanged(); + return this; + } + /** + *
    +       ** if is true the session will be reset, but stays authenticated; otherwise,
    +       *the session will be closed and needs to be authenticated again 
    +       * 
    + * + * optional bool keep_open = 1 [default = false]; + * @return This builder for chaining. + */ + public Builder clearKeepOpen() { + bitField0_ = (bitField0_ & ~0x00000001); + keepOpen_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Session.Reset) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Session.Reset) + private static final com.mysql.cj.x.protobuf.MysqlxSession.Reset DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSession.Reset(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.Reset getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Reset parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Reset(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Reset getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface CloseOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Session.Close) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Close the current session.
    +   *@returns @ref Mysqlx::Ok
    +   * 
    + * + * Protobuf type {@code Mysqlx.Session.Close} + */ + public static final class Close extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Session.Close) + CloseOrBuilder { + private static final long serialVersionUID = 0L; + // Use Close.newBuilder() to construct. + private Close(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Close() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Close(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Close( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.Close.class, com.mysql.cj.x.protobuf.MysqlxSession.Close.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSession.Close)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSession.Close other = (com.mysql.cj.x.protobuf.MysqlxSession.Close) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSession.Close parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSession.Close prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Close the current session.
    +     *@returns @ref Mysqlx::Ok
    +     * 
    + * + * Protobuf type {@code Mysqlx.Session.Close} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Session.Close) + com.mysql.cj.x.protobuf.MysqlxSession.CloseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Close_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Close_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSession.Close.class, com.mysql.cj.x.protobuf.MysqlxSession.Close.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSession.Close.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.internal_static_Mysqlx_Session_Close_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Close getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSession.Close.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Close build() { + com.mysql.cj.x.protobuf.MysqlxSession.Close result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Close buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSession.Close result = new com.mysql.cj.x.protobuf.MysqlxSession.Close(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSession.Close) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSession.Close)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSession.Close other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSession.Close.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSession.Close parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSession.Close) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Session.Close) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Session.Close) + private static final com.mysql.cj.x.protobuf.MysqlxSession.Close DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSession.Close(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSession.Close getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Close parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Close(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSession.Close getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Session_AuthenticateStart_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Session_AuthenticateStart_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Session_AuthenticateContinue_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Session_AuthenticateContinue_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Session_AuthenticateOk_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Session_AuthenticateOk_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Session_Reset_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Session_Reset_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Session_Close_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Session_Close_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\024mysqlx_session.proto\022\016Mysqlx.Session\032\014" + + "mysqlx.proto\"Y\n\021AuthenticateStart\022\021\n\tmec" + + "h_name\030\001 \002(\t\022\021\n\tauth_data\030\002 \001(\014\022\030\n\020initi" + + "al_response\030\003 \001(\014:\004\210\3520\004\"3\n\024AuthenticateC" + + "ontinue\022\021\n\tauth_data\030\001 \002(\014:\010\220\3520\003\210\3520\005\")\n\016" + + "AuthenticateOk\022\021\n\tauth_data\030\001 \001(\014:\004\220\3520\004\"" + + "\'\n\005Reset\022\030\n\tkeep_open\030\001 \001(\010:\005false:\004\210\3520\006" + + "\"\r\n\005Close:\004\210\3520\007B\031\n\027com.mysql.cj.x.protob" + + "uf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + }); + internal_static_Mysqlx_Session_AuthenticateStart_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Session_AuthenticateStart_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Session_AuthenticateStart_descriptor, + new java.lang.String[] { "MechName", "AuthData", "InitialResponse", }); + internal_static_Mysqlx_Session_AuthenticateContinue_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Session_AuthenticateContinue_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Session_AuthenticateContinue_descriptor, + new java.lang.String[] { "AuthData", }); + internal_static_Mysqlx_Session_AuthenticateOk_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_Mysqlx_Session_AuthenticateOk_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Session_AuthenticateOk_descriptor, + new java.lang.String[] { "AuthData", }); + internal_static_Mysqlx_Session_Reset_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_Mysqlx_Session_Reset_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Session_Reset_descriptor, + new java.lang.String[] { "KeepOpen", }); + internal_static_Mysqlx_Session_Close_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_Mysqlx_Session_Close_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Session_Close_descriptor, + new java.lang.String[] { }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSql.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSql.java new file mode 100644 index 0000000..338f395 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/MysqlxSql.java @@ -0,0 +1,1988 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.x.protobuf; + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_sql.proto + +@SuppressWarnings({ "deprecation" }) +public final class MysqlxSql { + private MysqlxSql() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface StmtExecuteOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Sql.StmtExecute) + com.google.protobuf.MessageOrBuilder { + + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return Whether the namespace field is set. + */ + boolean hasNamespace(); + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The namespace. + */ + java.lang.String getNamespace(); + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The bytes for namespace. + */ + com.google.protobuf.ByteString + getNamespaceBytes(); + + /** + *
    +     ** statement that shall be executed  
    +     * 
    + * + * required bytes stmt = 1; + * @return Whether the stmt field is set. + */ + boolean hasStmt(); + /** + *
    +     ** statement that shall be executed  
    +     * 
    + * + * required bytes stmt = 1; + * @return The stmt. + */ + com.google.protobuf.ByteString getStmt(); + + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + java.util.List + getArgsList(); + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index); + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + int getArgsCount(); + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + java.util.List + getArgsOrBuilderList(); + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index); + + /** + *
    +     ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +     *skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return Whether the compactMetadata field is set. + */ + boolean hasCompactMetadata(); + /** + *
    +     ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +     *skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return The compactMetadata. + */ + boolean getCompactMetadata(); + } + /** + *
    +   *Execute a statement in the given namespace.
    +   *@startuml "Execute Statements"
    +   *client -> server: StmtExecute
    +   *... zero or more Resultsets ...
    +   *server --> client: StmtExecuteOk
    +   *@enduml
    +   *@notice This message may generate a notice containing WARNINGs generated by
    +   *its execution. This message may generate a  notice containing INFO messages
    +   *generated by its execution.
    +   *@returns zero or more  @ref Mysqlx::Resultset followed by @ref Mysqlx::Sql::StmtExecuteOk
    +   * 
    + * + * Protobuf type {@code Mysqlx.Sql.StmtExecute} + */ + public static final class StmtExecute extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Sql.StmtExecute) + StmtExecuteOrBuilder { + private static final long serialVersionUID = 0L; + // Use StmtExecute.newBuilder() to construct. + private StmtExecute(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private StmtExecute() { + namespace_ = "sql"; + stmt_ = com.google.protobuf.ByteString.EMPTY; + args_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new StmtExecute(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private StmtExecute( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + bitField0_ |= 0x00000002; + stmt_ = input.readBytes(); + break; + } + case 18: { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + args_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + args_.add( + input.readMessage(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.PARSER, extensionRegistry)); + break; + } + case 26: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000001; + namespace_ = bs; + break; + } + case 32: { + bitField0_ |= 0x00000004; + compactMetadata_ = input.readBool(); + break; + } + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000004) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecute_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecute_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.class, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder.class); + } + + private int bitField0_; + public static final int NAMESPACE_FIELD_NUMBER = 3; + private volatile java.lang.Object namespace_; + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return Whether the namespace field is set. + */ + @java.lang.Override + public boolean hasNamespace() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The namespace. + */ + @java.lang.Override + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + namespace_ = s; + } + return s; + } + } + /** + *
    +     ** namespace of the statement to be executed 
    +     * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The bytes for namespace. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int STMT_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString stmt_; + /** + *
    +     ** statement that shall be executed  
    +     * 
    + * + * required bytes stmt = 1; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +     ** statement that shall be executed  
    +     * 
    + * + * required bytes stmt = 1; + * @return The stmt. + */ + @java.lang.Override + public com.google.protobuf.ByteString getStmt() { + return stmt_; + } + + public static final int ARGS_FIELD_NUMBER = 2; + private java.util.List args_; + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public java.util.List getArgsList() { + return args_; + } + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public java.util.List + getArgsOrBuilderList() { + return args_; + } + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public int getArgsCount() { + return args_.size(); + } + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index) { + return args_.get(index); + } + /** + *
    +     ** values for wildcard replacements 
    +     * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index) { + return args_.get(index); + } + + public static final int COMPACT_METADATA_FIELD_NUMBER = 4; + private boolean compactMetadata_; + /** + *
    +     ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +     *skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return Whether the compactMetadata field is set. + */ + @java.lang.Override + public boolean hasCompactMetadata() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + *
    +     ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +     *skipping names and others 
    +     * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return The compactMetadata. + */ + @java.lang.Override + public boolean getCompactMetadata() { + return compactMetadata_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasStmt()) { + memoizedIsInitialized = 0; + return false; + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + } + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (((bitField0_ & 0x00000002) != 0)) { + output.writeBytes(1, stmt_); + } + for (int i = 0; i < args_.size(); i++) { + output.writeMessage(2, args_.get(i)); + } + if (((bitField0_ & 0x00000001) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, namespace_); + } + if (((bitField0_ & 0x00000004) != 0)) { + output.writeBool(4, compactMetadata_); + } + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(1, stmt_); + } + for (int i = 0; i < args_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, args_.get(i)); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, namespace_); + } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(4, compactMetadata_); + } + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute other = (com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute) obj; + + if (hasNamespace() != other.hasNamespace()) return false; + if (hasNamespace()) { + if (!getNamespace() + .equals(other.getNamespace())) return false; + } + if (hasStmt() != other.hasStmt()) return false; + if (hasStmt()) { + if (!getStmt() + .equals(other.getStmt())) return false; + } + if (!getArgsList() + .equals(other.getArgsList())) return false; + if (hasCompactMetadata() != other.hasCompactMetadata()) return false; + if (hasCompactMetadata()) { + if (getCompactMetadata() + != other.getCompactMetadata()) return false; + } + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasNamespace()) { + hash = (37 * hash) + NAMESPACE_FIELD_NUMBER; + hash = (53 * hash) + getNamespace().hashCode(); + } + if (hasStmt()) { + hash = (37 * hash) + STMT_FIELD_NUMBER; + hash = (53 * hash) + getStmt().hashCode(); + } + if (getArgsCount() > 0) { + hash = (37 * hash) + ARGS_FIELD_NUMBER; + hash = (53 * hash) + getArgsList().hashCode(); + } + if (hasCompactMetadata()) { + hash = (37 * hash) + COMPACT_METADATA_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getCompactMetadata()); + } + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     *Execute a statement in the given namespace.
    +     *@startuml "Execute Statements"
    +     *client -> server: StmtExecute
    +     *... zero or more Resultsets ...
    +     *server --> client: StmtExecuteOk
    +     *@enduml
    +     *@notice This message may generate a notice containing WARNINGs generated by
    +     *its execution. This message may generate a  notice containing INFO messages
    +     *generated by its execution.
    +     *@returns zero or more  @ref Mysqlx::Resultset followed by @ref Mysqlx::Sql::StmtExecuteOk
    +     * 
    + * + * Protobuf type {@code Mysqlx.Sql.StmtExecute} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Sql.StmtExecute) + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecute_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecute_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.class, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + getArgsFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + namespace_ = "sql"; + bitField0_ = (bitField0_ & ~0x00000001); + stmt_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000002); + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + } else { + argsBuilder_.clear(); + } + compactMetadata_ = false; + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecute_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute build() { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute result = new com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + to_bitField0_ |= 0x00000001; + } + result.namespace_ = namespace_; + if (((from_bitField0_ & 0x00000002) != 0)) { + to_bitField0_ |= 0x00000002; + } + result.stmt_ = stmt_; + if (argsBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0)) { + args_ = java.util.Collections.unmodifiableList(args_); + bitField0_ = (bitField0_ & ~0x00000004); + } + result.args_ = args_; + } else { + result.args_ = argsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.compactMetadata_ = compactMetadata_; + to_bitField0_ |= 0x00000004; + } + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute.getDefaultInstance()) return this; + if (other.hasNamespace()) { + bitField0_ |= 0x00000001; + namespace_ = other.namespace_; + onChanged(); + } + if (other.hasStmt()) { + setStmt(other.getStmt()); + } + if (argsBuilder_ == null) { + if (!other.args_.isEmpty()) { + if (args_.isEmpty()) { + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000004); + } else { + ensureArgsIsMutable(); + args_.addAll(other.args_); + } + onChanged(); + } + } else { + if (!other.args_.isEmpty()) { + if (argsBuilder_.isEmpty()) { + argsBuilder_.dispose(); + argsBuilder_ = null; + args_ = other.args_; + bitField0_ = (bitField0_ & ~0x00000004); + argsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getArgsFieldBuilder() : null; + } else { + argsBuilder_.addAllMessages(other.args_); + } + } + } + if (other.hasCompactMetadata()) { + setCompactMetadata(other.getCompactMetadata()); + } + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + if (!hasStmt()) { + return false; + } + for (int i = 0; i < getArgsCount(); i++) { + if (!getArgs(i).isInitialized()) { + return false; + } + } + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private java.lang.Object namespace_ = "sql"; + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return Whether the namespace field is set. + */ + public boolean hasNamespace() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The namespace. + */ + public java.lang.String getNamespace() { + java.lang.Object ref = namespace_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + namespace_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return The bytes for namespace. + */ + public com.google.protobuf.ByteString + getNamespaceBytes() { + java.lang.Object ref = namespace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + namespace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @param value The namespace to set. + * @return This builder for chaining. + */ + public Builder setNamespace( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + namespace_ = value; + onChanged(); + return this; + } + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @return This builder for chaining. + */ + public Builder clearNamespace() { + bitField0_ = (bitField0_ & ~0x00000001); + namespace_ = getDefaultInstance().getNamespace(); + onChanged(); + return this; + } + /** + *
    +       ** namespace of the statement to be executed 
    +       * 
    + * + * optional string namespace = 3 [default = "sql"]; + * @param value The bytes for namespace to set. + * @return This builder for chaining. + */ + public Builder setNamespaceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + namespace_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString stmt_ = com.google.protobuf.ByteString.EMPTY; + /** + *
    +       ** statement that shall be executed  
    +       * 
    + * + * required bytes stmt = 1; + * @return Whether the stmt field is set. + */ + @java.lang.Override + public boolean hasStmt() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + *
    +       ** statement that shall be executed  
    +       * 
    + * + * required bytes stmt = 1; + * @return The stmt. + */ + @java.lang.Override + public com.google.protobuf.ByteString getStmt() { + return stmt_; + } + /** + *
    +       ** statement that shall be executed  
    +       * 
    + * + * required bytes stmt = 1; + * @param value The stmt to set. + * @return This builder for chaining. + */ + public Builder setStmt(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + stmt_ = value; + onChanged(); + return this; + } + /** + *
    +       ** statement that shall be executed  
    +       * 
    + * + * required bytes stmt = 1; + * @return This builder for chaining. + */ + public Builder clearStmt() { + bitField0_ = (bitField0_ & ~0x00000002); + stmt_ = getDefaultInstance().getStmt(); + onChanged(); + return this; + } + + private java.util.List args_ = + java.util.Collections.emptyList(); + private void ensureArgsIsMutable() { + if (!((bitField0_ & 0x00000004) != 0)) { + args_ = new java.util.ArrayList(args_); + bitField0_ |= 0x00000004; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> argsBuilder_; + + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List getArgsList() { + if (argsBuilder_ == null) { + return java.util.Collections.unmodifiableList(args_); + } else { + return argsBuilder_.getMessageList(); + } + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public int getArgsCount() { + if (argsBuilder_ == null) { + return args_.size(); + } else { + return argsBuilder_.getCount(); + } + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any getArgs(int index) { + if (argsBuilder_ == null) { + return args_.get(index); + } else { + return argsBuilder_.getMessage(index); + } + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.set(index, value); + onChanged(); + } else { + argsBuilder_.setMessage(index, value); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder setArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.set(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs(com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(value); + onChanged(); + } else { + argsBuilder_.addMessage(value); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any value) { + if (argsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureArgsIsMutable(); + args_.add(index, value); + onChanged(); + } else { + argsBuilder_.addMessage(index, value); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addArgs( + int index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder builderForValue) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.add(index, builderForValue.build()); + onChanged(); + } else { + argsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder addAllArgs( + java.lang.Iterable values) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, args_); + onChanged(); + } else { + argsBuilder_.addAllMessages(values); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder clearArgs() { + if (argsBuilder_ == null) { + args_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + } else { + argsBuilder_.clear(); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public Builder removeArgs(int index) { + if (argsBuilder_ == null) { + ensureArgsIsMutable(); + args_.remove(index); + onChanged(); + } else { + argsBuilder_.remove(index); + } + return this; + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder getArgsBuilder( + int index) { + return getArgsFieldBuilder().getBuilder(index); + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder getArgsOrBuilder( + int index) { + if (argsBuilder_ == null) { + return args_.get(index); } else { + return argsBuilder_.getMessageOrBuilder(index); + } + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List + getArgsOrBuilderList() { + if (argsBuilder_ != null) { + return argsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(args_); + } + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addArgsBuilder() { + return getArgsFieldBuilder().addBuilder( + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder addArgsBuilder( + int index) { + return getArgsFieldBuilder().addBuilder( + index, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.getDefaultInstance()); + } + /** + *
    +       ** values for wildcard replacements 
    +       * 
    + * + * repeated .Mysqlx.Datatypes.Any args = 2; + */ + public java.util.List + getArgsBuilderList() { + return getArgsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder> + getArgsFieldBuilder() { + if (argsBuilder_ == null) { + argsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + com.mysql.cj.x.protobuf.MysqlxDatatypes.Any, com.mysql.cj.x.protobuf.MysqlxDatatypes.Any.Builder, com.mysql.cj.x.protobuf.MysqlxDatatypes.AnyOrBuilder>( + args_, + ((bitField0_ & 0x00000004) != 0), + getParentForChildren(), + isClean()); + args_ = null; + } + return argsBuilder_; + } + + private boolean compactMetadata_ ; + /** + *
    +       ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +       *skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return Whether the compactMetadata field is set. + */ + @java.lang.Override + public boolean hasCompactMetadata() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + *
    +       ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +       *skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return The compactMetadata. + */ + @java.lang.Override + public boolean getCompactMetadata() { + return compactMetadata_; + } + /** + *
    +       ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +       *skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @param value The compactMetadata to set. + * @return This builder for chaining. + */ + public Builder setCompactMetadata(boolean value) { + bitField0_ |= 0x00000008; + compactMetadata_ = value; + onChanged(); + return this; + } + /** + *
    +       ** send only type information for @ref Mysqlx::Resultset::ColumnMetaData,
    +       *skipping names and others 
    +       * 
    + * + * optional bool compact_metadata = 4 [default = false]; + * @return This builder for chaining. + */ + public Builder clearCompactMetadata() { + bitField0_ = (bitField0_ & ~0x00000008); + compactMetadata_ = false; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Sql.StmtExecute) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Sql.StmtExecute) + private static final com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public StmtExecute parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new StmtExecute(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface StmtExecuteOkOrBuilder extends + // @@protoc_insertion_point(interface_extends:Mysqlx.Sql.StmtExecuteOk) + com.google.protobuf.MessageOrBuilder { + } + /** + *
    +   **
    +   *Statement executed successfully
    +   * 
    + * + * Protobuf type {@code Mysqlx.Sql.StmtExecuteOk} + */ + public static final class StmtExecuteOk extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:Mysqlx.Sql.StmtExecuteOk) + StmtExecuteOkOrBuilder { + private static final long serialVersionUID = 0L; + // Use StmtExecuteOk.newBuilder() to construct. + private StmtExecuteOk(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private StmtExecuteOk() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new StmtExecuteOk(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private StmtExecuteOk( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField( + input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecuteOk_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.class, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.Builder.class); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + unknownFields.writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += unknownFields.getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk)) { + return super.equals(obj); + } + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk other = (com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk) obj; + + if (!unknownFields.equals(other.unknownFields)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
    +     **
    +     *Statement executed successfully
    +     * 
    + * + * Protobuf type {@code Mysqlx.Sql.StmtExecuteOk} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:Mysqlx.Sql.StmtExecuteOk) + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOkOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecuteOk_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.class, com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.Builder.class); + } + + // Construct using com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3 + .alwaysUseFieldBuilders) { + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.mysql.cj.x.protobuf.MysqlxSql.internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk getDefaultInstanceForType() { + return com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.getDefaultInstance(); + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk build() { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk buildPartial() { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk result = new com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk) { + return mergeFrom((com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk other) { + if (other == com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk.getDefaultInstance()) return this; + this.mergeUnknownFields(other.unknownFields); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk) e.getUnfinishedMessage(); + throw e.unwrapIOException(); + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:Mysqlx.Sql.StmtExecuteOk) + } + + // @@protoc_insertion_point(class_scope:Mysqlx.Sql.StmtExecuteOk) + private static final com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk(); + } + + public static com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public StmtExecuteOk parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new StmtExecuteOk(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.mysql.cj.x.protobuf.MysqlxSql.StmtExecuteOk getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Sql_StmtExecute_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Sql_StmtExecute_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_Mysqlx_Sql_StmtExecuteOk_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\020mysqlx_sql.proto\022\nMysqlx.Sql\032\014mysqlx.p" + + "roto\032\026mysqlx_datatypes.proto\"\177\n\013StmtExec" + + "ute\022\026\n\tnamespace\030\003 \001(\t:\003sql\022\014\n\004stmt\030\001 \002(" + + "\014\022#\n\004args\030\002 \003(\0132\025.Mysqlx.Datatypes.Any\022\037" + + "\n\020compact_metadata\030\004 \001(\010:\005false:\004\210\3520\014\"\025\n" + + "\rStmtExecuteOk:\004\220\3520\021B\031\n\027com.mysql.cj.x.p" + + "rotobuf" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(), + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(), + }); + internal_static_Mysqlx_Sql_StmtExecute_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_Mysqlx_Sql_StmtExecute_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Sql_StmtExecute_descriptor, + new java.lang.String[] { "Namespace", "Stmt", "Args", "CompactMetadata", }); + internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_Mysqlx_Sql_StmtExecuteOk_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_Mysqlx_Sql_StmtExecuteOk_descriptor, + new java.lang.String[] { }); + com.google.protobuf.ExtensionRegistry registry = + com.google.protobuf.ExtensionRegistry.newInstance(); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.clientMessageId); + registry.add(com.mysql.cj.x.protobuf.Mysqlx.serverMessageId); + com.google.protobuf.Descriptors.FileDescriptor + .internalUpdateFileDescriptor(descriptor, registry); + com.mysql.cj.x.protobuf.Mysqlx.getDescriptor(); + com.mysql.cj.x.protobuf.MysqlxDatatypes.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/package-info.java b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/package-info.java new file mode 100644 index 0000000..1d6234c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/generated/java/com/mysql/cj/x/protobuf/package-info.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * Message classes used for serialization with Google Protocol Buffers to support the X Protocol. Classes are generated using protoc like so: + * + *
    + * protoc --java_out=PATH/src/generated/java --proto_path=PATH_TO_IMPORTS -I=PATH_TO_MYSQL_REPO/rapid/plugin/x/protocol PATH_TO_MYSQL_REPO/rapid/plugin/x/protocol/*.proto
    + * 
    + * + * @since 6.0 + */ + +package com.mysql.cj.x.protobuf; diff --git a/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/Driver.java b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/Driver.java new file mode 100644 index 0000000..992504e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/Driver.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.jdbc; + +import java.sql.SQLException; + +/** + * Backwards compatibility to support apps that call Class.forName("com.mysql.jdbc.Driver");. + */ +public class Driver extends com.mysql.cj.jdbc.Driver { + public Driver() throws SQLException { + super(); + } + + static { + System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. " + + "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary."); + } +} diff --git a/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactory.java b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactory.java new file mode 100644 index 0000000..c768929 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactory.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.jdbc; + +import java.io.IOException; +import java.net.Socket; +import java.net.SocketException; +import java.util.Properties; + +/** + * Interface to allow pluggable socket creation in the driver + * + * @deprecated Use {@link com.mysql.cj.protocol.SocketFactory} instead. + */ +@Deprecated +public interface SocketFactory { + + /** + * Called by the driver after issuing the MySQL protocol handshake and + * reading the results of the handshake. + * + * @throws SocketException + * if a socket error occurs + * @throws IOException + * if an I/O error occurs + * + * @return the socket to use after the handshake + */ + Socket afterHandshake() throws SocketException, IOException; + + /** + * Called by the driver before issuing the MySQL protocol handshake. Should + * return the socket instance that should be used during the handshake. + * + * @throws SocketException + * if a socket error occurs + * @throws IOException + * if an I/O error occurs + * + * @return the socket to use before the handshake + */ + Socket beforeHandshake() throws SocketException, IOException; + + /** + * Creates a new socket using the given properties. Properties are parsed by + * the driver from the URL. All properties other than sensitive ones (user + * and password) are passed to this method. The driver will instantiate the + * socket factory with the class name given in the property + * "socketFactory", where the standard is com.mysql.jdbc.StandardSocketFactory Implementing classes + * are responsible for handling synchronization of this method (if needed). + * + * @param host + * the hostname passed in the JDBC URL. It will be a single + * hostname, as the driver parses multi-hosts (for failover) and + * calls this method for each host connection attempt. + * + * @param portNumber + * the port number to connect to (if required). + * + * @param props + * properties passed to the driver via the URL and/or properties + * instance. + * + * @return a socket connected to the given host + * @throws SocketException + * if a socket error occurs + * @throws IOException + * if an I/O error occurs + */ + Socket connect(String host, int portNumber, Properties props) throws SocketException, IOException; +} diff --git a/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactoryWrapper.java b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactoryWrapper.java new file mode 100644 index 0000000..72e3d38 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/legacy/java/com/mysql/jdbc/SocketFactoryWrapper.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.jdbc; + +import java.io.Closeable; +import java.io.IOException; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.log.Log; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.protocol.SocketConnection; +import com.mysql.cj.protocol.SocketFactory; +import com.mysql.cj.protocol.StandardSocketFactory; + +/** + * Wraps the legacy com.mysql.jdbc.SocketFactory implementations so they can be used as {@link SocketFactory} + */ +public class SocketFactoryWrapper extends StandardSocketFactory implements SocketFactory { + + @SuppressWarnings("deprecation") + com.mysql.jdbc.SocketFactory socketFactory; + + @SuppressWarnings("deprecation") + public SocketFactoryWrapper(Object legacyFactory) { + this.socketFactory = (com.mysql.jdbc.SocketFactory) legacyFactory; + } + + @SuppressWarnings({ "deprecation", "unchecked" }) + @Override + public T connect(String hostname, int portNumber, PropertySet pset, int loginTimeout) throws IOException { + this.rawSocket = this.socketFactory.connect(hostname, portNumber, pset.exposeAsProperties()); + return (T) this.rawSocket; + } + + @SuppressWarnings("unchecked") + @Override + public T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession, Log log) throws IOException { + return (T) super.performTlsHandshake(socketConnection, serverSession, log); + } + + @SuppressWarnings("deprecation") + @Override + public void beforeHandshake() throws IOException { + this.socketFactory.beforeHandshake(); + } + + @SuppressWarnings("deprecation") + @Override + public void afterHandshake() throws IOException { + this.socketFactory.afterHandshake(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/BindValue.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/BindValue.java new file mode 100644 index 0000000..1d8660f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/BindValue.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Calendar; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.mysql.cj.protocol.Message; +import com.mysql.cj.result.Field; + +public interface BindValue { + + BindValue clone(); + + void reset(); + + boolean isNull(); + + void setNull(boolean isNull); + + boolean isStream(); + + MysqlType getMysqlType(); + + void setMysqlType(MysqlType type); + + byte[] getByteValue(); + + boolean isSet(); + + void setBinding(Object obj, MysqlType type, int numberOfExecutions, AtomicBoolean sendTypesToServer); + + Calendar getCalendar(); + + void setCalendar(Calendar cal); + + boolean escapeBytesIfNeeded(); + + void setEscapeBytesIfNeeded(boolean val); + + Object getValue(); + + boolean isNational(); + + void setIsNational(boolean isNational); + + int getFieldType(); + + /** + * Gets the length of this bind value in the text protocol representation. + * + * @return + * the expected length, in bytes, of this bind value after being encoded. + */ + long getTextLength(); + + /** + * Gets the length of this bind value in the binary protocol representation. + * + * @return + * the expected length, in bytes, of this bind value after being encoded. + */ + long getBinaryLength(); + + long getBoundBeforeExecutionNum(); + + /** + * Get a String representation of the value. + * + * @return value as a String + */ + String getString(); + + Field getField(); + + void setField(Field field); + + boolean keepOrigNanos(); + + /** + * Should the value keep original fractional seconds ignoring sendFractionalSeconds and sendFractionalSecondsForTime? + *

    + * If the value is a part of key for UpdatableResultSet updater, it should keep original milliseconds. + *

    + * + * @param value + */ + void setKeepOrigNanos(boolean value); + + void setScaleOrLength(long scaleOrLength); + + long getScaleOrLength(); + + /** + * Gets the name of this query attribute. + * + * @return + * the name of this query attribute. + */ + String getName(); + + void setName(String name); + + void writeAsText(Message intoMessage); + + void writeAsBinary(Message intoMessage); + + void writeAsQueryAttribute(Message intoMessage); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapter.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapter.java new file mode 100644 index 0000000..80148fc --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapter.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2012, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Set; + +public interface CacheAdapter { + V get(K key); + + void put(K key, V value); + + void invalidate(K key); + + void invalidateAll(Set keys); + + void invalidateAll(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapterFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapterFactory.java new file mode 100644 index 0000000..4604852 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CacheAdapterFactory.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2012, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface CacheAdapterFactory { + + CacheAdapter getInstance(Object syncMutex, String url, int cacheMaxSize, int maxKeySize); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CancelQueryTask.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CancelQueryTask.java new file mode 100644 index 0000000..d8456ee --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CancelQueryTask.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface CancelQueryTask { + + boolean cancel(); + + Throwable getCaughtWhileCancelling(); + + void setCaughtWhileCancelling(Throwable caughtWhileCancelling); + + Query getQueryToCancel(); + + void setQueryToCancel(Query queryToCancel); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetMapping.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetMapping.java new file mode 100644 index 0000000..9802287 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetMapping.java @@ -0,0 +1,820 @@ +/* + * Copyright (c) 2002, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +/** + * Mapping between MySQL charset names and Java charset names. I've investigated placing these in a .properties file, but unfortunately under most appservers + * this complicates configuration because the security policy needs to be changed by the user to allow the driver to read them :( + */ +public class CharsetMapping { + + public static final int MAP_SIZE = 1024; // Size of static maps + private static final String[] COLLATION_INDEX_TO_COLLATION_NAME; + private static final Map COLLATION_INDEX_TO_CHARSET; + + private static final Map CHARSET_NAME_TO_CHARSET; + private static final Map CHARSET_NAME_TO_COLLATION_INDEX; + private static final Map COLLATION_NAME_TO_COLLATION_INDEX; + + private static final Map> JAVA_ENCODING_UC_TO_MYSQL_CHARSET; + + private static final Set MULTIBYTE_ENCODINGS; + + /** + * Indexes of collations using ucs2, utf16, utf16le or utf32 character sets and that cannot be set to character_set_client system variable. + */ + private static final Set IMPERMISSIBLE_INDEXES; + + public static final String MYSQL_CHARSET_NAME_armscii8 = "armscii8"; + public static final String MYSQL_CHARSET_NAME_ascii = "ascii"; + public static final String MYSQL_CHARSET_NAME_big5 = "big5"; + public static final String MYSQL_CHARSET_NAME_binary = "binary"; + public static final String MYSQL_CHARSET_NAME_cp1250 = "cp1250"; + public static final String MYSQL_CHARSET_NAME_cp1251 = "cp1251"; + public static final String MYSQL_CHARSET_NAME_cp1256 = "cp1256"; + public static final String MYSQL_CHARSET_NAME_cp1257 = "cp1257"; + public static final String MYSQL_CHARSET_NAME_cp850 = "cp850"; + public static final String MYSQL_CHARSET_NAME_cp852 = "cp852"; + public static final String MYSQL_CHARSET_NAME_cp866 = "cp866"; + public static final String MYSQL_CHARSET_NAME_cp932 = "cp932"; + public static final String MYSQL_CHARSET_NAME_dec8 = "dec8"; + public static final String MYSQL_CHARSET_NAME_eucjpms = "eucjpms"; + public static final String MYSQL_CHARSET_NAME_euckr = "euckr"; + public static final String MYSQL_CHARSET_NAME_gb18030 = "gb18030"; + public static final String MYSQL_CHARSET_NAME_gb2312 = "gb2312"; + public static final String MYSQL_CHARSET_NAME_gbk = "gbk"; + public static final String MYSQL_CHARSET_NAME_geostd8 = "geostd8"; + public static final String MYSQL_CHARSET_NAME_greek = "greek"; + public static final String MYSQL_CHARSET_NAME_hebrew = "hebrew"; + public static final String MYSQL_CHARSET_NAME_hp8 = "hp8"; + public static final String MYSQL_CHARSET_NAME_keybcs2 = "keybcs2"; + public static final String MYSQL_CHARSET_NAME_koi8r = "koi8r"; + public static final String MYSQL_CHARSET_NAME_koi8u = "koi8u"; + public static final String MYSQL_CHARSET_NAME_latin1 = "latin1"; + public static final String MYSQL_CHARSET_NAME_latin2 = "latin2"; + public static final String MYSQL_CHARSET_NAME_latin5 = "latin5"; + public static final String MYSQL_CHARSET_NAME_latin7 = "latin7"; + public static final String MYSQL_CHARSET_NAME_macce = "macce"; + public static final String MYSQL_CHARSET_NAME_macroman = "macroman"; + public static final String MYSQL_CHARSET_NAME_sjis = "sjis"; + public static final String MYSQL_CHARSET_NAME_swe7 = "swe7"; + public static final String MYSQL_CHARSET_NAME_tis620 = "tis620"; + public static final String MYSQL_CHARSET_NAME_ucs2 = "ucs2"; + public static final String MYSQL_CHARSET_NAME_ujis = "ujis"; + public static final String MYSQL_CHARSET_NAME_utf16 = "utf16"; + public static final String MYSQL_CHARSET_NAME_utf16le = "utf16le"; + public static final String MYSQL_CHARSET_NAME_utf32 = "utf32"; + public static final String MYSQL_CHARSET_NAME_utf8 = "utf8"; + public static final String MYSQL_CHARSET_NAME_utf8mb3 = "utf8mb3"; + public static final String MYSQL_CHARSET_NAME_utf8mb4 = "utf8mb4"; + + public static final int MYSQL_COLLATION_INDEX_utf8mb4_general_ci = 45; + public static final int MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci = 255; + public static final int MYSQL_COLLATION_INDEX_binary = 63; + + static { + // complete list of mysql character sets and their corresponding java encoding names + MysqlCharset[] charset = new MysqlCharset[] { new MysqlCharset(MYSQL_CHARSET_NAME_ascii, 1, 0, new String[] { "US-ASCII", "ASCII" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_big5, 2, 0, new String[] { "Big5" }), + new MysqlCharset(MYSQL_CHARSET_NAME_gbk, 2, 0, new String[] { "GBK" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_sjis, 2, 0, new String[] { "SHIFT_JIS", "Cp943", "WINDOWS-31J" }), // SJIS is alias for SHIFT_JIS, Cp943 is rather a cp932 but we map it to sjis for years + new MysqlCharset(MYSQL_CHARSET_NAME_cp932, 2, 1, new String[] { "WINDOWS-31J" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_gb2312, 2, 0, new String[] { "GB2312" }), + new MysqlCharset(MYSQL_CHARSET_NAME_ujis, 3, 0, new String[] { "EUC_JP" }), + new MysqlCharset(MYSQL_CHARSET_NAME_eucjpms, 3, 0, new String[] { "EUC_JP_Solaris" }, new ServerVersion(5, 0, 3)), + + new MysqlCharset(MYSQL_CHARSET_NAME_gb18030, 4, 0, new String[] { "GB18030" }, new ServerVersion(5, 7, 4)), + + new MysqlCharset(MYSQL_CHARSET_NAME_euckr, 2, 0, new String[] { "EUC-KR" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_latin1, 1, 1, new String[] { "Cp1252", "ISO8859_1" }), + new MysqlCharset(MYSQL_CHARSET_NAME_swe7, 1, 0, new String[] { "Cp1252" }), + new MysqlCharset(MYSQL_CHARSET_NAME_hp8, 1, 0, new String[] { "Cp1252" }), + new MysqlCharset(MYSQL_CHARSET_NAME_dec8, 1, 0, new String[] { "Cp1252" }), + new MysqlCharset(MYSQL_CHARSET_NAME_armscii8, 1, 0, new String[] { "Cp1252" }), + new MysqlCharset(MYSQL_CHARSET_NAME_geostd8, 1, 0, new String[] { "Cp1252" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_latin2, 1, 0, new String[] { "ISO8859_2" }), + new MysqlCharset(MYSQL_CHARSET_NAME_greek, 1, 0, new String[] { "ISO8859_7", "greek" }), + new MysqlCharset(MYSQL_CHARSET_NAME_latin7, 1, 0, new String[] { "ISO-8859-13" }), + new MysqlCharset(MYSQL_CHARSET_NAME_hebrew, 1, 0, new String[] { "ISO8859_8" }), + new MysqlCharset(MYSQL_CHARSET_NAME_latin5, 1, 0, new String[] { "ISO8859_9" }), + new MysqlCharset(MYSQL_CHARSET_NAME_cp850, 1, 0, new String[] { "Cp850", "Cp437" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_cp852, 1, 0, new String[] { "Cp852" }), + new MysqlCharset(MYSQL_CHARSET_NAME_keybcs2, 1, 0, new String[] { "Cp852" }), // Kamenicky encoding usually known as Cp895 but there is no official cp895 specification; close to Cp852, see http://ftp.muni.cz/pub/localization/charsets/cs-encodings-faq + + new MysqlCharset(MYSQL_CHARSET_NAME_cp866, 1, 0, new String[] { "Cp866" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_koi8r, 1, 1, new String[] { "KOI8_R" }), + new MysqlCharset(MYSQL_CHARSET_NAME_koi8u, 1, 0, new String[] { "KOI8_R" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_tis620, 1, 0, new String[] { "TIS620" }), + new MysqlCharset(MYSQL_CHARSET_NAME_cp1250, 1, 0, new String[] { "Cp1250" }), + new MysqlCharset(MYSQL_CHARSET_NAME_cp1251, 1, 1, new String[] { "Cp1251" }), + new MysqlCharset(MYSQL_CHARSET_NAME_cp1256, 1, 0, new String[] { "Cp1256" }), + new MysqlCharset(MYSQL_CHARSET_NAME_cp1257, 1, 0, new String[] { "Cp1257" }), + new MysqlCharset(MYSQL_CHARSET_NAME_macroman, 1, 0, new String[] { "MacRoman" }), + new MysqlCharset(MYSQL_CHARSET_NAME_macce, 1, 0, new String[] { "MacCentralEurope" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_utf8mb3, 3, 0, new String[] { "UTF-8" }, new String[] { MYSQL_CHARSET_NAME_utf8 }), + new MysqlCharset(MYSQL_CHARSET_NAME_utf8mb4, 4, 1, new String[] { "UTF-8" }), // "UTF-8 = *> 5.5.2 utf8mb4" + + new MysqlCharset(MYSQL_CHARSET_NAME_binary, 1, 1, new String[] { "ISO8859_1" }), + + new MysqlCharset(MYSQL_CHARSET_NAME_ucs2, 2, 0, new String[] { "UnicodeBig" }), + new MysqlCharset(MYSQL_CHARSET_NAME_utf16, 4, 0, new String[] { "UTF-16" }), + new MysqlCharset(MYSQL_CHARSET_NAME_utf16le, 4, 0, new String[] { "UTF-16LE" }), + new MysqlCharset(MYSQL_CHARSET_NAME_utf32, 4, 0, new String[] { "UTF-32" }) + + }; + HashMap charsetNameToMysqlCharsetMap = new HashMap<>(); + HashMap> javaUcToMysqlCharsetMap = new HashMap<>(); + Set tempMultibyteEncodings = new HashSet<>(); + + for (int i = 0; i < charset.length; i++) { + String charsetName = charset[i].charsetName; + charsetNameToMysqlCharsetMap.put(charsetName, charset[i]); + for (String alias : charset[i].aliases) { + charsetNameToMysqlCharsetMap.put(alias, charset[i]); + } + + for (String encUC : charset[i].javaEncodingsUc) { + List charsets = javaUcToMysqlCharsetMap.get(encUC); + if (charsets == null) { + charsets = new ArrayList<>(); + javaUcToMysqlCharsetMap.put(encUC, charsets); + } + charsets.add(charset[i]); + + if (charset[i].mblen > 1) { + tempMultibyteEncodings.add(encUC); + } + } + } + CHARSET_NAME_TO_CHARSET = Collections.unmodifiableMap(charsetNameToMysqlCharsetMap); + JAVA_ENCODING_UC_TO_MYSQL_CHARSET = Collections.unmodifiableMap(javaUcToMysqlCharsetMap); + MULTIBYTE_ENCODINGS = Collections.unmodifiableSet(tempMultibyteEncodings); + + // Complete list of MySQL collations and their corresponding character set. + // Collations may have different default names in different MySQL versions, while the remaining are accepted as aliases. + Collation[] collation = new Collation[MAP_SIZE]; + collation[1] = new Collation(1, "big5_chinese_ci", 1, MYSQL_CHARSET_NAME_big5); + collation[2] = new Collation(2, "latin2_czech_cs", 0, MYSQL_CHARSET_NAME_latin2); + collation[3] = new Collation(3, "dec8_swedish_ci", 0, MYSQL_CHARSET_NAME_dec8); + collation[4] = new Collation(4, "cp850_general_ci", 1, MYSQL_CHARSET_NAME_cp850); + collation[5] = new Collation(5, "latin1_german1_ci", 0, MYSQL_CHARSET_NAME_latin1); + collation[6] = new Collation(6, "hp8_english_ci", 0, MYSQL_CHARSET_NAME_hp8); + collation[7] = new Collation(7, "koi8r_general_ci", 0, MYSQL_CHARSET_NAME_koi8r); + collation[8] = new Collation(8, "latin1_swedish_ci", 1, MYSQL_CHARSET_NAME_latin1); + collation[9] = new Collation(9, "latin2_general_ci", 1, MYSQL_CHARSET_NAME_latin2); + collation[10] = new Collation(10, "swe7_swedish_ci", 0, MYSQL_CHARSET_NAME_swe7); + collation[11] = new Collation(11, "ascii_general_ci", 0, MYSQL_CHARSET_NAME_ascii); + collation[12] = new Collation(12, "ujis_japanese_ci", 0, MYSQL_CHARSET_NAME_ujis); + collation[13] = new Collation(13, "sjis_japanese_ci", 0, MYSQL_CHARSET_NAME_sjis); + collation[14] = new Collation(14, "cp1251_bulgarian_ci", 0, MYSQL_CHARSET_NAME_cp1251); + collation[15] = new Collation(15, "latin1_danish_ci", 0, MYSQL_CHARSET_NAME_latin1); + collation[16] = new Collation(16, "hebrew_general_ci", 0, MYSQL_CHARSET_NAME_hebrew); + // 17 + collation[18] = new Collation(18, "tis620_thai_ci", 0, MYSQL_CHARSET_NAME_tis620); + collation[19] = new Collation(19, "euckr_korean_ci", 0, MYSQL_CHARSET_NAME_euckr); + collation[20] = new Collation(20, "latin7_estonian_cs", 0, MYSQL_CHARSET_NAME_latin7); + collation[21] = new Collation(21, "latin2_hungarian_ci", 0, MYSQL_CHARSET_NAME_latin2); + collation[22] = new Collation(22, "koi8u_general_ci", 0, MYSQL_CHARSET_NAME_koi8u); + collation[23] = new Collation(23, "cp1251_ukrainian_ci", 0, MYSQL_CHARSET_NAME_cp1251); + collation[24] = new Collation(24, "gb2312_chinese_ci", 0, MYSQL_CHARSET_NAME_gb2312); + collation[25] = new Collation(25, "greek_general_ci", 0, MYSQL_CHARSET_NAME_greek); + collation[26] = new Collation(26, "cp1250_general_ci", 1, MYSQL_CHARSET_NAME_cp1250); + collation[27] = new Collation(27, "latin2_croatian_ci", 0, MYSQL_CHARSET_NAME_latin2); + collation[28] = new Collation(28, "gbk_chinese_ci", 1, MYSQL_CHARSET_NAME_gbk); + collation[29] = new Collation(29, "cp1257_lithuanian_ci", 0, MYSQL_CHARSET_NAME_cp1257); + collation[30] = new Collation(30, "latin5_turkish_ci", 1, MYSQL_CHARSET_NAME_latin5); + collation[31] = new Collation(31, "latin1_german2_ci", 0, MYSQL_CHARSET_NAME_latin1); + collation[32] = new Collation(32, "armscii8_general_ci", 0, MYSQL_CHARSET_NAME_armscii8); + collation[33] = new Collation(33, new String[] { "utf8mb3_general_ci", "utf8_general_ci" }, 1, MYSQL_CHARSET_NAME_utf8mb3); + collation[34] = new Collation(34, "cp1250_czech_cs", 0, MYSQL_CHARSET_NAME_cp1250); + collation[35] = new Collation(35, "ucs2_general_ci", 1, MYSQL_CHARSET_NAME_ucs2); + collation[36] = new Collation(36, "cp866_general_ci", 1, MYSQL_CHARSET_NAME_cp866); + collation[37] = new Collation(37, "keybcs2_general_ci", 1, MYSQL_CHARSET_NAME_keybcs2); + collation[38] = new Collation(38, "macce_general_ci", 1, MYSQL_CHARSET_NAME_macce); + collation[39] = new Collation(39, "macroman_general_ci", 1, MYSQL_CHARSET_NAME_macroman); + collation[40] = new Collation(40, "cp852_general_ci", 1, MYSQL_CHARSET_NAME_cp852); + collation[41] = new Collation(41, "latin7_general_ci", 1, MYSQL_CHARSET_NAME_latin7); + collation[42] = new Collation(42, "latin7_general_cs", 0, MYSQL_CHARSET_NAME_latin7); + collation[43] = new Collation(43, "macce_bin", 0, MYSQL_CHARSET_NAME_macce); + collation[44] = new Collation(44, "cp1250_croatian_ci", 0, MYSQL_CHARSET_NAME_cp1250); + collation[45] = new Collation(45, "utf8mb4_general_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[46] = new Collation(46, "utf8mb4_bin", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[47] = new Collation(47, "latin1_bin", 0, MYSQL_CHARSET_NAME_latin1); + collation[48] = new Collation(48, "latin1_general_ci", 0, MYSQL_CHARSET_NAME_latin1); + collation[49] = new Collation(49, "latin1_general_cs", 0, MYSQL_CHARSET_NAME_latin1); + collation[50] = new Collation(50, "cp1251_bin", 0, MYSQL_CHARSET_NAME_cp1251); + collation[51] = new Collation(51, "cp1251_general_ci", 1, MYSQL_CHARSET_NAME_cp1251); + collation[52] = new Collation(52, "cp1251_general_cs", 0, MYSQL_CHARSET_NAME_cp1251); + collation[53] = new Collation(53, "macroman_bin", 0, MYSQL_CHARSET_NAME_macroman); + collation[54] = new Collation(54, "utf16_general_ci", 1, MYSQL_CHARSET_NAME_utf16); + collation[55] = new Collation(55, "utf16_bin", 0, MYSQL_CHARSET_NAME_utf16); + collation[56] = new Collation(56, "utf16le_general_ci", 1, MYSQL_CHARSET_NAME_utf16le); + collation[57] = new Collation(57, "cp1256_general_ci", 1, MYSQL_CHARSET_NAME_cp1256); + collation[58] = new Collation(58, "cp1257_bin", 0, MYSQL_CHARSET_NAME_cp1257); + collation[59] = new Collation(59, "cp1257_general_ci", 1, MYSQL_CHARSET_NAME_cp1257); + collation[60] = new Collation(60, "utf32_general_ci", 1, MYSQL_CHARSET_NAME_utf32); + collation[61] = new Collation(61, "utf32_bin", 0, MYSQL_CHARSET_NAME_utf32); + collation[62] = new Collation(62, "utf16le_bin", 0, MYSQL_CHARSET_NAME_utf16le); + collation[63] = new Collation(63, "binary", 1, MYSQL_CHARSET_NAME_binary); + collation[64] = new Collation(64, "armscii8_bin", 0, MYSQL_CHARSET_NAME_armscii8); + collation[65] = new Collation(65, "ascii_bin", 0, MYSQL_CHARSET_NAME_ascii); + collation[66] = new Collation(66, "cp1250_bin", 0, MYSQL_CHARSET_NAME_cp1250); + collation[67] = new Collation(67, "cp1256_bin", 0, MYSQL_CHARSET_NAME_cp1256); + collation[68] = new Collation(68, "cp866_bin", 0, MYSQL_CHARSET_NAME_cp866); + collation[69] = new Collation(69, "dec8_bin", 0, MYSQL_CHARSET_NAME_dec8); + collation[70] = new Collation(70, "greek_bin", 0, MYSQL_CHARSET_NAME_greek); + collation[71] = new Collation(71, "hebrew_bin", 0, MYSQL_CHARSET_NAME_hebrew); + collation[72] = new Collation(72, "hp8_bin", 0, MYSQL_CHARSET_NAME_hp8); + collation[73] = new Collation(73, "keybcs2_bin", 0, MYSQL_CHARSET_NAME_keybcs2); + collation[74] = new Collation(74, "koi8r_bin", 0, MYSQL_CHARSET_NAME_koi8r); + collation[75] = new Collation(75, "koi8u_bin", 0, MYSQL_CHARSET_NAME_koi8u); + collation[76] = new Collation(76, new String[] { "utf8mb3_tolower_ci", "utf8_tolower_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[77] = new Collation(77, "latin2_bin", 0, MYSQL_CHARSET_NAME_latin2); + collation[78] = new Collation(78, "latin5_bin", 0, MYSQL_CHARSET_NAME_latin5); + collation[79] = new Collation(79, "latin7_bin", 0, MYSQL_CHARSET_NAME_latin7); + collation[80] = new Collation(80, "cp850_bin", 0, MYSQL_CHARSET_NAME_cp850); + collation[81] = new Collation(81, "cp852_bin", 0, MYSQL_CHARSET_NAME_cp852); + collation[82] = new Collation(82, "swe7_bin", 0, MYSQL_CHARSET_NAME_swe7); + collation[83] = new Collation(83, new String[] { "utf8mb3_bin", "utf8_bin" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[84] = new Collation(84, "big5_bin", 0, MYSQL_CHARSET_NAME_big5); + collation[85] = new Collation(85, "euckr_bin", 0, MYSQL_CHARSET_NAME_euckr); + collation[86] = new Collation(86, "gb2312_bin", 0, MYSQL_CHARSET_NAME_gb2312); + collation[87] = new Collation(87, "gbk_bin", 0, MYSQL_CHARSET_NAME_gbk); + collation[88] = new Collation(88, "sjis_bin", 0, MYSQL_CHARSET_NAME_sjis); + collation[89] = new Collation(89, "tis620_bin", 0, MYSQL_CHARSET_NAME_tis620); + collation[90] = new Collation(90, "ucs2_bin", 0, MYSQL_CHARSET_NAME_ucs2); + collation[91] = new Collation(91, "ujis_bin", 0, MYSQL_CHARSET_NAME_ujis); + collation[92] = new Collation(92, "geostd8_general_ci", 0, MYSQL_CHARSET_NAME_geostd8); + collation[93] = new Collation(93, "geostd8_bin", 0, MYSQL_CHARSET_NAME_geostd8); + collation[94] = new Collation(94, "latin1_spanish_ci", 0, MYSQL_CHARSET_NAME_latin1); + collation[95] = new Collation(95, "cp932_japanese_ci", 1, MYSQL_CHARSET_NAME_cp932); + collation[96] = new Collation(96, "cp932_bin", 0, MYSQL_CHARSET_NAME_cp932); + collation[97] = new Collation(97, "eucjpms_japanese_ci", 1, MYSQL_CHARSET_NAME_eucjpms); + collation[98] = new Collation(98, "eucjpms_bin", 0, MYSQL_CHARSET_NAME_eucjpms); + collation[99] = new Collation(99, "cp1250_polish_ci", 0, MYSQL_CHARSET_NAME_cp1250); + // 100 + collation[101] = new Collation(101, "utf16_unicode_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[102] = new Collation(102, "utf16_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[103] = new Collation(103, "utf16_latvian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[104] = new Collation(104, "utf16_romanian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[105] = new Collation(105, "utf16_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[106] = new Collation(106, "utf16_polish_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[107] = new Collation(107, "utf16_estonian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[108] = new Collation(108, "utf16_spanish_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[109] = new Collation(109, "utf16_swedish_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[110] = new Collation(110, "utf16_turkish_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[111] = new Collation(111, "utf16_czech_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[112] = new Collation(112, "utf16_danish_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[113] = new Collation(113, "utf16_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[114] = new Collation(114, "utf16_slovak_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[115] = new Collation(115, "utf16_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[116] = new Collation(116, "utf16_roman_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[117] = new Collation(117, "utf16_persian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[118] = new Collation(118, "utf16_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[119] = new Collation(119, "utf16_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[120] = new Collation(120, "utf16_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[121] = new Collation(121, "utf16_german2_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[122] = new Collation(122, "utf16_croatian_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[123] = new Collation(123, "utf16_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf16); + collation[124] = new Collation(124, "utf16_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf16); + // 125..127 + collation[128] = new Collation(128, "ucs2_unicode_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[129] = new Collation(129, "ucs2_icelandic_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[130] = new Collation(130, "ucs2_latvian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[131] = new Collation(131, "ucs2_romanian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[132] = new Collation(132, "ucs2_slovenian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[133] = new Collation(133, "ucs2_polish_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[134] = new Collation(134, "ucs2_estonian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[135] = new Collation(135, "ucs2_spanish_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[136] = new Collation(136, "ucs2_swedish_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[137] = new Collation(137, "ucs2_turkish_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[138] = new Collation(138, "ucs2_czech_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[139] = new Collation(139, "ucs2_danish_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[140] = new Collation(140, "ucs2_lithuanian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[141] = new Collation(141, "ucs2_slovak_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[142] = new Collation(142, "ucs2_spanish2_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[143] = new Collation(143, "ucs2_roman_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[144] = new Collation(144, "ucs2_persian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[145] = new Collation(145, "ucs2_esperanto_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[146] = new Collation(146, "ucs2_hungarian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[147] = new Collation(147, "ucs2_sinhala_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[148] = new Collation(148, "ucs2_german2_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[149] = new Collation(149, "ucs2_croatian_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[150] = new Collation(150, "ucs2_unicode_520_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[151] = new Collation(151, "ucs2_vietnamese_ci", 0, MYSQL_CHARSET_NAME_ucs2); + // 152..158 + collation[159] = new Collation(159, "ucs2_general_mysql500_ci", 0, MYSQL_CHARSET_NAME_ucs2); + collation[160] = new Collation(160, "utf32_unicode_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[161] = new Collation(161, "utf32_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[162] = new Collation(162, "utf32_latvian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[163] = new Collation(163, "utf32_romanian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[164] = new Collation(164, "utf32_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[165] = new Collation(165, "utf32_polish_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[166] = new Collation(166, "utf32_estonian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[167] = new Collation(167, "utf32_spanish_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[168] = new Collation(168, "utf32_swedish_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[169] = new Collation(169, "utf32_turkish_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[170] = new Collation(170, "utf32_czech_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[171] = new Collation(171, "utf32_danish_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[172] = new Collation(172, "utf32_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[173] = new Collation(173, "utf32_slovak_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[174] = new Collation(174, "utf32_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[175] = new Collation(175, "utf32_roman_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[176] = new Collation(176, "utf32_persian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[177] = new Collation(177, "utf32_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[178] = new Collation(178, "utf32_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[179] = new Collation(179, "utf32_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[180] = new Collation(180, "utf32_german2_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[181] = new Collation(181, "utf32_croatian_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[182] = new Collation(182, "utf32_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf32); + collation[183] = new Collation(183, "utf32_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf32); + // 184..191 + collation[192] = new Collation(192, new String[] { "utf8mb3_unicode_ci", "utf8_unicode_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[193] = new Collation(193, new String[] { "utf8mb3_icelandic_ci", "utf8_icelandic_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[194] = new Collation(194, new String[] { "utf8mb3_latvian_ci", "utf8_latvian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[195] = new Collation(195, new String[] { "utf8mb3_romanian_ci", "utf8_romanian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[196] = new Collation(196, new String[] { "utf8mb3_slovenian_ci", "utf8_slovenian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[197] = new Collation(197, new String[] { "utf8mb3_polish_ci", "utf8_polish_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[198] = new Collation(198, new String[] { "utf8mb3_estonian_ci", "utf8_estonian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[199] = new Collation(199, new String[] { "utf8mb3_spanish_ci", "utf8_spanish_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[200] = new Collation(200, new String[] { "utf8mb3_swedish_ci", "utf8_swedish_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[201] = new Collation(201, new String[] { "utf8mb3_turkish_ci", "utf8_turkish_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[202] = new Collation(202, new String[] { "utf8mb3_czech_ci", "utf8_czech_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[203] = new Collation(203, new String[] { "utf8mb3_danish_ci", "utf8_danish_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[204] = new Collation(204, new String[] { "utf8mb3_lithuanian_ci", "utf8_lithuanian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[205] = new Collation(205, new String[] { "utf8mb3_slovak_ci", "utf8_slovak_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[206] = new Collation(206, new String[] { "utf8mb3_spanish2_ci", "utf8_spanish2_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[207] = new Collation(207, new String[] { "utf8mb3_roman_ci", "utf8_roman_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[208] = new Collation(208, new String[] { "utf8mb3_persian_ci", "utf8_persian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[209] = new Collation(209, new String[] { "utf8mb3_esperanto_ci", "utf8_esperanto_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[210] = new Collation(210, new String[] { "utf8mb3_hungarian_ci", "utf8_hungarian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[211] = new Collation(211, new String[] { "utf8mb3_sinhala_ci", "utf8_sinhala_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[212] = new Collation(212, new String[] { "utf8mb3_german2_ci", "utf8_german2_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[213] = new Collation(213, new String[] { "utf8mb3_croatian_ci", "utf8_croatian_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[214] = new Collation(214, new String[] { "utf8mb3_unicode_520_ci", "utf8_unicode_520_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[215] = new Collation(215, new String[] { "utf8mb3_vietnamese_ci", "utf8_vietnamese_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + // 216..222 + collation[223] = new Collation(223, new String[] { "utf8mb3_general_mysql500_ci", "utf8_general_mysql500_ci" }, 0, MYSQL_CHARSET_NAME_utf8mb3); + collation[224] = new Collation(224, "utf8mb4_unicode_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[225] = new Collation(225, "utf8mb4_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[226] = new Collation(226, "utf8mb4_latvian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[227] = new Collation(227, "utf8mb4_romanian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[228] = new Collation(228, "utf8mb4_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[229] = new Collation(229, "utf8mb4_polish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[230] = new Collation(230, "utf8mb4_estonian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[231] = new Collation(231, "utf8mb4_spanish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[232] = new Collation(232, "utf8mb4_swedish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[233] = new Collation(233, "utf8mb4_turkish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[234] = new Collation(234, "utf8mb4_czech_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[235] = new Collation(235, "utf8mb4_danish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[236] = new Collation(236, "utf8mb4_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[237] = new Collation(237, "utf8mb4_slovak_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[238] = new Collation(238, "utf8mb4_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[239] = new Collation(239, "utf8mb4_roman_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[240] = new Collation(240, "utf8mb4_persian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[241] = new Collation(241, "utf8mb4_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[242] = new Collation(242, "utf8mb4_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[243] = new Collation(243, "utf8mb4_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[244] = new Collation(244, "utf8mb4_german2_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[245] = new Collation(245, "utf8mb4_croatian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[246] = new Collation(246, "utf8mb4_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[247] = new Collation(247, "utf8mb4_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[248] = new Collation(248, "gb18030_chinese_ci", 1, MYSQL_CHARSET_NAME_gb18030); + collation[249] = new Collation(249, "gb18030_bin", 0, MYSQL_CHARSET_NAME_gb18030); + collation[250] = new Collation(250, "gb18030_unicode_520_ci", 0, MYSQL_CHARSET_NAME_gb18030); + // 251..254 + collation[255] = new Collation(255, "utf8mb4_0900_ai_ci", 1, MYSQL_CHARSET_NAME_utf8mb4); + collation[256] = new Collation(256, "utf8mb4_de_pb_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[257] = new Collation(257, "utf8mb4_is_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[258] = new Collation(258, "utf8mb4_lv_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[259] = new Collation(259, "utf8mb4_ro_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[260] = new Collation(260, "utf8mb4_sl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[261] = new Collation(261, "utf8mb4_pl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[262] = new Collation(262, "utf8mb4_et_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[263] = new Collation(263, "utf8mb4_es_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[264] = new Collation(264, "utf8mb4_sv_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[265] = new Collation(265, "utf8mb4_tr_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[266] = new Collation(266, "utf8mb4_cs_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[267] = new Collation(267, "utf8mb4_da_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[268] = new Collation(268, "utf8mb4_lt_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[269] = new Collation(269, "utf8mb4_sk_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[270] = new Collation(270, "utf8mb4_es_trad_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[271] = new Collation(271, "utf8mb4_la_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + // 272 + collation[273] = new Collation(273, "utf8mb4_eo_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[274] = new Collation(274, "utf8mb4_hu_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[275] = new Collation(275, "utf8mb4_hr_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + // 276 + collation[277] = new Collation(277, "utf8mb4_vi_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[278] = new Collation(278, "utf8mb4_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[279] = new Collation(279, "utf8mb4_de_pb_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[280] = new Collation(280, "utf8mb4_is_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[281] = new Collation(281, "utf8mb4_lv_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[282] = new Collation(282, "utf8mb4_ro_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[283] = new Collation(283, "utf8mb4_sl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[284] = new Collation(284, "utf8mb4_pl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[285] = new Collation(285, "utf8mb4_et_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[286] = new Collation(286, "utf8mb4_es_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[287] = new Collation(287, "utf8mb4_sv_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[288] = new Collation(288, "utf8mb4_tr_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[289] = new Collation(289, "utf8mb4_cs_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[290] = new Collation(290, "utf8mb4_da_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[291] = new Collation(291, "utf8mb4_lt_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[292] = new Collation(292, "utf8mb4_sk_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[293] = new Collation(293, "utf8mb4_es_trad_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[294] = new Collation(294, "utf8mb4_la_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + // 295 + collation[296] = new Collation(296, "utf8mb4_eo_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[297] = new Collation(297, "utf8mb4_hu_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[298] = new Collation(298, "utf8mb4_hr_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + // 299 + collation[300] = new Collation(300, "utf8mb4_vi_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + // 301,302 + collation[303] = new Collation(303, "utf8mb4_ja_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[304] = new Collation(304, "utf8mb4_ja_0900_as_cs_ks", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[305] = new Collation(305, "utf8mb4_0900_as_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[306] = new Collation(306, "utf8mb4_ru_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[307] = new Collation(307, "utf8mb4_ru_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[308] = new Collation(308, "utf8mb4_zh_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[309] = new Collation(309, "utf8mb4_0900_bin", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[310] = new Collation(310, "utf8mb4_nb_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[311] = new Collation(311, "utf8mb4_nb_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[312] = new Collation(312, "utf8mb4_nn_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[313] = new Collation(313, "utf8mb4_nn_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[314] = new Collation(314, "utf8mb4_sr_latn_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[315] = new Collation(315, "utf8mb4_sr_latn_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[316] = new Collation(316, "utf8mb4_bs_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[317] = new Collation(317, "utf8mb4_bs_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[318] = new Collation(318, "utf8mb4_bg_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[319] = new Collation(319, "utf8mb4_bg_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[320] = new Collation(320, "utf8mb4_gl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[321] = new Collation(321, "utf8mb4_gl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[322] = new Collation(322, "utf8mb4_mn_cyrl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4); + collation[323] = new Collation(323, "utf8mb4_mn_cyrl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4); + + COLLATION_INDEX_TO_COLLATION_NAME = new String[MAP_SIZE]; + Map collationIndexToCharset = new TreeMap<>(); + Map charsetNameToCollationIndexMap = new TreeMap<>(); + Map charsetNameToCollationPriorityMap = new TreeMap<>(); + Map collationNameToCollationIndexMap = new TreeMap<>(); + Set impermissibleIndexes = new HashSet<>(); + + for (int i = 1; i < MAP_SIZE; i++) { + Collation coll = collation[i]; + if (coll != null) { + COLLATION_INDEX_TO_COLLATION_NAME[i] = coll.collationNames[0]; + collationIndexToCharset.put(i, coll.mysqlCharset); + for (String collationName : coll.collationNames) { + collationNameToCollationIndexMap.put(collationName, i); + } + String charsetName = coll.mysqlCharset.charsetName; + + if (!charsetNameToCollationIndexMap.containsKey(charsetName) || charsetNameToCollationPriorityMap.get(charsetName) < coll.priority) { + charsetNameToCollationIndexMap.put(charsetName, i); + charsetNameToCollationPriorityMap.put(charsetName, coll.priority); + } + + // Filling indexes of impermissible client character sets ucs2, utf16, utf16le, utf32 + if (charsetName.equals(MYSQL_CHARSET_NAME_ucs2) || charsetName.equals(MYSQL_CHARSET_NAME_utf16) + || charsetName.equals(MYSQL_CHARSET_NAME_utf16le) || charsetName.equals(MYSQL_CHARSET_NAME_utf32)) { + impermissibleIndexes.add(i); + } + } + } + + Integer idx; + for (MysqlCharset cs : charset) { + if (!cs.aliases.isEmpty() && (idx = charsetNameToCollationIndexMap.get(cs.charsetName)) != null) { + for (String alias : cs.aliases) { + charsetNameToCollationIndexMap.put(alias, idx); + } + } + } + + COLLATION_INDEX_TO_CHARSET = Collections.unmodifiableMap(collationIndexToCharset); + CHARSET_NAME_TO_COLLATION_INDEX = Collections.unmodifiableMap(charsetNameToCollationIndexMap); + COLLATION_NAME_TO_COLLATION_INDEX = Collections.unmodifiableMap(collationNameToCollationIndexMap); + IMPERMISSIBLE_INDEXES = Collections.unmodifiableSet(impermissibleIndexes); + + collation = null; + } + + protected static String getStaticMysqlCharsetForJavaEncoding(String javaEncoding, ServerVersion version) { + List mysqlCharsets = CharsetMapping.JAVA_ENCODING_UC_TO_MYSQL_CHARSET.get(javaEncoding.toUpperCase(Locale.ENGLISH)); + if (mysqlCharsets != null) { + if (version == null) { + return mysqlCharsets.get(0).charsetName; // Take the first one we get + } + MysqlCharset currentChoice = null; + for (MysqlCharset charset : mysqlCharsets) { + if (charset.isOkayForVersion(version) && (currentChoice == null || currentChoice.minimumVersion.compareTo(charset.minimumVersion) < 0 + || currentChoice.priority < charset.priority && currentChoice.minimumVersion.compareTo(charset.minimumVersion) == 0)) { + currentChoice = charset; + } + } + if (currentChoice != null) { + return currentChoice.charsetName; + } + } + return null; + } + + protected static int getStaticCollationIndexForJavaEncoding(String javaEncoding, ServerVersion version) { + String charsetName = getStaticMysqlCharsetForJavaEncoding(javaEncoding, version); + return getStaticCollationIndexForMysqlCharsetName(charsetName); + } + + protected static int getStaticCollationIndexForMysqlCharsetName(String charsetName) { + if (charsetName != null) { + Integer ci = CHARSET_NAME_TO_COLLATION_INDEX.get(charsetName); + if (ci != null) { + return ci.intValue(); + } + } + return 0; + } + + // TODO turn it to protected when com.mysql.cj.xdevapi.ColumnImpl can use dynamic maps + public static String getStaticMysqlCharsetNameForCollationIndex(Integer collationIndex) { + MysqlCharset charset = null; + if (collationIndex != null) { + charset = COLLATION_INDEX_TO_CHARSET.get(collationIndex); + } + return charset != null ? charset.charsetName : null; + } + + // TODO turn it to protected when com.mysql.cj.xdevapi.ColumnImpl can use dynamic maps + public static String getStaticCollationNameForCollationIndex(Integer collationIndex) { + if (collationIndex != null && collationIndex > 0 && collationIndex < MAP_SIZE) { + return COLLATION_INDEX_TO_COLLATION_NAME[collationIndex]; + } + return null; + } + + protected static Integer getStaticCollationIndexForCollationName(String collationName) { + return CharsetMapping.COLLATION_NAME_TO_COLLATION_INDEX.get(collationName); + } + + /** + * MySQL charset could map to several Java encodings. + * So here we choose the one according to next rules: + *
      + *
    • if there is no static mapping for this charset then return javaEncoding value as is because this + * could be a custom charset for example + *
    • if static mapping exists and javaEncoding equals to one of Java encoding canonical names or aliases available + * for this mapping then javaEncoding value as is; this is required when result should match to connection encoding, for example if connection encoding is + * Cp943 we must avoid getting SHIFT_JIS for sjis mysql charset + *
    • if static mapping exists and javaEncoding doesn't match any Java encoding canonical + * names or aliases available for this mapping then return default Java encoding (the first in mapping list) + *
    + * + * @param mysqlCharsetName + * MySQL charset name + * @param fallbackJavaEncoding + * fall-back java encoding name + * @return java encoding name + */ + protected static String getStaticJavaEncodingForMysqlCharset(String mysqlCharsetName, String fallbackJavaEncoding) { + MysqlCharset cs = getStaticMysqlCharsetByName(mysqlCharsetName); + return cs != null ? cs.getMatchingJavaEncoding(fallbackJavaEncoding) : fallbackJavaEncoding; + } + + protected static MysqlCharset getStaticMysqlCharsetByName(String mysqlCharsetName) { + return CHARSET_NAME_TO_CHARSET.get(mysqlCharsetName); + } + + protected static List getStaticMysqlCharsetAliasesByName(String mysqlCharsetName) { + MysqlCharset cs; + if ((cs = CHARSET_NAME_TO_CHARSET.get(mysqlCharsetName)) != null) { + return cs.aliases; + } + return null; + } + + protected static String getStaticJavaEncodingForMysqlCharset(String mysqlCharsetName) { + return getStaticJavaEncodingForMysqlCharset(mysqlCharsetName, null); + } + + protected static String getStaticJavaEncodingForCollationIndex(Integer collationIndex, String fallbackJavaEncoding) { + MysqlCharset charset = null; + if (collationIndex != null) { + charset = COLLATION_INDEX_TO_CHARSET.get(collationIndex); + } + return charset != null ? charset.getMatchingJavaEncoding(fallbackJavaEncoding) : fallbackJavaEncoding; + } + + // TODO turn it to protected when com.mysql.cj.protocol.x.FieldFactory can use dynamic maps + public static String getStaticJavaEncodingForCollationIndex(Integer collationIndex) { + return getStaticJavaEncodingForCollationIndex(collationIndex, null); + } + + /** + * Does the character set contain multi-byte encoded characters. + * + * @param javaEncodingName + * java encoding name + * @return true if the character set contains multi-byte encoded characters. + */ + protected static boolean isStaticMultibyteCharset(String javaEncodingName) { + return MULTIBYTE_ENCODINGS.contains(javaEncodingName.toUpperCase(Locale.ENGLISH)); + } + + protected static int getStaticMblen(String charsetName) { + if (charsetName != null) { + MysqlCharset cs = getStaticMysqlCharsetByName(charsetName); + if (cs != null) { + return cs.mblen; + } + } + return 0; + } + + protected static boolean isStaticImpermissibleCollation(int collationIndex) { + return CharsetMapping.IMPERMISSIBLE_INDEXES.contains(collationIndex); + } + +} + +class MysqlCharset { + public final String charsetName; + public final int mblen; + public final int priority; + public final List javaEncodingsUc = new ArrayList<>(); + public final List aliases = new ArrayList<>(); + + public final ServerVersion minimumVersion; + + /** + * Constructs MysqlCharset object + * + * @param charsetName + * MySQL charset name + * @param mblen + * Max number of bytes per character + * @param priority + * MysqlCharset with highest value of this param will be used for Java encoding --> Mysql charsets conversion. + * @param javaEncodings + * List of Java encodings corresponding to this MySQL charset; the first name in list is the default for mysql --> java data conversion + */ + public MysqlCharset(String charsetName, int mblen, int priority, String[] javaEncodings) { + this(charsetName, mblen, priority, javaEncodings, new ServerVersion(0, 0, 0)); + } + + public MysqlCharset(String charsetName, int mblen, int priority, String[] javaEncodings, String[] charsetAliases) { + this(charsetName, mblen, priority, javaEncodings, new ServerVersion(0, 0, 0)); + if (charsetAliases != null) { + for (String alias : charsetAliases) { + this.aliases.add(alias); + } + } + } + + private void addEncodingMapping(String encoding) { + String encodingUc = encoding.toUpperCase(Locale.ENGLISH); + + if (!this.javaEncodingsUc.contains(encodingUc)) { + this.javaEncodingsUc.add(encodingUc); + } + } + + public MysqlCharset(String charsetName, int mblen, int priority, String[] javaEncodings, ServerVersion minimumVersion) { + this.charsetName = charsetName; + this.mblen = mblen; + this.priority = priority; + + for (int i = 0; i < javaEncodings.length; i++) { + String encoding = javaEncodings[i]; + try { + Charset cs = Charset.forName(encoding); + addEncodingMapping(cs.name()); + cs.aliases().forEach(this::addEncodingMapping); + } catch (Exception e) { + // if there is no support of this charset in JVM it's still possible to use our converter for 1-byte charsets + if (mblen == 1) { + addEncodingMapping(encoding); + } + } + } + + if (this.javaEncodingsUc.size() == 0) { + addEncodingMapping(mblen > 1 ? "UTF-8" : "Cp1252"); + } + + this.minimumVersion = minimumVersion; + } + + @Override + public String toString() { + StringBuilder asString = new StringBuilder(); + asString.append("["); + asString.append("charsetName="); + asString.append(this.charsetName); + asString.append(",mblen="); + asString.append(this.mblen); + // asString.append(",javaEncoding="); + // asString.append(this.javaEncodings.toString()); + asString.append("]"); + return asString.toString(); + } + + boolean isOkayForVersion(ServerVersion version) { + return version.meetsMinimum(this.minimumVersion); + } + + /** + * If javaEncoding parameter value is one of available java encodings for this charset + * then returns javaEncoding value as is. Otherwise returns first available java encoding name. + * + * @param javaEncoding + * java encoding name + * @return java encoding name + */ + String getMatchingJavaEncoding(String javaEncoding) { + if (javaEncoding != null && this.javaEncodingsUc.contains(javaEncoding.toUpperCase(Locale.ENGLISH))) { + return javaEncoding; + } + return this.javaEncodingsUc.get(0); + } +} + +class Collation { + public final int index; + public final String[] collationNames; + public final int priority; + public final MysqlCharset mysqlCharset; + + public Collation(int index, String collationName, int priority, String charsetName) { + this(index, new String[] { collationName }, priority, charsetName); + } + + public Collation(int index, String[] collationNames, int priority, String charsetName) { + this.index = index; + this.collationNames = collationNames; + this.priority = priority; + this.mysqlCharset = CharsetMapping.getStaticMysqlCharsetByName(charsetName); + } + + @Override + public String toString() { + StringBuilder asString = new StringBuilder(); + asString.append("["); + asString.append("index="); + asString.append(this.index); + asString.append(",collationNames="); + asString.append(Arrays.toString(this.collationNames)); + asString.append(",charsetName="); + asString.append(this.mysqlCharset.charsetName); + asString.append(",javaCharsetName="); + asString.append(this.mysqlCharset.getMatchingJavaEncoding(null)); + asString.append("]"); + return asString.toString(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetSettings.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetSettings.java new file mode 100644 index 0000000..e6cd54a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/CharsetSettings.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface CharsetSettings { + + public static final String CHARACTER_SET_CLIENT = "character_set_client"; + public static final String CHARACTER_SET_CONNECTION = "character_set_connection"; + public static final String CHARACTER_SET_RESULTS = "character_set_results"; + public static final String COLLATION_CONNECTION = "collation_connection"; + + /** + *

    + * Choose the MySQL collation index for the handshake packet and the corresponding Java encodings for the password and error messages. + *

    + *

    + * This index will be sent with HandshakeResponse setting server variables 'character_set_connection', 'collation_connection', 'character_set_client' + * and 'character_set_results' which will be used by the server for decoding passwords during the authentication phase and later on, if + * no SET NAMES are issued by {@link #configurePostHandshake(boolean)}. + *

    + *

    + * It also means that collation index should be set according to: + *

      + *
    1. 'passwordCharacterEncoding' if it's present, or + *
    2. 'connectionCollation' if it's present, or + *
    3. 'characterEncoding' if it's present + *
    + * otherwise it will be set to utf8mb4_general_ci or utf8mb4_0900_ai_ci depending on server version. + *

    + * Since Protocol::HandshakeV10 and Protocol::HandshakeResponse41 has only one byte for the collation it's not possible to use indexes > 255 during the + * handshake. + * Also, ucs2, utf16, utf16le and utf32 character sets are impermissible here. Connector/J will try to use utf8mb4 instead. + *

    + * + * @param reset + * reset the charsets configuration; needed for changeUser call. + * + * @return MySQL collation index to be used during the handshake. + */ + int configurePreHandshake(boolean reset); + + /** + * Sets up client character set. This must be done before any further communication with the server! + * + * The 'collation_connection', 'character_set_client', 'character_set_connection' and 'character_set_results' server variables are set + * according to the collation index selected by {@link #configurePreHandshake(boolean)} and sent in the Protocol::HandshakeV10 packet. + * Here Connector/J alters these server variables if needed. + * + * @param dontCheckServerMatch + * if true then send the SET NAMES query even if server charset already matches the new value; needed for changeUser call. + */ + void configurePostHandshake(boolean dontCheckServerMatch); + + public boolean doesPlatformDbCharsetMatches(); + + String getPasswordCharacterEncoding(); + + String getErrorMessageEncoding(); + + String getMetadataEncoding(); + + int getMetadataCollationIndex(); + + boolean getRequiresEscapingEncoder(); + + String getJavaEncodingForCollationIndex(int collationIndex); + + int getMaxBytesPerChar(String javaCharsetName); + + int getMaxBytesPerChar(Integer charsetIndex, String javaCharsetName); + + Integer getCollationIndexForCollationName(String collationName); + + String getCollationNameForCollationIndex(Integer collationIndex); + + String getMysqlCharsetNameForCollationIndex(Integer collationIndex); + + int getCollationIndexForJavaEncoding(String javaEncoding, ServerVersion version); + + int getCollationIndexForMysqlCharsetName(String charsetName); + + String getJavaEncodingForMysqlCharset(String mysqlCharsetName); + + String getMysqlCharsetForJavaEncoding(String javaEncoding, ServerVersion version); + + boolean isMultibyteCharset(String javaEncodingName); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Constants.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Constants.java new file mode 100644 index 0000000..0af3c68 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Constants.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2002, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.conf.PropertyDefinitions; + +/** + * Represents various constants used in the driver. + */ +public class Constants { + /** + * Avoids allocation of empty byte[] when representing 0-length strings. + */ + public final static byte[] EMPTY_BYTE_ARRAY = new byte[0]; + + /** + * I18N'd representation of the abbreviation for "ms" + */ + public final static String MILLIS_I18N = Messages.getString("Milliseconds"); + + public final static byte[] SLASH_STAR_SPACE_AS_BYTES = new byte[] { (byte) '/', (byte) '*', (byte) ' ' }; + + public final static byte[] SPACE_STAR_SLASH_SPACE_AS_BYTES = new byte[] { (byte) ' ', (byte) '*', (byte) '/', (byte) ' ' }; + + public static final String JVM_VENDOR = System.getProperty(PropertyDefinitions.SYSP_java_vendor); + public static final String JVM_VERSION = System.getProperty(PropertyDefinitions.SYSP_java_version); + + public static final String OS_NAME = System.getProperty(PropertyDefinitions.SYSP_os_name); + public static final String OS_ARCH = System.getProperty(PropertyDefinitions.SYSP_os_arch); + public static final String OS_VERSION = System.getProperty(PropertyDefinitions.SYSP_os_version); + + public static final String CJ_NAME = "@MYSQL_CJ_DISPLAY_PROD_NAME@"; + public static final String CJ_FULL_NAME = "@MYSQL_CJ_FULL_PROD_NAME@"; + public static final String CJ_REVISION = "@MYSQL_CJ_REVISION@"; + public static final String CJ_VERSION = "@MYSQL_CJ_VERSION@"; + public static final String CJ_MAJOR_VERSION = "@MYSQL_CJ_MAJOR_VERSION@"; + public static final String CJ_MINOR_VERSION = "@MYSQL_CJ_MINOR_VERSION@"; + public static final String CJ_LICENSE = "@MYSQL_CJ_LICENSE_TYPE@"; + + public static final BigInteger BIG_INTEGER_ZERO = BigInteger.valueOf(0); + public static final BigInteger BIG_INTEGER_ONE = BigInteger.valueOf(1); + public static final BigInteger BIG_INTEGER_NEGATIVE_ONE = BigInteger.valueOf(-1); + public static final BigInteger BIG_INTEGER_MIN_BYTE_VALUE = BigInteger.valueOf(Byte.MIN_VALUE); + public static final BigInteger BIG_INTEGER_MAX_BYTE_VALUE = BigInteger.valueOf(Byte.MAX_VALUE); + public static final BigInteger BIG_INTEGER_MIN_SHORT_VALUE = BigInteger.valueOf(Short.MIN_VALUE); + public static final BigInteger BIG_INTEGER_MAX_SHORT_VALUE = BigInteger.valueOf(Short.MAX_VALUE); + public static final BigInteger BIG_INTEGER_MIN_INTEGER_VALUE = BigInteger.valueOf(Integer.MIN_VALUE); + public static final BigInteger BIG_INTEGER_MAX_INTEGER_VALUE = BigInteger.valueOf(Integer.MAX_VALUE); + public static final BigInteger BIG_INTEGER_MIN_LONG_VALUE = BigInteger.valueOf(Long.MIN_VALUE); + public static final BigInteger BIG_INTEGER_MAX_LONG_VALUE = BigInteger.valueOf(Long.MAX_VALUE); + + public static final BigDecimal BIG_DECIMAL_ZERO = BigDecimal.valueOf(0); + public static final BigDecimal BIG_DECIMAL_ONE = BigDecimal.valueOf(1); + public static final BigDecimal BIG_DECIMAL_NEGATIVE_ONE = BigDecimal.valueOf(-1); + public static final BigDecimal BIG_DECIMAL_MIN_BYTE_VALUE = BigDecimal.valueOf(Byte.MIN_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_BYTE_VALUE = BigDecimal.valueOf(Byte.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MIN_SHORT_VALUE = BigDecimal.valueOf(Short.MIN_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_SHORT_VALUE = BigDecimal.valueOf(Short.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MIN_INTEGER_VALUE = BigDecimal.valueOf(Integer.MIN_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_INTEGER_VALUE = BigDecimal.valueOf(Integer.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MIN_LONG_VALUE = BigDecimal.valueOf(Long.MIN_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_LONG_VALUE = BigDecimal.valueOf(Long.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_DOUBLE_VALUE = BigDecimal.valueOf(Double.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_NEGATIVE_DOUBLE_VALUE = BigDecimal.valueOf(-Double.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_FLOAT_VALUE = BigDecimal.valueOf(Float.MAX_VALUE); + public static final BigDecimal BIG_DECIMAL_MAX_NEGATIVE_FLOAT_VALUE = BigDecimal.valueOf(-Float.MAX_VALUE); + + public static final int UNSIGNED_BYTE_MAX_VALUE = 255; + + /** + * Prevents instantiation + */ + private Constants() { + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/DataStoreMetadata.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/DataStoreMetadata.java new file mode 100644 index 0000000..935cf52 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/DataStoreMetadata.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface DataStoreMetadata { + + boolean schemaExists(String schemaName); + + boolean tableExists(String schemaName, String tableName); + + long getTableRowCount(String schemaName, String tableName); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MessageBuilder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MessageBuilder.java new file mode 100644 index 0000000..775dcab --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MessageBuilder.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.List; + +import com.mysql.cj.protocol.Message; + +public interface MessageBuilder { + + M buildSqlStatement(String statement); + + M buildSqlStatement(String statement, List args); + + M buildClose(); + + M buildComQuery(M sharedPacket, Session sess, PreparedQuery preparedQuery, QueryBindings bindings, String characterEncoding); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Messages.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Messages.java new file mode 100644 index 0000000..d304952 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Messages.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +/** + * Support for localized messages. + */ +public class Messages { + private static final String BUNDLE_NAME = "com.mysql.cj.LocalizedErrorMessages"; + + private static final ResourceBundle RESOURCE_BUNDLE; + private static final Object[] emptyObjectArray = {}; + + static { + ResourceBundle temp = null; + + // + // Overly-pedantic here, some appserver and JVM combos don't deal well with the no-args version, others don't deal well with the three-arg version, so + // we need to try both :( + // + + try { + temp = ResourceBundle.getBundle(BUNDLE_NAME, Locale.getDefault(), Messages.class.getClassLoader()); + } catch (Throwable t) { + try { + temp = ResourceBundle.getBundle(BUNDLE_NAME); + } catch (Throwable t2) { + RuntimeException rt = new RuntimeException("Can't load resource bundle due to underlying exception " + t.toString()); + rt.initCause(t2); + + throw rt; + } + } finally { + RESOURCE_BUNDLE = temp; + } + } + + /** + * Returns the localized message for the given message key + * + * @param key + * the message key + * @return The localized message for the key + */ + public static String getString(String key) { + return getString(key, emptyObjectArray); + } + + public static String getString(String key, Object[] args) { + if (RESOURCE_BUNDLE == null) { + throw new RuntimeException("Localized messages from resource bundle '" + BUNDLE_NAME + "' not loaded during initialization of driver."); + } + + try { + if (key == null) { + throw new IllegalArgumentException("Message key can not be null"); + } + + String message = RESOURCE_BUNDLE.getString(key); + + if (message == null) { + message = "Missing error message for key '" + key + "'"; + } + + return MessageFormat.format(message, args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + /** + * Dis-allow construction ... + */ + private Messages() { + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlConnection.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlConnection.java new file mode 100644 index 0000000..5b1dfe1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlConnection.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Properties; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.protocol.ServerSessionStateController; + +public interface MysqlConnection { + + PropertySet getPropertySet(); + + /** + * Creates an IO channel to the server. + * + * @param isForReconnect + * is this request for a re-connect + */ + void createNewIO(boolean isForReconnect); + + long getId(); + + /** + * Returns the parsed and passed in properties for this connection. + * + * @return {@link Properties} + */ + Properties getProperties(); + + Object getConnectionMutex(); + + Session getSession(); + + String getURL(); + + String getUser(); + + ExceptionInterceptor getExceptionInterceptor(); + + void checkClosed(); + + void normalClose(); + + /** + * Destroys this connection and any underlying resources. + * + * @param whyCleanedUp + * exception caused the connection clean up + */ + void cleanup(Throwable whyCleanedUp); + + ServerSessionStateController getServerSessionStateController(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlType.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlType.java new file mode 100644 index 0000000..dfd3173 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/MysqlType.java @@ -0,0 +1,1034 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Date; +import java.sql.SQLType; +import java.sql.Time; +import java.sql.Timestamp; +import java.sql.Types; +import java.time.LocalDateTime; + +import com.mysql.cj.exceptions.FeatureNotAvailableException; +import com.mysql.cj.util.StringUtils; + +public enum MysqlType implements SQLType { + + /** + * DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] + * A packed "exact" fixed-point number. M is the total number of digits (the precision) and D is the number of digits + * after the decimal point (the scale). The decimal point and (for negative numbers) the "-" sign are not counted in M. + * If D is 0, values have no decimal point or fractional part. The maximum number of digits (M) for DECIMAL is 65. + * The maximum number of supported decimals (D) is 30. If D is omitted, the default is 0. If M is omitted, the default is 10. + * + * Protocol: FIELD_TYPE_DECIMAL = 0 + * Protocol: FIELD_TYPE_NEWDECIMAL = 246 + * + * These types are synonyms for DECIMAL: + * DEC[(M[,D])] [UNSIGNED] [ZEROFILL], + * NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], + * FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] + */ + DECIMAL("DECIMAL", Types.DECIMAL, BigDecimal.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 65L, "[(M[,D])] [UNSIGNED] [ZEROFILL]"), + /** + * DECIMAL[(M[,D])] UNSIGNED [ZEROFILL] + * + * @see MysqlType#DECIMAL + */ + DECIMAL_UNSIGNED("DECIMAL UNSIGNED", Types.DECIMAL, BigDecimal.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, + 65L, "[(M[,D])] [UNSIGNED] [ZEROFILL]"), + /** + * TINYINT[(M)] [UNSIGNED] [ZEROFILL] + * A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255. + * + * Protocol: FIELD_TYPE_TINY = 1 + */ + TINYINT("TINYINT", Types.TINYINT, Integer.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 3L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * TINYINT[(M)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#TINYINT + */ + TINYINT_UNSIGNED("TINYINT UNSIGNED", Types.TINYINT, Integer.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 3L, + "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * BOOL, BOOLEAN + * These types are synonyms for TINYINT(1). A value of zero is considered false. Nonzero values are considered true + * + * BOOLEAN is converted to TINYINT(1) during DDL execution i.e. it has the same precision=3. Thus we have to + * look at full data type name and convert TINYINT to BOOLEAN (or BIT) if it has "(1)" length specification. + * + * Protocol: FIELD_TYPE_TINY = 1 + */ + BOOLEAN("BOOLEAN", Types.BOOLEAN, Boolean.class, 0, MysqlType.IS_NOT_DECIMAL, 3L, ""), + /** + * SMALLINT[(M)] [UNSIGNED] [ZEROFILL] + * A small integer. The signed range is -32768 to 32767. The unsigned range is 0 to 65535. + * + * Protocol: FIELD_TYPE_SHORT = 2 + */ + SMALLINT("SMALLINT", Types.SMALLINT, Integer.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 5L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * SMALLINT[(M)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#SMALLINT + */ + SMALLINT_UNSIGNED("SMALLINT UNSIGNED", Types.SMALLINT, Integer.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, + 5L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * INT[(M)] [UNSIGNED] [ZEROFILL] + * A normal-size integer. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295. + * + * Protocol: FIELD_TYPE_LONG = 3 + * + * INTEGER[(M)] [UNSIGNED] [ZEROFILL] is a synonym for INT. + */ + INT("INT", Types.INTEGER, Integer.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 10L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * INT[(M)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#INT + */ + INT_UNSIGNED("INT UNSIGNED", Types.INTEGER, Long.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 10L, + "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] + * A small (single-precision) floating-point number. Permissible values are -3.402823466E+38 to -1.175494351E-38, 0, + * and 1.175494351E-38 to 3.402823466E+38. These are the theoretical limits, based on the IEEE standard. The actual + * range might be slightly smaller depending on your hardware or operating system. + * + * M is the total number of digits and D is the number of digits following the decimal point. If M and D are omitted, + * values are stored to the limits permitted by the hardware. A single-precision floating-point number is accurate to + * approximately 7 decimal places. + * + * Protocol: FIELD_TYPE_FLOAT = 4 + * + * Additionally: + * FLOAT(p) [UNSIGNED] [ZEROFILL] + * A floating-point number. p represents the precision in bits, but MySQL uses this value only to determine whether + * to use FLOAT or DOUBLE for the resulting data type. If p is from 0 to 24, the data type becomes FLOAT with no M or D values. + * If p is from 25 to 53, the data type becomes DOUBLE with no M or D values. The range of the resulting column is the same as + * for the single-precision FLOAT or double-precision DOUBLE data types. + */ + FLOAT("FLOAT", Types.REAL, Float.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 12L, "[(M,D)] [UNSIGNED] [ZEROFILL]"), + /** + * FLOAT[(M,D)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#FLOAT + */ + FLOAT_UNSIGNED("FLOAT UNSIGNED", Types.REAL, Float.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 12L, + "[(M,D)] [UNSIGNED] [ZEROFILL]"), + /** + * DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] + * A normal-size (double-precision) floating-point number. Permissible values are -1.7976931348623157E+308 to + * -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308. These are the theoretical limits, + * based on the IEEE standard. The actual range might be slightly smaller depending on your hardware or operating system. + * + * M is the total number of digits and D is the number of digits following the decimal point. If M and D are omitted, + * values are stored to the limits permitted by the hardware. A double-precision floating-point number is accurate to + * approximately 15 decimal places. + * + * Protocol: FIELD_TYPE_DOUBLE = 5 + * + * These types are synonyms for DOUBLE: + * DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], + * REAL[(M,D)] [UNSIGNED] [ZEROFILL]. Exception: If the REAL_AS_FLOAT SQL mode is enabled, REAL is a synonym for FLOAT rather than DOUBLE. + */ + DOUBLE("DOUBLE", Types.DOUBLE, Double.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 22L, "[(M,D)] [UNSIGNED] [ZEROFILL]"), + /** + * DOUBLE[(M,D)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#DOUBLE + */ + DOUBLE_UNSIGNED("DOUBLE UNSIGNED", Types.DOUBLE, Double.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 22L, + "[(M,D)] [UNSIGNED] [ZEROFILL]"), + /** + * FIELD_TYPE_NULL = 6 + */ + NULL("NULL", Types.NULL, Object.class, 0, MysqlType.IS_NOT_DECIMAL, 0L, ""), + /** + * TIMESTAMP[(fsp)] + * A timestamp. The range is '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC. + * TIMESTAMP values are stored as the number of seconds since the epoch ('1970-01-01 00:00:00' UTC). + * A TIMESTAMP cannot represent the value '1970-01-01 00:00:00' because that is equivalent to 0 seconds + * from the epoch and the value 0 is reserved for representing '0000-00-00 00:00:00', the "zero" TIMESTAMP value. + * An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value + * of 0 signifies that there is no fractional part. If omitted, the default precision is 0. + * + * Protocol: FIELD_TYPE_TIMESTAMP = 7 + * + */ + // TODO If MySQL server run with the MAXDB SQL mode enabled, TIMESTAMP is identical with DATETIME. If this mode is enabled at the time that a table is created, TIMESTAMP columns are created as DATETIME columns. + // As a result, such columns use DATETIME display format, have the same range of values, and there is no automatic initialization or updating to the current date and time + TIMESTAMP("TIMESTAMP", Types.TIMESTAMP, Timestamp.class, 0, MysqlType.IS_NOT_DECIMAL, 26L, "[(fsp)]"), + /** + * BIGINT[(M)] [UNSIGNED] [ZEROFILL] + * A large integer. The signed range is -9223372036854775808 to 9223372036854775807. The unsigned range is 0 to 18446744073709551615. + * + * Protocol: FIELD_TYPE_LONGLONG = 8 + * + * SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. + */ + BIGINT("BIGINT", Types.BIGINT, Long.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 19L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * BIGINT[(M)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#BIGINT + */ + BIGINT_UNSIGNED("BIGINT UNSIGNED", Types.BIGINT, BigInteger.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 20L, + "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] + * A medium-sized integer. The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215. + * + * Protocol: FIELD_TYPE_INT24 = 9 + */ + MEDIUMINT("MEDIUMINT", Types.INTEGER, Integer.class, MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, 7L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * MEDIUMINT[(M)] UNSIGNED [ZEROFILL] + * + * @see MysqlType#MEDIUMINT + */ + MEDIUMINT_UNSIGNED("MEDIUMINT UNSIGNED", Types.INTEGER, Integer.class, MysqlType.FIELD_FLAG_UNSIGNED | MysqlType.FIELD_FLAG_ZEROFILL, MysqlType.IS_DECIMAL, + 8L, "[(M)] [UNSIGNED] [ZEROFILL]"), + /** + * DATE + * A date. The supported range is '1000-01-01' to '9999-12-31'. MySQL displays DATE values in 'YYYY-MM-DD' format, + * but permits assignment of values to DATE columns using either strings or numbers. + * + * Protocol: FIELD_TYPE_DATE = 10 + */ + DATE("DATE", Types.DATE, Date.class, 0, MysqlType.IS_NOT_DECIMAL, 10L, ""), + /** + * TIME[(fsp)] + * A time. The range is '-838:59:59.000000' to '838:59:59.000000'. MySQL displays TIME values in + * 'HH:MM:SS[.fraction]' format, but permits assignment of values to TIME columns using either strings or numbers. + * An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value + * of 0 signifies that there is no fractional part. If omitted, the default precision is 0. + * + * Protocol: FIELD_TYPE_TIME = 11 + */ + TIME("TIME", Types.TIME, Time.class, 0, MysqlType.IS_NOT_DECIMAL, 16L, "[(fsp)]"), + /** + * DATETIME[(fsp)] + * A date and time combination. The supported range is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'. + * MySQL displays DATETIME values in 'YYYY-MM-DD HH:MM:SS[.fraction]' format, but permits assignment of values to + * DATETIME columns using either strings or numbers. + * An optional fsp value in the range from 0 to 6 may be given to specify fractional seconds precision. A value + * of 0 signifies that there is no fractional part. If omitted, the default precision is 0. + * + * Protocol: FIELD_TYPE_DATETIME = 12 + */ + DATETIME("DATETIME", Types.TIMESTAMP, LocalDateTime.class, 0, MysqlType.IS_NOT_DECIMAL, 26L, "[(fsp)]"), + /** + * YEAR[(4)] + * A year in four-digit format. MySQL displays YEAR values in YYYY format, but permits assignment of + * values to YEAR columns using either strings or numbers. Values display as 1901 to 2155, and 0000. + * Protocol: FIELD_TYPE_YEAR = 13 + */ + YEAR("YEAR", Types.DATE, Date.class, 0, MysqlType.IS_NOT_DECIMAL, 4L, "[(4)]"), + /** + * [NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] + * A variable-length string. M represents the maximum column length in characters. The range of M is 0 to 65,535. + * The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among + * all columns) and the character set used. For example, utf8 characters can require up to three bytes per character, + * so a VARCHAR column that uses the utf8 character set can be declared to be a maximum of 21,844 characters. + * + * MySQL stores VARCHAR values as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number + * of bytes in the value. A VARCHAR column uses one length byte if values require no more than 255 bytes, two length + * bytes if values may require more than 255 bytes. + * + * Note + * MySQL 5.7 follows the standard SQL specification, and does not remove trailing spaces from VARCHAR values. + * + * VARCHAR is shorthand for CHARACTER VARYING. NATIONAL VARCHAR is the standard SQL way to define that a VARCHAR + * column should use some predefined character set. MySQL 4.1 and up uses utf8 as this predefined character set. + * NVARCHAR is shorthand for NATIONAL VARCHAR. + * + * Protocol: FIELD_TYPE_VARCHAR = 15 + * Protocol: FIELD_TYPE_VAR_STRING = 253 + */ + VARCHAR("VARCHAR", Types.VARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 65535L, "(M) [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * VARBINARY(M) + * The VARBINARY type is similar to the VARCHAR type, but stores binary byte strings rather than nonbinary + * character strings. M represents the maximum column length in bytes. + * + * Protocol: FIELD_TYPE_VARCHAR = 15 + * Protocol: FIELD_TYPE_VAR_STRING = 253 + */ + VARBINARY("VARBINARY", Types.VARBINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 65535L, "(M)"), + /** + * BIT[(M)] + * A bit-field type. M indicates the number of bits per value, from 1 to 64. The default is 1 if M is omitted. + * Protocol: FIELD_TYPE_BIT = 16 + */ + BIT("BIT", Types.BIT, Boolean.class, 0, MysqlType.IS_DECIMAL, 1L, "[(M)]"), // TODO maybe precision=8 ? + /** + * The size of JSON documents stored in JSON columns is limited to the value of the max_allowed_packet system variable (max value 1073741824). + * (While the server manipulates a JSON value internally in memory, it can be larger; the limit applies when the server stores it.) + * + * Protocol: FIELD_TYPE_BIT = 245 + */ + JSON("JSON", Types.LONGVARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 1073741824L, ""), + /** + * ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name] + * An enumeration. A string object that can have only one value, chosen from the list of values 'value1', + * 'value2', ..., NULL or the special '' error value. ENUM values are represented internally as integers. + * An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) + * A table can have no more than 255 unique element list definitions among its ENUM and SET columns considered as a group + * + * Protocol: FIELD_TYPE_ENUM = 247 + */ + ENUM("ENUM", Types.CHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 65535L, + "('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name] + * A set. A string object that can have zero or more values, each of which must be chosen from the list + * of values 'value1', 'value2', ... SET values are represented internally as integers. + * A SET column can have a maximum of 64 distinct members. A table can have no more than 255 unique + * element list definitions among its ENUM and SET columns considered as a group + * + * Protocol: FIELD_TYPE_SET = 248 + */ + SET("SET", Types.CHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 64L, "('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * TINYBLOB + * A BLOB column with a maximum length of 255 (28 - 1) bytes. Each TINYBLOB value is stored using a + * 1-byte length prefix that indicates the number of bytes in the value. + * + * Protocol:FIELD_TYPE_TINY_BLOB = 249 + */ + TINYBLOB("TINYBLOB", Types.VARBINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 255L, ""), + /** + * TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name] + * A TEXT column with a maximum length of 255 (28 - 1) characters. The effective maximum length + * is less if the value contains multibyte characters. Each TINYTEXT value is stored using + * a 1-byte length prefix that indicates the number of bytes in the value. + * + * Protocol:FIELD_TYPE_TINY_BLOB = 249 + */ + TINYTEXT("TINYTEXT", Types.VARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 255L, " [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * MEDIUMBLOB + * A BLOB column with a maximum length of 16,777,215 (224 - 1) bytes. Each MEDIUMBLOB value is stored + * using a 3-byte length prefix that indicates the number of bytes in the value. + * + * Protocol: FIELD_TYPE_MEDIUM_BLOB = 250 + */ + MEDIUMBLOB("MEDIUMBLOB", Types.LONGVARBINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 16777215L, ""), + /** + * MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name] + * A TEXT column with a maximum length of 16,777,215 (224 - 1) characters. The effective maximum length + * is less if the value contains multibyte characters. Each MEDIUMTEXT value is stored using a 3-byte + * length prefix that indicates the number of bytes in the value. + * + * Protocol: FIELD_TYPE_MEDIUM_BLOB = 250 + */ + MEDIUMTEXT("MEDIUMTEXT", Types.LONGVARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 16777215L, " [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * LONGBLOB + * A BLOB column with a maximum length of 4,294,967,295 or 4GB (232 - 1) bytes. The effective maximum length + * of LONGBLOB columns depends on the configured maximum packet size in the client/server protocol and available + * memory. Each LONGBLOB value is stored using a 4-byte length prefix that indicates the number of bytes in the value. + * + * Protocol: FIELD_TYPE_LONG_BLOB = 251 + */ + LONGBLOB("LONGBLOB", Types.LONGVARBINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 4294967295L, ""), + /** + * LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name] + * A TEXT column with a maximum length of 4,294,967,295 or 4GB (232 - 1) characters. The effective + * maximum length is less if the value contains multibyte characters. The effective maximum length + * of LONGTEXT columns also depends on the configured maximum packet size in the client/server protocol + * and available memory. Each LONGTEXT value is stored using a 4-byte length prefix that indicates + * the number of bytes in the value. + * + * Protocol: FIELD_TYPE_LONG_BLOB = 251 + */ + LONGTEXT("LONGTEXT", Types.LONGVARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 4294967295L, " [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * BLOB[(M)] + * A BLOB column with a maximum length of 65,535 (216 - 1) bytes. Each BLOB value is stored using + * a 2-byte length prefix that indicates the number of bytes in the value. + * An optional length M can be given for this type. If this is done, MySQL creates the column as + * the smallest BLOB type large enough to hold values M bytes long. + * + * Protocol: FIELD_TYPE_BLOB = 252 + */ + BLOB("BLOB", Types.LONGVARBINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 65535L, "[(M)]"), + /** + * TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] + * A TEXT column with a maximum length of 65,535 (216 - 1) characters. The effective maximum length + * is less if the value contains multibyte characters. Each TEXT value is stored using a 2-byte length + * prefix that indicates the number of bytes in the value. + * An optional length M can be given for this type. If this is done, MySQL creates the column as + * the smallest TEXT type large enough to hold values M characters long. + * + * Protocol: FIELD_TYPE_BLOB = 252 + */ + TEXT("TEXT", Types.LONGVARCHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 65535L, "[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * [NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] + * A fixed-length string that is always right-padded with spaces to the specified length when stored. + * M represents the column length in characters. The range of M is 0 to 255. If M is omitted, the length is 1. + * Note + * Trailing spaces are removed when CHAR values are retrieved unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled. + * CHAR is shorthand for CHARACTER. NATIONAL CHAR (or its equivalent short form, NCHAR) is the standard SQL way + * to define that a CHAR column should use some predefined character set. MySQL 4.1 and up uses utf8 + * as this predefined character set. + * + * MySQL permits you to create a column of type CHAR(0). This is useful primarily when you have to be compliant + * with old applications that depend on the existence of a column but that do not actually use its value. + * CHAR(0) is also quite nice when you need a column that can take only two values: A column that is defined + * as CHAR(0) NULL occupies only one bit and can take only the values NULL and '' (the empty string). + * + * Protocol: FIELD_TYPE_STRING = 254 + */ + CHAR("CHAR", Types.CHAR, String.class, 0, MysqlType.IS_NOT_DECIMAL, 255L, "[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]"), + /** + * BINARY(M) + * The BINARY type is similar to the CHAR type, but stores binary byte strings rather than nonbinary character strings. + * M represents the column length in bytes. + * + * The CHAR BYTE data type is an alias for the BINARY data type. + * + * Protocol: no concrete type on the wire TODO: really? + */ + BINARY("BINARY", Types.BINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 255L, "(M)"), + /** + * Top class for Spatial Data Types + * + * Protocol: FIELD_TYPE_GEOMETRY = 255 + */ + GEOMETRY("GEOMETRY", Types.BINARY, null, 0, MysqlType.IS_NOT_DECIMAL, 65535L, ""), // TODO check precision, it isn't well documented, only mentioned that WKB format is represented by BLOB + /** + * Fall-back type for those MySQL data types which c/J can't recognize. + * Handled the same as BLOB. + * + * Has no protocol ID. + */ + UNKNOWN("UNKNOWN", Types.OTHER, null, 0, MysqlType.IS_NOT_DECIMAL, 65535L, ""); + + /** + * Get MysqlType matching the full MySQL type name, for example "DECIMAL(5,3) UNSIGNED ZEROFILL". + * Distinct *_UNSIGNED type will be returned if "UNSIGNED" is present in fullMysqlTypeName. + * + * @param fullMysqlTypeName + * full MySQL type name + * @return MysqlType + */ + public static MysqlType getByName(String fullMysqlTypeName) { + + // TODO parse complex names like [NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] + + String typeName = ""; + + if (fullMysqlTypeName.indexOf("(") != -1) { + typeName = fullMysqlTypeName.substring(0, fullMysqlTypeName.indexOf("(")).trim(); + } else { + typeName = fullMysqlTypeName; + } + + // the order of checks is important because some short names could match parts of longer names + if (StringUtils.indexOfIgnoreCase(typeName, "DECIMAL") != -1 || StringUtils.indexOfIgnoreCase(typeName, "DEC") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "NUMERIC") != -1 || StringUtils.indexOfIgnoreCase(typeName, "FIXED") != -1) { + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 ? DECIMAL_UNSIGNED : DECIMAL; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TINYBLOB") != -1) { + // IMPORTANT: "TINYBLOB" must be checked before "TINY" + return TINYBLOB; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TINYTEXT") != -1) { + // IMPORTANT: "TINYTEXT" must be checked before "TINY" + return TINYTEXT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TINYINT") != -1 || StringUtils.indexOfIgnoreCase(typeName, "TINY") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "INT1") != -1) { + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? TINYINT_UNSIGNED + : TINYINT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "MEDIUMINT") != -1 + // IMPORTANT: "INT24" must be checked before "INT2" + || StringUtils.indexOfIgnoreCase(typeName, "INT24") != -1 || StringUtils.indexOfIgnoreCase(typeName, "INT3") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "MIDDLEINT") != -1) { + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? MEDIUMINT_UNSIGNED + : MEDIUMINT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "SMALLINT") != -1 || StringUtils.indexOfIgnoreCase(typeName, "INT2") != -1) { + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? SMALLINT_UNSIGNED + : SMALLINT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "BIGINT") != -1 || StringUtils.indexOfIgnoreCase(typeName, "SERIAL") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "INT8") != -1) { + // SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? BIGINT_UNSIGNED + : BIGINT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "POINT") != -1) { + // also covers "MULTIPOINT" + // IMPORTANT: "POINT" must be checked before "INT" + return GEOMETRY; // TODO think about different MysqlTypes for Spatial Data Types + + } else if (StringUtils.indexOfIgnoreCase(typeName, "INT") != -1 || StringUtils.indexOfIgnoreCase(typeName, "INTEGER") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "INT4") != -1) { + // IMPORTANT: "INT" must be checked after all "*INT*" types + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? INT_UNSIGNED + : INT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "DOUBLE") != -1 || StringUtils.indexOfIgnoreCase(typeName, "REAL") != -1 + /* || StringUtils.indexOfIgnoreCase(name, "DOUBLE PRECISION") != -1 is caught by "DOUBLE" check */ + // IMPORTANT: "FLOAT8" must be checked before "FLOAT" + || StringUtils.indexOfIgnoreCase(typeName, "FLOAT8") != -1) { + // TODO Exception: If the REAL_AS_FLOAT SQL mode is enabled, REAL is a synonym for FLOAT rather than DOUBLE. + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? DOUBLE_UNSIGNED + : DOUBLE; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "FLOAT") != -1 /* + * || StringUtils.indexOfIgnoreCase(name, "FLOAT4") != -1 is caught by + * "FLOAT" check + */) { + // TODO FLOAT(p) [UNSIGNED] [ZEROFILL]. If p is from 0 to 24, the data type becomes FLOAT with no M or D values. If p is from 25 to 53, the data type becomes DOUBLE with no M or D values. + return StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "UNSIGNED") != -1 || StringUtils.indexOfIgnoreCase(fullMysqlTypeName, "ZEROFILL") != -1 + ? FLOAT_UNSIGNED + : FLOAT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "NULL") != -1) { + return NULL; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TIMESTAMP") != -1) { + // IMPORTANT: "TIMESTAMP" must be checked before "TIME" + return TIMESTAMP; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "DATETIME") != -1) { + // IMPORTANT: "DATETIME" must be checked before "DATE" and "TIME" + return DATETIME; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "DATE") != -1) { + return DATE; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TIME") != -1) { + return TIME; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "YEAR") != -1) { + return YEAR; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "LONGBLOB") != -1) { + // IMPORTANT: "LONGBLOB" must be checked before "LONG" and "BLOB" + return LONGBLOB; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "LONGTEXT") != -1) { + // IMPORTANT: "LONGTEXT" must be checked before "LONG" and "TEXT" + return LONGTEXT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "MEDIUMBLOB") != -1 || StringUtils.indexOfIgnoreCase(typeName, "LONG VARBINARY") != -1) { + // IMPORTANT: "MEDIUMBLOB" must be checked before "BLOB" + // IMPORTANT: "LONG VARBINARY" must be checked before "LONG" and "VARBINARY" + return MEDIUMBLOB; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "MEDIUMTEXT") != -1 || StringUtils.indexOfIgnoreCase(typeName, "LONG VARCHAR") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "LONG") != -1) { + // IMPORTANT: "MEDIUMTEXT" must be checked before "TEXT" + // IMPORTANT: "LONG VARCHAR" must be checked before "VARCHAR" + return MEDIUMTEXT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "VARCHAR") != -1 || StringUtils.indexOfIgnoreCase(typeName, "NVARCHAR") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "NATIONAL VARCHAR") != -1 || StringUtils.indexOfIgnoreCase(typeName, "CHARACTER VARYING") != -1) { + // IMPORTANT: "CHARACTER VARYING" must be checked before "CHARACTER" and "CHAR" + return VARCHAR; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "VARBINARY") != -1) { + return VARBINARY; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "BINARY") != -1 || StringUtils.indexOfIgnoreCase(typeName, "CHAR BYTE") != -1) { + // IMPORTANT: "BINARY" must be checked after all "*BINARY" types + // IMPORTANT: "CHAR BYTE" must be checked before "CHAR" + return BINARY; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "LINESTRING") != -1) { + // also covers "MULTILINESTRING" + // IMPORTANT: "LINESTRING" must be checked before "STRING" + return GEOMETRY; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "STRING") != -1 + // IMPORTANT: "CHAR" must be checked after all "*CHAR*" types + || StringUtils.indexOfIgnoreCase(typeName, "CHAR") != -1 || StringUtils.indexOfIgnoreCase(typeName, "NCHAR") != -1 + || StringUtils.indexOfIgnoreCase(typeName, "NATIONAL CHAR") != -1 || StringUtils.indexOfIgnoreCase(typeName, "CHARACTER") != -1) { + return CHAR; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "BOOLEAN") != -1 || StringUtils.indexOfIgnoreCase(typeName, "BOOL") != -1) { + return BOOLEAN; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "BIT") != -1) { + return BIT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "JSON") != -1) { + return JSON; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "ENUM") != -1) { + return ENUM; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "SET") != -1) { + return SET; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "BLOB") != -1) { + return BLOB; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "TEXT") != -1) { + return TEXT; + + } else if (StringUtils.indexOfIgnoreCase(typeName, "GEOM") != -1 // covers "GEOMETRY", "GEOMETRYCOLLECTION" and "GEOMCOLLECTION" + || StringUtils.indexOfIgnoreCase(typeName, "POINT") != -1 // also covers "MULTIPOINT" + || StringUtils.indexOfIgnoreCase(typeName, "POLYGON") != -1 // also covers "MULTIPOLYGON" + ) { + return GEOMETRY; // TODO think about different MysqlTypes for Spatial Data Types + + } + + return UNKNOWN; + } + + public static MysqlType getByJdbcType(int jdbcType) { + switch (jdbcType) { + case Types.BIGINT: + return BIGINT; + case Types.BINARY: + return BINARY; + case Types.BIT: + return BIT; + case Types.BOOLEAN: + return BOOLEAN; + case Types.CHAR: + case Types.NCHAR: // TODO check that it's correct + return CHAR; + case Types.DATE: + return DATE; + case Types.DECIMAL: + case Types.NUMERIC: + return DECIMAL; + case Types.DOUBLE: + case Types.FLOAT: + return DOUBLE; + case Types.INTEGER: + return INT; + case Types.LONGVARBINARY: + case Types.BLOB: // TODO check that it's correct + case Types.JAVA_OBJECT: // TODO check that it's correct + return BLOB; + case Types.LONGVARCHAR: + case Types.LONGNVARCHAR: // TODO check that it's correct + case Types.CLOB: // TODO check that it's correct + case Types.NCLOB: // TODO check that it's correct + return TEXT; + case Types.NULL: + return NULL; + case Types.REAL: + return FLOAT; + case Types.SMALLINT: + return SMALLINT; + case Types.TIME: + return TIME; + case Types.TIMESTAMP: + return TIMESTAMP; + case Types.TINYINT: + return TINYINT; + case Types.VARBINARY: + return VARBINARY; + case Types.VARCHAR: + case Types.NVARCHAR: // TODO check that it's correct + case Types.DATALINK: // TODO check that it's correct + case Types.SQLXML: // TODO check that it's correct + return VARCHAR; + + case Types.REF_CURSOR: + throw new FeatureNotAvailableException("REF_CURSOR type is not supported"); + case Types.TIME_WITH_TIMEZONE: + throw new FeatureNotAvailableException("TIME_WITH_TIMEZONE type is not supported"); + case Types.TIMESTAMP_WITH_TIMEZONE: + throw new FeatureNotAvailableException("TIMESTAMP_WITH_TIMEZONE type is not supported"); + + // TODO check next types + case Types.ARRAY: + case Types.DISTINCT: + case Types.OTHER: + case Types.REF: + case Types.ROWID: + case Types.STRUCT: + + default: + return UNKNOWN; + } + } + + /** + * Is CONVERT between the given SQL types supported? + * + * @param fromType + * the type to convert from + * @param toType + * the type to convert to + * @return true if so + * @see Types + */ + public static boolean supportsConvert(int fromType, int toType) { + + // TODO use MysqlTypes here ? + + switch (fromType) { + /* + * The char/binary types can be converted to pretty much anything. + */ + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + + switch (toType) { + case java.sql.Types.DECIMAL: + case java.sql.Types.NUMERIC: + case java.sql.Types.REAL: + case java.sql.Types.TINYINT: + case java.sql.Types.SMALLINT: + case java.sql.Types.INTEGER: + case java.sql.Types.BIGINT: + case java.sql.Types.FLOAT: + case java.sql.Types.DOUBLE: + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + case java.sql.Types.OTHER: + case java.sql.Types.DATE: + case java.sql.Types.TIME: + case java.sql.Types.TIMESTAMP: + return true; + + default: + return false; + } + + /* + * We don't handle the BIT type yet. + */ + case java.sql.Types.BIT: + return false; + + /* + * The numeric types. Basically they can convert among themselves, and with char/binary types. + */ + case java.sql.Types.DECIMAL: + case java.sql.Types.NUMERIC: + case java.sql.Types.REAL: + case java.sql.Types.TINYINT: + case java.sql.Types.SMALLINT: + case java.sql.Types.INTEGER: + case java.sql.Types.BIGINT: + case java.sql.Types.FLOAT: + case java.sql.Types.DOUBLE: + + switch (toType) { + case java.sql.Types.DECIMAL: + case java.sql.Types.NUMERIC: + case java.sql.Types.REAL: + case java.sql.Types.TINYINT: + case java.sql.Types.SMALLINT: + case java.sql.Types.INTEGER: + case java.sql.Types.BIGINT: + case java.sql.Types.FLOAT: + case java.sql.Types.DOUBLE: + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + return true; + + default: + return false; + } + + /* MySQL doesn't support a NULL type. */ + case java.sql.Types.NULL: + return false; + + /* + * With this driver, this will always be a serialized object, so the char/binary types will work. + */ + case java.sql.Types.OTHER: + + switch (toType) { + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + return true; + + default: + return false; + } + + /* Dates can be converted to char/binary types. */ + case java.sql.Types.DATE: + + switch (toType) { + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + return true; + + default: + return false; + } + + /* Time can be converted to char/binary types */ + case java.sql.Types.TIME: + + switch (toType) { + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + return true; + + default: + return false; + } + + /* + * Timestamp can be converted to char/binary types and date/time types (with loss of precision). + */ + case java.sql.Types.TIMESTAMP: + + switch (toType) { + case java.sql.Types.CHAR: + case java.sql.Types.VARCHAR: + case java.sql.Types.LONGVARCHAR: + case java.sql.Types.BINARY: + case java.sql.Types.VARBINARY: + case java.sql.Types.LONGVARBINARY: + case java.sql.Types.TIME: + case java.sql.Types.DATE: + return true; + + default: + return false; + } + + /* We shouldn't get here! */ + default: + return false; // not sure + } + } + + public static boolean isSigned(MysqlType type) { + switch (type) { + case DECIMAL: + case TINYINT: + case SMALLINT: + case INT: + case BIGINT: + case MEDIUMINT: + case FLOAT: + case DOUBLE: + return true; + default: + return false; + } + } + + private final String name; + protected int jdbcType; + protected final Class javaClass; + private final int flagsMask; + private final boolean isDecimal; + private final Long precision; + private final String createParams; + + /** + * + * @param mysqlTypeName + * mysqlTypeName + * @param jdbcType + * jdbcType + * @param javaClass + * javaClass + * @param allowedFlags + * allowedFlags + * @param isDec + * isDec + * @param precision + * represents the maximum column size that the server supports for the given datatype. + *
      + *
    • For numeric data, this is the maximum precision. + *
    • + * For character data, this is the length in characters. + *
    • For datetime datatypes, this is the length in characters of the String + * representation (assuming the maximum allowed precision of the fractional seconds component). + *
    • For binary data, this is the length in bytes. + *
    • For the ROWID datatype, this is the length in bytes. + *
    • Null is returned for data types where the column size is not applicable. + *
    + * @param createParams + * params + */ + private MysqlType(String mysqlTypeName, int jdbcType, Class javaClass, int allowedFlags, boolean isDec, Long precision, String createParams) { + this.name = mysqlTypeName; + this.jdbcType = jdbcType; + this.javaClass = javaClass; + this.flagsMask = allowedFlags; + this.isDecimal = isDec; + this.precision = precision; + this.createParams = createParams; + } + + public String getName() { + return this.name; + } + + public int getJdbcType() { + return this.jdbcType; + } + + public boolean isAllowed(int flag) { + return ((this.flagsMask & flag) > 0); + } + + public String getClassName() { + if (this.javaClass == null) { + return "[B"; + } + return this.javaClass.getName(); + } + + /** + * Checks if the MySQL Type is a Decimal/Number Type + * + * @return true if the MySQL Type is a Decimal/Number Type + */ + public boolean isDecimal() { + return this.isDecimal; + } + + /** + * The PRECISION column represents the maximum column size that the server supports for the given datatype. + *
      + *
    • For numeric data, this is the maximum + * precision. + *
    • For character data, this is the length in characters. + *
    • For datetime datatypes, this is the length in characters of the String + * representation (assuming the maximum allowed precision of the fractional seconds component). + *
    • For binary data, this is the length in bytes. + *
    • For + * the ROWID datatype, this is the length in bytes. + *
    • Null is returned for data types where the column size is not applicable. + *
    + * + * @return precision + */ + public Long getPrecision() { + return this.precision; + } + + public String getCreateParams() { + return this.createParams; + } + + public static final int FIELD_FLAG_NOT_NULL = 1; + public static final int FIELD_FLAG_PRIMARY_KEY = 2; + public static final int FIELD_FLAG_UNIQUE_KEY = 4; + public static final int FIELD_FLAG_MULTIPLE_KEY = 8; + public static final int FIELD_FLAG_BLOB = 16; + public static final int FIELD_FLAG_UNSIGNED = 32; + public static final int FIELD_FLAG_ZEROFILL = 64; + public static final int FIELD_FLAG_BINARY = 128; + public static final int FIELD_FLAG_AUTO_INCREMENT = 512; + + private static final boolean IS_DECIMAL = true; + private static final boolean IS_NOT_DECIMAL = false; + + @Override + public String getVendor() { + return "com.mysql.cj"; + } + + @Override + public Integer getVendorTypeNumber() { + return this.jdbcType; + } + + // Protocol field type numbers + public static final int FIELD_TYPE_DECIMAL = 0; + public static final int FIELD_TYPE_TINY = 1; + public static final int FIELD_TYPE_SHORT = 2; + public static final int FIELD_TYPE_LONG = 3; + public static final int FIELD_TYPE_FLOAT = 4; + public static final int FIELD_TYPE_DOUBLE = 5; + public static final int FIELD_TYPE_NULL = 6; + public static final int FIELD_TYPE_TIMESTAMP = 7; + public static final int FIELD_TYPE_LONGLONG = 8; + public static final int FIELD_TYPE_INT24 = 9; + public static final int FIELD_TYPE_DATE = 10; + public static final int FIELD_TYPE_TIME = 11; + public static final int FIELD_TYPE_DATETIME = 12; + public static final int FIELD_TYPE_YEAR = 13; + public static final int FIELD_TYPE_VARCHAR = 15; + public static final int FIELD_TYPE_BIT = 16; + public static final int FIELD_TYPE_JSON = 245; + public static final int FIELD_TYPE_NEWDECIMAL = 246; + public static final int FIELD_TYPE_ENUM = 247; + public static final int FIELD_TYPE_SET = 248; + public static final int FIELD_TYPE_TINY_BLOB = 249; + public static final int FIELD_TYPE_MEDIUM_BLOB = 250; + public static final int FIELD_TYPE_LONG_BLOB = 251; + public static final int FIELD_TYPE_BLOB = 252; + public static final int FIELD_TYPE_VAR_STRING = 253; + public static final int FIELD_TYPE_STRING = 254; + public static final int FIELD_TYPE_GEOMETRY = 255; + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PerConnectionLRUFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PerConnectionLRUFactory.java new file mode 100644 index 0000000..1f36d18 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PerConnectionLRUFactory.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2012, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Set; + +import com.mysql.cj.util.LRUCache; + +public class PerConnectionLRUFactory implements CacheAdapterFactory { + + public CacheAdapter getInstance(Object syncMutex, String url, int cacheMaxSize, int maxKeySize) { + + return new PerConnectionLRU(syncMutex, cacheMaxSize, maxKeySize); + } + + class PerConnectionLRU implements CacheAdapter { + private final int cacheSqlLimit; + private final LRUCache cache; + private final Object syncMutex; + + protected PerConnectionLRU(Object syncMutex, int cacheMaxSize, int maxKeySize) { + final int cacheSize = cacheMaxSize; + this.cacheSqlLimit = maxKeySize; + this.cache = new LRUCache<>(cacheSize); + this.syncMutex = syncMutex; + } + + public QueryInfo get(String key) { + if (key == null || key.length() > this.cacheSqlLimit) { + return null; + } + + synchronized (this.syncMutex) { + return this.cache.get(key); + } + } + + public void put(String key, QueryInfo value) { + if (key == null || key.length() > this.cacheSqlLimit) { + return; + } + + synchronized (this.syncMutex) { + this.cache.put(key, value); + } + } + + public void invalidate(String key) { + synchronized (this.syncMutex) { + this.cache.remove(key); + } + } + + public void invalidateAll(Set keys) { + synchronized (this.syncMutex) { + for (String key : keys) { + this.cache.remove(key); + } + } + + } + + public void invalidateAll() { + synchronized (this.syncMutex) { + this.cache.clear(); + } + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PingTarget.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PingTarget.java new file mode 100644 index 0000000..bfd597d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PingTarget.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2007, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface PingTarget { + + void doPing() throws Exception; + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PreparedQuery.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PreparedQuery.java new file mode 100644 index 0000000..073b799 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/PreparedQuery.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import com.mysql.cj.protocol.Message; + +public interface PreparedQuery extends Query { + + QueryInfo getQueryInfo(); + + void setQueryInfo(QueryInfo queryInfo); + + void checkNullOrEmptyQuery(String sql); + + String getOriginalSql(); + + void setOriginalSql(String originalSql); + + int getParameterCount(); + + void setParameterCount(int parameterCount); + + public QueryBindings getQueryBindings(); + + public void setQueryBindings(QueryBindings queryBindings); + + int computeBatchSize(int numBatchedArgs); + + int getBatchCommandIndex(); + + void setBatchCommandIndex(int batchCommandIndex); + + String asSql(); + + M fillSendPacket(QueryBindings bindings); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Query.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Query.java new file mode 100644 index 0000000..6e1f1a1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Query.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2017, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.ProtocolEntityFactory; +import com.mysql.cj.protocol.Resultset; + +public interface Query { + + public enum CancelStatus { + NOT_CANCELED, CANCELED_BY_USER, CANCELED_BY_TIMEOUT; + } + + /** + * Returns the query id used when profiling + * + * @return id + */ + int getId(); + + void setCancelStatus(CancelStatus cs); + + void checkCancelTimeout(); + + ProtocolEntityFactory getResultSetFactory(); + + Session getSession(); + + Object getCancelTimeoutMutex(); + + void resetCancelledState(); + + void closeQuery(); + + void addBatch(Object batch); + + /** + * Get the batched args as added by the addBatch method(s). + * The list is unmodifiable and might contain any combination of String, + * ClientPreparedQueryBindings, or ServerPreparedQueryBindings depending on how the parameters were + * batched. + * + * @return an unmodifiable List of batched args + */ + List getBatchedArgs(); + + void clearBatchedArgs(); + + QueryAttributesBindings getQueryAttributesBindings(); + + int getResultFetchSize(); + + void setResultFetchSize(int fetchSize); + + Resultset.Type getResultType(); + + void setResultType(Resultset.Type resultSetType); + + int getTimeoutInMillis(); + + void setTimeoutInMillis(int timeoutInMillis); + + void setExecuteTime(long executeTime); + + /** + * Returns the elapsed time for the server to execute the query. + * + * @return the time it took for the server to execute the query. + */ + long getExecuteTime(); + + CancelQueryTask startQueryTimer(Query stmtToCancel, int timeout); + + AtomicBoolean getStatementExecuting(); + + String getCurrentDatabase(); + + void setCurrentDatabase(String currentDb); + + boolean isClearWarningsCalled(); + + void setClearWarningsCalled(boolean clearWarningsCalled); + + void statementBegins(); + + void stopQueryTimer(CancelQueryTask timeoutTask, boolean rethrowCancelReason, boolean checkCancelTimeout); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryAttributesBindings.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryAttributesBindings.java new file mode 100644 index 0000000..1b2709c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryAttributesBindings.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.sql.Statement; +import java.util.function.Consumer; + +/** + * Instances of this interface keep the list of query attributes assigned to a {@link Statement} object. + */ +public interface QueryAttributesBindings { + /** + * Adds a new query attribute to the list of query attributes. Implementations must validate the type of the given the object and reject it or replace it by + * another representation if not supported, by its String version, for example. Query attribute names are not checked for duplication. + * + * @param name + * the query attribute name. + * + * @param value + * the query attribute value. + */ + void setAttribute(String name, Object value); + + /** + * Get the count of query attributes in the list. + * + * @return + * the number of query attributes existing in the list. + */ + int getCount(); + + /** + * Returns an internal representation of the query attribute in the given position of the query attributes list. It's implementation dependent what to do + * when the index value is invalid. + * + * @param index + * the position of the query attribute value to return. + * + * @return + * the {@link BindValue} in the given position of the query attributes list. + */ + BindValue getAttributeValue(int index); + + /** + * Runs through all query attributes while feeding the given {@link Consumer} with each one of them. + * + * @param bindAttribute + * A {@link Consumer} for each one of the single query attributes. + */ + void runThroughAll(Consumer bindAttribute); + + /** + * Removes all query attributes from the query attributes list. + */ + void clearAttributes(); +} \ No newline at end of file diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryBindings.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryBindings.java new file mode 100644 index 0000000..cd1d557 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryBindings.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Calendar; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.result.Field; + +public interface QueryBindings { + + QueryBindings clone(); + + void setColumnDefinition(ColumnDefinition colDef); + + BindValue[] getBindValues(); + + void setBindValues(BindValue[] bindValues); + + /** + * + * @return true if bind values had long data + */ + boolean clearBindValues(); + + void checkParameterSet(int columnIndex); + + void checkAllParametersSet(); + + int getNumberOfExecutions(); + + void setNumberOfExecutions(int numberOfExecutions); + + boolean isLongParameterSwitchDetected(); + + void setLongParameterSwitchDetected(boolean longParameterSwitchDetected); + + AtomicBoolean getSendTypesToServer(); + + BindValue getBinding(int parameterIndex, boolean forLongData); + + void setFromBindValue(int parameterIndex, BindValue bv); + + void setAsciiStream(int parameterIndex, InputStream x, int length); + + void setBigDecimal(int parameterIndex, BigDecimal x); + + void setBigInteger(int parameterIndex, BigInteger x); + + void setBinaryStream(int parameterIndex, InputStream x, int length); + + void setBlob(int parameterIndex, java.sql.Blob x); + + void setBoolean(int parameterIndex, boolean x); + + void setByte(int parameterIndex, byte x); + + void setBytes(int parameterIndex, byte[] x, boolean escapeIfNeeded); + + void setCharacterStream(int parameterIndex, Reader reader, int length); + + void setClob(int i, Clob x); + + void setDate(int parameterIndex, Date x, Calendar cal); + + void setDouble(int parameterIndex, double x); + + void setFloat(int parameterIndex, float x); + + void setInt(int parameterIndex, int x); + + void setLong(int parameterIndex, long x); + + void setNCharacterStream(int parameterIndex, Reader reader, long length); + + void setNClob(int parameterIndex, NClob value); + + void setNString(int parameterIndex, String x); + + void setNull(int parameterIndex); + + boolean isNull(int parameterIndex); + + void setObject(int parameterIndex, Object parameterObj); + + void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType, int scaleOrLength); + + void setShort(int parameterIndex, short x); + + void setString(int parameterIndex, String x); + + void setTime(int parameterIndex, Time x, Calendar cal); + + void setTimestamp(int parameterIndex, Timestamp x, Calendar targetCalendar, Field field, MysqlType targetMysqlType); + + byte[] getBytesRepresentation(int parameterIndex); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryInfo.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryInfo.java new file mode 100644 index 0000000..b9ed260 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryInfo.java @@ -0,0 +1,712 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.nio.ByteBuffer; +import java.util.ArrayList; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.util.SearchMode; +import com.mysql.cj.util.StringInspector; +import com.mysql.cj.util.StringUtils; + +/** + * Represents the "parsed" state of a prepared query, with the statement broken up into its static and dynamic (where parameters are bound) parts. + */ +public class QueryInfo { + private static final String OPENING_MARKERS = "`'\""; + private static final String CLOSING_MARKERS = "`'\""; + private static final String OVERRIDING_MARKERS = ""; + + private static final String INSERT_STATEMENT = "INSERT"; + private static final String REPLACE_STATEMENT = "REPLACE"; + + private static final String VALUE_CLAUSE = "VALUE"; + private static final String AS_CLAUSE = "AS"; + private static final String[] ODKU_CLAUSE = new String[] { "ON", "DUPLICATE", "KEY", "UPDATE" }; + private static final String LAST_INSERT_ID_FUNC = "LAST_INSERT_ID"; + + private QueryInfo baseQueryInfo = null; + + private String sql; + private String encoding; + private QueryReturnType queryReturnType = null; + private int queryLength = 0; + private int queryStartPos = 0; + private char statementFirstChar = Character.MIN_VALUE; + private int batchCount = 1; + private int numberOfPlaceholders = 0; + private int numberOfQueries = 0; + private boolean containsOnDuplicateKeyUpdate = false; + private boolean isRewritableWithMultiValuesClause = false; + private int valuesClauseLength = -1; + private ArrayList valuesEndpoints = new ArrayList<>(); + private byte[][] staticSqlParts = null; + + /** + * Constructs a {@link QueryInfo} object for the given query or multi-query. The parsed result of this query allows to determine the location of the + * placeholders, the query static parts and whether this query can be rewritten as a multi-values clause query. + * + * @param sql + * the query SQL string to parse and analyze + * @param session + * the {@link Session} under which the query analysis must be done. + * @param encoding + * the characters encoding to use when extracting the query static parts as byte arrays. + */ + public QueryInfo(String sql, Session session, String encoding) { + if (sql == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("QueryInfo.NullSql"), session.getExceptionInterceptor()); + } + + this.baseQueryInfo = this; + + this.sql = sql; + this.encoding = encoding; + + boolean noBackslashEscapes = session.getServerSession().isNoBackslashEscapesSet(); + boolean rewriteBatchedStatements = session.getPropertySet().getBooleanProperty(PropertyKey.rewriteBatchedStatements).getValue(); + boolean dontCheckOnDuplicateKeyUpdateInSQL = session.getPropertySet().getBooleanProperty(PropertyKey.dontCheckOnDuplicateKeyUpdateInSQL).getValue(); + + this.queryReturnType = getQueryReturnType(this.sql, noBackslashEscapes); + this.queryLength = this.sql.length(); + + StringInspector strInspector = new StringInspector(this.sql, OPENING_MARKERS, CLOSING_MARKERS, OVERRIDING_MARKERS, + noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__BSE_MRK_COM_MYM_HNT_WS); + + // Skip comments at the beginning of queries. + this.queryStartPos = strInspector.indexOfNextAlphanumericChar(); + if (this.queryStartPos == -1) { + this.queryStartPos = this.queryLength; + } else { + this.numberOfQueries = 1; + this.statementFirstChar = Character.toUpperCase(strInspector.getChar()); + } + + // Only INSERT and REPLACE statements support multi-values clause rewriting. + boolean isInsert = strInspector.matchesIgnoreCase(INSERT_STATEMENT) != -1; + if (isInsert) { + strInspector.incrementPosition(INSERT_STATEMENT.length()); // Advance to the end of "INSERT". + } + boolean isReplace = !isInsert && strInspector.matchesIgnoreCase(REPLACE_STATEMENT) != -1; + if (isReplace) { + strInspector.incrementPosition(REPLACE_STATEMENT.length()); // Advance to the end of "REPLACE". + } + + // Check if the statement has potential to be rewritten as a multi-values clause statement, i.e., if it is an INSERT or REPLACE statement and + // 'rewriteBatchedStatements' is enabled. + boolean rewritableAsMultiValues = (isInsert || isReplace) && rewriteBatchedStatements; + + // Check if should look for ON DUPLICATE KEY UPDATE CLAUSE, i.e., if it is an INSERT statement and `dontCheckOnDuplicateKeyUpdateInSQL` is disabled. + boolean lookForInDuplicateKeyUpdate = isInsert && !dontCheckOnDuplicateKeyUpdateInSQL; + + // Scan placeholders. + int generalEndpointStart = 0; + int valuesEndpointStart = 0; + int valuesClauseBegin = -1; + int valuesClauseEnd = -1; + boolean withinValuesClause = false; + int parensLevel = 0; + int matchEnd = -1; + + // Endpoints for the satement's static sections (parts around placeholders). + ArrayList staticEndpoints = new ArrayList<>(); + + while (strInspector.indexOfNextChar() != -1) { + if (strInspector.getChar() == '?') { + this.numberOfPlaceholders++; + int endpointEnd = strInspector.getPosition(); + staticEndpoints.add(generalEndpointStart); + staticEndpoints.add(endpointEnd); + strInspector.incrementPosition(); + generalEndpointStart = strInspector.getPosition(); // Next section starts after the placeholder. + + if (rewritableAsMultiValues) { + if (valuesClauseBegin == -1) { // There's a placeholder before the VALUES clause. + rewritableAsMultiValues = false; + } else if (valuesClauseEnd != -1) { // There's a placeholder after the end of the VALUES clause. + rewritableAsMultiValues = false; + } else if (withinValuesClause) { + this.valuesEndpoints.add(valuesEndpointStart); + this.valuesEndpoints.add(endpointEnd); + valuesEndpointStart = generalEndpointStart; + } + } + + } else if (strInspector.getChar() == ';') { + strInspector.incrementPosition(); + if (strInspector.indexOfNextNonWsChar() != -1) { + this.numberOfQueries++; + + if (rewritableAsMultiValues) { + rewritableAsMultiValues = false; + valuesClauseBegin = -1; + valuesClauseEnd = -1; + withinValuesClause = false; + parensLevel = 0; + } + + // Check if continue looking for ON DUPLICATE KEY UPDATE. + if (dontCheckOnDuplicateKeyUpdateInSQL || this.containsOnDuplicateKeyUpdate) { + lookForInDuplicateKeyUpdate = false; + } else { + isInsert = strInspector.matchesIgnoreCase(INSERT_STATEMENT) != -1; + if (isInsert) { + strInspector.incrementPosition(INSERT_STATEMENT.length()); // Advance to the end of "INSERT". + } + lookForInDuplicateKeyUpdate = isInsert; + } + } + + } else if (rewritableAsMultiValues || lookForInDuplicateKeyUpdate) { + if (valuesClauseBegin == -1 && strInspector.matchesIgnoreCase(VALUE_CLAUSE) != -1) { // VALUE(S) clause found. + strInspector.incrementPosition(VALUE_CLAUSE.length()); // Advance to the end of "VALUE". + if (strInspector.matchesIgnoreCase("S") != -1) { // Check for the "S" in "VALUE(S)" and advance 1 more character if needed. + strInspector.incrementPosition(); + } + withinValuesClause = true; + strInspector.indexOfNextChar(); // Position on the first values list character. + valuesClauseBegin = strInspector.getPosition(); + + if (rewritableAsMultiValues) { + valuesEndpointStart = valuesClauseBegin; + } + + } else if (withinValuesClause && strInspector.getChar() == '(') { + parensLevel++; + strInspector.incrementPosition(); + + } else if (withinValuesClause && strInspector.getChar() == ')') { + parensLevel--; + if (parensLevel < 0) { + parensLevel = 0; // Keep going, not checking for syntax validity. + } + strInspector.incrementPosition(); + valuesClauseEnd = strInspector.getPosition(); // It may not be the end of the VALUES clause yet but save it for later. + + } else if (withinValuesClause && parensLevel == 0 && isInsert && strInspector.matchesIgnoreCase(AS_CLAUSE) != -1) { // End of VALUES clause. + if (valuesClauseEnd == -1) { + valuesClauseEnd = strInspector.getPosition(); + } + withinValuesClause = false; + strInspector.incrementPosition(AS_CLAUSE.length()); // Advance to the end of "AS". + + if (rewritableAsMultiValues) { + this.valuesEndpoints.add(valuesEndpointStart); + this.valuesEndpoints.add(valuesClauseEnd); + } + + } else if (withinValuesClause && parensLevel == 0 && isInsert && (matchEnd = strInspector.matchesIgnoreCase(ODKU_CLAUSE)) != -1) { // End of VALUES clause. + if (valuesClauseEnd == -1) { + valuesClauseEnd = strInspector.getPosition(); + } + withinValuesClause = false; + lookForInDuplicateKeyUpdate = false; + this.containsOnDuplicateKeyUpdate = true; + strInspector.incrementPosition(matchEnd - strInspector.getPosition()); // Advance to the end of "ON DUPLICATE KEY UPDATE". + + if (rewritableAsMultiValues) { + this.valuesEndpoints.add(valuesEndpointStart); + this.valuesEndpoints.add(valuesClauseEnd); + } + + } else if (rewritableAsMultiValues && valuesClauseBegin != -1 && strInspector.matchesIgnoreCase(LAST_INSERT_ID_FUNC) != -1) { + rewritableAsMultiValues = false; + strInspector.incrementPosition(LAST_INSERT_ID_FUNC.length()); // Advance to the end of "LAST_INSERT_ID". + + } else { + strInspector.incrementPosition(); + } + + } else { + strInspector.incrementPosition(); + } + } + staticEndpoints.add(generalEndpointStart); + staticEndpoints.add(this.queryLength); + if (rewritableAsMultiValues) { + if (withinValuesClause) { + withinValuesClause = false; + this.valuesEndpoints.add(valuesEndpointStart); + this.valuesEndpoints.add(valuesClauseEnd != -1 ? valuesClauseEnd : this.queryLength); + } + + if (valuesClauseBegin != -1) { + this.valuesClauseLength = (valuesClauseEnd != -1 ? valuesClauseEnd : this.queryLength) - valuesClauseBegin; + } else { + rewritableAsMultiValues = false; + } + } else { + this.valuesEndpoints.clear(); + } + this.isRewritableWithMultiValuesClause = rewritableAsMultiValues; + + this.staticSqlParts = new byte[this.numberOfPlaceholders + 1][]; + for (int i = 0, j = 0; i <= this.numberOfPlaceholders; i++) { + int begin = staticEndpoints.get(j++); + int end = staticEndpoints.get(j++); + int length = end - begin; + this.staticSqlParts[i] = StringUtils.getBytes(this.sql, begin, length, this.encoding); + } + } + + /** + * Constructs a {@link QueryInfo} object with a multi-value clause for the specified batch count, that stems from the specified baseQueryInfo. + * + * @param baseQueryInfo + * the {@link QueryInfo} instance that provides the query static parts used to create the new instance now augmented to accommodate the extra + * number of parameters + * @param batchCount + * the number of batches, i.e., the number of times the VALUES clause needs to be repeated inside the new query + */ + private QueryInfo(QueryInfo baseQueryInfo, int batchCount) { + this.baseQueryInfo = baseQueryInfo; + + this.sql = null; + this.encoding = this.baseQueryInfo.encoding; + this.queryReturnType = this.baseQueryInfo.queryReturnType; + this.queryLength = 0; + this.queryStartPos = this.baseQueryInfo.queryStartPos; + this.statementFirstChar = this.baseQueryInfo.statementFirstChar; + this.batchCount = batchCount; + this.numberOfPlaceholders = this.baseQueryInfo.numberOfPlaceholders * this.batchCount; + this.numberOfQueries = 1; + this.containsOnDuplicateKeyUpdate = this.baseQueryInfo.containsOnDuplicateKeyUpdate; + this.isRewritableWithMultiValuesClause = true; + this.valuesClauseLength = -1; + + if (this.numberOfPlaceholders == 0) { + this.staticSqlParts = new byte[1][]; + + int begin = this.baseQueryInfo.valuesEndpoints.get(0); + int end = this.baseQueryInfo.valuesEndpoints.get(1); + int length = end - begin; + byte[] valuesSegment = StringUtils.getBytes(this.baseQueryInfo.sql, begin, length, this.encoding); + byte[] bindingSegment = StringUtils.getBytes(",", this.encoding); + + // First batch is in the query. + ByteBuffer queryByteBuffer = ByteBuffer.allocate(this.baseQueryInfo.queryLength + (length + bindingSegment.length) * (batchCount - 1)); + + // Head section: from the start to the end of the values - includes first values batch. + queryByteBuffer.put(StringUtils.getBytes(this.baseQueryInfo.sql, 0, this.baseQueryInfo.valuesEndpoints.get(1), this.encoding)); + + // Values section: repeat as many times as needed to complete the requested batch count. + for (int i = 0; i < this.batchCount - 1; i++) { + // Add the segment that binds two batches followed by the next batch. + queryByteBuffer.put(bindingSegment); + queryByteBuffer.put(valuesSegment); + } + + // Tail section: from the end of values until the end. + begin = this.baseQueryInfo.valuesEndpoints.get(1); + end = this.baseQueryInfo.queryLength; + length = end - begin; + queryByteBuffer.put(StringUtils.getBytes(this.baseQueryInfo.sql, begin, length, this.encoding)); + + this.staticSqlParts[0] = queryByteBuffer.array(); + + } else { + this.staticSqlParts = new byte[this.numberOfPlaceholders + 1][]; + + // Build the values binding segment: [values_end][comma][values_begin], e.g., "),(". + int begin = this.baseQueryInfo.valuesEndpoints.get(this.baseQueryInfo.valuesEndpoints.size() - 2); + int end = this.baseQueryInfo.valuesEndpoints.get(this.baseQueryInfo.valuesEndpoints.size() - 1); + int length = end - begin; + byte[] valuesEndSegment = StringUtils.getBytes(this.baseQueryInfo.sql, begin, length, this.encoding); + byte[] delimiter = StringUtils.getBytes(",", this.encoding); + begin = this.baseQueryInfo.valuesEndpoints.get(0); + end = this.baseQueryInfo.valuesEndpoints.get(1); + length = end - begin; + byte[] valuesBeginSegment = StringUtils.getBytes(this.baseQueryInfo.sql, begin, length, this.encoding); + ByteBuffer bindingSegmentByteBuffer = ByteBuffer.allocate(valuesEndSegment.length + delimiter.length + valuesBeginSegment.length); + bindingSegmentByteBuffer.put(valuesEndSegment).put(delimiter).put(valuesBeginSegment); + byte[] bindingSegment = bindingSegmentByteBuffer.array(); + + // Head section: same as in the original query. + this.staticSqlParts[0] = this.baseQueryInfo.staticSqlParts[0]; + + // Values section: repeat as many times as the requested batch count. + for (int i = 0, p = 1; i < this.batchCount; i++, p++) { + for (int j = 1; j < this.baseQueryInfo.staticSqlParts.length - 1; j++, p++) { + this.staticSqlParts[p] = this.baseQueryInfo.staticSqlParts[j]; + } + // Add the segment that binds two batches. + this.staticSqlParts[p] = bindingSegment; + } + + // Tail section: same as in the original query. + this.staticSqlParts[this.staticSqlParts.length - 1] = this.baseQueryInfo.staticSqlParts[this.baseQueryInfo.staticSqlParts.length - 1]; + } + } + + /** + * Returns the number of queries identified in the original SQL string. Different queries are identified by the presence of the query delimiter character, + * i.e., a semicolon. + * + * @return the number of queries identified in the original SQL string + */ + public int getNumberOfQueries() { + return this.numberOfQueries; + } + + /** + * Returns the return type of the parsed query. This operation does not take into consideration the multiplicity of queries in the specified SQL. + * + * @return the return type of the parsed query + */ + public QueryReturnType getQueryReturnType() { + return this.queryReturnType; + } + + /** + * Returns the first character of the statement from the query used to build this {@link QueryInfo}. + * + * @return the first character of the statement + */ + public char getFirstStmtChar() { + /* TODO: First char based logic is questionable. Consider replacing by statement check. */ + return this.baseQueryInfo.statementFirstChar; + } + + /** + * If this object represents a query that is re-writable as a multi-values statement and if rewriting batched statements is enabled, then returns the + * length of the parsed VALUES clause section, including the placeholder characters themselves, otherwise returns -1. + * + * @return the length of the parsed VALUES clause section, including the placeholder characters themselves, otherwise returns -1 + */ + public int getValuesClauseLength() { + return this.baseQueryInfo.valuesClauseLength; + } + + /** + * Does this query info represent a query that contains an ON DUPLICATE KEY UPDATE clause? This operation does not take into consideration the multiplicity + * of queries in the original SQL. + * + * Checking whether the original query contains an ON DUPLICATE KEY UPDATE clause is conditional to how the connection properties + * `dontCheckOnDuplicateKeyUpdateInSQL` and `rewriteBatchedStatements` are set, with `rewriteBatchedStatements=true` implicitly disabling + * `dontCheckOnDuplicateKeyUpdateInSQL`. + * + * @return true if the query or any of the original queries contain an ON DUPLICATE KEY UPDATE clause. + */ + public boolean containsOnDuplicateKeyUpdate() { + return this.containsOnDuplicateKeyUpdate; + } + + /** + * Returns the static sections of the parsed query, as byte arrays, split by the places where the placeholders were located. + * + * @return the static sections of the parsed query, as byte arrays, split by the places where the placeholders were located + */ + public byte[][] getStaticSqlParts() { + return this.staticSqlParts; + } + + /** + * Can this query be rewritten as a multi-values clause? + * + * @return true if the query can be rewritten as a multi-values query. + */ + public boolean isRewritableWithMultiValuesClause() { + return this.isRewritableWithMultiValuesClause; + } + + /** + * Returns a {@link QueryInfo} for a multi-values INSERT/REPLACE assembled for the specified batch count, without re-parsing. + * + * @param count + * the number of parameter batches + * @return {@link QueryInfo} + */ + public QueryInfo getQueryInfoForBatch(int count) { + if (count == 1) { + return this.baseQueryInfo; + } + if (count == this.batchCount) { + return this; + } + + if (!this.isRewritableWithMultiValuesClause) { + return null; + } + + return new QueryInfo(this.baseQueryInfo, count); + } + + /** + * Returns a preparable query for the batch count of this {@link QueryInfo}. + * + * @return + * a preparable query string with the appropriate number of placeholders + */ + public String getSqlForBatch() { + if (this.batchCount == 1) { + return this.baseQueryInfo.sql; + } + + int size = this.baseQueryInfo.queryLength + (this.batchCount - 1) * this.baseQueryInfo.valuesClauseLength + this.batchCount - 1; + StringBuilder buf = new StringBuilder(size); + buf.append(StringUtils.toString(this.staticSqlParts[0], this.encoding)); + for (int i = 1; i < this.staticSqlParts.length; i++) { + buf.append("?").append(StringUtils.toString(this.staticSqlParts[i], this.encoding)); + } + return buf.toString(); + } + + /** + * Returns a preparable query for the specified batch count. + * + * @param count + * number of parameter batches + * @return a preparable query string with the appropriate number of placeholders + */ + public String getSqlForBatch(int count) { + QueryInfo batchInfo = getQueryInfoForBatch(count); + return batchInfo.getSqlForBatch(); + } + + /** + * Finds and returns the position of the first non-whitespace character from the specified SQL, skipping comments and quoted text. + * + * @param sql + * the query to search + * @param noBackslashEscapes + * whether backslash escapes are disabled or not + * @return the position of the first character of the query + */ + public static int indexOfStatementKeyword(String sql, boolean noBackslashEscapes) { + return StringUtils.indexOfNextAlphanumericChar(0, sql, OPENING_MARKERS, CLOSING_MARKERS, OVERRIDING_MARKERS, + noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__BSE_MRK_COM_MYM_HNT_WS); + } + + /** + * Finds and returns the first non-whitespace character from the specified SQL, skipping comments and quoted text. + * + * @param sql + * the query to search + * @param noBackslashEscapes + * whether backslash escapes are disabled or not + * @return the first character of the query, in upper case + */ + public static char firstCharOfStatementUc(String sql, boolean noBackslashEscapes) { + int statementKeywordPos = indexOfStatementKeyword(sql, noBackslashEscapes); + if (statementKeywordPos == -1) { + return Character.MIN_VALUE; + } + return Character.toUpperCase(sql.charAt(statementKeywordPos)); + } + + /** + * Checks whether the given query is safe to run in a read-only session. In case of doubt it is assumed to be safe. This operation does not take into + * consideration the multiplicity of queries in the specified SQL. + * + * @param sql + * the query to check + * @param noBackslashEscapes + * whether backslash escapes are disabled or not + * @return true if the query is read-only safe, false otherwise. + */ + public static boolean isReadOnlySafeQuery(String sql, boolean noBackslashEscapes) { + /* + * Read-only unsafe statements: + * - ALTER; CHANGE; CREATE; DELETE; DROP; GRANT; IMPORT; INSERT; INSTALL; LOAD; OPTIMIZE; RENAME; REPAIR; REPLACE; RESET; REVOKE; TRUNCATE; UNINSTALL; + * - UPDATE; WITH ... DELETE|UPDATE + * + * Read-only safe statements: + * - ANALYZE; BEGIN; BINLOG; CACHE; CALL; CHECK; CHECKSUM; CLONE; COMMIT; DEALLOCATE; DESC; DESCRIBE; EXECUTE; EXPLAIN; FLUSH; GET; HANDLER; HELP; KILL; + * - LOCK; PREPARE; PURGE; RELEASE; RESIGNAL; ROLLBACK; SAVEPOINT; SELECT; SET; SHOW; SIGNAL; START; STOP; TABLE; UNLOCK; USE; VALUES; + * - WITH ... [SELECT|TABLE|VALUES]; XA + */ + int statementKeywordPos = indexOfStatementKeyword(sql, noBackslashEscapes); + if (statementKeywordPos == -1) { + return true; // Assume it's safe. + } + char firstStatementChar = Character.toUpperCase(sql.charAt(statementKeywordPos)); + if (firstStatementChar == 'A' && StringUtils.startsWithIgnoreCaseAndWs(sql, "ALTER", statementKeywordPos)) { + return false; + } else if (firstStatementChar == 'C' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "CHANGE", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "CREATE", statementKeywordPos))) { + return false; + } else if (firstStatementChar == 'D' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "DELETE", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "DROP", statementKeywordPos))) { + return false; + } else if (firstStatementChar == 'G' && StringUtils.startsWithIgnoreCaseAndWs(sql, "GRANT", statementKeywordPos)) { + return false; + } else if (firstStatementChar == 'I' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "IMPORT", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "INSERT", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "INSTALL", statementKeywordPos))) { + return false; + } else if (firstStatementChar == 'L' && StringUtils.startsWithIgnoreCaseAndWs(sql, "LOAD", statementKeywordPos)) { + return false; + } else if (firstStatementChar == 'O' && StringUtils.startsWithIgnoreCaseAndWs(sql, "OPTIMIZE", statementKeywordPos)) { + return false; + } else if (firstStatementChar == 'R' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "RENAME", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "REPAIR", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "REPLACE", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "RESET", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "REVOKE", statementKeywordPos))) { + return false; + } else if (firstStatementChar == 'T' && StringUtils.startsWithIgnoreCaseAndWs(sql, "TRUNCATE", statementKeywordPos)) { + return false; + } else if (firstStatementChar == 'U' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "UNINSTALL", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "UPDATE", statementKeywordPos))) { + return false; + } else if (firstStatementChar == 'W' && StringUtils.startsWithIgnoreCaseAndWs(sql, "WITH", statementKeywordPos)) { + String context = getContextForWithStatement(sql, noBackslashEscapes); + return context == null || !context.equalsIgnoreCase("DELETE") && !context.equalsIgnoreCase("UPDATE"); + } + return true; // Assume it's safe by default. + } + + /** + * Returns the type of return that can be expected from executing the given query. This operation does not take into consideration the multiplicity + * of queries in the specified SQL. + * + * @param sql + * the query to check + * @param noBackslashEscapes + * whether backslash escapes are disabled or not + * @return the return type that can be expected from the given query, one of the elements of {@link QueryReturnType}. + */ + public static QueryReturnType getQueryReturnType(String sql, boolean noBackslashEscapes) { + /* + * Statements that return results: + * - ANALYZE; CHECK/CHECKSUM; DESC/DESCRIBE; EXPLAIN; HELP; OPTIMIZE; REPAIR; SELECT; SHOW; TABLE; VALUES; WITH ... SELECT|TABLE|VALUES ...; XA RECOVER; + * + * Statements that may return results: + * - CALL; EXECUTE; + * + * Statements that do not return results: + * - ALTER; BINLOG; CACHE; CHANGE; CLONE; COMMIT; CREATE; DEALLOCATE; DELETE; DO; DROP; FLUSH; GET; GRANT; HANDLER; IMPORT; INSERT; INSTALL; KILL; LOAD; + * - LOCK; PREPARE; PURGE; RELEASE; RENAME; REPLACE; RESET; RESIGNAL; RESTART; REVOKE; ROLLBACK; SAVEPOINT; SET; SHUTDOWN; SIGNAL; START; STOP; + * - TRUNCATE; UNINSTALL; UNLOCK; UPDATE; USE; WITH ... DELETE|UPDATE ...; XA [!RECOVER]; + */ + int statementKeywordPos = indexOfStatementKeyword(sql, noBackslashEscapes); + if (statementKeywordPos == -1) { + return QueryReturnType.NONE; + } + char firstStatementChar = Character.toUpperCase(sql.charAt(statementKeywordPos)); + if (firstStatementChar == 'A' && StringUtils.startsWithIgnoreCaseAndWs(sql, "ANALYZE", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'C' && StringUtils.startsWithIgnoreCaseAndWs(sql, "CALL", statementKeywordPos)) { + return QueryReturnType.MAY_PRODUCE_RESULT_SET; + } else if (firstStatementChar == 'C' && StringUtils.startsWithIgnoreCaseAndWs(sql, "CHECK", statementKeywordPos)) { // Also matches "CHECKSUM". + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'D' && StringUtils.startsWithIgnoreCaseAndWs(sql, "DESC", statementKeywordPos)) { // Also matches "DESCRIBE". + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'E' && StringUtils.startsWithIgnoreCaseAndWs(sql, "EXPLAIN", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'E' && StringUtils.startsWithIgnoreCaseAndWs(sql, "EXECUTE", statementKeywordPos)) { + return QueryReturnType.MAY_PRODUCE_RESULT_SET; + } else if (firstStatementChar == 'H' && StringUtils.startsWithIgnoreCaseAndWs(sql, "HELP", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'O' && StringUtils.startsWithIgnoreCaseAndWs(sql, "OPTIMIZE", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'R' && StringUtils.startsWithIgnoreCaseAndWs(sql, "REPAIR", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'S' && (StringUtils.startsWithIgnoreCaseAndWs(sql, "SELECT", statementKeywordPos) + || StringUtils.startsWithIgnoreCaseAndWs(sql, "SHOW", statementKeywordPos))) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'T' && StringUtils.startsWithIgnoreCaseAndWs(sql, "TABLE", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'V' && StringUtils.startsWithIgnoreCaseAndWs(sql, "VALUES", statementKeywordPos)) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else if (firstStatementChar == 'W' && StringUtils.startsWithIgnoreCaseAndWs(sql, "WITH", statementKeywordPos)) { + String context = getContextForWithStatement(sql, noBackslashEscapes); + if (context == null) { + return QueryReturnType.MAY_PRODUCE_RESULT_SET; + } else if (context.equalsIgnoreCase("SELECT") || context.equalsIgnoreCase("TABLE") || context.equalsIgnoreCase("VALUES")) { + return QueryReturnType.PRODUCES_RESULT_SET; + } else { + return QueryReturnType.DOES_NOT_PRODUCE_RESULT_SET; + } + } else if (firstStatementChar == 'X' && StringUtils.indexOfIgnoreCase(statementKeywordPos, sql, new String[] { "XA", "RECOVER" }, OPENING_MARKERS, + CLOSING_MARKERS, noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__FULL) == statementKeywordPos) { + return QueryReturnType.PRODUCES_RESULT_SET; + } + return QueryReturnType.DOES_NOT_PRODUCE_RESULT_SET; + } + + /** + * Returns the context of the WITH statement. The context can be: SELECT, TABLE, VALUES, UPDATE or DELETE. This operation does not take into consideration + * the multiplicity of queries in the specified SQL. + * + * @param sql + * the query to search + * @param noBackslashEscapes + * whether backslash escapes are disabled or not + * @return the context of the WITH statement or null if failed to find it + */ + private static String getContextForWithStatement(String sql, boolean noBackslashEscapes) { + // Must remove all comments first. + String commentsFreeSql = StringUtils.stripCommentsAndHints(sql, OPENING_MARKERS, CLOSING_MARKERS, !noBackslashEscapes); + + // Iterate through statement words, skipping all sub-queries sections enclosed by parens. + StringInspector strInspector = new StringInspector(commentsFreeSql, OPENING_MARKERS + "(", CLOSING_MARKERS + ")", OPENING_MARKERS, + noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__BSE_MRK_COM_MYM_HNT_WS); + boolean asFound = false; + while (true) { + int nws = strInspector.indexOfNextNonWsChar(); + if (nws == -1) { // No more parts to analyze. + return null; + } + int ws = strInspector.indexOfNextWsChar(); + if (ws == -1) { // End of query. + ws = commentsFreeSql.length(); + } + String section = commentsFreeSql.substring(nws, ws); + if (!asFound && section.equalsIgnoreCase(AS_CLAUSE)) { + asFound = true; // Since the subquery part is skipped, this must be followed by a "," or the context statement. + } else if (asFound) { + if (section.equalsIgnoreCase(",")) { + asFound = false; // Another CTE is expected. + } else { + return section; + } + } + } + } + + /** + * Checks whether the specified SQL contains or not an ON DUPLICATE KEY UPDATE clause. This operation does not take into consideration the multiplicity of + * queries in the specified SQL. + * + * @param sql + * the query to search + * @param noBackslashEscapes + * whether backslash escapes are disabled or not. + * @return true if the query contains an ON DUPLICATE KEY UPDATE clause, false otherwise + */ + public static boolean containsOnDuplicateKeyUpdateClause(String sql, boolean noBackslashEscapes) { + return StringUtils.indexOfIgnoreCase(0, sql, ODKU_CLAUSE, OPENING_MARKERS, CLOSING_MARKERS, + noBackslashEscapes ? SearchMode.__MRK_COM_MYM_HNT_WS : SearchMode.__BSE_MRK_COM_MYM_HNT_WS) != -1; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryResult.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryResult.java new file mode 100644 index 0000000..56d51ee --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryResult.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface QueryResult { + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryReturnType.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryReturnType.java new file mode 100644 index 0000000..220419e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/QueryReturnType.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +/** + * The possible return types from executing queries. + */ +public enum QueryReturnType { + PRODUCES_RESULT_SET, MAY_PRODUCE_RESULT_SET, DOES_NOT_PRODUCE_RESULT_SET, NONE; +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/ServerVersion.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/ServerVersion.java new file mode 100644 index 0000000..9a6c90c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/ServerVersion.java @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +/** + * A server version. + */ +public class ServerVersion implements Comparable { + private String completeVersion; + private Integer major; + private Integer minor; + private Integer subminor; + + public ServerVersion(String completeVersion, int major, int minor, int subminor) { + this.completeVersion = completeVersion; + this.major = major; + this.minor = minor; + this.subminor = subminor; + } + + public ServerVersion(int major, int minor, int subminor) { + this(null, major, minor, subminor); + } + + public int getMajor() { + return this.major; + } + + public int getMinor() { + return this.minor; + } + + public int getSubminor() { + return this.subminor; + } + + /** + * A string representation of this version. If this version was parsed from, or provided with, a "complete" string which may contain more than just the + * version number, this string is returned verbatim. Otherwise, a string representation of the version numbers is given. + * + * @return string version representation + */ + @Override + public String toString() { + if (this.completeVersion != null) { + return this.completeVersion; + } + return String.format("%d.%d.%d", this.major, this.minor, this.subminor); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || !ServerVersion.class.isAssignableFrom(obj.getClass())) { + return false; + } + ServerVersion another = (ServerVersion) obj; + if (this.getMajor() != another.getMajor() || this.getMinor() != another.getMinor() || this.getSubminor() != another.getSubminor()) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int hash = 23; + hash += 19 * hash + this.major; + hash += 19 * hash + this.minor; + hash += 19 * hash + this.subminor; + return hash; + } + + public int compareTo(ServerVersion other) { + int c; + if ((c = this.major.compareTo(other.getMajor())) != 0) { + return c; + } else if ((c = this.minor.compareTo(other.getMinor())) != 0) { + return c; + } + return this.subminor.compareTo(other.getSubminor()); + } + + /** + * Does this version meet the minimum specified by `min'? + * + * @param min + * The minimum version to compare against. + * @return true if version meets the minimum specified by `min' + */ + public boolean meetsMinimum(ServerVersion min) { + return compareTo(min) >= 0; + } + + /** + * Parse the server version into major/minor/subminor. + * + * @param versionString + * string version representation + * @return {@link ServerVersion} + */ + public static ServerVersion parseVersion(final String versionString) { + int point = versionString.indexOf('.'); + + if (point != -1) { + try { + int serverMajorVersion = Integer.parseInt(versionString.substring(0, point)); + + String remaining = versionString.substring(point + 1, versionString.length()); + point = remaining.indexOf('.'); + + if (point != -1) { + int serverMinorVersion = Integer.parseInt(remaining.substring(0, point)); + + remaining = remaining.substring(point + 1, remaining.length()); + + int pos = 0; + + while (pos < remaining.length()) { + if ((remaining.charAt(pos) < '0') || (remaining.charAt(pos) > '9')) { + break; + } + + pos++; + } + + int serverSubminorVersion = Integer.parseInt(remaining.substring(0, pos)); + + return new ServerVersion(versionString, serverMajorVersion, serverMinorVersion, serverSubminorVersion); + } + } catch (NumberFormatException NFE1) { + } + } + + // can't parse the server version + return new ServerVersion(0, 0, 0); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Session.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Session.java new file mode 100644 index 0000000..c54e8e1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/Session.java @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.net.SocketAddress; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collector; + +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.log.Log; +import com.mysql.cj.log.ProfilerEventHandler; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.Protocol; +import com.mysql.cj.protocol.ResultBuilder; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.result.Row; + +/** + * {@link Session} exposes logical level which user API uses internally to call {@link Protocol} methods. + * It's a higher-level abstraction than MySQL server session ({@link ServerSession}). {@link Protocol} and {@link ServerSession} methods + * should never be used directly from user API. + * + */ +public interface Session { + + PropertySet getPropertySet(); + + MessageBuilder getMessageBuilder(); + + /** + * Re-authenticates as the given user and password + * + * @param userName + * DB user name + * @param password + * DB user password + * @param database + * database name + * + */ + void changeUser(String userName, String password, String database); + + ExceptionInterceptor getExceptionInterceptor(); + + void setExceptionInterceptor(ExceptionInterceptor exceptionInterceptor); + + /** + * Log-off of the MySQL server and close the socket. + * + */ + void quit(); + + /** + * Clobbers the physical network connection and marks this session as closed. + */ + void forceClose(); + + /** + * Does the version of the MySQL server we are connected to meet the given + * minimums? + * + * @param major + * major version number + * @param minor + * minor version number + * @param subminor + * sub-minor version number + * @return true if current server version equal or higher than provided one + */ + boolean versionMeetsMinimum(int major, int minor, int subminor); + + long getThreadId(); + + boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag); + + /** + * Returns the log mechanism that should be used to log information from/for this Session. + * + * @return the Log instance to use for main.logging messages. + */ + Log getLog(); + + /** + * Returns the current ProfilerEventHandler or initializes a new one if none exists. + * + * @return the {@link ProfilerEventHandler} object. + */ + ProfilerEventHandler getProfilerEventHandler(); + + HostInfo getHostInfo(); + + String getQueryTimingUnits(); + + ServerSession getServerSession(); + + boolean isSSLEstablished(); + + SocketAddress getRemoteSocketAddress(); + + String getProcessHost(); + + /** + * Add listener for this session status changes. + * + * @param l + * {@link SessionEventListener} instance. + */ + void addListener(SessionEventListener l); + + /** + * Remove session listener. + * + * @param l + * {@link SessionEventListener} instance. + */ + void removeListener(SessionEventListener l); + + public static interface SessionEventListener { + void handleNormalClose(); + + void handleReconnect(); + + void handleCleanup(Throwable whyCleanedUp); + } + + boolean isClosed(); + + String getIdentifierQuoteString(); + + DataStoreMetadata getDataStoreMetadata(); + + /** + * Synchronously query database with applying rows filtering and mapping. + * + * @param message + * query message + * @param rowFilter + * row filter function + * @param rowMapper + * row map function + * @param collector + * result collector + * @param + * Message type + * @param + * Row type + * @param + * Result type + * @return List of rows + */ + default RES query(M message, Predicate rowFilter, Function rowMapper, Collector collector) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Synchronously query database. + * + * @param message + * query message + * @param resultBuilder + * ResultBuilder instance + * @param + * Message type + * @param + * Result type + * @return {@link QueryResult} object + */ + default R query(M message, ResultBuilder resultBuilder) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Asynchronously query database. + * + * @param message + * query message + * @param resultBuilder + * ResultBuilder instance + * @param + * Message type + * @param + * Result type + * @return CompletableFuture providing a {@link QueryResult} object + */ + default CompletableFuture queryAsync(M message, ResultBuilder resultBuilder) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/TransactionEventHandler.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/TransactionEventHandler.java new file mode 100644 index 0000000..3316fa3 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/TransactionEventHandler.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +public interface TransactionEventHandler { + + void transactionBegun(); + + void transactionCompleted(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/WarningListener.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/WarningListener.java new file mode 100644 index 0000000..b9d6c30 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/WarningListener.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +/** + * A warning listener is notified of warnings as they happen throughout the driver. They can be queued for consumption by JDBC clients, thrown as exceptions, or + * ignored. + */ +public interface WarningListener { + void warningEncountered(String warning); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/FidoAuthenticationCallback.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/FidoAuthenticationCallback.java new file mode 100644 index 0000000..17f2646 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/FidoAuthenticationCallback.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.callback; + +/** + * The callback object used by the authentication plugin AuthenticationFidoClient to exchange authenticator data between the driver and the client application. + * + * Applications must implement a MysqlCallbackHandler to manage the interaction with authenticator devices and provide the data required to proceed with FIDO + * authentication. Such handler receives an instance of this class, which must then be used to obtain the data to send to the device and to submit the produced + * authenticator data and signature into the driver. + */ +public class FidoAuthenticationCallback implements MysqlCallback { + // FIDO inputs. + private byte[] scramble; + private String relyingPartyId; + private byte[] credentialId; + + // FIDO outputs. + private byte[] authenticatorData; + private byte[] signature; + + /** + * Instances of this object are used to exchange FIDO data between the client application and the driver and is responsible for managing all the + * interactions with the FIDO authenticator devices. + * + * @param scramble + * @param relyingPartyId + * @param credentialId + */ + public FidoAuthenticationCallback(byte[] scramble, String relyingPartyId, byte[] credentialId) { + this.scramble = scramble; + this.relyingPartyId = relyingPartyId; + this.credentialId = credentialId; + } + + /** + * Returns the FIDO Client Data Hash (scramble) for the coming authenticator interaction. + * + * @return + * the scramble + */ + public byte[] getScramble() { + return this.scramble; + } + + /** + * Returns the FIDO Relying Party ID for the coming authenticator interaction. + * + * @return + * the relying party id + */ + public String getRelyingPartyId() { + return this.relyingPartyId; + } + + /** + * Returns the FIDO Credential ID for the coming authenticator interaction. + * + * @return + * the credential id + */ + public byte[] getCredentialId() { + return this.credentialId; + } + + /** + * Sets the FIDO Authenticator Data produced by the authenticator interaction. + * + * @param authenticatorData + * the authenticator data + */ + public void setAuthenticatorData(byte[] authenticatorData) { + this.authenticatorData = authenticatorData; + } + + /** + * Returns the FIDO Authenticator Data produced by the authenticator interaction. + * + * @return + * the authenticator data + */ + public byte[] getAuthenticatorData() { + return this.authenticatorData; + } + + /** + * Sets the FIDO Signature produced by the authenticator interaction. + * + * @param signature + * the signature + */ + public void setSignature(byte[] signature) { + this.signature = signature; + } + + /** + * Returns the FIDO Signature produced by the authenticator interaction + * + * @return + * the signature + */ + public byte[] getSignature() { + return this.signature; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallback.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallback.java new file mode 100644 index 0000000..ba60c64 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallback.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.callback; + +/** + * Implementations of this interface can be passed to a {@link MysqlCallbackHandler} so that the owner of the callback handler and its caller can share data in + * a way that would otherwise require tighter coupling. + */ +public interface MysqlCallback { +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallbackHandler.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallbackHandler.java new file mode 100644 index 0000000..b3e498b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/MysqlCallbackHandler.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.callback; + +/** + * A functional interface for implementing callback handlers. + * + * The single method {@link MysqlCallbackHandler#handle(MysqlCallback)} is called by the classes where the callback handler is passed when they need to share + * data with the caller. The kind of data to exchange depends on the implementations of {@link MysqlCallback} they choose to use. + */ +@FunctionalInterface +public interface MysqlCallbackHandler { + /** + * Exchanges information between the caller of this method and the owner of the {@link MysqlCallbackHandler} instance. The method can be called multiple + * times with different callback implementations to exchange different types of information. A typical {@link MysqlCallbackHandler} implementation looks + * like: + * + *
    +     * private MysqlCallbackHandler callbackHandler = (cb) -> {
    +     *     if (cb instanceof UsernameCallback) {
    +     *         this.username = ((UsernameCallback) cb).getUsername();
    +     *     }
    +     * };
    +     * 
    + * + * @param cb + * + */ + void handle(MysqlCallback cb); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/UsernameCallback.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/UsernameCallback.java new file mode 100644 index 0000000..1f6cbf1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/callback/UsernameCallback.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.callback; + +/** + * A callback that can be used to exchange username information to a callback handler owner. + */ +public class UsernameCallback implements MysqlCallback { + private String username; + + public UsernameCallback(String username) { + this.username = username; + } + + /** + * Get the username provided by the caller of {@link MysqlCallbackHandler#handle(MysqlCallback)}. + * + * @return + * the username to pass over to the callback handler. + */ + public String getUsername() { + return this.username; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionPropertiesTransform.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionPropertiesTransform.java new file mode 100644 index 0000000..9eb4f97 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionPropertiesTransform.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Properties; + +/** + * Implement this interface, and pass the class name as the 'propertiesTransform' property in your URL, and the driver will pass the properties it has + * parsed to your transform implementation so that you can modify/substitute/add any that you desire. + */ +public interface ConnectionPropertiesTransform { + /** + * The driver will call this method if the user has loaded your + * implementation of this interface by specifying the 'propertiesTransform' + * property in their URL. + * + * @param props + * the properties as passed by the driver (never null) + * + * @return the same properties with any transformations that your + * implementation has made + * + */ + Properties transformProperties(Properties props); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java new file mode 100644 index 0000000..c4677ec --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java @@ -0,0 +1,830 @@ +/* + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import static com.mysql.cj.util.StringUtils.isNullOrEmpty; + +import java.io.IOException; +import java.io.InputStream; +import java.sql.DriverManager; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; + +import javax.naming.NamingException; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; +import com.mysql.cj.exceptions.UnsupportedConnectionStringException; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.util.DnsSrv; +import com.mysql.cj.util.DnsSrv.SrvRecord; +import com.mysql.cj.util.LRUCache; +import com.mysql.cj.util.Util; + +/** + * A container for a database URL and a collection of given connection arguments. + * The connection string is parsed and split by its components, each of which is then processed and fixed according to the needs of the connection type. + * This abstract class holds all common behavior to all connection string types. Its subclasses must implement their own specifics such as classifying hosts by + * type or apply validation rules. + */ +public abstract class ConnectionUrl implements DatabaseUrlContainer { + public static final String DEFAULT_HOST = "localhost"; + public static final int DEFAULT_PORT = 3306; + + private static final LRUCache connectionUrlCache = new LRUCache<>(100); + private static final ReadWriteLock rwLock = new ReentrantReadWriteLock(); + + /** + * The rules describing the number of hosts a database URL may contain. + */ + public enum HostsCardinality { + SINGLE { + @Override + public boolean assertSize(int n) { + return n == 1; + } + }, + MULTIPLE { + @Override + public boolean assertSize(int n) { + return n > 1; + } + }, + ONE_OR_MORE { + @Override + public boolean assertSize(int n) { + return n >= 1; + } + }; + + public abstract boolean assertSize(int n); + } + + /** + * The database URL type which is determined by the scheme section of the connection string. + */ + public enum Type { + // DNS SRV schemes (cardinality is validated by implementing classes): + FAILOVER_DNS_SRV_CONNECTION("jdbc:mysql+srv:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.FailoverDnsSrvConnectionUrl"), // + LOADBALANCE_DNS_SRV_CONNECTION("jdbc:mysql+srv:loadbalance:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.LoadBalanceDnsSrvConnectionUrl"), // + REPLICATION_DNS_SRV_CONNECTION("jdbc:mysql+srv:replication:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.ReplicationDnsSrvConnectionUrl"), // + XDEVAPI_DNS_SRV_SESSION("mysqlx+srv:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.XDevApiDnsSrvConnectionUrl"), // + // Standard schemes: + SINGLE_CONNECTION("jdbc:mysql:", HostsCardinality.SINGLE, "com.mysql.cj.conf.url.SingleConnectionUrl", PropertyKey.dnsSrv, FAILOVER_DNS_SRV_CONNECTION), // + FAILOVER_CONNECTION("jdbc:mysql:", HostsCardinality.MULTIPLE, "com.mysql.cj.conf.url.FailoverConnectionUrl", PropertyKey.dnsSrv, + FAILOVER_DNS_SRV_CONNECTION), // + LOADBALANCE_CONNECTION("jdbc:mysql:loadbalance:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.LoadBalanceConnectionUrl", PropertyKey.dnsSrv, + LOADBALANCE_DNS_SRV_CONNECTION), // + REPLICATION_CONNECTION("jdbc:mysql:replication:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.ReplicationConnectionUrl", PropertyKey.dnsSrv, + REPLICATION_DNS_SRV_CONNECTION), // + XDEVAPI_SESSION("mysqlx:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.XDevApiConnectionUrl", PropertyKey.xdevapiDnsSrv, + XDEVAPI_DNS_SRV_SESSION); + + private String scheme; + private HostsCardinality cardinality; + private String implementingClass; + private PropertyKey dnsSrvPropertyKey; + private Type alternateDnsSrvType; + + private Type(String scheme, HostsCardinality cardinality, String implementingClass) { + this(scheme, cardinality, implementingClass, null, null); + } + + private Type(String scheme, HostsCardinality cardinality, String implementingClass, PropertyKey dnsSrvPropertyKey, Type alternateDnsSrvType) { + this.scheme = scheme; + this.cardinality = cardinality; + this.implementingClass = implementingClass; + this.dnsSrvPropertyKey = dnsSrvPropertyKey; + this.alternateDnsSrvType = alternateDnsSrvType; + } + + public String getScheme() { + return this.scheme; + } + + public HostsCardinality getCardinality() { + return this.cardinality; + } + + public String getImplementingClass() { + return this.implementingClass; + } + + public PropertyKey getDnsSrvPropertyKey() { + return this.dnsSrvPropertyKey; + } + + public Type getAlternateDnsSrvType() { + return this.alternateDnsSrvType; + } + + /** + * Returns the {@link Type} corresponding to the given scheme and number of hosts, if any. + * Otherwise throws an {@link UnsupportedConnectionStringException}. + * Calling this method with the argument n lower than 0 skips the hosts cardinality validation. + * + * @param scheme + * one of supported schemes + * @param n + * the number of hosts in the database URL + * @return the {@link Type} corresponding to the given protocol and number of hosts + */ + public static Type fromValue(String scheme, int n) { + for (Type t : values()) { + if (t.getScheme().equalsIgnoreCase(scheme) && (n < 0 || t.getCardinality().assertSize(n))) { + return t; + } + } + if (n < 0) { + throw ExceptionFactory.createException(UnsupportedConnectionStringException.class, + Messages.getString("ConnectionString.5", new Object[] { scheme })); + } + throw ExceptionFactory.createException(UnsupportedConnectionStringException.class, + Messages.getString("ConnectionString.6", new Object[] { scheme, n })); + } + + /** + * Instantiates a class that implements the right type of connection URLs for the given {@link ConnectionUrlParser}. + * + * @param parser + * the {@link ConnectionUrlParser} containing the URL components. + * @param info + * a connection properties map to add to the {@link ConnectionUrl} structure. + * @return + * an instance of {@link ConnectionUrl}. + */ + public static ConnectionUrl getConnectionUrlInstance(ConnectionUrlParser parser, Properties info) { + int hostsCount = parser.getHosts().size(); + Type type = fromValue(parser.getScheme(), hostsCount); + PropertyKey dnsSrvPropKey = type.getDnsSrvPropertyKey(); + Map parsedProperties; + + // Check if the Type must be replaced by a DNS SRV one. + if (dnsSrvPropKey != null && type.getAlternateDnsSrvType() != null) { + if (info != null && info.containsKey(dnsSrvPropKey.getKeyName())) { // Properties map prevails over connection string options. + if ((Boolean) PropertyDefinitions.getPropertyDefinition(dnsSrvPropKey).parseObject(info.getProperty(dnsSrvPropKey.getKeyName()), null)) { + type = fromValue(type.getAlternateDnsSrvType().getScheme(), hostsCount); + } + } else if ((parsedProperties = parser.getProperties()).containsKey(dnsSrvPropKey.getKeyName()) && (Boolean) PropertyDefinitions + .getPropertyDefinition(dnsSrvPropKey).parseObject(parsedProperties.get(dnsSrvPropKey.getKeyName()), null)) { + type = fromValue(type.getAlternateDnsSrvType().getScheme(), hostsCount); + } + } + + return type.getImplementingInstance(parser, info); + } + + /** + * Checks if the given scheme corresponds to one of the connection types the driver supports. + * + * @param scheme + * scheme part from connection string, like "jdbc:mysql:" + * @return true if the given scheme is supported by driver + */ + public static boolean isSupported(String scheme) { + for (Type t : values()) { + if (t.getScheme().equalsIgnoreCase(scheme)) { + return true; + } + } + return false; + } + + /** + * Instantiates a class that implements this type of connection URLs with the given arguments. + * + * @param parser + * the {@link ConnectionUrlParser} containing the URL components. + * @param info + * a connection properties map to add to the {@link ConnectionUrl} structure. + * @return + * an instance of {@link ConnectionUrl}. + */ + private ConnectionUrl getImplementingInstance(ConnectionUrlParser parser, Properties info) { + return (ConnectionUrl) Util.getInstance(getImplementingClass(), new Class[] { ConnectionUrlParser.class, Properties.class }, + new Object[] { parser, info }, null); + } + } + + protected Type type; + protected String originalConnStr; + protected String originalDatabase; + protected List hosts = new ArrayList<>(); + protected Map properties = new HashMap<>(); + ConnectionPropertiesTransform propertiesTransformer; + + /** + * Static factory method that returns either a new instance of a {@link ConnectionUrl} or a cached one. + * Returns "null" it can't handle the connection string. + * + * @param connString + * the connection string + * @param info + * the connection arguments map + * @return an instance of a {@link ConnectionUrl} or "null" if isn't able to handle the connection string + */ + public static ConnectionUrl getConnectionUrlInstance(String connString, Properties info) { + if (connString == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0")); + } + String connStringCacheKey = buildConnectionStringCacheKey(connString, info); + ConnectionUrl connectionUrl; + + rwLock.readLock().lock(); + connectionUrl = connectionUrlCache.get(connStringCacheKey); + if (connectionUrl == null) { + rwLock.readLock().unlock(); + rwLock.writeLock().lock(); + try { + // Check again, in the meantime it could have been cached by another thread. + connectionUrl = connectionUrlCache.get(connStringCacheKey); + if (connectionUrl == null) { + ConnectionUrlParser connStrParser = ConnectionUrlParser.parseConnectionString(connString); + connectionUrl = Type.getConnectionUrlInstance(connStrParser, info); + connectionUrlCache.put(connStringCacheKey, connectionUrl); + } + rwLock.readLock().lock(); + } finally { + rwLock.writeLock().unlock(); + } + } + rwLock.readLock().unlock(); + return connectionUrl; + } + + /** + * Builds a connection URL cache map key based on the connection string itself plus the string representation of the given connection properties. + * + * @param connString + * the connection string + * @param info + * the connection arguments map + * @return a connection string cache map key + */ + private static String buildConnectionStringCacheKey(String connString, Properties info) { + StringBuilder sbKey = new StringBuilder(connString); + sbKey.append("\u00A7"); // Section sign. + sbKey.append( + info == null ? null : info.stringPropertyNames().stream().map(k -> k + "=" + info.getProperty(k)).collect(Collectors.joining(", ", "{", "}"))); + return sbKey.toString(); + } + + /** + * Checks if this {@link ConnectionUrl} is able to process the given database URL. + * + * @param connString + * the connection string + * @return true if this class is able to process the given URL, false otherwise + */ + public static boolean acceptsUrl(String connString) { + return ConnectionUrlParser.isConnectionStringSupported(connString); + } + + /** + * Empty constructor. Required for subclasses initialization. + */ + protected ConnectionUrl() { + } + + /** + * Constructor for unsupported URLs + * + * @param origUrl + * URLs + */ + public ConnectionUrl(String origUrl) { + this.originalConnStr = origUrl; + } + + /** + * Constructs an instance of {@link ConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + protected ConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + this.originalConnStr = connStrParser.getDatabaseUrl(); + this.originalDatabase = connStrParser.getPath() == null ? "" : connStrParser.getPath(); + collectProperties(connStrParser, info); // Fill properties before filling hosts info. + collectHostsInfo(connStrParser); + } + + /** + * Joins the connection arguments from the connection string with the ones from the given connection arguments map collecting them in a single map. + * Additionally may also collect other connection arguments from configuration files. + * + * @param connStrParser + * the {@link ConnectionUrlParser} from where to collect the properties + * @param info + * the connection arguments map + */ + protected void collectProperties(ConnectionUrlParser connStrParser, Properties info) { + // Fill in the properties from the connection string. + connStrParser.getProperties().entrySet().stream().forEach(e -> this.properties.put(PropertyKey.normalizeCase(e.getKey()), e.getValue())); + + // Properties passed in override the ones from the connection string. + if (info != null) { + info.stringPropertyNames().stream().forEach(k -> this.properties.put(PropertyKey.normalizeCase(k), info.getProperty(k))); + } + + // Collect properties from additional sources. + setupPropertiesTransformer(); + expandPropertiesFromConfigFiles(this.properties); + injectPerTypeProperties(this.properties); + } + + /** + * Sets up the {@link ConnectionPropertiesTransform} if one was provided. + */ + protected void setupPropertiesTransformer() { + String propertiesTransformClassName = this.properties.get(PropertyKey.propertiesTransform.getKeyName()); + if (!isNullOrEmpty(propertiesTransformClassName)) { + try { + this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance(); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | CJException e) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.9", new Object[] { propertiesTransformClassName, e.toString() }), e); + } + } + } + + /** + * Expands the connection argument "useConfig" by reading the mentioned configuration files. + * + * @param props + * a connection arguments map from where to read the "useConfig" property and where to save the loaded properties. + */ + protected void expandPropertiesFromConfigFiles(Map props) { + // Properties from config files should not override the existing ones. + String configFiles = props.get(PropertyKey.useConfigs.getKeyName()); + if (!isNullOrEmpty(configFiles)) { + Properties configProps = getPropertiesFromConfigFiles(configFiles); + configProps.stringPropertyNames().stream().map(PropertyKey::normalizeCase).filter(k -> !props.containsKey(k)) + .forEach(k -> props.put(k, configProps.getProperty(k))); + } + } + + /** + * Returns a map containing the properties read from the given configuration files. Multiple files can be referenced using a comma as separator. + * + * @param configFiles + * the list of the configuration files to read + * @return the map containing all the properties read + */ + public static Properties getPropertiesFromConfigFiles(String configFiles) { + Properties configProps = new Properties(); + for (String configFile : configFiles.split(",")) { + try (InputStream configAsStream = ConnectionUrl.class.getResourceAsStream("/com/mysql/cj/configurations/" + configFile + ".properties")) { + if (configAsStream == null) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.10", new Object[] { configFile })); + } + configProps.load(configAsStream); + } catch (IOException e) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.11", new Object[] { configFile }), e); + } + } + return configProps; + } + + /** + * Subclasses must override this method if they need to inject additional properties in the connection arguments map while it's being constructed. + * + * @param props + * the properties already containing all known connection arguments + */ + protected void injectPerTypeProperties(Map props) { + return; + } + + /** + * Some acceptable property values have changed in c/J 8.0 but old values remain hard-coded in widely used software. + * So, old values must be accepted and translated to new ones. + * + * @param props + * the host properties map to fix + */ + protected void replaceLegacyPropertyValues(Map props) { + // Workaround for zeroDateTimeBehavior=convertToNull hard-coded in NetBeans + String zeroDateTimeBehavior = props.get(PropertyKey.zeroDateTimeBehavior.getKeyName()); + if (zeroDateTimeBehavior != null && zeroDateTimeBehavior.equalsIgnoreCase("convertToNull")) { + props.put(PropertyKey.zeroDateTimeBehavior.getKeyName(), "CONVERT_TO_NULL"); + } + } + + /** + * Collects the hosts information from the {@link ConnectionUrlParser}. + * + * @param connStrParser + * the {@link ConnectionUrlParser} from where to collect the hosts information + */ + protected void collectHostsInfo(ConnectionUrlParser connStrParser) { + connStrParser.getHosts().stream().map(this::fixHostInfo).forEach(this.hosts::add); + } + + /** + * Fixes the host information by moving data around and filling in missing data. + * Applies properties transformations to the collected properties if {@link ConnectionPropertiesTransform} was declared in the connection arguments. + * + * @param hi + * the host information data to fix + * @return a new {@link HostInfo} with all required data + */ + protected HostInfo fixHostInfo(HostInfo hi) { + Map hostProps = new HashMap<>(); + + // Add global connection arguments. + hostProps.putAll(this.properties); + // Add/override host specific connection arguments. + hi.getHostProperties().entrySet().stream().forEach(e -> hostProps.put(PropertyKey.normalizeCase(e.getKey()), e.getValue())); + // Add the database name. + if (!hostProps.containsKey(PropertyKey.DBNAME.getKeyName())) { + hostProps.put(PropertyKey.DBNAME.getKeyName(), getDatabase()); + } + + preprocessPerTypeHostProperties(hostProps); + + String host = hostProps.remove(PropertyKey.HOST.getKeyName()); + if (!isNullOrEmpty(hi.getHost())) { + host = hi.getHost(); + } else if (isNullOrEmpty(host)) { + host = getDefaultHost(); + } + + String portAsString = hostProps.remove(PropertyKey.PORT.getKeyName()); + int port = hi.getPort(); + if (port == HostInfo.NO_PORT && !isNullOrEmpty(portAsString)) { + try { + port = Integer.valueOf(portAsString); + } catch (NumberFormatException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.7", new Object[] { hostProps.get(PropertyKey.PORT.getKeyName()) }), e); + } + } + if (port == HostInfo.NO_PORT) { + port = getDefaultPort(); + } + + String user = hostProps.remove(PropertyKey.USER.getKeyName()); + if (!isNullOrEmpty(hi.getUser())) { + user = hi.getUser(); + } else if (isNullOrEmpty(user)) { + user = getDefaultUser(); + } + + String password = hostProps.remove(PropertyKey.PASSWORD.getKeyName()); + if (hi.getPassword() != null) { // Password can be specified as empty string. + password = hi.getPassword(); + } else if (isNullOrEmpty(password)) { + password = getDefaultPassword(); + } + + expandPropertiesFromConfigFiles(hostProps); + fixProtocolDependencies(hostProps); + replaceLegacyPropertyValues(hostProps); + + return buildHostInfo(host, port, user, password, hostProps); + } + + /** + * Subclasses should override this to perform any required pre-processing on the host information properties. + * + * @param hostProps + * the host properties map to process + */ + protected void preprocessPerTypeHostProperties(Map hostProps) { + // To be overridden in subclasses if needed. + } + + /** + * Returns the default host. Subclasses must override this method if they have different default host value. + * + * @return the default host + */ + public String getDefaultHost() { + return DEFAULT_HOST; + } + + /** + * Returns the default port. Subclasses must override this method if they have different default port value. + * + * @return the default port + */ + public int getDefaultPort() { + return DEFAULT_PORT; + } + + /** + * Returns the default user. Usually the one provided in the method {@link DriverManager#getConnection(String, String, String)} or as connection argument. + * + * @return the default user + */ + public String getDefaultUser() { + return this.properties.get(PropertyKey.USER.getKeyName()); + } + + /** + * Returns the default password. Usually the one provided in the method {@link DriverManager#getConnection(String, String, String)} or as connection + * argument. + * + * @return the default password + */ + public String getDefaultPassword() { + return this.properties.get(PropertyKey.PASSWORD.getKeyName()); + } + + /** + * Fixes the protocol (TCP vs PIPE) dependencies for the given host properties map. + * + * @param hostProps + * the host properties map to fix + */ + protected void fixProtocolDependencies(Map hostProps) { + String protocol = hostProps.get(PropertyKey.PROTOCOL.getKeyName()); + if (!isNullOrEmpty(protocol) && protocol.equalsIgnoreCase("PIPE")) { + if (!hostProps.containsKey(PropertyKey.socketFactory.getKeyName())) { + hostProps.put(PropertyKey.socketFactory.getKeyName(), "com.mysql.cj.protocol.NamedPipeSocketFactory"); + } + } + } + + /** + * Returns this connection URL type. + * + * @return the connection URL type + */ + public Type getType() { + return this.type; + } + + /** + * Returns the original database URL that produced this connection string. + * + * @return the original database URL + */ + @Override + public String getDatabaseUrl() { + return this.originalConnStr; + } + + /** + * Returns the database from this connection URL. Note that a "DBNAME" property overrides the database identified in the connection string. + * + * @return the database name + */ + public String getDatabase() { + return this.properties.containsKey(PropertyKey.DBNAME.getKeyName()) ? this.properties.get(PropertyKey.DBNAME.getKeyName()) : this.originalDatabase; + } + + /** + * Returns the number of hosts in this connection URL. + * + * @return the number of hosts + */ + public int hostsCount() { + return this.hosts.size(); + } + + /** + * Returns the single or first host info structure. + * + * @return the first host info structure + */ + public HostInfo getMainHost() { + return this.hosts.isEmpty() ? null : this.hosts.get(0); + } + + /** + * Returns a list of the hosts in this connection URL. + * + * @return the hosts list from this connection URL + */ + public List getHostsList() { + return getHostsList(HostsListView.ALL); + } + + /** + * Returns a list of the hosts in this connection URL, filtered for the given view. + * + * By default returns all hosts. Subclasses should override this method in order to implement support for different views, usually by splitting the global + * hosts into smaller sub-lists. + * + * @param view + * the type of the view to use in the returned list of hosts. This argument is ignored in this implementation. + * @return + * the hosts list from this connection URL, filtered for the given view. + */ + public List getHostsList(HostsListView view) { + return Collections.unmodifiableList(this.hosts); + } + + /** + * Returns an existing host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found. + * + * @param hostPortPair + * the host:port part to search for + * @return the existing host info or a new independent one + */ + public HostInfo getHostOrSpawnIsolated(String hostPortPair) { + return getHostOrSpawnIsolated(hostPortPair, this.hosts); + } + + /** + * Returns an existing host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found. + * + * @param hostPortPair + * the host:port part to search for + * @param hostsList + * the hosts list from where to search the host list + * @return the existing host info or a new independent one + */ + public HostInfo getHostOrSpawnIsolated(String hostPortPair, List hostsList) { + for (HostInfo hi : hostsList) { + if (hostPortPair.equals(hi.getHostPortPair())) { + return hi; + } + } + + ConnectionUrlParser.Pair hostAndPort = ConnectionUrlParser.parseHostPortPair(hostPortPair); + String host = hostAndPort.left; + Integer port = hostAndPort.right; + String user = getDefaultUser(); + String password = getDefaultPassword(); + + return buildHostInfo(host, port, user, password, this.properties); + } + + /** + * Creates a new {@link HostInfo} structure with the given components, passing through the properties transformer if there is one defined in this connection + * string; + * + * @param host + * the host + * @param port + * the port + * @param user + * the user name + * @param password + * the password + * @param hostProps + * the host properties map + * @return a new instance of {@link HostInfo} + */ + protected HostInfo buildHostInfo(String host, int port, String user, String password, Map hostProps) { + // Apply properties transformations if needed. + if (this.propertiesTransformer != null) { + Properties props = new Properties(); + props.putAll(hostProps); + + props.setProperty(PropertyKey.HOST.getKeyName(), host); + props.setProperty(PropertyKey.PORT.getKeyName(), String.valueOf(port)); + if (user != null) { + props.setProperty(PropertyKey.USER.getKeyName(), user); + } + if (password != null) { + props.setProperty(PropertyKey.PASSWORD.getKeyName(), password); + } + + Properties transformedProps = this.propertiesTransformer.transformProperties(props); + + host = transformedProps.getProperty(PropertyKey.HOST.getKeyName()); + try { + port = Integer.parseInt(transformedProps.getProperty(PropertyKey.PORT.getKeyName())); + } catch (NumberFormatException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.8", + new Object[] { PropertyKey.PORT.getKeyName(), transformedProps.getProperty(PropertyKey.PORT.getKeyName()) }), e); + } + user = transformedProps.getProperty(PropertyKey.USER.getKeyName()); + password = transformedProps.getProperty(PropertyKey.PASSWORD.getKeyName()); + + Map transformedHostProps = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + transformedProps.stringPropertyNames().stream().forEach(k -> transformedHostProps.put(k, transformedProps.getProperty(k))); + // Remove surplus keys. + transformedHostProps.remove(PropertyKey.HOST.getKeyName()); + transformedHostProps.remove(PropertyKey.PORT.getKeyName()); + transformedHostProps.remove(PropertyKey.USER.getKeyName()); + transformedHostProps.remove(PropertyKey.PASSWORD.getKeyName()); + + hostProps = transformedHostProps; + } + + return new HostInfo(this, host, port, user, password, hostProps); + } + + /** + * Returns the original (common to all hosts) connection arguments as provided in the connection string query section. + * + * @return the original (common to all hosts) connection arguments + */ + public Map getOriginalProperties() { + return Collections.unmodifiableMap(this.properties); + } + + /** + * Returns a {@link Properties} instance containing the connection arguments extracted from the URL query section, i.e., per host attributes are excluded. + * Applies properties transformations to the collected properties if {@link ConnectionPropertiesTransform} was declared in the connection arguments. + * + * @return a {@link Properties} instance containing the common connection arguments. + */ + public Properties getConnectionArgumentsAsProperties() { + Properties props = new Properties(); + if (this.properties != null) { + props.putAll(this.properties); + } + + return this.propertiesTransformer != null ? this.propertiesTransformer.transformProperties(props) : props; + } + + /** + * Returns a hosts list built from the result of the DNS SRV lookup for the original host name. + * + * @param srvHost + * the {@link HostInfo} from where to get the DNS SRV service name to lookup. + * @return + * the hosts list from the result of the DNS SRV lookup, filtered for the given view. + */ + public List getHostsListFromDnsSrv(HostInfo srvHost) { + String srvServiceName = srvHost.getHost(); + List srvRecords = null; + + try { + srvRecords = DnsSrv.lookupSrvRecords(srvServiceName); + } catch (NamingException e) { + throw ExceptionFactory.createException(Messages.getString("ConnectionString.26", new Object[] { srvServiceName }), e); + } + if (srvRecords == null || srvRecords.size() == 0) { + throw ExceptionFactory.createException(Messages.getString("ConnectionString.26", new Object[] { srvServiceName })); + } + + return Collections.unmodifiableList(srvRecordsToHostsList(srvRecords, srvHost)); + } + + /** + * Converts a list of DNS SRV records into a hosts list. + * + * @param srvRecords + * the list of DNS SRV records. + * @param baseHostInfo + * the {@link HostInfo} to use as source of all common host specific options. + * @return + * a list of hosts. + */ + private List srvRecordsToHostsList(List srvRecords, HostInfo baseHostInfo) { + return srvRecords.stream() + .map(s -> buildHostInfo(s.getTarget(), s.getPort(), baseHostInfo.getUser(), baseHostInfo.getPassword(), baseHostInfo.getHostProperties())) + .collect(Collectors.toList()); + } + + /** + * Returns a string representation of this object. + * + * @return a string representation of this object + */ + @Override + public String toString() { + StringBuilder asStr = new StringBuilder(super.toString()); + asStr.append(String.format(" :: {type: \"%s\", hosts: %s, database: \"%s\", properties: %s, propertiesTransformer: %s}", this.type, this.hosts, + this.originalDatabase, this.properties, this.propertiesTransformer)); + return asStr.toString(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrlParser.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrlParser.java new file mode 100644 index 0000000..f286bfd --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/ConnectionUrlParser.java @@ -0,0 +1,705 @@ +/* + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import static com.mysql.cj.util.StringUtils.isNullOrEmpty; +import static com.mysql.cj.util.StringUtils.safeTrim; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.ConnectionUrl.Type; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.UnsupportedConnectionStringException; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.util.SearchMode; +import com.mysql.cj.util.StringUtils; + +/** + * This class parses a connection string using the general URI structure defined in RFC 3986. Instead of using a URI instance to ensure the correct syntax of + * the connection string, this implementation uses regular expressions which is faster but also less strict in terms of validations. This actually works better + * because database URLs don't exactly stick to the RFC 3986 rules. + *

    + * scheme://authority/path?query#fragment + *

    + * This results in splitting the connection string URL and processing its internal parts: + *

    + *
    scheme
    + *
    The protocol and subprotocol identification. Usually "jdbc:mysql:" or "mysqlx:".
    + *
    authority
    + *
    Contains information about the user credentials and/or the host and port information. Unlike its definition in the RFC 3986 specification, there can be + * multiple authority sections separated by a single comma (,) in a connection string. It is also possible to use an alternative syntax for the user and/or host + * identification, that also allows setting per host connection properties, in the form of + * "[user[:password]@]address=(key1=value)[(key2=value)]...[,address=(key3=value)[(key4=value)]...]...".
    + *
    path
    + *
    Corresponds to the database identification.
    + *
    query
    + *
    The connection properties, written as "propertyName1[=[propertyValue1]][&propertyName2[=[propertyValue2]]]..."
    + *
    fragment
    + *
    The fragment section is ignored in Connector/J connection strings.
    + *
    + */ +public class ConnectionUrlParser implements DatabaseUrlContainer { + private static final String DUMMY_SCHEMA = "cj://"; + private static final String USER_PASS_SEPARATOR = ":"; + private static final String USER_HOST_SEPARATOR = "@"; + private static final String HOSTS_SEPARATOR = ","; + private static final String KEY_VALUE_HOST_INFO_OPENING_MARKER = "("; + private static final String KEY_VALUE_HOST_INFO_CLOSING_MARKER = ")"; + private static final String HOSTS_LIST_OPENING_MARKERS = "[("; + private static final String HOSTS_LIST_CLOSING_MARKERS = "])"; + private static final String ADDRESS_EQUALS_HOST_INFO_PREFIX = "ADDRESS="; + + private static final Pattern CONNECTION_STRING_PTRN = Pattern.compile("(?[\\w\\+:%]+)\\s*" // scheme: required; alphanumeric, plus, colon or percent + + "(?://(?[^/?#]*))?\\s*" // authority: optional; starts with "//" followed by any char except "/", "?" and "#" + + "(?:/(?!\\s*/)(?[^?#]*))?" // path: optional; starts with "/" but not followed by "/", and then followed by by any char except "?" and "#" + + "(?:\\?(?!\\s*\\?)(?[^#]*))?" // query: optional; starts with "?" but not followed by "?", and then followed by by any char except "#" + + "(?:\\s*#(?.*))?"); // fragment: optional; starts with "#", and then followed by anything + private static final Pattern SCHEME_PTRN = Pattern.compile("(?[\\w\\+:%]+).*"); + private static final Pattern HOST_LIST_PTRN = Pattern.compile("^\\[(?.*)\\]$"); + private static final Pattern GENERIC_HOST_PTRN = Pattern.compile("^(?.*?)(?::(?[^:]*))?$"); + private static final Pattern KEY_VALUE_HOST_PTRN = Pattern.compile("[,\\s]*(?[\\w\\.\\-\\s%]*)(?:=(?[^,]*))?"); + private static final Pattern ADDRESS_EQUALS_HOST_PTRN = Pattern.compile("\\s*\\(\\s*(?[\\w\\.\\-%]+)?\\s*(?:=(?[^)]*))?\\)\\s*"); + private static final Pattern PROPERTIES_PTRN = Pattern.compile("[&\\s]*(?[\\w\\.\\-\\s%]*)(?:=(?[^&]*))?"); + + private final String baseConnectionString; + private String scheme; + private String authority; + private String path; + private String query; + + private List parsedHosts = null; + private Map parsedProperties = null; + + /** + * Static factory method for constructing instances of this class. + * + * @param connString + * The connection string to parse. + * @return an instance of {@link ConnectionUrlParser} + */ + public static ConnectionUrlParser parseConnectionString(String connString) { + return new ConnectionUrlParser(connString); + } + + /** + * Constructs a connection string parser for the given connection string. + * + * @param connString + * the connection string to parse + */ + private ConnectionUrlParser(String connString) { + if (connString == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0")); + } + if (!isConnectionStringSupported(connString)) { + throw ExceptionFactory.createException(UnsupportedConnectionStringException.class, + Messages.getString("ConnectionString.17", new String[] { connString })); + } + this.baseConnectionString = connString; + parseConnectionString(); + } + + /** + * Checks if the scheme part of given connection string matches one of the {@link Type}s supported by Connector/J. + * Throws {@link WrongArgumentException} if connString is null. + * + * @param connString + * connection string + * @return true if supported + */ + public static boolean isConnectionStringSupported(String connString) { + if (connString == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0")); + } + Matcher matcher = SCHEME_PTRN.matcher(connString); + return matcher.matches() && Type.isSupported(decodeSkippingPlusSign(matcher.group("scheme"))); + } + + /** + * Splits the connection string in its main sections. + */ + private void parseConnectionString() { + String connString = this.baseConnectionString; + Matcher matcher = CONNECTION_STRING_PTRN.matcher(connString); + if (!matcher.matches()) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.1")); + } + this.scheme = decodeSkippingPlusSign(matcher.group("scheme")); + this.authority = matcher.group("authority"); // Don't decode just yet. + this.path = matcher.group("path") == null ? null : decode(matcher.group("path")).trim(); + this.query = matcher.group("query"); // Don't decode just yet. + } + + /** + * Parses the authority section (user and/or host identification) of the connection string URI. + */ + private void parseAuthoritySection() { + if (isNullOrEmpty(this.authority)) { + // Add an empty, default, host. + this.parsedHosts.add(new HostInfo()); + return; + } + + List authoritySegments = StringUtils.split(this.authority, HOSTS_SEPARATOR, HOSTS_LIST_OPENING_MARKERS, HOSTS_LIST_CLOSING_MARKERS, true, + SearchMode.__MRK_WS); + for (String hi : authoritySegments) { + parseAuthoritySegment(hi); + } + } + + /** + * Parses the given sub authority segment, which can take one of the following syntaxes: + *
      + *
    • _user_:_password_@_host_:_port_ + *
    • _user_:_password_@(key1=value1,key2=value2,...) + *
    • _user_:_password_@address=(key1=value1)(key2=value2)... + *
    • _user_:_password_@[_any_of_the_above_1_,_any_of_the_above_2_,...] + *
    + * Most of the above placeholders can be omitted, representing a null, empty, or default value. + * The placeholder _host_, can be a host name, IPv4 or IPv6. This parser doesn't check IP syntax. IPv6 addresses are enclosed by square brackets ([::1]). + * The placeholder _any_of_the_above_?_ can be any of the above except for the user information part (_user_:_password_@). + * When the symbol ":" is not used, it means an null/empty password or a default (HostInfo.NO_PORT) port, respectively. + * When the symbol "@" is not used, it means that the authority part doesn't contain user information (depending on the scheme type can still be provided + * via key=value pairs). + * + * @param authSegment + * the string containing the authority segment + */ + private void parseAuthoritySegment(String authSegment) { + /* + * Start by splitting the user and host information parts from the authority segment and process the user information, if any. + */ + Pair userHostInfoSplit = splitByUserInfoAndHostInfo(authSegment); + String userInfo = safeTrim(userHostInfoSplit.left); + String user = null; + String password = null; + if (!isNullOrEmpty(userInfo)) { + Pair userInfoPair = parseUserInfo(userInfo); + user = decode(safeTrim(userInfoPair.left)); + password = decode(safeTrim(userInfoPair.right)); + } + String hostInfo = safeTrim(userHostInfoSplit.right); + + /* + * Handle an authority part without host information. + */ + HostInfo hi = buildHostInfoForEmptyHost(user, password, hostInfo); + if (hi != null) { + this.parsedHosts.add(hi); + return; + } + + /* + * Try using a java.net.URI instance to parse the host information. This helps dealing with the IPv6 syntax. + */ + hi = buildHostInfoResortingToUriParser(user, password, authSegment); + if (hi != null) { + this.parsedHosts.add(hi); + return; + } + + /* + * Using a URI didn't work, now check if the host part is composed by a sub list of hosts and process them, one by one if so. + */ + List hiList = buildHostInfoResortingToSubHostsListParser(user, password, hostInfo); + if (hiList != null) { + this.parsedHosts.addAll(hiList); + return; + } + + /* + * The hosts list syntax didn't work, now check if the host information is written in the alternate syntax "(Key1=value1,key2=value2)". + */ + hi = buildHostInfoResortingToKeyValueSyntaxParser(user, password, hostInfo); + if (hi != null) { + this.parsedHosts.add(hi); + return; + } + + /* + * Key/value syntax didn't work either, now check if the host information is written in the alternate syntax "address=(...)". + * This parser needs to run after the key/value one because a key named "address" could invalidate it. + */ + hi = buildHostInfoResortingToAddressEqualsSyntaxParser(user, password, hostInfo); + if (hi != null) { + this.parsedHosts.add(hi); + return; + } + + /* + * Alternate syntax also failed, let's wind up the corner cases the URI couldn't handle. + */ + hi = buildHostInfoResortingToGenericSyntaxParser(user, password, hostInfo); + if (hi != null) { + this.parsedHosts.add(hi); + return; + } + + /* + * Failed parsing the authority segment. + */ + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.2", new Object[] { authSegment })); + } + + /** + * Builds an {@link HostInfo} instance for empty host authority segments. + * + * @param user + * the user to include in the final {@link HostInfo} + * @param password + * the password to include in the final {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * @return the {@link HostInfo} instance containing the parsed information or null if the host part is not empty + */ + private HostInfo buildHostInfoForEmptyHost(String user, String password, String hostInfo) { + if (isNullOrEmpty(hostInfo)) { + return new HostInfo(this, null, HostInfo.NO_PORT, user, password); + } + return null; + } + + /** + * Parses the host information resorting to a URI object. This process handles most single-host well formed addresses. + * + * @param user + * the user to include in the final {@link HostInfo} + * @param password + * the password to include in the final {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * + * @return the {@link HostInfo} instance containing the parsed information or null if unable to parse the host information + */ + private HostInfo buildHostInfoResortingToUriParser(String user, String password, String hostInfo) { + String host = null; + int port = HostInfo.NO_PORT; + + try { + URI uri = URI.create(DUMMY_SCHEMA + hostInfo); + if (uri.getHost() != null) { + host = decode(uri.getHost()); + } + if (uri.getPort() != -1) { // getPort() returns -1 if the port is undefined. + port = uri.getPort(); + } + if (uri.getUserInfo() != null) { + // Can't have another one. The user information should have been handled already. + return null; + } + } catch (IllegalArgumentException e) { + // The URI failed to parse the host information. + return null; + } + if (host != null || port != HostInfo.NO_PORT) { + // The host info parsing succeeded. + return new HostInfo(this, host, port, user, password); + } + return null; + } + + /** + * Parses the host information using the alternate sub hosts lists syntax "[host1, host2, ...]". + * + * @param user + * the user to include in all the resulting {@link HostInfo} + * @param password + * the password to include in all the resulting {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * @return a list with all {@link HostInfo} instances containing the parsed information or null if unable to parse the host information + */ + private List buildHostInfoResortingToSubHostsListParser(String user, String password, String hostInfo) { + Matcher matcher = HOST_LIST_PTRN.matcher(hostInfo); + if (matcher.matches()) { + String hosts = matcher.group("hosts"); + List hostsList = StringUtils.split(hosts, HOSTS_SEPARATOR, HOSTS_LIST_OPENING_MARKERS, HOSTS_LIST_CLOSING_MARKERS, true, + SearchMode.__MRK_WS); + // One single element could, in fact, be an IPv6 stripped from its delimiters. + boolean maybeIPv6 = hostsList.size() == 1 && hostsList.get(0).matches("(?i)^[\\dabcdef:]+$"); + List hostInfoList = new ArrayList<>(); + for (String h : hostsList) { + HostInfo hi; + if ((hi = buildHostInfoForEmptyHost(user, password, h)) != null) { + hostInfoList.add(hi); + } else if ((hi = buildHostInfoResortingToUriParser(user, password, h)) != null + || (maybeIPv6 && (hi = buildHostInfoResortingToUriParser(user, password, "[" + h + "]")) != null)) { + hostInfoList.add(hi); + } else if ((hi = buildHostInfoResortingToKeyValueSyntaxParser(user, password, h)) != null) { + hostInfoList.add(hi); + } else if ((hi = buildHostInfoResortingToAddressEqualsSyntaxParser(user, password, h)) != null) { + hostInfoList.add(hi); + } else if ((hi = buildHostInfoResortingToGenericSyntaxParser(user, password, h)) != null) { + hostInfoList.add(hi); + } else { + return null; + } + } + return hostInfoList; + } + return null; + } + + /** + * Parses the host information using the alternate syntax "(key1=value1, key2=value2, ...)". + * + * @param user + * the user to include in the resulting {@link HostInfo} + * @param password + * the password to include in the resulting {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * @return the {@link HostInfo} instance containing the parsed information or null if unable to parse the host information + */ + private HostInfo buildHostInfoResortingToKeyValueSyntaxParser(String user, String password, String hostInfo) { + if (!hostInfo.startsWith(KEY_VALUE_HOST_INFO_OPENING_MARKER) || !hostInfo.endsWith(KEY_VALUE_HOST_INFO_CLOSING_MARKER)) { + // This pattern won't work. + return null; + } + hostInfo = hostInfo.substring(KEY_VALUE_HOST_INFO_OPENING_MARKER.length(), hostInfo.length() - KEY_VALUE_HOST_INFO_CLOSING_MARKER.length()); + return new HostInfo(this, null, HostInfo.NO_PORT, user, password, processKeyValuePattern(KEY_VALUE_HOST_PTRN, hostInfo)); + } + + /** + * Parses the host information using the alternate syntax "address=(key1=value1)(key2=value2)...". + * + * @param user + * the user to include in the resulting {@link HostInfo} + * @param password + * the password to include in the resulting {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * @return the {@link HostInfo} instance containing the parsed information or null if unable to parse the host information + */ + private HostInfo buildHostInfoResortingToAddressEqualsSyntaxParser(String user, String password, String hostInfo) { + int p = StringUtils.indexOfIgnoreCase(hostInfo, ADDRESS_EQUALS_HOST_INFO_PREFIX); + if (p != 0) { + // This pattern won't work. + return null; + } + hostInfo = hostInfo.substring(p + ADDRESS_EQUALS_HOST_INFO_PREFIX.length()).trim(); + return new HostInfo(this, null, HostInfo.NO_PORT, user, password, processKeyValuePattern(ADDRESS_EQUALS_HOST_PTRN, hostInfo)); + } + + /** + * Parses the host information using the generic syntax "host:port". + * + * @param user + * the user to include in the resulting {@link HostInfo} + * @param password + * the password to include in the resulting {@link HostInfo} + * @param hostInfo + * the string containing the host information part + * @return the {@link HostInfo} instance containing the parsed information or null if unable to parse the host information + */ + private HostInfo buildHostInfoResortingToGenericSyntaxParser(String user, String password, String hostInfo) { + if (splitByUserInfoAndHostInfo(hostInfo).left != null) { + // This host information is invalid if contains another user information part. + return null; + } + Pair hostPortPair = parseHostPortPair(hostInfo); + String host = decode(safeTrim(hostPortPair.left)); + Integer port = hostPortPair.right; + return new HostInfo(this, isNullOrEmpty(host) ? null : host, port, user, password); + } + + /** + * Splits the given authority segment in the user information part and the host part. + * + * @param authSegment + * the string containing the authority segment, i.e., the user and host information parts + * @return + * a {@link Pair} containing the user information in the left side and the host information in the right + */ + private Pair splitByUserInfoAndHostInfo(String authSegment) { + String userInfoPart = null; + String hostInfoPart = authSegment; + int p = authSegment.indexOf(USER_HOST_SEPARATOR); + if (p >= 0) { + userInfoPart = authSegment.substring(0, p); + hostInfoPart = authSegment.substring(p + USER_HOST_SEPARATOR.length()); + } + return new Pair<>(userInfoPart, hostInfoPart); + } + + /** + * Parses the given user information which is formed by the parts [user][:password]. + * + * @param userInfo + * the string containing the user information + * @return a {@link Pair} containing the user and password information or null if the user information can't be parsed + */ + public static Pair parseUserInfo(String userInfo) { + if (isNullOrEmpty(userInfo)) { + return null; + } + String[] userInfoParts = userInfo.split(USER_PASS_SEPARATOR, 2); + String userName = userInfoParts[0]; + String password = userInfoParts.length > 1 ? userInfoParts[1] : null; + return new Pair<>(userName, password); + } + + /** + * Parses a host:port pair and returns the two elements in a {@link Pair} + * + * @param hostInfo + * the host:pair to parse + * @return a {@link Pair} containing the host and port information or null if the host information can't be parsed + */ + public static Pair parseHostPortPair(String hostInfo) { + if (isNullOrEmpty(hostInfo)) { + return null; + } + Matcher matcher = GENERIC_HOST_PTRN.matcher(hostInfo); + if (matcher.matches()) { + String host = matcher.group("host"); + String portAsString = decode(safeTrim(matcher.group("port"))); + Integer portAsInteger = HostInfo.NO_PORT; + if (!isNullOrEmpty(portAsString)) { + try { + portAsInteger = Integer.parseInt(portAsString); + } catch (NumberFormatException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.3", new Object[] { hostInfo }), + e); + } + } + return new Pair<>(host, portAsInteger); + } + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.3", new Object[] { hostInfo })); + } + + /** + * Parses the connection properties section and stores the extracted key/value pairs into a local map. + */ + private void parseQuerySection() { + if (isNullOrEmpty(this.query)) { + this.parsedProperties = new HashMap<>(); + return; + } + this.parsedProperties = processKeyValuePattern(PROPERTIES_PTRN, this.query); + } + + /** + * Takes a two-matching-groups (respectively named "key" and "value") pattern which is successively tested against the given string and produces a key/value + * map with the matched values. The given pattern must ensure that there are no leftovers between successive tests, i.e., the end of the previous match must + * coincide with the beginning of the next. + * + * @param pattern + * the regular expression pattern to match against to + * @param input + * the input string + * @return a key/value map containing the matched values + */ + private Map processKeyValuePattern(Pattern pattern, String input) { + Matcher matcher = pattern.matcher(input); + int p = 0; + Map kvMap = new HashMap<>(); + while (matcher.find()) { + if (matcher.start() != p) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.4", new Object[] { input.substring(p) })); + } + String key = decode(safeTrim(matcher.group("key"))); + String value = decode(safeTrim(matcher.group("value"))); + if (!isNullOrEmpty(key)) { + kvMap.put(key, value); + } else if (!isNullOrEmpty(value)) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.4", new Object[] { input.substring(p) })); + } + p = matcher.end(); + } + if (p != input.length()) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.4", new Object[] { input.substring(p) })); + } + return kvMap; + } + + /** + * URL-decode the given string. + * + * @param text + * the string to decode + * @return + * the decoded string + */ + private static String decode(String text) { + if (isNullOrEmpty(text)) { + return text; + } + try { + return URLDecoder.decode(text, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // Won't happen. + } + return ""; + } + + /** + * URL-decode the given string skipping all occurrences of the plus sign. + * + * @param text + * the string to decode + * @return + * the decoded string + */ + private static String decodeSkippingPlusSign(String text) { + if (isNullOrEmpty(text)) { + return text; + } + text = text.replace("+", "%2B"); // Percent encode for "+" is "%2B". + try { + return URLDecoder.decode(text, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + // Won't happen. + } + return ""; + } + + /** + * Returns the original database URL that produced this connection string parser. + * + * @return the original database URL + */ + @Override + public String getDatabaseUrl() { + return this.baseConnectionString; + } + + /** + * Returns the scheme section. + * + * @return the scheme section + */ + public String getScheme() { + return this.scheme; + } + + /** + * Returns the authority section. + * + * @return the authority section + */ + public String getAuthority() { + return this.authority; + } + + /** + * Returns the path section. + * + * @return the path section + */ + public String getPath() { + return this.path; + } + + /** + * Returns the query section. + * + * @return the query section + */ + public String getQuery() { + return this.query; + } + + /** + * Returns the hosts information. + * + * @return the hosts information + */ + public List getHosts() { + if (this.parsedHosts == null) { + this.parsedHosts = new ArrayList<>(); + parseAuthoritySection(); + } + return this.parsedHosts; + } + + /** + * Returns the properties map contained in this connection string. + * + * @return the properties map + */ + public Map getProperties() { + if (this.parsedProperties == null) { + parseQuerySection(); + } + return Collections.unmodifiableMap(this.parsedProperties); + } + + /** + * Returns a string representation of this object. + * + * @return a string representation of this object + */ + @Override + public String toString() { + StringBuilder asStr = new StringBuilder(super.toString()); + asStr.append(String.format(" :: {scheme: \"%s\", authority: \"%s\", path: \"%s\", query: \"%s\", parsedHosts: %s, parsedProperties: %s}", this.scheme, + this.authority, this.path, this.query, this.parsedHosts, this.parsedProperties)); + return asStr.toString(); + } + + /** + * This class is a simple container for two elements. + * + * @param + * left part type + * @param + * right part type + */ + public static class Pair { + public final T left; + public final U right; + + public Pair(T left, U right) { + this.left = left; + this.right = right; + } + + @Override + public String toString() { + StringBuilder asStr = new StringBuilder(super.toString()); + asStr.append(String.format(" :: { left: %s, right: %s }", this.left, this.right)); + return asStr.toString(); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/DatabaseUrlContainer.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/DatabaseUrlContainer.java new file mode 100644 index 0000000..818dd19 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/DatabaseUrlContainer.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +/** + * Implementors of this class must be able to provide a database URL. + */ +public interface DatabaseUrlContainer { + /** + * Returns the original database URL that produced this connection string. + * + * @return the original database URL + */ + String getDatabaseUrl(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostInfo.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostInfo.java new file mode 100644 index 0000000..addcb40 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostInfo.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import static com.mysql.cj.util.StringUtils.isNullOrEmpty; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +/** + * This class holds the following MySQL host information: + *
      + *
    • host: an IP or host name. + *
    • port: the port number or 0 if not known. + *
    • user: the user name. + *
    • password: the password. + *
    • host properties: host specific connection arguments. + *
    + */ +public class HostInfo implements DatabaseUrlContainer { + public static final int NO_PORT = -1; + private static final String HOST_PORT_SEPARATOR = ":"; + + private final DatabaseUrlContainer originalUrl; + private final String host; + private final int port; + private final String user; + private final String password; + private final Map hostProperties = new HashMap<>(); + + /** + * Constructs an empty {@link HostInfo} instance. + */ + public HostInfo() { + this(null, null, NO_PORT, null, null, null); + } + + /** + * Constructs a {@link HostInfo} instance initialized with the provided host, port and user info. + * + * @param url + * a reference to the original database URL that produced this host info + * @param host + * the host ip or name + * @param port + * the port + * @param user + * the user name + * @param password + * the user's password + */ + public HostInfo(DatabaseUrlContainer url, String host, int port, String user, String password) { + this(url, host, port, user, password, null); + } + + /** + * Constructs a {@link HostInfo} instance initialized with the provided host, port, user, password and connection arguments. + * + * @param url + * a reference to the original database URL that produced this host info + * @param host + * the host ip or name + * @param port + * the port + * @param user + * the user name + * @param password + * this user's password + * @param properties + * a connection arguments map. + */ + public HostInfo(DatabaseUrlContainer url, String host, int port, String user, String password, Map properties) { + this.originalUrl = url; + this.host = host; + this.port = port; + this.user = user; + this.password = password; + if (properties != null) { + this.hostProperties.putAll(properties); + } + } + + /** + * Returns the host. + * + * @return the host + */ + public String getHost() { + return this.host; + } + + /** + * Returns the port. + * + * @return the port + */ + public int getPort() { + return this.port; + } + + /** + * Returns a host:port representation of this host. + * + * @return the host:port representation of this host + */ + public String getHostPortPair() { + return this.host + HOST_PORT_SEPARATOR + this.port; + } + + /** + * Returns the user name. + * + * @return the user name + */ + public String getUser() { + return this.user; + } + + /** + * Returns the password. + * + * @return the password + */ + public String getPassword() { + return this.password; + } + + /** + * Returns the properties specific to this host. + * + * @return this host specific properties + */ + public Map getHostProperties() { + return Collections.unmodifiableMap(this.hostProperties); + } + + /** + * Returns the connection argument for the given key. + * + * @param key + * key + * + * @return the connection argument for the given key + */ + public String getProperty(String key) { + return this.hostProperties.get(key); + } + + /** + * Shortcut to the database connection argument. + * + * @return the database name + */ + public String getDatabase() { + String database = this.hostProperties.get(PropertyKey.DBNAME.getKeyName()); + return isNullOrEmpty(database) ? "" : database; + } + + /** + * Exposes this host info as a single properties instance. The values for host, port, user and password are added to the properties map with their standard + * keys. + * + * @return a {@link Properties} instance containing the full host information. + */ + public Properties exposeAsProperties() { + Properties props = new Properties(); + this.hostProperties.entrySet().stream().forEach(e -> props.setProperty(e.getKey(), e.getValue() == null ? "" : e.getValue())); + props.setProperty(PropertyKey.HOST.getKeyName(), getHost()); + props.setProperty(PropertyKey.PORT.getKeyName(), String.valueOf(getPort())); + if (getUser() != null) { + props.setProperty(PropertyKey.USER.getKeyName(), getUser()); + } + if (getPassword() != null) { + props.setProperty(PropertyKey.PASSWORD.getKeyName(), getPassword()); + } + return props; + } + + /** + * Returns the original database URL that produced this host info. + * + * @return the original database URL + */ + @Override + public String getDatabaseUrl() { + return this.originalUrl != null ? this.originalUrl.getDatabaseUrl() : ""; + } + + /** + * Checks if this {@link HostInfo} has the same host and port pair as the given {@link HostInfo}. + * + * @param hi + * the {@link HostInfo} to compare with. + * @return + * true if both objects have equal host and port pairs, false otherwise. + */ + public boolean equalHostPortPair(HostInfo hi) { + return (getHost() != null && getHost().equals(hi.getHost()) || getHost() == null && hi.getHost() == null) && getPort() == hi.getPort(); + } + + /** + * Returns a string representation of this object. + * + * @return a string representation of this object + */ + @Override + public String toString() { + StringBuilder asStr = new StringBuilder(super.toString()); + asStr.append(String.format(" :: {host: \"%s\", port: %d, hostProperties: %s}", this.host, this.port, this.hostProperties)); + return asStr.toString(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostsListView.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostsListView.java new file mode 100644 index 0000000..7f7d1d5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/HostsListView.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +/** + * An enumeration that identifies the type of the view intended for getting hosts lists for multi-host connections. + */ +public enum HostsListView { + ALL, SOURCES, REPLICAS; +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinition.java new file mode 100644 index 0000000..ea36f25 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinition.java @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public interface PropertyDefinition { + + /** + * Does the property have fixed values based constraints. + * + * @return true if property has fixed values based constraints. + */ + boolean hasValueConstraints(); + + /** + * Returns true if property has range-based constraints + * + * @return true if property has range-based constraints + */ + boolean isRangeBased(); + + /** + * Get the property key. + * + * @return {@link PropertyKey} or null if it's a custom property. + */ + PropertyKey getPropertyKey(); + + /** + * Returns the property name. + * + * @return the property name + */ + String getName(); + + /** + * Returns the property camel-case alias. + * + * @return the property camel-case alias. + */ + String getCcAlias(); + + /** + * Returns true if property has a camel-case alias. + * + * @return true if property has a camel-case alias. + */ + boolean hasCcAlias(); + + /** + * Returns the default value. + * + * @return default value + */ + T getDefaultValue(); + + /** + * May the property be changed after initialization. + * + * @return true if the property value may be changed after initialization. + */ + boolean isRuntimeModifiable(); + + /** + * Returns the property description. Used for documentation. + * + * @return property description + */ + String getDescription(); + + /** + * Returns the driver version where the property was introduced first. Used for documentation. + * + * @return the driver version where the property was introduced first + */ + String getSinceVersion(); + + /** + * Returns the property category. + * + * @return property category + */ + String getCategory(); + + /** + * Returns the property order. Used as preferred property position in properties table in documentation. + * + * @return property order + */ + int getOrder(); + + /** + * Returns the list of allowable values. + * + * @return the list of allowable values + */ + String[] getAllowableValues(); + + /** + * The lowest possible value of range-based property + * + * @return the lowest possible value of range-based property + */ + int getLowerBound(); + + /** + * The highest possible value of range-based property + * + * @return the highest possible value of range-based property + */ + int getUpperBound(); + + /** + * Returns the value object parsed from it's string representation and checked against allowable values. + * + * @param value + * value + * @param exceptionInterceptor + * exception interceptor + * + * @return the value object + */ + T parseObject(String value, ExceptionInterceptor exceptionInterceptor); + + /** + * Creates instance of ReadableProperty or ModifiableProperty depending on isRuntimeModifiable() result. + * + * @return {@link RuntimeProperty} instance + */ + RuntimeProperty createRuntimeProperty(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinitions.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinitions.java new file mode 100644 index 0000000..cbd13b0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyDefinitions.java @@ -0,0 +1,890 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import com.mysql.cj.Messages; +import com.mysql.cj.PerConnectionLRUFactory; +import com.mysql.cj.log.Log; +import com.mysql.cj.log.StandardLogger; +import com.mysql.cj.util.PerVmServerConfigCacheFactory; + +public class PropertyDefinitions { + /* + * Built-in system properties. + */ + public static final String SYSP_line_separator = "line.separator"; + public static final String SYSP_java_vendor = "java.vendor"; + public static final String SYSP_java_version = "java.version"; + public static final String SYSP_java_vm_vendor = "java.vm.vendor"; + public static final String SYSP_os_name = "os.name"; + public static final String SYSP_os_arch = "os.arch"; + public static final String SYSP_os_version = "os.version"; + + /* + * Operational system properties. + */ + public static final String SYSP_disableAbandonedConnectionCleanup = "com.mysql.cj.disableAbandonedConnectionCleanup"; + + /* + * Testsuite system properties. + */ + public static final String SYSP_testsuite_url /* */ = "com.mysql.cj.testsuite.url"; + public static final String SYSP_testsuite_url_cluster /* */ = "com.mysql.cj.testsuite.url.cluster"; + + public static final String SYSP_testsuite_url_mysqlx /* */ = "com.mysql.cj.testsuite.mysqlx.url"; + + public static final String SYSP_testsuite_cantGrant /* */ = "com.mysql.cj.testsuite.cantGrant"; + public static final String SYSP_testsuite_unavailable_host /* */ = "com.mysql.cj.testsuite.unavailable.host"; + + /** For testsuite.regression.DataSourceRegressionTest */ + public static final String SYSP_testsuite_ds_host /* */ = "com.mysql.cj.testsuite.ds.host"; + /** For testsuite.regression.DataSourceRegressionTest */ + public static final String SYSP_testsuite_ds_port /* */ = "com.mysql.cj.testsuite.ds.port"; + /** For testsuite.regression.DataSourceRegressionTest */ + public static final String SYSP_testsuite_ds_db /* */ = "com.mysql.cj.testsuite.ds.db"; + /** For testsuite.regression.DataSourceRegressionTest */ + public static final String SYSP_testsuite_ds_user /* */ = "com.mysql.cj.testsuite.ds.user"; + /** For testsuite.regression.DataSourceRegressionTest */ + public static final String SYSP_testsuite_ds_password /* */ = "com.mysql.cj.testsuite.ds.password"; + + /** For testsuite.perf.LoadStorePerfTest */ + public static final String SYSP_testsuite_loadstoreperf_tabletype /* */ = "com.mysql.cj.testsuite.loadstoreperf.tabletype"; // TODO document allowed types + /** For testsuite.perf.LoadStorePerfTest */ + public static final String SYSP_testsuite_loadstoreperf_useBigResults /* */ = "com.mysql.cj.testsuite.loadstoreperf.useBigResults"; + + /** The system property that must exist to run the shutdown test in testsuite.simple.MiniAdminTest */ + public static final String SYSP_testsuite_miniAdminTest_runShutdown /* */ = "com.mysql.cj.testsuite.miniAdminTest.runShutdown"; + + /** Suppress debug output when running testsuite */ + public static final String SYSP_testsuite_noDebugOutput /* */ = "com.mysql.cj.testsuite.noDebugOutput"; + /** Don't remove database object created by tests */ + public static final String SYSP_testsuite_retainArtifacts /* */ = "com.mysql.cj.testsuite.retainArtifacts"; + public static final String SYSP_testsuite_runLongTests /* */ = "com.mysql.cj.testsuite.runLongTests"; + public static final String SYSP_testsuite_serverController_basedir /* */ = "com.mysql.cj.testsuite.serverController.basedir"; + + /* + * Build system properties. + */ + public static final String SYSP_com_mysql_cj_build_verbose /* */ = "com.mysql.cj.build.verbose"; + + /* + * Categories of connection properties. + */ + public static final String CATEGORY_AUTH = Messages.getString("ConnectionProperties.categoryAuthentication"); + public static final String CATEGORY_CONNECTION = Messages.getString("ConnectionProperties.categoryConnection"); + public static final String CATEGORY_SESSION = Messages.getString("ConnectionProperties.categorySession"); + public static final String CATEGORY_NETWORK = Messages.getString("ConnectionProperties.categoryNetworking"); + public static final String CATEGORY_SECURITY = Messages.getString("ConnectionProperties.categorySecurity"); + public static final String CATEGORY_STATEMENTS = Messages.getString("ConnectionProperties.categoryStatements"); + public static final String CATEGORY_PREPARED_STATEMENTS = Messages.getString("ConnectionProperties.categoryPreparedStatements"); + public static final String CATEGORY_RESULT_SETS = Messages.getString("ConnectionProperties.categoryResultSets"); + public static final String CATEGORY_METADATA = Messages.getString("ConnectionProperties.categoryMetadata"); + public static final String CATEGORY_BLOBS = Messages.getString("ConnectionProperties.categoryBlobs"); + public static final String CATEGORY_DATETIMES = Messages.getString("ConnectionProperties.categoryDatetimes"); + public static final String CATEGORY_HA = Messages.getString("ConnectionProperties.categoryHA"); + public static final String CATEGORY_PERFORMANCE = Messages.getString("ConnectionProperties.categoryPerformance"); + public static final String CATEGORY_DEBUGING_PROFILING = Messages.getString("ConnectionProperties.categoryDebuggingProfiling"); + public static final String CATEGORY_EXCEPTIONS = Messages.getString("ConnectionProperties.categoryExceptions"); + public static final String CATEGORY_INTEGRATION = Messages.getString("ConnectionProperties.categoryIntegration"); + public static final String CATEGORY_JDBC = Messages.getString("ConnectionProperties.categoryJDBC"); + public static final String CATEGORY_XDEVAPI = Messages.getString("ConnectionProperties.categoryXDevAPI"); + public static final String CATEGORY_USER_DEFINED = Messages.getString("ConnectionProperties.categoryUserDefined"); + + public static final String[] PROPERTY_CATEGORIES = new String[] { CATEGORY_AUTH, CATEGORY_CONNECTION, CATEGORY_SESSION, CATEGORY_NETWORK, CATEGORY_SECURITY, + CATEGORY_STATEMENTS, CATEGORY_PREPARED_STATEMENTS, CATEGORY_RESULT_SETS, CATEGORY_METADATA, CATEGORY_BLOBS, CATEGORY_DATETIMES, CATEGORY_HA, + CATEGORY_PERFORMANCE, CATEGORY_DEBUGING_PROFILING, CATEGORY_EXCEPTIONS, CATEGORY_INTEGRATION, CATEGORY_JDBC, CATEGORY_XDEVAPI }; + + /* + * Property modifiers. + */ + public static final boolean DEFAULT_VALUE_TRUE = true; + public static final boolean DEFAULT_VALUE_FALSE = false; + public static final String DEFAULT_VALUE_NULL_STRING = null; + public static final String NO_ALIAS = null; + + /** is modifiable in run-time */ + public static final boolean RUNTIME_MODIFIABLE = true; + + /** is not modifiable in run-time (will allow to set not-null value only once) */ + public static final boolean RUNTIME_NOT_MODIFIABLE = false; + + /* + * Property enums. + */ + public enum ZeroDatetimeBehavior { // zeroDateTimeBehavior + CONVERT_TO_NULL, EXCEPTION, ROUND; + } + + public enum SslMode { + PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY, DISABLED; + } + + public enum XdevapiSslMode { + REQUIRED, VERIFY_CA, VERIFY_IDENTITY, DISABLED; + } + + public enum AuthMech { // xdevapi.auth + PLAIN, MYSQL41, SHA256_MEMORY, EXTERNAL; + } + + public enum Compression { // xdevapi.compress + PREFERRED, REQUIRED, DISABLED; + } + + public enum DatabaseTerm { + CATALOG, SCHEMA; + } + + /** + * Static unmodifiable {@link PropertyKey} -> {@link PropertyDefinition} map. + */ + public static final Map> PROPERTY_KEY_TO_PROPERTY_DEFINITION; + + static { + String STANDARD_LOGGER_NAME = StandardLogger.class.getName(); + + PropertyDefinition[] pdefs = new PropertyDefinition[] { + // + // CATEGORY_AUTHENTICATION + // + new StringPropertyDefinition(PropertyKey.USER, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.Username"), Messages.getString("ConnectionProperties.allVersions"), CATEGORY_AUTH, + Integer.MIN_VALUE + 1), + + new StringPropertyDefinition(PropertyKey.PASSWORD, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.Password"), Messages.getString("ConnectionProperties.allVersions"), CATEGORY_AUTH, + Integer.MIN_VALUE + 2), + + new StringPropertyDefinition(PropertyKey.password1, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.Password1"), "8.0.28", CATEGORY_AUTH, Integer.MIN_VALUE + 3), + + new StringPropertyDefinition(PropertyKey.password2, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.Password2"), "8.0.28", CATEGORY_AUTH, Integer.MIN_VALUE + 4), + + new StringPropertyDefinition(PropertyKey.password3, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.Password3"), "8.0.28", CATEGORY_AUTH, Integer.MIN_VALUE + 5), + + new StringPropertyDefinition(PropertyKey.authenticationPlugins, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.authenticationPlugins"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 6), + + new StringPropertyDefinition(PropertyKey.disabledAuthenticationPlugins, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.disabledAuthenticationPlugins"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 7), + + new StringPropertyDefinition(PropertyKey.defaultAuthenticationPlugin, "mysql_native_password", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.defaultAuthenticationPlugin"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 8), + + new StringPropertyDefinition(PropertyKey.ldapServerHostname, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.ldapServerHostname"), "8.0.23", CATEGORY_AUTH, Integer.MIN_VALUE + 9), + + new StringPropertyDefinition(PropertyKey.ociConfigFile, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.ociConfigFile"), "8.0.27", CATEGORY_AUTH, Integer.MIN_VALUE + 7), + + new StringPropertyDefinition(PropertyKey.authenticationFidoCallbackHandler, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.authenticationFidoCallbackHandler"), "8.0.29", CATEGORY_AUTH, Integer.MIN_VALUE + 8), + + // + // CATEGORY_CONNECTION + // + new StringPropertyDefinition(PropertyKey.passwordCharacterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.passwordCharacterEncoding"), "5.1.7", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.connectionAttributes, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.connectionAttributes"), "5.1.25", CATEGORY_CONNECTION, 7), + + new StringPropertyDefinition(PropertyKey.clientInfoProvider, "com.mysql.cj.jdbc.CommentClientInfoProvider", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clientInfoProvider"), "5.1.0", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.connectionLifecycleInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.connectionLifecycleInterceptors"), "5.1.4", CATEGORY_CONNECTION, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.createDatabaseIfNotExist, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.createDatabaseIfNotExist"), "3.1.9", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.interactiveClient, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.interactiveClient"), "3.1.0", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.propertiesTransform, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.connectionPropertiesTransform"), "3.1.4", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.rollbackOnPooledClose, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.rollbackOnPooledClose"), "3.0.15", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.useConfigs, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useConfigs"), "3.1.5", CATEGORY_CONNECTION, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useAffectedRows, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useAffectedRows"), "5.1.7", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.disconnectOnExpiredPasswords, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.disconnectOnExpiredPasswords"), "5.1.23", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.detectCustomCollations, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.detectCustomCollations"), "5.1.29", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + new EnumPropertyDefinition<>(PropertyKey.databaseTerm, DatabaseTerm.CATALOG, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.databaseTerm"), "8.0.17", CATEGORY_CONNECTION, Integer.MIN_VALUE), + + // + // CATEGORY_SESSION + // + new StringPropertyDefinition(PropertyKey.characterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.characterEncoding"), "1.1g", CATEGORY_SESSION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.characterSetResults, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.characterSetResults"), "3.0.13", CATEGORY_SESSION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.customCharsetMapping, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.customCharsetMapping"), "8.0.26", CATEGORY_SESSION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.connectionCollation, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.connectionCollation"), "3.0.13", CATEGORY_SESSION, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.sessionVariables, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.sessionVariables"), "3.1.8", CATEGORY_SESSION, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.trackSessionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.trackSessionState"), "8.0.26", CATEGORY_SESSION, Integer.MIN_VALUE), + + // + // CATEGORY_NETWORK + // + new BooleanPropertyDefinition(PropertyKey.useUnbufferedInput, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useUnbufferedInput"), "3.0.11", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.connectTimeout, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.connectTimeout"), + "3.0.1", CATEGORY_NETWORK, 9, 0, Integer.MAX_VALUE), + + new StringPropertyDefinition(PropertyKey.localSocketAddress, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.localSocketAddress"), "5.0.5", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.socketFactory, "com.mysql.cj.protocol.StandardSocketFactory", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.socketFactory"), "3.0.3", CATEGORY_NETWORK, 4), + + new StringPropertyDefinition(PropertyKey.socksProxyHost, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.socksProxyHost"), "5.1.34", CATEGORY_NETWORK, 1), + + new IntegerPropertyDefinition(PropertyKey.socksProxyPort, 1080, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.socksProxyPort"), + "5.1.34", CATEGORY_NETWORK, 2, 0, 65535), + + new BooleanPropertyDefinition(PropertyKey.socksProxyRemoteDns, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.socksProxyRemoteDns"), "8.0.29", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.socketTimeout, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.socketTimeout"), + "3.0.1", CATEGORY_NETWORK, 10, 0, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.tcpNoDelay, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.tcpNoDelay"), "5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.tcpKeepAlive, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.tcpKeepAlive"), "5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.tcpRcvBuf, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpSoRcvBuf"), "5.0.7", + CATEGORY_NETWORK, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.tcpSndBuf, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpSoSndBuf"), "5.0.7", + CATEGORY_NETWORK, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.tcpTrafficClass, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpTrafficClass"), + "5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE, 0, 255), + + new BooleanPropertyDefinition(PropertyKey.useCompression, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useCompression"), "3.0.17", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.maxAllowedPacket, 65535, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.maxAllowedPacket"), "5.1.8", CATEGORY_NETWORK, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.dnsSrv, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.dnsSrv"), "8.0.19", CATEGORY_NETWORK, Integer.MIN_VALUE), + + // + // CATEGORY_SECURITY + // + new BooleanPropertyDefinition(PropertyKey.paranoid, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.paranoid"), "3.0.1", CATEGORY_SECURITY, 1), + + new StringPropertyDefinition(PropertyKey.serverRSAPublicKeyFile, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.serverRSAPublicKeyFile"), "5.1.31", CATEGORY_SECURITY, 2), + + new BooleanPropertyDefinition(PropertyKey.allowPublicKeyRetrieval, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowPublicKeyRetrieval"), "5.1.31", CATEGORY_SECURITY, 3), + + new EnumPropertyDefinition<>(PropertyKey.sslMode, SslMode.PREFERRED, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.sslMode"), + "8.0.13", CATEGORY_SECURITY, 4), + + new StringPropertyDefinition(PropertyKey.trustCertificateKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.trustCertificateKeyStoreUrl"), "5.1.0", CATEGORY_SECURITY, 5), + + new StringPropertyDefinition(PropertyKey.trustCertificateKeyStoreType, "JKS", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.trustCertificateKeyStoreType"), "5.1.0", CATEGORY_SECURITY, 6), + + new StringPropertyDefinition(PropertyKey.trustCertificateKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.trustCertificateKeyStorePassword"), "5.1.0", CATEGORY_SECURITY, 7), + + new BooleanPropertyDefinition(PropertyKey.fallbackToSystemTrustStore, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.fallbackToSystemTrustStore"), "8.0.22", CATEGORY_SECURITY, 8), + + new StringPropertyDefinition(PropertyKey.clientCertificateKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clientCertificateKeyStoreUrl"), "5.1.0", CATEGORY_SECURITY, 9), + + new StringPropertyDefinition(PropertyKey.clientCertificateKeyStoreType, "JKS", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clientCertificateKeyStoreType"), "5.1.0", CATEGORY_SECURITY, 10), + + new StringPropertyDefinition(PropertyKey.clientCertificateKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clientCertificateKeyStorePassword"), "5.1.0", CATEGORY_SECURITY, 11), + + new BooleanPropertyDefinition(PropertyKey.fallbackToSystemKeyStore, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.fallbackToSystemKeyStore"), "8.0.22", CATEGORY_SECURITY, 12), + + new StringPropertyDefinition(PropertyKey.tlsCiphersuites, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.tlsCiphersuites"), "5.1.35", CATEGORY_SECURITY, 13), + + new StringPropertyDefinition(PropertyKey.tlsVersions, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.tlsVersions"), "8.0.8", CATEGORY_SECURITY, 14), + + new BooleanPropertyDefinition(PropertyKey.allowLoadLocalInfile, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadDataLocal"), "3.0.3", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new StringPropertyDefinition(PropertyKey.allowLoadLocalInfileInPath, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadDataLocalInPath"), "8.0.22", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.allowMultiQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowMultiQueries"), "3.1.1", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.allowUrlInLocalInfile, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowUrlInLoadLocal"), "3.1.4", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useSSL, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.useSSL"), + "3.0.2", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.requireSSL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.requireSSL"), "3.1.0", CATEGORY_SECURITY, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.verifyServerCertificate, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.verifyServerCertificate"), "5.1.6", CATEGORY_SECURITY, Integer.MAX_VALUE), + + // + // CATEGORY_STATEMENTS + // + new BooleanPropertyDefinition(PropertyKey.continueBatchOnError, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.continueBatchOnError"), "3.0.3", CATEGORY_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.dontTrackOpenResources, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.dontTrackOpenResources"), "3.1.7", CATEGORY_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.queryTimeoutKillsConnection, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.queryTimeoutKillsConnection"), "5.1.9", CATEGORY_STATEMENTS, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.queryInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.queryInterceptors"), "8.0.7", CATEGORY_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.cacheDefaultTimeZone, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.cacheDefaultTimeZone"), "8.0.20", CATEGORY_STATEMENTS, Integer.MIN_VALUE), + + // + // CATEGORY_PREPARED_STATEMENTS + // + new BooleanPropertyDefinition(PropertyKey.allowNanAndInf, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowNANandINF"), "3.1.5", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.autoClosePStmtStreams, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoClosePstmtStreams"), "3.1.12", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.compensateOnDuplicateKeyUpdateCounts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.compensateOnDuplicateKeyUpdateCounts"), "5.1.7", CATEGORY_PREPARED_STATEMENTS, + Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useServerPrepStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useServerPrepStmts"), "3.1.0", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.emulateUnsupportedPstmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.emulateUnsupportedPstmts"), "3.1.7", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.generateSimpleParameterMetadata, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.generateSimpleParameterMetadata"), "5.0.5", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.processEscapeCodesForPrepStmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.processEscapeCodesForPrepStmts"), "3.1.12", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useStreamLengthsInPrepStmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useStreamLengthsInPrepStmts"), "3.0.2", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE), + + // + // CATEGORY_RESULT_SETS + // + new BooleanPropertyDefinition(PropertyKey.clobberStreamingResults, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clobberStreamingResults"), "3.0.9", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.emptyStringsConvertToZero, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.emptyStringsConvertToZero"), "3.1.8", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.holdResultsOpenOverStatementClose, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.holdRSOpenOverStmtClose"), "3.1.7", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.jdbcCompliantTruncation, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.jdbcCompliantTruncation"), "3.1.2", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.maxRows, -1, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.maxRows"), + Messages.getString("ConnectionProperties.allVersions"), CATEGORY_RESULT_SETS, Integer.MIN_VALUE, -1, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.netTimeoutForStreamingResults, 600, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.netTimeoutForStreamingResults"), "5.1.0", CATEGORY_RESULT_SETS, Integer.MIN_VALUE, 0, + Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.padCharsWithSpace, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.padCharsWithSpace"), "5.0.6", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.populateInsertRowWithDefaultValues, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.populateInsertRowWithDefaultValues"), "5.0.5", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.strictUpdates, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.strictUpdates"), "3.0.4", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.tinyInt1isBit, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.tinyInt1isBit"), "3.0.16", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.transformedBitIsBoolean, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.transformedBitIsBoolean"), "3.1.9", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.scrollTolerantForwardOnly, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.scrollTolerantForwardOnly"), "8.0.24", CATEGORY_RESULT_SETS, Integer.MIN_VALUE), + + // + // CATEGORY_METADATA + // + new BooleanPropertyDefinition(PropertyKey.noAccessToProcedureBodies, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.noAccessToProcedureBodies"), "5.0.3", CATEGORY_METADATA, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.nullDatabaseMeansCurrent, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.nullCatalogMeansCurrent"), "3.1.8", CATEGORY_METADATA, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useHostsInPrivileges, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useHostsInPrivileges"), "3.0.2", CATEGORY_METADATA, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useInformationSchema, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useInformationSchema"), "5.0.0", CATEGORY_METADATA, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.getProceduresReturnsFunctions, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.getProceduresReturnsFunctions"), "5.1.26", CATEGORY_METADATA, Integer.MIN_VALUE), + + // + // CATEGORY_BLOBS + // + new BooleanPropertyDefinition(PropertyKey.autoDeserialize, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoDeserialize"), "3.1.5", CATEGORY_BLOBS, Integer.MIN_VALUE), + + new MemorySizePropertyDefinition(PropertyKey.blobSendChunkSize, 1024 * 1024, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.blobSendChunkSize"), "3.1.9", CATEGORY_BLOBS, Integer.MIN_VALUE, 0, 0), + + new BooleanPropertyDefinition(PropertyKey.blobsAreStrings, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.blobsAreStrings"), "5.0.8", CATEGORY_BLOBS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.functionsNeverReturnBlobs, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.functionsNeverReturnBlobs"), "5.0.8", CATEGORY_BLOBS, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.clobCharacterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.clobCharacterEncoding"), "5.0.0", CATEGORY_BLOBS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.emulateLocators, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.emulateLocators"), "3.1.0", CATEGORY_BLOBS, Integer.MIN_VALUE), + + new MemorySizePropertyDefinition(PropertyKey.locatorFetchBufferSize, 1024 * 1024, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.locatorFetchBufferSize"), "3.2.1", CATEGORY_BLOBS, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + + // + // CATEGORY_DATETIMES + // + new BooleanPropertyDefinition(PropertyKey.noDatetimeStringSync, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.noDatetimeStringSync"), "3.1.7", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.connectionTimeZone, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.connectionTimeZone"), "3.0.2", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.forceConnectionTimeZoneToSession, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.forceConnectionTimeZoneToSession"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.preserveInstants, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.preserveInstants"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.treatUtilDateAsTimestamp, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.treatUtilDateAsTimestamp"), "5.0.5", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.sendFractionalSeconds, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.sendFractionalSeconds"), "5.1.37", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.sendFractionalSecondsForTime, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.sendFractionalSecondsForTime"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.yearIsDateType, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.yearIsDateType"), "3.1.9", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + new EnumPropertyDefinition<>(PropertyKey.zeroDateTimeBehavior, ZeroDatetimeBehavior.EXCEPTION, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.zeroDateTimeBehavior", + new Object[] { ZeroDatetimeBehavior.EXCEPTION, ZeroDatetimeBehavior.ROUND, ZeroDatetimeBehavior.CONVERT_TO_NULL }), + "3.1.4", CATEGORY_DATETIMES, Integer.MIN_VALUE), + + // + // CATEGORY_HA + // + new BooleanPropertyDefinition(PropertyKey.allowSourceDownConnections, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowSourceDownConnections"), "5.1.27", CATEGORY_HA, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.allowReplicaDownConnections, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.allowReplicaDownConnections"), "6.0.2", CATEGORY_HA, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.readFromSourceWhenNoReplicas, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.readFromSourceWhenNoReplicas"), "6.0.2", CATEGORY_HA, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.autoReconnect, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoReconnect"), "1.1", CATEGORY_HA, 0), + + new BooleanPropertyDefinition(PropertyKey.autoReconnectForPools, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoReconnectForPools"), "3.1.3", CATEGORY_HA, 1), + + new BooleanPropertyDefinition(PropertyKey.failOverReadOnly, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.failoverReadOnly"), "3.0.12", CATEGORY_HA, 2), + + new IntegerPropertyDefinition(PropertyKey.initialTimeout, 2, RUNTIME_NOT_MODIFIABLE, Messages.getString("ConnectionProperties.initialTimeout"), + "1.1", CATEGORY_HA, 5, 1, Integer.MAX_VALUE), + + new StringPropertyDefinition(PropertyKey.ha_loadBalanceStrategy, "random", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceStrategy"), "5.0.6", CATEGORY_HA, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.loadBalanceBlocklistTimeout, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceBlocklistTimeout"), "5.1.0", CATEGORY_HA, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.loadBalancePingTimeout, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalancePingTimeout"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.loadBalanceValidateConnectionOnSwapServer, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceValidateConnectionOnSwapServer"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.loadBalanceConnectionGroup, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceConnectionGroup"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.loadBalanceExceptionChecker, "com.mysql.cj.jdbc.ha.StandardLoadBalanceExceptionChecker", + RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.loadBalanceExceptionChecker"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.loadBalanceSQLStateFailover, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceSQLStateFailover"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.loadBalanceSQLExceptionSubclassFailover, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceSQLExceptionSubclassFailover"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.loadBalanceAutoCommitStatementRegex, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementRegex"), "5.1.15", CATEGORY_HA, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.loadBalanceAutoCommitStatementThreshold, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementThreshold"), "5.1.15", CATEGORY_HA, Integer.MIN_VALUE, 0, + Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.maxReconnects, 3, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.maxReconnects"), "1.1", + CATEGORY_HA, 4, 1, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.retriesAllDown, 120, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.retriesAllDown"), + "5.1.6", CATEGORY_HA, 4, 0, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.pinGlobalTxToPhysicalConnection, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.pinGlobalTxToPhysicalConnection"), "5.0.1", CATEGORY_HA, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.queriesBeforeRetrySource, 50, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.queriesBeforeRetrySource"), "3.0.2", CATEGORY_HA, 7, 0, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.reconnectAtTxEnd, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.reconnectAtTxEnd"), "3.0.10", CATEGORY_HA, 4), + + new StringPropertyDefinition(PropertyKey.replicationConnectionGroup, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.replicationConnectionGroup"), "8.0.7", CATEGORY_HA, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.resourceId, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.resourceId"), "5.0.1", CATEGORY_HA, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.secondsBeforeRetrySource, 30, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.secondsBeforeRetrySource"), "3.0.2", CATEGORY_HA, 8, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.selfDestructOnPingSecondsLifetime, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.selfDestructOnPingSecondsLifetime"), "5.1.6", CATEGORY_HA, Integer.MAX_VALUE, 0, + Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.selfDestructOnPingMaxOperations, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.selfDestructOnPingMaxOperations"), "5.1.6", CATEGORY_HA, Integer.MAX_VALUE, 0, + Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.ha_enableJMX, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.ha.enableJMX"), "5.1.27", CATEGORY_HA, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.loadBalanceHostRemovalGracePeriod, 15000, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.loadBalanceHostRemovalGracePeriod"), "6.0.3", CATEGORY_HA, Integer.MAX_VALUE, 0, + Integer.MAX_VALUE), + + new StringPropertyDefinition(PropertyKey.serverAffinityOrder, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.serverAffinityOrder"), "8.0.8", CATEGORY_HA, Integer.MIN_VALUE), + + // + // CATEGORY_PERFORMANCE + // + new BooleanPropertyDefinition(PropertyKey.alwaysSendSetIsolation, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.alwaysSendSetIsolation"), "3.1.7", CATEGORY_PERFORMANCE, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.cacheCallableStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.cacheCallableStatements"), "3.1.2", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.cachePrepStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.cachePrepStmts"), "3.0.10", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.cacheResultSetMetadata, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.cacheRSMetadata"), "3.1.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.serverConfigCacheFactory, PerVmServerConfigCacheFactory.class.getName(), RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.serverConfigCacheFactory"), "5.1.1", CATEGORY_PERFORMANCE, 12), + + new BooleanPropertyDefinition(PropertyKey.cacheServerConfiguration, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.cacheServerConfiguration"), "3.1.5", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new IntegerPropertyDefinition(PropertyKey.callableStmtCacheSize, 100, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.callableStmtCacheSize"), "3.1.2", CATEGORY_PERFORMANCE, 5, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.defaultFetchSize, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.defaultFetchSize"), + "3.1.9", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.elideSetAutoCommits, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.elideSetAutoCommit"), "3.1.3", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.enableQueryTimeouts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.enableQueryTimeouts"), "5.0.6", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new MemorySizePropertyDefinition(PropertyKey.largeRowSizeThreshold, 2048, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.largeRowSizeThreshold"), "5.1.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE, 0, + Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.maintainTimeStats, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.maintainTimeStats"), "3.1.9", CATEGORY_PERFORMANCE, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.metadataCacheSize, 50, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.metadataCacheSize"), "3.1.1", CATEGORY_PERFORMANCE, 5, 1, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.prepStmtCacheSize, 25, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.prepStmtCacheSize"), "3.0.10", CATEGORY_PERFORMANCE, 10, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.prepStmtCacheSqlLimit, 256, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.prepStmtCacheSqlLimit"), "3.0.10", CATEGORY_PERFORMANCE, 11, 1, Integer.MAX_VALUE), + + new StringPropertyDefinition(PropertyKey.queryInfoCacheFactory, PerConnectionLRUFactory.class.getName(), RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.queryInfoCacheFactory"), "5.1.1", CATEGORY_PERFORMANCE, 12), + + new BooleanPropertyDefinition(PropertyKey.rewriteBatchedStatements, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.rewriteBatchedStatements"), "3.1.13", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useCursorFetch, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useCursorFetch"), "5.0.0", CATEGORY_PERFORMANCE, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useLocalSessionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useLocalSessionState"), "3.1.7", CATEGORY_PERFORMANCE, 5), + + new BooleanPropertyDefinition(PropertyKey.useLocalTransactionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useLocalTransactionState"), "5.1.7", CATEGORY_PERFORMANCE, 6), + + new BooleanPropertyDefinition(PropertyKey.useReadAheadInput, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useReadAheadInput"), "3.1.5", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.dontCheckOnDuplicateKeyUpdateInSQL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.dontCheckOnDuplicateKeyUpdateInSQL"), "5.1.32", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.readOnlyPropagatesToServer, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.readOnlyPropagatesToServer"), "5.1.35", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.enableEscapeProcessing, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.enableEscapeProcessing"), "6.0.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE), + + // + // CATEGORY_DEBUGING_PROFILING + // + new StringPropertyDefinition(PropertyKey.logger, STANDARD_LOGGER_NAME, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.logger", new Object[] { Log.class.getName(), STANDARD_LOGGER_NAME }), "3.1.1", + CATEGORY_DEBUGING_PROFILING, 0), + + new StringPropertyDefinition(PropertyKey.profilerEventHandler, "com.mysql.cj.log.LoggingProfilerEventHandler", RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.profilerEventHandler"), "5.1.6", CATEGORY_DEBUGING_PROFILING, 1), + + new BooleanPropertyDefinition(PropertyKey.useNanosForElapsedTime, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useNanosForElapsedTime"), "5.0.7", CATEGORY_DEBUGING_PROFILING, 2), + + new IntegerPropertyDefinition(PropertyKey.maxQuerySizeToLog, 2048, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.maxQuerySizeToLog"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 3, 0, Integer.MAX_VALUE), + + new IntegerPropertyDefinition(PropertyKey.maxByteArrayAsHex, 1024, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.maxByteArrayAsHex"), "8.0.31", CATEGORY_DEBUGING_PROFILING, 4, 0, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.profileSQL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.profileSQL"), "3.1.0", CATEGORY_DEBUGING_PROFILING, 4), + + new BooleanPropertyDefinition(PropertyKey.logSlowQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.logSlowQueries"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 5), + + new IntegerPropertyDefinition(PropertyKey.slowQueryThresholdMillis, 2000, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.slowQueryThresholdMillis"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 6, 0, Integer.MAX_VALUE), + + new LongPropertyDefinition(PropertyKey.slowQueryThresholdNanos, 0, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.slowQueryThresholdNanos"), "5.0.7", CATEGORY_DEBUGING_PROFILING, 7), + + new BooleanPropertyDefinition(PropertyKey.autoSlowLog, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoSlowLog"), "5.1.4", CATEGORY_DEBUGING_PROFILING, 8), + + new BooleanPropertyDefinition(PropertyKey.explainSlowQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.explainSlowQueries"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 9), + + new BooleanPropertyDefinition(PropertyKey.gatherPerfMetrics, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.gatherPerfMetrics"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 10), + + new IntegerPropertyDefinition(PropertyKey.reportMetricsIntervalMillis, 30000, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.reportMetricsIntervalMillis"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 11, 0, Integer.MAX_VALUE), // TODO currently is not used !!! + + new BooleanPropertyDefinition(PropertyKey.logXaCommands, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.logXaCommands"), "5.0.5", CATEGORY_DEBUGING_PROFILING, 12), + + new BooleanPropertyDefinition(PropertyKey.traceProtocol, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.traceProtocol"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 13), + + new BooleanPropertyDefinition(PropertyKey.enablePacketDebug, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.enablePacketDebug"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 14), + + new IntegerPropertyDefinition(PropertyKey.packetDebugBufferSize, 20, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.packetDebugBufferSize"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 15, 1, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useUsageAdvisor, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useUsageAdvisor"), "3.1.1", CATEGORY_DEBUGING_PROFILING, 16), + + new IntegerPropertyDefinition(PropertyKey.resultSetSizeThreshold, 100, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.resultSetSizeThreshold"), "5.0.5", CATEGORY_DEBUGING_PROFILING, 17), + + new BooleanPropertyDefinition(PropertyKey.autoGenerateTestcaseScript, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.autoGenerateTestcaseScript"), "3.1.9", CATEGORY_DEBUGING_PROFILING, 18), + + // + // CATEGORY_EXCEPTIONS + // + new BooleanPropertyDefinition(PropertyKey.dumpQueriesOnException, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.dumpQueriesOnException"), "3.1.3", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new StringPropertyDefinition(PropertyKey.exceptionInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.exceptionInterceptors"), "5.1.8", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.includeInnodbStatusInDeadlockExceptions, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.includeInnodbStatusInDeadlockExceptions"), "5.0.7", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.includeThreadDumpInDeadlockExceptions, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.includeThreadDumpInDeadlockExceptions"), "5.1.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.includeThreadNamesAsStatementComment, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.includeThreadNamesAsStatementComment"), "5.1.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.ignoreNonTxTables, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.ignoreNonTxTables"), "3.0.9", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useOnlyServerErrorMessages, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useOnlyServerErrorMessages"), "3.0.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE), + + // + // CATEGORY_INTEGRATION + // + new BooleanPropertyDefinition(PropertyKey.overrideSupportsIntegrityEnhancementFacility, false, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.overrideSupportsIEF"), "3.1.12", CATEGORY_INTEGRATION, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.ultraDevHack, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.ultraDevHack"), "2.0.3", CATEGORY_INTEGRATION, Integer.MIN_VALUE), + + // + // CATEGORY_JDBC + // + new BooleanPropertyDefinition(PropertyKey.pedantic, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.pedantic"), "3.0.0", CATEGORY_JDBC, Integer.MIN_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useColumnNamesInFindColumn, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useColumnNamesInFindColumn"), "5.1.7", CATEGORY_JDBC, Integer.MAX_VALUE), + + new BooleanPropertyDefinition(PropertyKey.useOldAliasMetadataBehavior, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.useOldAliasMetadataBehavior"), "5.0.4", CATEGORY_JDBC, Integer.MIN_VALUE), + + // + // CATEGORY_XDEVAPI + // + new EnumPropertyDefinition<>(PropertyKey.xdevapiSslMode, XdevapiSslMode.REQUIRED, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslMode"), "8.0.7", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiTlsCiphersuites, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiTlsCiphersuites"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiTlsVersions, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiTlsVersions"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslKeyStoreUrl"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslKeyStorePassword"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStoreType, "JKS", RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslKeyStoreType"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new BooleanPropertyDefinition(PropertyKey.xdevapiFallbackToSystemKeyStore, DEFAULT_VALUE_TRUE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiFallbackToSystemKeyStore"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslTrustStoreUrl"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslTrustStorePassword"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStoreType, "JKS", RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiSslTrustStoreType"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new BooleanPropertyDefinition(PropertyKey.xdevapiFallbackToSystemTrustStore, DEFAULT_VALUE_TRUE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiFallbackToSystemTrustStore"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new EnumPropertyDefinition<>(PropertyKey.xdevapiAuth, AuthMech.PLAIN, RUNTIME_NOT_MODIFIABLE, Messages.getString("ConnectionProperties.auth"), + "8.0.8", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new IntegerPropertyDefinition(PropertyKey.xdevapiConnectTimeout, 10000, RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiConnectTimeout"), "8.0.13", CATEGORY_XDEVAPI, Integer.MIN_VALUE, 0, Integer.MAX_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiConnectionAttributes, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiConnectionAttributes"), "8.0.16", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new BooleanPropertyDefinition(PropertyKey.xdevapiDnsSrv, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiDnsSrv"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new EnumPropertyDefinition<>(PropertyKey.xdevapiCompression, Compression.PREFERRED, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiCompression"), "8.0.20", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiCompressionAlgorithms, "zstd_stream,lz4_message,deflate_stream", RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiCompressionAlgorithms"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE), + new StringPropertyDefinition(PropertyKey.xdevapiCompressionExtensions, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE, + Messages.getString("ConnectionProperties.xdevapiCompressionExtensions"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE) + // + }; + + HashMap> propertyKeyToPropertyDefinitionMap = new HashMap<>(); + for (PropertyDefinition pdef : pdefs) { + propertyKeyToPropertyDefinitionMap.put(pdef.getPropertyKey(), pdef); + } + PROPERTY_KEY_TO_PROPERTY_DEFINITION = Collections.unmodifiableMap(propertyKeyToPropertyDefinitionMap); + } + + public static PropertyDefinition getPropertyDefinition(PropertyKey propertyKey) { + return PROPERTY_KEY_TO_PROPERTY_DEFINITION.get(propertyKey); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyKey.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyKey.java new file mode 100644 index 0000000..07df684 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertyKey.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2018, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Map; +import java.util.TreeMap; + +/** + * PropertyKey handles connection property names, their camel-case aliases and case sensitivity. + */ +public enum PropertyKey { + /* + * Properties individually managed after parsing connection string. These property keys are case insensitive. + */ + /** The database user name. */ + USER("user", false), + /** The database user password. */ + PASSWORD("password", false), + /** The hostname value from the properties instance passed to the driver. */ + HOST("host", false), + /** The port number value from the properties instance passed to the driver. */ + PORT("port", false), + /** The communications protocol. Possible values: "tcp" and "pipe". */ + PROTOCOL("protocol", false), + /** The name pipes path to use when "protocol=pipe'. */ + PATH("path", "namedPipePath", false), + /** The server type in a replication setup. Possible values: "source" and "replica". */ + TYPE("type", false), + /** The address value ("host:port") from the properties instance passed to the driver. */ + ADDRESS("address", false), + /** The host priority in a list of hosts. */ + PRIORITY("priority", false), + /** The database value from the properties instance passed to the driver. */ + DBNAME("dbname", false), // + + allowLoadLocalInfile("allowLoadLocalInfile", true), // + allowLoadLocalInfileInPath("allowLoadLocalInfileInPath", true), // + allowMultiQueries("allowMultiQueries", true), // + allowNanAndInf("allowNanAndInf", true), // + allowPublicKeyRetrieval("allowPublicKeyRetrieval", true), // + allowReplicaDownConnections("allowReplicaDownConnections", "allowSlaveDownConnections", true), // + allowSourceDownConnections("allowSourceDownConnections", "allowMasterDownConnections", true), // + allowUrlInLocalInfile("allowUrlInLocalInfile", true), // + alwaysSendSetIsolation("alwaysSendSetIsolation", true), // + authenticationFidoCallbackHandler("authenticationFidoCallbackHandler", true), // + authenticationPlugins("authenticationPlugins", true), // + autoClosePStmtStreams("autoClosePStmtStreams", true), // + autoDeserialize("autoDeserialize", true), // + autoGenerateTestcaseScript("autoGenerateTestcaseScript", true), // + autoReconnect("autoReconnect", true), // + autoReconnectForPools("autoReconnectForPools", true), // + autoSlowLog("autoSlowLog", true), // + blobsAreStrings("blobsAreStrings", true), // + blobSendChunkSize("blobSendChunkSize", true), // + cacheCallableStmts("cacheCallableStmts", true), // + cacheDefaultTimeZone("cacheDefaultTimeZone", "cacheDefaultTimezone", true), // + cachePrepStmts("cachePrepStmts", true), // + cacheResultSetMetadata("cacheResultSetMetadata", true), // + cacheServerConfiguration("cacheServerConfiguration", true), // + callableStmtCacheSize("callableStmtCacheSize", true), // + characterEncoding("characterEncoding", true), // + characterSetResults("characterSetResults", true), // + clientCertificateKeyStorePassword("clientCertificateKeyStorePassword", true), // + clientCertificateKeyStoreType("clientCertificateKeyStoreType", true), // + clientCertificateKeyStoreUrl("clientCertificateKeyStoreUrl", true), // + clientInfoProvider("clientInfoProvider", true), // + clobberStreamingResults("clobberStreamingResults", true), // + clobCharacterEncoding("clobCharacterEncoding", true), // + compensateOnDuplicateKeyUpdateCounts("compensateOnDuplicateKeyUpdateCounts", true), // + connectionAttributes("connectionAttributes", true), // + connectionCollation("connectionCollation", true), // + connectionLifecycleInterceptors("connectionLifecycleInterceptors", true), // + connectionTimeZone("connectionTimeZone", "serverTimezone", true), // + connectTimeout("connectTimeout", true), // + continueBatchOnError("continueBatchOnError", true), // + createDatabaseIfNotExist("createDatabaseIfNotExist", true), // + customCharsetMapping("customCharsetMapping", true), // + databaseTerm("databaseTerm", true), // + defaultAuthenticationPlugin("defaultAuthenticationPlugin", true), // + defaultFetchSize("defaultFetchSize", true), // + detectCustomCollations("detectCustomCollations", true), // + disabledAuthenticationPlugins("disabledAuthenticationPlugins", true), // + disconnectOnExpiredPasswords("disconnectOnExpiredPasswords", true), // + dnsSrv("dnsSrv", true), // + dontCheckOnDuplicateKeyUpdateInSQL("dontCheckOnDuplicateKeyUpdateInSQL", true), // + dontTrackOpenResources("dontTrackOpenResources", true), // + dumpQueriesOnException("dumpQueriesOnException", true), // + elideSetAutoCommits("elideSetAutoCommits", true), // + emptyStringsConvertToZero("emptyStringsConvertToZero", true), // + emulateLocators("emulateLocators", true), // + emulateUnsupportedPstmts("emulateUnsupportedPstmts", true), // + enableEscapeProcessing("enableEscapeProcessing", true), // + enablePacketDebug("enablePacketDebug", true), // + enableQueryTimeouts("enableQueryTimeouts", true), // + exceptionInterceptors("exceptionInterceptors", true), // + explainSlowQueries("explainSlowQueries", true), // + failOverReadOnly("failOverReadOnly", true), // + fallbackToSystemKeyStore("fallbackToSystemKeyStore", true), // + fallbackToSystemTrustStore("fallbackToSystemTrustStore", true), // + forceConnectionTimeZoneToSession("forceConnectionTimeZoneToSession", true), // + functionsNeverReturnBlobs("functionsNeverReturnBlobs", true), // + gatherPerfMetrics("gatherPerfMetrics", true), // + generateSimpleParameterMetadata("generateSimpleParameterMetadata", true), // + getProceduresReturnsFunctions("getProceduresReturnsFunctions", true), // + ha_enableJMX("ha.enableJMX", "haEnableJMX", true), // + ha_loadBalanceStrategy("ha.loadBalanceStrategy", "haLoadBalanceStrategy", true), // + holdResultsOpenOverStatementClose("holdResultsOpenOverStatementClose", true), // + ignoreNonTxTables("ignoreNonTxTables", true), // + includeInnodbStatusInDeadlockExceptions("includeInnodbStatusInDeadlockExceptions", true), // + includeThreadDumpInDeadlockExceptions("includeThreadDumpInDeadlockExceptions", true), // + includeThreadNamesAsStatementComment("includeThreadNamesAsStatementComment", true), // + initialTimeout("initialTimeout", true), // + interactiveClient("interactiveClient", true), // + jdbcCompliantTruncation("jdbcCompliantTruncation", true), // + largeRowSizeThreshold("largeRowSizeThreshold", true), // + ldapServerHostname("ldapServerHostname", true), // + loadBalanceAutoCommitStatementRegex("loadBalanceAutoCommitStatementRegex", true), // + loadBalanceAutoCommitStatementThreshold("loadBalanceAutoCommitStatementThreshold", true), // + loadBalanceBlocklistTimeout("loadBalanceBlocklistTimeout", "loadBalanceBlacklistTimeout", true), // + loadBalanceConnectionGroup("loadBalanceConnectionGroup", true), // + loadBalanceExceptionChecker("loadBalanceExceptionChecker", true), // + loadBalanceHostRemovalGracePeriod("loadBalanceHostRemovalGracePeriod", true), // + loadBalancePingTimeout("loadBalancePingTimeout", true), // + loadBalanceSQLExceptionSubclassFailover("loadBalanceSQLExceptionSubclassFailover", true), // + loadBalanceSQLStateFailover("loadBalanceSQLStateFailover", true), // + loadBalanceValidateConnectionOnSwapServer("loadBalanceValidateConnectionOnSwapServer", true), // + localSocketAddress("localSocketAddress", true), // + locatorFetchBufferSize("locatorFetchBufferSize", true), // + logger("logger", true), // + logSlowQueries("logSlowQueries", true), // + logXaCommands("logXaCommands", true), // + maintainTimeStats("maintainTimeStats", true), // + maxAllowedPacket("maxAllowedPacket", true), // + maxByteArrayAsHex("maxByteArrayAsHex", true), // + maxQuerySizeToLog("maxQuerySizeToLog", true), // + maxReconnects("maxReconnects", true), // + maxRows("maxRows", true), // + metadataCacheSize("metadataCacheSize", true), // + netTimeoutForStreamingResults("netTimeoutForStreamingResults", true), // + noAccessToProcedureBodies("noAccessToProcedureBodies", true), // + noDatetimeStringSync("noDatetimeStringSync", true), // + nullDatabaseMeansCurrent("nullDatabaseMeansCurrent", "nullCatalogMeansCurrent", true), // + ociConfigFile("ociConfigFile", true), // + overrideSupportsIntegrityEnhancementFacility("overrideSupportsIntegrityEnhancementFacility", true), // + packetDebugBufferSize("packetDebugBufferSize", true), // + padCharsWithSpace("padCharsWithSpace", true), // + paranoid("paranoid", false), // + queryInfoCacheFactory("queryInfoCacheFactory", "parseInfoCacheFactory", true), // + password1("password1", true), // + password2("password2", true), // + password3("password3", true), // + passwordCharacterEncoding("passwordCharacterEncoding", true), // + pedantic("pedantic", true), // + pinGlobalTxToPhysicalConnection("pinGlobalTxToPhysicalConnection", true), // + populateInsertRowWithDefaultValues("populateInsertRowWithDefaultValues", true), // + prepStmtCacheSize("prepStmtCacheSize", true), // + prepStmtCacheSqlLimit("prepStmtCacheSqlLimit", true), // + preserveInstants("preserveInstants", true), // + processEscapeCodesForPrepStmts("processEscapeCodesForPrepStmts", true), // + profilerEventHandler("profilerEventHandler", true), // + profileSQL("profileSQL", true), // + propertiesTransform("propertiesTransform", true), // + queriesBeforeRetrySource("queriesBeforeRetrySource", "queriesBeforeRetryMaster", true), // + queryInterceptors("queryInterceptors", true), // + queryTimeoutKillsConnection("queryTimeoutKillsConnection", true), // + readFromSourceWhenNoReplicas("readFromSourceWhenNoReplicas", "readFromMasterWhenNoSlaves", true), // + readOnlyPropagatesToServer("readOnlyPropagatesToServer", true), // + reconnectAtTxEnd("reconnectAtTxEnd", true), // + replicationConnectionGroup("replicationConnectionGroup", true), // + reportMetricsIntervalMillis("reportMetricsIntervalMillis", true), // + requireSSL("requireSSL", true), // + resourceId("resourceId", true), // + resultSetSizeThreshold("resultSetSizeThreshold", true), // + retriesAllDown("retriesAllDown", true), // + rewriteBatchedStatements("rewriteBatchedStatements", true), // + rollbackOnPooledClose("rollbackOnPooledClose", true), // + scrollTolerantForwardOnly("scrollTolerantForwardOnly", true), // + secondsBeforeRetrySource("secondsBeforeRetrySource", "secondsBeforeRetryMaster", true), // + selfDestructOnPingMaxOperations("selfDestructOnPingMaxOperations", true), // + selfDestructOnPingSecondsLifetime("selfDestructOnPingSecondsLifetime", true), // + sendFractionalSeconds("sendFractionalSeconds", true), // + sendFractionalSecondsForTime("sendFractionalSecondsForTime", true), // + serverAffinityOrder("serverAffinityOrder", true), // + serverConfigCacheFactory("serverConfigCacheFactory", true), // + serverRSAPublicKeyFile("serverRSAPublicKeyFile", true), // + sessionVariables("sessionVariables", true), // + slowQueryThresholdMillis("slowQueryThresholdMillis", true), // + slowQueryThresholdNanos("slowQueryThresholdNanos", true), // + socketFactory("socketFactory", true), // + socketTimeout("socketTimeout", true), // + socksProxyHost("socksProxyHost", true), // + socksProxyPort("socksProxyPort", true), // + socksProxyRemoteDns("socksProxyRemoteDns", true), // + sslMode("sslMode", true), // + strictUpdates("strictUpdates", true), // + tcpKeepAlive("tcpKeepAlive", true), // + tcpNoDelay("tcpNoDelay", true), // + tcpRcvBuf("tcpRcvBuf", true), // + tcpSndBuf("tcpSndBuf", true), // + tcpTrafficClass("tcpTrafficClass", true), // + tinyInt1isBit("tinyInt1isBit", true), // + tlsCiphersuites("tlsCiphersuites", "enabledSSLCipherSuites", true), // + tlsVersions("tlsVersions", "enabledTLSProtocols", true), // + traceProtocol("traceProtocol", true), // + trackSessionState("trackSessionState", true), // + transformedBitIsBoolean("transformedBitIsBoolean", true), // + treatUtilDateAsTimestamp("treatUtilDateAsTimestamp", true), // + trustCertificateKeyStorePassword("trustCertificateKeyStorePassword", true), // + trustCertificateKeyStoreType("trustCertificateKeyStoreType", true), // + trustCertificateKeyStoreUrl("trustCertificateKeyStoreUrl", true), // + ultraDevHack("ultraDevHack", true), // + useAffectedRows("useAffectedRows", true), // + useColumnNamesInFindColumn("useColumnNamesInFindColumn", true), // + useCompression("useCompression", true), // + useConfigs("useConfigs", true), // + useCursorFetch("useCursorFetch", true), // + useHostsInPrivileges("useHostsInPrivileges", true), // + useInformationSchema("useInformationSchema", true), // + useLocalSessionState("useLocalSessionState", true), // + useLocalTransactionState("useLocalTransactionState", true), // + useNanosForElapsedTime("useNanosForElapsedTime", true), // + useOldAliasMetadataBehavior("useOldAliasMetadataBehavior", true), // + useOnlyServerErrorMessages("useOnlyServerErrorMessages", true), // + useReadAheadInput("useReadAheadInput", true), // + useServerPrepStmts("useServerPrepStmts", true), // + useSSL("useSSL", true), // + useStreamLengthsInPrepStmts("useStreamLengthsInPrepStmts", true), // + useUnbufferedInput("useUnbufferedInput", true), // + useUsageAdvisor("useUsageAdvisor", true), // + verifyServerCertificate("verifyServerCertificate", true), // + + xdevapiAsyncResponseTimeout("xdevapi.asyncResponseTimeout", "xdevapiAsyncResponseTimeout", true), // + xdevapiAuth("xdevapi.auth", "xdevapiAuth", true), // + xdevapiConnectTimeout("xdevapi.connect-timeout", "xdevapiConnectTimeout", true), // + xdevapiConnectionAttributes("xdevapi.connection-attributes", "xdevapiConnectionAttributes", true), // + xdevapiCompression("xdevapi.compression", "xdevapiCompression", true), // + xdevapiCompressionAlgorithms("xdevapi.compression-algorithms", "xdevapiCompressionAlgorithms", true), // + xdevapiCompressionExtensions("xdevapi.compression-extensions", "xdevapiCompressionExtensions", true), // + xdevapiDnsSrv("xdevapi.dns-srv", "xdevapiDnsSrv", true), // + xdevapiFallbackToSystemKeyStore("xdevapi.fallback-to-system-keystore", "xdevapiFallbackToSystemKeyStore", true), // + xdevapiFallbackToSystemTrustStore("xdevapi.fallback-to-system-truststore", "xdevapiFallbackToSystemTrustStore", true), // + xdevapiSslKeyStorePassword("xdevapi.ssl-keystore-password", "xdevapiSslKeystorePassword", true), // + xdevapiSslKeyStoreType("xdevapi.ssl-keystore-type", "xdevapiSslKeystoreType", true), // + xdevapiSslKeyStoreUrl("xdevapi.ssl-keystore", "xdevapiSslKeystore", true), // + xdevapiSslMode("xdevapi.ssl-mode", "xdevapiSslMode", true), // + xdevapiSslTrustStorePassword("xdevapi.ssl-truststore-password", "xdevapiSslTruststorePassword", true), // + xdevapiSslTrustStoreType("xdevapi.ssl-truststore-type", "xdevapiSslTruststoreType", true), // + xdevapiSslTrustStoreUrl("xdevapi.ssl-truststore", "xdevapiSslTruststore", true), // + xdevapiTlsCiphersuites("xdevapi.tls-ciphersuites", "xdevapiTlsCiphersuites", true), // + xdevapiTlsVersions("xdevapi.tls-versions", "xdevapiTlsVersions", true), // + + yearIsDateType("yearIsDateType", true), // + zeroDateTimeBehavior("zeroDateTimeBehavior", true) // + ; + + private String keyName; + private String ccAlias = null; + private boolean isCaseSensitive = false; + + private static Map caseInsensitiveValues = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + static { + for (PropertyKey pk : values()) { + if (!pk.isCaseSensitive) { + caseInsensitiveValues.put(pk.getKeyName(), pk); + if (pk.getCcAlias() != null) { + caseInsensitiveValues.put(pk.getCcAlias(), pk); + } + } + } + } + + /** + * Initializes each enum element with the proper key name to be used in the connection string or properties maps. + * + * @param keyName + * the key name for the enum element. + * @param isCaseSensitive + * is this name case sensitive + */ + PropertyKey(String keyName, boolean isCaseSensitive) { + this.keyName = keyName; + this.isCaseSensitive = isCaseSensitive; + } + + /** + * Initializes each enum element with the proper key name to be used in the connection string or properties maps. + * + * @param keyName + * the key name for the enum element. + * @param alias + * camel-case alias key name + * @param isCaseSensitive + * is this name case sensitive + */ + PropertyKey(String keyName, String alias, boolean isCaseSensitive) { + this(keyName, isCaseSensitive); + this.ccAlias = alias; + } + + @Override + public String toString() { + return this.keyName; + } + + /** + * Gets the key name of this enum element. + * + * @return + * the key name associated with the enum element. + */ + public String getKeyName() { + return this.keyName; + } + + /** + * Gets the camel-case alias key name of this enum element. + * + * @return + * the camel-case alias key name associated with the enum element or null. + */ + public String getCcAlias() { + return this.ccAlias; + } + + /** + * Looks for a {@link PropertyKey} that matches the given value as key name. + * + * @param value + * the key name to look for. + * @return + * the {@link PropertyKey} element that matches the given key name value or null if none is found. + */ + public static PropertyKey fromValue(String value) { + for (PropertyKey k : values()) { + if (k.isCaseSensitive) { + if (k.getKeyName().equals(value) || (k.getCcAlias() != null && k.getCcAlias().equals(value))) { + return k; + } + } else { + if (k.getKeyName().equalsIgnoreCase(value) || (k.getCcAlias() != null && k.getCcAlias().equalsIgnoreCase(value))) { + return k; + } + } + } + return null; + } + + /** + * Helper method that normalizes the case of the given key, if it is one of {@link PropertyKey} elements. + * + * @param keyName + * the key name to normalize. + * @return + * the normalized key name if it belongs to this enum, otherwise returns the input unchanged. + */ + public static String normalizeCase(String keyName) { + PropertyKey pk = caseInsensitiveValues.get(keyName); + return pk == null ? keyName : pk.getKeyName(); + //return keyName; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertySet.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertySet.java new file mode 100644 index 0000000..b5d8724 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/PropertySet.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Properties; + +public interface PropertySet { + + void addProperty(RuntimeProperty prop); + + void removeProperty(String name); + + void removeProperty(PropertyKey key); + + RuntimeProperty getProperty(String name); + + RuntimeProperty getProperty(PropertyKey key); + + RuntimeProperty getBooleanProperty(String name); + + RuntimeProperty getBooleanProperty(PropertyKey key); + + RuntimeProperty getIntegerProperty(String name); + + RuntimeProperty getIntegerProperty(PropertyKey key); + + RuntimeProperty getLongProperty(String name); + + RuntimeProperty getLongProperty(PropertyKey key); + + RuntimeProperty getMemorySizeProperty(String name); + + RuntimeProperty getMemorySizeProperty(PropertyKey key); + + RuntimeProperty getStringProperty(String name); + + RuntimeProperty getStringProperty(PropertyKey key); + + > RuntimeProperty getEnumProperty(String name); + + > RuntimeProperty getEnumProperty(PropertyKey key); + + /** + * Initializes the property set with driver properties that come from URL or passed to + * the driver manager. + * + * @param props + * properties + */ + void initializeProperties(Properties props); + + void postInitialization(); + + Properties exposeAsProperties(); + + /** + * Reset all properties to their initial values. + */ + void reset(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/RuntimeProperty.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/RuntimeProperty.java new file mode 100644 index 0000000..38aa2dd --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/conf/RuntimeProperty.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Properties; + +import javax.naming.Reference; + +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public interface RuntimeProperty { + + PropertyDefinition getPropertyDefinition(); + + /** + * Explicitly set value of this RuntimeProperty according to the self-titled property value contained in extractFrom. + * This method is called during PropertySet initialization thus ignores the RUNTIME_NOT_MODIFIABLE flag. + *

    + * This value will also be the initial one, i.e. {@link #resetValue()} will reset to this value, not the default one. + *

    + * If extractFrom does not contain such property then this RuntimeProperty remains unchanged. + * + * @param extractFrom + * {@link Properties} object containing key-value pairs usually passed from connection string. + * @param exceptionInterceptor + * exceptionInterceptor + */ + void initializeFrom(Properties extractFrom, ExceptionInterceptor exceptionInterceptor); + + void initializeFrom(Reference ref, ExceptionInterceptor exceptionInterceptor); + + /** + * Reset to initial value (default or defined in connection string/Properties) + */ + void resetValue(); + + boolean isExplicitlySet(); + + /** + * Add listener for this property changes. + * + * @param l + * {@link RuntimePropertyListener} + */ + void addListener(RuntimePropertyListener l); + + void removeListener(RuntimePropertyListener l); + + @FunctionalInterface + public static interface RuntimePropertyListener { + void handlePropertyChange(RuntimeProperty prop); + } + + /** + * Get internal value representation as Object. + * + * @return value + */ + T getValue(); + + /** + * Get initial value (default or defined in connection string/Properties) + * + * @return value + */ + T getInitialValue(); + + /** + * Get internal value representation as String. + * + * @return value + */ + String getStringValue(); + + /** + * Set the object value of a property directly. Validation against allowable values will be performed. + * + * @param value + * value + */ + void setValue(T value); + + /** + * Set the object value of a property directly. Validation against allowable values will be performed. + * + * @param value + * value + * @param exceptionInterceptor + * exception interceptor + */ + void setValue(T value, ExceptionInterceptor exceptionInterceptor); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/AssertionFailedException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/AssertionFailedException.java new file mode 100644 index 0000000..bb7093f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/AssertionFailedException.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.Messages; + +/** + * Assertions for empty code paths that should never be executed. + */ +public class AssertionFailedException extends CJException { + + private static final long serialVersionUID = 5832552608575043403L; + + /** + * Convenience method. + * + * @param ex + * the exception that should never have been thrown. + * @return {@link AssertionFailedException} + * @throws AssertionFailedException + * for the exception ex. + */ + public static AssertionFailedException shouldNotHappen(Exception ex) throws AssertionFailedException { + throw new AssertionFailedException(ex); + } + + /** + * Create (and caller should subsequently throw) an AssertionFailedException. + * + *

    + * Typical use is as follows: + * + *

    +     * if (something == null) {
    +     *     throw AssertionFailedException.shouldNotHappen("Something cannot be null");
    +     * }
    +     * 
    + * + * @param assertion + * message + * @return the exception. exception should be thrown by the caller to satisfy compiler checks for data-flow, etc + * @throws AssertionFailedException + * if exception occurs + */ + public static AssertionFailedException shouldNotHappen(String assertion) throws AssertionFailedException { + return new AssertionFailedException(assertion); + } + + /** + * Creates an AssertionFailedException for the given exception that should + * never have been thrown. + * + * @param ex + * the exception that should never have been thrown. + */ + public AssertionFailedException(Exception ex) { + super(Messages.getString("AssertionFailedException.0") + ex.toString() + Messages.getString("AssertionFailedException.1"), ex); + } + + /** + * Creates an AssertionFailedException for the reason given. + * + * @param assertion + * a description of the assertion that failed + */ + public AssertionFailedException(String assertion) { + super(Messages.getString("AssertionFailedException.2", new Object[] { assertion })); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJCommunicationsException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJCommunicationsException.java new file mode 100644 index 0000000..9df4e1f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJCommunicationsException.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.protocol.PacketReceivedTimeHolder; +import com.mysql.cj.protocol.PacketSentTimeHolder; +import com.mysql.cj.protocol.ServerSession; + +public class CJCommunicationsException extends CJException { + + private static final long serialVersionUID = 344035358493554245L; + + public CJCommunicationsException() { + super(); + } + + public CJCommunicationsException(String message) { + super(message); + } + + public CJCommunicationsException(String message, Throwable cause) { + super(message, cause); + } + + public CJCommunicationsException(Throwable cause) { + super(cause); + } + + protected CJCommunicationsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public void init(PropertySet propertySet, ServerSession serverSession, PacketSentTimeHolder packetSentTimeHolder, + PacketReceivedTimeHolder packetReceivedTimeHolder) { + this.exceptionMessage = ExceptionFactory.createLinkFailureMessageBasedOnHeuristics(propertySet, serverSession, packetSentTimeHolder, + packetReceivedTimeHolder, getCause()); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJConnectionFeatureNotAvailableException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJConnectionFeatureNotAvailableException.java new file mode 100644 index 0000000..eb33373 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJConnectionFeatureNotAvailableException.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.protocol.PacketSentTimeHolder; +import com.mysql.cj.protocol.ServerSession; + +public class CJConnectionFeatureNotAvailableException extends CJCommunicationsException { + + private static final long serialVersionUID = -4129847384681995107L; + + public CJConnectionFeatureNotAvailableException() { + super(); + } + + public CJConnectionFeatureNotAvailableException(PropertySet propertySet, ServerSession serverSession, PacketSentTimeHolder packetSentTimeHolder, + Exception underlyingException) { + super(underlyingException); + init(propertySet, serverSession, packetSentTimeHolder, null); + } + + @Override + public String getMessage() { + return Messages.getString("ConnectionFeatureNotAvailableException.0"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJException.java new file mode 100644 index 0000000..8f7e0f4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJException.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * The base unchecked exception thrown internally in connector. + */ +public class CJException extends RuntimeException { + + private static final long serialVersionUID = -8618536991444733607L; + + /** + * We can't override the {@link Throwable#detailMessage} directly because it has a private accessibility, + * thus for that need we use this protected variable and override {@link #getMessage()} + */ + protected String exceptionMessage; + + private String SQLState = "S1000"; // GENERAL_ERROR by default + + private int vendorCode = 0; + + private boolean isTransient = false; + + public CJException() { + super(); + } + + public CJException(String message) { + super(message); + } + + public CJException(Throwable cause) { + super(cause); + } + + public CJException(String message, Throwable cause) { + super(message, cause); + } + + protected CJException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public String getSQLState() { + return this.SQLState; + } + + public void setSQLState(String sQLState) { + this.SQLState = sQLState; + } + + public int getVendorCode() { + return this.vendorCode; + } + + public void setVendorCode(int vendorCode) { + this.vendorCode = vendorCode; + } + + public boolean isTransient() { + return this.isTransient; + } + + public void setTransient(boolean isTransient) { + this.isTransient = isTransient; + } + + @Override + public String getMessage() { + return this.exceptionMessage != null ? this.exceptionMessage : super.getMessage(); + } + + public void appendMessage(String messageToAppend) { + this.exceptionMessage = getMessage() + messageToAppend; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJOperationNotSupportedException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJOperationNotSupportedException.java new file mode 100644 index 0000000..49cd927 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJOperationNotSupportedException.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class CJOperationNotSupportedException extends CJException { + + private static final long serialVersionUID = 2619184100062994443L; + + public CJOperationNotSupportedException() { + super(); + } + + public CJOperationNotSupportedException(String message) { + super(message); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJPacketTooBigException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJPacketTooBigException.java new file mode 100644 index 0000000..18b8cad --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJPacketTooBigException.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.Messages; + +/** + * Thrown when a packet that is too big for the server is created. + */ +public class CJPacketTooBigException extends CJException { + + private static final long serialVersionUID = 7186090399276725363L; + + public CJPacketTooBigException() { + super(); + } + + public CJPacketTooBigException(String message) { + super(message); + } + + public CJPacketTooBigException(Throwable cause) { + super(cause); + } + + public CJPacketTooBigException(String message, Throwable cause) { + super(message, cause); + } + + /** + * Creates a new CJPacketTooBigException object. + * + * @param packetSize + * the size of the packet that was going to be sent + * @param maximumPacketSize + * the maximum size the server will accept + */ + public CJPacketTooBigException(long packetSize, long maximumPacketSize) { + super(Messages.getString("PacketTooBigException.0", new Object[] { packetSize, maximumPacketSize })); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJTimeoutException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJTimeoutException.java new file mode 100644 index 0000000..36a059c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/CJTimeoutException.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.Messages; + +public class CJTimeoutException extends CJException { + + private static final long serialVersionUID = -7440108828056331100L; + + public CJTimeoutException() { + super(Messages.getString("MySQLTimeoutException.0")); + } + + public CJTimeoutException(String message) { + super(message); + } + + public CJTimeoutException(Throwable cause) { + super(cause); + } + + public CJTimeoutException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ClosedOnExpiredPasswordException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ClosedOnExpiredPasswordException.java new file mode 100644 index 0000000..4203cfd --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ClosedOnExpiredPasswordException.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Equivalent to SQLSTATE ER_MUST_CHANGE_PASSWORD_LOGIN = 1862 + * "Your password has expired. To log in you must change it using a client that supports expired passwords." + * + * Server closes connection when this failure happens. + */ +public class ClosedOnExpiredPasswordException extends CJException { + + private static final long serialVersionUID = -3807215681364413250L; + + public ClosedOnExpiredPasswordException() { + super(); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD_LOGIN); + } + + public ClosedOnExpiredPasswordException(String message) { + super(message); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD_LOGIN); + } + + public ClosedOnExpiredPasswordException(String message, Throwable cause) { + super(message, cause); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD_LOGIN); + } + + public ClosedOnExpiredPasswordException(Throwable cause) { + super(cause); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD_LOGIN); + } + + protected ClosedOnExpiredPasswordException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD_LOGIN); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ConnectionIsClosedException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ConnectionIsClosedException.java new file mode 100644 index 0000000..e1fd64c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ConnectionIsClosedException.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Operation attempted on already closed Connection + */ +public class ConnectionIsClosedException extends CJException { + + private static final long serialVersionUID = -8001652264426656450L; + + public ConnectionIsClosedException() { + super(); + setSQLState("08003"); + } + + public ConnectionIsClosedException(String message) { + super(message); + setSQLState("08003"); + } + + public ConnectionIsClosedException(String message, Throwable cause) { + super(message, cause); + setSQLState("08003"); + } + + public ConnectionIsClosedException(Throwable cause) { + super(cause); + setSQLState("08003"); + } + + protected ConnectionIsClosedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("08003"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataConversionException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataConversionException.java new file mode 100644 index 0000000..bafd1c7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataConversionException.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Indicates that data could not be converted according to the given request. + */ +public class DataConversionException extends DataReadException { + private static final long serialVersionUID = -863576663404236982L; + + public DataConversionException(String msg) { + super(msg); + setSQLState("22018"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataReadException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataReadException.java new file mode 100644 index 0000000..f828013 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataReadException.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Indicates that data could not be read according to the given request. + */ +public class DataReadException extends CJException { + private static final long serialVersionUID = 1684265521187171525L; + + public DataReadException(Exception cause) { + super(cause); + setSQLState("S1009"); + } + + public DataReadException(String msg) { + super(msg); + setSQLState("S1009"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataTruncationException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataTruncationException.java new file mode 100644 index 0000000..42e0025 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DataTruncationException.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class DataTruncationException extends CJException { + + private static final long serialVersionUID = -5209088385943506720L; + + private int index; + private boolean parameter; + private boolean read; + private int dataSize; + private int transferSize; + + public DataTruncationException() { + super(); + } + + public DataTruncationException(String message) { + super(message); + } + + public DataTruncationException(String message, Throwable cause) { + super(message, cause); + } + + public DataTruncationException(Throwable cause) { + super(cause); + } + + protected DataTruncationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public DataTruncationException(String message, int index, boolean parameter, boolean read, int dataSize, int transferSize, int vendorErrorCode) { + super(message); + this.setIndex(index); + this.setParameter(parameter); + this.setRead(read); + this.setDataSize(dataSize); + this.setTransferSize(transferSize); + setVendorCode(vendorErrorCode); + } + + public int getIndex() { + return this.index; + } + + public void setIndex(int index) { + this.index = index; + } + + public boolean isParameter() { + return this.parameter; + } + + public void setParameter(boolean parameter) { + this.parameter = parameter; + } + + public boolean isRead() { + return this.read; + } + + public void setRead(boolean read) { + this.read = read; + } + + public int getDataSize() { + return this.dataSize; + } + + public void setDataSize(int dataSize) { + this.dataSize = dataSize; + } + + public int getTransferSize() { + return this.transferSize; + } + + public void setTransferSize(int transferSize) { + this.transferSize = transferSize; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DeadlockTimeoutRollbackMarker.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DeadlockTimeoutRollbackMarker.java new file mode 100644 index 0000000..010cf2a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/DeadlockTimeoutRollbackMarker.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2008, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Marker interface for exceptions that are caused by deadlock/wait timeout + */ +public interface DeadlockTimeoutRollbackMarker { + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionFactory.java new file mode 100644 index 0000000..8b8ff26 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionFactory.java @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import java.net.BindException; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.protocol.PacketReceivedTimeHolder; +import com.mysql.cj.protocol.PacketSentTimeHolder; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.util.Util; + +public class ExceptionFactory { + + private static final long DEFAULT_WAIT_TIMEOUT_SECONDS = 28800; + + private static final int DUE_TO_TIMEOUT_FALSE = 0; + + private static final int DUE_TO_TIMEOUT_MAYBE = 2; + + private static final int DUE_TO_TIMEOUT_TRUE = 1; + + public static CJException createException(String message) { + return createException(CJException.class, message); + } + + @SuppressWarnings("unchecked") + public static T createException(Class clazz, String message) { + + T sqlEx; + try { + sqlEx = clazz.getConstructor(String.class).newInstance(message); + } catch (Throwable e) { + sqlEx = (T) new CJException(message); + } + return sqlEx; + } + + public static CJException createException(String message, ExceptionInterceptor interceptor) { + return createException(CJException.class, message, interceptor); + } + + /** + * + * @param clazz + * exception class + * @param message + * message + * @param interceptor + * exception interceptor + * @param + * {@link CJException} + * @return {@link CJException} instance + */ + public static T createException(Class clazz, String message, ExceptionInterceptor interceptor) { + T sqlEx = createException(clazz, message); + + // TODO: Decide whether we need to intercept exceptions at this level + //if (interceptor != null) { + // @SuppressWarnings("unchecked") + // T interceptedEx = (T) interceptor.interceptException(sqlEx, null); + // if (interceptedEx != null) { + // return interceptedEx; + // } + //} + + return sqlEx; + } + + public static CJException createException(String message, Throwable cause) { + return createException(CJException.class, message, cause); + } + + public static T createException(Class clazz, String message, Throwable cause) { + + T sqlEx = createException(clazz, message); + + if (cause != null) { + try { + sqlEx.initCause(cause); + } catch (Throwable t) { + // we're not going to muck with that here, since it's an error condition anyway! + } + + if (cause instanceof CJException) { + sqlEx.setSQLState(((CJException) cause).getSQLState()); + sqlEx.setVendorCode(((CJException) cause).getVendorCode()); + sqlEx.setTransient(((CJException) cause).isTransient()); + } + } + return sqlEx; + } + + public static CJException createException(String message, Throwable cause, ExceptionInterceptor interceptor) { + return createException(CJException.class, message, cause, interceptor); + } + + public static CJException createException(String message, String sqlState, int vendorErrorCode, boolean isTransient, Throwable cause, + ExceptionInterceptor interceptor) { + CJException ex = createException(CJException.class, message, cause, interceptor); + ex.setSQLState(sqlState); + ex.setVendorCode(vendorErrorCode); + ex.setTransient(isTransient); + return ex; + } + + /** + * + * @param clazz + * exception class + * @param message + * message + * @param cause + * exception caused this one + * @param interceptor + * exception interceptor + * @param + * {@link CJException} + * @return {@link CJException} instance + */ + public static T createException(Class clazz, String message, Throwable cause, ExceptionInterceptor interceptor) { + T sqlEx = createException(clazz, message, cause); + + // TODO: Decide whether we need to intercept exceptions at this level + //if (interceptor != null) { + // @SuppressWarnings("unchecked") + // T interceptedEx = (T) interceptor.interceptException(sqlEx, null); + // if (interceptedEx != null) { + // return interceptedEx; + // } + //} + + return sqlEx; + } + + public static CJCommunicationsException createCommunicationsException(PropertySet propertySet, ServerSession serverSession, + PacketSentTimeHolder packetSentTimeHolder, PacketReceivedTimeHolder packetReceivedTimeHolder, Throwable cause, ExceptionInterceptor interceptor) { + CJCommunicationsException sqlEx = createException(CJCommunicationsException.class, null, cause, interceptor); + sqlEx.init(propertySet, serverSession, packetSentTimeHolder, packetReceivedTimeHolder); + + // TODO: Decide whether we need to intercept exceptions at this level + //if (interceptor != null) { + // @SuppressWarnings("unchecked") + // T interceptedEx = (T) interceptor.interceptException(sqlEx, null); + // if (interceptedEx != null) { + // return interceptedEx; + // } + //} + + return sqlEx; + } + + /** + * Creates a communications link failure message to be used in CommunicationsException + * that (hopefully) has some better information and suggestions based on heuristics. + * + * @param propertySet + * property set + * @param serverSession + * server session + * @param packetSentTimeHolder + * packetSentTimeHolder + * @param packetReceivedTimeHolder + * packetReceivedTimeHolder + * @param underlyingException + * underlyingException + * @return message + */ + public static String createLinkFailureMessageBasedOnHeuristics(PropertySet propertySet, ServerSession serverSession, + PacketSentTimeHolder packetSentTimeHolder, PacketReceivedTimeHolder packetReceivedTimeHolder, Throwable underlyingException) { + long serverTimeoutSeconds = 0; + boolean isInteractiveClient = false; + + long lastPacketReceivedTimeMs = packetReceivedTimeHolder == null ? 0L : packetReceivedTimeHolder.getLastPacketReceivedTime(); + long lastPacketSentTimeMs = packetSentTimeHolder.getLastPacketSentTime(); + if (lastPacketSentTimeMs > lastPacketReceivedTimeMs) { + lastPacketSentTimeMs = packetSentTimeHolder.getPreviousPacketSentTime(); + } + + if (propertySet != null) { + isInteractiveClient = propertySet.getBooleanProperty(PropertyKey.interactiveClient).getValue(); + + String serverTimeoutSecondsStr = null; + + if (serverSession != null) { + serverTimeoutSecondsStr = isInteractiveClient ? serverSession.getServerVariable("interactive_timeout") + : serverSession.getServerVariable("wait_timeout"); + } + + if (serverTimeoutSecondsStr != null) { + try { + serverTimeoutSeconds = Long.parseLong(serverTimeoutSecondsStr); + } catch (NumberFormatException nfe) { + serverTimeoutSeconds = 0; + } + } + } + + StringBuilder exceptionMessageBuf = new StringBuilder(); + + long nowMs = System.currentTimeMillis(); + + if (lastPacketSentTimeMs == 0) { + lastPacketSentTimeMs = nowMs; + } + + long timeSinceLastPacketSentMs = (nowMs - lastPacketSentTimeMs); + long timeSinceLastPacketSeconds = timeSinceLastPacketSentMs / 1000; + + long timeSinceLastPacketReceivedMs = (nowMs - lastPacketReceivedTimeMs); + + int dueToTimeout = DUE_TO_TIMEOUT_FALSE; + + StringBuilder timeoutMessageBuf = null; + + if (serverTimeoutSeconds != 0) { + if (timeSinceLastPacketSeconds > serverTimeoutSeconds) { + dueToTimeout = DUE_TO_TIMEOUT_TRUE; + + timeoutMessageBuf = new StringBuilder(); + timeoutMessageBuf.append(Messages.getString("CommunicationsException.2")); + timeoutMessageBuf.append(Messages.getString(isInteractiveClient ? "CommunicationsException.4" : "CommunicationsException.3")); + } + + } else if (timeSinceLastPacketSeconds > DEFAULT_WAIT_TIMEOUT_SECONDS) { + dueToTimeout = DUE_TO_TIMEOUT_MAYBE; + + timeoutMessageBuf = new StringBuilder(); + timeoutMessageBuf.append(Messages.getString("CommunicationsException.5")); + timeoutMessageBuf.append(Messages.getString("CommunicationsException.6")); + timeoutMessageBuf.append(Messages.getString("CommunicationsException.7")); + timeoutMessageBuf.append(Messages.getString("CommunicationsException.8")); + } + + if (dueToTimeout == DUE_TO_TIMEOUT_TRUE || dueToTimeout == DUE_TO_TIMEOUT_MAYBE) { + + exceptionMessageBuf.append(lastPacketReceivedTimeMs != 0 + ? Messages.getString("CommunicationsException.ServerPacketTimingInfo", + new Object[] { Long.valueOf(timeSinceLastPacketReceivedMs), Long.valueOf(timeSinceLastPacketSentMs) }) + : Messages.getString("CommunicationsException.ServerPacketTimingInfoNoRecv", new Object[] { Long.valueOf(timeSinceLastPacketSentMs) })); + + if (timeoutMessageBuf != null) { + exceptionMessageBuf.append(timeoutMessageBuf); + } + + exceptionMessageBuf.append(Messages.getString("CommunicationsException.11")); + exceptionMessageBuf.append(Messages.getString("CommunicationsException.12")); + exceptionMessageBuf.append(Messages.getString("CommunicationsException.13")); + + } else { + // + // Attempt to determine the reason for the underlying exception (we can only make a best-guess here) + // + if (underlyingException instanceof BindException) { + String localSocketAddress = propertySet.getStringProperty(PropertyKey.localSocketAddress).getValue(); + exceptionMessageBuf.append(localSocketAddress != null && !Util.interfaceExists(localSocketAddress) + ? Messages.getString("CommunicationsException.LocalSocketAddressNotAvailable") + : Messages.getString("CommunicationsException.TooManyClientConnections")); + } + } + + if (exceptionMessageBuf.length() == 0) { + // We haven't figured out a good reason, so copy it. + exceptionMessageBuf.append(Messages.getString("CommunicationsException.20")); + + if (propertySet.getBooleanProperty(PropertyKey.maintainTimeStats).getValue() && !propertySet.getBooleanProperty(PropertyKey.paranoid).getValue()) { + exceptionMessageBuf.append("\n\n"); + exceptionMessageBuf.append(lastPacketReceivedTimeMs != 0 + ? Messages.getString("CommunicationsException.ServerPacketTimingInfo", + new Object[] { Long.valueOf(timeSinceLastPacketReceivedMs), Long.valueOf(timeSinceLastPacketSentMs) }) + : Messages.getString("CommunicationsException.ServerPacketTimingInfoNoRecv", new Object[] { Long.valueOf(timeSinceLastPacketSentMs) })); + } + } + + return exceptionMessageBuf.toString(); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptor.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptor.java new file mode 100644 index 0000000..5038bd6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptor.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2008, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import java.util.Properties; + +import com.mysql.cj.log.Log; + +public interface ExceptionInterceptor { + + /** + * Called once per connection that wants to use the extension + * + * The properties are the same ones passed in in the URL or arguments to + * Driver.connect() or DriverManager.getConnection(). + * + * @param props + * configuration values as passed to the connection. Note that + * in order to support javax.sql.DataSources, configuration properties specific + * to an interceptor must be passed via setURL() on the + * DataSource. Extension properties are not exposed via + * accessor/mutator methods on DataSources. + * @param log + * logger instance + * @return {@link ExceptionInterceptor} + */ + + ExceptionInterceptor init(Properties props, Log log); + + /** + * Called by the driver when this extension should release any resources + * it is holding and cleanup internally before the connection is + * closed. + */ + void destroy(); + + Exception interceptException(Exception sqlEx); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptorChain.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptorChain.java new file mode 100644 index 0000000..ad9848e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/ExceptionInterceptorChain.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import java.util.Iterator; +import java.util.List; +import java.util.Properties; +import java.util.stream.Collectors; + +import com.mysql.cj.log.Log; +import com.mysql.cj.util.Util; + +public class ExceptionInterceptorChain implements ExceptionInterceptor { + List interceptors; + + public ExceptionInterceptorChain(String interceptorClasses, Properties props, Log log) { + this.interceptors = Util. loadClasses(interceptorClasses, "Connection.BadExceptionInterceptor", this).stream() + .map(o -> o.init(props, log)).collect(Collectors.toList()); + } + + public void addRingZero(ExceptionInterceptor interceptor) { + this.interceptors.add(0, interceptor); + } + + public Exception interceptException(Exception sqlEx) { + if (this.interceptors != null) { + Iterator iter = this.interceptors.iterator(); + + while (iter.hasNext()) { + sqlEx = iter.next().interceptException(sqlEx); + } + } + + return sqlEx; + } + + public void destroy() { + if (this.interceptors != null) { + Iterator iter = this.interceptors.iterator(); + + while (iter.hasNext()) { + iter.next().destroy(); + } + } + + } + + public ExceptionInterceptor init(Properties properties, Log log) { + if (this.interceptors != null) { + Iterator iter = this.interceptors.iterator(); + + while (iter.hasNext()) { + iter.next().init(properties, log); + } + } + return this; + } + + public List getInterceptors() { + return this.interceptors; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/FeatureNotAvailableException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/FeatureNotAvailableException.java new file mode 100644 index 0000000..58bab23 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/FeatureNotAvailableException.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class FeatureNotAvailableException extends CJException { + + private static final long serialVersionUID = -6649508222074639690L; + + public FeatureNotAvailableException() { + super(); + } + + public FeatureNotAvailableException(String message) { + super(message); + } + + public FeatureNotAvailableException(String message, Throwable cause) { + super(message, cause); + } + + public FeatureNotAvailableException(Throwable cause) { + super(cause); + } + + public FeatureNotAvailableException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/InvalidConnectionAttributeException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/InvalidConnectionAttributeException.java new file mode 100644 index 0000000..0db81f8 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/InvalidConnectionAttributeException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class InvalidConnectionAttributeException extends CJException { + + private static final long serialVersionUID = -4814924499233623016L; + + public InvalidConnectionAttributeException() { + super(); + setSQLState("01S00"); + } + + public InvalidConnectionAttributeException(String message) { + super(message); + setSQLState("01S00"); + } + + public InvalidConnectionAttributeException(String message, Throwable cause) { + super(message, cause); + setSQLState("01S00"); + } + + public InvalidConnectionAttributeException(Throwable cause) { + super(cause); + setSQLState("01S00"); + } + + public InvalidConnectionAttributeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("01S00"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/MysqlErrorNumbers.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/MysqlErrorNumbers.java new file mode 100644 index 0000000..cafb9ff --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/MysqlErrorNumbers.java @@ -0,0 +1,1521 @@ +/* + * Copyright (c) 2002, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import java.util.HashMap; +import java.util.Map; + +import com.mysql.cj.Messages; + +/** + * Constants representing MySQL error numbers returned by the server in error messages. + */ +public final class MysqlErrorNumbers { + + public final static int ER_ERROR_MESSAGES = 298; + public final static int ER_HASHCHK = 1000; //SQLSTATE: HY000 Message: hashchk + public final static int ER_NISAMCHK = 1001; //SQLSTATE: HY000 Message: isamchk + public final static int ER_NO = 1002; //SQLSTATE: HY000 Message: NO; Used in the construction of other messages. + public final static int ER_YES = 1003; //SQLSTATE: HY000 Message: YES + public final static int ER_CANT_CREATE_FILE = 1004; //SQLSTATE: HY000 Message: Can't create file '%s' (errno: %d - %s) + public final static int ER_CANT_CREATE_TABLE = 1005; //SQLSTATE: HY000 Message: Can't create table '%s' (errno: %d) + public final static int ER_CANT_CREATE_DB = 1006; //SQLSTATE: HY000 Message: Can't create database '%s' (errno: %d) + public final static int ER_DB_CREATE_EXISTS = 1007; //SQLSTATE: HY000 Message: Can't create database '%s'; database exists... + public final static int ER_DB_DROP_EXISTS = 1008; //SQLSTATE: HY000 Message: Can't drop database '%s'; database doesn't exist + public final static int ER_DB_DROP_DELETE = 1009; //SQLSTATE: HY000 Message: Error dropping database (can't delete '%s', errno: %d) + public final static int ER_DB_DROP_RMDIR = 1010; //SQLSTATE: HY000 Message: Error dropping database (can't rmdir '%s', errno: %d) + public final static int ER_CANT_DELETE_FILE = 1011; //SQLSTATE: HY000 Message: Error on delete of '%s' (errno: %d - %s) + public final static int ER_CANT_FIND_SYSTEM_REC = 1012; //SQLSTATE: HY000 Message: Can't read record in system table + public final static int ER_CANT_GET_STAT = 1013; //SQLSTATE: HY000 Message: Can't get status of '%s' (errno: %d - %s) + public final static int ER_CANT_GET_WD = 1014; //SQLSTATE: HY000 Message: Can't get working directory (errno: %d - %s) + public final static int ER_CANT_LOCK = 1015; //SQLSTATE: HY000 Message: Can't lock file (errno: %d - %s) + public final static int ER_CANT_OPEN_FILE = 1016; //SQLSTATE: HY000 Message: Can't open file: '%s' (errno: %d - %s) + public final static int ER_FILE_NOT_FOUND = 1017; //SQLSTATE: HY000 Message: Can't find file: '%s' (errno: %d - %s) + public final static int ER_CANT_READ_DIR = 1018; //SQLSTATE: HY000 Message: Can't read dir of '%s' (errno: %d - %s) + public final static int ER_CANT_SET_WD = 1019; //SQLSTATE: HY000 Message: Can't change dir to '%s' (errno: %d - %s) + public final static int ER_CHECKREAD = 1020; //SQLSTATE: HY000 Message: Record has changed since last read in table '%s' + public final static int ER_DISK_FULL = 1021; //SQLSTATE: HY000 Message: Disk full (%s); waiting for someone to free some space... (errno: %d - %s) + public final static int ER_DUP_KEY = 1022; //SQLSTATE: 23000 Message: Can't write; duplicate key in table '%s' + public final static int ER_ERROR_ON_CLOSE = 1023; //SQLSTATE: HY000 Message: Error on close of '%s' (errno: %d - %s) + public final static int ER_ERROR_ON_READ = 1024; //SQLSTATE: HY000 Message: Error reading file '%s' (errno: %d - %s) + public final static int ER_ERROR_ON_RENAME = 1025; //SQLSTATE: HY000 Message: Error on rename of '%s' to '%s' (errno: %d - %s) + public final static int ER_ERROR_ON_WRITE = 1026; //SQLSTATE: HY000 Message: Error writing file '%s' (errno: %d - %s) + public final static int ER_FILE_USED = 1027; //SQLSTATE: HY000 Message: '%s' is locked against change + public final static int ER_FILSORT_ABORT = 1028; //SQLSTATE: HY000 Message: Sort aborted + public final static int ER_FORM_NOT_FOUND = 1029; //SQLSTATE: HY000 Message: View '%s' doesn't exist for '%s' + public final static int ER_GET_ERRNO = 1030; //SQLSTATE: HY000 Message: Got error %d from storage engine... + public final static int ER_ILLEGAL_HA = 1031; //SQLSTATE: HY000 Message: Table storage engine for '%s' doesn't have this option + public final static int ER_KEY_NOT_FOUND = 1032; //SQLSTATE: HY000 Message: Can't find record in '%s' + public final static int ER_NOT_FORM_FILE = 1033; //SQLSTATE: HY000 Message: Incorrect information in file: '%s' + public final static int ER_NOT_KEYFILE = 1034; //SQLSTATE: HY000 Message: Incorrect key file for table '%s'; try to repair it + public final static int ER_OLD_KEYFILE = 1035; //SQLSTATE: HY000 Message: Old key file for table '%s'; repair it! + public final static int ER_OPEN_AS_READONLY = 1036; //SQLSTATE: HY000 Message: Table '%s' is read only + public final static int ER_OUTOFMEMORY = 1037; //SQLSTATE: HY001 Message: Out of memory; restart server and try again (needed %d bytes) + public final static int ER_OUT_OF_SORTMEMORY = 1038; //SQLSTATE: HY001 Message: Out of sort memory, consider increasing server sort buffer size + public final static int ER_UNEXPECTED_EOF = 1039; //SQLSTATE: HY000 Message: Unexpected EOF found when reading file '%s' (errno: %d - %s) + public final static int ER_CON_COUNT_ERROR = 1040; //SQLSTATE: 08004 Message: Too many connections + public final static int ER_OUT_OF_RESOURCES = 1041; //SQLSTATE: HY000 Message: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space + public final static int ER_BAD_HOST_ERROR = 1042; //SQLSTATE: 08S01 Message: Can't get hostname for your address + public final static int ER_HANDSHAKE_ERROR = 1043; //SQLSTATE: 08S01 Message: Bad handshake + public final static int ER_DBACCESS_DENIED_ERROR = 1044; //SQLSTATE: 42000 Message: Access denied for user '%s'@'%s' to database '%s' + public final static int ER_ACCESS_DENIED_ERROR = 1045; //SQLSTATE: 28000 Message: Access denied for user '%s'@'%s' (using password: %s) + public final static int ER_NO_DB_ERROR = 1046; //SQLSTATE: 3D000 Message: No database selected + public final static int ER_UNKNOWN_COM_ERROR = 1047; //SQLSTATE: 08S01 Message: Unknown command + public final static int ER_BAD_NULL_ERROR = 1048; //SQLSTATE: 23000 Message: Column '%s' cannot be null + public final static int ER_BAD_DB_ERROR = 1049; //SQLSTATE: 42000 Message: Unknown database '%s' + public final static int ER_TABLE_EXISTS_ERROR = 1050; //SQLSTATE: 42S01 Message: Table '%s' already exists + public final static int ER_BAD_TABLE_ERROR = 1051; //SQLSTATE: 42S02 Message: Unknown table '%s' + public final static int ER_NON_UNIQ_ERROR = 1052; //SQLSTATE: 23000 Message: Column '%s' in %s is ambiguous + public final static int ER_SERVER_SHUTDOWN = 1053; //SQLSTATE: 08S01 Message: Server shutdown in progress + public final static int ER_BAD_FIELD_ERROR = 1054; //SQLSTATE: 42S22 Message: Unknown column '%s' in '%s' + public final static int ER_WRONG_FIELD_WITH_GROUP = 1055; //SQLSTATE: 42000 Message: '%s' isn't in GROUP BY + public final static int ER_WRONG_GROUP_FIELD = 1056; //SQLSTATE: 42000 Message: Can't group on '%s' + public final static int ER_WRONG_SUM_SELECT = 1057; //SQLSTATE: 42000 Message: Statement has sum functions and columns in same statement + public final static int ER_WRONG_VALUE_COUNT = 1058; //SQLSTATE: 21S01 Message: Column count doesn't match value count + public final static int ER_TOO_LONG_IDENT = 1059; //SQLSTATE: 42000 Message: Identifier name '%s' is too long + public final static int ER_DUP_FIELDNAME = 1060; //SQLSTATE: 42S21 Message: Duplicate column name '%s' + public final static int ER_DUP_KEYNAME = 1061; //SQLSTATE: 42000 Message: Duplicate key name '%s' + public final static int ER_DUP_ENTRY = 1062; //SQLSTATE: 23000 Message: Duplicate entry '%s' for key %d + public final static int ER_WRONG_FIELD_SPEC = 1063; //SQLSTATE: 42000 Message: Incorrect column specifier for column '%s' + public final static int ER_PARSE_ERROR = 1064; //SQLSTATE: 42000 Message: %s near '%s' at line %d + public final static int ER_EMPTY_QUERY = 1065; //SQLSTATE: 42000 Message: Query was empty + public final static int ER_NONUNIQ_TABLE = 1066; //SQLSTATE: 42000 Message: Not unique table/alias: '%s' + public final static int ER_INVALID_DEFAULT = 1067; //SQLSTATE: 42000 Message: Invalid default value for '%s' + public final static int ER_MULTIPLE_PRI_KEY = 1068; //SQLSTATE: 42000 Message: Multiple primary key defined + public final static int ER_TOO_MANY_KEYS = 1069; //SQLSTATE: 42000 Message: Too many keys specified; max %d keys allowed + public final static int ER_TOO_MANY_KEY_PARTS = 1070; //SQLSTATE: 42000 Message: Too many key parts specified; max %d parts allowed + public final static int ER_TOO_LONG_KEY = 1071; //SQLSTATE: 42000 Message: Specified key was too long; max key length is %d bytes + public final static int ER_KEY_COLUMN_DOES_NOT_EXITS = 1072; //SQLSTATE: 42000 Message: Key column '%s' doesn't exist in table + public final static int ER_BLOB_USED_AS_KEY = 1073; //SQLSTATE: 42000 Message: BLOB column '%s' can't be used in key specification with the used table type + public final static int ER_TOO_BIG_FIELDLENGTH = 1074; //SQLSTATE: 42000 Message: Column length too big for column '%s' (max = %lu); use BLOB or TEXT instead + public final static int ER_WRONG_AUTO_KEY = 1075; //SQLSTATE: 42000 Message: Incorrect table definition; there can be only one auto column and it must be defined as a key + public final static int ER_READY = 1076; //SQLSTATE: HY000 Message: %s: ready for connections. Version: '%s' socket: '%s' port: %d + public final static int ER_NORMAL_SHUTDOWN = 1077; //SQLSTATE: HY000 Message: %s: Normal shutdown + public final static int ER_GOT_SIGNAL = 1078; //SQLSTATE: HY000 Message: %s: Got signal %d. Aborting! + public final static int ER_SHUTDOWN_COMPLETE = 1079; //SQLSTATE: HY000 Message: %s: Shutdown complete + public final static int ER_FORCING_CLOSE = 1080; //SQLSTATE: 08S01 Message: %s: Forcing close of thread %ld user: '%s' + public final static int ER_IPSOCK_ERROR = 1081; //SQLSTATE: 08S01 Message: Can't create IP socket + public final static int ER_NO_SUCH_INDEX = 1082; //SQLSTATE: 42S12 Message: Table '%s' has no index like the one used in CREATE INDEX; recreate the table + public final static int ER_WRONG_FIELD_TERMINATORS = 1083; //SQLSTATE: 42000 Message: Field separator argument is not what is expected; check the manual + public final static int ER_BLOBS_AND_NO_TERMINATED = 1084; //SQLSTATE: 42000 Message: You can't use fixed rowlength with BLOBs; please use 'fields terminated by' + public final static int ER_TEXTFILE_NOT_READABLE = 1085; //SQLSTATE: HY000 Message: The file '%s' must be in the database directory or be readable by all + public final static int ER_FILE_EXISTS_ERROR = 1086; //SQLSTATE: HY000 Message: File '%s' already exists + public final static int ER_LOAD_INFO = 1087; //SQLSTATE: HY000 Message: Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld + public final static int ER_ALTER_INFO = 1088; //SQLSTATE: HY000 Message: Records: %ld Duplicates: %ld + public final static int ER_WRONG_SUB_KEY = 1089; //SQLSTATE: HY000 Message: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys + public final static int ER_CANT_REMOVE_ALL_FIELDS = 1090; //SQLSTATE: 42000 Message: You can't delete all columns with ALTER TABLE; use DROP TABLE instead + public final static int ER_CANT_DROP_FIELD_OR_KEY = 1091; //SQLSTATE: 42000 Message: Can't DROP '%s'; check that column/key exists + public final static int ER_INSERT_INFO = 1092; //SQLSTATE: HY000 Message: Records: %ld Duplicates: %ld Warnings: %ld + public final static int ER_UPDATE_TABLE_USED = 1093; //SQLSTATE: HY000 Message: You can't specify target table '%s' for update in FROM clause + public final static int ER_NO_SUCH_THREAD = 1094; //SQLSTATE: HY000 Message: Unknown thread id: %lu + public final static int ER_KILL_DENIED_ERROR = 1095; //SQLSTATE: HY000 Message: You are not owner of thread %lu + public final static int ER_NO_TABLES_USED = 1096; //SQLSTATE: HY000 Message: No tables used + public final static int ER_TOO_BIG_SET = 1097; //SQLSTATE: HY000 Message: Too many strings for column %s and SET + public final static int ER_NO_UNIQUE_LOGFILE = 1098; //SQLSTATE: HY000 Message: Can't generate a unique log-filename %s.(1-999) + public final static int ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099; //SQLSTATE: HY000 Message: Table '%s' was locked with a READ lock and can't be updated + public final static int ER_TABLE_NOT_LOCKED = 1100; //SQLSTATE: HY000 Message: Table '%s' was not locked with LOCK TABLES + public final static int ER_BLOB_CANT_HAVE_DEFAULT = 1101; //SQLSTATE: 42000 Message: BLOB/TEXT column '%s' can't have a default value + public final static int ER_WRONG_DB_NAME = 1102; //SQLSTATE: 42000 Message: Incorrect database name '%s' + public final static int ER_WRONG_TABLE_NAME = 1103; //SQLSTATE: 42000 Message: Incorrect table name '%s' + public final static int ER_TOO_BIG_SELECT = 1104; //SQLSTATE: 42000 Message: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay + public final static int ER_UNKNOWN_ERROR = 1105; //SQLSTATE: HY000 Message: Unknown error + public final static int ER_UNKNOWN_PROCEDURE = 1106; //SQLSTATE: 42000 Message: Unknown procedure '%s' + public final static int ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107; //SQLSTATE: 42000 Message: Incorrect parameter count to procedure '%s' + public final static int ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108; //SQLSTATE: HY000 Message: Incorrect parameters to procedure '%s' + public final static int ER_UNKNOWN_TABLE = 1109; //SQLSTATE: 42S02 Message: Unknown table '%s' in %s + public final static int ER_FIELD_SPECIFIED_TWICE = 1110; //SQLSTATE: 42000 Message: Column '%s' specified twice + public final static int ER_INVALID_GROUP_FUNC_USE = 1111; //SQLSTATE: HY000 Message: Invalid use of group function + public final static int ER_UNSUPPORTED_EXTENSION = 1112; //SQLSTATE: 42000 Message: Table '%s' uses an extension that doesn't exist in this MySQL version + public final static int ER_TABLE_MUST_HAVE_COLUMNS = 1113; //SQLSTATE: 42000 Message: A table must have at least 1 column + public final static int ER_RECORD_FILE_FULL = 1114; //SQLSTATE: HY000 Message: The table '%s' is full + public final static int ER_UNKNOWN_CHARACTER_SET = 1115; //SQLSTATE: 42000 Message: Unknown character set: '%s' + public final static int ER_TOO_MANY_TABLES = 1116; //SQLSTATE: HY000 Message: Too many tables; MySQL can only use %d tables in a join + public final static int ER_TOO_MANY_FIELDS = 1117; //SQLSTATE: HY000 Message: Too many columns + public final static int ER_TOO_BIG_ROWSIZE = 1118; //SQLSTATE: 42000 Message: Row size too large. The maximum row size for the used table type, not counting BLOBs, is %ld. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs + public final static int ER_STACK_OVERRUN = 1119; //SQLSTATE: HY000 Message: Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld --thread_stack=#' to specify a bigger stack if needed + public final static int ER_WRONG_OUTER_JOIN = 1120; //SQLSTATE: 42000 Message: Cross dependency found in OUTER JOIN; examine your ON conditions + public final static int ER_NULL_COLUMN_IN_INDEX = 1121; //SQLSTATE: 42000 Message: Table handler doesn't support NULL in given index. Please change column '%s' to be NOT NULL or use another handler + public final static int ER_CANT_FIND_UDF = 1122; //SQLSTATE: HY000 Message: Can't load function '%s' + public final static int ER_CANT_INITIALIZE_UDF = 1123; //SQLSTATE: HY000 Message: Can't initialize function '%s'; %s + public final static int ER_UDF_NO_PATHS = 1124; //SQLSTATE: HY000 Message: No paths allowed for shared library + public final static int ER_UDF_EXISTS = 1125; //SQLSTATE: HY000 Message: Function '%s' already exists + public final static int ER_CANT_OPEN_LIBRARY = 1126; //SQLSTATE: HY000 Message: Can't open shared library '%s' (errno: %d %s) + public final static int ER_CANT_FIND_DL_ENTRY = 1127; //SQLSTATE: HY000 Message: Can't find symbol '%s' in library + public final static int ER_FUNCTION_NOT_DEFINED = 1128; //SQLSTATE: HY000 Message: Function '%s' is not defined + public final static int ER_HOST_IS_BLOCKED = 1129; //SQLSTATE: HY000 Message: Host '%s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' + public final static int ER_HOST_NOT_PRIVILEGED = 1130; //SQLSTATE: HY000 Message: Host '%s' is not allowed to connect to this MySQL server + public final static int ER_PASSWORD_ANONYMOUS_USER = 1131; //SQLSTATE: 42000 Message: You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords + public final static int ER_PASSWORD_NOT_ALLOWED = 1132; //SQLSTATE: 42000 Message: You must have privileges to update tables in the mysql database to be able to change passwords for others + public final static int ER_PASSWORD_NO_MATCH = 1133; //SQLSTATE: 42000 Message: Can't find any matching row in the user table + public final static int ER_UPDATE_INFO = 1134; //SQLSTATE: HY000 Message: Rows matched: %ld Changed: %ld Warnings: %ld + public final static int ER_CANT_CREATE_THREAD = 1135; //SQLSTATE: HY000 Message: Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug + public final static int ER_WRONG_VALUE_COUNT_ON_ROW = 1136; //SQLSTATE: 21S01 Message: Column count doesn't match value count at row %ld + public final static int ER_CANT_REOPEN_TABLE = 1137; //SQLSTATE: HY000 Message: Can't reopen table: '%s' + public final static int ER_INVALID_USE_OF_NULL = 1138; //SQLSTATE: 22004 Message: Invalid use of NULL value + public final static int ER_REGEXP_ERROR = 1139; //SQLSTATE: 42000 Message: Got error '%s' from regexp + public final static int ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140; //SQLSTATE: 42000 Message: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause + public final static int ER_NONEXISTING_GRANT = 1141; //SQLSTATE: 42000 Message: There is no such grant defined for user '%s' on host '%s' + public final static int ER_TABLEACCESS_DENIED_ERROR = 1142; //SQLSTATE: 42000 Message: %s command denied to user '%s'@'%s' for table '%s' + public final static int ER_COLUMNACCESS_DENIED_ERROR = 1143; //SQLSTATE: 42000 Message: %s command denied to user '%s'@'%s' for column '%s' in table '%s' + public final static int ER_ILLEGAL_GRANT_FOR_TABLE = 1144; //SQLSTATE: 42000 Message: Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used + public final static int ER_GRANT_WRONG_HOST_OR_USER = 1145; //SQLSTATE: 42000 Message: The host or user argument to GRANT is too long + public final static int ER_NO_SUCH_TABLE = 1146; //SQLSTATE: 42S02 Message: Table '%s.%s' doesn't exist + public final static int ER_NONEXISTING_TABLE_GRANT = 1147; //SQLSTATE: 42000 Message: There is no such grant defined for user '%s' on host '%s' on table '%s' + public final static int ER_NOT_ALLOWED_COMMAND = 1148; //SQLSTATE: 42000 Message: The used command is not allowed with this MySQL version + public final static int ER_SYNTAX_ERROR = 1149; //SQLSTATE: 42000 Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use + public final static int ER_DELAYED_CANT_CHANGE_LOCK = 1150; //SQLSTATE: HY000 Message: Delayed insert thread couldn't get requested lock for table %s + public final static int ER_TOO_MANY_DELAYED_THREADS = 1151; //SQLSTATE: HY000 Message: Too many delayed threads in use + public final static int ER_ABORTING_CONNECTION = 1152; //SQLSTATE: 08S01 Message: Aborted connection %ld to db: '%s' user: '%s' (%s) + public final static int ER_NET_PACKET_TOO_LARGE = 1153; //SQLSTATE: 08S01 Message: Got a packet bigger than 'max_allowed_packet' bytes + public final static int ER_NET_READ_ERROR_FROM_PIPE = 1154; //SQLSTATE: 08S01 Message: Got a read error from the connection pipe + public final static int ER_NET_FCNTL_ERROR = 1155; //SQLSTATE: 08S01 Message: Got an error from fcntl() + public final static int ER_NET_PACKETS_OUT_OF_ORDER = 1156; //SQLSTATE: 08S01 Message: Got packets out of order + public final static int ER_NET_UNCOMPRESS_ERROR = 1157; //SQLSTATE: 08S01 Message: Couldn't uncompress communication packet + public final static int ER_NET_READ_ERROR = 1158; //SQLSTATE: 08S01 Message: Got an error reading communication packets + public final static int ER_NET_READ_INTERRUPTED = 1159; //SQLSTATE: 08S01 Message: Got timeout reading communication packets + public final static int ER_NET_ERROR_ON_WRITE = 1160; //SQLSTATE: 08S01 Message: Got an error writing communication packets + public final static int ER_NET_WRITE_INTERRUPTED = 1161; //SQLSTATE: 08S01 Message: Got timeout writing communication packets + public final static int ER_TOO_LONG_STRING = 1162; //SQLSTATE: 42000 Message: Result string is longer than 'max_allowed_packet' bytes + public final static int ER_TABLE_CANT_HANDLE_BLOB = 1163; //SQLSTATE: 42000 Message: The used table type doesn't support BLOB/TEXT columns + public final static int ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164; //SQLSTATE: 42000 Message: The used table type doesn't support AUTO_INCREMENT columns + public final static int ER_DELAYED_INSERT_TABLE_LOCKED = 1165; //SQLSTATE: HY000 Message: INSERT DELAYED can't be used with table '%s' because it is locked with LOCK TABLES + public final static int ER_WRONG_COLUMN_NAME = 1166; //SQLSTATE: 42000 Message: Incorrect column name '%s' + public final static int ER_WRONG_KEY_COLUMN = 1167; //SQLSTATE: 42000 Message: The used storage engine can't index column '%s' + public final static int ER_WRONG_MRG_TABLE = 1168; //SQLSTATE: HY000 Message: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist + public final static int ER_DUP_UNIQUE = 1169; //SQLSTATE: 23000 Message: Can't write, because of unique constraint, to table '%s' + public final static int ER_BLOB_KEY_WITHOUT_LENGTH = 1170; //SQLSTATE: 42000 Message: BLOB/TEXT column '%s' used in key specification without a key length + public final static int ER_PRIMARY_CANT_HAVE_NULL = 1171; //SQLSTATE: 42000 Message: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead + public final static int ER_TOO_MANY_ROWS = 1172; //SQLSTATE: 42000 Message: Result consisted of more than one row + public final static int ER_REQUIRES_PRIMARY_KEY = 1173; //SQLSTATE: 42000 Message: This table type requires a primary key + public final static int ER_NO_RAID_COMPILED = 1174; //SQLSTATE: HY000 Message: This version of MySQL is not compiled with RAID support + public final static int ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175; //SQLSTATE: HY000 Message: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column + public final static int ER_KEY_DOES_NOT_EXITS = 1176; //SQLSTATE: 42000 Message: Key '%s' doesn't exist in table '%s' + public final static int ER_CHECK_NO_SUCH_TABLE = 1177; //SQLSTATE: 42000 Message: Can't open table + public final static int ER_CHECK_NOT_IMPLEMENTED = 1178; //SQLSTATE: 42000 Message: The storage engine for the table doesn't support %s + public final static int ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179; //SQLSTATE: 25000 Message: You are not allowed to execute this command in a transaction + public final static int ER_ERROR_DURING_COMMIT = 1180; //SQLSTATE: HY000 Message: Got error %d during COMMIT + public final static int ER_ERROR_DURING_ROLLBACK = 1181; //SQLSTATE: HY000 Message: Got error %d during ROLLBACK + public final static int ER_ERROR_DURING_FLUSH_LOGS = 1182; //SQLSTATE: HY000 Message: Got error %d during FLUSH_LOGS + public final static int ER_ERROR_DURING_CHECKPOINT = 1183; //SQLSTATE: HY000 Message: Got error %d during CHECKPOINT + public final static int ER_NEW_ABORTING_CONNECTION = 1184; //SQLSTATE: 08S01 Message: Aborted connection %ld to db: '%s' user: '%s' host: '%s' (%s) + public final static int ER_DUMP_NOT_IMPLEMENTED = 1185; //SQLSTATE: HY000 Message: The storage engine for the table does not support binary table dump + @Deprecated + public final static int ER_FLUSH_MASTER_BINLOG_CLOSED = 1186; + public final static int ER_FLUSH_SOURCE_BINLOG_CLOSED = 1186; //SQLSTATE: HY000 Message: Binlog closed, cannot RESET SOURCE + public final static int ER_INDEX_REBUILD = 1187; //SQLSTATE: HY000 Message: Failed rebuilding the index of dumped table '%s' + @Deprecated + public final static int ER_MASTER = 1188; + public final static int ER_SOURCE = 1188; //SQLSTATE: HY000 Message: Error from source: '%s' + @Deprecated + public final static int ER_MASTER_NET_READ = 1189; + public final static int ER_SOURCE_NET_READ = 1189; //SQLSTATE: 08S01 Message: Net error reading from source + @Deprecated + public final static int ER_MASTER_NET_WRITE = 1190; + public final static int ER_SOURCE_NET_WRITE = 1190; //SQLSTATE: 08S01 Message: Net error writing to source + public final static int ER_FT_MATCHING_KEY_NOT_FOUND = 1191; //SQLSTATE: HY000 Message: Can't find FULLTEXT index matching the column list + public final static int ER_LOCK_OR_ACTIVE_TRANSACTION = 1192; //SQLSTATE: HY000 Message: Can't execute the given command because you have active locked tables or an active transaction + public final static int ER_UNKNOWN_SYSTEM_VARIABLE = 1193; //SQLSTATE: HY000 Message: Unknown system variable '%s' + public final static int ER_CRASHED_ON_USAGE = 1194; //SQLSTATE: HY000 Message: Table '%s' is marked as crashed and should be repaired + public final static int ER_CRASHED_ON_REPAIR = 1195; //SQLSTATE: HY000 Message: Table '%s' is marked as crashed and last (automatic?) repair failed + public final static int ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196; //SQLSTATE: HY000 Message: Some non-transactional changed tables couldn't be rolled back + public final static int ER_TRANS_CACHE_FULL = 1197; //SQLSTATE: HY000 Message: Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again + @Deprecated + public final static int ER_SLAVE_MUST_STOP = 1198; + public final static int ER_REPLICA_MUST_STOP = 1198; //SQLSTATE: HY000 Message: This operation cannot be performed with a running replica; run STOP REPLICA first + @Deprecated + public final static int ER_SLAVE_NOT_RUNNING = 1199; + public final static int ER_REPLICA_NOT_RUNNING = 1199; //SQLSTATE: HY000 Message: This operation requires a running replica; configure replica and do START REPLICA + @Deprecated + public final static int ER_BAD_SLAVE = 1200; + public final static int ER_BAD_REPLICA = 1200; //SQLSTATE: HY000 Message: The server is not configured as replica; fix in config file or with CHANGE SOURCE TO + @Deprecated + public final static int ER_MASTER_INFO = 1201; + public final static int ER_SOURCE_INFO = 1201; //SQLSTATE: HY000 Message: Could not initialize source info structure; more error messages can be found in the MySQL error log + @Deprecated + public final static int ER_SLAVE_THREAD = 1202; + public final static int ER_REPLICA_THREAD = 1202; //SQLSTATE: HY000 Message: Could not create replica thread; check system resources + public final static int ER_TOO_MANY_USER_CONNECTIONS = 1203; //SQLSTATE: 42000 Message: User %s already has more than 'max_user_connections' active connections + public final static int ER_SET_CONSTANTS_ONLY = 1204; //SQLSTATE: HY000 Message: You may only use constant expressions with SET + public final static int ER_LOCK_WAIT_TIMEOUT = 1205; //SQLSTATE: HY000 Message: Lock wait timeout exceeded; try restarting transaction + public final static int ER_LOCK_TABLE_FULL = 1206; //SQLSTATE: HY000 Message: The total number of locks exceeds the lock table size + public final static int ER_READ_ONLY_TRANSACTION = 1207; //SQLSTATE: 25000 Message: Update locks cannot be acquired during a READ UNCOMMITTED transaction + public final static int ER_DROP_DB_WITH_READ_LOCK = 1208; //SQLSTATE: HY000 Message: DROP DATABASE not allowed while thread is holding global read lock + public final static int ER_CREATE_DB_WITH_READ_LOCK = 1209; //SQLSTATE: HY000 Message: CREATE DATABASE not allowed while thread is holding global read lock + public final static int ER_WRONG_ARGUMENTS = 1210; //SQLSTATE: HY000 Message: Incorrect arguments to %s + public final static int ER_NO_PERMISSION_TO_CREATE_USER = 1211; //SQLSTATE: 42000 Message: '%s'@'%s' is not allowed to create new users + public final static int ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212; //SQLSTATE: HY000 Message: Incorrect table definition; all MERGE tables must be in the same database + public final static int ER_LOCK_DEADLOCK = 1213; //SQLSTATE: 40001 Message: Deadlock found when trying to get lock; try restarting transaction + public final static int ER_TABLE_CANT_HANDLE_FT = 1214; //SQLSTATE: HY000 Message: The used table type doesn't support FULLTEXT indexes + public final static int ER_CANNOT_ADD_FOREIGN = 1215; //SQLSTATE: HY000 Message: Cannot add foreign key constraint + public final static int ER_NO_REFERENCED_ROW = 1216; //SQLSTATE: 23000 Message: Cannot add or update a child row: a foreign key constraint fails + public final static int ER_ROW_IS_REFERENCED = 1217; //SQLSTATE: 23000 Message: Cannot delete or update a parent row: a foreign key constraint fails + @Deprecated + public final static int ER_CONNECT_TO_MASTER = 1218; + public final static int ER_CONNECT_TO_SOURCE = 1218; //SQLSTATE: 08S01 Message: Error connecting to source: %s + @Deprecated + public final static int ER_QUERY_ON_MASTER = 1219; + public final static int ER_QUERY_ON_SOURCE = 1219; //SQLSTATE: HY000 Message: Error running query on source: %s + public final static int ER_ERROR_WHEN_EXECUTING_COMMAND = 1220; //SQLSTATE: HY000 Message: Error when executing command %s: %s + public final static int ER_WRONG_USAGE = 1221; //SQLSTATE: HY000 Message: Incorrect usage of %s and %s + public final static int ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222; //SQLSTATE: 21000 Message: The used SELECT statements have a different number of columns + public final static int ER_CANT_UPDATE_WITH_READLOCK = 1223; //SQLSTATE: HY000 Message: Can't execute the query because you have a conflicting read lock + public final static int ER_MIXING_NOT_ALLOWED = 1224; //SQLSTATE: HY000 Message: Mixing of transactional and non-transactional tables is disabled + public final static int ER_DUP_ARGUMENT = 1225; //SQLSTATE: HY000 Message: Option '%s' used twice in statement + public final static int ER_USER_LIMIT_REACHED = 1226; //SQLSTATE: 42000 Message: User '%s' has exceeded the '%s' resource (current value: %ld) + public final static int ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227; //SQLSTATE: 42000 Message: Access denied; you need (at least one of) the %s privilege(s) for this operation + public final static int ER_LOCAL_VARIABLE = 1228; //SQLSTATE: HY000 Message: Variable '%s' is a SESSION variable and can't be used with SET GLOBAL + public final static int ER_GLOBAL_VARIABLE = 1229; //SQLSTATE: HY000 Message: Variable '%s' is a GLOBAL variable and should be set with SET GLOBAL + public final static int ER_NO_DEFAULT = 1230; //SQLSTATE: 42000 Message: Variable '%s' doesn't have a default value + public final static int ER_WRONG_VALUE_FOR_VAR = 1231; //SQLSTATE: 42000 Message: Variable '%s' can't be set to the value of '%s' + public final static int ER_WRONG_TYPE_FOR_VAR = 1232; //SQLSTATE: 42000 Message: Incorrect argument type to variable '%s' + public final static int ER_VAR_CANT_BE_READ = 1233; //SQLSTATE: HY000 Message: Variable '%s' can only be set, not read + public final static int ER_CANT_USE_OPTION_HERE = 1234; //SQLSTATE: 42000 Message: Incorrect usage/placement of '%s' + public final static int ER_NOT_SUPPORTED_YET = 1235; //SQLSTATE: 42000 Message: This version of MySQL doesn't yet support '%s' + @Deprecated + public final static int ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236; + public final static int ER_SOURCE_FATAL_ERROR_READING_BINLOG = 1236; //SQLSTATE: HY000 Message: Got fatal error %d from source when reading data from binary log: '%s' + @Deprecated + public final static int ER_SLAVE_IGNORED_TABLE = 1237; + public final static int ER_REPLICA_IGNORED_TABLE = 1237; //SQLSTATE: HY000 Message: Replica SQL thread ignored the query because of replicate-*-table rules + public final static int ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238; //SQLSTATE: HY000 Message: Variable '%s' is a %s variable + public final static int ER_WRONG_FK_DEF = 1239; //SQLSTATE: 42000 Message: Incorrect foreign key definition for '%s': %s + public final static int ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240; //SQLSTATE: HY000 Message: Key reference and table reference don't match + public final static int ER_OPERAND_COLUMNS = 1241; //SQLSTATE: 21000 Message: Operand should contain %d column(s) + public final static int ER_SUBQUERY_NO_1_ROW = 1242; //SQLSTATE: 21000 Message: Subquery returns more than 1 row + public final static int ER_UNKNOWN_STMT_HANDLER = 1243; //SQLSTATE: HY000 Message: Unknown prepared statement handler (%.*s) given to %s + public final static int ER_CORRUPT_HELP_DB = 1244; //SQLSTATE: HY000 Message: Help database is corrupt or does not exist + public final static int ER_CYCLIC_REFERENCE = 1245; //SQLSTATE: HY000 Message: Cyclic reference on subqueries + public final static int ER_AUTO_CONVERT = 1246; //SQLSTATE: HY000 Message: Converting column '%s' from %s to %s + public final static int ER_ILLEGAL_REFERENCE = 1247; //SQLSTATE: 42S22 Message: Reference '%s' not supported (%s) + public final static int ER_DERIVED_MUST_HAVE_ALIAS = 1248; //SQLSTATE: 42000 Message: Every derived table must have its own alias + public final static int ER_SELECT_REDUCED = 1249; //SQLSTATE: 01000 Message: Select %u was reduced during optimization + public final static int ER_TABLENAME_NOT_ALLOWED_HERE = 1250; //SQLSTATE: 42000 Message: Table '%s' from one of the SELECTs cannot be used in %s + public final static int ER_NOT_SUPPORTED_AUTH_MODE = 1251; //SQLSTATE: 08004 Message: Client does not support authentication protocol requested by server; consider upgrading MySQL client + public final static int ER_SPATIAL_CANT_HAVE_NULL = 1252; //SQLSTATE: 42000 Message: All parts of a SPATIAL index must be NOT NULL + public final static int ER_COLLATION_CHARSET_MISMATCH = 1253; //SQLSTATE: 42000 Message: COLLATION '%s' is not valid for CHARACTER SET '%s' + @Deprecated + public final static int ER_SLAVE_WAS_RUNNING = 1254; + public final static int ER_REPLICA_WAS_RUNNING = 1254; //SQLSTATE: HY000 Message: Replica is already running + @Deprecated + public final static int ER_SLAVE_WAS_NOT_RUNNING = 1255; + public final static int ER_REPLICA_WAS_NOT_RUNNING = 1255; //SQLSTATE: HY000 Message: Replica already has been stopped + public final static int ER_TOO_BIG_FOR_UNCOMPRESS = 1256; //SQLSTATE: HY000 Message: Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted) + public final static int ER_ZLIB_Z_MEM_ERROR = 1257; //SQLSTATE: HY000 Message: ZLIB: Not enough memory + public final static int ER_ZLIB_Z_BUF_ERROR = 1258; //SQLSTATE: HY000 Message: ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted) + public final static int ER_ZLIB_Z_DATA_ERROR = 1259; //SQLSTATE: HY000 Message: ZLIB: Input data corrupted + public final static int ER_CUT_VALUE_GROUP_CONCAT = 1260; //SQLSTATE: HY000 Message: Row %u was cut by GROUP_CONCAT() + public final static int ER_WARN_TOO_FEW_RECORDS = 1261; //SQLSTATE: 01000 Message: Row %ld doesn't contain data for all columns + public final static int ER_WARN_TOO_MANY_RECORDS = 1262; //SQLSTATE: 01000 Message: Row %ld was truncated; it contained more data than there were input columns + public final static int ER_WARN_NULL_TO_NOTNULL = 1263; //SQLSTATE: 22004 Message: Column set to default value; NULL supplied to NOT NULL column '%s' at row %ld + public final static int ER_WARN_DATA_OUT_OF_RANGE = 1264; //SQLSTATE: 22003 Message: Out of range value for column '%s' at row %ld + public final static int ER_WARN_DATA_TRUNCATED = 1265; //SQLSTATE: 01000 Message: Data truncated for column '%s' at row %ld + public final static int ER_WARN_USING_OTHER_HANDLER = 1266; //SQLSTATE: HY000 Message: Using storage engine %s for table '%s' + public final static int ER_CANT_AGGREGATE_2COLLATIONS = 1267; //SQLSTATE: HY000 Message: Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s' + public final static int ER_DROP_USER = 1268; //SQLSTATE: HY000 Message: Cannot drop one or more of the requested users + public final static int ER_REVOKE_GRANTS = 1269; //SQLSTATE: HY000 Message: Can't revoke all privileges for one or more of the requested users + public final static int ER_CANT_AGGREGATE_3COLLATIONS = 1270; //SQLSTATE: HY000 Message: Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s' + public final static int ER_CANT_AGGREGATE_NCOLLATIONS = 1271; //SQLSTATE: HY000 Message: Illegal mix of collations for operation '%s' + public final static int ER_VARIABLE_IS_NOT_STRUCT = 1272; //SQLSTATE: HY000 Message: Variable '%s' is not a variable component (can't be used as XXXX.variable_name) + public final static int ER_UNKNOWN_COLLATION = 1273; //SQLSTATE: HY000 Message: Unknown collation: '%s' + @Deprecated + public final static int ER_SLAVE_IGNORED_SSL_PARAMS = 1274; + public final static int ER_REPLICA_IGNORED_SSL_PARAMS = 1274; //SQLSTATE: HY000 Message: SSL parameters in CHANGE SOURCE are ignored because this MySQL replica was compiled without SSL support; they can be used later if MySQL replica with SSL is started + public final static int ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275; //SQLSTATE: HY000 Message: Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format + public final static int ER_WARN_FIELD_RESOLVED = 1276; //SQLSTATE: HY000 Message: Field or reference '%s%s%s%s%s' of SELECT #%d was resolved in SELECT #%d + @Deprecated + public final static int ER_BAD_SLAVE_UNTIL_COND = 1277; + public final static int ER_BAD_REPLICA_UNTIL_COND = 1277; //SQLSTATE: HY000 Message: Incorrect parameter or combination of parameters for START REPLICA UNTIL + @Deprecated + public final static int ER_MISSING_SKIP_SLAVE = 1278; + public final static int ER_MISSING_SKIP_REPLICA = 1278; //SQLSTATE: HY000 Message: It is recommended to use --skip-replica-start when doing step-by-step replication with START REPLICA UNTIL; otherwise, you will get problems if you get an unexpected replica's mysqld restart + public final static int ER_UNTIL_COND_IGNORED = 1279; //SQLSTATE: HY000 Message: SQL thread is not to be started so UNTIL options are ignored + public final static int ER_WRONG_NAME_FOR_INDEX = 1280; //SQLSTATE: 42000 Message: Incorrect index name '%s' + public final static int ER_WRONG_NAME_FOR_CATALOG = 1281; //SQLSTATE: 42000 Message: Incorrect catalog name '%s' + public final static int ER_WARN_QC_RESIZE = 1282; //SQLSTATE: HY000 Message: Query cache failed to set size %lu; new query cache size is %lu + public final static int ER_BAD_FT_COLUMN = 1283; //SQLSTATE: HY000 Message: Column '%s' cannot be part of FULLTEXT index + public final static int ER_UNKNOWN_KEY_CACHE = 1284; //SQLSTATE: HY000 Message: Unknown key cache '%s' + public final static int ER_WARN_HOSTNAME_WONT_WORK = 1285; //SQLSTATE: HY000 Message: MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work + public final static int ER_UNKNOWN_STORAGE_ENGINE = 1286; //SQLSTATE: 42000 Message: Unknown storage engine '%s' + public final static int ER_WARN_DEPRECATED_SYNTAX = 1287; //SQLSTATE: HY000 Message: '%s' is deprecated and will be removed in a future release. Please use %s instead + public final static int ER_NON_UPDATABLE_TABLE = 1288; //SQLSTATE: HY000 Message: The target table %s of the %s is not updatable + public final static int ER_FEATURE_DISABLED = 1289; //SQLSTATE: HY000 Message: The '%s' feature is disabled; you need MySQL built with '%s' to have it working + public final static int ER_OPTION_PREVENTS_STATEMENT = 1290; //SQLSTATE: HY000 Message: The MySQL server is running with the %s option so it cannot execute this statement + public final static int ER_DUPLICATED_VALUE_IN_TYPE = 1291; //SQLSTATE: HY000 Message: Column '%s' has duplicated value '%s' in %s + public final static int ER_TRUNCATED_WRONG_VALUE = 1292; //SQLSTATE: 22007 Message: Truncated incorrect %s value: '%s' + public final static int ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293; //SQLSTATE: HY000 Message: Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause + public final static int ER_INVALID_ON_UPDATE = 1294; //SQLSTATE: HY000 Message: Invalid ON UPDATE clause for '%s' column + public final static int ER_UNSUPPORTED_PS = 1295; //SQLSTATE: HY000 Message: This command is not supported in the prepared statement protocol yet + public final static int ER_GET_ERRMSG = 1296; //SQLSTATE: HY000 Message: Got error %d '%s' from %s + public final static int ER_GET_TEMPORARY_ERRMSG = 1297; //SQLSTATE: HY000 Message: Got temporary error %d '%s' from %s + public final static int ER_UNKNOWN_TIME_ZONE = 1298; //SQLSTATE: HY000 Message: Unknown or incorrect time zone: '%s' + public final static int ER_WARN_INVALID_TIMESTAMP = 1299; //SQLSTATE: HY000 Message: Invalid TIMESTAMP value in column '%s' at row %ld + public final static int ER_INVALID_CHARACTER_STRING = 1300; //SQLSTATE: HY000 Message: Invalid %s character string: '%s' + public final static int ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301; //SQLSTATE: HY000 Message: Result of %s() was larger than max_allowed_packet (%ld) - truncated + public final static int ER_CONFLICTING_DECLARATIONS = 1302; //SQLSTATE: HY000 Message: Conflicting declarations: '%s%s' and '%s%s' + public final static int ER_SP_NO_RECURSIVE_CREATE = 1303; //SQLSTATE: 2F003 Message: Can't create a %s from within another stored routine + public final static int ER_SP_ALREADY_EXISTS = 1304; //SQLSTATE: 42000 Message: %s %s already exists + public final static int ER_SP_DOES_NOT_EXIST = 1305; //SQLSTATE: 42000 Message: %s %s does not exist + public final static int ER_SP_DROP_FAILED = 1306; //SQLSTATE: HY000 Message: Failed to DROP %s %s + public final static int ER_SP_STORE_FAILED = 1307; //SQLSTATE: HY000 Message: Failed to CREATE %s %s + public final static int ER_SP_LILABEL_MISMATCH = 1308; //SQLSTATE: 42000 Message: %s with no matching label: %s + public final static int ER_SP_LABEL_REDEFINE = 1309; //SQLSTATE: 42000 Message: Redefining label %s + public final static int ER_SP_LABEL_MISMATCH = 1310; //SQLSTATE: 42000 Message: End-label %s without match + public final static int ER_SP_UNINIT_VAR = 1311; //SQLSTATE: 01000 Message: Referring to uninitialized variable %s + public final static int ER_SP_BADSELECT = 1312; //SQLSTATE: 0A000 Message: PROCEDURE %s can't return a result set in the given context + public final static int ER_SP_BADRETURN = 1313; //SQLSTATE: 42000 Message: RETURN is only allowed in a FUNCTION + public final static int ER_SP_BADSTATEMENT = 1314; //SQLSTATE: 0A000 Message: %s is not allowed in stored procedures + public final static int ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315; //SQLSTATE: 42000 Message: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been ignored. This option will be removed in MySQL 5.6. + public final static int ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316; //SQLSTATE: 42000 Message: The update log is deprecated and replaced by the binary log; SET SQL_LOG_UPDATE has been translated to SET SQL_LOG_BIN. This option will be removed in MySQL 5.6. + public final static int ER_QUERY_INTERRUPTED = 1317; //SQLSTATE: 70100 Message: Query execution was interrupted + public final static int ER_SP_WRONG_NO_OF_ARGS = 1318; //SQLSTATE: 42000 Message: Incorrect number of arguments for %s %s; expected %u, got %u + public final static int ER_SP_COND_MISMATCH = 1319; //SQLSTATE: 42000 Message: Undefined CONDITION: %s + public final static int ER_SP_NORETURN = 1320; //SQLSTATE: 42000 Message: No RETURN found in FUNCTION %s + public final static int ER_SP_NORETURNEND = 1321; //SQLSTATE: 2F005 Message: FUNCTION %s ended without RETURN + public final static int ER_SP_BAD_CURSOR_QUERY = 1322; //SQLSTATE: 42000 Message: Cursor statement must be a SELECT + public final static int ER_SP_BAD_CURSOR_SELECT = 1323; //SQLSTATE: 42000 Message: Cursor SELECT must not have INTO + public final static int ER_SP_CURSOR_MISMATCH = 1324; //SQLSTATE: 42000 Message: Undefined CURSOR: %s + public final static int ER_SP_CURSOR_ALREADY_OPEN = 1325; //SQLSTATE: 24000 Message: Cursor is already open + public final static int ER_SP_CURSOR_NOT_OPEN = 1326; //SQLSTATE: 24000 Message: Cursor is not open + public final static int ER_SP_UNDECLARED_VAR = 1327; //SQLSTATE: 42000 Message: Undeclared variable: %s + public final static int ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328; //SQLSTATE: HY000 Message: Incorrect number of FETCH variables + public final static int ER_SP_FETCH_NO_DATA = 1329; //SQLSTATE: 02000 Message: No data - zero rows fetched, selected, or processed + public final static int ER_SP_DUP_PARAM = 1330; //SQLSTATE: 42000 Message: Duplicate parameter: %s + public final static int ER_SP_DUP_VAR = 1331; //SQLSTATE: 42000 Message: Duplicate variable: %s + public final static int ER_SP_DUP_COND = 1332; //SQLSTATE: 42000 Message: Duplicate condition: %s + public final static int ER_SP_DUP_CURS = 1333; //SQLSTATE: 42000 Message: Duplicate cursor: %s + public final static int ER_SP_CANT_ALTER = 1334; //SQLSTATE: HY000 Message: Failed to ALTER %s %s + public final static int ER_SP_SUBSELECT_NYI = 1335; //SQLSTATE: 0A000 Message: Subquery value not supported + public final static int ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336; //SQLSTATE: 0A000 Message: %s is not allowed in stored function or trigger + public final static int ER_SP_VARCOND_AFTER_CURSHNDLR = 1337; //SQLSTATE: 42000 Message: Variable or condition declaration after cursor or handler declaration + public final static int ER_SP_CURSOR_AFTER_HANDLER = 1338; //SQLSTATE: 42000 Message: Cursor declaration after handler declaration + public final static int ER_SP_CASE_NOT_FOUND = 1339; //SQLSTATE: 20000 Message: Case not found for CASE statement + public final static int ER_FPARSER_TOO_BIG_FILE = 1340; //SQLSTATE: HY000 Message: Configuration file '%s' is too big + public final static int ER_FPARSER_BAD_HEADER = 1341; //SQLSTATE: HY000 Message: Malformed file type header in file '%s' + public final static int ER_FPARSER_EOF_IN_COMMENT = 1342; //SQLSTATE: HY000 Message: Unexpected end of file while parsing comment '%s' + public final static int ER_FPARSER_ERROR_IN_PARAMETER = 1343; //SQLSTATE: HY000 Message: Error while parsing parameter '%s' (line: '%s') + public final static int ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344; //SQLSTATE: HY000 Message: Unexpected end of file while skipping unknown parameter '%s' + public final static int ER_VIEW_NO_EXPLAIN = 1345; //SQLSTATE: HY000 Message: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table + public final static int ER_FRM_UNKNOWN_TYPE = 1346; //SQLSTATE: HY000 Message: File '%s' has unknown type '%s' in its header + public final static int ER_WRONG_OBJECT = 1347; //SQLSTATE: HY000 Message: '%s.%s' is not %s + public final static int ER_NONUPDATEABLE_COLUMN = 1348; //SQLSTATE: HY000 Message: Column '%s' is not updatable + public final static int ER_VIEW_SELECT_DERIVED = 1349; //SQLSTATE: HY000 Message: View's SELECT contains a subquery in the FROM clause + public final static int ER_VIEW_SELECT_CLAUSE = 1350; //SQLSTATE: HY000 Message: View's SELECT contains a '%s' clause + public final static int ER_VIEW_SELECT_VARIABLE = 1351; //SQLSTATE: HY000 Message: View's SELECT contains a variable or parameter + public final static int ER_VIEW_SELECT_TMPTABLE = 1352; //SQLSTATE: HY000 Message: View's SELECT refers to a temporary table '%s' + public final static int ER_VIEW_WRONG_LIST = 1353; //SQLSTATE: HY000 Message: View's SELECT and view's field list have different column counts + public final static int ER_WARN_VIEW_MERGE = 1354; //SQLSTATE: HY000 Message: View merge algorithm can't be used here for now (assumed undefined algorithm) + public final static int ER_WARN_VIEW_WITHOUT_KEY = 1355; //SQLSTATE: HY000 Message: View being updated does not have complete key of underlying table in it + public final static int ER_VIEW_INVALID = 1356; //SQLSTATE: HY000 Message: View '%s.%s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them + public final static int ER_SP_NO_DROP_SP = 1357; //SQLSTATE: HY000 Message: Can't drop or alter a %s from within another stored routine + public final static int ER_SP_GOTO_IN_HNDLR = 1358; //SQLSTATE: HY000 Message: GOTO is not allowed in a stored procedure handler + public final static int ER_TRG_ALREADY_EXISTS = 1359; //SQLSTATE: HY000 Message: Trigger already exists + public final static int ER_TRG_DOES_NOT_EXIST = 1360; //SQLSTATE: HY000 Message: Trigger does not exist + public final static int ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361; //SQLSTATE: HY000 Message: Trigger's '%s' is view or temporary table + public final static int ER_TRG_CANT_CHANGE_ROW = 1362; //SQLSTATE: HY000 Message: Updating of %s row is not allowed in %strigger + public final static int ER_TRG_NO_SUCH_ROW_IN_TRG = 1363; //SQLSTATE: HY000 Message: There is no %s row in %s trigger + public final static int ER_NO_DEFAULT_FOR_FIELD = 1364; //SQLSTATE: HY000 Message: Field '%s' doesn't have a default value + public final static int ER_DIVISION_BY_ZERO = 1365; //SQLSTATE: 22012 Message: Division by 0 + public final static int ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366; //SQLSTATE: HY000 Message: Incorrect %s value: '%s' for column '%s' at row %ld + public final static int ER_ILLEGAL_VALUE_FOR_TYPE = 1367; //SQLSTATE: 22007 Message: Illegal %s '%s' value found during parsing + public final static int ER_VIEW_NONUPD_CHECK = 1368; //SQLSTATE: HY000 Message: CHECK OPTION on non-updatable view '%s.%s' + public final static int ER_VIEW_CHECK_FAILED = 1369; //SQLSTATE: HY000 Message: CHECK OPTION failed '%s.%s' + public final static int ER_PROCACCESS_DENIED_ERROR = 1370; //SQLSTATE: 42000 Message: %s command denied to user '%s'@'%s' for routine '%s' + public final static int ER_RELAY_LOG_FAIL = 1371; //SQLSTATE: HY000 Message: Failed purging old relay logs: %s + public final static int ER_PASSWD_LENGTH = 1372; //SQLSTATE: HY000 Message: Password hash should be a %d-digit hexadecimal number + public final static int ER_UNKNOWN_TARGET_BINLOG = 1373; //SQLSTATE: HY000 Message: Target log not found in binlog index + public final static int ER_IO_ERR_LOG_INDEX_READ = 1374; //SQLSTATE: HY000 Message: I/O error reading log index file + public final static int ER_BINLOG_PURGE_PROHIBITED = 1375; //SQLSTATE: HY000 Message: Server configuration does not permit binlog purge + public final static int ER_FSEEK_FAIL = 1376; //SQLSTATE: HY000 Message: Failed on fseek() + public final static int ER_BINLOG_PURGE_FATAL_ERR = 1377; //SQLSTATE: HY000 Message: Fatal error during log purge + public final static int ER_LOG_IN_USE = 1378; //SQLSTATE: HY000 Message: A purgeable log is in use, will not purge + public final static int ER_LOG_PURGE_UNKNOWN_ERR = 1379; //SQLSTATE: HY000 Message: Unknown error during log purge + public final static int ER_RELAY_LOG_INIT = 1380; //SQLSTATE: HY000 Message: Failed initializing relay log position: %s + public final static int ER_NO_BINARY_LOGGING = 1381; //SQLSTATE: HY000 Message: You are not using binary main.logging + public final static int ER_RESERVED_SYNTAX = 1382; //SQLSTATE: HY000 Message: The '%s' syntax is reserved for purposes internal to the MySQL server + public final static int ER_WSAS_FAILED = 1383; //SQLSTATE: HY000 Message: WSAStartup Failed + public final static int ER_DIFF_GROUPS_PROC = 1384; //SQLSTATE: HY000 Message: Can't handle procedures with different groups yet + public final static int ER_NO_GROUP_FOR_PROC = 1385; //SQLSTATE: HY000 Message: Select must have a group with this procedure + public final static int ER_ORDER_WITH_PROC = 1386; //SQLSTATE: HY000 Message: Can't use ORDER clause with this procedure + public final static int ER_LOGGING_PROHIBIT_CHANGING_OF = 1387; //SQLSTATE: HY000 Message: Binary main.logging and replication forbid changing the global server %s + public final static int ER_NO_FILE_MAPPING = 1388; //SQLSTATE: HY000 Message: Can't map file: %s, errno: %d + public final static int ER_WRONG_MAGIC = 1389; //SQLSTATE: HY000 Message: Wrong magic in %s + public final static int ER_PS_MANY_PARAM = 1390; //SQLSTATE: HY000 Message: Prepared statement contains too many placeholders + public final static int ER_KEY_PART_0 = 1391; //SQLSTATE: HY000 Message: Key part '%s' length cannot be 0 + public final static int ER_VIEW_CHECKSUM = 1392; //SQLSTATE: HY000 Message: View text checksum failed + public final static int ER_VIEW_MULTIUPDATE = 1393; //SQLSTATE: HY000 Message: Can not modify more than one base table through a join view '%s.%s' + public final static int ER_VIEW_NO_INSERT_FIELD_LIST = 1394; //SQLSTATE: HY000 Message: Can not insert into join view '%s.%s' without fields list + public final static int ER_VIEW_DELETE_MERGE_VIEW = 1395; //SQLSTATE: HY000 Message: Can not delete from join view '%s.%s' + public final static int ER_CANNOT_USER = 1396; //SQLSTATE: HY000 Message: Operation %s failed for %s + public final static int ER_XAER_NOTA = 1397; //SQLSTATE: XAE04 Message: XAER_NOTA: Unknown XID + public final static int ER_XAER_INVAL = 1398; //SQLSTATE: XAE05 Message: XAER_INVAL: Invalid arguments (or unsupported command) + public final static int ER_XAER_RMFAIL = 1399; //SQLSTATE: XAE07 Message: XAER_RMFAIL: The command cannot be executed when global transaction is in the %s state + public final static int ER_XAER_OUTSIDE = 1400; //SQLSTATE: XAE09 Message: XAER_OUTSIDE: Some work is done outside global transaction + public final static int ER_XA_RMERR = 1401; + public final static int ER_XA_RBROLLBACK = 1402; //SQLSTATE: XA100 Message: XA_RBROLLBACK: Transaction branch was rolled back + public final static int ER_NONEXISTING_PROC_GRANT = 1403; //SQLSTATE: 42000 Message: There is no such grant defined for user '%s' on host '%s' on routine '%s' + public final static int ER_PROC_AUTO_GRANT_FAIL = 1404; //SQLSTATE: HY000 Message: Failed to grant EXECUTE and ALTER ROUTINE privileges + public final static int ER_PROC_AUTO_REVOKE_FAIL = 1405; //SQLSTATE: HY000 Message: Failed to revoke all privileges to dropped routine + public final static int ER_DATA_TOO_LONG = 1406; //SQLSTATE: 22001 Message: Data too long for column '%s' at row %ld + public final static int ER_SP_BAD_SQLSTATE = 1407; //SQLSTATE: 42000 Message: Bad; //SQLSTATE: '%s' + public final static int ER_STARTUP = 1408; //SQLSTATE: HY000 Message: %s: ready for connections. Version: '%s' socket: '%s' port: %d %s + public final static int ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409; //SQLSTATE: HY000 Message: Can't load value from file with fixed size rows to variable + public final static int ER_CANT_CREATE_USER_WITH_GRANT = 1410; //SQLSTATE: 42000 Message: You are not allowed to create a user with GRANT + public final static int ER_WRONG_VALUE_FOR_TYPE = 1411; //SQLSTATE: HY000 Message: Incorrect %s value: '%s' for function %s + public final static int ER_TABLE_DEF_CHANGED = 1412; //SQLSTATE: HY000 Message: Table definition has changed, please retry transaction + public final static int ER_SP_DUP_HANDLER = 1413; //SQLSTATE: 42000 Message: Duplicate handler declared in the same block + public final static int ER_SP_NOT_VAR_ARG = 1414; //SQLSTATE: 42000 Message: OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger + public final static int ER_SP_NO_RETSET = 1415; //SQLSTATE: 0A000 Message: Not allowed to return a result set from a %s + public final static int ER_CANT_CREATE_GEOMETRY_OBJECT = 1416; //SQLSTATE: 22003 Message: Cannot get geometry object from data you send to the GEOMETRY field + public final static int ER_FAILED_ROUTINE_BREAK_BINLOG = 1417; //SQLSTATE: HY000 Message: A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary main.logging is enabled; if non-transactional tables were updated, the binary log will miss their changes + public final static int ER_BINLOG_UNSAFE_ROUTINE = 1418; //SQLSTATE: HY000 Message: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary main.logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) + public final static int ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419; //SQLSTATE: HY000 Message: You do not have the SUPER privilege and binary main.logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) + public final static int ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420; //SQLSTATE: HY000 Message: You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it. + public final static int ER_STMT_HAS_NO_OPEN_CURSOR = 1421; //SQLSTATE: HY000 Message: The statement (%lu) has no open cursor. + public final static int ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422; //SQLSTATE: HY000 Message: Explicit or implicit commit is not allowed in stored function or trigger. + public final static int ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423; //SQLSTATE: HY000 Message: Field of view '%s.%s' underlying table doesn't have a default value + public final static int ER_SP_NO_RECURSION = 1424; //SQLSTATE: HY000 Message: Recursive stored functions and triggers are not allowed. + public final static int ER_TOO_BIG_SCALE = 1425; //SQLSTATE: 42000 Message: Too big scale %d specified for column '%s'. Maximum is %lu. + public final static int ER_TOO_BIG_PRECISION = 1426; //SQLSTATE: 42000 Message: Too big precision %d specified for column '%s'. Maximum is %lu. + public final static int ER_M_BIGGER_THAN_D = 1427; //SQLSTATE: 42000 Message: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%s'). + public final static int ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428; //SQLSTATE: HY000 Message: You can't combine write-locking of system tables with other tables or lock types + public final static int ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429; //SQLSTATE: HY000 Message: Unable to connect to foreign data source: %s + public final static int ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430; //SQLSTATE: HY000 Message: There was a problem processing the query on the foreign data source. Data source error: %s + public final static int ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431; //SQLSTATE: HY000 Message: The foreign data source you are trying to reference does not exist. Data source error: %s + public final static int ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432; //SQLSTATE: HY000 Message: Can't create federated table. The data source connection string '%s' is not in the correct format + public final static int ER_FOREIGN_DATA_STRING_INVALID = 1433; //SQLSTATE: HY000 Message: The data source connection string '%s' is not in the correct format + public final static int ER_CANT_CREATE_FEDERATED_TABLE = 1434; //SQLSTATE: HY000 Message: Can't create federated table. Foreign data src error: %s + public final static int ER_TRG_IN_WRONG_SCHEMA = 1435; //SQLSTATE: HY000 Message: Trigger in wrong schema + public final static int ER_STACK_OVERRUN_NEED_MORE = 1436; //SQLSTATE: HY000 Message: Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack. + public final static int ER_TOO_LONG_BODY = 1437; //SQLSTATE: 42000 Message: Routine body for '%s' is too long + public final static int ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438; //SQLSTATE: HY000 Message: Cannot drop default keycache + public final static int ER_TOO_BIG_DISPLAYWIDTH = 1439; //SQLSTATE: 42000 Message: Display width out of range for column '%s' (max = %lu) + public final static int ER_XAER_DUPID = 1440; //SQLSTATE: XAE08 Message: XAER_DUPID: The XID already exists + public final static int ER_DATETIME_FUNCTION_OVERFLOW = 1441; //SQLSTATE: 22008 Message: Datetime function: %s field overflow + public final static int ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442; //SQLSTATE: HY000 Message: Can't update table '%s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. + public final static int ER_VIEW_PREVENT_UPDATE = 1443; //SQLSTATE: HY000 Message: The definition of table '%s' prevents operation %s on table '%s'. + public final static int ER_PS_NO_RECURSION = 1444; //SQLSTATE: HY000 Message: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner + public final static int ER_SP_CANT_SET_AUTOCOMMIT = 1445; //SQLSTATE: HY000 Message: Not allowed to set autocommit from a stored function or trigger + public final static int ER_MALFORMED_DEFINER = 1446; //SQLSTATE: HY000 Message: Definer is not fully qualified + public final static int ER_VIEW_FRM_NO_USER = 1447; //SQLSTATE: HY000 Message: View '%s'.'%s' has no definer information (old table format). Current user is used as definer. Please recreate the view! + public final static int ER_VIEW_OTHER_USER = 1448; //SQLSTATE: HY000 Message: You need the SUPER privilege for creation view with '%s'@'%s' definer + public final static int ER_NO_SUCH_USER = 1449; //SQLSTATE: HY000 Message: The user specified as a definer ('%s'@'%s') does not exist + public final static int ER_FORBID_SCHEMA_CHANGE = 1450; //SQLSTATE: HY000 Message: Changing schema from '%s' to '%s' is not allowed. + public final static int ER_ROW_IS_REFERENCED_2 = 1451; //SQLSTATE: 23000 Message: Cannot delete or update a parent row: a foreign key constraint fails (%s) + public final static int ER_NO_REFERENCED_ROW_2 = 1452; //SQLSTATE: 23000 Message: Cannot add or update a child row: a foreign key constraint fails (%s) + public final static int ER_SP_BAD_VAR_SHADOW = 1453; //SQLSTATE: 42000 Message: Variable '%s' must be quoted with `...`, or renamed + public final static int ER_TRG_NO_DEFINER = 1454; //SQLSTATE: HY000 Message: No definer attribute for trigger '%s'.'%s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger. + public final static int ER_OLD_FILE_FORMAT = 1455; //SQLSTATE: HY000 Message: '%s' has an old format, you should re-create the '%s' object(s) + public final static int ER_SP_RECURSION_LIMIT = 1456; //SQLSTATE: HY000 Message: Recursive limit %d (as set by the max_sp_recursion_depth variable) was exceeded for routine %s + public final static int ER_SP_PROC_TABLE_CORRUPT = 1457; //SQLSTATE: HY000 Message: Failed to load routine %s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d) + public final static int ER_SP_WRONG_NAME = 1458; //SQLSTATE: 42000 Message: Incorrect routine name '%s' + public final static int ER_TABLE_NEEDS_UPGRADE = 1459; //SQLSTATE: HY000 Message: Table upgrade required. Please do "REPAIR TABLE `%s`" or dump/reload to fix it! + public final static int ER_SP_NO_AGGREGATE = 1460; //SQLSTATE: 42000 Message: AGGREGATE is not supported for stored functions + public final static int ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461; //SQLSTATE: 42000 Message: Can't create more than max_prepared_stmt_count statements (current value: %lu) + public final static int ER_VIEW_RECURSIVE = 1462; //SQLSTATE: HY000 Message: `%s`.`%s` contains view recursion + public final static int ER_NON_GROUPING_FIELD_USED = 1463; //SQLSTATE: 42000 Message: non-grouping field '%s' is used in %s clause + public final static int ER_TABLE_CANT_HANDLE_SPKEYS = 1464; //SQLSTATE: HY000 Message: The used table type doesn't support SPATIAL indexes + public final static int ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465; //SQLSTATE: HY000 Message: Triggers can not be created on system tables + public final static int ER_REMOVED_SPACES = 1466; //SQLSTATE: HY000 Message: Leading spaces are removed from name '%s' + public final static int ER_AUTOINC_READ_FAILED = 1467; //SQLSTATE: HY000 Message: Failed to read auto-increment value from storage engine + public final static int ER_USERNAME = 1468; //SQLSTATE: HY000 Message: user name + public final static int ER_HOSTNAME = 1469; //SQLSTATE: HY000 Message: host name + public final static int ER_WRONG_STRING_LENGTH = 1470; //SQLSTATE: HY000 Message: String '%s' is too long for %s (should be no longer than %d) + public final static int ER_NON_INSERTABLE_TABLE = 1471; //SQLSTATE: HY000 Message: The target table %s of the %s is not insertable-into + public final static int ER_ADMIN_WRONG_MRG_TABLE = 1472; //SQLSTATE: HY000 Message: Table '%s' is differently defined or of non-MyISAM type or doesn't exist + public final static int ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473; //SQLSTATE: HY000 Message: Too high level of nesting for select + public final static int ER_NAME_BECOMES_EMPTY = 1474; //SQLSTATE: HY000 Message: Name '%s' has become '' + public final static int ER_AMBIGUOUS_FIELD_TERM = 1475; //SQLSTATE: HY000 Message: First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY + public final static int ER_FOREIGN_SERVER_EXISTS = 1476; //SQLSTATE: HY000 Message: The foreign server, %s, you are trying to create already exists. + public final static int ER_FOREIGN_SERVER_DOESNT_EXIST = 1477; //SQLSTATE: HY000 Message: The foreign server name you are trying to reference does not exist. Data source error: %s + public final static int ER_ILLEGAL_HA_CREATE_OPTION = 1478; //SQLSTATE: HY000 Message: Table storage engine '%s' does not support the create option '%s' + public final static int ER_PARTITION_REQUIRES_VALUES_ERROR = 1479; //SQLSTATE: HY000 Message: Syntax error: %s PARTITIONING requires definition of VALUES %s for each partition + public final static int ER_PARTITION_WRONG_VALUES_ERROR = 1480; //SQLSTATE: HY000 Message: Only %s PARTITIONING can use VALUES %s in partition definition + public final static int ER_PARTITION_MAXVALUE_ERROR = 1481; //SQLSTATE: HY000 Message: MAXVALUE can only be used in last partition definition + public final static int ER_PARTITION_SUBPARTITION_ERROR = 1482; //SQLSTATE: HY000 Message: Subpartitions can only be hash partitions and by key + public final static int ER_PARTITION_SUBPART_MIX_ERROR = 1483; //SQLSTATE: HY000 Message: Must define subpartitions on all partitions if on one partition + public final static int ER_PARTITION_WRONG_NO_PART_ERROR = 1484; //SQLSTATE: HY000 Message: Wrong number of partitions defined, mismatch with previous setting + public final static int ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485; //SQLSTATE: HY000 Message: Wrong number of subpartitions defined, mismatch with previous setting + public final static int ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486; //SQLSTATE: HY000 Message: Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed + public final static int ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487; //SQLSTATE: HY000 Message: Expression in RANGE/LIST VALUES must be constant + public final static int ER_FIELD_NOT_FOUND_PART_ERROR = 1488; //SQLSTATE: HY000 Message: Field in list of fields for partition function not found in table + public final static int ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489; //SQLSTATE: HY000 Message: List of fields is only allowed in KEY partitions + public final static int ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490; //SQLSTATE: HY000 Message: The partition info in the frm file is not consistent with what can be written into the frm file + public final static int ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491; //SQLSTATE: HY000 Message: The %s function returns the wrong type + public final static int ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492; //SQLSTATE: HY000 Message: For %s partitions each partition must be defined + public final static int ER_RANGE_NOT_INCREASING_ERROR = 1493; //SQLSTATE: HY000 Message: VALUES LESS THAN value must be strictly increasing for each partition + public final static int ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494; //SQLSTATE: HY000 Message: VALUES value must be of same type as partition function + public final static int ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495; //SQLSTATE: HY000 Message: Multiple definition of same constant in list partitioning + public final static int ER_PARTITION_ENTRY_ERROR = 1496; //SQLSTATE: HY000 Message: Partitioning can not be used stand-alone in query + public final static int ER_MIX_HANDLER_ERROR = 1497; //SQLSTATE: HY000 Message: The mix of handlers in the partitions is not allowed in this version of MySQL + public final static int ER_PARTITION_NOT_DEFINED_ERROR = 1498; //SQLSTATE: HY000 Message: For the partitioned engine it is necessary to define all %s + public final static int ER_TOO_MANY_PARTITIONS_ERROR = 1499; //SQLSTATE: HY000 Message: Too many partitions (including subpartitions) were defined + public final static int ER_SUBPARTITION_ERROR = 1500; //SQLSTATE: HY000 Message: It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning + public final static int ER_CANT_CREATE_HANDLER_FILE = 1501; //SQLSTATE: HY000 Message: Failed to create specific handler file + public final static int ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502; //SQLSTATE: HY000 Message: A BLOB field is not allowed in partition function + public final static int ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503; //SQLSTATE: HY000 Message: A %s must include all columns in the table's partitioning function + public final static int ER_NO_PARTS_ERROR = 1504; //SQLSTATE: HY000 Message: Number of %s = 0 is not an allowed value + public final static int ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505; //SQLSTATE: HY000 Message: Partition management on a not partitioned table is not possible + public final static int ER_FOREIGN_KEY_ON_PARTITIONED = 1506; //SQLSTATE: HY000 Message: Foreign key clause is not yet supported in conjunction with partitioning + public final static int ER_DROP_PARTITION_NON_EXISTENT = 1507; //SQLSTATE: HY000 Message: Error in list of partitions to %s + public final static int ER_DROP_LAST_PARTITION = 1508; //SQLSTATE: HY000 Message: Cannot remove all partitions, use DROP TABLE instead + public final static int ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509; //SQLSTATE: HY000 Message: COALESCE PARTITION can only be used on HASH/KEY partitions + public final static int ER_REORG_HASH_ONLY_ON_SAME_NO = 1510; //SQLSTATE: HY000 Message: REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers + public final static int ER_REORG_NO_PARAM_ERROR = 1511; //SQLSTATE: HY000 Message: REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs + public final static int ER_ONLY_ON_RANGE_LIST_PARTITION = 1512; //SQLSTATE: HY000 Message: %s PARTITION can only be used on RANGE/LIST partitions + public final static int ER_ADD_PARTITION_SUBPART_ERROR = 1513; //SQLSTATE: HY000 Message: Trying to Add partition(s) with wrong number of subpartitions + public final static int ER_ADD_PARTITION_NO_NEW_PARTITION = 1514; //SQLSTATE: HY000 Message: At least one partition must be added + public final static int ER_COALESCE_PARTITION_NO_PARTITION = 1515; //SQLSTATE: HY000 Message: At least one partition must be coalesced + public final static int ER_REORG_PARTITION_NOT_EXIST = 1516; //SQLSTATE: HY000 Message: More partitions to reorganize than there are partitions + public final static int ER_SAME_NAME_PARTITION = 1517; //SQLSTATE: HY000 Message: Duplicate partition name %s + public final static int ER_NO_BINLOG_ERROR = 1518; //SQLSTATE: HY000 Message: It is not allowed to shut off binlog on this command + public final static int ER_CONSECUTIVE_REORG_PARTITIONS = 1519; //SQLSTATE: HY000 Message: When reorganizing a set of partitions they must be in consecutive order + public final static int ER_REORG_OUTSIDE_RANGE = 1520; //SQLSTATE: HY000 Message: Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range + public final static int ER_PARTITION_FUNCTION_FAILURE = 1521; //SQLSTATE: HY000 Message: Partition function not supported in this version for this handler + public final static int ER_PART_STATE_ERROR = 1522; //SQLSTATE: HY000 Message: Partition state cannot be defined from CREATE/ALTER TABLE + public final static int ER_LIMITED_PART_RANGE = 1523; //SQLSTATE: HY000 Message: The %s handler only supports 32 bit integers in VALUES + public final static int ER_PLUGIN_IS_NOT_LOADED = 1524; //SQLSTATE: HY000 Message: Plugin '%s' is not loaded + public final static int ER_WRONG_VALUE = 1525; //SQLSTATE: HY000 Message: Incorrect %s value: '%s' + public final static int ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526; //SQLSTATE: HY000 Message: Table has no partition for value %s + public final static int ER_FILEGROUP_OPTION_ONLY_ONCE = 1527; //SQLSTATE: HY000 Message: It is not allowed to specify %s more than once + public final static int ER_CREATE_FILEGROUP_FAILED = 1528; //SQLSTATE: HY000 Message: Failed to create %s + public final static int ER_DROP_FILEGROUP_FAILED = 1529; //SQLSTATE: HY000 Message: Failed to drop %s + public final static int ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530; //SQLSTATE: HY000 Message: The handler doesn't support autoextend of tablespaces + public final static int ER_WRONG_SIZE_NUMBER = 1531; //SQLSTATE: HY000 Message: A size parameter was incorrectly specified, either number or on the form 10M + public final static int ER_SIZE_OVERFLOW_ERROR = 1532; //SQLSTATE: HY000 Message: The size number was correct but we don't allow the digit part to be more than 2 billion + public final static int ER_ALTER_FILEGROUP_FAILED = 1533; //SQLSTATE: HY000 Message: Failed to alter: %s + public final static int ER_BINLOG_ROW_LOGGING_FAILED = 1534; //SQLSTATE: HY000 Message: Writing one row to the row-based binary log failed + public final static int ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535; //SQLSTATE: HY000 Message: Table definition on source and replica does not match: %s + public final static int ER_BINLOG_ROW_RBR_TO_SBR = 1536; //SQLSTATE: HY000 Message: Replica running with --log-replica-updates must use row-based binary main.logging to be able to replicate row-based binary log events + public final static int ER_EVENT_ALREADY_EXISTS = 1537; //SQLSTATE: HY000 Message: Event '%s' already exists + public final static int ER_EVENT_STORE_FAILED = 1538; //SQLSTATE: HY000 Message: Failed to store event %s. Error code %d from storage engine. + public final static int ER_EVENT_DOES_NOT_EXIST = 1539; //SQLSTATE: HY000 Message: Unknown event '%s' + public final static int ER_EVENT_CANT_ALTER = 1540; //SQLSTATE: HY000 Message: Failed to alter event '%s' + public final static int ER_EVENT_DROP_FAILED = 1541; //SQLSTATE: HY000 Message: Failed to drop %s + public final static int ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542; //SQLSTATE: HY000 Message: INTERVAL is either not positive or too big + public final static int ER_EVENT_ENDS_BEFORE_STARTS = 1543; //SQLSTATE: HY000 Message: ENDS is either invalid or before STARTS + public final static int ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544; //SQLSTATE: HY000 Message: Event execution time is in the past. Event has been disabled + public final static int ER_EVENT_OPEN_TABLE_FAILED = 1545; //SQLSTATE: HY000 Message: Failed to open mysql.event + public final static int ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546; //SQLSTATE: HY000 Message: No datetime expression provided + public final static int ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547; //SQLSTATE: HY000 Message: Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted + public final static int ER_CANNOT_LOAD_FROM_TABLE = 1548; //SQLSTATE: HY000 Message: Cannot load from mysql.%s. The table is probably corrupted + public final static int ER_EVENT_CANNOT_DELETE = 1549; //SQLSTATE: HY000 Message: Failed to delete the event from mysql.event + public final static int ER_EVENT_COMPILE_ERROR = 1550; //SQLSTATE: HY000 Message: Error during compilation of event's body + public final static int ER_EVENT_SAME_NAME = 1551; //SQLSTATE: HY000 Message: Same old and new event name + public final static int ER_EVENT_DATA_TOO_LONG = 1552; //SQLSTATE: HY000 Message: Data for column '%s' too long + public final static int ER_DROP_INDEX_FK = 1553; //SQLSTATE: HY000 Message: Cannot drop index '%s': needed in a foreign key constraint + public final static int ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554; //SQLSTATE: HY000 Message: The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead + public final static int ER_CANT_WRITE_LOCK_LOG_TABLE = 1555; //SQLSTATE: HY000 Message: You can't write-lock a log table. Only read access is possible + public final static int ER_CANT_LOCK_LOG_TABLE = 1556; //SQLSTATE: HY000 Message: You can't use locks with log tables. + public final static int ER_FOREIGN_DUPLICATE_KEY = 1557; //SQLSTATE: 23000 Message: Upholding foreign key constraints for table '%s', entry '%s', key %d would lead to a duplicate entry + public final static int ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558; //SQLSTATE: HY000 Message: Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error. + public final static int ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559; //SQLSTATE: HY000 Message: Cannot switch out of the row-based binary log format when the session has open temporary tables + public final static int ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560; //SQLSTATE: HY000 Message: Cannot change the binary main.logging format inside a stored function or trigger + public final static int ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561; //SQLSTATE: HY000 Message: The NDB cluster engine does not support changing the binlog format on the fly yet + public final static int ER_PARTITION_NO_TEMPORARY = 1562; //SQLSTATE: HY000 Message: Cannot create temporary table with partitions + public final static int ER_PARTITION_CONST_DOMAIN_ERROR = 1563; //SQLSTATE: HY000 Message: Partition constant is out of partition function domain + public final static int ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564; //SQLSTATE: HY000 Message: This partition function is not allowed + public final static int ER_DDL_LOG_ERROR = 1565; //SQLSTATE: HY000 Message: Error in DDL log + public final static int ER_NULL_IN_VALUES_LESS_THAN = 1566; //SQLSTATE: HY000 Message: Not allowed to use NULL value in VALUES LESS THAN + public final static int ER_WRONG_PARTITION_NAME = 1567; //SQLSTATE: HY000 Message: Incorrect partition name + public final static int ER_CANT_CHANGE_TX_ISOLATION = 1568; //SQLSTATE: 25001 Message: Transaction isolation level can't be changed while a transaction is in progress + public final static int ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569; //SQLSTATE: HY000 Message: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '%s' for key '%s' + public final static int ER_EVENT_MODIFY_QUEUE_ERROR = 1570; //SQLSTATE: HY000 Message: Internal scheduler error %d + public final static int ER_EVENT_SET_VAR_ERROR = 1571; //SQLSTATE: HY000 Message: Error during starting/stopping of the scheduler. Error code %u + public final static int ER_PARTITION_MERGE_ERROR = 1572; //SQLSTATE: HY000 Message: Engine cannot be used in partitioned tables + public final static int ER_CANT_ACTIVATE_LOG = 1573; //SQLSTATE: HY000 Message: Cannot activate '%s' log + public final static int ER_RBR_NOT_AVAILABLE = 1574; //SQLSTATE: HY000 Message: The server was not built with row-based replication + public final static int ER_BASE64_DECODE_ERROR = 1575; //SQLSTATE: HY000 Message: Decoding of base64 string failed + public final static int ER_EVENT_RECURSION_FORBIDDEN = 1576; //SQLSTATE: HY000 Message: Recursion of EVENT DDL statements is forbidden when body is present + public final static int ER_EVENTS_DB_ERROR = 1577; //SQLSTATE: HY000 Message: Cannot proceed because system tables used by Event Scheduler were found damaged at server start + public final static int ER_ONLY_INTEGERS_ALLOWED = 1578; //SQLSTATE: HY000 Message: Only integers allowed as number here + public final static int ER_UNSUPORTED_LOG_ENGINE = 1579; //SQLSTATE: HY000 Message: This storage engine cannot be used for log tables" + public final static int ER_BAD_LOG_STATEMENT = 1580; //SQLSTATE: HY000 Message: You cannot '%s' a log table if main.logging is enabled + public final static int ER_CANT_RENAME_LOG_TABLE = 1581; //SQLSTATE: HY000 Message: Cannot rename '%s'. When main.logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s' + public final static int ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582; //SQLSTATE: 42000 Message: Incorrect parameter count in the call to native function '%s' + public final static int ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583; //SQLSTATE: 42000 Message: Incorrect parameters in the call to native function '%s' + public final static int ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584; //SQLSTATE: 42000 Message: Incorrect parameters in the call to stored function '%s' + public final static int ER_NATIVE_FCT_NAME_COLLISION = 1585; //SQLSTATE: HY000 Message: This function '%s' has the same name as a native function + public final static int ER_DUP_ENTRY_WITH_KEY_NAME = 1586; //SQLSTATE: 23000 Message: Duplicate entry '%s' for key '%s' + public final static int ER_BINLOG_PURGE_EMFILE = 1587; //SQLSTATE: HY000 Message: Too many files opened, please execute the command again + public final static int ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588; //SQLSTATE: HY000 Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation. + public final static int ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589; //SQLSTATE: HY000 Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation. + @Deprecated + public final static int ER_SLAVE_INCIDENT = 1590; + public final static int ER_REPLICA_INCIDENT = 1590; //SQLSTATE: HY000 Message: The incident %s occured on the source. Message: %s + public final static int ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591; //SQLSTATE: HY000 Message: Table has no partition for some existing values + public final static int ER_BINLOG_UNSAFE_STATEMENT = 1592; //SQLSTATE: HY000 Message: Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. %s + @Deprecated + public final static int ER_SLAVE_FATAL_ERROR = 1593; + public final static int ER_REPLICA_FATAL_ERROR = 1593; //SQLSTATE: HY000 Message: Fatal error: %s + @Deprecated + public final static int ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594; + public final static int ER_REPLICA_RELAY_LOG_READ_FAILURE = 1594; //SQLSTATE: HY000 Message: Relay log read failure: %s + @Deprecated + public final static int ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595; + public final static int ER_REPLICA_RELAY_LOG_WRITE_FAILURE = 1595; //SQLSTATE: HY000 Message: Relay log write failure: %s + @Deprecated + public final static int ER_SLAVE_CREATE_EVENT_FAILURE = 1596; + public final static int ER_REPLICA_CREATE_EVENT_FAILURE = 1596; //SQLSTATE: HY000 Message: Failed to create %s + @Deprecated + public final static int ER_SLAVE_MASTER_COM_FAILURE = 1597; + public final static int ER_REPLICA_SOURCE_COM_FAILURE = 1597; //SQLSTATE: HY000 Message: Source command %s failed: %s + public final static int ER_BINLOG_LOGGING_IMPOSSIBLE = 1598; //SQLSTATE: HY000 Message: Binary main.logging not possible. Message: %s + public final static int ER_VIEW_NO_CREATION_CTX = 1599; //SQLSTATE: HY000 Message: View `%s`.`%s` has no creation context + public final static int ER_VIEW_INVALID_CREATION_CTX = 1600; //SQLSTATE: HY000 Message: Creation context of view `%s`.`%s' is invalid + public final static int ER_SR_INVALID_CREATION_CTX = 1601; //SQLSTATE: HY000 Message: Creation context of stored routine `%s`.`%s` is invalid + public final static int ER_TRG_CORRUPTED_FILE = 1602; //SQLSTATE: HY000 Message: Corrupted TRG file for table `%s`.`%s` + public final static int ER_TRG_NO_CREATION_CTX = 1603; //SQLSTATE: HY000 Message: Triggers for table `%s`.`%s` have no creation context + public final static int ER_TRG_INVALID_CREATION_CTX = 1604; //SQLSTATE: HY000 Message: Trigger creation context of table `%s`.`%s` is invalid + public final static int ER_EVENT_INVALID_CREATION_CTX = 1605; //SQLSTATE: HY000 Message: Creation context of event `%s`.`%s` is invalid + public final static int ER_TRG_CANT_OPEN_TABLE = 1606; //SQLSTATE: HY000 Message: Cannot open table for trigger `%s`.`%s` + public final static int ER_CANT_CREATE_SROUTINE = 1607; //SQLSTATE: HY000 Message: Cannot create stored routine `%s`. Check warnings + public final static int ER_NEVER_USED = 1608; //SQLSTATE: HY000 Message: Ambiguous replica modes combination. %s + public final static int ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609; //SQLSTATE: HY000 Message: The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement. + @Deprecated + public final static int ER_SLAVE_CORRUPT_EVENT = 1610; + public final static int ER_REPLICA_CORRUPT_EVENT = 1610; //SQLSTATE: HY000 Message: Corrupted replication event was detected + public final static int ER_LOAD_DATA_INVALID_COLUMN = 1611; //SQLSTATE: HY000 Message: Invalid column reference (%s) in LOAD DATA + public final static int ER_LOG_PURGE_NO_FILE = 1612; //SQLSTATE: HY000 Message: Being purged log %s was not found + public final static int ER_XA_RBTIMEOUT = 1613; //SQLSTATE: XA106 Message: XA_RBTIMEOUT: Transaction branch was rolled back: took too long + public final static int ER_XA_RBDEADLOCK = 1614; //SQLSTATE: XA102 Message: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected + public final static int ER_NEED_REPREPARE = 1615; //SQLSTATE: HY000 Message: Prepared statement needs to be re-prepared + public final static int ER_DELAYED_NOT_SUPPORTED = 1616; //SQLSTATE: HY000 Message: DELAYED option not supported for table '%s' + @Deprecated + public final static int WARN_NO_MASTER_INFO = 1617; + public final static int WARN_NO_SOURCE_INFO = 1617; //SQLSTATE: HY000 Message: The source info structure does not exist + public final static int WARN_OPTION_IGNORED = 1618; //SQLSTATE: HY000 Message: <%s> option ignored + public final static int WARN_PLUGIN_DELETE_BUILTIN = 1619; //SQLSTATE: HY000 Message: Built-in plugins cannot be deleted + public final static int WARN_PLUGIN_BUSY = 1620; //SQLSTATE: HY000 Message: Plugin is busy and will be uninstalled on shutdown + public final static int ER_VARIABLE_IS_READONLY = 1621; //SQLSTATE: HY000 Message: %s variable '%s' is read-only. Use SET %s to assign the value + public final static int ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622; //SQLSTATE: HY000 Message: Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted + @Deprecated + public final static int ER_SLAVE_HEARTBEAT_FAILURE = 1623; + public final static int ER_REPLICA_HEARTBEAT_FAILURE = 1623; //SQLSTATE: HY000 Message: Unexpected source's heartbeat data: %s + @Deprecated + public final static int ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624; + public final static int ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624; //SQLSTATE: HY000 Message: The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds). + public final static int ER_NDB_REPLICATION_SCHEMA_ERROR = 1625; //SQLSTATE: HY000 Message: Bad schema for mysql.ndb_replication table. Message: %s + public final static int ER_CONFLICT_FN_PARSE_ERROR = 1626; //SQLSTATE: HY000 Message: Error in parsing conflict function. Message: %s + public final static int ER_EXCEPTIONS_WRITE_ERROR = 1627; //SQLSTATE: HY000 Message: Write to exceptions table failed. Message: %s" + public final static int ER_TOO_LONG_TABLE_COMMENT = 1628; //SQLSTATE: HY000 Message: Comment for table '%s' is too long (max = %lu) + public final static int ER_TOO_LONG_FIELD_COMMENT = 1629; //SQLSTATE: HY000 Message: Comment for field '%s' is too long (max = %lu) + public final static int ER_FUNC_INEXISTENT_NAME_COLLISION = 1630; //SQLSTATE: 42000 Message: FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual + public final static int ER_DATABASE_NAME = 1631; //SQLSTATE: HY000 Message: Database + public final static int ER_TABLE_NAME = 1632; //SQLSTATE: HY000 Message: Table + public final static int ER_PARTITION_NAME = 1633; //SQLSTATE: HY000 Message: Partition + public final static int ER_SUBPARTITION_NAME = 1634; //SQLSTATE: HY000 Message: Subpartition + public final static int ER_TEMPORARY_NAME = 1635; //SQLSTATE: HY000 Message: Temporary + public final static int ER_RENAMED_NAME = 1636; //SQLSTATE: HY000 Message: Renamed + public final static int ER_TOO_MANY_CONCURRENT_TRXS = 1637; //SQLSTATE: HY000 Message: Too many active concurrent transactions + public final static int WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638; //SQLSTATE: HY000 Message: Non-ASCII separator arguments are not fully supported + public final static int ER_DEBUG_SYNC_TIMEOUT = 1639; //SQLSTATE: HY000 Message: debug sync point wait timed out + public final static int ER_DEBUG_SYNC_HIT_LIMIT = 1640; //SQLSTATE: HY000 Message: debug sync point hit limit reached + public final static int ER_DUP_SIGNAL_SET = 1641; //SQLSTATE: 42000 Message: Duplicate condition information item '%s' + public final static int ER_SIGNAL_WARN = 1642; //SQLSTATE: 01000 Message: Unhandled user-defined warning condition + public final static int ER_SIGNAL_NOT_FOUND = 1643; //SQLSTATE: 02000 Message: Unhandled user-defined not found condition + public final static int ER_SIGNAL_EXCEPTION = 1644; //SQLSTATE: HY000 Message: Unhandled user-defined exception condition + public final static int ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645; //SQLSTATE: 0K000 Message: RESIGNAL when handler not active + public final static int ER_SIGNAL_BAD_CONDITION_TYPE = 1646; //SQLSTATE: HY000 Message: SIGNAL/RESIGNAL can only use a CONDITION defined with; //SQLSTATE + public final static int WARN_COND_ITEM_TRUNCATED = 1647; //SQLSTATE: HY000 Message: Data truncated for condition item '%s' + public final static int ER_COND_ITEM_TOO_LONG = 1648; //SQLSTATE: HY000 Message: Data too long for condition item '%s' + public final static int ER_UNKNOWN_LOCALE = 1649; //SQLSTATE: HY000 Message: Unknown locale: '%s' + @Deprecated + public final static int ER_SLAVE_IGNORE_SERVER_IDS = 1650; + public final static int ER_REPLICA_IGNORE_SERVER_IDS = 1650; //SQLSTATE: HY000 Message: The requested server id %d clashes with the replica startup option --replicate-same-server-id + public final static int ER_QUERY_CACHE_DISABLED = 1651; //SQLSTATE: HY000 Message: Query cache is disabled; restart the server with query_cache_type=1 to enable it + public final static int ER_SAME_NAME_PARTITION_FIELD = 1652; //SQLSTATE: HY000 Message: Duplicate partition field name '%s' + public final static int ER_PARTITION_COLUMN_LIST_ERROR = 1653; //SQLSTATE: HY000 Message: Inconsistency in usage of column lists for partitioning + public final static int ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654; //SQLSTATE: HY000 Message: Partition column values of incorrect type + public final static int ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655; //SQLSTATE: HY000 Message: Too many fields in '%s' + public final static int ER_MAXVALUE_IN_VALUES_IN = 1656; //SQLSTATE: HY000 Message: Cannot use MAXVALUE as value in VALUES IN + public final static int ER_TOO_MANY_VALUES_ERROR = 1657; //SQLSTATE: HY000 Message: Cannot have more than one value for this type of %s partitioning + public final static int ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658; //SQLSTATE: HY000 Message: Row expressions in VALUES IN only allowed for multi-field column partitioning + public final static int ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659; //SQLSTATE: HY000 Message: Field '%s' is of a not allowed type for this type of partitioning + public final static int ER_PARTITION_FIELDS_TOO_LONG = 1660; //SQLSTATE: HY000 Message: The total length of the partitioning fields is too large + public final static int ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved. + public final static int ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = ROW and at least one table uses a storage engine limited to statement-based main.logging. + public final static int ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based main.logging, and BINLOG_FORMAT = MIXED. %s + public final static int ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based main.logging. + public final static int ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based main.logging.%s + public final static int ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT. + public final static int ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-main.logging. + public final static int ER_BINLOG_UNSAFE_LIMIT = 1668; //SQLSTATE: HY000 Message: The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. + public final static int ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669; //SQLSTATE: HY000 Message: The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted. + public final static int ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670; //SQLSTATE: HY000 Message: The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on replicas. + public final static int ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671; //SQLSTATE: HY000 Message: Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly. + public final static int ER_BINLOG_UNSAFE_UDF = 1672; //SQLSTATE: HY000 Message: Statement is unsafe because it uses a UDF which may not return the same value on the replica. + public final static int ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673; //SQLSTATE: HY000 Message: Statement is unsafe because it uses a system variable that may have a different value on the replica. + public final static int ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674; //SQLSTATE: HY000 Message: Statement is unsafe because it uses a system function that may return a different value on the replica. + public final static int ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675; //SQLSTATE: HY000 Message: Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction. + public final static int ER_MESSAGE_AND_STATEMENT = 1676; //SQLSTATE: HY000 Message: %s Statement: %s + @Deprecated + public final static int ER_SLAVE_CONVERSION_FAILED = 1677; + public final static int ER_REPLICA_CONVERSION_FAILED = 1677; //SQLSTATE: HY000 Message: Column %d of table '%s.%s' cannot be converted from type '%s' to type '%s' + @Deprecated + public final static int ER_SLAVE_CANT_CREATE_CONVERSION = 1678; + public final static int ER_REPLICA_CANT_CREATE_CONVERSION = 1678; //SQLSTATE: HY000 Message: Can't create conversion table for table '%s.%s' + public final static int ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679; //SQLSTATE: HY000 Message: Cannot modify @@session.binlog_format inside a transaction + public final static int ER_PATH_LENGTH = 1680; //SQLSTATE: HY000 Message: The path specified for %s is too long. + public final static int ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681; //SQLSTATE: HY000 Message: The syntax '%s' is deprecated and will be removed in MySQL %s. + public final static int ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682; //SQLSTATE: HY000 Message: Native table '%s'.'%s' has the wrong structure + public final static int ER_WRONG_PERFSCHEMA_USAGE = 1683; //SQLSTATE: HY000 Message: Invalid performance_schema usage. + public final static int ER_WARN_I_S_SKIPPED_TABLE = 1684; //SQLSTATE: HY000 Message: Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement + public final static int ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685; //SQLSTATE: HY000 Message: Cannot modify @@session.binlog_direct_non_transactional_updates inside a transaction + public final static int ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686; //SQLSTATE: HY000 Message: Cannot change the binlog direct flag inside a stored function or trigger + public final static int ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687; //SQLSTATE: 42000 Message: A SPATIAL index may only contain a geometrical type column + public final static int ER_TOO_LONG_INDEX_COMMENT = 1688; //SQLSTATE: HY000 Message: Comment for index '%s' is too long (max = %lu) + public final static int ER_LOCK_ABORTED = 1689; //SQLSTATE: HY000 Message: Wait on a lock was aborted due to a pending exclusive lock + public final static int ER_DATA_OUT_OF_RANGE = 1690; //SQLSTATE: 22003 Message: %s value is out of range in '%s' + public final static int ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691; //SQLSTATE: HY000 Message: A variable of a non-integer type in LIMIT clause + public final static int ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692; //SQLSTATE: HY000 Message: Mixing self-main.logging and non-self-main.logging engines in a statement is unsafe. + public final static int ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693; //SQLSTATE: HY000 Message: Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them. + public final static int ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694; //SQLSTATE: HY000 Message: Cannot modify @@session.sql_log_bin inside a transaction + public final static int ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695; //SQLSTATE: HY000 Message: Cannot change the sql_log_bin inside a stored function or trigger + public final static int ER_FAILED_READ_FROM_PAR_FILE = 1696; //SQLSTATE: HY000 Message: Failed to read from the .par file + public final static int ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697; //SQLSTATE: HY000 Message: VALUES value for partition '%s' must have type INT + public final static int ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698; //SQLSTATE: 28000 Message: Access denied for user '%s'@'%s' + public final static int ER_SET_PASSWORD_AUTH_PLUGIN = 1699; //SQLSTATE: HY000 Message: SET PASSWORD has no significance for users authenticating via plugins + public final static int ER_GRANT_PLUGIN_USER_EXISTS = 1700; //SQLSTATE: HY000 Message: GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists + public final static int ER_TRUNCATE_ILLEGAL_FK = 1701; //SQLSTATE: 42000 Message: Cannot truncate a table referenced in a foreign key constraint (%s) + public final static int ER_PLUGIN_IS_PERMANENT = 1702; //SQLSTATE: HY000 Message: Plugin '%s' is force_plus_permanent and can not be unloaded + @Deprecated + public final static int ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703; + public final static int ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703; //SQLSTATE: HY000 Message: The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled. + @Deprecated + public final static int ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704; + public final static int ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704; //SQLSTATE: HY000 Message: The requested value for the heartbeat period exceeds the value of `replica_net_timeout' seconds. A sensible value for the period should be less than the timeout. + public final static int ER_STMT_CACHE_FULL = 1705; //SQLSTATE: HY000 Message: Multi-row statements required more than 'max_binlog_stmt_cache_size' bytes of storage; increase this mysqld variable and try again + + public final static int ER_MULTI_UPDATE_KEY_CONFLICT = 1706; //SQLSTATE: HY000 Message: Primary key/partition key update is not allowed since the table is updated both as '%s' and '%s'. + public final static int ER_TABLE_NEEDS_REBUILD = 1707; //SQLSTATE: HY000 Message: Table rebuild required. Please do "ALTER TABLE `%s` FORCE" or dump/reload to fix it! + public final static int WARN_OPTION_BELOW_LIMIT = 1708; //SQLSTATE: HY000 Message: The value of '%s' should be no less than the value of '%s' + public final static int ER_INDEX_COLUMN_TOO_LONG = 1709; //SQLSTATE: HY000 Message: Index column size too large. The maximum column size is %lu bytes. + public final static int ER_ERROR_IN_TRIGGER_BODY = 1710; //SQLSTATE: HY000 Message: Trigger '%s' has an error in its body: '%s' + public final static int ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711; //SQLSTATE: HY000 Message: Unknown trigger has an error in its body: '%s' + public final static int ER_INDEX_CORRUPT = 1712; //SQLSTATE: HY000 Message: Index %s is corrupted + public final static int ER_UNDO_RECORD_TOO_BIG = 1713; //SQLSTATE: HY000 Message: Undo log record is too big. + public final static int ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714; //SQLSTATE: HY000 Message: INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715; //SQLSTATE: HY000 Message: INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716; //SQLSTATE: HY000 Message: REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717; //SQLSTATE: HY000 Message: CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718; //SQLSTATE: HY000 Message: CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719; //SQLSTATE: HY000 Message: UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on source and the replica. + public final static int ER_PLUGIN_NO_UNINSTALL = 1720; //SQLSTATE: HY000 Message: Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it. + public final static int ER_PLUGIN_NO_INSTALL = 1721; //SQLSTATE: HY000 Message: Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it. + public final static int ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722; //SQLSTATE: HY000 Message: Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723; //SQLSTATE: HY000 Message: CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on source and the replica. + public final static int ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724; //SQLSTATE: HY000 Message: INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe + public final static int ER_TABLE_IN_FK_CHECK = 1725; //SQLSTATE: HY000 Message: Table is being used in foreign key check. + public final static int ER_UNSUPPORTED_ENGINE = 1726; //SQLSTATE: HY000 Message: Storage engine '%s' does not support system tables. [%s.%s] + public final static int ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727; //SQLSTATE: HY000 Message: INSERT into autoincrement field which is not the first part in the composed primary key is unsafe. + public final static int ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728; //SQLSTATE: HY000 Message: Cannot load from %s.%s. The table is probably corrupted + @Deprecated + public final static int ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729; + public final static int ER_SOURCE_DELAY_VALUE_OUT_OF_RANGE = 1729; //SQLSTATE: HY000 Message: The requested value %u for the source delay exceeds the maximum %u + public final static int ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730; //SQLSTATE: HY000 Message: Only Format_description_log_event and row events are allowed in BINLOG statements (but %s was provided) + public final static int ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731; //SQLSTATE: HY000 Message: Non matching attribute '%s' between partition and table + public final static int ER_PARTITION_EXCHANGE_PART_TABLE = 1732; //SQLSTATE: HY000 Message: Table to exchange with partition is partitioned: '%s' + public final static int ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733; //SQLSTATE: HY000 Message: Table to exchange with partition is temporary: '%s' + public final static int ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734; //SQLSTATE: HY000 Message: Subpartitioned table, use subpartition instead of partition + public final static int ER_UNKNOWN_PARTITION = 1735; //SQLSTATE: HY000 Message: Unknown partition '%s' in table '%s' + public final static int ER_TABLES_DIFFERENT_METADATA = 1736; //SQLSTATE: HY000 Message: Tables have different definitions + public final static int ER_ROW_DOES_NOT_MATCH_PARTITION = 1737; //SQLSTATE: HY000 Message: Found a row that does not match the partition + public final static int ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738; //SQLSTATE: HY000 Message: Option binlog_cache_size (%lu) is greater than max_binlog_cache_size (%lu); setting binlog_cache_size equal to max_binlog_cache_size. + public final static int ER_WARN_INDEX_NOT_APPLICABLE = 1739; //SQLSTATE: HY000 Message: Cannot use %s access on index '%s' due to type or collation conversion on field '%s' + public final static int ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740; //SQLSTATE: HY000 Message: Table to exchange with partition has foreign key references: '%s' + public final static int ER_NO_SUCH_KEY_VALUE = 1741; //SQLSTATE: HY000 Message: Key value '%s' was not found in table '%s.%s' + public final static int ER_RPL_INFO_DATA_TOO_LONG = 1742; //SQLSTATE: HY000 Message: Data for column '%s' too long + public final static int ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743; //SQLSTATE: HY000 Message: Replication event checksum verification failed while reading from network. + public final static int ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744; //SQLSTATE: HY000 Message: Replication event checksum verification failed while reading from a log file. + public final static int ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745; //SQLSTATE: HY000 Message: Option binlog_stmt_cache_size (%lu) is greater than max_binlog_stmt_cache_size (%lu); setting binlog_stmt_cache_size equal to max_binlog_stmt_cache_size. + public final static int ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746; //SQLSTATE: HY000 Message: Can't update table '%s' while '%s' is being created. + public final static int ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747; //SQLSTATE: HY000 Message: PARTITION () clause on non partitioned table + public final static int ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748; //SQLSTATE: HY000 Message: Found a row not matching the given partition set + public final static int ER_NO_SUCH_PARTITION__UNUSED = 1749; //SQLSTATE: HY000 Message: partition '%s' doesn't exist + public final static int ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750; //SQLSTATE: HY000 Message: Failure while changing the type of replication repository: %s. + public final static int ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751; //SQLSTATE: HY000 Message: The creation of some temporary tables could not be rolled back. + public final static int ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752; //SQLSTATE: HY000 Message: Some temporary tables were dropped, but these operations could not be rolled back. + public final static int ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753; //SQLSTATE: HY000 Message: %s is not supported in multi-threaded replica mode. %s + public final static int ER_MTS_UPDATED_DBS_GREATER_MAX = 1754; //SQLSTATE: HY000 Message: The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata. + public final static int ER_MTS_CANT_PARALLEL = 1755; //SQLSTATE: HY000 Message: Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s. + public final static int ER_MTS_INCONSISTENT_DATA = 1756; //SQLSTATE: HY000 Message: %s + public final static int ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757; //SQLSTATE: HY000 Message: FULLTEXT index is not supported for partitioned tables. + public final static int ER_DA_INVALID_CONDITION_NUMBER = 1758; //SQLSTATE: 35000 Message: Invalid condition number + public final static int ER_INSECURE_PLAIN_TEXT = 1759; //SQLSTATE: HY000 Message: Sending passwords in plain text without SSL/TLS is extremely insecure. + @Deprecated + public final static int ER_INSECURE_CHANGE_MASTER = 1760; + public final static int ER_INSECURE_CHANGE_SOURCE = 1760; //SQLSTATE: HY000 Message: Storing MySQL user name or password information in the source.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives. + public final static int ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761; //SQLSTATE: 23000 Message: Foreign key constraint for table '%s', record '%s' would lead to a duplicate entry in table '%s', key '%s' + public final static int ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762; //SQLSTATE: 23000 Message: Foreign key constraint for table '%s', record '%s' would lead to a duplicate entry in a child table + @Deprecated + public final static int ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763; + public final static int ER_SQLTHREAD_WITH_SECURE_REPLICA = 1763; //SQLSTATE: HY000 Message: Setting authentication options is not possible when only the Replica SQL Thread is being started. + public final static int ER_TABLE_HAS_NO_FT = 1764; //SQLSTATE: HY000 Message: The table does not have FULLTEXT index to support this query + public final static int ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765; //SQLSTATE: HY000 Message: The system variable %s cannot be set in stored functions or triggers. + public final static int ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766; //SQLSTATE: HY000 Message: The system variable %s cannot be set when there is an ongoing transaction. + public final static int ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767; //SQLSTATE: HY000 Message: The system variable @@SESSION.GTID_NEXT has the value %s, which is not listed in @@SESSION.GTID_NEXT_LIST. + public final static int ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION_WHEN_GTID_NEXT_LIST_IS_NULL = 1768; //SQLSTATE: HY000 Message: When @@SESSION.GTID_NEXT_LIST == NULL, the system variable @@SESSION.GTID_NEXT cannot change inside a transaction. + public final static int ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769; //SQLSTATE: HY000 Message: The statement 'SET %s' cannot invoke a stored function. + public final static int ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770; //SQLSTATE: HY000 Message: The system variable @@SESSION.GTID_NEXT cannot be 'AUTOMATIC' when @@SESSION.GTID_NEXT_LIST is non-NULL. + public final static int ER_SKIPPING_LOGGED_TRANSACTION = 1771; //SQLSTATE: HY000 Message: Skipping transaction %s because it has already been executed and logged. + public final static int ER_MALFORMED_GTID_SET_SPECIFICATION = 1772; //SQLSTATE: HY000 Message: Malformed GTID set specification '%s'. + public final static int ER_MALFORMED_GTID_SET_ENCODING = 1773; //SQLSTATE: HY000 Message: Malformed GTID set encoding. + public final static int ER_MALFORMED_GTID_SPECIFICATION = 1774; //SQLSTATE: HY000 Message: Malformed GTID specification '%s'. + public final static int ER_GNO_EXHAUSTED = 1775; //SQLSTATE: HY000 Message: Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new server_uuid. + @Deprecated + public final static int ER_BAD_SLAVE_AUTO_POSITION = 1776; + public final static int ER_BAD_REPLICA_AUTO_POSITION = 1776; //SQLSTATE: HY000 Message: Parameters SOURCE_LOG_FILE, SOURCE_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when SOURCE_AUTO_POSITION is active. + public final static int ER_AUTO_POSITION_REQUIRES_GTID_MODE_ON = 1777; //SQLSTATE: HY000 Message: CHANGE SOURCE TO SOURCE_AUTO_POSITION = 1 can only be executed when GTID_MODE = ON. + public final static int ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778; //SQLSTATE: HY000 Message: Cannot execute statements with implicit commit inside a transaction when GTID_NEXT != AUTOMATIC or GTID_NEXT_LIST != NULL. + public final static int ER_GTID_MODE_2_OR_3_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779; //SQLSTATE: HY000 Message: GTID_MODE = ON or GTID_MODE = UPGRADE_STEP_2 requires ENFORCE_GTID_CONSISTENCY = 1. + public final static int ER_GTID_MODE_REQUIRES_BINLOG = 1780; //SQLSTATE: HY000 Message: GTID_MODE = ON or UPGRADE_STEP_1 or UPGRADE_STEP_2 requires --log-bin and --log-replica-updates. + public final static int ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781; //SQLSTATE: HY000 Message: GTID_NEXT cannot be set to UUID:NUMBER when GTID_MODE = OFF. + public final static int ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782; //SQLSTATE: HY000 Message: GTID_NEXT cannot be set to ANONYMOUS when GTID_MODE = ON. + public final static int ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783; //SQLSTATE: HY000 Message: GTID_NEXT_LIST cannot be set to a non-NULL value when GTID_MODE = OFF. + public final static int ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784; //SQLSTATE: HY000 Message: Found a Gtid_log_event or Previous_gtids_log_event when GTID_MODE = OFF. + public final static int ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785; //SQLSTATE: HY000 Message: When ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables. + public final static int ER_GTID_UNSAFE_CREATE_SELECT = 1786; //SQLSTATE: HY000 Message: CREATE TABLE ... SELECT is forbidden when ENFORCE_GTID_CONSISTENCY = 1. + public final static int ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787; //SQLSTATE: HY000 Message: When ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1. + public final static int ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788; //SQLSTATE: HY000 Message: The value of GTID_MODE can only change one step at a time: OFF <-> UPGRADE_STEP_1 <-> UPGRADE_STEP_2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions. + @Deprecated + public final static int ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789; + public final static int ER_SOURCE_HAS_PURGED_REQUIRED_GTIDS = 1789; //SQLSTATE: HY000 Message: The replica is connecting using CHANGE SOURCE TO SOURCE_AUTO_POSITION = 1, but the source has purged binary logs containing GTIDs that the replica requires. + public final static int ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790; //SQLSTATE: HY000 Message: GTID_NEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK. + public final static int ER_UNKNOWN_EXPLAIN_FORMAT = 1791; //SQLSTATE: HY000 Message: Unknown EXPLAIN format name: '%s' + public final static int ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792; //SQLSTATE: 25006 Message: Cannot execute statement in a READ ONLY transaction. + public final static int ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793; //SQLSTATE: HY000 Message: Comment for table partition '%s' is too long (max = %lu) + @Deprecated + public final static int ER_SLAVE_CONFIGURATION = 1794; + public final static int ER_REPLICA_CONFIGURATION = 1794; //SQLSTATE: HY000 Message: Replica is not configured or failed to initialize properly. You must at least set --server-id to enable either a source or a replica. Additional error messages can be found in the MySQL error log. + public final static int ER_INNODB_FT_LIMIT = 1795; //SQLSTATE: HY000 Message: InnoDB presently supports one FULLTEXT index creation at a time + public final static int ER_INNODB_NO_FT_TEMP_TABLE = 1796; //SQLSTATE: HY000 Message: Cannot create FULLTEXT index on temporary InnoDB table + public final static int ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797; //SQLSTATE: HY000 Message: Column '%s' is of wrong type for an InnoDB FULLTEXT index + public final static int ER_INNODB_FT_WRONG_DOCID_INDEX = 1798; //SQLSTATE: HY000 Message: Index '%s' is of wrong type for an InnoDB FULLTEXT index + public final static int ER_INNODB_ONLINE_LOG_TOO_BIG = 1799; //SQLSTATE: HY000 Message: Creating index '%s' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again. + public final static int ER_UNKNOWN_ALTER_ALGORITHM = 1800; //SQLSTATE: HY000 Message: Unknown ALGORITHM '%s' + public final static int ER_UNKNOWN_ALTER_LOCK = 1801; //SQLSTATE: HY000 Message: Unknown LOCK type '%s' + @Deprecated + public final static int ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802; + public final static int ER_MTS_CHANGE_SOURCE_CANT_RUN_WITH_GAPS = 1802; //SQLSTATE: HY000 Message: CHANGE SOURCE cannot be executed when the replica was stopped with an error or killed in MTS mode. Consider using RESET REPLICA or START REPLICA UNTIL. + public final static int ER_MTS_RECOVERY_FAILURE = 1803; //SQLSTATE: HY000 Message: Cannot recover after REPLICA errored out in parallel execution mode. Additional error messages can be found in the MySQL error log. + public final static int ER_MTS_RESET_WORKERS = 1804; //SQLSTATE: HY000 Message: Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log. + public final static int ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805; //SQLSTATE: HY000 Message: Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted + @Deprecated + public final static int ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806; + public final static int ER_REPLICA_SILENT_RETRY_TRANSACTION = 1806; //SQLSTATE: HY000 Message: Replica must silently retry current transaction + public final static int ER_DISCARD_FK_CHECKS_RUNNING = 1807; //SQLSTATE: HY000 Message: There is a foreign key check running on table '%s'. Cannot discard the table. + public final static int ER_TABLE_SCHEMA_MISMATCH = 1808; //SQLSTATE: HY000 Message: Schema mismatch (%s) + public final static int ER_TABLE_IN_SYSTEM_TABLESPACE = 1809; //SQLSTATE: HY000 Message: Table '%s' in system tablespace + public final static int ER_IO_READ_ERROR = 1810; //SQLSTATE: HY000 Message: IO Read error: (%lu, %s) %s + public final static int ER_IO_WRITE_ERROR = 1811; //SQLSTATE: HY000 Message: IO Write error: (%lu, %s) %s + public final static int ER_TABLESPACE_MISSING = 1812; //SQLSTATE: HY000 Message: Tablespace is missing for table '%s' + public final static int ER_TABLESPACE_EXISTS = 1813; //SQLSTATE: HY000 Message: Tablespace for table '%s' exists. Please DISCARD the tablespace before IMPORT. + public final static int ER_TABLESPACE_DISCARDED = 1814; //SQLSTATE: HY000 Message: Tablespace has been discarded for table '%s' + public final static int ER_INTERNAL_ERROR = 1815; //SQLSTATE: HY000 Message: Internal error: %s + public final static int ER_INNODB_IMPORT_ERROR = 1816; //SQLSTATE: HY000 Message: ALTER TABLE '%s' IMPORT TABLESPACE failed with error %lu : '%s' + public final static int ER_INNODB_INDEX_CORRUPT = 1817; //SQLSTATE: HY000 Message: Index corrupt: %s + public final static int ER_INVALID_YEAR_COLUMN_LENGTH = 1818; //SQLSTATE: HY000 Message: YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead. + public final static int ER_NOT_VALID_PASSWORD = 1819; //SQLSTATE: HY000 Message: Your password does not satisfy the current policy requirements + public final static int ER_MUST_CHANGE_PASSWORD = 1820; //SQLSTATE: HY000 Message: You must SET PASSWORD before executing this statement + public final static int ER_FK_NO_INDEX_CHILD = 1821; //SQLSTATE: HY000 Message: Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s' + public final static int ER_FK_NO_INDEX_PARENT = 1822; //SQLSTATE: HY000 Message: Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s' + public final static int ER_FK_FAIL_ADD_SYSTEM = 1823; //SQLSTATE: HY000 Message: Failed to add the foreign key constraint '%s' to system tables + public final static int ER_FK_CANNOT_OPEN_PARENT = 1824; //SQLSTATE: HY000 Message: Failed to open the referenced table '%s' + public final static int ER_FK_INCORRECT_OPTION = 1825; //SQLSTATE: HY000 Message: Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s' + public final static int ER_FK_DUP_NAME = 1826; //SQLSTATE: HY000 Message: Duplicate foreign key constraint name '%s' + public final static int ER_PASSWORD_FORMAT = 1827; //SQLSTATE: HY000 Message: The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. + public final static int ER_FK_COLUMN_CANNOT_DROP = 1828; //SQLSTATE: HY000 Message: Cannot drop column '%s': needed in a foreign key constraint '%s' + public final static int ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829; //SQLSTATE: HY000 Message: Cannot drop column '%s': needed in a foreign key constraint '%s' of table '%s' + public final static int ER_FK_COLUMN_NOT_NULL = 1830; //SQLSTATE: HY000 Message: Column '%s' cannot be NOT NULL: needed in a foreign key constraint '%s' SET NULL + public final static int ER_DUP_INDEX = 1831; //SQLSTATE: HY000 Message: Duplicate index '%s' defined on the table '%s.%s'. This is deprecated and will be disallowed in a future release. + public final static int ER_FK_COLUMN_CANNOT_CHANGE = 1832; //SQLSTATE: HY000 Message: Cannot change column '%s': used in a foreign key constraint '%s' + public final static int ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833; //SQLSTATE: HY000 Message: Cannot change column '%s': used in a foreign key constraint '%s' of table '%s' + public final static int ER_FK_CANNOT_DELETE_PARENT = 1834; //SQLSTATE: HY000 Message: Cannot delete rows from table which is parent in a foreign key constraint '%s' of table '%s' + public final static int ER_MALFORMED_PACKET = 1835; //SQLSTATE: HY000 Message: Malformed communication packet. + public final static int ER_READ_ONLY_MODE = 1836; //SQLSTATE: HY000 Message: Running in read-only mode + public final static int ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837; //SQLSTATE: HY000 Message: When GTID_NEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the replica SQL thread, it means that a table in the current transaction is transactional on the source and non-transactional on the replica. In a client connection, it means that you executed SET GTID_NEXT before a transaction and forgot to set GTID_NEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current GTID_NEXT is '%s'. + public final static int ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838; //SQLSTATE: HY000 Message: The system variable %s cannot be set in stored procedures. + public final static int ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839; //SQLSTATE: HY000 Message: GTID_PURGED can only be set when GTID_MODE = ON. + public final static int ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840; //SQLSTATE: HY000 Message: GTID_PURGED can only be set when GTID_EXECUTED is empty. + public final static int ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841; //SQLSTATE: HY000 Message: GTID_PURGED can only be set when there are no ongoing transactions (not even in other clients). + public final static int ER_GTID_PURGED_WAS_CHANGED = 1842; //SQLSTATE: HY000 Message: GTID_PURGED was changed from '%s' to '%s'. + public final static int ER_GTID_EXECUTED_WAS_CHANGED = 1843; //SQLSTATE: HY000 Message: GTID_EXECUTED was changed from '%s' to '%s'. + public final static int ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844; //SQLSTATE: HY000 Message: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT, and both replicated and non replicated tables are written to. + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED = 1845; //SQLSTATE: 0A000 Message: %s is not supported for this operation. Try %s. + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846; //SQLSTATE: 0A000 Message: %s is not supported. Reason: %s. Try %s. + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847; //SQLSTATE: HY000 Message: COPY algorithm requires a lock + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848; //SQLSTATE: HY000 Message: Partition specific operations do not yet support LOCK/ALGORITHM + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849; //SQLSTATE: HY000 Message: Columns participating in a foreign key are renamed + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850; //SQLSTATE: HY000 Message: Cannot change column type INPLACE + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851; //SQLSTATE: HY000 Message: Adding foreign keys needs foreign_key_checks=OFF + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852; //SQLSTATE: HY000 Message: Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853; //SQLSTATE: HY000 Message: Dropping a primary key is not allowed without also adding a new primary key + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854; //SQLSTATE: HY000 Message: Adding an auto-increment column requires a lock + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855; //SQLSTATE: HY000 Message: Cannot replace hidden FTS_DOC_ID with a user-visible one + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856; //SQLSTATE: HY000 Message: Cannot drop or rename FTS_DOC_ID + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857; //SQLSTATE: HY000 Message: Fulltext index creation requires a lock + @Deprecated + public final static int ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858; + public final static int ER_SQL_REPLICA_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858; //SQLSTATE: HY000 Message: sql_replica_skip_counter can not be set when the server is running with GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction + public final static int ER_DUP_UNKNOWN_IN_INDEX = 1859; //SQLSTATE: 23000 Message: Duplicate entry for key '%s' + public final static int ER_IDENT_CAUSES_TOO_LONG_PATH = 1860; //SQLSTATE: HY000 Message: Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'. + public final static int ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861; //SQLSTATE: HY000 Message: cannot silently convert NULL values, as required in this SQL_MODE; was introduced in 5.7.1. + public final static int ER_MUST_CHANGE_PASSWORD_LOGIN = 1862; //SQLSTATE: HY000 Message: Your password has expired. To log in you must change it using a client that supports expired passwords. was introduced in 5.7.1. + public final static int ER_ROW_IN_WRONG_PARTITION = 1863; //SQLSTATE: HY000 Message: Found a row in wrong partition %s; was introduced in 5.7.1. + public final static int ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864; //SQLSTATE: HY000 Message: Cannot schedule event %s, relay-log name %s, position %s to Worker thread because its size %lu exceeds %lu of replica_pending_jobs_size_max.; was introduced in 5.7.2. + + public final static int ER_INNODB_NO_FT_USES_PARSER = 1865; //SQLSTATE: HY000 Message: Cannot CREATE FULLTEXT INDEX WITH PARSER on InnoDB table; was introduced in 5.7.2. + public final static int ER_BINLOG_LOGICAL_CORRUPTION = 1866; //SQLSTATE: HY000 Message: The binary log file '%s' is logically corrupted: %s; was introduced in 5.7.2. + public final static int ER_WARN_PURGE_LOG_IN_USE = 1867; //SQLSTATE: HY000 Message: file %s was not purged because it was being read by %d thread(s), purged only %d out of %d files. was introduced in 5.7.2. + public final static int ER_WARN_PURGE_LOG_IS_ACTIVE = 1868; //SQLSTATE: HY000 Message: file %s was not purged because it is the active log file.; was introduced in 5.7.2. + public final static int ER_AUTO_INCREMENT_CONFLICT = 1869; //SQLSTATE: HY000 Message: Auto-increment value in UPDATE conflicts with internally generated values; was introduced in 5.7.2. + public final static int WARN_ON_BLOCKHOLE_IN_RBR = 1870; //SQLSTATE: HY000 Message: Row events are not logged for %s statements that modify BLACKHOLE tables in row format. Table(s): '%s'; was introduced in 5.7.2. + @Deprecated + public final static int ER_SLAVE_MI_INIT_REPOSITORY = 1871; + public final static int ER_REPLICA_MI_INIT_REPOSITORY = 1871; //SQLSTATE: HY000 Message: Replica failed to initialize source info structure from the repository; was introduced in 5.7.2. + @Deprecated + public final static int ER_SLAVE_RLI_INIT_REPOSITORY = 1872; + public final static int ER_REPLICA_RLI_INIT_REPOSITORY = 1872; //SQLSTATE: HY000 Message: Replica failed to initialize relay log info structure from the repository; was introduced in 5.7.2. + public final static int ER_ACCESS_DENIED_CHANGE_USER_ERROR = 1873; //SQLSTATE: 28000 Message: Access denied trying to change to user '%s'@'%s' (using password: %s). Disconnecting. was introduced in 5.7.2. + public final static int ER_INNODB_READ_ONLY = 1874; //SQLSTATE: HY000 Message: InnoDB is in read only mode.; was introduced in 5.7.2. + @Deprecated + public final static int ER_STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875; + public final static int ER_STOP_REPLICA_SQL_THREAD_TIMEOUT = 1875; //SQLSTATE: HY000 Message: STOP REPLICA command execution is incomplete: Replica SQL thread got the stop signal, thread is busy, SQL thread will stop once the current task is complete.; was introduced in 5.7.2. + @Deprecated + public final static int ER_STOP_SLAVE_IO_THREAD_TIMEOUT = 1876; + public final static int ER_STOP_REPLICA_IO_THREAD_TIMEOUT = 1876; //SQLSTATE: HY000 Message: STOP REPLICA command execution is incomplete: Replica IO thread got the stop signal, thread is busy, IO thread will stop once the current task is complete.; was introduced in 5.7.2. + public final static int ER_TABLE_CORRUPT = 1877; //SQLSTATE: HY000 Message: Operation cannot be performed. The table '%s.%s' is missing, corrupt or contains bad data.; was introduced in 5.7.2. + public final static int ER_TEMP_FILE_WRITE_FAILURE = 1878; //SQLSTATE: HY000 Message: Temporary file write failure.; was introduced in 5.7.3. + public final static int ER_INNODB_FT_AUX_NOT_HEX_ID = 1879; //SQLSTATE: HY000 Message: Upgrade index name failed, please use create index(alter table) algorithm copy to rebuild index.; was introduced in 5.7.4. + public final static int ER_OLD_TEMPORALS_UPGRADED = 1880; //SQLSTATE: HY000 Message: TIME/TIMESTAMP/DATETIME columns of old format have been upgraded to the new format.; was introduced in 5.7.4. + public final static int ER_INNODB_FORCED_RECOVERY = 1881; //SQLSTATE: HY000 Message: Operation not allowed when innodb_forced_recovery > 0.; was introduced in 5.7.4. + public final static int ER_AES_INVALID_IV = 1882; //SQLSTATE: HY000 Message: The initialization vector supplied to %s is too short. Must be at least %d bytes long; was introduced in 5.7.4. + public final static int ER_FILE_CORRUPT = 1883; //SQLSTATE: HY000 Message: File %s is corrupted + @Deprecated + public final static int ER_ERROR_ON_MASTER = 1884; + public final static int ER_ERROR_ON_SOURCE = 1884; //SQLSTATE: HY000 Message: Query partially completed on the source (error on source: %d) and was aborted. There is a chance that your source is inconsistent at this point. If you are sure that your source is ok, run this query manually on the replica and then restart the replica with SET GLOBAL SQL_REPLICA_SKIP_COUNTER=1; START REPLICA;. Query:'%s' + public final static int ER_INCONSISTENT_ERROR = 1885; //SQLSTATE: HY000 Message: Query caused different errors on source and replica. Error on source: message (format)='%s' error code=%d; Error on replica:actual message='%s', error code=%d. Default database:'%s'. Query:'%s' + public final static int ER_STORAGE_ENGINE_NOT_LOADED = 1886; //SQLSTATE: HY000 Message: Storage engine for table '%s'.'%s' is not loaded. + public final static int ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 1887; //SQLSTATE: 0Z002 Message: GET STACKED DIAGNOSTICS when handler not active + public final static int ER_WARN_LEGACY_SYNTAX_CONVERTED = 1888; //SQLSTATE: HY000 Message: %s is no longer supported. The statement was converted to %s. + public final static int ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN = 1889; //SQLSTATE: HY000 Message: Statement is unsafe because it uses a fulltext parser plugin which may not return the same value on the replica.; was introduced in 5.7.1. + public final static int ER_CANNOT_DISCARD_TEMPORARY_TABLE = 1890; //SQLSTATE: HY000 Message: Cannot DISCARD/IMPORT tablespace associated with temporary table; was introduced in 5.7.1. + public final static int ER_FK_DEPTH_EXCEEDED = 1891; //SQLSTATE: HY000 Message: Foreign key cascade delete/update exceeds max depth of %d.; was introduced in 5.7.2. + public final static int ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 1892; //SQLSTATE: HY000 Message: Column count of %s.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysql_upgrade to fix this error.; was introduced in 5.7.2. + public final static int ER_WARN_TRIGGER_DOESNT_HAVE_CREATED = 1893; //SQLSTATE: HY000 Message: Trigger %s.%s.%s does not have CREATED attribute.; was introduced in 5.7.2. + public final static int ER_REFERENCED_TRG_DOES_NOT_EXIST = 1894; //SQLSTATE: HY000 Message: Referenced trigger '%s' for the given action time and event type does not exist.; was introduced in 5.7.2. + public final static int ER_EXPLAIN_NOT_SUPPORTED = 1895; //SQLSTATE: HY000 Message: EXPLAIN FOR CONNECTION command is supported only for SELECT/UPDATE/INSERT/DELETE/REPLACE; was introduced in 5.7.2. + public final static int ER_INVALID_FIELD_SIZE = 1896; //SQLSTATE: HY000 Message: Invalid size for column '%s'.; was introduced in 5.7.2. + public final static int ER_MISSING_HA_CREATE_OPTION = 1897; //SQLSTATE: HY000 Message: Table storage engine '%s' found required create option missing; was introduced in 5.7.2. + public final static int ER_ENGINE_OUT_OF_MEMORY = 1898; //SQLSTATE: HY000 Message: Out of memory in storage engine '%s'.; was introduced in 5.7.3. + public final static int ER_PASSWORD_EXPIRE_ANONYMOUS_USER = 1899; //SQLSTATE: HY000 Message: The password for anonymous user cannot be expired.; was introduced in 5.7.3. + @Deprecated + public final static int ER_SLAVE_SQL_THREAD_MUST_STOP = 1900; + public final static int ER_REPLICA_SQL_THREAD_MUST_STOP = 1900; //SQLSTATE: HY000 Message: This operation cannot be performed with a running replica sql thread; run STOP REPLICA SQL_THREAD first; was introduced in 5.7.3. + public final static int ER_NO_FT_MATERIALIZED_SUBQUERY = 1901; //SQLSTATE: HY000 Message: Cannot create FULLTEXT index on materialized subquery; was introduced in 5.7.4. + public final static int ER_INNODB_UNDO_LOG_FULL = 1902; //SQLSTATE: HY000 Message: Undo Log error: %s; was introduced in 5.7.4. + public final static int ER_INVALID_ARGUMENT_FOR_LOGARITHM = 1903; //SQLSTATE: 2201E Message: Invalid argument for logarithm; was introduced in 5.7.4. + @Deprecated + public final static int ER_SLAVE_IO_THREAD_MUST_STOP = 1904; + public final static int ER_REPLICA_IO_THREAD_MUST_STOP = 1904; //SQLSTATE: HY000 Message: This operation cannot be performed with a running replica io thread; run STOP REPLICA IO_THREAD first.; was introduced in 5.7.4. + public final static int ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO = 1905; //SQLSTATE: HY000 Message: This operation may not be safe when the replica has temporary tables. The tables will be kept open until the server restarts or until the tables are deleted by any replicated DROP statement. Suggest to wait until replica_open_temp_tables = 0.; was introduced in 5.7.4. + @Deprecated + public final static int ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS = 1906; + public final static int ER_WARN_ONLY_SOURCE_LOG_FILE_NO_POS = 1906; //SQLSTATE: HY000 Message: CHANGE SOURCE TO with a SOURCE_LOG_FILE clause but no SOURCE_LOG_POS clause may not be safe. The old position value may not be valid for the new binary log file.; was introduced in 5.7.4. + public final static int ER_QUERY_TIMEOUT = 1907; //SQLSTATE: HY000 Message: Query execution was interrupted, max_statement_time exceeded; was introduced in 5.7.4. + public final static int ER_NON_RO_SELECT_DISABLE_TIMER = 1908; //SQLSTATE: HY000 Message: Select is not a read only statement, disabling timer; was introduced in 5.7.4. + public final static int ER_DUP_LIST_ENTRY = 1909; //SQLSTATE: HY000 Message: Duplicate entry '%s'.; was introduced in 5.7.4. + public final static int ER_SQL_MODE_NO_EFFECT = 1910; //SQLSTATE: HY000 Message: '%s' mode no longer has any effect. Use STRICT_ALL_TABLES or STRICT_TRANS_TABLES instead.; was introduced in 5.7.4. + + public static final int ER_SESSION_WAS_KILLED = 3169; + + public final static int ER_CLIENT_INTERACTION_TIMEOUT = 4031; //SQLSTATE: HY000 Message: The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. Was added in 8.0.24. + + public static final int ER_X_BAD_MESSAGE = 5000; + public static final int ER_X_CAPABILITIES_PREPARE_FAILED = 5001; + public static final int ER_X_CAPABILITY_NOT_FOUND = 5002; + public static final int ER_X_INVALID_PROTOCOL_DATA = 5003; + public static final int ER_X_BAD_CONNECTION_SESSION_ATTRIBUTE_VALUE_LENGTH = 5004; + public static final int ER_X_BAD_CONNECTION_SESSION_ATTRIBUTE_KEY_LENGTH = 5005; + public static final int ER_X_BAD_CONNECTION_SESSION_ATTRIBUTE_EMPTY_KEY = 5006; + public static final int ER_X_BAD_CONNECTION_SESSION_ATTRIBUTE_LENGTH = 5007; + public static final int ER_X_BAD_CONNECTION_SESSION_ATTRIBUTE_TYPE = 5008; + public static final int ER_X_CAPABILITY_SET_NOT_ALLOWED = 5009; + public static final int ER_X_SERVICE_ERROR = 5010; + public static final int ER_X_SESSION = 5011; + public static final int ER_X_INVALID_ARGUMENT = 5012; + public static final int ER_X_MISSING_ARGUMENT = 5013; + public static final int ER_X_BAD_INSERT_DATA = 5014; + public static final int ER_X_CMD_NUM_ARGUMENTS = 5015; + public static final int ER_X_CMD_ARGUMENT_TYPE = 5016; + public static final int ER_X_CMD_ARGUMENT_VALUE = 5017; + public static final int ER_X_BAD_UPSERT_DATA = 5018; + public static final int ER_X_DUPLICATED_CAPABILITIES = 5019; + public static final int ER_X_CMD_ARGUMENT_OBJECT_EMPTY = 5020; + public static final int ER_X_CMD_INVALID_ARGUMENT = 5021; + public static final int ER_X_BAD_UPDATE_DATA = 5050; + public static final int ER_X_BAD_TYPE_OF_UPDATE = 5051; + public static final int ER_X_BAD_COLUMN_TO_UPDATE = 5052; + public static final int ER_X_BAD_MEMBER_TO_UPDATE = 5053; + public static final int ER_X_BAD_STATEMENT_ID = 5110; + public static final int ER_X_BAD_CURSOR_ID = 5111; + public static final int ER_X_BAD_SCHEMA = 5112; + public static final int ER_X_BAD_TABLE = 5113; + public static final int ER_X_BAD_PROJECTION = 5114; + public static final int ER_X_DOC_ID_MISSING = 5115; + public static final int ER_X_DUPLICATE_ENTRY = 5116; + public static final int ER_X_DOC_REQUIRED_FIELD_MISSING = 5117; + public static final int ER_X_PROJ_BAD_KEY_NAME = 5120; + public static final int ER_X_BAD_DOC_PATH = 5121; + public static final int ER_X_CURSOR_EXISTS = 5122; + public static final int ER_X_PREPARED_STATMENT_CAN_HAVE_ONE_CURSOR = 5131; + public static final int ER_X_PREPARED_EXECUTE_ARGUMENT_NOT_SUPPORTED = 5133; + public static final int ER_X_PREPARED_EXECUTE_ARGUMENT_CONSISTENCY = 5134; + public static final int ER_X_CURSOR_REACHED_EOF = 5123; + public static final int ER_X_EXPR_BAD_OPERATOR = 5150; + public static final int ER_X_EXPR_BAD_NUM_ARGS = 5151; + public static final int ER_X_EXPR_MISSING_ARG = 5152; + public static final int ER_X_EXPR_BAD_TYPE_VALUE = 5153; + public static final int ER_X_EXPR_BAD_VALUE = 5154; + public static final int ER_X_EXPR_BAD_REGEX = 5155; + public static final int ER_X_INVALID_COLLECTION = 5156; + public static final int ER_X_INVALID_ADMIN_COMMAND = 5157; + public static final int ER_X_EXPECT_NOT_OPEN = 5158; + public static final int ER_X_EXPECT_NO_ERROR_FAILED = 5159; + public static final int ER_X_EXPECT_BAD_CONDITION = 5160; + public static final int ER_X_EXPECT_BAD_CONDITION_VALUE = 5161; + public static final int ER_X_INVALID_NAMESPACE = 5162; + public static final int ER_X_BAD_NOTICE = 5163; + public static final int ER_X_CANNOT_DISABLE_NOTICE = 5164; + public static final int ER_X_BAD_CONFIGURATION = 5165; + public static final int ER_X_MYSQLX_ACCOUNT_MISSING_PERMISSIONS = 5167; + public static final int ER_X_EXPECT_FIELD_EXISTS_FAILED = 5168; + public static final int ER_X_BAD_LOCKING = 5169; + public static final int ER_X_FRAME_COMPRESSION_DISABLED = 5170; + public static final int ER_X_DECOMPRESSION_FAILED = 5171; + public static final int ER_X_BAD_COMPRESSED_FRAME = 5174; + public static final int ER_X_CAPABILITY_COMPRESSION_INVALID_ALGORITHM = 5175; + public static final int ER_X_CAPABILITY_COMPRESSION_INVALID_SERVER_STYLE = 5176; + public static final int ER_X_CAPABILITY_COMPRESSION_INVALID_CLIENT_STYLE = 5177; + public static final int ER_X_CAPABILITY_COMPRESSION_INVALID_OPTION = 5178; + public static final int ER_X_CAPABILITY_COMPRESSION_MISSING_REQUIRED_FIELDS = 5179; + public static final int ER_X_DOCUMENT_DOESNT_MATCH_EXPECTED_SCHEMA = 5180; + public static final int ER_X_COLLECTION_OPTION_DOESNT_EXISTS = 5181; + public static final int ER_X_INVALID_VALIDATION_SCHEMA = 5182; + + // Connector/J-specific errors outside the space of server errors. + public static final int ERROR_CODE_NULL_LOAD_BALANCED_CONNECTION = 1000001; + public static final int ERROR_CODE_REPLICATION_CONNECTION_WITH_NO_HOSTS = 1000002; + + // SQL-92 + public static final String SQL_STATE_WARNING = "01000"; + public static final String SQL_STATE_DISCONNECT_ERROR = "01002"; + public static final String SQL_STATE_DATE_TRUNCATED = "01004"; + public static final String SQL_STATE_PRIVILEGE_NOT_REVOKED = "01006"; + public static final String SQL_STATE_NO_DATA = "02000"; + public static final String SQL_STATE_WRONG_NO_OF_PARAMETERS = "07001"; + public static final String SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE = "08001"; + public static final String SQL_STATE_CONNECTION_IN_USE = "08002"; + public static final String SQL_STATE_CONNECTION_NOT_OPEN = "08003"; + public static final String SQL_STATE_CONNECTION_REJECTED = "08004"; + public static final String SQL_STATE_CONNECTION_FAILURE = "08006"; + public static final String SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; + public static final String SQL_STATE_COMMUNICATION_LINK_FAILURE = "08S01"; + public static final String SQL_STATE_FEATURE_NOT_SUPPORTED = "0A000"; + public static final String SQL_STATE_CARDINALITY_VIOLATION = "21000"; + public static final String SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST = "21S01"; + public static final String SQL_STATE_STRING_DATA_RIGHT_TRUNCATION = "22001"; + public static final String SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE = "22003"; + public static final String SQL_STATE_INVALID_DATETIME_FORMAT = "22007"; + public static final String SQL_STATE_DATETIME_FIELD_OVERFLOW = "22008"; + public static final String SQL_STATE_DIVISION_BY_ZERO = "22012"; + public static final String SQL_STATE_INVALID_CHARACTER_VALUE_FOR_CAST = "22018"; + public static final String SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION = "23000"; + public static final String SQL_STATE_INVALID_CURSOR_STATE = "24000"; + public static final String SQL_STATE_INVALID_TRANSACTION_STATE = "25000"; + public static final String SQL_STATE_INVALID_AUTH_SPEC = "28000"; + public static final String SQL_STATE_INVALID_TRANSACTION_TERMINATION = "2D000"; + public static final String SQL_STATE_INVALID_CONDITION_NUMBER = "35000"; + public static final String SQL_STATE_INVALID_CATALOG_NAME = "3D000"; + public static final String SQL_STATE_ROLLBACK_SERIALIZATION_FAILURE = "40001"; + public static final String SQL_STATE_SYNTAX_ERROR = "42000"; + public static final String SQL_STATE_ER_TABLE_EXISTS_ERROR = "42S01"; + public static final String SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND = "42S02"; + public static final String SQL_STATE_ER_NO_SUCH_INDEX = "42S12"; + public static final String SQL_STATE_ER_DUP_FIELDNAME = "42S21"; + public static final String SQL_STATE_ER_BAD_FIELD_ERROR = "42S22"; + + // SQL-99 + public static final String SQL_STATE_INVALID_CONNECTION_ATTRIBUTE = "01S00"; + public static final String SQL_STATE_ERROR_IN_ROW = "01S01"; + public static final String SQL_STATE_NO_ROWS_UPDATED_OR_DELETED = "01S03"; + public static final String SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED = "01S04"; + public static final String SQL_STATE_RESIGNAL_WHEN_HANDLER_NOT_ACTIVE = "0K000"; + public static final String SQL_STATE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER = "0Z002"; + public static final String SQL_STATE_CASE_NOT_FOUND_FOR_CASE_STATEMENT = "20000"; + public static final String SQL_STATE_NULL_VALUE_NOT_ALLOWED = "22004"; + public static final String SQL_STATE_INVALID_LOGARITHM_ARGUMENT = "2201E"; + public static final String SQL_STATE_ACTIVE_SQL_TRANSACTION = "25001"; + public static final String SQL_STATE_READ_ONLY_SQL_TRANSACTION = "25006"; + public static final String SQL_STATE_SRE_PROHIBITED_SQL_STATEMENT_ATTEMPTED = "2F003"; + public static final String SQL_STATE_SRE_FUNCTION_EXECUTED_NO_RETURN_STATEMENT = "2F005"; + public static final String SQL_STATE_ER_QUERY_INTERRUPTED = "70100"; // non-standard ? + public static final String SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS = "S0001"; + public static final String SQL_STATE_BASE_TABLE_NOT_FOUND = "S0002"; + public static final String SQL_STATE_INDEX_ALREADY_EXISTS = "S0011"; + public static final String SQL_STATE_INDEX_NOT_FOUND = "S0012"; + public static final String SQL_STATE_COLUMN_ALREADY_EXISTS = "S0021"; + public static final String SQL_STATE_COLUMN_NOT_FOUND = "S0022"; + public static final String SQL_STATE_NO_DEFAULT_FOR_COLUMN = "S0023"; + public static final String SQL_STATE_GENERAL_ERROR = "S1000"; + public static final String SQL_STATE_MEMORY_ALLOCATION_FAILURE = "S1001"; + public static final String SQL_STATE_INVALID_COLUMN_NUMBER = "S1002"; + public static final String SQL_STATE_ILLEGAL_ARGUMENT = "S1009"; + public static final String SQL_STATE_DRIVER_NOT_CAPABLE = "S1C00"; + public static final String SQL_STATE_TIMEOUT_EXPIRED = "S1T00"; + public static final String SQL_STATE_CLI_SPECIFIC_CONDITION = "HY000"; + public static final String SQL_STATE_MEMORY_ALLOCATION_ERROR = "HY001"; + public static final String SQL_STATE_XA_RBROLLBACK = "XA100"; + public static final String SQL_STATE_XA_RBDEADLOCK = "XA102"; + public static final String SQL_STATE_XA_RBTIMEOUT = "XA106"; + public static final String SQL_STATE_XA_RMERR = "XAE03"; + public static final String SQL_STATE_XAER_NOTA = "XAE04"; + public static final String SQL_STATE_XAER_INVAL = "XAE05"; + public static final String SQL_STATE_XAER_RMFAIL = "XAE07"; + public static final String SQL_STATE_XAER_DUPID = "XAE08"; + public static final String SQL_STATE_XAER_OUTSIDE = "XAE09"; + + public static final String SQL_STATE_BAD_SSL_PARAMS = "08000"; + + private static Map sqlStateMessages; + + public static Map mysqlToSql99State; + + static { + + sqlStateMessages = new HashMap<>(); + sqlStateMessages.put(SQL_STATE_DISCONNECT_ERROR, Messages.getString("SQLError.35")); + sqlStateMessages.put(SQL_STATE_DATE_TRUNCATED, Messages.getString("SQLError.36")); + sqlStateMessages.put(SQL_STATE_PRIVILEGE_NOT_REVOKED, Messages.getString("SQLError.37")); + sqlStateMessages.put(SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, Messages.getString("SQLError.38")); + sqlStateMessages.put(SQL_STATE_ERROR_IN_ROW, Messages.getString("SQLError.39")); + sqlStateMessages.put(SQL_STATE_NO_ROWS_UPDATED_OR_DELETED, Messages.getString("SQLError.40")); + sqlStateMessages.put(SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED, Messages.getString("SQLError.41")); + sqlStateMessages.put(SQL_STATE_WRONG_NO_OF_PARAMETERS, Messages.getString("SQLError.42")); + sqlStateMessages.put(SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE, Messages.getString("SQLError.43")); + sqlStateMessages.put(SQL_STATE_CONNECTION_IN_USE, Messages.getString("SQLError.44")); + sqlStateMessages.put(SQL_STATE_CONNECTION_NOT_OPEN, Messages.getString("SQLError.45")); + sqlStateMessages.put(SQL_STATE_CONNECTION_REJECTED, Messages.getString("SQLError.46")); + sqlStateMessages.put(SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN, Messages.getString("SQLError.47")); + sqlStateMessages.put(SQL_STATE_COMMUNICATION_LINK_FAILURE, Messages.getString("SQLError.48")); + sqlStateMessages.put(SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST, Messages.getString("SQLError.49")); + sqlStateMessages.put(SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE, Messages.getString("SQLError.50")); + sqlStateMessages.put(SQL_STATE_DATETIME_FIELD_OVERFLOW, Messages.getString("SQLError.51")); + sqlStateMessages.put(SQL_STATE_DIVISION_BY_ZERO, Messages.getString("SQLError.52")); + sqlStateMessages.put(SQL_STATE_ROLLBACK_SERIALIZATION_FAILURE, Messages.getString("SQLError.53")); + sqlStateMessages.put(SQL_STATE_INVALID_AUTH_SPEC, Messages.getString("SQLError.54")); + sqlStateMessages.put(SQL_STATE_SYNTAX_ERROR, Messages.getString("SQLError.55")); + sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND, Messages.getString("SQLError.56")); + sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS, Messages.getString("SQLError.57")); + sqlStateMessages.put(SQL_STATE_BASE_TABLE_NOT_FOUND, Messages.getString("SQLError.58")); + sqlStateMessages.put(SQL_STATE_INDEX_ALREADY_EXISTS, Messages.getString("SQLError.59")); + sqlStateMessages.put(SQL_STATE_INDEX_NOT_FOUND, Messages.getString("SQLError.60")); + sqlStateMessages.put(SQL_STATE_COLUMN_ALREADY_EXISTS, Messages.getString("SQLError.61")); + sqlStateMessages.put(SQL_STATE_COLUMN_NOT_FOUND, Messages.getString("SQLError.62")); + sqlStateMessages.put(SQL_STATE_NO_DEFAULT_FOR_COLUMN, Messages.getString("SQLError.63")); + sqlStateMessages.put(SQL_STATE_GENERAL_ERROR, Messages.getString("SQLError.64")); + sqlStateMessages.put(SQL_STATE_MEMORY_ALLOCATION_FAILURE, Messages.getString("SQLError.65")); + sqlStateMessages.put(SQL_STATE_INVALID_COLUMN_NUMBER, Messages.getString("SQLError.66")); + sqlStateMessages.put(SQL_STATE_ILLEGAL_ARGUMENT, Messages.getString("SQLError.67")); + sqlStateMessages.put(SQL_STATE_DRIVER_NOT_CAPABLE, Messages.getString("SQLError.68")); + sqlStateMessages.put(SQL_STATE_TIMEOUT_EXPIRED, Messages.getString("SQLError.69")); + + mysqlToSql99State = new HashMap<>(); + + mysqlToSql99State.put(MysqlErrorNumbers.ER_SELECT_REDUCED, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WARN_TOO_FEW_RECORDS, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WARN_TOO_MANY_RECORDS, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WARN_DATA_TRUNCATED, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WARN_NULL_TO_NOTNULL, SQL_STATE_NULL_VALUE_NOT_ALLOWED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WARN_DATA_OUT_OF_RANGE, SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_UNINIT_VAR, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SIGNAL_WARN, SQL_STATE_WARNING); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_FETCH_NO_DATA, SQL_STATE_NO_DATA); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SIGNAL_NOT_FOUND, SQL_STATE_NO_DATA); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CON_COUNT_ERROR, SQL_STATE_CONNECTION_REJECTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NOT_SUPPORTED_AUTH_MODE, SQL_STATE_CONNECTION_REJECTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BAD_HOST_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_HANDSHAKE_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNKNOWN_COM_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SERVER_SHUTDOWN, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FORCING_CLOSE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_IPSOCK_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ABORTING_CONNECTION, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_PACKET_TOO_LARGE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_READ_ERROR_FROM_PIPE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_FCNTL_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_PACKETS_OUT_OF_ORDER, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_UNCOMPRESS_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_READ_ERROR, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_READ_INTERRUPTED, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_ERROR_ON_WRITE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NET_WRITE_INTERRUPTED, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NEW_ABORTING_CONNECTION, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SOURCE_NET_READ, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SOURCE_NET_WRITE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CONNECT_TO_SOURCE, SQL_STATE_COMMUNICATION_LINK_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BADSELECT, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BADSTATEMENT, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_SUBSELECT_NYI, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NO_RETSET, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ALTER_OPERATION_NOT_SUPPORTED, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON, SQL_STATE_FEATURE_NOT_SUPPORTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DBACCESS_DENIED_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BAD_DB_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_FIELD_WITH_GROUP, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_GROUP_FIELD, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_SUM_SELECT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_LONG_IDENT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_KEYNAME, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_FIELD_SPEC, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PARSE_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_EMPTY_QUERY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NONUNIQ_TABLE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_INVALID_DEFAULT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_MULTIPLE_PRI_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_MANY_KEYS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_MANY_KEY_PARTS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_LONG_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_KEY_COLUMN_DOES_NOT_EXITS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BLOB_USED_AS_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_FIELDLENGTH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_AUTO_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_FIELD_TERMINATORS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BLOBS_AND_NO_TERMINATED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_REMOVE_ALL_FIELDS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_DROP_FIELD_OR_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BLOB_CANT_HAVE_DEFAULT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_DB_NAME, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_TABLE_NAME, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_SELECT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNKNOWN_PROCEDURE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_PROCEDURE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FIELD_SPECIFIED_TWICE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNSUPPORTED_EXTENSION, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLE_MUST_HAVE_COLUMNS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNKNOWN_CHARACTER_SET, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_ROWSIZE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_OUTER_JOIN, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NULL_COLUMN_IN_INDEX, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PASSWORD_ANONYMOUS_USER, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PASSWORD_NOT_ALLOWED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PASSWORD_NO_MATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_REGEXP_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_MIX_OF_GROUP_FUNC_AND_FIELDS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NONEXISTING_GRANT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLEACCESS_DENIED_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_COLUMNACCESS_DENIED_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ILLEGAL_GRANT_FOR_TABLE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_GRANT_WRONG_HOST_OR_USER, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NONEXISTING_TABLE_GRANT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NOT_ALLOWED_COMMAND, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SYNTAX_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_LONG_STRING, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_BLOB, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_COLUMN_NAME, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_KEY_COLUMN, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BLOB_KEY_WITHOUT_LENGTH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PRIMARY_CANT_HAVE_NULL, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_MANY_ROWS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_REQUIRES_PRIMARY_KEY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_KEY_DOES_NOT_EXITS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CHECK_NO_SUCH_TABLE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CHECK_NOT_IMPLEMENTED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_MANY_USER_CONNECTIONS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_PERMISSION_TO_CREATE_USER, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_USER_LIMIT_REACHED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SPECIFIC_ACCESS_DENIED_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_DEFAULT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_VALUE_FOR_VAR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_TYPE_FOR_VAR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_USE_OPTION_HERE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NOT_SUPPORTED_YET, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_FK_DEF, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DERIVED_MUST_HAVE_ALIAS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLENAME_NOT_ALLOWED_HERE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SPATIAL_CANT_HAVE_NULL, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_COLLATION_CHARSET_MISMATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_NAME_FOR_INDEX, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_NAME_FOR_CATALOG, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNKNOWN_STORAGE_ENGINE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_ALREADY_EXISTS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DOES_NOT_EXIST, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_LILABEL_MISMATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_LABEL_REDEFINE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_LABEL_MISMATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BADRETURN, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UPDATE_LOG_DEPRECATED_IGNORED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UPDATE_LOG_DEPRECATED_TRANSLATED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_WRONG_NO_OF_ARGS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_COND_MISMATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NORETURN, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BAD_CURSOR_QUERY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BAD_CURSOR_SELECT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_CURSOR_MISMATCH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_UNDECLARED_VAR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DUP_PARAM, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DUP_VAR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DUP_COND, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DUP_CURS, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_VARCOND_AFTER_CURSHNDLR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_CURSOR_AFTER_HANDLER, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_PROCACCESS_DENIED_ERROR, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NONEXISTING_PROC_GRANT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BAD_SQLSTATE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_CREATE_USER_WITH_GRANT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_DUP_HANDLER, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NOT_VAR_ARG, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_SCALE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_PRECISION, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_M_BIGGER_THAN_D, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_LONG_BODY, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TOO_BIG_DISPLAYWIDTH, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_BAD_VAR_SHADOW, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_WRONG_NAME, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NO_AGGREGATE, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_MAX_PREPARED_STMT_COUNT_REACHED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NON_GROUPING_FIELD_USED, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_PARAMETERS_TO_NATIVE_FCT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_PARAMETERS_TO_STORED_FCT, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FUNC_INEXISTENT_NAME_COLLISION, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_SIGNAL_SET, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SPATIAL_MUST_HAVE_GEOM_COL, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TRUNCATE_ILLEGAL_FK, SQL_STATE_SYNTAX_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, SQL_STATE_CARDINALITY_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_OPERAND_COLUMNS, SQL_STATE_CARDINALITY_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SUBQUERY_NO_1_ROW, SQL_STATE_CARDINALITY_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_KEY, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BAD_NULL_ERROR, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NON_UNIQ_ERROR, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_ENTRY, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_UNIQUE, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_REFERENCED_ROW, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ROW_IS_REFERENCED, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ROW_IS_REFERENCED_2, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_REFERENCED_ROW_2, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FOREIGN_DUPLICATE_KEY, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_ENTRY_WITH_KEY_NAME, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_UNKNOWN_IN_INDEX, SQL_STATE_INTEGRITY_CONSTRAINT_VIOLATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DATA_TOO_LONG, SQL_STATE_STRING_DATA_RIGHT_TRUNCATION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_CREATE_GEOMETRY_OBJECT, SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DATA_OUT_OF_RANGE, SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TRUNCATED_WRONG_VALUE, SQL_STATE_INVALID_DATETIME_FORMAT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ILLEGAL_VALUE_FOR_TYPE, SQL_STATE_INVALID_DATETIME_FORMAT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DATETIME_FUNCTION_OVERFLOW, SQL_STATE_DATETIME_FIELD_OVERFLOW); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DIVISION_BY_ZERO, SQL_STATE_DIVISION_BY_ZERO); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_CURSOR_ALREADY_OPEN, SQL_STATE_INVALID_CURSOR_STATE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_CURSOR_NOT_OPEN, SQL_STATE_INVALID_CURSOR_STATE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_DO_THIS_DURING_AN_TRANSACTION, SQL_STATE_INVALID_TRANSACTION_STATE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_READ_ONLY_TRANSACTION, SQL_STATE_INVALID_TRANSACTION_STATE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ACCESS_DENIED_ERROR, SQL_STATE_INVALID_AUTH_SPEC); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ACCESS_DENIED_NO_PASSWORD_ERROR, SQL_STATE_INVALID_AUTH_SPEC); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ACCESS_DENIED_CHANGE_USER_ERROR, SQL_STATE_INVALID_AUTH_SPEC); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DA_INVALID_CONDITION_NUMBER, SQL_STATE_INVALID_CONDITION_NUMBER); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_DB_ERROR, SQL_STATE_INVALID_CATALOG_NAME); + mysqlToSql99State.put(MysqlErrorNumbers.ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER, SQL_STATE_RESIGNAL_WHEN_HANDLER_NOT_ACTIVE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER, SQL_STATE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_CASE_NOT_FOUND, SQL_STATE_CASE_NOT_FOUND_FOR_CASE_STATEMENT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_VALUE_COUNT, SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST); + mysqlToSql99State.put(MysqlErrorNumbers.ER_WRONG_VALUE_COUNT_ON_ROW, SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST); + mysqlToSql99State.put(MysqlErrorNumbers.ER_INVALID_USE_OF_NULL, SQL_STATE_NULL_VALUE_NOT_ALLOWED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_INVALID_ARGUMENT_FOR_LOGARITHM, SQL_STATE_INVALID_LOGARITHM_ARGUMENT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_CHANGE_TX_ISOLATION, SQL_STATE_ACTIVE_SQL_TRANSACTION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION, SQL_STATE_READ_ONLY_SQL_TRANSACTION); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NO_RECURSIVE_CREATE, SQL_STATE_SRE_PROHIBITED_SQL_STATEMENT_ATTEMPTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_SP_NORETURNEND, SQL_STATE_SRE_FUNCTION_EXECUTED_NO_RETURN_STATEMENT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_TABLE_EXISTS_ERROR, SQL_STATE_ER_TABLE_EXISTS_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BAD_TABLE_ERROR, SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND); + mysqlToSql99State.put(MysqlErrorNumbers.ER_UNKNOWN_TABLE, SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_SUCH_TABLE, SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND); + mysqlToSql99State.put(MysqlErrorNumbers.ER_NO_SUCH_INDEX, SQL_STATE_ER_NO_SUCH_INDEX); + mysqlToSql99State.put(MysqlErrorNumbers.ER_DUP_FIELDNAME, SQL_STATE_ER_DUP_FIELDNAME); + mysqlToSql99State.put(MysqlErrorNumbers.ER_BAD_FIELD_ERROR, SQL_STATE_ER_BAD_FIELD_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_ILLEGAL_REFERENCE, SQL_STATE_ER_BAD_FIELD_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_QUERY_INTERRUPTED, SQL_STATE_ER_QUERY_INTERRUPTED); + mysqlToSql99State.put(MysqlErrorNumbers.ER_OUTOFMEMORY, SQL_STATE_MEMORY_ALLOCATION_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_OUT_OF_SORTMEMORY, SQL_STATE_MEMORY_ALLOCATION_ERROR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XA_RBROLLBACK, SQL_STATE_XA_RBROLLBACK); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XA_RBDEADLOCK, SQL_STATE_XA_RBDEADLOCK); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XA_RBTIMEOUT, SQL_STATE_XA_RBTIMEOUT); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XA_RMERR, SQL_STATE_XA_RMERR); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XAER_NOTA, SQL_STATE_XAER_NOTA); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XAER_INVAL, SQL_STATE_XAER_INVAL); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XAER_RMFAIL, SQL_STATE_XAER_RMFAIL); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XAER_DUPID, SQL_STATE_XAER_DUPID); + mysqlToSql99State.put(MysqlErrorNumbers.ER_XAER_OUTSIDE, SQL_STATE_XAER_OUTSIDE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_LOCK_WAIT_TIMEOUT, SQL_STATE_ROLLBACK_SERIALIZATION_FAILURE); + mysqlToSql99State.put(MysqlErrorNumbers.ER_LOCK_DEADLOCK, SQL_STATE_ROLLBACK_SERIALIZATION_FAILURE); + } + + public static String get(String stateCode) { + return sqlStateMessages.get(stateCode); + } + + public static String mysqlToSql99(int errno) { + Integer err = Integer.valueOf(errno); + + if (mysqlToSql99State.containsKey(err)) { + return mysqlToSql99State.get(err); + } + + return SQL_STATE_CLI_SPECIFIC_CONDITION; + } + + /** + * Map MySQL error codes to SQL-99 error codes + * + * @param errno + * the MySQL error code + * + * @return the corresponding SQL-99 error code + */ + public static String mysqlToSqlState(int errno) { + return mysqlToSql99(errno); + } + + private MysqlErrorNumbers() { + // prevent instantiation + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/NumberOutOfRange.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/NumberOutOfRange.java new file mode 100644 index 0000000..39ce10d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/NumberOutOfRange.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Indicates that a number was out of the expected range. + */ +public class NumberOutOfRange extends DataReadException { + private static final long serialVersionUID = -61091413023651438L; + + public NumberOutOfRange(String msg) { + super(msg); + setSQLState("22003"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/OperationCancelledException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/OperationCancelledException.java new file mode 100644 index 0000000..982c4a6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/OperationCancelledException.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +import com.mysql.cj.Messages; + +public class OperationCancelledException extends CJException { + + private static final long serialVersionUID = 9001418688349454695L; + + public OperationCancelledException() { + super(Messages.getString("MySQLStatementCancelledException.0")); + } + + public OperationCancelledException(String message) { + super(message); + } + + public OperationCancelledException(Throwable cause) { + super(cause); + } + + public OperationCancelledException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PasswordExpiredException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PasswordExpiredException.java new file mode 100644 index 0000000..28cc24e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PasswordExpiredException.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Equivalent to SQLSTATE ER_MUST_CHANGE_PASSWORD = 1820 + * "You must SET PASSWORD before executing this statement" + * + * Server entered to sandbox morde when this failure happens. + */ +public class PasswordExpiredException extends CJException { + + private static final long serialVersionUID = -3807215681364413250L; + + public PasswordExpiredException() { + super(); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD); + } + + public PasswordExpiredException(String message) { + super(message); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD); + } + + public PasswordExpiredException(String message, Throwable cause) { + super(message, cause); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD); + } + + public PasswordExpiredException(Throwable cause) { + super(cause); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD); + } + + protected PasswordExpiredException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setVendorCode(MysqlErrorNumbers.ER_MUST_CHANGE_PASSWORD); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PropertyNotModifiableException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PropertyNotModifiableException.java new file mode 100644 index 0000000..1ec42c0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/PropertyNotModifiableException.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class PropertyNotModifiableException extends CJException { + + private static final long serialVersionUID = -8001652264426656450L; + + public PropertyNotModifiableException() { + super(); + } + + public PropertyNotModifiableException(String message) { + super(message); + } + + public PropertyNotModifiableException(String message, Throwable cause) { + super(message, cause); + } + + public PropertyNotModifiableException(Throwable cause) { + super(cause); + } + + protected PropertyNotModifiableException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/RSAException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/RSAException.java new file mode 100644 index 0000000..881f09b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/RSAException.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class RSAException extends CJException { + + private static final long serialVersionUID = -1878681511263159173L; + + public RSAException() { + super(); + } + + public RSAException(String message) { + super(message); + } + + public RSAException(String message, Throwable cause) { + super(message, cause); + } + + public RSAException(Throwable cause) { + super(cause); + } + + protected RSAException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/SSLParamsException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/SSLParamsException.java new file mode 100644 index 0000000..8b4969e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/SSLParamsException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class SSLParamsException extends CJException { + + private static final long serialVersionUID = -6597843374954727858L; + + public SSLParamsException() { + super(); + setSQLState("08000"); + } + + public SSLParamsException(String message) { + super(message); + setSQLState("08000"); + } + + public SSLParamsException(String message, Throwable cause) { + super(message, cause); + setSQLState("08000"); + } + + public SSLParamsException(Throwable cause) { + super(cause); + setSQLState("08000"); + } + + public SSLParamsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("08000"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StatementIsClosedException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StatementIsClosedException.java new file mode 100644 index 0000000..038d9a8 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StatementIsClosedException.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +/** + * Operation attempted on already closed Statement + */ +public class StatementIsClosedException extends CJException { + + private static final long serialVersionUID = -4214028635985851906L; + + public StatementIsClosedException() { + super(); + setSQLState("S1009"); + } + + public StatementIsClosedException(String message) { + super(message); + setSQLState("S1009"); + } + + public StatementIsClosedException(String message, Throwable cause) { + super(message, cause); + setSQLState("S1009"); + } + + public StatementIsClosedException(Throwable cause) { + super(cause); + setSQLState("S1009"); + } + + protected StatementIsClosedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("S1009"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StreamingNotifiable.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StreamingNotifiable.java new file mode 100644 index 0000000..d71fec1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/StreamingNotifiable.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public interface StreamingNotifiable { + + void setWasStreamingResults(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnableToConnectException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnableToConnectException.java new file mode 100644 index 0000000..92350bc --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnableToConnectException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class UnableToConnectException extends CJException { + + private static final long serialVersionUID = 6824175447292574109L; + + public UnableToConnectException() { + super(); + setSQLState("08001"); + } + + public UnableToConnectException(String message) { + super(message); + setSQLState("08001"); + } + + public UnableToConnectException(String message, Throwable cause) { + super(message, cause); + setSQLState("08001"); + } + + public UnableToConnectException(Throwable cause) { + super(cause); + setSQLState("08001"); + } + + public UnableToConnectException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("08001"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnsupportedConnectionStringException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnsupportedConnectionStringException.java new file mode 100644 index 0000000..e48a5c4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/UnsupportedConnectionStringException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class UnsupportedConnectionStringException extends CJException { + + private static final long serialVersionUID = 3991597077197801820L; + + public UnsupportedConnectionStringException() { + super(); + setSQLState(MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT); + } + + public UnsupportedConnectionStringException(String message) { + super(message); + setSQLState(MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT); + } + + public UnsupportedConnectionStringException(String message, Throwable cause) { + super(message, cause); + setSQLState(MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT); + } + + public UnsupportedConnectionStringException(Throwable cause) { + super(cause); + setSQLState(MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT); + } + + public UnsupportedConnectionStringException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState(MysqlErrorNumbers.SQL_STATE_ILLEGAL_ARGUMENT); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/WrongArgumentException.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/WrongArgumentException.java new file mode 100644 index 0000000..6bad819 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/exceptions/WrongArgumentException.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.exceptions; + +public class WrongArgumentException extends CJException { + + private static final long serialVersionUID = 3991597077197801820L; + + public WrongArgumentException() { + super(); + setSQLState("S1009"); + } + + public WrongArgumentException(String message) { + super(message); + setSQLState("S1009"); + } + + public WrongArgumentException(String message, Throwable cause) { + super(message, cause); + setSQLState("S1009"); + } + + public WrongArgumentException(Throwable cause) { + super(cause); + setSQLState("S1009"); + } + + public WrongArgumentException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + setSQLState("S1009"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/interceptors/QueryInterceptor.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/interceptors/QueryInterceptor.java new file mode 100644 index 0000000..ea404ad --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/interceptors/QueryInterceptor.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2009, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.interceptors; + +import java.util.Properties; +import java.util.function.Supplier; + +import com.mysql.cj.MysqlConnection; +import com.mysql.cj.Query; +import com.mysql.cj.log.Log; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.ServerSession; + +/** + * Implement this interface to be placed "in between" query execution, so that you can influence it. + * + * QueryInterceptors are "chainable" when configured by the user, the results returned by the "current" interceptor will be passed on to the next on in the + * chain, from left-to-right order, as specified by the user in the driver configuration property "queryInterceptors". + */ +public interface QueryInterceptor { + + /** + * Called once per connection that wants to use the interceptor + * + * The properties are the same ones passed in in the URL or arguments to + * Driver.connect() or DriverManager.getConnection(). + * + * @param conn + * the connection for which this interceptor is being created + * @param props + * configuration values as passed to the connection. Note that + * in order to support javax.sql.DataSources, configuration properties specific + * to an interceptor must be passed via setURL() on the + * DataSource. QueryInterceptor properties are not exposed via + * accessor/mutator methods on DataSources. + * @param log + * logger + * @return {@link QueryInterceptor} + */ + QueryInterceptor init(MysqlConnection conn, Properties props, Log log); + + /** + * Called before the given query is going to be sent to the server for processing. + * + * Interceptors are free to return a result set (which must implement the + * interface {@link Resultset}), and if so, + * the server will not execute the query, and the given result set will be + * returned to the application instead. + * + * This method will be called while the connection-level mutex is held, so + * it will only be called from one thread at a time. + * + * @param sql + * the Supplier for SQL representation of the query + * @param interceptedQuery + * the actual {@link Query} instance being intercepted + * @param + * {@link Resultset} object + * + * @return a {@link Resultset} that should be returned to the application instead + * of results that are created from actual execution of the intercepted + * query. + */ + T preProcess(Supplier sql, Query interceptedQuery); + + /** + * Called before the given query packet is going to be sent to the server for processing. + * + * Interceptors are free to return a PacketPayload, and if so, + * the server will not execute the query, and the given PacketPayload will be + * returned to the application instead. + * + * This method will be called while the connection-level mutex is held, so + * it will only be called from one thread at a time. + * + * @param queryPacket + * original {@link Message} + * @param + * {@link Message} object + * @return processed {@link Message} + */ + default M preProcess(M queryPacket) { + return null; + } + + /** + * Should the driver execute this interceptor only for the + * "original" top-level query, and not put it in the execution + * path for queries that may be executed from other interceptors? + * + * If an interceptor issues queries using the connection it was created for, + * and does not return true for this method, it must ensure + * that it does not cause infinite recursion. + * + * @return true if the driver should ensure that this interceptor is only + * executed for the top-level "original" query. + */ + boolean executeTopLevelOnly(); + + /** + * Called by the driver when this extension should release any resources + * it is holding and cleanup internally before the connection is + * closed. + */ + void destroy(); + + /** + * Called after the given query has been sent to the server for processing. + * + * Interceptors are free to inspect the "original" result set, and if a + * different result set is returned by the interceptor, it is used in place + * of the "original" result set. + * + * This method will be called while the connection-level mutex is held, so + * it will only be called from one thread at a time. + * + * @param sql + * the Supplier for SQL representation of the query + * @param interceptedQuery + * the actual {@link Query} instance being intercepted + * @param originalResultSet + * a {@link Resultset} created from query execution + * @param serverSession + * {@link ServerSession} object after the query execution + * @param + * {@link Resultset} object + * + * @return a {@link Resultset} that should be returned to the application instead + * of results that are created from actual execution of the intercepted + * query. + */ + T postProcess(Supplier sql, Query interceptedQuery, T originalResultSet, ServerSession serverSession); + + /** + * Called after the given query packet has been sent to the server for processing. + * + * Interceptors are free to return either a different PacketPayload than the originalResponsePacket or null. + * + * This method will be called while the connection-level mutex is held, so + * it will only be called from one thread at a time. + * + * @param queryPacket + * query {@link Message} + * @param originalResponsePacket + * response {@link Message} + * @param + * {@link Message} object + * @return {@link Message} + */ + default M postProcess(M queryPacket, M originalResponsePacket) { + return null; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Jdk14Logger.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Jdk14Logger.java new file mode 100644 index 0000000..bb5e49a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Jdk14Logger.java @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Logging functionality for JDK1.4 + */ +public class Jdk14Logger implements Log { + private static final Level DEBUG = Level.FINE; + + private static final Level ERROR = Level.SEVERE; + + private static final Level FATAL = Level.SEVERE; + + private static final Level INFO = Level.INFO; + + private static final Level TRACE = Level.FINEST; + + private static final Level WARN = Level.WARNING; + + /** + * The underlying logger from JDK-1.4 + */ + protected Logger jdkLogger = null; + + /** + * Creates a new Jdk14Logger object. + * + * @param name + * logger name as per {@link Logger#getLogger(String)} + */ + public Jdk14Logger(String name) { + this.jdkLogger = Logger.getLogger(name); + } + + public boolean isDebugEnabled() { + return this.jdkLogger.isLoggable(Level.FINE); + } + + public boolean isErrorEnabled() { + return this.jdkLogger.isLoggable(Level.SEVERE); + } + + public boolean isFatalEnabled() { + return this.jdkLogger.isLoggable(Level.SEVERE); + } + + public boolean isInfoEnabled() { + return this.jdkLogger.isLoggable(Level.INFO); + } + + public boolean isTraceEnabled() { + return this.jdkLogger.isLoggable(Level.FINEST); + } + + public boolean isWarnEnabled() { + return this.jdkLogger.isLoggable(Level.WARNING); + } + + /** + * Logs the given message instance using the 'debug' level + * + * @param message + * the message to log + */ + public void logDebug(Object message) { + logInternal(DEBUG, message, null); + } + + /** + * Logs the given message and Throwable at the 'debug' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logDebug(Object message, Throwable exception) { + logInternal(DEBUG, message, exception); + } + + /** + * Logs the given message instance using the 'error' level + * + * @param message + * the message to log + */ + public void logError(Object message) { + logInternal(ERROR, message, null); + } + + /** + * Logs the given message and Throwable at the 'error' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logError(Object message, Throwable exception) { + logInternal(ERROR, message, exception); + } + + /** + * Logs the given message instance using the 'fatal' level + * + * @param message + * the message to log + */ + public void logFatal(Object message) { + logInternal(FATAL, message, null); + } + + /** + * Logs the given message and Throwable at the 'fatal' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logFatal(Object message, Throwable exception) { + logInternal(FATAL, message, exception); + } + + /** + * Logs the given message instance using the 'info' level + * + * @param message + * the message to log + */ + public void logInfo(Object message) { + logInternal(INFO, message, null); + } + + /** + * Logs the given message and Throwable at the 'info' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logInfo(Object message, Throwable exception) { + logInternal(INFO, message, exception); + } + + /** + * Logs the given message instance using the 'trace' level + * + * @param message + * the message to log + */ + public void logTrace(Object message) { + logInternal(TRACE, message, null); + } + + /** + * Logs the given message and Throwable at the 'trace' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logTrace(Object message, Throwable exception) { + logInternal(TRACE, message, exception); + } + + /** + * Logs the given message instance using the 'warn' level + * + * @param message + * the message to log + */ + public void logWarn(Object message) { + logInternal(WARN, message, null); + } + + /** + * Logs the given message and Throwable at the 'warn' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logWarn(Object message, Throwable exception) { + logInternal(WARN, message, exception); + } + + private static final int findCallerStackDepth(StackTraceElement[] stackTrace) { + int numFrames = stackTrace.length; + + for (int i = 0; i < numFrames; i++) { + String callerClassName = stackTrace[i].getClassName(); + + if (!(callerClassName.startsWith("com.mysql.cj") || callerClassName.startsWith("com.mysql.cj.core") + || callerClassName.startsWith("com.mysql.cj.jdbc"))) { + return i; + } + } + + return 0; + } + + private void logInternal(Level level, Object msg, Throwable exception) { + // + // only go through this exercise if the message will actually be logged. + // + + if (this.jdkLogger.isLoggable(level)) { + String messageAsString = null; + String callerMethodName = "N/A"; + String callerClassName = "N/A"; + //int lineNumber = 0; + //String fileName = "N/A"; + + if (msg instanceof ProfilerEvent) { + messageAsString = msg.toString(); + } else { + Throwable locationException = new Throwable(); + StackTraceElement[] locations = locationException.getStackTrace(); + + int frameIdx = findCallerStackDepth(locations); + + if (frameIdx != 0) { + callerClassName = locations[frameIdx].getClassName(); + callerMethodName = locations[frameIdx].getMethodName(); + //lineNumber = locations[frameIdx].getLineNumber(); + //fileName = locations[frameIdx].getFileName(); + } + + messageAsString = String.valueOf(msg); + } + + if (exception == null) { + this.jdkLogger.logp(level, callerClassName, callerMethodName, messageAsString); + } else { + this.jdkLogger.logp(level, callerClassName, callerMethodName, messageAsString, exception); + } + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Log.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Log.java new file mode 100644 index 0000000..13c692c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Log.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +/** + * Unified interface to main.logging facilities on different platforms + */ +public interface Log { + /** Logger instance name */ + static final String LOGGER_INSTANCE_NAME = "MySQL"; + + /** + * Is the 'debug' log level enabled? + * + * @return true if so. + */ + boolean isDebugEnabled(); + + /** + * Is the 'error' log level enabled? + * + * @return true if so. + */ + boolean isErrorEnabled(); + + /** + * Is the 'fatal' log level enabled? + * + * @return true if so. + */ + boolean isFatalEnabled(); + + /** + * Is the 'info' log level enabled? + * + * @return true if so. + */ + boolean isInfoEnabled(); + + /** + * Is the 'trace' log level enabled? + * + * @return true if so. + */ + boolean isTraceEnabled(); + + /** + * Is the 'warn' log level enabled? + * + * @return true if so. + */ + boolean isWarnEnabled(); + + /** + * Logs the given message instance using the 'debug' level + * + * @param msg + * the message to log + */ + void logDebug(Object msg); + + /** + * Logs the given message and Throwable at the 'debug' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logDebug(Object msg, Throwable thrown); + + /** + * Logs the given message instance using the 'error' level + * + * @param msg + * the message to log + */ + void logError(Object msg); + + /** + * Logs the given message and Throwable at the 'error' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logError(Object msg, Throwable thrown); + + /** + * Logs the given message instance using the 'fatal' level + * + * @param msg + * the message to log + */ + void logFatal(Object msg); + + /** + * Logs the given message and Throwable at the 'fatal' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logFatal(Object msg, Throwable thrown); + + /** + * Logs the given message instance using the 'info' level + * + * @param msg + * the message to log + */ + void logInfo(Object msg); + + /** + * Logs the given message and Throwable at the 'info' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logInfo(Object msg, Throwable thrown); + + /** + * Logs the given message instance using the 'trace' level + * + * @param msg + * the message to log + */ + void logTrace(Object msg); + + /** + * Logs the given message and Throwable at the 'trace' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logTrace(Object msg, Throwable thrown); + + /** + * Logs the given message instance using the 'warn' level + * + * @param msg + * the message to log + */ + void logWarn(Object msg); + + /** + * Logs the given message and Throwable at the 'warn' level. + * + * @param msg + * the message to log + * @param thrown + * the throwable to log (may be null) + */ + void logWarn(Object msg, Throwable thrown); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/NullLogger.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/NullLogger.java new file mode 100644 index 0000000..95599f0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/NullLogger.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +/** + * A logger that does nothing. Used before the log is configured via the URL or properties. + */ +public class NullLogger implements Log { + + /** + * Creates a new NullLogger with the given name + * + * @param instanceName + * (ignored) + */ + public NullLogger(String instanceName) { + } + + public boolean isDebugEnabled() { + return false; + } + + public boolean isErrorEnabled() { + return false; + } + + public boolean isFatalEnabled() { + return false; + } + + public boolean isInfoEnabled() { + return false; + } + + public boolean isTraceEnabled() { + return false; + } + + public boolean isWarnEnabled() { + return false; + } + + public void logDebug(Object msg) { + } + + public void logDebug(Object msg, Throwable thrown) { + } + + public void logError(Object msg) { + } + + public void logError(Object msg, Throwable thrown) { + } + + public void logFatal(Object msg) { + } + + public void logFatal(Object msg, Throwable thrown) { + } + + public void logInfo(Object msg) { + } + + public void logInfo(Object msg, Throwable thrown) { + } + + public void logTrace(Object msg) { + } + + public void logTrace(Object msg, Throwable thrown) { + } + + public void logWarn(Object msg) { + } + + public void logWarn(Object msg, Throwable thrown) { + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEvent.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEvent.java new file mode 100644 index 0000000..8a1162b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEvent.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +public interface ProfilerEvent { + /** + * Profiler event for usage advisor + */ + public static final byte TYPE_USAGE = 0; + + /** + * Profiler creating object type event + */ + public static final byte TYPE_OBJECT_CREATION = 1; + + /** + * Profiler event for prepared statements being prepared + */ + public static final byte TYPE_PREPARE = 2; + + /** + * Profiler event for a query being executed + */ + public static final byte TYPE_QUERY = 3; + + /** + * Profiler event for prepared statements being executed + */ + public static final byte TYPE_EXECUTE = 4; + + /** + * Profiler event for result sets being retrieved + */ + public static final byte TYPE_FETCH = 5; + + /** + * Profiler event for slow query + */ + public static final byte TYPE_SLOW_QUERY = 6; + + /** + * Not available value. + */ + public static final byte NA = -1; + + /** + * Returns the event type + * + * @return the event type + */ + byte getEventType(); + + /** + * Returns the host name the event occurred on. + * + * @return host name + */ + String getHostName(); + + /** + * Returns the database the event occurred on. + * + * @return the database in use + */ + String getDatabase(); + + /** + * Returns the id of the associated connection (-1 for none). + * + * @return the connection in use + */ + long getConnectionId(); + + /** + * Returns the id of the associated statement (-1 for none). + * + * @return the statement in use + */ + int getStatementId(); + + /** + * Returns the id of the associated result set (-1 for none). + * + * @return the result set in use + */ + int getResultSetId(); + + /** + * Returns the time (in System.currentTimeMillis() form) when this event was created. + * + * @return the time this event was created + */ + long getEventCreationTime(); + + /** + * Returns the duration of the event in milliseconds + * + * @return the duration of the event in milliseconds + */ + long getEventDuration(); + + /** + * Returns the units for getEventDuration() + * + * @return name of duration units + */ + String getDurationUnits(); + + /** + * Returns the description of where the event was created. + * + * @return a description of where this event was created. + */ + String getEventCreationPointAsString(); + + /** + * Returns the optional message for this event + * + * @return the message stored in this event + */ + String getMessage(); + + /** + * Creates a binary representation of this event. + * + * @return a binary representation of this event + */ + byte[] pack(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEventHandler.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEventHandler.java new file mode 100644 index 0000000..a6b4ef6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/ProfilerEventHandler.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2007, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import com.mysql.cj.Query; +import com.mysql.cj.Session; +import com.mysql.cj.protocol.Resultset; + +public interface ProfilerEventHandler { + + void init(Log log); + + void destroy(); + + void consumeEvent(ProfilerEvent evt); + + void processEvent(byte eventType, Session session, Query query, Resultset resultSet, long eventDuration, Throwable eventCreationPoint, String message); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Slf4JLogger.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Slf4JLogger.java new file mode 100644 index 0000000..f80391c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/Slf4JLogger.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2011, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Slf4JLogger implements Log { + private Logger log; + + public Slf4JLogger(String name) { + this.log = LoggerFactory.getLogger(name); + } + + public boolean isDebugEnabled() { + return this.log.isDebugEnabled(); + } + + public boolean isErrorEnabled() { + return this.log.isErrorEnabled(); + } + + public boolean isFatalEnabled() { + return this.log.isErrorEnabled(); + } + + public boolean isInfoEnabled() { + return this.log.isInfoEnabled(); + } + + public boolean isTraceEnabled() { + return this.log.isTraceEnabled(); + } + + public boolean isWarnEnabled() { + return this.log.isWarnEnabled(); + } + + public void logDebug(Object msg) { + this.log.debug(msg.toString()); + } + + public void logDebug(Object msg, Throwable thrown) { + this.log.debug(msg.toString(), thrown); + } + + public void logError(Object msg) { + this.log.error(msg.toString()); + } + + public void logError(Object msg, Throwable thrown) { + this.log.error(msg.toString(), thrown); + } + + public void logFatal(Object msg) { + this.log.error(msg.toString()); + } + + public void logFatal(Object msg, Throwable thrown) { + this.log.error(msg.toString(), thrown); + } + + public void logInfo(Object msg) { + this.log.info(msg.toString()); + } + + public void logInfo(Object msg, Throwable thrown) { + this.log.info(msg.toString(), thrown); + } + + public void logTrace(Object msg) { + this.log.trace(msg.toString()); + } + + public void logTrace(Object msg, Throwable thrown) { + this.log.trace(msg.toString(), thrown); + } + + public void logWarn(Object msg) { + this.log.warn(msg.toString()); + } + + public void logWarn(Object msg, Throwable thrown) { + this.log.warn(msg.toString(), thrown); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/StandardLogger.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/StandardLogger.java new file mode 100644 index 0000000..41605b2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/log/StandardLogger.java @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import java.util.Date; + +import com.mysql.cj.util.LogUtils; +import com.mysql.cj.util.Util; + +/** + * Provides main.logging facilities for those platforms that don't have built-in facilities. Simply logs messages to STDERR. + */ +public class StandardLogger implements Log { + private static final int FATAL = 0; + + private static final int ERROR = 1; + + private static final int WARN = 2; + + private static final int INFO = 3; + + private static final int DEBUG = 4; + + private static final int TRACE = 5; + + private boolean logLocationInfo = true; + + /** + * Creates a new StandardLogger object. + * + * @param name + * the name of the configuration to use -- ignored + */ + public StandardLogger(String name) { + this(name, false); + } + + /** + * @param name + * the name of the configuration to use -- ignored + * @param logLocationInfo + * logLocationInfo + */ + public StandardLogger(String name, boolean logLocationInfo) { + this.logLocationInfo = logLocationInfo; + } + + public boolean isDebugEnabled() { + return true; + } + + public boolean isErrorEnabled() { + return true; + } + + public boolean isFatalEnabled() { + return true; + } + + public boolean isInfoEnabled() { + return true; + } + + public boolean isTraceEnabled() { + return true; + } + + public boolean isWarnEnabled() { + return true; + } + + /** + * Logs the given message instance using the 'debug' level + * + * @param message + * the message to log + */ + public void logDebug(Object message) { + logInternal(DEBUG, message, null); + } + + /** + * Logs the given message and Throwable at the 'debug' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logDebug(Object message, Throwable exception) { + logInternal(DEBUG, message, exception); + } + + /** + * Logs the given message instance using the 'error' level + * + * @param message + * the message to log + */ + public void logError(Object message) { + logInternal(ERROR, message, null); + } + + /** + * Logs the given message and Throwable at the 'error' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logError(Object message, Throwable exception) { + logInternal(ERROR, message, exception); + } + + /** + * Logs the given message instance using the 'fatal' level + * + * @param message + * the message to log + */ + public void logFatal(Object message) { + logInternal(FATAL, message, null); + } + + /** + * Logs the given message and Throwable at the 'fatal' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logFatal(Object message, Throwable exception) { + logInternal(FATAL, message, exception); + } + + /** + * Logs the given message instance using the 'info' level + * + * @param message + * the message to log + */ + public void logInfo(Object message) { + logInternal(INFO, message, null); + } + + /** + * Logs the given message and Throwable at the 'info' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logInfo(Object message, Throwable exception) { + logInternal(INFO, message, exception); + } + + /** + * Logs the given message instance using the 'trace' level + * + * @param message + * the message to log + */ + public void logTrace(Object message) { + logInternal(TRACE, message, null); + } + + /** + * Logs the given message and Throwable at the 'trace' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logTrace(Object message, Throwable exception) { + logInternal(TRACE, message, exception); + } + + /** + * Logs the given message instance using the 'warn' level + * + * @param message + * the message to log + */ + public void logWarn(Object message) { + logInternal(WARN, message, null); + } + + /** + * Logs the given message and Throwable at the 'warn' level. + * + * @param message + * the message to log + * @param exception + * the throwable to log (may be null) + */ + public void logWarn(Object message, Throwable exception) { + logInternal(WARN, message, exception); + } + + protected String logInternal(int level, Object msg, Throwable exception) { + StringBuilder msgBuf = new StringBuilder(); + msgBuf.append(new Date().toString()); + msgBuf.append(" "); + + switch (level) { + case FATAL: + msgBuf.append("FATAL: "); + + break; + + case ERROR: + msgBuf.append("ERROR: "); + + break; + + case WARN: + msgBuf.append("WARN: "); + + break; + + case INFO: + msgBuf.append("INFO: "); + + break; + + case DEBUG: + msgBuf.append("DEBUG: "); + + break; + + case TRACE: + msgBuf.append("TRACE: "); + + break; + } + + if (msg instanceof ProfilerEvent) { + msgBuf.append(msg.toString()); + + } else { + if (this.logLocationInfo && level != TRACE) { + Throwable locationException = new Throwable(); + msgBuf.append(LogUtils.findCallingClassAndMethod(locationException)); + msgBuf.append(" "); + } + + if (msg != null) { + msgBuf.append(String.valueOf(msg)); + } + } + + if (exception != null) { + msgBuf.append("\n"); + msgBuf.append("\n"); + msgBuf.append("EXCEPTION STACK TRACE:"); + msgBuf.append("\n"); + msgBuf.append("\n"); + msgBuf.append(Util.stackTraceToString(exception)); + } + + String messageAsString = msgBuf.toString(); + + System.err.println(messageAsString); + + return messageAsString; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationPlugin.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationPlugin.java new file mode 100644 index 0000000..767e976 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationPlugin.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2012, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.util.List; + +import com.mysql.cj.callback.MysqlCallbackHandler; + +/** + * Implementors of this interface can be installed via the "authenticationPlugins" configuration property. + * + * The driver will create one instance of a given plugin per AuthenticationProvider instance if it's reusable (see {@link #isReusable()}) or a new instance + * in each NativeAuthenticationProvider#proceedHandshakeWithPluggableAuthentication(String, String, String, Buffer) call. + * + * @param + * Message type + */ +public interface AuthenticationPlugin { + + /** + * We need direct Protocol reference because it isn't available from Connection before authentication complete. + * + * @param protocol + * protocol instance + */ + default void init(Protocol protocol) { + } + + /** + * Initializes this plugin with a direct Protocol reference and a generic {@link MysqlCallbackHandler} that can be used to pass over information back to the + * authentication provider. + * For example an authentication plugin may accept null usernames and use that information to obtain them from some external source, such as + * the system login. + * + * @param protocol + * the protocol instance + * @param callbackHandler + * a callback handler to provide additional information to the authentication provider + */ + default void init(Protocol protocol, MysqlCallbackHandler callbackHandler) { + init(protocol); + } + + /** + * Resets the authentication steps sequence. + */ + default void reset() { + } + + /** + * Called by the driver when this extension should release any resources it is holding and cleanup internally before the connection is closed. + */ + default void destroy() { + } + + /** + * Returns the client-side name that the MySQL server uses on the wire for this plugin. + * + * @return plugin name + */ + String getProtocolPluginName(); + + /** + * Does this plugin require the connection itself to be confidential (i.e. tls/ssl)...Highly recommended to return "true" for plugins that return the + * credentials in the clear. + * + * @return true if secure connection is required + */ + boolean requiresConfidentiality(); + + /** + * @return true if plugin instance may be reused, false otherwise + */ + boolean isReusable(); + + /** + * This method called from Connector/J before first nextAuthenticationStep call. Values of user and password parameters are passed from those in + * NativeAuthenticationProvider#changeUser() or NativeAuthenticationProvider#connect(). + * + * Plugin should use these values instead of values from connection properties because parent method may be a changeUser call which saves user and password + * into connection only after successful handshake. + * + * @param user + * user name + * @param password + * user password + */ + void setAuthenticationParameters(String user, String password); + + /** + * Connector/J uses this method to identify the source of the authentication data, as an authentication plugin name, that will be available to the next + * authentication step(s). The source of the authentication data in the first iteration will always be the sever-side default authentication plugin name. + * In the following iterations this depends on the client-side default authentication plugin or on the successive Protocol::AuthSwitchRequest that may have + * been received in the meantime. + * + * Authentication plugin implementation can use this information to decide if the data coming from the server is useful to them or not. + * + * @param sourceOfAuthData + */ + default void setSourceOfAuthData(String sourceOfAuthData) { + // Do nothing by default. + } + + /** + * Process authentication handshake data from server and optionally produce data to be sent back to the server. + * The driver will keep calling this method on each new server packet arrival until either an Exception is thrown + * (authentication failure, please use appropriate SQLStates) or the number of exchange iterations exceeded max + * limit or an OK packet is sent by server indicating that the connection has been approved. + * + * If, on return from this method, toServer is a non-empty list of buffers, then these buffers will be sent to + * the server in the same order and without any reads in between them. If toServer is an empty list, no + * data will be sent to server, driver immediately reads the next packet from server. + * + * In case of errors the method should throw Exception. + * + * @param fromServer + * a buffer containing handshake data payload from + * server (can be empty). + * @param toServer + * list of buffers with data to be sent to the server + * (the list can be empty, but buffers in the list + * should contain data). + * + * @return return value is ignored. + */ + boolean nextAuthenticationStep(M fromServer, List toServer); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationProvider.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationProvider.java new file mode 100644 index 0000000..b841480 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/AuthenticationProvider.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public interface AuthenticationProvider { + + void init(Protocol prot, PropertySet propertySet, ExceptionInterceptor exceptionInterceptor); + + void connect(String username, String password, String database); + + /** + * Re-authenticates as the given user and password + * + * @param username + * user name + * @param password + * password + * @param database + * db name + */ + void changeUser(String username, String password, String database); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ColumnDefinition.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ColumnDefinition.java new file mode 100644 index 0000000..6f22a17 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ColumnDefinition.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.util.Map; + +import com.mysql.cj.result.Field; + +/** + * Represents protocol specific result set metadata, + * eg., for native protocol, Protocol::ColumnDefinition41 protocol entity. + * + */ +public interface ColumnDefinition extends ProtocolEntity { + + Field[] getFields(); + + void setFields(Field[] fields); + + /** + * Builds a hash between column names and their indices for fast retrieval. + * This is done lazily to support findColumn() and get*(String), as it + * can be more expensive than just retrieving result set values by ordinal + * index. + */ + void buildIndexMapping(); + + boolean hasBuiltIndexMapping(); + + public Map getColumnLabelToIndex(); + + void setColumnLabelToIndex(Map columnLabelToIndex); + + public Map getFullColumnNameToIndex(); + + void setFullColumnNameToIndex(Map fullColNameToIndex); + + public Map getColumnNameToIndex(); + + void setColumnNameToIndex(Map colNameToIndex); + + public Map getColumnToIndexCache(); + + public void setColumnToIndexCache(Map columnToIndexCache); + + void initializeFrom(ColumnDefinition columnDefinition); + + void exportTo(ColumnDefinition columnDefinition); + + int findColumn(String columnName, boolean useColumnNamesInFindColumn, int indexBase); + + /** + * Check if fields with type BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT or LONGTEXT exist in this ColumnDefinition. + * + * @return true if fields with type BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT or LONGTEXT exist in this ColumnDefinition. + */ + boolean hasLargeFields(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/FullReadInputStream.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/FullReadInputStream.java new file mode 100644 index 0000000..cdeb672 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/FullReadInputStream.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.EOFException; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +import com.mysql.cj.Messages; + +/** + * InputStream wrapper that provides methods to aggregate reads of a given size. c.f. readFully(byte[],int,int). + */ +public class FullReadInputStream extends FilterInputStream { + + public FullReadInputStream(InputStream underlyingStream) { + super(underlyingStream); + } + + public InputStream getUnderlyingStream() { + return this.in; + } + + public int readFully(byte[] b) throws IOException { + return readFully(b, 0, b.length); + } + + public int readFully(byte[] b, int off, int len) throws IOException { + if (len < 0) { + throw new IndexOutOfBoundsException(); + } + + int n = 0; + + while (n < len) { + int count = read(b, off + n, len - n); + + if (count < 0) { + throw new EOFException(Messages.getString("MysqlIO.EOF", new Object[] { Integer.valueOf(len), Integer.valueOf(n) })); + } + + n += count; + } + + return n; + } + + public long skipFully(long len) throws IOException { + if (len < 0) { + throw new IOException(Messages.getString("MysqlIO.105")); + } + + long n = 0; + + while (n < len) { + long count = skip(len - n); + + if (count < 0) { + throw new EOFException(Messages.getString("MysqlIO.EOF", new Object[] { Long.valueOf(len), Long.valueOf(n) })); + } + + n += count; + } + + return n; + } + + public int skipLengthEncodedInteger() throws IOException { + int sw = read() & 0xff; + + switch (sw) { + case 252: + return (int) skipFully(2) + 1; + + case 253: + return (int) skipFully(3) + 1; + + case 254: + return (int) skipFully(8) + 1; + + default: + return 1; + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalDate.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalDate.java new file mode 100644 index 0000000..42aff02 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalDate.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2019, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.time.LocalDate; +import java.util.Calendar; + +public class InternalDate { + + protected int year = 0; + protected int month = 0; + protected int day = 0; + + public static InternalDate from(LocalDate x) { + return new InternalDate(x.getYear(), x.getMonthValue(), x.getDayOfMonth()); + } + + public static InternalDate from(Calendar x) { + return new InternalDate(x.get(Calendar.YEAR), x.get(Calendar.MONTH) + 1, x.get(Calendar.DAY_OF_MONTH)); + } + + /** + * Constructs a zero date. + */ + public InternalDate() { + } + + public InternalDate(int year, int month, int day) { + this.year = year; + this.month = month; + this.day = day; + } + + public int getYear() { + return this.year; + } + + public void setYear(int year) { + this.year = year; + } + + public int getMonth() { + return this.month; + } + + public void setMonth(int month) { + this.month = month; + } + + public int getDay() { + return this.day; + } + + public void setDay(int day) { + this.day = day; + } + + public boolean isZero() { + return this.year == 0 && this.month == 0 && this.day == 0; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTime.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTime.java new file mode 100644 index 0000000..1690f87 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTime.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2019, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.util.Calendar; + +import com.mysql.cj.util.TimeUtil; + +public class InternalTime { + + private boolean negative = false; + private int hours = 0; + private int minutes = 0; + private int seconds = 0; + private int nanos = 0; + private int scale = 0; + + public static InternalTime from(LocalTime x) { + return new InternalTime(x.getHour(), x.getMinute(), x.getSecond(), x.getNano(), -1); + } + + public static InternalTime from(LocalDateTime x) { + return new InternalTime(x.getHour(), x.getMinute(), x.getSecond(), x.getNano(), -1); + } + + public static InternalTime from(OffsetTime x) { + return new InternalTime(x.getHour(), x.getMinute(), x.getSecond(), x.getNano(), -1); + } + + public static InternalTime from(Duration x) { + Duration durationAbs = x.abs(); + long fullSeconds = durationAbs.getSeconds(); + long fullMinutes = fullSeconds / 60; + long fullHours = fullMinutes / 60; + InternalTime internalTime = new InternalTime((int) fullHours, (int) (fullMinutes % 60), (int) (fullSeconds % 60), durationAbs.getNano(), -1); + internalTime.setNegative(x.isNegative()); + return internalTime; + } + + public static InternalTime from(Calendar x, int nanos) { + return new InternalTime(x.get(Calendar.HOUR_OF_DAY), x.get(Calendar.MINUTE), x.get(Calendar.SECOND), nanos, -1); + } + + /** + * Constructs a zero time + */ + public InternalTime() { + } + + public InternalTime(int hours, int minutes, int seconds, int nanos, int scale) { + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + this.nanos = nanos; + this.scale = scale; + } + + public boolean isNegative() { + return this.negative; + } + + public void setNegative(boolean negative) { + this.negative = negative; + } + + public int getHours() { + return this.hours; + } + + public void setHours(int hours) { + this.hours = hours; + } + + public int getMinutes() { + return this.minutes; + } + + public void setMinutes(int minutes) { + this.minutes = minutes; + } + + public int getSeconds() { + return this.seconds; + } + + public void setSeconds(int seconds) { + this.seconds = seconds; + } + + public int getNanos() { + return this.nanos; + } + + public void setNanos(int nanos) { + this.nanos = nanos; + } + + public boolean isZero() { + return this.hours == 0 && this.minutes == 0 && this.seconds == 0 && this.nanos == 0; + } + + public int getScale() { + return this.scale; + } + + public void setScale(int scale) { + this.scale = scale; + } + + @Override + public String toString() { + if (this.nanos > 0) { + return String.format("%02d:%02d:%02d.%s", this.hours, this.minutes, this.seconds, TimeUtil.formatNanos(this.nanos, this.scale, false)); + } + return String.format("%02d:%02d:%02d", this.hours, this.minutes, this.seconds); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTimestamp.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTimestamp.java new file mode 100644 index 0000000..3b60b5d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/InternalTimestamp.java @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2019, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; +import java.util.Calendar; +import java.util.concurrent.TimeUnit; + +public class InternalTimestamp extends InternalDate { + + private int hours = 0; + private int minutes = 0; + private int seconds = 0; + private int nanos = 0; + private int scale = 0; + private int offset = 0; + + public static InternalTimestamp from(LocalDate x) { + return new InternalTimestamp(x.getYear(), x.getMonthValue(), x.getDayOfMonth(), 0, 0, 0, 0, -1); + } + + public static InternalTimestamp from(LocalDateTime x) { + return new InternalTimestamp(x.getYear(), x.getMonthValue(), x.getDayOfMonth(), x.getHour(), x.getMinute(), x.getSecond(), x.getNano(), -1); + } + + public static InternalTimestamp from(OffsetDateTime x) { + InternalTimestamp internalTimestamp = new InternalTimestamp(x.getYear(), x.getMonthValue(), x.getDayOfMonth(), x.getHour(), x.getMinute(), + x.getSecond(), x.getNano(), -1); + internalTimestamp.setOffset((int) TimeUnit.SECONDS.toMinutes(x.getOffset().getTotalSeconds())); + return internalTimestamp; + } + + public static InternalTimestamp from(ZonedDateTime x) { + InternalTimestamp internalTimestamp = new InternalTimestamp(x.getYear(), x.getMonthValue(), x.getDayOfMonth(), x.getHour(), x.getMinute(), + x.getSecond(), x.getNano(), -1); + internalTimestamp.setOffset((int) TimeUnit.SECONDS.toMinutes(x.getOffset().getTotalSeconds())); + return internalTimestamp; + } + + public static InternalTimestamp from(Calendar x, int nanos) { + return new InternalTimestamp(x.get(Calendar.YEAR), x.get(Calendar.MONTH) + 1, x.get(Calendar.DAY_OF_MONTH), x.get(Calendar.HOUR_OF_DAY), + x.get(Calendar.MINUTE), x.get(Calendar.SECOND), nanos, -1); + } + + /** + * Constructs a zero datetime + */ + public InternalTimestamp() { + super(); + } + + public InternalTimestamp(int year, int month, int day, int hours, int minutes, int seconds, int nanos, int scale) { + this.year = year; + this.month = month; + this.day = day; + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + this.nanos = nanos; + this.scale = scale; + } + + public int getHours() { + return this.hours; + } + + public void setHours(int hours) { + this.hours = hours; + } + + public int getMinutes() { + return this.minutes; + } + + public void setMinutes(int minutes) { + this.minutes = minutes; + } + + public int getSeconds() { + return this.seconds; + } + + public void setSeconds(int seconds) { + this.seconds = seconds; + } + + public int getNanos() { + return this.nanos; + } + + public void setNanos(int nanos) { + this.nanos = nanos; + } + + public int getScale() { + return this.scale; + } + + public void setScale(int scale) { + this.scale = scale; + } + + public int getOffset() { + return this.offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + @Override + public boolean isZero() { + return super.isZero() && this.hours == 0 && this.minutes == 0 && this.seconds == 0 && this.nanos == 0; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Message.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Message.java new file mode 100644 index 0000000..069f958 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Message.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Message is the content of a full single message (native protocol packet or protobuf message), + * independent from on-wire splitting, communicated with the server. + */ +public interface Message { + + /** + * Returns the array of bytes this Buffer is using to read from. + * + * @return byte array being read from + */ + byte[] getByteBuffer(); + + /** + * Returns the current position to write to/ read from + * + * @return the current position to write to/ read from + */ + int getPosition(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageHeader.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageHeader.java new file mode 100644 index 0000000..a2fe5d0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageHeader.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.nio.ByteBuffer; + +/** + * Represents the protocol specific message header + */ +public interface MessageHeader { + + ByteBuffer getBuffer(); + + int getMessageSize(); + + byte getMessageSequence(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageListener.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageListener.java new file mode 100644 index 0000000..d59b42d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageListener.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +/** + * Sink for messages that are read asynchonously from the socket. + * + * Return whether the listener is done receiving messages. + * + * @param + * Message type + */ +public interface MessageListener { + + /** + * Process protocol message. + * + * @param message + * {@link Message} instance + * @return true - if this listener is done with processing the messages sequence and may be discarded; + * false - if the next message must be dispatched to the same listener + */ + default boolean processMessage(M message) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + /** + * Exceptionally complete underlying Future. + * + * @param ex + * exception to pass to underlying Future. + */ + void error(Throwable ex); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageReader.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageReader.java new file mode 100644 index 0000000..678c6ee --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageReader.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2018, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.util.Optional; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +public interface MessageReader { + + /** + * Read the next message header from server, possibly blocking indefinitely until the message is received. + * + * @return {@link MessageHeader} of the next message + * @throws IOException + * if an error occurs + */ + H readHeader() throws IOException; + + /** + * Read the next message header from server, possibly blocking indefinitely until the message is received, + * and cache it so that the next {@link #readHeader()} return the same header. + * + * @return {@link MessageHeader} of the next message + * @throws IOException + * if an error occurs + */ + default H probeHeader() throws IOException { + return readHeader(); + } + + /** + * Read message from server into to the given {@link Message} instance or into the new one if not present. + * For asynchronous channel it synchronously reads the next message in the stream, blocking until the message is read fully. + * Could throw CJCommunicationsException wrapping an {@link IOException} during read or parse + * + * @param reuse + * {@link Message} object to reuse. May be ignored by implementation. + * @param header + * {@link MessageHeader} instance + * @return {@link Message} instance + * @throws IOException + * if an error occurs + */ + M readMessage(Optional reuse, H header) throws IOException; + + /** + * Read message from server into to the given {@link Message} instance or into the new one if not present + * and cache it so that the next {@link #readMessage(Optional, MessageHeader)} return the same message. + * For asynchronous channel it synchronously reads the next message in the stream, blocking until the message is read fully. + * Could throw CJCommunicationsException wrapping an {@link IOException} during read or parse + * + * @param reuse + * {@link Message} object to reuse. May be ignored by implementation. + * @param header + * {@link MessageHeader} instance + * @return {@link Message} instance + * @throws IOException + * if an error occurs + */ + default M probeMessage(Optional reuse, H header) throws IOException { + return readMessage(reuse, header); + } + + /** + * Read message from server into to the given {@link Message} instance or into the new one if not present. + * For asynchronous channel it synchronously reads the next message in the stream, blocking until the message is read fully. + * Could throw WrongArgumentException if the expected message type is not the next message (exception will be thrown in *caller* context). + * + * @param reuse + * {@link Message} object to reuse. May be ignored by implementation. + * @param expectedType + * Expected type of message. + * @return {@link Message} instance + * @throws IOException + * if an error occurs + */ + default M readMessage(Optional reuse, int expectedType) throws IOException { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Queue a {@link MessageListener} to receive messages delivered asynchronously. + * + * @param l + * {@link MessageListener} + */ + default void pushMessageListener(MessageListener l) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Get last message sequence number, as it was stored by {@link #readHeader()}. + * + * @return number + */ + default byte getMessageSequence() { + return 0; + } + + /** + * Set stored message sequence number to 0. + */ + default void resetMessageSequence() { + // no-op + } + + /** + * Return a MessageReader instance free of decorators. + * + * @return {@link MessageReader} + */ + default MessageReader undecorateAll() { + return this; + } + + /** + * Return the previous MessageReader instance from the decorators chain or the current MessageReader + * if it is the first entry in a chain. + * + * @return {@link MessageReader} + */ + default MessageReader undecorate() { + return this; + } + + /** + * Start reading messages reader from the provided channel. + */ + default void start() { + // no-op + } + + /** + * Signal to the reader that it should stop reading messages after reading the next message. + */ + default void stopAfterNextMessage() { + // no-op + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageSender.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageSender.java new file mode 100644 index 0000000..a28ff09 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/MessageSender.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +/** + * This interface provides a facility for sending messages to server. The destination, transmission method, etc are determined by the implementation. + * + * @param + * Message type + */ +public interface MessageSender { + + /** + * Synchronously send the message to server. + * + * @param message + * byte array containing a message + * @param messageLen + * length of the message + * @param messageSequence + * message sequence index (used in a native protocol) + * @throws IOException + * if an error occurs + */ + default void send(byte[] message, int messageLen, byte messageSequence) throws IOException { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Synchronously send the message to server. + * + * @param message + * {@link Message} instance + */ + default void send(M message) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Asynchronously write a message with a notification being delivered to callback upon completion of write of entire message. + * + * @param message + * message extending {@link Message} + * @param future + * a Future returning operation result + * @param callback + * a callback to receive notification of when the message is completely written + * @return result + */ + default CompletableFuture send(M message, CompletableFuture future, Runnable callback) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Set max allowed packet size. + * + * @param maxAllowedPacket + * max allowed packet size + */ + default void setMaxAllowedPacket(int maxAllowedPacket) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Return a PacketSender instance free of decorators. + * + * @return + * {@link MessageSender} instance + */ + default MessageSender undecorateAll() { + return this; + } + + /** + * Return the previous PacketSender instance from the decorators chain or the current PacketSender + * if it is the first entry in a chain. + * + * @return + * {@link MessageSender} instance + */ + default MessageSender undecorate() { + return this; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/NetworkResources.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/NetworkResources.java new file mode 100644 index 0000000..469649b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/NetworkResources.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2012, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +public class NetworkResources { + private final Socket mysqlConnection; + private final InputStream mysqlInput; + private final OutputStream mysqlOutput; + + public NetworkResources(Socket mysqlConnection, InputStream mysqlInput, OutputStream mysqlOutput) { + this.mysqlConnection = mysqlConnection; + this.mysqlInput = mysqlInput; + this.mysqlOutput = mysqlOutput; + } + + /** + * Forcibly closes the underlying socket to MySQL. + */ + public final void forceClose() { + try { + if (!ExportControlled.isSSLEstablished(this.mysqlConnection)) { // Fix for Bug#56979 does not apply to secure sockets. + try { + if (this.mysqlInput != null) { + this.mysqlInput.close(); + } + } finally { + if (this.mysqlConnection != null && !this.mysqlConnection.isClosed() && !this.mysqlConnection.isInputShutdown()) { + try { + this.mysqlConnection.shutdownInput(); + } catch (UnsupportedOperationException e) { + // Ignore, some sockets do not support this method. + } + } + } + } + } catch (IOException e) { + // Can't do anything constructive about this. + } + + try { + if (!ExportControlled.isSSLEstablished(this.mysqlConnection)) { // Fix for Bug#56979 does not apply to secure sockets. + try { + if (this.mysqlOutput != null) { + this.mysqlOutput.close(); + } + } finally { + if (this.mysqlConnection != null && !this.mysqlConnection.isClosed() && !this.mysqlConnection.isOutputShutdown()) { + try { + this.mysqlConnection.shutdownOutput(); + } catch (UnsupportedOperationException e) { + // Ignore, some sockets do not support this method. + } + } + } + } + } catch (IOException e) { + // Can't do anything constructive about this. + } + + try { + if (this.mysqlConnection != null) { + this.mysqlConnection.close(); + } + } catch (IOException e) { + // Can't do anything constructive about this. + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/OutputStreamWatcher.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/OutputStreamWatcher.java new file mode 100644 index 0000000..fbb6ac2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/OutputStreamWatcher.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Objects that want to be notified of lifecycle events on a WatchableOutputStream should implement this interface, and register themselves with setWatcher() + * on the WatchableOutputStream instance. + */ +public interface OutputStreamWatcher { + /** + * Called when the OutputStream being watched has .close() called + * + * @param out + * {@link WatchableStream} + */ + void streamClosed(WatchableStream out); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketReceivedTimeHolder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketReceivedTimeHolder.java new file mode 100644 index 0000000..995be98 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketReceivedTimeHolder.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Holds the time the last packet was received. + */ +public interface PacketReceivedTimeHolder { + default long getLastPacketReceivedTime() { + return 0; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketSentTimeHolder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketSentTimeHolder.java new file mode 100644 index 0000000..a59fbd5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/PacketSentTimeHolder.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Holds the time the last packet was sent. + */ +public interface PacketSentTimeHolder { + + /** + * Returns the send time of a very recent packet. + * Should be used in exception generation when the send operation failed. + * + * @return very recent packet send time + */ + default long getLastPacketSentTime() { + return 0; + } + + /** + * Returns the send time of a previous packet. + * Should be used in exception generation when the send operation was successful + * but the following read operation failed. + * + * @return previous packet send time + */ + default long getPreviousPacketSentTime() { + return 0; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Protocol.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Protocol.java new file mode 100644 index 0000000..91a1d3c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Protocol.java @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.io.InputStream; +import java.util.function.Supplier; + +import com.mysql.cj.MessageBuilder; +import com.mysql.cj.QueryResult; +import com.mysql.cj.Session; +import com.mysql.cj.TransactionEventHandler; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.protocol.Protocol.ProtocolEventListener.EventType; + +/** + * A protocol provides the facilities to communicate with a MySQL server. + * + * @param + * Message type + */ +public interface Protocol { + + /** + * Init method takes the place of constructor. + * + * A constructor should be used unless the encapsulation of ProtocolFactory is necessary. + * + * @param session + * {@link Session} + * @param socketConnection + * {@link SocketConnection} + * @param propertySet + * {@link PropertySet} + * @param transactionManager + * {@link TransactionEventHandler} + */ + void init(Session session, SocketConnection socketConnection, PropertySet propertySet, TransactionEventHandler transactionManager); + + PropertySet getPropertySet(); + + void setPropertySet(PropertySet propertySet); + + MessageBuilder getMessageBuilder(); + + /** + * Retrieve ServerCapabilities from server. + * + * @return {@link ServerCapabilities} + */ + ServerCapabilities readServerCapabilities(); + + ServerSession getServerSession(); + + SocketConnection getSocketConnection(); + + AuthenticationProvider getAuthenticationProvider(); + + ExceptionInterceptor getExceptionInterceptor(); + + PacketSentTimeHolder getPacketSentTimeHolder(); + + void setPacketSentTimeHolder(PacketSentTimeHolder packetSentTimeHolder); + + PacketReceivedTimeHolder getPacketReceivedTimeHolder(); + + void setPacketReceivedTimeHolder(PacketReceivedTimeHolder packetReceivedTimeHolder); + + /** + * Create a new session. This generally happens once at the beginning of a connection. + * + * @param user + * DB user name + * @param password + * DB user password + * @param database + * database name + */ + void connect(String user, String password, String database); + + void negotiateSSLConnection(); + + void beforeHandshake(); + + void afterHandshake(); + + void changeDatabase(String database); + + /** + * Re-authenticates as the given user and password + * + * @param user + * DB user name + * @param password + * DB user password + * @param database + * database name + * + */ + void changeUser(String user, String password, String database); + + boolean versionMeetsMinimum(int major, int minor, int subminor); + + /** + * Read one message from the MySQL server into the reusable buffer if provided or into the new one. + * + * @param reuse + * {@link Message} instance to read into, may be null + * @return the message from the server. + */ + M readMessage(M reuse); + + /** + * Read one message from the MySQL server, checks for errors in it, and if none, + * returns the message, ready for reading + * + * @return a message ready for reading. + */ + M checkErrorMessage(); + + /** + * @param message + * {@link Message} instance + * @param packetLen + * length of header + payload + */ + void send(Message message, int packetLen); + + ColumnDefinition readMetadata(); + + /** + * Send a command to the MySQL server. + * + * @param queryPacket + * a packet pre-loaded with data for the protocol (eg. + * from a client-side prepared statement). The first byte of + * this packet is the MySQL protocol 'command' from MysqlDefs + * @param skipCheck + * do not call checkErrorPacket() if true + * @param timeoutMillis + * timeout + * + * @return the response packet from the server + * + * @throws CJException + * if an I/O error or SQL error occurs + */ + + M sendCommand(Message queryPacket, boolean skipCheck, int timeoutMillis); + + T read(Class requiredClass, ProtocolEntityFactory protocolEntityFactory) throws IOException; + + /** + * Read protocol entity. + * + * @param requiredClass + * required Resultset class + * @param maxRows + * the maximum number of rows to read (-1 means all rows) + * @param streamResults + * should the driver leave the results on the wire, + * and read them only when needed? + * @param resultPacket + * the first packet of information in the result set + * @param isBinaryEncoded + * true if the binary protocol is used (for server prepared statements) + * @param metadata + * use this metadata instead of the one provided on wire + * @param protocolEntityFactory + * {@link ProtocolEntityFactory} instance + * @param + * object extending the {@link ProtocolEntity} + * @return + * {@link ProtocolEntity} instance + * @throws IOException + * if an error occurs + */ + T read(Class requiredClass, int maxRows, boolean streamResults, M resultPacket, boolean isBinaryEncoded, + ColumnDefinition metadata, ProtocolEntityFactory protocolEntityFactory) throws IOException; + + /** + * Sets an InputStream instance that will be used to send data + * to the MySQL server for a "LOAD DATA LOCAL INFILE" statement + * rather than a FileInputStream or URLInputStream that represents + * the path given as an argument to the statement. + * + * This stream will be read to completion upon execution of a + * "LOAD DATA LOCAL INFILE" statement, and will automatically + * be closed by the driver, so it needs to be reset + * before each call to execute*() that would cause the MySQL + * server to request data to fulfill the request for + * "LOAD DATA LOCAL INFILE". + * + * If this value is set to NULL, the driver will revert to using + * a FileInputStream or URLInputStream as required. + * + * @param stream + * input stream + */ + void setLocalInfileInputStream(InputStream stream); + + /** + * Returns the InputStream instance that will be used to send + * data in response to a "LOAD DATA LOCAL INFILE" statement. + * + * This method returns NULL if no such stream has been set + * via setLocalInfileInputStream(). + * + * @return input stream + */ + InputStream getLocalInfileInputStream(); + + /** + * Returns the comment that will be prepended to all statements + * sent to the server. + * + * @return query comment string + */ + String getQueryComment(); + + /** + * Sets the comment that will be prepended to all statements + * sent to the server. Do not use slash-star or star-slash tokens + * in the comment as these will be added by the driver itself. + * + * @param comment + * query comment string + */ + void setQueryComment(String comment); + + /** + * Read messages from server and deliver them to resultBuilder. + * + * @param resultBuilder + * {@link ResultBuilder} instance + * @param + * result type + * @return {@link QueryResult} + */ + T readQueryResult(ResultBuilder resultBuilder); + + void close() throws IOException; + + void configureTimeZone(); + + void initServerSession(); + + /** + * Return Protocol to its initial state right after successful connect. + */ + void reset(); + + String getQueryTimingUnits(); + + public static interface ProtocolEventListener { + + public enum EventType { + SERVER_SHUTDOWN, SERVER_CLOSED_SESSION; + } + + void handleEvent(EventType type, Object info, Throwable reason); + } + + public static interface ProtocolEventHandler { + /** + * Add listener for this protocol events. + * + * @param l + * {@link ProtocolEventListener} instance. + */ + void addListener(ProtocolEventListener l); + + /** + * Remove protocol listener. + * + * @param l + * {@link ProtocolEventListener} instance. + */ + void removeListener(ProtocolEventListener l); + + void invokeListeners(EventType type, Throwable reason); + } + + Supplier getValueEncoderSupplier(Object obj); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntity.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntity.java new file mode 100644 index 0000000..2f6c155 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntity.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +public interface ProtocolEntity { + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityFactory.java new file mode 100644 index 0000000..b0bafb8 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityFactory.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +public interface ProtocolEntityFactory { + + /** + * Create ProtocolEntity of type {@link T} from protocol message. + * + * @param message + * {@link Message} instance + * @return T + */ + default T createFromMessage(M message) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + default Resultset.Type getResultSetType() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + default Resultset.Concurrency getResultSetConcurrency() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + default int getFetchSize() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + /** + * Create object from protocol entity. + * + * @param protocolEntity + * the {@link ProtocolEntity} to create from + * @return a new ProtocolEntity + */ + default T createFromProtocolEntity(ProtocolEntity protocolEntity) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityReader.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityReader.java new file mode 100644 index 0000000..593319d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ProtocolEntityReader.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +public interface ProtocolEntityReader { + + /** + * + * @param sf + * {@link ProtocolEntityFactory} instance + * @return {@link ProtocolEntity} instance + * @throws IOException + * if an error occurs + */ + default T read(ProtocolEntityFactory sf) throws IOException { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + + /** + * Reads one result set off of the wire, if the result is actually an + * update count, creates an update-count only result set. + * + * @param maxRows + * the maximum number of rows to read (-1 means all rows) + * @param streamResults + * should the driver leave the results on the wire, + * and read them only when needed? + * @param resultPacket + * the first packet of information in the result set + * @param metadata + * use this metadata instead of the one provided on wire + * @param protocolEntityFactory + * {@link ProtocolEntityFactory} instance + * + * @return a result set that either represents the rows, or an update count + * + * @throws IOException + * if an error occurs while reading the rows + */ + default T read(int maxRows, boolean streamResults, M resultPacket, ColumnDefinition metadata, ProtocolEntityFactory protocolEntityFactory) + throws IOException { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not allowed"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultBuilder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultBuilder.java new file mode 100644 index 0000000..ce6c900 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultBuilder.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Classes implementing this interface are responsible for building result of specific type from incoming ProtocolEntity objects. + * + * @param + * result type + */ +public interface ResultBuilder { + + /** + * Add ProtocolEntity. + * + * @param entity + * {@link ProtocolEntity} object + * @return true - if this builder is ready for building the result; + * false - if another ProtocolEntity is required + */ + boolean addProtocolEntity(ProtocolEntity entity); + + /** + * Build the result using already added protocol instances. + * + * @return {@link T} instance + */ + T build(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultStreamer.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultStreamer.java new file mode 100644 index 0000000..5c196b4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultStreamer.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * A result streamer is a result object that is streaming results from the current connection. It allows to stream as long as nothing else needs to happen on + * the connection. Once something else needs to happen the streamed is notified to "complete streaming" at which point he can throw an exception, discard rows, + * buffer rows, etc. The connection is then free to execute the next command. + */ +public interface ResultStreamer { + /** + * Finish the result streaming. This happens if a new command is started or the warnings/etc are requested. This is safe to call multiple times and only has + * an effect the first time. + */ + void finishStreaming(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Resultset.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Resultset.java new file mode 100644 index 0000000..4725e25 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Resultset.java @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Represents protocol specific result set, + * eg., for native protocol, a ProtocolText::Resultset or ProtocolBinary::Resultset entity. + * + * See: + * http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset + * http://dev.mysql.com/doc/internals/en/binary-protocol-resultset.html + * + */ +public interface Resultset extends ProtocolEntity { + + public enum Concurrency { + /** + * The constant indicating the concurrency mode for a + * Resultset object that may NOT be updated. + */ + READ_ONLY(java.sql.ResultSet.CONCUR_READ_ONLY), + + /** + * The constant indicating the concurrency mode for a + * Resultset object that may be updated. + */ + UPDATABLE(java.sql.ResultSet.CONCUR_UPDATABLE); + + private int value; + + private Concurrency(int jdbcRsConcur) { + this.value = jdbcRsConcur; + } + + public int getIntValue() { + return this.value; + } + + public static Concurrency fromValue(int concurMode, Concurrency backupValue) { + for (Concurrency c : values()) { + if (c.getIntValue() == concurMode) { + return c; + } + } + return backupValue; + } + + } + + public enum Type { + /** + * The constant indicating the type for a Resultset object + * whose cursor may move only forward. + */ + FORWARD_ONLY(java.sql.ResultSet.TYPE_FORWARD_ONLY), + + /** + * The constant indicating the type for a Resultset object + * that is scrollable but generally not sensitive to changes to the data + * that underlies the Resultset. + */ + SCROLL_INSENSITIVE(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE), + + /** + * The constant indicating the type for a Resultset object + * that is scrollable and generally sensitive to changes to the data + * that underlies the Resultset. + */ + SCROLL_SENSITIVE(java.sql.ResultSet.TYPE_SCROLL_SENSITIVE); + + private int value; + + private Type(int jdbcRsType) { + this.value = jdbcRsType; + } + + public int getIntValue() { + return this.value; + } + + public static Type fromValue(int rsType, Type backupValue) { + for (Type t : values()) { + if (t.getIntValue() == rsType) { + return t; + } + } + return backupValue; + } + } + + /** + * Sometimes the driver doesn't have metadata before consuming the result set rows (because it's cached), + * or need to coerce the metadata returned by queries into that required by the particular specification + * (eg metadata returned by metadata queries into that required by the JDBC specification). + * So it can call this to set it after the fact. + * + * @param metadata + * field-level metadata for the result set + */ + void setColumnDefinition(ColumnDefinition metadata); + + ColumnDefinition getColumnDefinition(); + + /** + * Does the result set contain rows, or is it the result of a DDL or DML statement? + * + * @return true if result set contains rows + */ + boolean hasRows(); + + ResultsetRows getRows(); + + /** + * Set metadata of this Resultset to ResultsetRows it contains. + */ + void initRowsWithMetadata(); + + /** + * The id (used when profiling) to identify us + * + * @return result id + */ + int getResultId(); + + /** + * @param nextResultset + * Sets the next result set in the result set chain for multiple result sets. + */ + void setNextResultset(Resultset nextResultset); + + /** + * Returns the next ResultSet in a multi-resultset "chain", if any, + * null if none exists. + * + * @return the next Resultset + */ + Resultset getNextResultset(); + + /** + * Clears the reference to the next result set in a multi-result set + * "chain". + */ + void clearNextResultset(); + + /** + * Returns the update count for this result set (if one exists), otherwise + * -1. + * + * @return return the update count for this result set (if one exists), otherwise + * -1. + */ + long getUpdateCount(); + + /** + * Returns the AUTO_INCREMENT value for the DDL/DML statement which created + * this result set. + * + * @return the AUTO_INCREMENT value for the DDL/DML statement which created + * this result set. + */ + long getUpdateID(); + + /** + * Returns the server informational message returned from a DDL or DML + * statement (if any), or null if none. + * + * @return the server informational message + */ + String getServerInfo(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRow.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRow.java new file mode 100644 index 0000000..51df317 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRow.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.result.Row; + +/** + * Classes that implement this interface represent one row of data from the MySQL server that might be stored in different ways depending on whether the result + * set was streaming (so they wrap a reusable packet), or whether the result set was cached or via a server-side cursor (so they represent a byte[][]). + * + * Notice that no bounds checking is expected for implementors of this interface, it happens in ResultSetImpl. + */ +public interface ResultsetRow extends Row, ProtocolEntity { + + default boolean isBinaryEncoded() { + return false; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRows.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRows.java new file mode 100644 index 0000000..2050593 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRows.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.result.Row; +import com.mysql.cj.result.RowList; + +/** + * This interface abstracts away how row data is accessed by the result set. It is meant to allow a static implementation (Current version), and a streaming + * one. It extends the {@link RowList} functionality by providing row positioning, updatability and ownership. + */ +public interface ResultsetRows extends RowList, ProtocolEntity { + + /** + * Adds a row. + * + * @param row + * the row to add + */ + default void addRow(Row row) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Moves to after last. + * + */ + default void afterLast() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Moves to before first. + * + */ + default void beforeFirst() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Moves to before last. + * + */ + default void beforeLast() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * We're done. + * + */ + default void close() { + } + + /** + * Returns the result set that 'owns' this RowData + * + * @return {@link ResultsetRowsOwner} + */ + ResultsetRowsOwner getOwner(); + + /** + * Returns true if we got the last element. + * + * @return true if after last row + */ + boolean isAfterLast(); + + /** + * Returns if iteration has not occured yet. + * + * @return true if before first row + */ + boolean isBeforeFirst(); + + /** + * Returns true if the result set is dynamic. + * + * This means that move back and move forward won't work because we do not + * hold on to the records. + * + * @return true if this result set is streaming from the server + */ + default boolean isDynamic() { + return true; + } + + /** + * Has no records. + * + * @return true if no records + */ + default boolean isEmpty() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Are we on the first row of the result set? + * + * @return true if on first row + */ + default boolean isFirst() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Are we on the last row of the result set? + * + * @return true if on last row + */ + default boolean isLast() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Moves the current position relative 'rows' from the current position. + * + * @param rows + * the relative number of rows to move + */ + default void moveRowRelative(int rows) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Moves the current position in the result set to the given row number. + * + * @param rowNumber + * row to move to + */ + default void setCurrentRow(int rowNumber) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Set the result set that 'owns' this RowData + * + * @param rs + * the result set that 'owns' this RowData + */ + void setOwner(ResultsetRowsOwner rs); + + /** + * Did this result set have no rows? + * + * @return true if the result set did not have rows + */ + boolean wasEmpty(); + + /** + * Sometimes the driver doesn't have metadata until after + * the statement has the result set in-hand (because it's cached), + * so it can call this to set it after the fact. + * + * @param columnDefinition + * field-level metadata for the result set + */ + void setMetadata(ColumnDefinition columnDefinition); + + ColumnDefinition getMetadata(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRowsOwner.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRowsOwner.java new file mode 100644 index 0000000..3cd4628 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ResultsetRowsOwner.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.MysqlConnection; +import com.mysql.cj.Query; +import com.mysql.cj.Session; + +public interface ResultsetRowsOwner { + + void closeOwner(boolean calledExplicitly); + + MysqlConnection getConnection(); + + Session getSession(); + + Object getSyncMutex(); + + /** + * StackTrace generated where ResultSet was created... used when profiling + * + * @return string representation of a stack trace + */ + String getPointOfOrigin(); + + int getOwnerFetchSize(); + + Query getOwningQuery(); + + int getOwningStatementMaxRows(); + + int getOwningStatementFetchSize(); + + long getOwningStatementServerId(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerCapabilities.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerCapabilities.java new file mode 100644 index 0000000..756ec55 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerCapabilities.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.ServerVersion; + +/** + * Represents server capabilities, retrieved right after creating physical connection and before handshake. + */ +public interface ServerCapabilities { + + int getCapabilityFlags(); + + void setCapabilityFlags(int capabilityFlags); + + ServerVersion getServerVersion(); + + long getThreadId(); + + void setThreadId(long threadId); + + boolean serverSupportsFracSecs(); + + int getServerDefaultCollationIndex(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSession.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSession.java new file mode 100644 index 0000000..1fdea18 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSession.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.util.Map; +import java.util.TimeZone; + +import com.mysql.cj.CharsetSettings; +import com.mysql.cj.ServerVersion; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +/** + * Keeps the effective states of server/session variables, + * contains methods for initial retrieving of these states and for their actualization. + */ +public interface ServerSession { + + /** + * There was no change between old and current SERVER_STATUS_IN_TRANS state and it is 0. + */ + public static int TRANSACTION_NOT_STARTED = 0; + + /** + * There was no change between old and current SERVER_STATUS_IN_TRANS state and it is 1. + */ + public static int TRANSACTION_IN_PROGRESS = 1; + + /** + * Old SERVER_STATUS_IN_TRANS state was 0 and current one is 1. + */ + public static int TRANSACTION_STARTED = 2; + + /** + * Old SERVER_STATUS_IN_TRANS state was 1 and current one is 0. + */ + public static int TRANSACTION_COMPLETED = 3; + + ServerCapabilities getCapabilities(); + + void setCapabilities(ServerCapabilities capabilities); + + int getStatusFlags(); + + /** + * Sets new server status (from response) without saving it's old state + * + * @param statusFlags + * server status flags + */ + void setStatusFlags(int statusFlags); + + /** + * Sets new server status (from response) + * + * @param statusFlags + * new server status flags + * @param saveOldStatusFlags + * true if old server status flags should be preserved + */ + void setStatusFlags(int statusFlags, boolean saveOldStatusFlags); + + int getOldStatusFlags(); + + void setOldStatusFlags(int statusFlags); + + /** + * + * @return TRANSACTION_NOT_STARTED, TRANSACTION_IN_PROGRESS, TRANSACTION_STARTED or TRANSACTION_COMPLETED + */ + int getTransactionState(); + + boolean inTransactionOnServer(); + + /** + * Server will only open a cursor and set this flag if it can, otherwise it punts and goes back to mysql_store_results() behavior. + * + * @return SERVER_STATUS_CURSOR_EXISTS status flag value. + */ + boolean cursorExists(); + + boolean isAutocommit(); + + boolean hasMoreResults(); + + boolean isLastRowSent(); + + boolean noGoodIndexUsed(); + + boolean noIndexUsed(); + + boolean queryWasSlow(); + + long getClientParam(); + + void setClientParam(long clientParam); + + boolean hasLongColumnInfo(); + + boolean useMultiResults(); + + boolean isEOFDeprecated(); + + boolean supportsQueryAttributes(); + + Map getServerVariables(); + + String getServerVariable(String name); + + int getServerVariable(String variableName, int fallbackValue); + + void setServerVariables(Map serverVariables); + + /** + * Get the version of the MySQL server we are talking to. + * + * @return {@link ServerVersion} + */ + ServerVersion getServerVersion(); + + /** + * Is the version of the MySQL server we are connected to the given + * version? + * + * @param version + * the version to check for + * + * @return true if the version of the MySQL server we are connected is the + * given version + */ + boolean isVersion(ServerVersion version); + + /** + * Is the server configured to use lower-case table names only? + * + * @return true if lower_case_table_names is 'on' + */ + boolean isLowerCaseTableNames(); + + boolean storesLowerCaseTableNames(); + + boolean isQueryCacheEnabled(); + + boolean isNoBackslashEscapesSet(); + + boolean useAnsiQuotedIdentifiers(); + + public boolean isServerTruncatesFracSecs(); + + boolean isAutoCommit(); + + void setAutoCommit(boolean autoCommit); + + TimeZone getSessionTimeZone(); + + void setSessionTimeZone(TimeZone sessionTimeZone); + + /** + * The default time zone used to marshal date/time values to/from the server. This is used when methods like getDate() are called without a calendar + * argument. + * + * @return The default JVM time zone + */ + TimeZone getDefaultTimeZone(); + + default ServerSessionStateController getServerSessionStateController() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + CharsetSettings getCharsetSettings(); + + void setCharsetSettings(CharsetSettings charsetSettings); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSessionStateController.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSessionStateController.java new file mode 100644 index 0000000..e8b0451 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ServerSessionStateController.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.util.ArrayList; +import java.util.List; + +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +public interface ServerSessionStateController { + public static int SESSION_TRACK_SYSTEM_VARIABLES = 0x00; + public static int SESSION_TRACK_SCHEMA = 0x01; + public static int SESSION_TRACK_STATE_CHANGE = 0x02; + public static int SESSION_TRACK_GTIDS = 0x03; + public static int SESSION_TRACK_TRANSACTION_CHARACTERISTICS = 0x04; + public static int SESSION_TRACK_TRANSACTION_STATE = 0x05; + + /** + * Set the object containing server session changes collected from the latest query execution. Used internally. + * + * @param changes + * {@link ServerSessionStateChanges} object. + * + */ + default void setSessionStateChanges(ServerSessionStateChanges changes) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Get the object containing server session changes collected from the latest query execution. + *

    + * Please note that the driver could issue some queries internally. With that there is no guarantee that all session changes are reflected in the + * {@link ServerSessionStateChanges} object after the recent user's query. If this is an issue, a {@link SessionStateChangesListener} can be added via + * {@link #addSessionStateChangesListener(SessionStateChangesListener)} to catch all session changes. + *

    + * + * @return {@link ServerSessionStateChanges} object. + */ + default ServerSessionStateChanges getSessionStateChanges() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @FunctionalInterface + public static interface SessionStateChangesListener { + void handleSessionStateChanges(ServerSessionStateChanges changes); + } + + /** + * Add the {@link SessionStateChangesListener} that will process {@link ServerSessionStateChanges} on it's arrival. + * + * @param l + * {@link SessionStateChangesListener} object. + */ + default void addSessionStateChangesListener(SessionStateChangesListener l) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * Remove {@link SessionStateChangesListener}. + * + * @param l + * {@link SessionStateChangesListener} object. + */ + default void removeSessionStateChangesListener(SessionStateChangesListener l) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + /** + * The object containing server session changes collected from the latest query execution. + *

    + * Driver is getting these changes when connection property trackSessionState=true and server supports session tracking. + *

    + * + */ + public static interface ServerSessionStateChanges { + List getSessionStateChangesList(); + } + + /** + * A single server session change record. + *

    + * The server messages about session changes are parsed according to their known types: + *

      + *
    • {@link #SESSION_TRACK_SYSTEM_VARIABLES} - two values, the system variable name and it's new value;
    • + *
    • {@link #SESSION_TRACK_SCHEMA} - single value, the new schema name;
    • + *
    • {@link #SESSION_TRACK_STATE_CHANGE} - single value, "1" or "0";
    • + *
    • {@link #SESSION_TRACK_GTIDS} - single value, list of GTIDs as reported by server;
    • + *
    • {@link #SESSION_TRACK_TRANSACTION_CHARACTERISTICS} - single value, transaction characteristics statement;
    • + *
    • {@link #SESSION_TRACK_TRANSACTION_STATE} - single value, transaction state record.
    • + *
    + * For the unknown change type the raw payload is written into the single value. + *

    + *

    + * See more details in the server documentation. + *

    + */ + public static class SessionStateChange { + private int type; + private List values = new ArrayList<>(); + + public SessionStateChange(int type) { + this.type = type; + } + + public int getType() { + return this.type; + } + + public List getValues() { + return this.values; + } + + public SessionStateChange addValue(String value) { + this.values.add(value); + return this; + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketConnection.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketConnection.java new file mode 100644 index 0000000..9bc86ec --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketConnection.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.Socket; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.FeatureNotAvailableException; +import com.mysql.cj.exceptions.SSLParamsException; +import com.mysql.cj.log.Log; + +/** + * Represents physical connection with endpoint + */ +public interface SocketConnection { + + /** + * Connect to the MySQL server and setup a stream connection. + * + * @param host + * the hostname to connect to + * @param port + * the port number that the server is listening on + * @param propertySet + * the PropertySet with required connection options + * @param exceptionInterceptor + * exception interceptor + * @param log + * logger + * @param loginTimeout + * the driver login time limit in milliseconds + */ + void connect(String host, int port, PropertySet propertySet, ExceptionInterceptor exceptionInterceptor, Log log, int loginTimeout); + + void performTlsHandshake(ServerSession serverSession) throws SSLParamsException, FeatureNotAvailableException, IOException; + + /** + * Start a TLS handshake + * + * @param serverSession + * server session state object + * @param log + * logger + * @throws SSLParamsException + * @throws FeatureNotAvailableException + * @throws IOException + */ + default void performTlsHandshake(ServerSession serverSession, Log log) throws SSLParamsException, FeatureNotAvailableException, IOException { + performTlsHandshake(serverSession); + } + + void forceClose(); + + NetworkResources getNetworkResources(); + + /** + * Returns the host this IO is connected to + * + * @return host name + */ + String getHost(); + + int getPort(); + + Socket getMysqlSocket() throws IOException; + + FullReadInputStream getMysqlInput() throws IOException; + + void setMysqlInput(FullReadInputStream mysqlInput); + + BufferedOutputStream getMysqlOutput() throws IOException; + + boolean isSSLEstablished(); + + SocketFactory getSocketFactory(); + + void setSocketFactory(SocketFactory socketFactory); + + ExceptionInterceptor getExceptionInterceptor(); + + PropertySet getPropertySet(); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketFactory.java new file mode 100644 index 0000000..2bf4348 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketFactory.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2002, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.Closeable; +import java.io.IOException; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.log.Log; + +/** + * Interface to allow pluggable socket creation in the driver + */ +public interface SocketFactory extends SocketMetadata { + + /** + * Creates a new socket or channel using the given properties. Properties are parsed by + * the driver from the URL. All properties other than sensitive ones (user + * and password) are passed to this method. The driver will instantiate the + * socket factory with the class name given in the property + * "socketFactory", where the standard is com.mysql.cj.protocol.StandardSocketFactory Implementing classes + * are responsible for handling synchronization of this method (if needed). + * + * @param host + * the hostname passed in the URL. It will be a single + * hostname, as the driver parses multi-hosts (for failover) and + * calls this method for each host connection attempt. + * + * @param portNumber + * the port number to connect to (if required). + * + * @param props + * properties passed to the driver via the URL and/or properties + * instance. + * @param loginTimeout + * login timeout in milliseconds + * @param + * result type + * + * @return a socket connected to the given host + * @throws IOException + * if an I/O error occurs + */ + T connect(String host, int portNumber, PropertySet props, int loginTimeout) throws IOException; + + /** + * Called by the driver before issuing the MySQL protocol handshake. + * + * @throws IOException + * if an I/O error occurs + */ + default void beforeHandshake() throws IOException { + } + + /** + * If required, called by the driver during MySQL protocol handshake to transform + * original socket to SSL socket and perform TLS handshake. + * + * @param socketConnection + * current SocketConnection + * @param serverSession + * current ServerSession + * @param + * result type + * @return SSL socket + * @throws IOException + * if an I/O error occurs + */ + T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession) throws IOException; + + /** + * If required, called by the driver during MySQL protocol handshake to transform + * original socket to SSL socket and perform TLS handshake. + * + * @param socketConnection + * current SocketConnection + * @param serverSession + * current ServerSession + * @param + * result type + * @param log + * logger + * @return SSL socket + * @throws IOException + * if an I/O error occurs + */ + default T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession, Log log) throws IOException { + return performTlsHandshake(socketConnection, serverSession); + } + + /** + * Called by the driver after completing the MySQL protocol handshake and + * reading the results of the authentication. + * + * @throws IOException + * if an I/O error occurs + */ + default void afterHandshake() throws IOException { + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketMetadata.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketMetadata.java new file mode 100644 index 0000000..801a777 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/SocketMetadata.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2011, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; + +import com.mysql.cj.Messages; +import com.mysql.cj.Session; + +public interface SocketMetadata { + + default boolean isLocallyConnected(Session sess) { + String processHost = sess.getProcessHost(); + return isLocallyConnected(sess, processHost); + } + + default boolean isLocallyConnected(Session sess, String processHost) { + if (processHost != null) { + sess.getLog().logDebug(Messages.getString("SocketMetadata.0", new Object[] { processHost })); + + int endIndex = processHost.lastIndexOf(":"); + if (endIndex != -1) { + processHost = processHost.substring(0, endIndex); + } + + try { + + InetAddress[] whereMysqlThinksIConnectedFrom = InetAddress.getAllByName(processHost); + + SocketAddress remoteSocketAddr = sess.getRemoteSocketAddress(); + + if (remoteSocketAddr instanceof InetSocketAddress) { + InetAddress whereIConnectedTo = ((InetSocketAddress) remoteSocketAddr).getAddress(); + + for (InetAddress hostAddr : whereMysqlThinksIConnectedFrom) { + if (hostAddr.equals(whereIConnectedTo)) { + sess.getLog().logDebug(Messages.getString("SocketMetadata.1", new Object[] { hostAddr, whereIConnectedTo })); + return true; + } + sess.getLog().logDebug(Messages.getString("SocketMetadata.2", new Object[] { hostAddr, whereIConnectedTo })); + } + + } else { + sess.getLog().logDebug(Messages.getString("SocketMetadata.3", new Object[] { remoteSocketAddr })); + } + + return false; + } catch (UnknownHostException e) { + sess.getLog().logWarn(Messages.getString("Connection.CantDetectLocalConnect", new Object[] { processHost }), e); + + return false; + } + + } + + return false; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueDecoder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueDecoder.java new file mode 100644 index 0000000..6f77704 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueDecoder.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.result.Field; +import com.mysql.cj.result.ValueFactory; + +/** + * A value decoder is responsible for interpreting a byte array as a value. The type of the value is encoded in the method call. After decoding, the value + * decoder passes an intermediate representation of the value to a {@link ValueFactory} for result value creation. + * + * @since 6.0 + */ +public interface ValueDecoder { + T decodeDate(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeTime(byte[] bytes, int offset, int length, int scale, ValueFactory vf); + + T decodeTimestamp(byte[] bytes, int offset, int length, int scale, ValueFactory vf); + + T decodeDatetime(byte[] bytes, int offset, int length, int scale, ValueFactory vf); + + T decodeInt1(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeUInt1(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeInt2(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeUInt2(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeInt4(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeUInt4(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeInt8(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeUInt8(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeFloat(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeDouble(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeDecimal(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeByteArray(byte[] bytes, int offset, int length, Field f, ValueFactory vf); + + T decodeBit(byte[] bytes, int offset, int length, ValueFactory vf); + + T decodeSet(byte[] bytes, int offset, int length, Field f, ValueFactory vf); + + T decodeYear(byte[] bytes, int offset, int length, ValueFactory vf); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueEncoder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueEncoder.java new file mode 100644 index 0000000..ce493c6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/ValueEncoder.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import com.mysql.cj.BindValue; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public interface ValueEncoder { + + void init(PropertySet pset, ServerSession serverSession, ExceptionInterceptor exceptionInterceptor); + + byte[] getBytes(BindValue binding); + + String getString(BindValue binding); + + long getTextLength(BindValue binding); + + long getBinaryLength(BindValue binding); + + void encodeAsText(Message msg, BindValue binding); + + void encodeAsBinary(Message msg, BindValue binding); + + void encodeAsQueryAttribute(Message msg, BindValue binding); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Warning.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Warning.java new file mode 100644 index 0000000..f598a82 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/Warning.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +public interface Warning { + /** + * Get warning level. + * + * @return Warning level + */ + int getLevel(); + + /** + * Get warning code. + * + * @return Warning code + */ + long getCode(); + + /** + * Get warning message. + * + * @return Warning message + */ + String getMessage(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/WatchableStream.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/WatchableStream.java new file mode 100644 index 0000000..b9092e0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/protocol/WatchableStream.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +public interface WatchableStream { + + void setWatcher(OutputStreamWatcher watcher); + + int size(); + + byte toByteArray()[]; + + void write(byte b[], int off, int len); + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Field.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Field.java new file mode 100644 index 0000000..ebfc9f7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Field.java @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2002, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import com.mysql.cj.MysqlType; +import com.mysql.cj.protocol.ProtocolEntity; +import com.mysql.cj.util.LazyString; + +/** + * Field is a class used to describe fields in a ResultSet + */ +public class Field implements ProtocolEntity { + + private int collationIndex = 0; + + private String encoding = "US-ASCII"; + + private int colDecimals; + + private short colFlag; + + private LazyString databaseName = null; + private LazyString tableName = null; + private LazyString originalTableName = null; + private LazyString columnName = null; + private LazyString originalColumnName = null; + + private String fullName = null; + + private long length; // Internal length of the field; + + private int mysqlTypeId = -1; // the MySQL type ID in legacy protocol + + private MysqlType mysqlType = MysqlType.UNKNOWN; + + public Field(LazyString databaseName, LazyString tableName, LazyString originalTableName, LazyString columnName, LazyString originalColumnName, long length, + int mysqlTypeId, short colFlag, int colDecimals, int collationIndex, String encoding, MysqlType mysqlType) { + this.databaseName = databaseName; + this.tableName = tableName; + this.originalTableName = originalTableName; + this.columnName = columnName; + this.originalColumnName = originalColumnName; + this.length = length; + this.colFlag = colFlag; + this.colDecimals = colDecimals; + this.mysqlTypeId = mysqlTypeId; + this.collationIndex = collationIndex; + + // ucs2, utf16, and utf32 cannot be used as a client character set, but if it was received from server under some circumstances we can parse them as utf16 + this.encoding = "UnicodeBig".equals(encoding) ? "UTF-16" : encoding; + + // MySQL encodes JSON data with utf8mb4. + if (mysqlType == MysqlType.JSON) { + this.encoding = "UTF-8"; + } + + this.mysqlType = mysqlType; + + adjustFlagsByMysqlType(); + } + + private void adjustFlagsByMysqlType() { + + switch (this.mysqlType) { + case BIT: + if (this.length > 1) { + this.colFlag |= MysqlType.FIELD_FLAG_BINARY; + this.colFlag |= MysqlType.FIELD_FLAG_BLOB; + } + break; + + case BINARY: + case VARBINARY: + this.colFlag |= MysqlType.FIELD_FLAG_BINARY; + this.colFlag |= MysqlType.FIELD_FLAG_BLOB; + break; + + case DECIMAL_UNSIGNED: + case TINYINT_UNSIGNED: + case SMALLINT_UNSIGNED: + case INT_UNSIGNED: + case FLOAT_UNSIGNED: + case DOUBLE_UNSIGNED: + case BIGINT_UNSIGNED: + case MEDIUMINT_UNSIGNED: + this.colFlag |= MysqlType.FIELD_FLAG_UNSIGNED; + break; + + default: + break; + } + + } + + /** + * Used by prepared statements to re-use result set data conversion methods + * when generating bound parameter retrieval instance for statement interceptors. + * + * @param tableName + * not used + * @param columnName + * not used + * @param collationIndex + * the MySQL collation/character set index + * @param encoding + * encoding of data in this field + * @param mysqlType + * {@link MysqlType} + * @param length + * length in characters or bytes (for BINARY data). + */ + public Field(String tableName, String columnName, int collationIndex, String encoding, MysqlType mysqlType, int length) { + + this.databaseName = new LazyString(null); + this.tableName = new LazyString(tableName); + this.originalTableName = new LazyString(null); + this.columnName = new LazyString(columnName); + this.originalColumnName = new LazyString(null); + this.length = length; + this.mysqlType = mysqlType; + this.colFlag = 0; + this.colDecimals = 0; + + adjustFlagsByMysqlType(); + + switch (mysqlType) { + case CHAR: + case VARCHAR: + case TINYTEXT: + case TEXT: + case MEDIUMTEXT: + case LONGTEXT: + case JSON: + // TODO: this becomes moot when DBMD results aren't built from ByteArrayRow + // it possibly overrides correct encoding already existing in the Field instance + this.collationIndex = collationIndex; + + // ucs2, utf16, and utf32 cannot be used as a client character set, but if it was received from server under some circumstances we can parse them as utf16 + this.encoding = "UnicodeBig".equals(encoding) ? "UTF-16" : encoding; + + break; + default: + // ignoring charsets for non-string types + } + } + + /** + * Returns the Java encoding for this field. + * + * @return the Java encoding + */ + public String getEncoding() { + return this.encoding; + } + + public String getColumnLabel() { + return getName(); + } + + public String getDatabaseName() { + return this.databaseName.toString(); + } + + public int getDecimals() { + return this.colDecimals; + } + + public String getFullName() { + if (this.fullName == null) { + StringBuilder fullNameBuf = new StringBuilder(this.tableName.length() + 1 + this.columnName.length()); + fullNameBuf.append(this.tableName.toString()); + fullNameBuf.append('.'); + fullNameBuf.append(this.columnName.toString()); + this.fullName = fullNameBuf.toString(); + } + + return this.fullName; + } + + public long getLength() { + return this.length; + } + + public int getMysqlTypeId() { + return this.mysqlTypeId; + } + + public void setMysqlTypeId(int id) { + this.mysqlTypeId = id; + } + + public String getName() { + return this.columnName.toString(); + } + + public String getOriginalName() { + return this.originalColumnName.toString(); + } + + public String getOriginalTableName() { + return this.originalTableName.toString(); + } + + public int getJavaType() { + return this.mysqlType.getJdbcType(); + } + + public String getTableName() { + return this.tableName.toString(); + } + + public boolean isAutoIncrement() { + return ((this.colFlag & MysqlType.FIELD_FLAG_AUTO_INCREMENT) > 0); + } + + public boolean isBinary() { + return ((this.colFlag & MysqlType.FIELD_FLAG_BINARY) > 0); + } + + public void setBinary() { + this.colFlag |= MysqlType.FIELD_FLAG_BINARY; + } + + public boolean isBlob() { + return ((this.colFlag & MysqlType.FIELD_FLAG_BLOB) > 0); + } + + public void setBlob() { + this.colFlag |= MysqlType.FIELD_FLAG_BLOB; + } + + public boolean isMultipleKey() { + return ((this.colFlag & MysqlType.FIELD_FLAG_MULTIPLE_KEY) > 0); + } + + public boolean isNotNull() { + return ((this.colFlag & MysqlType.FIELD_FLAG_NOT_NULL) > 0); + } + + public boolean isPrimaryKey() { + return ((this.colFlag & MysqlType.FIELD_FLAG_PRIMARY_KEY) > 0); + } + + public boolean isFromFunction() { + return this.originalTableName.length() == 0; + } + + /** + * Is this field _definitely_ not writable? + * + * @return true if this field can not be written to in an INSERT/UPDATE + * statement. + */ + public boolean isReadOnly() { + return this.originalColumnName.length() == 0 && this.originalTableName.length() == 0; + } + + public boolean isUniqueKey() { + return ((this.colFlag & MysqlType.FIELD_FLAG_UNIQUE_KEY) > 0); + } + + public boolean isUnsigned() { + return ((this.colFlag & MysqlType.FIELD_FLAG_UNSIGNED) > 0); + } + + public boolean isZeroFill() { + return ((this.colFlag & MysqlType.FIELD_FLAG_ZEROFILL) > 0); + } + + @Override + public String toString() { + try { + StringBuilder asString = new StringBuilder(); + asString.append(super.toString()); + asString.append("["); + asString.append("dbName="); + asString.append(this.getDatabaseName()); + asString.append(",tableName="); + asString.append(this.getTableName()); + asString.append(",originalTableName="); + asString.append(this.getOriginalTableName()); + asString.append(",columnName="); + asString.append(this.getName()); + asString.append(",originalColumnName="); + asString.append(this.getOriginalName()); + asString.append(",mysqlType="); + asString.append(getMysqlTypeId()); + asString.append("("); + MysqlType ft = getMysqlType(); + if (ft.equals(MysqlType.UNKNOWN)) { + asString.append(" Unknown MySQL Type # "); + asString.append(getMysqlTypeId()); + } else { + asString.append("FIELD_TYPE_"); + asString.append(ft.getName()); + } + asString.append(")"); + asString.append(",sqlType="); + asString.append(ft.getJdbcType()); + asString.append(",flags="); + + if (isAutoIncrement()) { + asString.append(" AUTO_INCREMENT"); + } + + if (isPrimaryKey()) { + asString.append(" PRIMARY_KEY"); + } + + if (isUniqueKey()) { + asString.append(" UNIQUE_KEY"); + } + + if (isBinary()) { + asString.append(" BINARY"); + } + + if (isBlob()) { + asString.append(" BLOB"); + } + + if (isMultipleKey()) { + asString.append(" MULTI_KEY"); + } + + if (isUnsigned()) { + asString.append(" UNSIGNED"); + } + + if (isZeroFill()) { + asString.append(" ZEROFILL"); + } + + asString.append(", charsetIndex="); + asString.append(this.collationIndex); + asString.append(", charsetName="); + asString.append(this.encoding); + + asString.append("]"); + + return asString.toString(); + } catch (Throwable t) { + return super.toString() + "[]"; + } + } + + public boolean isSingleBit() { + return (this.length <= 1); + } + + public boolean getValueNeedsQuoting() { + switch (this.mysqlType) { + case BIGINT: + case BIGINT_UNSIGNED: + case BIT: + case DECIMAL: + case DECIMAL_UNSIGNED: + case DOUBLE: + case DOUBLE_UNSIGNED: + case INT: + case INT_UNSIGNED: + case MEDIUMINT: + case MEDIUMINT_UNSIGNED: + case FLOAT: + case FLOAT_UNSIGNED: + case SMALLINT: + case SMALLINT_UNSIGNED: + case TINYINT: + case TINYINT_UNSIGNED: + return false; + default: + return true; + } + } + + public int getCollationIndex() { + return this.collationIndex; + } + + public MysqlType getMysqlType() { + return this.mysqlType; + } + + public void setMysqlType(MysqlType mysqlType) { + this.mysqlType = mysqlType; + } + + public short getFlags() { + return this.colFlag; + } + + public void setFlags(short colFlag) { + this.colFlag = colFlag; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Row.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Row.java new file mode 100644 index 0000000..e059947 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/Row.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.ProtocolEntity; +import com.mysql.cj.protocol.ValueDecoder; + +public interface Row extends ProtocolEntity { + /** + * Retrieve a value for the given column. This is the main facility to access values from the Row + * involving {@link ValueDecoder} and {@link ValueFactory} chain. Metadata must be set via + * Row constructor or {@link #setMetadata(ColumnDefinition)} call before calling this method to allow + * correct columnIndex boundaries check and data type recognition. + * + * @param + * type to decode to + * @param columnIndex + * index of column to retrieve value from (0-indexed, not JDBC 1-indexed) + * @param vf + * value factory used to create the return value after decoding + * @return The return value from the value factory + */ + T getValue(int columnIndex, ValueFactory vf); + + /** + * Set metadata to enable getValue functionality. + * + * @param columnDefinition + * {@link ColumnDefinition} + * @return {@link Row} + */ + default Row setMetadata(ColumnDefinition columnDefinition) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Returns the value at the given column as a byte array. + * The bytes represent the raw values returned by the server. + * + * @param columnIndex + * index of column (starting at 0) to return from. + * @return the value for the given column; if the value is SQL NULL, the value returned is null + */ + default byte[] getBytes(int columnIndex) { + // TODO check that "if the value is SQL NULL, the value returned is null" is correctly implemented + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Sets the given byte array as a raw column value (only works currently with ByteArrayRow). + * + * @param columnIndex + * index of the column (starting at 0) to set to. + * @param value + * the (raw) value to set + */ + default void setBytes(int columnIndex, byte[] value) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Check whether a column is NULL and update the 'wasNull' status. + * + * @param columnIndex + * of the column value (starting at 0) to check. + * + * @return true if the column value is NULL, false if not. + */ + boolean getNull(int columnIndex); + + /** + * Was the last value retrieved a NULL value? + * + * @return true if the last retrieved value was NULL. + */ + boolean wasNull(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/RowList.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/RowList.java new file mode 100644 index 0000000..9ce8924 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/RowList.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.util.Iterator; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; + +/** + * A list of {@link Row}s. + */ +public interface RowList extends Iterator { + + /** + * What's returned for the size of a row list when its size can not be + * determined. + */ + public static final int RESULT_SET_SIZE_UNKNOWN = -1; + + /** + * Optionally iterate backwards on the list. + * + * @return {@link Row} + */ + default Row previous() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Optionally retrieve Row at index n. + * + * Only works on non dynamic row lists. + * + * @param n + * row number + * @return {@link Row} + */ + default Row get(int n) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Returns the current position. + * + * @return the current row number + */ + default int getPosition() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, Messages.getString("OperationNotSupportedException.0")); + } + + /** + * Only works on non dynamic row lists. + * + * @return the size of this row list + */ + default int size() { + return RESULT_SET_SIZE_UNKNOWN; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/ValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/ValueFactory.java new file mode 100644 index 0000000..c656bdc --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/result/ValueFactory.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * A class implements the ValueFactory<T> interface to create value instances from intermediate forms. + *

    + * A ValueFactory implementation is responsible for creating instance of a single type, supplying a value for the type parameter T. If an + * instance cannot be created from the intermediate form, an {@link java.lang.UnsupportedOperationException} can be thrown. + * + * @param + * value type + * + * @since 6.0 + */ +public interface ValueFactory { + + void setPropertySet(PropertySet pset); + + T createFromDate(InternalDate idate); + + T createFromTime(InternalTime it); + + T createFromTimestamp(InternalTimestamp its); + + T createFromDatetime(InternalTimestamp its); + + T createFromLong(long l); + + T createFromBigInteger(BigInteger i); + + T createFromDouble(double d); + + T createFromBigDecimal(BigDecimal d); + + T createFromBytes(byte[] bytes, int offset, int length, Field f); + + T createFromBit(byte[] bytes, int offset, int length); + + T createFromYear(long l); + + /** + * Create result value from intermediate null value. + * + * @return T object + */ + T createFromNull(); + + /** + * Get the actual class name of T parameter. + * + * @return class name + */ + String getTargetTypeName(); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Base64Decoder.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Base64Decoder.java new file mode 100644 index 0000000..3eb6b30 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Base64Decoder.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2014, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +/** + * This decoder implements standard Base64 decoding except it allows and silently ignores non-base64 input characters (spaces, line breaks etc) + * + * Note: Java 6+ provide standard decoders + */ +public class Base64Decoder { + + /* + * -1 means non-base64 character + * -2 means padding + */ + private static byte[] decoderMap = new byte[] { -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, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 }; + + public static class IntWrapper { + public int value; + + public IntWrapper(int value) { + this.value = value; + } + } + + private static byte getNextValidByte(byte[] in, IntWrapper pos, int maxPos) { + while (pos.value <= maxPos) { + if (in[pos.value] >= 0 && decoderMap[in[pos.value]] >= 0) { + return in[pos.value++]; + } + pos.value++; + } + // padding if reached max position + return '='; + } + + public static byte[] decode(byte[] in, int pos, int length) { + IntWrapper offset = new Base64Decoder.IntWrapper(pos); + byte[] sestet = new byte[4]; + + int outLen = (length * 3) / 4; // over-estimated if non-base64 characters present + byte[] octet = new byte[outLen]; + int octetId = 0; + + int maxPos = offset.value + length - 1; + while (offset.value <= maxPos) { + sestet[0] = decoderMap[getNextValidByte(in, offset, maxPos)]; + sestet[1] = decoderMap[getNextValidByte(in, offset, maxPos)]; + sestet[2] = decoderMap[getNextValidByte(in, offset, maxPos)]; + sestet[3] = decoderMap[getNextValidByte(in, offset, maxPos)]; + + if (sestet[1] != -2) { + octet[octetId++] = (byte) ((sestet[0] << 2) | (sestet[1] >>> 4)); + } + if (sestet[2] != -2) { + octet[octetId++] = (byte) (((sestet[1] & 0xf) << 4) | (sestet[2] >>> 2)); + } + if (sestet[3] != -2) { + octet[octetId++] = (byte) (((sestet[2] & 3) << 6) | sestet[3]); + } + } + // return real-length value + byte[] out = new byte[octetId]; + System.arraycopy(octet, 0, out, 0, octetId); + return out; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DataTypeUtil.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DataTypeUtil.java new file mode 100644 index 0000000..4602dc0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DataTypeUtil.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +/** + * Utilities to manipulate internal data type formats. + */ +public class DataTypeUtil { + + /** + * Interpret a BIT value as a long. + * + * @param bytes + * byte buffer + * @param offset + * offset in buffer + * @param length + * number of bytes to use + * @return long value + */ + public static long bitToLong(byte[] bytes, int offset, int length) { + long valueAsLong = 0; + for (int i = 0; i < length; i++) { + valueAsLong = valueAsLong << 8 | bytes[offset + i] & 0xff; + } + return valueAsLong; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DnsSrv.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DnsSrv.java new file mode 100644 index 0000000..f3cca66 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/DnsSrv.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.Random; +import java.util.stream.Collectors; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; + +public class DnsSrv { + public static class SrvRecord implements Comparable { + private final int priority; + private final int weight; + private final int port; + private final String target; + + public static SrvRecord buildFrom(String srvLine) { + String[] srvParts = srvLine.split("\\s+"); + if (srvParts.length == 4) { + int priority = Integer.parseInt(srvParts[0]); + int weight = Integer.parseInt(srvParts[1]); + int port = Integer.parseInt(srvParts[2]); + String target = srvParts[3].replaceFirst("\\.$", ""); + return new SrvRecord(priority, weight, port, target); + } + return null; + } + + public SrvRecord(int priority, int weight, int port, String target) { + this.priority = priority; + this.weight = weight; + this.port = port; + this.target = target; + } + + public int getPriority() { + return this.priority; + } + + public int getWeight() { + return this.weight; + } + + public int getPort() { + return this.port; + } + + public String getTarget() { + return this.target; + } + + @Override + public String toString() { + return String.format("{\"Priority\": %d, \"Weight\": %d, \"Port\": %d, \"Target\": \"%s\"}", getPriority(), getWeight(), getPort(), getTarget()); + } + + @Override + public int compareTo(SrvRecord o) { + int priorityDiff = getPriority() - o.getPriority(); + return priorityDiff == 0 ? getWeight() - o.getWeight() : priorityDiff; + } + } + + public static List lookupSrvRecords(String serviceName) throws NamingException { + List srvRecords = new ArrayList<>(); + + Properties environment = new Properties(); + environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); + DirContext context = new InitialDirContext(environment); + Attributes dnsEntries = context.getAttributes(serviceName, new String[] { "SRV" }); + if (dnsEntries != null) { + Attribute hosts = dnsEntries.get("SRV"); + if (hosts != null) { + for (int i = 0; i < hosts.size(); i++) { + srvRecords.add(SrvRecord.buildFrom((String) hosts.get(i))); + } + } + } + + return sortSrvRecords(srvRecords); + } + + /** + * Sort a list of DNS SRV records according to the sorting rules described in rfc2782. + * + * @param srvRecords + * the list of {@link SrvRecord}s to sort. + * @return + * a new list of sorted {@link SrvRecord}s. + */ + public static List sortSrvRecords(List srvRecords) { + // Sort srv records by their natural order, i.e., first by priority then by weight. + List srvRecordsSortedNatural = srvRecords.stream().sorted().collect(Collectors.toList()); + + // Sort records with equal priority by weight using a categorical distribution. + Random random = new Random(System.nanoTime()); + List srvRecordsSortedRfc2782 = new ArrayList<>(); + + List priorities = srvRecordsSortedNatural.stream().map(SrvRecord::getPriority).distinct().collect(Collectors.toList()); + for (Integer priority : priorities) { + List srvRecordsSamePriority = srvRecordsSortedNatural.stream().filter(s -> s.getPriority() == priority).collect(Collectors.toList()); + while (srvRecordsSamePriority.size() > 1) { + int recCount = srvRecordsSamePriority.size(); + int sumOfWeights = 0; + int[] weights = new int[recCount]; + for (int i = 0; i < recCount; i++) { + sumOfWeights += srvRecordsSamePriority.get(i).getWeight(); + weights[i] = sumOfWeights; + } + int selection = random.nextInt(sumOfWeights + 1); + int pos = 0; + for (; pos < recCount && weights[pos] < selection; pos++) { + } + srvRecordsSortedRfc2782.add(srvRecordsSamePriority.remove(pos)); + } + srvRecordsSortedRfc2782.add(srvRecordsSamePriority.get(0)); + } + + return srvRecordsSortedRfc2782; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/EscapeTokenizer.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/EscapeTokenizer.java new file mode 100644 index 0000000..48af210 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/EscapeTokenizer.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +/** + * EscapeTokenizer breaks up an SQL statement into SQL and escape code parts. + */ +public class EscapeTokenizer { + private static final char CHR_ESCAPE = '\\'; + private static final char CHR_SGL_QUOTE = '\''; + private static final char CHR_DBL_QUOTE = '"'; + private static final char CHR_LF = '\n'; + private static final char CHR_CR = '\r'; + private static final char CHR_COMMENT = '-'; + private static final char CHR_BEGIN_TOKEN = '{'; + private static final char CHR_END_TOKEN = '}'; + private static final char CHR_VARIABLE = '@'; + + private String source = null; + private int sourceLength = 0; + private int pos = 0; + + private boolean emittingEscapeCode = false; + private boolean sawVariableUse = false; + private int bracesLevel = 0; + private boolean inQuotes = false; + private char quoteChar = 0; + + /** + * Creates a new EscapeTokenizer object. + * + * @param source + * the string to tokenize + */ + public EscapeTokenizer(String source) { + this.source = source; + this.sourceLength = source.length(); + this.pos = 0; + } + + /** + * Does this tokenizer have more tokens available? + * + * @return if this tokenizer has more tokens available + */ + public synchronized boolean hasMoreTokens() { + return (this.pos < this.sourceLength); + } + + /** + * Returns the next token + * + * @return the next token. + */ + public synchronized String nextToken() { + StringBuilder tokenBuf = new StringBuilder(); + boolean backslashEscape = false; + + if (this.emittingEscapeCode) { + // Previous token ended at the beginning of an escape code, so this token must start with '{' + tokenBuf.append("{"); + this.emittingEscapeCode = false; + } + + for (; this.pos < this.sourceLength; this.pos++) { + char c = this.source.charAt(this.pos); + + // process escape char: (\) + if (c == CHR_ESCAPE) { + tokenBuf.append(c); + backslashEscape = !backslashEscape; + continue; + } + + // process quotes: ('|") + if ((c == CHR_SGL_QUOTE || c == CHR_DBL_QUOTE) && !backslashEscape) { + tokenBuf.append(c); + if (this.inQuotes) { + if (c == this.quoteChar) { + // look ahead for doubled quote + if ((this.pos + 1 < this.sourceLength) && (this.source.charAt(this.pos + 1) == this.quoteChar)) { + tokenBuf.append(c); + this.pos++; // consume following char '\'' or '"' + } else { + this.inQuotes = false; + } + } + } else { + this.inQuotes = true; + this.quoteChar = c; + } + continue; + } + + // process new line: (\n|\r) + if ((c == CHR_LF) || (c == CHR_CR)) { + tokenBuf.append(c); + backslashEscape = false; + continue; + } + + if (!this.inQuotes && !backslashEscape) { + // process comments: (--) + if (c == CHR_COMMENT) { + tokenBuf.append(c); + // look ahead for double hyphen + if ((this.pos + 1 < this.sourceLength) && (this.source.charAt(this.pos + 1) == CHR_COMMENT)) { + // consume following chars until new line or end of string + while (++this.pos < this.sourceLength && c != CHR_LF && c != CHR_CR) { + c = this.source.charAt(this.pos); + tokenBuf.append(c); + } + this.pos--; + } + continue; + } + + // process begin token: ({) + if (c == CHR_BEGIN_TOKEN) { + this.bracesLevel++; + if (this.bracesLevel == 1) { + this.emittingEscapeCode = true; + this.pos++; // consume char '{' before returning + return tokenBuf.toString(); + } + tokenBuf.append(c); + continue; + } + + // process end token: (}) + if (c == CHR_END_TOKEN) { + tokenBuf.append(c); + this.bracesLevel--; + if (this.bracesLevel == 0) { + this.pos++; // consume char '}' before returning + return tokenBuf.toString(); + } + continue; + } + + // detect variable usage: (@) + if (c == CHR_VARIABLE) { + this.sawVariableUse = true; + } + } + + tokenBuf.append(c); + backslashEscape = false; + } + + return tokenBuf.toString(); + } + + /** + * Returns true if a variable reference was found. Note that this information isn't accurate until finishing to + * process all tokens from source String. It also can't be used as per token basis. + * + * @return true if a variable reference was found. + */ + public boolean sawVariableUse() { + return this.sawVariableUse; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LRUCache.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LRUCache.java new file mode 100644 index 0000000..31b37c5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LRUCache.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +public class LRUCache extends LinkedHashMap { + private static final long serialVersionUID = 1L; + protected int maxElements; + + public LRUCache(int maxSize) { + super(maxSize, 0.75F, true); + this.maxElements = maxSize; + } + + @Override + protected boolean removeEldestEntry(Entry eldest) { + return (size() > this.maxElements); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LazyString.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LazyString.java new file mode 100644 index 0000000..142a3a4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LazyString.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.function.Supplier; + +/** + * A lazy string that can take a byte buffer and encoding and interpret it as a string if/when requested. The string is cached and saved for any further + * requests. "NULL" values can be represented by a 0-len string or a null passed to LazyString(String). + */ +public class LazyString implements Supplier { + private String string; // the string, if one has been created + private byte[] buffer; + private int offset; + private int length; + private String encoding; + + public LazyString(String string) { + // convenience for wrapping + this.string = string; + } + + public LazyString(byte[] buffer, int offset, int length, String encoding) { + this.buffer = buffer; + this.offset = offset; + this.length = length; + this.encoding = encoding; + } + + public LazyString(byte[] buffer, int offset, int length) { + this.buffer = buffer; + this.offset = offset; + this.length = length; + } + + private String createAndCacheString() { + if (this.length > 0) { + this.string = this.encoding == null ? StringUtils.toString(this.buffer, this.offset, this.length) + : StringUtils.toString(this.buffer, this.offset, this.length, this.encoding); + } + // this can be NULL for 0-len strings + return this.string; + } + + @Override + public String toString() { + if (this.string != null) { + return this.string; + } + return createAndCacheString(); + } + + public int length() { + if (this.string != null) { + return this.string.length(); + } + return this.length; + } + + @Override + public String get() { + return toString(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LogUtils.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LogUtils.java new file mode 100644 index 0000000..c5ce373 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/LogUtils.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2005, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import com.mysql.cj.conf.PropertyDefinitions; + +public class LogUtils { + + public static final String CALLER_INFORMATION_NOT_AVAILABLE = "Caller information not available"; + + private static final String LINE_SEPARATOR = System.getProperty(PropertyDefinitions.SYSP_line_separator); + + private static final int LINE_SEPARATOR_LENGTH = LINE_SEPARATOR.length(); + + public static String findCallingClassAndMethod(Throwable t) { + String stackTraceAsString = Util.stackTraceToString(t); + + String callingClassAndMethod = CALLER_INFORMATION_NOT_AVAILABLE; + + int endInternalMethods = Math.max(Math.max(stackTraceAsString.lastIndexOf("com.mysql.cj"), stackTraceAsString.lastIndexOf("com.mysql.cj.core")), + stackTraceAsString.lastIndexOf("com.mysql.cj.jdbc")); + + if (endInternalMethods != -1) { + int endOfLine = stackTraceAsString.indexOf(LINE_SEPARATOR, endInternalMethods); + + if (endOfLine != -1) { + int nextEndOfLine = stackTraceAsString.indexOf(LINE_SEPARATOR, endOfLine + LINE_SEPARATOR_LENGTH); + callingClassAndMethod = nextEndOfLine != -1 ? stackTraceAsString.substring(endOfLine + LINE_SEPARATOR_LENGTH, nextEndOfLine) + : stackTraceAsString.substring(endOfLine + LINE_SEPARATOR_LENGTH); + } + } + + if (!callingClassAndMethod.startsWith("\tat ") && !callingClassAndMethod.startsWith("at ")) { + return "at " + callingClassAndMethod; + } + + return callingClassAndMethod; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/PerVmServerConfigCacheFactory.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/PerVmServerConfigCacheFactory.java new file mode 100644 index 0000000..241daf0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/PerVmServerConfigCacheFactory.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2013, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.mysql.cj.CacheAdapter; +import com.mysql.cj.CacheAdapterFactory; + +public class PerVmServerConfigCacheFactory implements CacheAdapterFactory> { + static final ConcurrentHashMap> serverConfigByUrl = new ConcurrentHashMap<>(); + + private static final CacheAdapter> serverConfigCache = new CacheAdapter>() { + + public Map get(String key) { + return serverConfigByUrl.get(key); + } + + public void put(String key, Map value) { + serverConfigByUrl.putIfAbsent(key, value); + } + + public void invalidate(String key) { + serverConfigByUrl.remove(key); + } + + public void invalidateAll(Set keys) { + for (String key : keys) { + serverConfigByUrl.remove(key); + } + } + + public void invalidateAll() { + serverConfigByUrl.clear(); + } + }; + + public CacheAdapter> getInstance(Object syncMutex, String url, int cacheMaxSize, int maxKeySize) { + return serverConfigCache; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SaslPrep.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SaslPrep.java new file mode 100644 index 0000000..e043d66 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SaslPrep.java @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.text.Normalizer; +import java.text.Normalizer.Form; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; + +/** + * Implementation for SASLprep: Stringprep Profile for User Names and Passwords, as specified in RFC 4013. + * + * @see RFC 3454 + */ +public class SaslPrep { + /** + * The type of string usage regarding the support for unassigned code points as described in RFC + * 3454, Section 7. + */ + public enum StringType { + /** + * Stored strings using the profile MUST NOT contain any unassigned code points. + */ + STORED, + /** + * Queries for matching strings MAY contain unassigned code points. + */ + QUERY; + } + + /** + * Prepares the given string by applying the "SASLprep" profile of the "stringprep" algorithm. + * + * @param str + * the string to prepare. + * @param sType + * the type of preparation with regard to the support for unassigned code points. + * + * @return + * the prepared version of the given string. + * @see RFC 4013 + * @see RFC 3454 + */ + public static String prepare(String str, StringType sType) { + if (str.length() == 0) { + return str; + } + + StringBuilder sb = new StringBuilder(str.length()); + + // 2.1. Mapping. + for (char chr : str.toCharArray()) { + if (isNonAsciiSpaceChar(chr)) { + sb.append(' '); + } else if (!isMappeableToNothing(chr)) { + sb.append(chr); + } + } + + // 2.2. Normalization. + String preparedStr = normalizeKc(sb); + + // 2.3. Prohibited Output & 2.4. Bidirectional Characters & 2.5. Unassigned Code Points. + boolean startsWithRAndAlCat = isBidiRAndAlCat(preparedStr.codePointAt(0)); + boolean endsWithRAndAlCat = isBidiRAndAlCat( + preparedStr.codePointAt(preparedStr.length() - (Character.isLowSurrogate(preparedStr.charAt(preparedStr.length() - 1)) ? 2 : 1))); + boolean containsRAndAlCat = startsWithRAndAlCat || endsWithRAndAlCat; + boolean containsLCat = false; + for (int i = 0, ni; i < preparedStr.length(); i = ni) { + char chr = preparedStr.charAt(i); + int cp = preparedStr.codePointAt(i); + ni = i + Character.charCount(cp); + + // 2.3. Prohibited Output. + if (isProhibited(chr, cp)) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Prohibited character at position " + i + "."); + } + + // 2.4. Bidirectional Characters. + // (Already covered: MUST be prohibited - change display properties or are deprecated.) + // RFC 3454, Section 5.8. + if (!containsRAndAlCat) { + containsRAndAlCat = isBidiRAndAlCat(cp); + } + if (!containsLCat) { + containsLCat = isBidiLCat(cp); + } + if (containsRAndAlCat && containsLCat) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Cannot contain both RandALCat characters and LCat characters."); + } + if (ni >= preparedStr.length() && containsRAndAlCat && (!startsWithRAndAlCat || !endsWithRAndAlCat)) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Cannot contain RandALCat characters and not start and end with RandALCat characters."); + } + + // 2.5. Unassigned Code Points. + if (sType == StringType.STORED && isUnassigned(cp)) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Unassigned character at position " + i + "."); + } + } + + return preparedStr; + } + + /** + * Mapping: non-ASCII space characters [StringPrep, C.1.2] that can be mapped to SPACE + * (U+0020). + * + * @param chr + * the character to check. + * @return + * true if the character is one of the non-ASCII space characters, false otherwise. + */ + private static boolean isNonAsciiSpaceChar(char chr) { + return chr == '\u00A0' || chr == '\u1680' || chr >= '\u2000' && chr <= '\u200B' || chr == '\u202F' || chr == '\u205F' || chr == '\u3000'; + } + + /** + * Mapping: the "commonly mapped to nothing" characters [StringPrep, B.1] that can be mapped + * to nothing. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the "commonly mapped to nothing" characters, false otherwise. + */ + private static boolean isMappeableToNothing(char chr) { + return chr == '\u00AD' || chr == '\u034F' || chr == '\u1806' || chr >= '\u180B' && chr <= '\u180D' || chr >= '\u200B' && chr <= '\u200D' + || chr == '\u2060' || chr >= '\uFE00' && chr <= '\uFE0F' || chr == '\uFEFF'; + } + + /** + * Normalization: Unicode normalization form KC. + * + * @param str + * the string to be normalized. + * @return + * a normalized version of the given string by the rules of the Unicode normalization form KC. + */ + private static String normalizeKc(CharSequence str) { + return Normalizer.normalize(str, Form.NFKC); + } + + /** + * Checks if the given character is one of the prohibited characters under the "SASLprep Profile" rules. + * + * @param chr + * the character to check. + * @param cp + * the code point of the character to check. + * @return + * true if the character is prohibited according to the profile rules, false otherwise. + * @see RFC 4013, Section 2.3 + */ + private static boolean isProhibited(char chr, int cp) { + return /* already covered: isNonAsciiSpaceChar(chr) || */ isAsciiControlCharacter(chr) || isNonAsciiControlCharacter(cp) || isPrivateUseCharacter(cp) + || isNonCharacterCodePoint(cp) || isSurrogateCode(chr) || isInappropriateForPlainTextCharacter(chr) + || isInappropriateForCanonicalRepresentationCharacter(chr) || isChangeDisplayPropertiesOrDeprecatedCharacter(chr) || isTaggingCharacter(cp); + } + + /** + * Prohibited Output: ASCII control characters [StringPrep, C.2.1]. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the ASCII control characters, false otherwise. + */ + private static boolean isAsciiControlCharacter(char chr) { + return chr <= '\u001F' || chr == '\u007F'; + } + + /** + * Prohibited Output: non-ASCII control characters [StringPrep, C.2.2]. + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the non-ASCII control characters, false otherwise. + */ + private static boolean isNonAsciiControlCharacter(int cp) { + return cp >= 0x0080 && cp <= 0x009F || cp == 0x06DD || cp == 0x070F || cp == 0x180E || cp == 0x200C || cp == 0x200D || cp == 0x2028 || cp == 0x2029 + || cp >= 0x2060 && cp <= 0x2063 || cp >= 0x206A && cp <= 0x206F || cp == 0xFEFF || cp >= 0xFFF9 && cp <= 0xFFFC + || cp >= 0x1D173 && cp <= 0x1D17A; + } + + /** + * Prohibited Output: private use characters [StringPrep, C.3]. + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the private use characters, false otherwise. + */ + private static boolean isPrivateUseCharacter(int cp) { + return cp >= 0xE000 && cp <= 0xF8FF || cp >= 0xF0000 && cp <= 0xFFFFD || cp >= 0x100000 && cp <= 0x10FFFD; + } + + /** + * Prohibited Output: non-character code points [StringPrep, C.4]. + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the non-character code points, false otherwise. + */ + private static boolean isNonCharacterCodePoint(int cp) { + return cp >= 0xFDD0 && cp <= 0xFDEF || cp >= 0xFFFE && cp <= 0xFFFF || cp >= 0x1FFFE && cp <= 0x1FFFF || cp >= 0x2FFFE && cp <= 0x2FFFF + || cp >= 0x3FFFE && cp <= 0x3FFFF || cp >= 0x4FFFE && cp <= 0x4FFFF || cp >= 0x5FFFE && cp <= 0x5FFFF || cp >= 0x6FFFE && cp <= 0x6FFFF + || cp >= 0x7FFFE && cp <= 0x7FFFF || cp >= 0x8FFFE && cp <= 0x8FFFF || cp >= 0x9FFFE && cp <= 0x9FFFF || cp >= 0xAFFFE && cp <= 0xAFFFF + || cp >= 0xBFFFE && cp <= 0xBFFFF || cp >= 0xCFFFE && cp <= 0xCFFFF || cp >= 0xDFFFE && cp <= 0xDFFFF || cp >= 0xEFFFE && cp <= 0xEFFFF + || cp >= 0xFFFFE && cp <= 0xFFFFF || cp >= 0x10FFFE && cp <= 0x10FFFF; + } + + /** + * Prohibited Output: surrogate code points [StringPrep, C.5]. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the surrogate code points, false otherwise. + */ + private static boolean isSurrogateCode(char chr) { + return chr >= '\uD800' && chr <= '\uDFFF'; + } + + /** + * Prohibited Output: inappropriate for plain text characters [StringPrep, C.6]. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the inappropriate for plain text characters, false otherwise. + */ + private static boolean isInappropriateForPlainTextCharacter(char chr) { + return chr == '\uFFF9' || chr >= '\uFFFA' && chr <= '\uFFFD'; + } + + /** + * Prohibited Output: inappropriate for canonical representation characters [StringPrep, + * C.7]. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the inappropriate for canonical representation characters, false otherwise. + */ + private static boolean isInappropriateForCanonicalRepresentationCharacter(char chr) { + return chr >= '\u2FF0' && chr <= '\u2FFB'; + } + + /** + * Prohibited Output: change display properties or deprecated characters [StringPrep, C.8]. + * + * @param chr + * the character to check. + * @return + * true if the character is one of the change display properties or deprecated characters, false otherwise. + */ + private static boolean isChangeDisplayPropertiesOrDeprecatedCharacter(char chr) { + return chr == '\u0340' || chr == '\u0341' || chr == '\u200E' || chr == '\u200F' || chr >= '\u202A' && chr <= '\u202E' + || chr >= '\u206A' && chr <= '\u206F'; + } + + /** + * Prohibited Output: tagging characters [StringPrep, C.9]. + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the tagging characters, false otherwise. + */ + private static boolean isTaggingCharacter(int cp) { + return cp == 0xE0001 || cp >= 0xE0020 && cp <= 0xE007F; + } + + /** + * Bidirectional Characters: RandALCat characters. + * See also RFC 3454, Section 6 + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the RandALCat characters, false otherwise. + */ + private static boolean isBidiRAndAlCat(int cp) { + byte dir = Character.getDirectionality(cp); + return dir == Character.DIRECTIONALITY_RIGHT_TO_LEFT || dir == Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC; + } + + /** + * Bidirectional Characters: LCat characters. + * See also RFC 3454, Section 6 + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is one of the LCat characters, false otherwise. + */ + private static boolean isBidiLCat(int cp) { + byte dir = Character.getDirectionality(cp); + return dir == Character.DIRECTIONALITY_LEFT_TO_RIGHT; + } + + /** + * Unassigned Code Points: list of unassigned code points. + * See also RFC 3454, Section 7. + * + *

    + * Note that this implementation does not check exactly the unassigned code points as specified in the RFC since it is based on Java's Unicode support, + * which is updated regularly while the specification is based on a static list of code points. This should have no major impact, though. + * + * @param cp + * the code point of the character to check. + * @return + * true if the character is unassigned, false otherwise. + */ + private static boolean isUnassigned(int cp) { + return !Character.isDefined(cp); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SearchMode.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SearchMode.java new file mode 100644 index 0000000..ee6edff --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SearchMode.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; + +/** + * Search mode flags enumeration. Primarily used by {@link StringInspector}. + */ +public enum SearchMode { + /** + * Allow backslash escapes. + */ + ALLOW_BACKSLASH_ESCAPE, + /** + * Skip between markers (quoted text, quoted identifiers, text between parentheses). + */ + SKIP_BETWEEN_MARKERS, + /** + * Skip between block comments ("/* text... *\/") but not between hint blocks. + */ + SKIP_BLOCK_COMMENTS, + /** + * Skip line comments ("-- text...", "# text..."). + */ + SKIP_LINE_COMMENTS, + /** + * Skip MySQL specific markers ("/*![12345]" and "*\/") but not their contents. + */ + SKIP_MYSQL_MARKERS, + /** + * Skip hint blocks ("/*+ text... *\/"). + */ + SKIP_HINT_BLOCKS, + /** + * Skip white space. + */ + SKIP_WHITE_SPACE, + /** + * Dummy search mode. Does nothing. + */ + VOID; + + /* + * Convenience EnumSets for several SearchMode combinations + */ + + /** + * Full search mode: allow backslash escape, skip between markers, skip block comments, skip line comments, skip MySQL markers, skip hint blocks and skip + * white space. + * This is technically equivalent to __BSE_MRK_COM_MYM_HNT_WS. + */ + public static final Set __FULL = Collections.unmodifiableSet(EnumSet.allOf(SearchMode.class)); + + /** + * Search mode: allow backslash escape, skip between markers, skip block comments, skip line comments, skip MySQL markers, skip hint blocks and skip + * white space. + */ + public static final Set __BSE_MRK_COM_MYM_HNT_WS = Collections.unmodifiableSet(EnumSet.of(ALLOW_BACKSLASH_ESCAPE, SKIP_BETWEEN_MARKERS, + SKIP_BLOCK_COMMENTS, SKIP_LINE_COMMENTS, SKIP_MYSQL_MARKERS, SKIP_HINT_BLOCKS, SKIP_WHITE_SPACE)); + + /** + * Search mode: skip between markers, skip block comments, skip line comments, skip MySQL markers, skip hint blocks and skip white space. + */ + public static final Set __MRK_COM_MYM_HNT_WS = Collections + .unmodifiableSet(EnumSet.of(SKIP_BETWEEN_MARKERS, SKIP_BLOCK_COMMENTS, SKIP_LINE_COMMENTS, SKIP_MYSQL_MARKERS, SKIP_HINT_BLOCKS, SKIP_WHITE_SPACE)); + + /** + * Search mode: allow backslash escape, skip block comments, skip line comments, skip MySQL markers, skip hint blocks and skip white space. + */ + public static final Set __BSE_COM_MYM_HNT_WS = Collections.unmodifiableSet( + EnumSet.of(ALLOW_BACKSLASH_ESCAPE, SKIP_BLOCK_COMMENTS, SKIP_LINE_COMMENTS, SKIP_MYSQL_MARKERS, SKIP_HINT_BLOCKS, SKIP_WHITE_SPACE)); + + /** + * Search mode: skip block comments, skip line comments, skip MySQL markers, skip hint blocks and skip white space. + */ + public static final Set __COM_MYM_HNT_WS = Collections + .unmodifiableSet(EnumSet.of(SKIP_BLOCK_COMMENTS, SKIP_LINE_COMMENTS, SKIP_MYSQL_MARKERS, SKIP_HINT_BLOCKS, SKIP_WHITE_SPACE)); + + /** + * Search mode: allow backslash escape, skip between markers and skip white space. + */ + public static final Set __BSE_MRK_WS = Collections.unmodifiableSet(EnumSet.of(ALLOW_BACKSLASH_ESCAPE, SKIP_BETWEEN_MARKERS, SKIP_WHITE_SPACE)); + + /** + * Search mode: skip between markers and skip white space. + */ + public static final Set __MRK_WS = Collections.unmodifiableSet(EnumSet.of(SKIP_BETWEEN_MARKERS, SKIP_WHITE_SPACE)); + + /** + * Empty search mode. + * There must be at least one element so that the Set may be later duplicated if needed. + */ + public static final Set __NONE = Collections.unmodifiableSet(EnumSet.of(VOID)); +} \ No newline at end of file diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SequentialIdLease.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SequentialIdLease.java new file mode 100644 index 0000000..39d5d7d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/SequentialIdLease.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.Iterator; +import java.util.Set; +import java.util.TreeSet; + +public class SequentialIdLease { + private Set sequentialIdsLease = new TreeSet<>(); + + /** + * Finds and allocates the first available sequential id. + * + * @return the next free sequential id. + */ + public int allocateSequentialId() { + int nextSequentialId = 0; + for (Iterator it = this.sequentialIdsLease.iterator(); it.hasNext() && nextSequentialId + 1 == it.next(); nextSequentialId++) { + // Find the first free sequential id. + } + this.sequentialIdsLease.add(++nextSequentialId); + return nextSequentialId; + } + + /** + * Frees the given sequential id so that it can be reused. + * + * @param sequentialId + * the sequential id to release + */ + public void releaseSequentialId(int sequentialId) { + this.sequentialIdsLease.remove(sequentialId); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringInspector.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringInspector.java new file mode 100644 index 0000000..db08331 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringInspector.java @@ -0,0 +1,990 @@ +/* + * Copyright (c) 2021, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import com.mysql.cj.Messages; + +/** + * Utility class to inspect a MySQL string, typically a query string. + * + * Provides string searching and manipulation operations such as finding sub-strings, matching sub-strings or building a comments-free version of a string. + * + * This object keeps internal state that affect the operations, e.g., executing an indexOf operation after another causes the second to start the search form + * where the previous one stopped. + */ +public class StringInspector { + // Length of MySQL version reference in comments of type '/*![00000] */'. + private static final int NON_COMMENTS_MYSQL_VERSION_REF_LENGTH = 5; + + private String source = null; + private String openingMarkers = null; + private String closingMarkers = null; + private String overridingMarkers = null; + private Set defaultSearchMode = null; + + private int srcLen = 0; + private int pos = 0; + private int stopAt = 0; + private boolean escaped = false; + private boolean inMysqlBlock = false; + + private int markedPos = this.pos; + private int markedStopAt = this.stopAt; + private boolean markedEscape = this.escaped; + private boolean markedInMysqlBlock = this.inMysqlBlock; + + /** + * This object provides string searching and manipulation operations such as finding sub-strings, matching sub-strings or building a comments-free version + * of a string. + * + * @param source + * the source string to process + * @param openingMarkers + * the characters that can delimit the beginning of a quoted text block + * @param closingMarkers + * the characters that can delimit the end of a of a quoted text block. The length of this parameter must match the length of th previous one + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(", + * closingMarkers = "')" and overridingMarkers = "'" then the block between the outer parenthesis in "start + * ('max('); end" is strictly consumed, otherwise the suffix "'); end" would end up being consumed too in the process of + * handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the default flags from the enum {@link SearchMode} that determine the behavior + * of the search and manipulation operations. Note that some operation may override the search mode according to their needs, but the default one + * is not touched. + */ + public StringInspector(String source, String openingMarkers, String closingMarkers, String overridingMarkers, Set searchMode) { + this(source, 0, openingMarkers, closingMarkers, overridingMarkers, searchMode); + } + + /** + * This object provides string searching and manipulation operations such as finding sub-strings, matching sub-strings or building a comments-free version + * of a string. + * + * @param source + * the source string to process + * @param startingPosition + * the position from where the source string will be processed + * @param openingMarkers + * the characters that can delimit the beginning of a quoted text block + * @param closingMarkers + * the characters that can delimit the end of a of a quoted text block. The length of this parameter must match the length of th previous one + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(", + * closingMarkers = "')" and overridingMarkers = "'" then the block between the outer parenthesis in "start + * ('max('); end" is strictly consumed, otherwise the suffix "'); end" would end up being consumed too in the process of + * handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the default flags from the enum {@link SearchMode} that determine the behavior + * of the search and manipulation operations. Note that some operation may override the search mode according to their needs, but the default one + * is not touched. + */ + public StringInspector(String source, int startingPosition, String openingMarkers, String closingMarkers, String overridingMarkers, + Set searchMode) { + if (source == null) { + throw new IllegalArgumentException(Messages.getString("StringInspector.1")); + } + + this.source = source; + this.openingMarkers = openingMarkers; + this.closingMarkers = closingMarkers; + this.overridingMarkers = overridingMarkers; + this.defaultSearchMode = searchMode; + + if (this.defaultSearchMode.contains(SearchMode.SKIP_BETWEEN_MARKERS)) { + if (this.openingMarkers == null || this.closingMarkers == null || this.openingMarkers.length() != this.closingMarkers.length()) { + throw new IllegalArgumentException(Messages.getString("StringInspector.2", new String[] { this.openingMarkers, this.closingMarkers })); + } + if (this.overridingMarkers == null) { + throw new IllegalArgumentException(Messages.getString("StringInspector.3", new String[] { this.overridingMarkers, this.openingMarkers })); + } + for (char c : this.overridingMarkers.toCharArray()) { + if (this.openingMarkers.indexOf(c) == -1) { + throw new IllegalArgumentException(Messages.getString("StringInspector.3", new String[] { this.overridingMarkers, this.openingMarkers })); + } + } + } + + this.srcLen = source.length(); + this.pos = 0; + this.stopAt = this.srcLen; + + setStartPosition(startingPosition); + } + + /** + * Sets the position from where the source string will be processed from now on, taking into consideration the "escaped" status of current character, if + * the mode {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is present in the default search mode. + * + * @param pos + * the position from where the source string will be processed + * @return + * the previous current position value + */ + public int setStartPosition(int pos) { + if (pos < 0) { + throw new IllegalArgumentException(Messages.getString("StringInspector.4")); + } + if (pos > this.stopAt) { + throw new IllegalArgumentException(Messages.getString("StringInspector.5")); + } + int prevPos = this.pos; + this.pos = pos; + resetEscaped(); + this.inMysqlBlock = false; + return prevPos; + } + + /** + * Sets the position where the source string processing will stop. + * + * @param pos + * the position where the source string will stop being processed + * @return + * the previous stop position value + */ + public int setStopPosition(int pos) { + if (pos < 0) { + throw new IllegalArgumentException(Messages.getString("StringInspector.6")); + } + if (pos > this.srcLen) { + throw new IllegalArgumentException(Messages.getString("StringInspector.7")); + } + int prevPos = this.stopAt; + this.stopAt = pos; + return prevPos; + } + + /** + * Marks the current object's state. A subsequent call to the {@link #reset()} method restores the marked state. + */ + public void mark() { + this.markedPos = this.pos; + this.markedStopAt = this.stopAt; + this.markedEscape = this.escaped; + this.markedInMysqlBlock = this.inMysqlBlock; + } + + /** + * Resets this object's state to previously mark state. + */ + public void reset() { + this.pos = this.markedPos; + this.stopAt = this.markedStopAt; + this.escaped = this.markedEscape; + this.inMysqlBlock = this.markedInMysqlBlock; + } + + /** + * Resets this object's state to original values. Allows to reuse the object from a fresh start. + */ + public void restart() { + this.pos = 0; + this.stopAt = this.srcLen; + this.escaped = false; + this.inMysqlBlock = false; + } + + /** + * Returns the character in the current position. + * + * @return + * the character in the current position + */ + public char getChar() { + if (this.pos >= this.stopAt) { + return Character.MIN_VALUE; + } + return this.source.charAt(this.pos); + } + + /** + * Returns the current position. + * + * @return + * the current position + */ + public int getPosition() { + return this.pos; + } + + /** + * Increments the current position index, by one, taking into consideration the "escaped" status of current character, if the mode + * {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is present in the default search mode. + * + * @return + * the new current position + */ + public int incrementPosition() { + return incrementPosition(this.defaultSearchMode); + } + + /** + * Increments the current position index, by one, taking into consideration the "escaped" status of current character, if the mode + * {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is present in the search mode specified. + * + * @param searchMode + * the search mode to use in this operation + * @return + * the new current position + */ + public int incrementPosition(Set searchMode) { + if (this.pos >= this.stopAt) { + return -1; + } + if (searchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE) && getChar() == '\\') { + this.escaped = !this.escaped; + } else if (this.escaped) { + this.escaped = false; + } + return ++this.pos; + } + + /** + * Increments the current position index, by be given number, taking into consideration the "escaped" status of current character, if the mode + * {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is present in the default search mode. + * + * @param by + * the number of positions to increment + * @return + * the new current position + */ + public int incrementPosition(int by) { + return incrementPosition(by, this.defaultSearchMode); + } + + /** + * Increments the current position index, by be given number, taking into consideration the "escaped" status of current character, if the mode + * {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is present in the specified search mode. + * + * @param by + * the number of positions to increment + * @param searchMode + * the search mode to use in this operation + * @return + * the new current position + */ + public int incrementPosition(int by, Set searchMode) { + for (int i = 0; i < by; i++) { + if (incrementPosition(searchMode) == -1) { + return -1; + } + } + return this.pos; + } + + /** + * Checks if the current character is escaped by analyzing previous characters, as long as the search mode {@link SearchMode#ALLOW_BACKSLASH_ESCAPE} is + * present in the default search mode. + */ + private void resetEscaped() { + this.escaped = false; + if (this.defaultSearchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE)) { + for (int i = this.pos - 1; i >= 0; i--) { + if (this.source.charAt(i) != '\\') { + break; + } + this.escaped = !this.escaped; + } + } + } + + /** + * Returns the position of the next valid character. This method does not increment the current position automatically, i.e., if already positioned in a + * valid character then repeated calls return always the same index. + * If the character in the current position matches one of the prefixes that determine a skipping block, then the position marker advances to the first + * character after the block to skip. + * + * @return + * the position of the next valid character, or the current position if already on a valid character + */ + public int indexOfNextChar() { + return indexOfNextChar(this.defaultSearchMode); + } + + /** + * Returns the position of the next valid character using the given search mode instead of the default one. This method does not increment the current + * position automatically, i.e., if already positioned in a valid character then repeated calls return always the same index. + * If the character in the current position matches one of the prefixes that determine a skipping block, then the position marker advances to the first + * character after the block to skip. + * + * @param searchMode + * the search mode to use in this operation + * @return + * the position of the next valid character, or the current position if already on a valid character + */ + private int indexOfNextChar(Set searchMode) { + if (this.source == null) { + return -1; + } + + if (this.pos >= this.stopAt) { + return -1; + } + + char c0 = Character.MIN_VALUE; // Current char. + char c1 = this.source.charAt(this.pos); // Lookahead(1). + char c2 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; // Lookahead(2). + + for (; this.pos < this.stopAt; this.pos++) { + c0 = c1; + c1 = c2; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + + boolean dashDashCommentImmediateEnd = false; + boolean checkSkipConditions = !searchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE) || !this.escaped; + + if (checkSkipConditions && searchMode.contains(SearchMode.SKIP_BETWEEN_MARKERS) && this.openingMarkers.indexOf(c0) != -1) { + // Opening marker found, skip until closing. + indexOfClosingMarker(searchMode); + if (this.pos >= this.stopAt) { + this.pos--; // Reached stop position. Correct position will be set by outer loop. + } else { + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + } + + } else if (checkSkipConditions && searchMode.contains(SearchMode.SKIP_BLOCK_COMMENTS) && c0 == '/' && c1 == '*' && c2 != '!' && c2 != '+') { + // Comments block found, skip until end of block ("*/") (backslash escape doesn't work in comments). + // Does not include hint blocks ("/*!" or "/*+"). + this.pos++; // Move to next char ('*'). + while (++this.pos < this.stopAt && (this.source.charAt(this.pos) != '*' + || (this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE) != '/')) { + // Continue + } + if (this.pos >= this.stopAt) { + this.pos--; // Reached stop position. Correct position will be set by outer loop. + } else { + this.pos++; // Move to next char ('/'). + } + + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + + } else if (checkSkipConditions && searchMode.contains(SearchMode.SKIP_LINE_COMMENTS) + && ((c0 == '-' && c1 == '-' && (Character.isWhitespace(c2) || (dashDashCommentImmediateEnd = c2 == ';') || c2 == Character.MIN_VALUE)) + || c0 == '#')) { + if (dashDashCommentImmediateEnd) { + // Comments line found but closed immediately by query delimiter marker. + this.pos++; // Move to next char ('-'). + this.pos++; // Move to next char (';'). + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + } else { + // Comments line found, skip until EOL (backslash escape doesn't work on comments). + while (++this.pos < this.stopAt && (c0 = this.source.charAt(this.pos)) != '\n' && c0 != '\r') { + // Continue. + } + if (this.pos >= this.stopAt) { + this.pos--; // Reached stop position. Correct position will be set by outer loop. + } else { + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + if (c0 == '\r' && c1 == '\n') { + // \r\n sequence found. + this.pos++; // Skip next char ('\n'). + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + } + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + } + } + + } else if (checkSkipConditions && searchMode.contains(SearchMode.SKIP_HINT_BLOCKS) && c0 == '/' && c1 == '*' && c2 == '+') { + // Hints block found, skip until end of block ("*/") (backslash escape doesn't work in hints). + this.pos++; // Move to next char ('*'). + this.pos++; // Move to next char ('+'). + while (++this.pos < this.stopAt && (this.source.charAt(this.pos) != '*' + || (this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE) != '/')) { + // Continue + } + if (this.pos >= this.stopAt) { + this.pos--; // Reached stop position. Correct position will be set by outer loop. + } else { + this.pos++; // Move to next char ('/'). + } + + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + + } else if (checkSkipConditions && searchMode.contains(SearchMode.SKIP_MYSQL_MARKERS) && c0 == '/' && c1 == '*' && c2 == '!') { + // MySQL specific block found, move to end of opening marker ("/*![12345]"). + this.pos++; // Move to next char ('*'). + this.pos++; // Move to next char ('!'). + if (c2 == '!') { + // Check if 5 digits MySQL version reference comes next, if so skip them. + int i = 0; + for (; i < NON_COMMENTS_MYSQL_VERSION_REF_LENGTH; i++) { + if (this.pos + 1 + i >= this.srcLen || !Character.isDigit(this.source.charAt(this.pos + 1 + i))) { + break; + } + } + if (i == NON_COMMENTS_MYSQL_VERSION_REF_LENGTH) { + this.pos += NON_COMMENTS_MYSQL_VERSION_REF_LENGTH; + if (this.pos >= this.stopAt) { + this.pos = this.stopAt - 1; // Reached stop position. Correct position will be set by outer loop. + } + } + } + + // Reset lookahead. + c1 = this.pos + 1 < this.srcLen ? this.source.charAt(this.pos + 1) : Character.MIN_VALUE; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + + this.inMysqlBlock = true; + + } else if (this.inMysqlBlock && checkSkipConditions && searchMode.contains(SearchMode.SKIP_MYSQL_MARKERS) && c0 == '*' && c1 == '/') { + // MySQL block closing marker ("*/") found. + this.pos++; // move to next char ('/') + // Reset lookahead. + c1 = c2; + c2 = this.pos + 2 < this.srcLen ? this.source.charAt(this.pos + 2) : Character.MIN_VALUE; + + this.inMysqlBlock = false; + + } else if (!searchMode.contains(SearchMode.SKIP_WHITE_SPACE) || !Character.isWhitespace(c0)) { + // Whitespace is not affected by backslash escapes. + return this.pos; + } + + // Reaching here means that the position has incremented thus an 'escaped' status no longer holds. + this.escaped = false; + } + + return -1; + } + + /** + * Returns the position of the next closing marker corresponding to the opening marker in the current position. + * If the current position is not an opening marker, then -1 is returned instead. + * + * @param searchMode + * the search mode to use in this operation + * @return + * the position of the next closing marker corresponding to the opening marker in the current position + */ + private int indexOfClosingMarker(Set searchMode) { + if (this.source == null) { + return -1; + } + + if (this.pos >= this.stopAt) { + return -1; + } + + char c0 = this.source.charAt(this.pos); // Current char, also the opening marker. + int markerIndex = this.openingMarkers.indexOf(c0); + if (markerIndex == -1) { + // Not at an opening marker. + return this.pos; + } + + int nestedMarkersCount = 0; + char openingMarker = c0; + char closingMarker = this.closingMarkers.charAt(markerIndex); + boolean outerIsAnOverridingMarker = this.overridingMarkers.indexOf(openingMarker) != -1; + while (++this.pos < this.stopAt && ((c0 = this.source.charAt(this.pos)) != closingMarker || nestedMarkersCount != 0)) { + if (!outerIsAnOverridingMarker && this.overridingMarkers.indexOf(c0) != -1) { + // There is an overriding marker that needs to be consumed before returning to the previous marker. + int overridingMarkerIndex = this.openingMarkers.indexOf(c0); // OverridingMarkers must be a sub-list of openingMarkers. + int overridingNestedMarkersCount = 0; + char overridingOpeningMarker = c0; + char overridingClosingMarker = this.closingMarkers.charAt(overridingMarkerIndex); + while (++this.pos < this.stopAt && ((c0 = this.source.charAt(this.pos)) != overridingClosingMarker || overridingNestedMarkersCount != 0)) { + // Do as in the outer loop, except that this marker cannot be overridden. + if (c0 == overridingOpeningMarker) { + overridingNestedMarkersCount++; + } else if (c0 == overridingClosingMarker) { + overridingNestedMarkersCount--; + } else if (searchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE) && c0 == '\\') { + this.pos++; // Next char is escaped, skip it. + } + } + + if (this.pos >= this.stopAt) { + this.pos--; // Reached stop position. Correct position will be set by outer loop. + } + } else if (c0 == openingMarker) { + nestedMarkersCount++; + } else if (c0 == closingMarker) { + nestedMarkersCount--; + } else if (searchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE) && c0 == '\\') { + this.pos++; // Next char is escaped, skip it. + } + } + + return this.pos; + } + + /** + * Returns the position of the next alphanumeric character regardless the default search mode originally specified. This method does not increment the + * current position automatically, i.e., if already positioned in a valid character then repeated calls return always the same index. + * If the character in the current position matches one of the prefixes that determine a skipping block, then the position marker advances to the first + * alphanumeric character after the block to skip. + * + * @return + * the position of the next valid character, or the current position if already on a valid character + */ + public int indexOfNextAlphanumericChar() { + if (this.source == null) { + return -1; + } + + if (this.pos >= this.stopAt) { + return -1; + } + + Set searchMode = this.defaultSearchMode; + if (!this.defaultSearchMode.contains(SearchMode.SKIP_WHITE_SPACE)) { + searchMode = EnumSet.copyOf(this.defaultSearchMode); + searchMode.add(SearchMode.SKIP_WHITE_SPACE); + } + + while (this.pos < this.stopAt) { + int prevPos = this.pos; + if (indexOfNextChar(searchMode) == -1) { + return -1; + } + if (Character.isLetterOrDigit(this.source.charAt(this.pos))) { + return this.pos; + } + if (this.pos == prevPos) { + // Position didn't move but also not yet at an alphanumeric. + incrementPosition(searchMode); + } + } + return -1; + } + + /** + * Returns the position of the next non-whitespace character regardless the default search mode originally specified. This method does not increment the + * current position automatically, i.e., if already positioned in a valid character then repeated calls return always the same index. + * If the character in the current position matches one of the prefixes that determine a skipping block, then the position marker advances to the first + * non-whitespace character after the block to skip. + * + * @return + * the position of the next valid character, or the current position if already on a valid character + */ + public int indexOfNextNonWsChar() { + if (this.source == null) { + return -1; + } + + if (this.pos >= this.stopAt) { + return -1; + } + + Set searchMode = this.defaultSearchMode; + if (!this.defaultSearchMode.contains(SearchMode.SKIP_WHITE_SPACE)) { + searchMode = EnumSet.copyOf(this.defaultSearchMode); + searchMode.add(SearchMode.SKIP_WHITE_SPACE); + } + + return indexOfNextChar(searchMode); + } + + /** + * Returns the position of the next whitespace character regardless the default search mode originally specified. This method does not increment the + * current position automatically, i.e., if already positioned in a valid character then repeated calls return always the same index. + * If the character in the current position matches one of the prefixes that determine a skipping block, then the position marker advances to the first + * whitespace character after the block to skip. + * + * @return + * the position of the next valid character, or the current position if already on a valid character + */ + public int indexOfNextWsChar() { + if (this.source == null) { + return -1; + } + + if (this.pos >= this.stopAt) { + return -1; + } + + Set searchMode = this.defaultSearchMode; + if (this.defaultSearchMode.contains(SearchMode.SKIP_WHITE_SPACE)) { + searchMode = EnumSet.copyOf(this.defaultSearchMode); + searchMode.remove(SearchMode.SKIP_WHITE_SPACE); + } + + while (this.pos < this.stopAt) { + int prevPos = this.pos; + if (indexOfNextChar(searchMode) == -1) { + return -1; + } + if (Character.isWhitespace(this.source.charAt(this.pos))) { + return this.pos; + } + if (this.pos == prevPos) { + // Position didn't move but also not yet at a white space. + incrementPosition(searchMode); + } + } + return -1; + } + + /** + * Finds the position of the given string within the source string, ignoring case, with the option to skip text delimited by the specified markers or inside + * comment blocks. + * + * @param searchFor + * the sub-string to search for + * @return + * the position where the sub-string is found, starting from the current position, or -1 if not found + */ + public int indexOfIgnoreCase(String searchFor) { + return indexOfIgnoreCase(searchFor, this.defaultSearchMode); + } + + /** + * Finds the position of the given string within the source string, ignoring case, with the option to skip text delimited by the specified markers or inside + * comment blocks. + * + * @param searchFor + * the sub-string to search for + * @param searchMode + * the search mode to use in this operation + * @return + * the position where the sub-string is found, starting from the current position, or -1 if not found + */ + public int indexOfIgnoreCase(String searchFor, Set searchMode) { + if (searchFor == null) { + return -1; + } + + int searchForLength = searchFor.length(); + int localStopAt = this.srcLen - searchForLength + 1; + if (localStopAt > this.stopAt) { + localStopAt = this.stopAt; + } + + if (this.pos >= localStopAt || searchForLength == 0) { + return -1; + } + + // Some locales don't follow upper-case rule, so need to check both. + char firstCharOfSearchForUc = Character.toUpperCase(searchFor.charAt(0)); + char firstCharOfSearchForLc = Character.toLowerCase(searchFor.charAt(0)); + + Set localSearchMode = searchMode; + if (Character.isWhitespace(firstCharOfSearchForLc) && this.defaultSearchMode.contains(SearchMode.SKIP_WHITE_SPACE)) { + // Can't skip white spaces if first searchFor char is one. + localSearchMode = EnumSet.copyOf(this.defaultSearchMode); + localSearchMode.remove(SearchMode.SKIP_WHITE_SPACE); + } + + while (this.pos < localStopAt) { + if (indexOfNextChar(localSearchMode) == -1) { + return -1; + } + + if (StringUtils.isCharEqualIgnoreCase(getChar(), firstCharOfSearchForUc, firstCharOfSearchForLc) + && StringUtils.regionMatchesIgnoreCase(this.source, this.pos, searchFor)) { + return this.pos; + } + + incrementPosition(localSearchMode); + } + + return -1; + } + + /** + * Finds the position of the of the first of a consecutive sequence of strings within the source string, ignoring case, with the option to skip text + * delimited by the specified markers or inside comment blocks. + * + *

    + * Independently of the searchMode specified, when searching for the second and following sub-strings {@link SearchMode#SKIP_WHITE_SPACE} will + * be added and {@link SearchMode#SKIP_BETWEEN_MARKERS} removed. + *

    + * + * @param searchFor + * the sequence of sub-strings to search + * @return + * the position where the first sub-string is found, starting from the current position, or -1 if not found + */ + public int indexOfIgnoreCase(String... searchFor) { + if (searchFor == null) { + return -1; + } + + int searchForLength = 0; + for (String searchForPart : searchFor) { + searchForLength += searchForPart.length(); + } // Minimum length for searchFor (without gaps between words). + + if (searchForLength == 0) { + return -1; + } + + int searchForWordsCount = searchFor.length; + searchForLength += searchForWordsCount > 0 ? searchForWordsCount - 1 : 0; // Count gaps between words. + int localStopAt = this.srcLen - searchForLength + 1; + if (localStopAt > this.stopAt) { + localStopAt = this.stopAt; + } + + if (this.pos >= localStopAt) { + return -1; + } + + Set searchMode1 = this.defaultSearchMode; + if (Character.isWhitespace(searchFor[0].charAt(0)) && this.defaultSearchMode.contains(SearchMode.SKIP_WHITE_SPACE)) { + // Cannot skip white spaces if first searchFor char is one. + searchMode1 = EnumSet.copyOf(this.defaultSearchMode); + searchMode1.remove(SearchMode.SKIP_WHITE_SPACE); + } + + // searchMode used to search 2nd and following words cannot contain SearchMode.SKIP_BETWEEN_MARKERS and must contain SearchMode.SKIP_WHITE_SPACE. + Set searchMode2 = EnumSet.copyOf(this.defaultSearchMode); + searchMode2.add(SearchMode.SKIP_WHITE_SPACE); + searchMode2.remove(SearchMode.SKIP_BETWEEN_MARKERS); + + while (this.pos < localStopAt) { + int positionOfFirstWord = indexOfIgnoreCase(searchFor[0], searchMode1); + if (positionOfFirstWord == -1 || positionOfFirstWord >= localStopAt) { + return -1; + } + mark(); + + int startingPositionForNextWord = incrementPosition(searchFor[0].length(), searchMode2); + int wc = 0; + boolean match = true; + while (++wc < searchForWordsCount && match) { + if (indexOfNextChar(searchMode2) == -1 || startingPositionForNextWord == this.pos + || !StringUtils.regionMatchesIgnoreCase(this.source, this.pos, searchFor[wc])) { + // Either there are no more chars to search, there is no gap between words or match failed. + match = false; + } else { + startingPositionForNextWord = incrementPosition(searchFor[wc].length(), searchMode2); + } + } + + if (match) { + reset(); + return positionOfFirstWord; + } + } + + return -1; + } + + /** + * Checks if the given string matches the source string counting from the current position, ignoring case, with the option to skip text delimited by the + * specified markers or inside comment blocks. + * + * @param toMatch + * the sub-string to match + * @return + * the position where the sub-string match ended, or -1 if not matched + */ + public int matchesIgnoreCase(String toMatch) { + if (toMatch == null) { + return -1; + } + + int toMatchLength = toMatch.length(); + int localStopAt = this.srcLen - toMatchLength + 1; + if (localStopAt > this.stopAt) { + localStopAt = this.stopAt; + } + + if (this.pos >= localStopAt || toMatchLength == 0) { + return -1; + } + + // Some locales don't follow upper-case rule, so need to check both. + char firstCharOfToMatchUc = Character.toUpperCase(toMatch.charAt(0)); + char firstCharOfToMatchLc = Character.toLowerCase(toMatch.charAt(0)); + + if (StringUtils.isCharEqualIgnoreCase(getChar(), firstCharOfToMatchUc, firstCharOfToMatchLc) + && StringUtils.regionMatchesIgnoreCase(this.source, this.pos, toMatch)) { + return this.pos + toMatchLength; + } + + return -1; + } + + /** + * Checks if the given consecutive sequence of strings matches the source string counting from the current position, ignoring case, with the option to skip + * text delimited by the specified markers or inside comment blocks. + * + *

    + * Independently of the searchMode specified, when matching the second and following sub-strings {@link SearchMode#SKIP_WHITE_SPACE} will be + * added and {@link SearchMode#SKIP_BETWEEN_MARKERS} removed. + *

    + * + * @param toMatch + * the sequence of sub-strings to match + * @return + * the position where the sequence of sub-strings match ended, or -1 if not matched + */ + public int matchesIgnoreCase(String... toMatch) { + if (toMatch == null) { + return -1; + } + + int toMatchLength = 0; + for (String toMatchPart : toMatch) { + toMatchLength += toMatchPart.length(); + } // Minimum length for searchFor (without gaps between words). + + if (toMatchLength == 0) { + return -1; + } + + int toMatchWordsCount = toMatch.length; + toMatchLength += toMatchWordsCount > 0 ? toMatchWordsCount - 1 : 0; // Count gaps between words. + int localStopAt = this.srcLen - toMatchLength + 1; + if (localStopAt > this.stopAt) { + localStopAt = this.stopAt; + } + + if (this.pos >= localStopAt) { + return -1; + } + + // searchMode used to match 2nd and following words cannot contain SearchMode.SKIP_BETWEEN_MARKERS and must contain SearchMode.SKIP_WHITE_SPACE. + Set searchMode2 = EnumSet.copyOf(this.defaultSearchMode); + searchMode2.add(SearchMode.SKIP_WHITE_SPACE); + searchMode2.remove(SearchMode.SKIP_BETWEEN_MARKERS); + + mark(); + int endOfMatch = -1; + int startingPositionForNextWord = -1; + for (String searchForPart : toMatch) { + if (getPosition() == startingPositionForNextWord) { + // There is no gap between words. + reset(); + return -1; + } + + endOfMatch = matchesIgnoreCase(searchForPart); + if (endOfMatch == -1) { + reset(); + return -1; + } + + startingPositionForNextWord = incrementPosition(searchForPart.length(), searchMode2); + indexOfNextChar(searchMode2); + } + reset(); + return endOfMatch; + } + + /** + * Returns a copy of the source string stripped of all comments and hints. + * + * @return + * a comments-free string + */ + public String stripCommentsAndHints() { + restart(); + + Set searchMode = EnumSet.of(SearchMode.SKIP_BLOCK_COMMENTS, SearchMode.SKIP_LINE_COMMENTS, SearchMode.SKIP_HINT_BLOCKS); + if (this.defaultSearchMode.contains(SearchMode.ALLOW_BACKSLASH_ESCAPE)) { + searchMode.add(SearchMode.ALLOW_BACKSLASH_ESCAPE); + } + + StringBuilder noCommsStr = new StringBuilder(this.source.length()); + while (this.pos < this.stopAt) { + int prevPos = this.pos; + if (indexOfNextChar(searchMode) == -1) { + return noCommsStr.toString(); + } + + if (!this.escaped && this.openingMarkers.indexOf(getChar()) != -1) { + // Characters between markers must be taken all at once otherwise indexOfNextChar() would skip them if they contain comments-like text. + int idxOpMrkr = this.pos; + if (indexOfClosingMarker(searchMode) < this.srcLen) { + incrementPosition(searchMode); // Include the closing marker. + } + noCommsStr.append(this.source, idxOpMrkr, this.pos); + } else { + if (this.pos - prevPos > 1) { // Non consecutive characters, there was a comment in between. Add a space if needed. + if (prevPos > 0 && !Character.isWhitespace(this.source.charAt(prevPos - 1)) && !Character.isWhitespace(this.source.charAt(this.pos))) { + noCommsStr.append(" "); + } + } + noCommsStr.append(getChar()); + incrementPosition(searchMode); + } + } + + return noCommsStr.toString(); + } + + /** + * Splits the source string by the given delimiter. Consecutive delimiters result in empty string parts. + * + * @param delimiter + * the characters sequence where to split the source string + * @param trim + * whether each one of the parts should be trimmed or not + * @return + * a {@link List} containing all the string parts + */ + public List split(String delimiter, boolean trim) { + if (delimiter == null) { + throw new IllegalArgumentException(Messages.getString("StringInspector.8")); + } + + restart(); + + int startPos = 0; + List splitParts = new ArrayList<>(); + while (indexOfIgnoreCase(delimiter) != -1) { + indexOfIgnoreCase(delimiter); + String part = this.source.substring(startPos, this.pos); + if (trim) { + part = part.trim(); + } + splitParts.add(part); + startPos = incrementPosition(delimiter.length()); + } + + // Add last part. + String token = this.source.substring(startPos); + if (trim) { + token = token.trim(); + } + splitParts.add(token); + + return splitParts; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringUtils.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringUtils.java new file mode 100644 index 0000000..52c6bf5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/StringUtils.java @@ -0,0 +1,1855 @@ +/* + * Copyright (c) 2002, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.io.ByteArrayOutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.UnsupportedCharsetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; + +import com.mysql.cj.Messages; +import com.mysql.cj.ServerVersion; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; + +/** + * Various utility methods for converting to/from byte arrays in the platform encoding and several other String operations. + */ +public class StringUtils { + private static final int WILD_COMPARE_MATCH = 0; + private static final int WILD_COMPARE_CONTINUE_WITH_WILD = 1; + private static final int WILD_COMPARE_NO_MATCH = -1; + + static final char WILDCARD_MANY = '%'; + static final char WILDCARD_ONE = '_'; + static final char WILDCARD_ESCAPE = '\\'; + + private static final String VALID_ID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789$_#@"; + + /** + * Returns the given bytes as a hex and ASCII dump (up to length bytes). + * + * @param byteBuffer + * the data to dump as hex + * @param length + * the number of bytes to print + * + * @return a hex and ASCII dump + */ + public static String dumpAsHex(byte[] byteBuffer, int length) { + length = Math.min(length, byteBuffer.length); + StringBuilder fullOutBuilder = new StringBuilder(length * 4); + StringBuilder asciiOutBuilder = new StringBuilder(16); + + for (int p = 0, l = 0; p < length; l = 0) { // p: position in buffer (1..length); l: position in line (1..8) + for (; l < 8 && p < length; p++, l++) { + int asInt = byteBuffer[p] & 0xff; + if (asInt < 0x10) { + fullOutBuilder.append("0"); + } + fullOutBuilder.append(Integer.toHexString(asInt)).append(" "); + asciiOutBuilder.append(" ").append(asInt >= 0x20 && asInt < 0x7f ? (char) asInt : "."); + } + for (; l < 8; l++) { // if needed, fill remaining of last line with spaces + fullOutBuilder.append(" "); + } + fullOutBuilder.append(" ").append(asciiOutBuilder).append(System.lineSeparator()); + asciiOutBuilder.setLength(0); + } + return fullOutBuilder.toString(); + } + + /** + * Converts the given byte array into Hex String, stopping at given length. + * + * @param byteBuffer + * the byte array to convert + * @param length + * the number of bytes from the given array to convert + * @return + * a String containing the Hex representation of the given bytes + */ + public static String toHexString(byte[] byteBuffer, int length) { + length = Math.min(length, byteBuffer.length); + StringBuilder outputBuilder = new StringBuilder(length * 2); + for (int i = 0; i < length; i++) { + int asInt = byteBuffer[i] & 0xff; + if (asInt < 0x10) { + outputBuilder.append("0"); + } + outputBuilder.append(Integer.toHexString(asInt)); + } + return outputBuilder.toString(); + } + + private static boolean endsWith(byte[] dataFrom, String suffix) { + for (int i = 1; i <= suffix.length(); i++) { + int dfOffset = dataFrom.length - i; + int suffixOffset = suffix.length() - i; + if (dataFrom[dfOffset] != suffix.charAt(suffixOffset)) { + return false; + } + } + return true; + } + + /** + * Returns the first non-whitespace char, converted to upper case + * + * @param searchIn + * the string to search in + * + * @return the first non-whitespace character, upper cased. + */ + public static char firstNonWsCharUc(String searchIn) { + return firstNonWsCharUc(searchIn, 0); + } + + public static char firstNonWsCharUc(String searchIn, int startAt) { + if (searchIn == null) { + return 0; + } + + int length = searchIn.length(); + + for (int i = startAt; i < length; i++) { + char c = searchIn.charAt(i); + + if (!Character.isWhitespace(c)) { + return Character.toUpperCase(c); + } + } + + return 0; + } + + public static char firstAlphaCharUc(String searchIn, int startAt) { + if (searchIn == null) { + return 0; + } + + int length = searchIn.length(); + + for (int i = startAt; i < length; i++) { + char c = searchIn.charAt(i); + + if (Character.isLetter(c)) { + return Character.toUpperCase(c); + } + } + + return 0; + } + + /** + * Adds '+' to decimal numbers that are positive (MySQL doesn't understand + * them otherwise + * + * @param dString + * The value as a string + * + * @return String the string with a '+' added (if needed) + */ + public static String fixDecimalExponent(String dString) { + int ePos = dString.indexOf('E'); + + if (ePos == -1) { + ePos = dString.indexOf('e'); + } + + if (ePos != -1) { + if (dString.length() > (ePos + 1)) { + char maybeMinusChar = dString.charAt(ePos + 1); + + if (maybeMinusChar != '-' && maybeMinusChar != '+') { + StringBuilder strBuilder = new StringBuilder(dString.length() + 1); + strBuilder.append(dString.substring(0, ePos + 1)); + strBuilder.append('+'); + strBuilder.append(dString.substring(ePos + 1, dString.length())); + dString = strBuilder.toString(); + } + } + } + + return dString; + } + + /** + * Returns the byte[] representation of the given string using the given encoding. + * + * @param s + * source string + * @param encoding + * java encoding + * @return bytes + */ + public static byte[] getBytes(String s, String encoding) { + if (s == null) { + return new byte[0]; + } + if (encoding == null) { + return getBytes(s); + } + try { + return s.getBytes(encoding); + } catch (UnsupportedEncodingException uee) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding }), uee); + } + + } + + /** + * Returns the byte[] representation of the given string properly wrapped between the given char delimiters using the given encoding. + * + * @param s + * source string + * @param beginWrap + * opening char delimiter + * @param endWrap + * closing char delimiter + * @param encoding + * java encoding + * @return bytes + */ + public static byte[] getBytesWrapped(String s, char beginWrap, char endWrap, String encoding) { + byte[] b; + + if (encoding == null) { + StringBuilder strBuilder = new StringBuilder(s.length() + 2); + strBuilder.append(beginWrap); + strBuilder.append(s); + strBuilder.append(endWrap); + + b = getBytes(strBuilder.toString()); + } else { + StringBuilder strBuilder = new StringBuilder(s.length() + 2); + strBuilder.append(beginWrap); + strBuilder.append(s); + strBuilder.append(endWrap); + + s = strBuilder.toString(); + b = getBytes(s, encoding); + } + + return b; + } + + /** + * Finds the position of a substring within a string ignoring case. + * + * @param searchIn + * the string to search in + * @param searchFor + * the array of strings to search for + * @return the position where searchFor is found within searchIn starting from startingPosition. + */ + public static int indexOfIgnoreCase(String searchIn, String searchFor) { + return indexOfIgnoreCase(0, searchIn, searchFor); + } + + /** + * Finds the position of a substring within a string ignoring case. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param searchFor + * the array of strings to search for + * @return the position where searchFor is found within searchIn starting from startingPosition. + */ + public static int indexOfIgnoreCase(int startingPosition, String searchIn, String searchFor) { + if ((searchIn == null) || (searchFor == null)) { + return -1; + } + + int searchInLength = searchIn.length(); + int searchForLength = searchFor.length(); + int stopSearchingAt = searchInLength - searchForLength; + + if (startingPosition > stopSearchingAt || searchForLength == 0) { + return -1; + } + + // Some locales don't follow upper-case rule, so need to check both + char firstCharOfSearchForUc = Character.toUpperCase(searchFor.charAt(0)); + char firstCharOfSearchForLc = Character.toLowerCase(searchFor.charAt(0)); + + for (int i = startingPosition; i <= stopSearchingAt; i++) { + if (isCharAtPosNotEqualIgnoreCase(searchIn, i, firstCharOfSearchForUc, firstCharOfSearchForLc)) { + // find the first occurrence of the first character of searchFor in searchIn + while (++i <= stopSearchingAt && (isCharAtPosNotEqualIgnoreCase(searchIn, i, firstCharOfSearchForUc, firstCharOfSearchForLc))) { + } + } + + if (i <= stopSearchingAt && regionMatchesIgnoreCase(searchIn, i, searchFor)) { + return i; + } + } + + return -1; + } + + /** + * Finds the position of the first of a consecutive sequence of strings within a string, ignoring case, with the option to skip text delimited by given + * markers or within comments. + *

    + * Independently of the searchMode provided, when searching for the second and following strings SearchMode.SKIP_WHITE_SPACE will + * be added and SearchMode.SKIP_BETWEEN_MARKERS removed. + *

    + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param searchForSequence + * searchForSequence + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where searchFor is found within searchIn starting from startingPosition. + */ + public static int indexOfIgnoreCase(int startingPosition, String searchIn, String[] searchForSequence, String openingMarkers, String closingMarkers, + Set searchMode) { + StringInspector strInspector = new StringInspector(searchIn, startingPosition, openingMarkers, closingMarkers, "", searchMode); + return strInspector.indexOfIgnoreCase(searchForSequence); + } + + /** + * Finds the position of a substring within a string, ignoring case, with the option to skip text delimited by given markers or within comments. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where searchFor is found within searchIn starting from startingPosition. + */ + public static int indexOfIgnoreCase(int startingPosition, String searchIn, String searchFor, String openingMarkers, String closingMarkers, + Set searchMode) { + return indexOfIgnoreCase(startingPosition, searchIn, searchFor, openingMarkers, closingMarkers, "", searchMode); + } + + /** + * Finds the position of a substring within a string, ignoring case, with the option to skip text delimited by given markers or within comments. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where searchFor is found within searchIn starting from startingPosition. + */ + public static int indexOfIgnoreCase(int startingPosition, String searchIn, String searchFor, String openingMarkers, String closingMarkers, + String overridingMarkers, Set searchMode) { + StringInspector strInspector = new StringInspector(searchIn, startingPosition, openingMarkers, closingMarkers, overridingMarkers, searchMode); + return strInspector.indexOfIgnoreCase(searchFor); + } + + /** + * Finds the position of the next alphanumeric character within a string, with the option to skip text delimited by given markers or within comments. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where the next non-whitespace character is found within searchIn starting from startingPosition. + */ + public static int indexOfNextAlphanumericChar(int startingPosition, String searchIn, String openingMarkers, String closingMarkers, String overridingMarkers, + Set searchMode) { + StringInspector strInspector = new StringInspector(searchIn, startingPosition, openingMarkers, closingMarkers, overridingMarkers, searchMode); + return strInspector.indexOfNextAlphanumericChar(); + } + + /** + * Finds the position of the next non-whitespace character within a string, with the option to skip text delimited by given markers or within comments. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where the next non-whitespace character is found within searchIn starting from startingPosition. + */ + public static int indexOfNextNonWsChar(int startingPosition, String searchIn, String openingMarkers, String closingMarkers, String overridingMarkers, + Set searchMode) { + StringInspector strInspector = new StringInspector(searchIn, startingPosition, openingMarkers, closingMarkers, overridingMarkers, searchMode); + return strInspector.indexOfNextNonWsChar(); + } + + /** + * Finds the position of the next whitespace character within a string, with the option to skip text delimited by given markers or within comments. + * + * @param startingPosition + * the position to start the search from + * @param searchIn + * the string to search in + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behavior of the search + * @return the position where the next whitespace character is found within searchIn starting from startingPosition. + */ + public static int indexOfNextWsChar(int startingPosition, String searchIn, String openingMarkers, String closingMarkers, String overridingMarkers, + Set searchMode) { + StringInspector strInspector = new StringInspector(searchIn, startingPosition, openingMarkers, closingMarkers, overridingMarkers, searchMode); + return strInspector.indexOfNextWsChar(); + } + + private static boolean isCharAtPosNotEqualIgnoreCase(String searchIn, int pos, char firstCharOfSearchForUc, char firstCharOfSearchForLc) { + return Character.toLowerCase(searchIn.charAt(pos)) != firstCharOfSearchForLc && Character.toUpperCase(searchIn.charAt(pos)) != firstCharOfSearchForUc; + } + + protected static boolean isCharEqualIgnoreCase(char charToCompare, char compareToCharUC, char compareToCharLC) { + return Character.toLowerCase(charToCompare) == compareToCharLC || Character.toUpperCase(charToCompare) == compareToCharUC; + } + + /** + * Splits stringToSplit into a list, using the given delimiter + * + * @param stringToSplit + * the string to split + * @param delimiter + * the string to split on + * @param trim + * should the split strings be whitespace trimmed? + * + * @return the list of strings, split by delimiter + * + * @throws IllegalArgumentException + * if an error occurs + */ + public static List split(String stringToSplit, String delimiter, boolean trim) { + if (stringToSplit == null) { + return new ArrayList<>(); + } + + if (delimiter == null) { + throw new IllegalArgumentException(); + } + + String[] tokens = stringToSplit.split(delimiter, -1); + List tokensList = Arrays.asList(tokens); + if (trim) { + tokensList = tokensList.stream().map(String::trim).collect(Collectors.toList()); + } + return tokensList; + } + + /** + * Splits stringToSplit into a list, using the given delimiter and skipping all between the given markers. + * + * @param stringToSplit + * the string to split + * @param delimiter + * the string to split on + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param trim + * should the split strings be whitespace trimmed? + * + * @return the list of strings, split by delimiter + * + * @throws IllegalArgumentException + * if an error occurs + */ + public static List split(String stringToSplit, String delimiter, String openingMarkers, String closingMarkers, boolean trim) { + return split(stringToSplit, delimiter, openingMarkers, closingMarkers, "", trim); + } + + /** + * Splits stringToSplit into a list, using the given delimiter and skipping all between the given markers. + * + * @param stringToSplit + * the string to split + * @param delimiter + * the string to split on + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param trim + * should the split strings be whitespace trimmed? + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behaviour of the search + * + * @return the list of strings, split by delimiter + * + * @throws IllegalArgumentException + * if an error occurs + */ + public static List split(String stringToSplit, String delimiter, String openingMarkers, String closingMarkers, boolean trim, + Set searchMode) { + return split(stringToSplit, delimiter, openingMarkers, closingMarkers, "", trim, searchMode); + } + + /** + * Splits stringToSplit into a list, using the given delimiter and skipping all between the given markers. + * + * @param stringToSplit + * the string to split + * @param delimiter + * the string to split on + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param trim + * should the split strings be whitespace trimmed? + * + * @return the list of strings, split by delimiter + * + * @throws IllegalArgumentException + * if an error occurs + */ + public static List split(String stringToSplit, String delimiter, String openingMarkers, String closingMarkers, String overridingMarkers, + boolean trim) { + return split(stringToSplit, delimiter, openingMarkers, closingMarkers, overridingMarkers, trim, SearchMode.__MRK_COM_MYM_HNT_WS); + } + + /** + * Splits stringToSplit into a list, using the given delimiter and skipping all between the given markers. + * + * @param stringToSplit + * the string to split + * @param delimiter + * the string to split on + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param overridingMarkers + * the subset of openingMarkers that override the remaining markers, e.g., if openingMarkers = "'(" and + * overridingMarkers = "'" then the block between the outer parenthesis in "start ('max('); end" is strictly consumed, + * otherwise the suffix " end" would end up being consumed too in the process of handling the nested parenthesis. + * @param trim + * should the split strings be whitespace trimmed? + * @param searchMode + * a Set, ideally an EnumSet, containing the flags from the enum StringUtils.SearchMode that determine the + * behaviour of the search + * + * @return the list of strings, split by delimiter + * + * @throws IllegalArgumentException + * if an error occurs + */ + public static List split(String stringToSplit, String delimiter, String openingMarkers, String closingMarkers, String overridingMarkers, + boolean trim, Set searchMode) { + StringInspector strInspector = new StringInspector(stringToSplit, openingMarkers, closingMarkers, overridingMarkers, searchMode); + return strInspector.split(delimiter, trim); + } + + private static boolean startsWith(byte[] dataFrom, String chars) { + int charsLength = chars.length(); + + if (dataFrom.length < charsLength) { + return false; + } + for (int i = 0; i < charsLength; i++) { + if (dataFrom[i] != chars.charAt(i)) { + return false; + } + } + return true; + } + + /** + * Determines whether or not the string 'searchIn' contains the string 'searchFor', disregarding case and starting at 'startAt'. Shorthand for a + * String.regionMatch(...) + * + * @param searchIn + * the string to search in + * @param startAt + * the position to start at + * @param searchFor + * the string to search for + * + * @return whether searchIn starts with searchFor, ignoring case + */ + public static boolean regionMatchesIgnoreCase(String searchIn, int startAt, String searchFor) { + return searchIn.regionMatches(true, startAt, searchFor, 0, searchFor.length()); + } + + /** + * Determines whether or not the string 'searchIn' starts with the string 'searchFor', dis-regarding case. Shorthand for a String.regionMatch(...) + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * + * @return whether searchIn starts with searchFor, ignoring case + */ + public static boolean startsWithIgnoreCase(String searchIn, String searchFor) { + return regionMatchesIgnoreCase(searchIn, 0, searchFor); + } + + /** + * Determines whether or not the string 'searchIn' starts with the string 'searchFor', disregarding case,leading whitespace and non-alphanumeric characters. + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * + * @return true if the string starts with 'searchFor' ignoring whitespace + */ + public static boolean startsWithIgnoreCaseAndNonAlphaNumeric(String searchIn, String searchFor) { + if (searchIn == null) { + return searchFor == null; + } + + int beginPos = 0; + int inLength = searchIn.length(); + + for (; beginPos < inLength; beginPos++) { + char c = searchIn.charAt(beginPos); + if (Character.isLetterOrDigit(c)) { + break; + } + } + + return regionMatchesIgnoreCase(searchIn, beginPos, searchFor); + } + + /** + * Determines whether or not the string 'searchIn' starts with the string 'searchFor', disregarding case and leading whitespace + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * + * @return true if the string starts with 'searchFor' ignoring whitespace + */ + public static boolean startsWithIgnoreCaseAndWs(String searchIn, String searchFor) { + return startsWithIgnoreCaseAndWs(searchIn, searchFor, 0); + } + + /** + * Determines whether or not the string 'searchIn' contains the string 'searchFor', disregarding case and leading whitespace + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * @param beginPos + * where to start searching + * + * @return true if the string starts with 'searchFor' ignoring whitespace + */ + + public static boolean startsWithIgnoreCaseAndWs(String searchIn, String searchFor, int beginPos) { + if (searchIn == null) { + return searchFor == null; + } + + for (; beginPos < searchIn.length(); beginPos++) { + if (!Character.isWhitespace(searchIn.charAt(beginPos))) { + break; + } + } + + return regionMatchesIgnoreCase(searchIn, beginPos, searchFor); + } + + /** + * Determines whether or not the string 'searchIn' starts with one of the strings in 'searchFor', disregarding case and leading whitespace + * + * @param searchIn + * the string to search in + * @param searchFor + * the string array to search for + * + * @return the 'searchFor' array index that matched or -1 if none matches + */ + public static int startsWithIgnoreCaseAndWs(String searchIn, String[] searchFor) { + for (int i = 0; i < searchFor.length; i++) { + if (startsWithIgnoreCaseAndWs(searchIn, searchFor[i], 0)) { + return i; + } + } + return -1; + } + + /** + * Determines whether or not the string 'searchIn' ends with the string 'searchFor', dis-regarding case starting at 'startAt' Shorthand for a + * String.regionMatch(...) + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for + * + * @return whether searchIn ends with searchFor, ignoring case + */ + public static boolean endsWithIgnoreCase(String searchIn, String searchFor) { + int len = searchFor.length(); + return searchIn.regionMatches(true, searchIn.length() - len, searchFor, 0, len); + } + + /** + * @param source + * bytes to strip + * @param prefix + * prefix + * @param suffix + * suffix + * @return result bytes + */ + public static byte[] stripEnclosure(byte[] source, String prefix, String suffix) { + if (source.length >= prefix.length() + suffix.length() && startsWith(source, prefix) && endsWith(source, suffix)) { + + int totalToStrip = prefix.length() + suffix.length(); + int enclosedLength = source.length - totalToStrip; + byte[] enclosed = new byte[enclosedLength]; + + int startPos = prefix.length(); + int numToCopy = enclosed.length; + System.arraycopy(source, startPos, enclosed, 0, numToCopy); + + return enclosed; + } + return source; + } + + /** + * Returns the bytes as an ASCII String. + * + * @param buffer + * the bytes representing the string + * + * @return The ASCII String. + */ + public static String toAsciiString(byte[] buffer) { + return toAsciiString(buffer, 0, buffer.length); + } + + /** + * Returns the bytes as an ASCII String. + * + * @param buffer + * the bytes to convert + * @param startPos + * the position to start converting + * @param length + * the length of the string to convert + * + * @return the ASCII string + */ + public static String toAsciiString(byte[] buffer, int startPos, int length) { + return new String(toAsciiCharArray(buffer, startPos, length)); + } + + /** + * Returns the bytes as an ASCII String. + * + * @param buffer + * the bytes to convert + * @param startPos + * the position to start converting + * @param length + * the length of the string to convert + * + * @return the ASCII char array + */ + public static char[] toAsciiCharArray(byte[] buffer, int startPos, int length) { + char[] charArray = new char[length]; + int readpoint = startPos; + + for (int i = 0; i < length; i++) { + charArray[i] = (char) buffer[readpoint]; + readpoint++; + } + return charArray; + } + + /** + * Compares searchIn against searchForWildcard with wildcards, in a case insensitive manner. + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for, using the 'standard' SQL wildcard chars of '%' and '_' + * @return true if matches + */ + public static boolean wildCompareIgnoreCase(String searchIn, String searchFor) { + return wildCompareInternal(searchIn, searchFor) == WILD_COMPARE_MATCH; + } + + /** + * Compares searchIn against searchForWildcard with wildcards (heavily borrowed from strings/ctype-simple.c in the server sources) + * + * This method does a single passage matching for normal characters and WILDCARD_ONE (_), and recursive matching for WILDCARD_MANY (%) which may be repeated + * for as many anchor chars are found. + * + * @param searchIn + * the string to search in + * @param searchFor + * the string to search for, using the 'standard' SQL wildcard chars of '%' and '_' + * + * @return WILD_COMPARE_MATCH if matched, WILD_COMPARE_NO_MATCH if not matched, WILD_COMPARE_CONTINUE_WITH_WILD if not matched yet, but it may in one of + * following recursion rounds + */ + private static int wildCompareInternal(String searchIn, String searchFor) { + if ((searchIn == null) || (searchFor == null)) { + return WILD_COMPARE_NO_MATCH; + } + + if (searchFor.equals("%")) { + return WILD_COMPARE_MATCH; + } + + int searchForPos = 0; + int searchForEnd = searchFor.length(); + + int searchInPos = 0; + int searchInEnd = searchIn.length(); + + int result = WILD_COMPARE_NO_MATCH; /* Not found, using wildcards */ + + while (searchForPos != searchForEnd) { + while ((searchFor.charAt(searchForPos) != WILDCARD_MANY) && (searchFor.charAt(searchForPos) != WILDCARD_ONE)) { + if ((searchFor.charAt(searchForPos) == WILDCARD_ESCAPE) && ((searchForPos + 1) != searchForEnd)) { + searchForPos++; + } + + if ((searchInPos == searchInEnd) + || (Character.toUpperCase(searchFor.charAt(searchForPos++)) != Character.toUpperCase(searchIn.charAt(searchInPos++)))) { + return WILD_COMPARE_CONTINUE_WITH_WILD; /* No match */ + } + + if (searchForPos == searchForEnd) { + return ((searchInPos != searchInEnd) ? WILD_COMPARE_CONTINUE_WITH_WILD : WILD_COMPARE_MATCH); /* Match if both are at end */ + } + + result = WILD_COMPARE_CONTINUE_WITH_WILD; /* Found an anchor char */ + } + + if (searchFor.charAt(searchForPos) == WILDCARD_ONE) { + do { + if (searchInPos == searchInEnd) { /* Skip one char if possible */ + return result; + } + searchInPos++; + } while ((++searchForPos < searchForEnd) && (searchFor.charAt(searchForPos) == WILDCARD_ONE)); + + if (searchForPos == searchForEnd) { + break; + } + } + + if (searchFor.charAt(searchForPos) == WILDCARD_MANY) { /* Found w_many */ + searchForPos++; + + /* Remove any '%' and '_' from the wild search string */ + for (; searchForPos != searchForEnd; searchForPos++) { + if (searchFor.charAt(searchForPos) == WILDCARD_MANY) { + continue; + } + + if (searchFor.charAt(searchForPos) == WILDCARD_ONE) { + if (searchInPos == searchInEnd) { /* Skip one char if possible */ + return WILD_COMPARE_NO_MATCH; + } + searchInPos++; + continue; + } + + break; /* Not a wild character */ + } + + if (searchForPos == searchForEnd) { + return WILD_COMPARE_MATCH; /* Ok if w_many is last */ + } + + if (searchInPos == searchInEnd) { + return WILD_COMPARE_NO_MATCH; + } + + char cmp; + if (((cmp = searchFor.charAt(searchForPos)) == WILDCARD_ESCAPE) && ((searchForPos + 1) != searchForEnd)) { + cmp = searchFor.charAt(++searchForPos); + } + + searchForPos++; + + do { + while ((searchInPos != searchInEnd) && (Character.toUpperCase(searchIn.charAt(searchInPos)) != Character.toUpperCase(cmp))) { + searchInPos++; + } /* Searches for an anchor char */ + + if (searchInPos++ == searchInEnd) { + return WILD_COMPARE_NO_MATCH; + } + + int tmp = wildCompareInternal(searchIn.substring(searchInPos), searchFor.substring(searchForPos)); + if (tmp <= 0) { + return tmp; + } + + } while (searchInPos != searchInEnd); + + return WILD_COMPARE_NO_MATCH; + } + } + + return ((searchInPos != searchInEnd) ? WILD_COMPARE_CONTINUE_WITH_WILD : WILD_COMPARE_MATCH); + } + + public static int lastIndexOf(byte[] s, char c) { + if (s == null) { + return -1; + } + + for (int i = s.length - 1; i >= 0; i--) { + if (s[i] == c) { + return i; + } + } + + return -1; + } + + public static int indexOf(byte[] s, char c) { + if (s == null) { + return -1; + } + + int length = s.length; + + for (int i = 0; i < length; i++) { + if (s[i] == c) { + return i; + } + } + + return -1; + } + + public static boolean isNullOrEmpty(String str) { + return (str == null || str.isEmpty()); + } + + /** + * Two given strings are considered equal if both are null or if they have the same string value. + * + * @param str1 + * first string to compare + * @param str2 + * fecond string to compare + * @return + * true if both strings are null or have the same value + */ + public static boolean nullSafeEqual(String str1, String str2) { + return str1 == null && str2 == null || str1 != null && str1.equals(str2); + } + + /** + * Removes comments and hints from the given string. + * + * @param source + * the query string to clean up. + * @param openingMarkers + * characters that delimit the beginning of a text block to skip + * @param closingMarkers + * characters that delimit the end of a text block to skip + * @param allowBackslashEscapes + * whether or not backslash escapes are allowed + * @return the query string with all comment-delimited data removed + */ + public static String stripCommentsAndHints(final String source, final String openingMarkers, final String closingMarkers, + final boolean allowBackslashEscapes) { + StringInspector strInspector = new StringInspector(source, openingMarkers, closingMarkers, "", + allowBackslashEscapes ? SearchMode.__BSE_MRK_COM_MYM_HNT_WS : SearchMode.__MRK_COM_MYM_HNT_WS); + return strInspector.stripCommentsAndHints(); + } + + /** + * Next two functions are to help DBMD check if the given string is in form of database.name and return it as "database";"name" with comments removed. + * If string is NULL or wildcard (%), returns null and exits. + * + * First, we sanitize... + * + * @param src + * the source string + * @return the input string with all comment-delimited data removed + */ + public static String sanitizeProcOrFuncName(String src) { + if ((src == null) || (src.equals("%"))) { + return null; + } + + return src; + } + + /** + * Splits an entity identifier into its parts (database and entity name) and returns a list containing the two elements. If the identifier doesn't contain + * the database part then the argument db is used in its place and source corresponds to the full entity name. + * If argument source is NULL or wildcard (%), returns an empty list. + * + * @param source + * the source string + * @param db + * database, if available + * @param quoteId + * quote character as defined on server + * @param isNoBslashEscSet + * is our connection in no BackSlashEscape mode + * @return the input string with all comment-delimited data removed + */ + public static List splitDBdotName(String source, String db, String quoteId, boolean isNoBslashEscSet) { + if ((source == null) || (source.equals("%"))) { + return Collections.emptyList(); + } + + int dotIndex = -1; + if (" ".equals(quoteId)) { + dotIndex = source.indexOf("."); + } else { + dotIndex = indexOfIgnoreCase(0, source, ".", quoteId, quoteId, isNoBslashEscSet ? SearchMode.__MRK_WS : SearchMode.__BSE_MRK_WS); + } + + String database = db; + String entityName; + if (dotIndex != -1) { + database = unQuoteIdentifier(source.substring(0, dotIndex), quoteId); + entityName = unQuoteIdentifier(source.substring(dotIndex + 1), quoteId); + } else { + entityName = unQuoteIdentifier(source, quoteId); + } + + return Arrays.asList(database, entityName); + } + + /** + * Builds and returns a fully qualified name, quoted if necessary, for the given database entity. + * + * @param db + * database name + * @param entity + * identifier + * @param quoteId + * quote character as defined on server + * @param isPedantic + * are we in pedantic mode + * @return fully qualified name + */ + public static String getFullyQualifiedName(String db, String entity, String quoteId, boolean isPedantic) { + StringBuilder fullyQualifiedName = new StringBuilder(StringUtils.quoteIdentifier(db == null ? "" : db, quoteId, isPedantic)); + fullyQualifiedName.append('.'); + fullyQualifiedName.append(StringUtils.quoteIdentifier(entity, quoteId, isPedantic)); + return fullyQualifiedName.toString(); + } + + public static boolean isEmptyOrWhitespaceOnly(String str) { + if (str == null || str.length() == 0) { + return true; + } + + int length = str.length(); + + for (int i = 0; i < length; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + + return true; + } + + public static String escapeQuote(String str, String quotChar) { + if (str == null) { + return null; + } + + str = StringUtils.toString(stripEnclosure(str.getBytes(), quotChar, quotChar)); + + int lastNdx = str.indexOf(quotChar); + String tmpSrc; + String tmpRest; + + tmpSrc = str.substring(0, lastNdx); + tmpSrc = tmpSrc + quotChar + quotChar; + + tmpRest = str.substring(lastNdx + 1, str.length()); + + lastNdx = tmpRest.indexOf(quotChar); + while (lastNdx > -1) { + + tmpSrc = tmpSrc + tmpRest.substring(0, lastNdx); + tmpSrc = tmpSrc + quotChar + quotChar; + tmpRest = tmpRest.substring(lastNdx + 1, tmpRest.length()); + + lastNdx = tmpRest.indexOf(quotChar); + } + + tmpSrc = tmpSrc + tmpRest; + str = tmpSrc; + + return str; + } + + /** + * Surrounds identifier with quoteChar and duplicates these symbols inside the identifier. + * + * @param quoteChar + * ` or " + * @param identifier + * in pedantic mode (connection property pedantic=true) identifier is treated as unquoted + * (as it is stored in the database) even if it starts and ends with quoteChar; + * in non-pedantic mode if identifier starts and ends with quoteChar method treats it as already quoted and doesn't modify. + * @param isPedantic + * are we in pedantic mode + * + * @return + * With quoteChar="`":
    + *
      + *
    • null {@code ->} null
    • + *
    • abc {@code ->} `abc`
    • + *
    • ab`c {@code ->} `ab``c`
    • + *
    • ab"c {@code ->} `ab"c`
    • + *
    • `ab``c` {@code ->} `ab``c` in non-pedantic mode or ```ab````c``` in pedantic mode
    • + *
    + * With quoteChar="\"":
    + *
      + *
    • null {@code ->} null
    • + *
    • abc {@code ->} "abc"
    • + *
    • ab`c {@code ->} "ab`c"
    • + *
    • ab"c {@code ->} "ab""c"
    • + *
    • "ab""c" {@code ->} "ab""c" in non-pedantic mode or """ab""""c""" in pedantic mode
    • + *
    + */ + public static String quoteIdentifier(String identifier, String quoteChar, boolean isPedantic) { + if (identifier == null) { + return null; + } + + identifier = identifier.trim(); + + int quoteCharLength = quoteChar.length(); + if (quoteCharLength == 0) { + return identifier; + } + + // Check if the identifier is correctly quoted and if quotes within are correctly escaped. If not, quote and escape it. + if (!isPedantic && identifier.startsWith(quoteChar) && identifier.endsWith(quoteChar)) { + // Trim outermost quotes from the identifier. + String identifierQuoteTrimmed = identifier.substring(quoteCharLength, identifier.length() - quoteCharLength); + + // Check for pairs of quotes. + int quoteCharPos = identifierQuoteTrimmed.indexOf(quoteChar); + while (quoteCharPos >= 0) { + int quoteCharNextExpectedPos = quoteCharPos + quoteCharLength; + int quoteCharNextPosition = identifierQuoteTrimmed.indexOf(quoteChar, quoteCharNextExpectedPos); + + if (quoteCharNextPosition == quoteCharNextExpectedPos) { + quoteCharPos = identifierQuoteTrimmed.indexOf(quoteChar, quoteCharNextPosition + quoteCharLength); + } else { + // Not a pair of quotes! + break; + } + } + + if (quoteCharPos < 0) { + return identifier; + } + } + + return quoteChar + identifier.replaceAll(quoteChar, quoteChar + quoteChar) + quoteChar; + } + + /** + * Surrounds identifier with "`" and duplicates these symbols inside the identifier. + * + * @param identifier + * in pedantic mode (connection property pedantic=true) identifier is treated as unquoted (as it is stored in the database) even if it starts and + * ends with "`"; + * in non-pedantic mode if identifier starts and ends with "`" method treats it as already quoted and doesn't modify. + * @param isPedantic + * are we in pedantic mode + * + * @return + *
      + *
    • null {@code ->} null
    • + *
    • abc {@code ->} `abc`
    • + *
    • ab`c {@code ->} `ab``c`
    • + *
    • ab"c {@code ->} `ab"c`
    • + *
    • `ab``c` {@code ->} `ab``c` in non-pedantic mode or ```ab````c``` in pedantic mode
    • + *
    + */ + public static String quoteIdentifier(String identifier, boolean isPedantic) { + return quoteIdentifier(identifier, "`", isPedantic); + } + + /** + * Trims the identifier, removes quote chars from first and last positions and replaces double occurrences of quote char from entire identifier, i.e. + * converts quoted identifier into the form as it is stored in database. + * + * @param identifier + * identifier + * @param quoteChar + * ` or " + * @return + *
      + *
    • null {@code ->} null
    • + *
    • abc {@code ->} abc
    • + *
    • `abc` {@code ->} abc
    • + *
    • `ab``c` {@code ->} ab`c
    • + *
    • `"ab`c"` {@code ->} "ab`c"
    • + *
    • `ab"c` {@code ->} ab"c
    • + *
    • "abc" {@code ->} abc
    • + *
    • "`ab""c`" {@code ->} `ab"c`
    • + *
    • "ab`c" {@code ->} ab`c
    • + *
    + */ + public static String unQuoteIdentifier(String identifier, String quoteChar) { + if (identifier == null) { + return null; + } + + identifier = identifier.trim(); + + int quoteCharLength = quoteChar.length(); + if (quoteCharLength == 0) { + return identifier; + } + + // Check if the identifier is really quoted or if it simply contains quote chars in it (assuming that the value is a valid identifier). + if (identifier.startsWith(quoteChar) && identifier.endsWith(quoteChar)) { + // Trim outermost quotes from the identifier. + String identifierQuoteTrimmed = identifier.substring(quoteCharLength, identifier.length() - quoteCharLength); + + // Check for pairs of quotes. + int quoteCharPos = identifierQuoteTrimmed.indexOf(quoteChar); + while (quoteCharPos >= 0) { + int quoteCharNextExpectedPos = quoteCharPos + quoteCharLength; + int quoteCharNextPosition = identifierQuoteTrimmed.indexOf(quoteChar, quoteCharNextExpectedPos); + + if (quoteCharNextPosition == quoteCharNextExpectedPos) { + quoteCharPos = identifierQuoteTrimmed.indexOf(quoteChar, quoteCharNextPosition + quoteCharLength); + } else { + // Not a pair of quotes! Return as it is... + return identifier; + } + } + + return identifier.substring(quoteCharLength, (identifier.length() - quoteCharLength)).replaceAll(quoteChar + quoteChar, quoteChar); + } + + return identifier; + } + + public static int indexOfQuoteDoubleAware(String searchIn, String quoteChar, int startFrom) { + if (searchIn == null || quoteChar == null || quoteChar.length() == 0 || startFrom > searchIn.length()) { + return -1; + } + + int lastIndex = searchIn.length() - 1; + + int beginPos = startFrom; + int pos = -1; + + boolean next = true; + while (next) { + pos = searchIn.indexOf(quoteChar, beginPos); + if (pos == -1 || pos == lastIndex || !searchIn.startsWith(quoteChar, pos + 1)) { + next = false; + } else { + beginPos = pos + 2; + } + } + + return pos; + } + + public static String toString(byte[] value, int offset, int length, String encoding) { + if (encoding == null || "null".equalsIgnoreCase(encoding)) { + return new String(value, offset, length); + } + try { + return new String(value, offset, length, encoding); + } catch (UnsupportedEncodingException uee) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding }), uee); + } + } + + public static String toString(byte[] value, String encoding) { + if (encoding == null) { + return new String(value); + } + try { + return new String(value, encoding); + } catch (UnsupportedEncodingException uee) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding }), uee); + } + } + + public static String toString(byte[] value, Charset charset) { + return new String(value, charset); + } + + public static String toString(byte[] value, int offset, int length) { + return new String(value, offset, length); + } + + public static String toString(byte[] value) { + return new String(value); + } + + /** + * Returns the byte[] representation of subset of the given char[] using the default/platform encoding. + * + * @param value + * chars + * @return bytes + */ + public static byte[] getBytes(char[] value) { + return getBytes(value, 0, value.length); + } + + /** + * Returns the byte[] representation of subset of the given char[] using the given encoding. + * + * @param c + * chars + * @param encoding + * java encoding + * @return bytes + */ + public static byte[] getBytes(char[] c, String encoding) { + return getBytes(c, 0, c.length, encoding); + } + + public static byte[] getBytes(char[] value, int offset, int length) { + return getBytes(value, offset, length, null); + } + + /** + * Returns the byte[] representation of subset of the given char[] using the given encoding. + * + * @param value + * chars + * @param offset + * offset + * @param length + * length + * @param encoding + * java encoding + * @return bytes + */ + public static byte[] getBytes(char[] value, int offset, int length, String encoding) { + Charset cs; + try { + if (encoding == null) { + cs = Charset.defaultCharset(); + } else { + cs = Charset.forName(encoding); + } + } catch (UnsupportedCharsetException ex) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding }), ex); + } + ByteBuffer buf = cs.encode(CharBuffer.wrap(value, offset, length)); + + // can't simply .array() this to get the bytes especially with variable-length charsets the buffer is sometimes larger than the actual encoded data + int encodedLen = buf.limit(); + byte[] asBytes = new byte[encodedLen]; + buf.get(asBytes, 0, encodedLen); + + return asBytes; + } + + public static byte[] getBytes(String value) { + return value.getBytes(); + } + + public static byte[] getBytes(String value, int offset, int length) { + return value.substring(offset, offset + length).getBytes(); + } + + public static byte[] getBytes(String value, int offset, int length, String encoding) { + if (encoding == null) { + return getBytes(value, offset, length); + } + + try { + return value.substring(offset, offset + length).getBytes(encoding); + } catch (UnsupportedEncodingException uee) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding }), uee); + } + } + + public static final boolean isValidIdChar(char c) { + return VALID_ID_CHARS.indexOf(c) != -1; + } + + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + /** + * Used to escape binary data with hex + * + * @param buf + * source bytes + * @param size + * number of bytes to read + * @param bc + * consumer for low and high bits of each byte + */ + public static final void hexEscapeBlock(byte[] buf, int size, BiConsumer bc) { + for (int i = 0; i < size; i++) { + bc.accept((byte) HEX_DIGITS[(buf[i] >>> 4) & 0xF], (byte) HEX_DIGITS[buf[i] & 0xF]); + } + } + + public static void appendAsHex(StringBuilder builder, byte[] bytes) { + builder.append("0x"); + for (byte b : bytes) { + builder.append(HEX_DIGITS[(b >>> 4) & 0xF]).append(HEX_DIGITS[b & 0xF]); + } + } + + public static void appendAsHex(StringBuilder builder, int value) { + if (value == 0) { + builder.append("0x0"); + return; + } + + int shift = 32; + byte nibble; + boolean nonZeroFound = false; + + builder.append("0x"); + do { + shift -= 4; + nibble = (byte) ((value >>> shift) & 0xF); + if (nonZeroFound) { + builder.append(HEX_DIGITS[nibble]); + } else if (nibble != 0) { + builder.append(HEX_DIGITS[nibble]); + nonZeroFound = true; + } + } while (shift != 0); + } + + public static byte[] getBytesNullTerminated(String value, String encoding) { + Charset cs = Charset.forName(encoding); + ByteBuffer buf = cs.encode(value); + int encodedLen = buf.limit(); + byte[] asBytes = new byte[encodedLen + 1]; + buf.get(asBytes, 0, encodedLen); + asBytes[encodedLen] = 0; + + return asBytes; + } + + public static boolean canHandleAsServerPreparedStatementNoCache(String sql, ServerVersion serverVersion, boolean allowMultiQueries, + boolean noBackslashEscapes, boolean useAnsiQuotes) { + + // Can't use server-side prepare for CALL + if (startsWithIgnoreCaseAndNonAlphaNumeric(sql, "CALL")) { + return false; + } + + boolean canHandleAsStatement = true; + + boolean allowBackslashEscapes = !noBackslashEscapes; + String quoteChar = useAnsiQuotes ? "\"" : "'"; + + if (allowMultiQueries) { + if (StringUtils.indexOfIgnoreCase(0, sql, ";", quoteChar, quoteChar, + allowBackslashEscapes ? SearchMode.__BSE_MRK_COM_MYM_HNT_WS : SearchMode.__MRK_COM_MYM_HNT_WS) != -1) { + canHandleAsStatement = false; + } + } else if (startsWithIgnoreCaseAndWs(sql, "XA ")) { + canHandleAsStatement = false; + } else if (startsWithIgnoreCaseAndWs(sql, "CREATE TABLE")) { + canHandleAsStatement = false; + } else if (startsWithIgnoreCaseAndWs(sql, "DO")) { + canHandleAsStatement = false; + } else if (startsWithIgnoreCaseAndWs(sql, "SET")) { + canHandleAsStatement = false; + } else if (StringUtils.startsWithIgnoreCaseAndWs(sql, "SHOW WARNINGS") && serverVersion.meetsMinimum(ServerVersion.parseVersion("5.7.2"))) { + canHandleAsStatement = false; + } else if (sql.startsWith("/* ping */")) { + canHandleAsStatement = false; + } + + return canHandleAsStatement; + } + + final static char[] EMPTY_SPACE = new char[255]; + static { + for (int i = 0; i < EMPTY_SPACE.length; i++) { + EMPTY_SPACE[i] = ' '; + } + } + + public static String padString(String stringVal, int requiredLength) { + int currentLength = stringVal.length(); + int difference = requiredLength - currentLength; + + if (difference > 0) { + StringBuilder paddedBuf = new StringBuilder(requiredLength); + paddedBuf.append(stringVal); + paddedBuf.append(EMPTY_SPACE, 0, difference); + return paddedBuf.toString(); + } + + return stringVal; + } + + public static int safeIntParse(String intAsString) { + try { + return Integer.parseInt(intAsString); + } catch (NumberFormatException nfe) { + return 0; + } + } + + /** + * Checks is the CharSequence contains digits only. No leading sign and thousands or decimal separators are allowed. + * + * @param cs + * The CharSequence to check. + * @return + * {@code true} if the CharSequence not empty and contains only digits, {@code false} otherwise. + */ + public static boolean isStrictlyNumeric(CharSequence cs) { + if (cs == null || cs.length() == 0) { + return false; + } + for (int i = 0; i < cs.length(); i++) { + if (!Character.isDigit(cs.charAt(i))) { + return false; + } + } + return true; + } + + public static String safeTrim(String toTrim) { + return isNullOrEmpty(toTrim) ? toTrim : toTrim.trim(); + } + + /** + * Constructs a String containing all the elements in the String array bounded and joined by the provided concatenation elements. The last element uses a + * different delimiter. + * + * @param elems + * the String array from where to take the elements. + * @param prefix + * the prefix of the resulting String. + * @param midDelimiter + * the delimiter to be used between the N-1 elements + * @param lastDelimiter + * the delimiter to be used before the last element. + * @param suffix + * the suffix of the resulting String. + * @return + * a String built from the provided String array and concatenation elements. + */ + public static String stringArrayToString(String[] elems, String prefix, String midDelimiter, String lastDelimiter, String suffix) { + StringBuilder valuesString = new StringBuilder(); + if (elems.length > 1) { + valuesString.append(Arrays.stream(elems).limit(elems.length - 1).collect(Collectors.joining(midDelimiter, prefix, lastDelimiter))); + } else { + valuesString.append(prefix); + } + valuesString.append(elems[elems.length - 1]).append(suffix); + + return valuesString.toString(); + } + + /** + * Does the string contain wildcard symbols ('%' or '_'). Used in DatabaseMetaData. + * + * @param src + * string + * @return true if src contains wildcard symbols + */ + public static boolean hasWildcards(String src) { + return indexOfIgnoreCase(0, src, "%") > -1 || indexOfIgnoreCase(0, src, "_") > -1; + } + + public static String getUniqueSavepointId() { + String uuid = UUID.randomUUID().toString(); + return uuid.replaceAll("-", "_"); // for safety + } + + /** + * Joins all elements of the given list using serial comma (Oxford comma) rules. + * E.g.: + * - "A" + * - "A and B" + * - "A, B, and C" + * + * @param elements + * the elements to join + * @return + * the String with all elements, joined by commas and "and". + */ + public static String joinWithSerialComma(List elements) { + if (elements == null || elements.size() == 0) { + return ""; + } + if (elements.size() == 1) { + return elements.get(0).toString(); + } + if (elements.size() == 2) { + return elements.get(0) + " and " + elements.get(1); + } + return elements.subList(0, elements.size() - 1).stream().map(Object::toString).collect(Collectors.joining(", ", "", ", and ")) + + elements.get(elements.size() - 1).toString(); + } + + public static byte[] unquoteBytes(byte[] bytes) { + if ((bytes[0] == '\'') && (bytes[bytes.length - 1] == '\'')) { + + byte[] valNoQuotes = new byte[bytes.length - 2]; + int j = 0; + int quoteCnt = 0; + + for (int i = 1; i < bytes.length - 1; i++) { + if (bytes[i] == '\'') { + quoteCnt++; + } else { + quoteCnt = 0; + } + + if (quoteCnt == 2) { + quoteCnt = 0; + } else { + valNoQuotes[j++] = bytes[i]; + } + } + + byte[] res = new byte[j]; + System.arraycopy(valNoQuotes, 0, res, 0, j); + + return res; + } + return bytes; + } + + public static byte[] quoteBytes(byte[] bytes) { + byte[] withQuotes = new byte[bytes.length * 2 + 2]; + int j = 0; + withQuotes[j++] = '\''; + for (int i = 0; i < bytes.length; i++) { + if (bytes[i] == '\'') { + withQuotes[j++] = '\''; + } + withQuotes[j++] = bytes[i]; + } + withQuotes[j++] = '\''; + + byte[] res = new byte[j]; + System.arraycopy(withQuotes, 0, res, 0, j); + return res; + } + + public static StringBuilder escapeString(StringBuilder buf, String x, boolean useAnsiQuotedIdentifiers, CharsetEncoder charsetEncoder) { + int stringLength = x.length(); + + buf.append('\''); + + // + // Note: buf.append(char) is _faster_ than appending in blocks, because the block append requires a System.arraycopy().... go figure... + // + + for (int i = 0; i < stringLength; ++i) { + char c = x.charAt(i); + + switch (c) { + case 0: /* Must be escaped for 'mysql' */ + buf.append('\\'); + buf.append('0'); + break; + case '\n': /* Must be escaped for logs */ + buf.append('\\'); + buf.append('n'); + break; + case '\r': + buf.append('\\'); + buf.append('r'); + break; + case '\\': + buf.append('\\'); + buf.append('\\'); + break; + case '\'': + buf.append('\''); + buf.append('\''); + break; + case '"': /* Better safe than sorry */ + if (useAnsiQuotedIdentifiers) { + buf.append('\\'); + } + buf.append('"'); + break; + case '\032': /* This gives problems on Win32 */ + buf.append('\\'); + buf.append('Z'); + break; + case '\u00a5': + case '\u20a9': + // escape characters interpreted as backslash by mysql + if (charsetEncoder != null) { + CharBuffer cbuf = CharBuffer.allocate(1); + ByteBuffer bbuf = ByteBuffer.allocate(1); + cbuf.put(c); + cbuf.position(0); + charsetEncoder.encode(cbuf, bbuf, true); + if (bbuf.get(0) == '\\') { + buf.append('\\'); + } + } + buf.append(c); + break; + + default: + buf.append(c); + } + } + + buf.append('\''); + + return buf; + } + + public static void escapeBytes(ByteArrayOutputStream bOut, byte[] x) { + int numBytes = x.length; + for (int i = 0; i < numBytes; ++i) { + byte b = x[i]; + + switch (b) { + case 0: /* Must be escaped for 'mysql' */ + bOut.write('\\'); + bOut.write('0'); + break; + case '\n': /* Must be escaped for logs */ + bOut.write('\\'); + bOut.write('n'); + break; + case '\r': + bOut.write('\\'); + bOut.write('r'); + break; + case '\\': + bOut.write('\\'); + bOut.write('\\'); + break; + case '\'': + bOut.write('\\'); + bOut.write('\''); + break; + case '"': /* Better safe than sorry */ + bOut.write('\\'); + bOut.write('"'); + break; + case '\032': /* This gives problems on Win32 */ + bOut.write('\\'); + bOut.write('Z'); + break; + default: + bOut.write(b); + } + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TestUtils.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TestUtils.java new file mode 100644 index 0000000..ae2017f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TestUtils.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +public class TestUtils { + + public static void dumpTestcaseQuery(String query) { + System.err.println(query); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TimeUtil.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TimeUtil.java new file mode 100644 index 0000000..b3e74f7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/TimeUtil.java @@ -0,0 +1,521 @@ +/* + * Copyright (c) 2002, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.sql.Time; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; +import java.util.Calendar; +import java.util.Locale; +import java.util.Properties; +import java.util.TimeZone; +import java.util.regex.Pattern; + +import com.mysql.cj.Messages; +import com.mysql.cj.MysqlType; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; +import com.mysql.cj.exceptions.WrongArgumentException; + +/** + * Time zone conversion routines and other time related methods + */ +public class TimeUtil { + static final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT"); + + public static final LocalDate DEFAULT_DATE = LocalDate.of(1970, 1, 1); + public static final LocalTime DEFAULT_TIME = LocalTime.of(0, 0); + + public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final DateTimeFormatter TIME_FORMATTER_NO_FRACT_NO_OFFSET = DateTimeFormatter.ofPattern("HH:mm:ss"); + public static final DateTimeFormatter TIME_FORMATTER_WITH_NANOS_NO_OFFSET = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSS"); + public static final DateTimeFormatter TIME_FORMATTER_NO_FRACT_WITH_OFFSET = DateTimeFormatter.ofPattern("HH:mm:ssXXX"); + public static final DateTimeFormatter TIME_FORMATTER_WITH_NANOS_WITH_OFFSET = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSSXXX"); + public static final DateTimeFormatter TIME_FORMATTER_WITH_OPTIONAL_MICROS = new DateTimeFormatterBuilder().appendPattern("HH:mm:ss") + .appendFraction(ChronoField.NANO_OF_SECOND, 0, 6, true).toFormatter(); + public static final DateTimeFormatter DATETIME_FORMATTER_NO_FRACT_NO_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + public static final DateTimeFormatter DATETIME_FORMATTER_WITH_MILLIS_NO_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + public static final DateTimeFormatter DATETIME_FORMATTER_WITH_NANOS_NO_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS"); + public static final DateTimeFormatter DATETIME_FORMATTER_NO_FRACT_WITH_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssXXX"); + public static final DateTimeFormatter DATETIME_FORMATTER_WITH_NANOS_WITH_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSSXXX"); + public static final DateTimeFormatter DATETIME_FORMATTER_WITH_OPTIONAL_MICROS = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss") + .appendFraction(ChronoField.NANO_OF_SECOND, 0, 6, true).toFormatter(); + + public static final Pattern DATE_LITERAL_WITH_DELIMITERS = Pattern + .compile("(\\d{4}|\\d{2})[\\p{Punct}&&[^:]](([0])?[1-9]|[1][0-2])[\\p{Punct}&&[^:]](([0])?[1-9]|[1-2]\\d|[3][0-1])"); + public static final Pattern DATE_LITERAL_NO_DELIMITERS = Pattern.compile("(\\d{4}|\\d{2})([0][1-9]|[1][0-2])([0][1-9]|[1-2]\\d|[3][0-1])"); + + public static final Pattern TIME_LITERAL_WITH_DELIMITERS = Pattern.compile("(([0-1])?\\d|[2][0-3]):([0-5])?\\d(:([0-5])?\\d(\\.\\d{1,9})?)?"); + public static final Pattern TIME_LITERAL_SHORT6 = Pattern.compile("([0-1]\\d|[2][0-3])([0-5]\\d){2}(\\.\\d{1,9})?"); + public static final Pattern TIME_LITERAL_SHORT4 = Pattern.compile("([0-5]\\d){2}(\\.\\d{1,9})?"); + public static final Pattern TIME_LITERAL_SHORT2 = Pattern.compile("[0-5]\\d(\\.\\d{1,9})?"); + + public static final Pattern DATETIME_LITERAL_WITH_DELIMITERS = Pattern.compile( + "(\\d{4}|\\d{2})\\p{Punct}(([0])?[1-9]|[1][0-2])\\p{Punct}(([0])?[1-9]|[1-2]\\d|[3][0-1])[ T](([0-1])?\\d|[2][0-3])\\p{Punct}([0-5])?\\d(\\p{Punct}([0-5])?\\d(\\.\\d{1,9})?)?"); + public static final Pattern DATETIME_LITERAL_SHORT14 = Pattern + .compile("\\d{4}([0][1-9]|[1][0-2])([0][1-9]|[1-2]\\d|[3][0-1])([0-1]\\d|[2][0-3])([0-5]\\d){2}(\\.\\d{1,9}){0,1}"); + public static final Pattern DATETIME_LITERAL_SHORT12 = Pattern + .compile("\\d{2}([0][1-9]|[1][0-2])([0][1-9]|[1-2]\\d|[3][0-1])([0-1]\\d|[2][0-3])([0-5]\\d){2}(\\.\\d{1,9}){0,1}"); + + public static final Pattern DURATION_LITERAL_WITH_DAYS = Pattern + .compile("(-)?(([0-2])?\\d|[3][0-4]) (([0-1])?\\d|[2][0-3])(:([0-5])?\\d(:([0-5])?\\d(\\.\\d{1,9})?)?)?"); + public static final Pattern DURATION_LITERAL_NO_DAYS = Pattern.compile("(-)?\\d{1,3}:([0-5])?\\d(:([0-5])?\\d(\\.\\d{1,9})?)?"); + + // Mappings from TimeZone identifications (prefixed by type: Windows, TZ name, MetaZone, TZ alias, ...), to standard TimeZone Ids + private static final String TIME_ZONE_MAPPINGS_RESOURCE = "/com/mysql/cj/util/TimeZoneMapping.properties"; + + private static Properties timeZoneMappings = null; + + protected final static Method systemNanoTimeMethod; + + static { + Method aMethod; + + try { + aMethod = System.class.getMethod("nanoTime", (Class[]) null); + } catch (SecurityException e) { + aMethod = null; + } catch (NoSuchMethodException e) { + aMethod = null; + } + + systemNanoTimeMethod = aMethod; + } + + public static boolean nanoTimeAvailable() { + return systemNanoTimeMethod != null; + } + + public static long getCurrentTimeNanosOrMillis() { + if (systemNanoTimeMethod != null) { + try { + return ((Long) systemNanoTimeMethod.invoke(null, (Object[]) null)).longValue(); + } catch (IllegalArgumentException e) { + // ignore - fall through to currentTimeMillis() + } catch (IllegalAccessException e) { + // ignore - fall through to currentTimeMillis() + } catch (InvocationTargetException e) { + // ignore - fall through to currentTimeMillis() + } + } + + return System.currentTimeMillis(); + } + + /** + * Returns the 'official' Java timezone name for the given timezone + * + * @param timezoneStr + * the 'common' timezone name + * @param exceptionInterceptor + * exception interceptor + * + * @return the Java timezone name for the given timezone + */ + public static String getCanonicalTimeZone(String timezoneStr, ExceptionInterceptor exceptionInterceptor) { + if (timezoneStr == null) { + return null; + } + + timezoneStr = timezoneStr.trim(); + + // handle '+/-hh:mm' form ... + if (timezoneStr.length() > 2) { + if ((timezoneStr.charAt(0) == '+' || timezoneStr.charAt(0) == '-') && Character.isDigit(timezoneStr.charAt(1))) { + return "GMT" + timezoneStr; + } + } + + synchronized (TimeUtil.class) { + if (timeZoneMappings == null) { + loadTimeZoneMappings(exceptionInterceptor); + } + } + + String canonicalTz; + if ((canonicalTz = timeZoneMappings.getProperty(timezoneStr)) != null) { + return canonicalTz; + } + + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("TimeUtil.UnrecognizedTimeZoneId", new Object[] { timezoneStr }), exceptionInterceptor); + } + + /** + * Return a new Timestamp object which value is adjusted according to known DATE, DATETIME or TIMESTAMP field precision. + * + * @param ts + * an original Timestamp object, not modified by this method + * @param fsp + * value in the range from 0 to 6 specifying fractional seconds precision + * @param serverRoundFracSecs + * Flag indicating whether rounding or truncation occurs on server when inserting a TIME, DATE, or TIMESTAMP value with a fractional seconds part + * into a column having the same type but fewer fractional digits: true means rounding, false means truncation. The proper value should be + * detected by analyzing sql_mode server variable for TIME_TRUNCATE_FRACTIONAL presence. + * @return A new Timestamp object cloned from the original one and then rounded or truncated according to required fsp value + */ + public static Timestamp adjustNanosPrecision(Timestamp ts, int fsp, boolean serverRoundFracSecs) { + if (fsp < 0 || fsp > 6) { + throw ExceptionFactory.createException(WrongArgumentException.class, "fsp value must be in 0 to 6 range."); + } + Timestamp res = (Timestamp) ts.clone(); + double tail = Math.pow(10, 9 - fsp); + int nanos = serverRoundFracSecs ? (int) Math.round(res.getNanos() / tail) * (int) tail : (int) (res.getNanos() / tail) * (int) tail; + if (nanos > 999999999) { // if rounded up to the second then increment seconds + nanos %= 1000000000; // get last 9 digits + res.setTime(res.getTime() + 1000); // increment seconds + } + res.setNanos(nanos); + return res; + } + + /** + * Return a new LocalDateTime object which value is adjusted according to known DATE, DATETIME or TIMESTAMP field precision. + * + * @param x + * an original LocalDateTime object, not modified by this method + * @param fsp + * value in the range from 0 to 6 specifying fractional seconds precision + * @param serverRoundFracSecs + * Flag indicating whether rounding or truncation occurs on server when inserting a TIME, DATE, or TIMESTAMP value with a fractional seconds part + * into a column having the same type but fewer fractional digits: true means rounding, false means truncation. The proper value should be + * detected by analyzing sql_mode server variable for TIME_TRUNCATE_FRACTIONAL presence. + * @return A new LocalDateTime object cloned from the original one and then rounded or truncated according to required fsp value + */ + public static LocalDateTime adjustNanosPrecision(LocalDateTime x, int fsp, boolean serverRoundFracSecs) { + if (fsp < 0 || fsp > 6) { + throw ExceptionFactory.createException(WrongArgumentException.class, "fsp value must be in 0 to 6 range."); + } + int originalNano = x.getNano(); + double tail = Math.pow(10, 9 - fsp); + + int adjustedNano = serverRoundFracSecs ? (int) Math.round(originalNano / tail) * (int) tail : (int) (originalNano / tail) * (int) tail; + if (adjustedNano > 999999999) { // if rounded up to the second then increment seconds + adjustedNano %= 1000000000; + x = x.plusSeconds(1); + } + return x.withNano(adjustedNano); + } + + public static LocalTime adjustNanosPrecision(LocalTime x, int fsp, boolean serverRoundFracSecs) { + if (fsp < 0 || fsp > 6) { + throw ExceptionFactory.createException(WrongArgumentException.class, "fsp value must be in 0 to 6 range."); + } + int originalNano = x.getNano(); + double tail = Math.pow(10, 9 - fsp); + + int adjustedNano = serverRoundFracSecs ? (int) Math.round(originalNano / tail) * (int) tail : (int) (originalNano / tail) * (int) tail; + if (adjustedNano > 999999999) { // if rounded up to the second then increment seconds + adjustedNano %= 1000000000; + x = x.plusSeconds(1); + } + return x.withNano(adjustedNano); + } + + public static Duration adjustNanosPrecision(Duration x, int fsp, boolean serverRoundFracSecs) { + if (fsp < 0 || fsp > 6) { + throw ExceptionFactory.createException(WrongArgumentException.class, "fsp value must be in 0 to 6 range."); + } + int originalNano = x.getNano(); + double tail = Math.pow(10, 9 - fsp); + + int adjustedNano = serverRoundFracSecs ? (int) Math.round(originalNano / tail) * (int) tail : (int) (originalNano / tail) * (int) tail; + if (adjustedNano > 999999999) { // if rounded up to the second then increment seconds + adjustedNano %= 1000000000; + x = x.plusSeconds(1); + } + return x.withNanos(adjustedNano); + } + + /** + * Return a string representation of a fractional seconds part. This method assumes that all Timestamp adjustments are already done before, + * thus no rounding is needed, only a proper "0" padding to be done. + * + * @param nanos + * fractional seconds value + * @param fsp + * required fractional part length + * @return fractional seconds part as a string + */ + public static String formatNanos(int nanos, int fsp) { + return formatNanos(nanos, fsp, true); + } + + /** + * Return a string representation of a fractional seconds part. This method assumes that all Timestamp adjustments are already done before, + * thus no rounding is needed, only a proper "0" padding to be done. + * + * @param nanos + * fractional seconds value + * @param fsp + * required fractional part length + * @param truncateTrailingZeros + * whether to remove trailing zero characters in a fractional part after formatting + * @return fractional seconds part as a string + */ + public static String formatNanos(int nanos, int fsp, boolean truncateTrailingZeros) { + if (nanos < 0 || nanos > 999999999) { + throw ExceptionFactory.createException(WrongArgumentException.class, "nanos value must be in 0 to 999999999 range but was " + nanos); + } + if (fsp < 0 || fsp > 6) { + throw ExceptionFactory.createException(WrongArgumentException.class, "fsp value must be in 0 to 6 range but was " + fsp); + } + + if (fsp == 0 || nanos == 0) { + return "0"; + } + + // just truncate because we expect the rounding was done before + nanos = (int) (nanos / Math.pow(10, 9 - fsp)); + if (nanos == 0) { + return "0"; + } + + String nanosString = Integer.toString(nanos); + final String zeroPadding = "000000000"; + + nanosString = zeroPadding.substring(0, fsp - nanosString.length()) + nanosString; + + if (truncateTrailingZeros) { + int pos = fsp - 1; // the end, we're padded to the end by the code above + while (nanosString.charAt(pos) == '0') { + pos--; + } + nanosString = nanosString.substring(0, pos + 1); + } + return nanosString; + } + + /** + * Loads a properties file that contains all kinds of time zone mappings. + * + * @param exceptionInterceptor + * exception interceptor + */ + private static void loadTimeZoneMappings(ExceptionInterceptor exceptionInterceptor) { + timeZoneMappings = new Properties(); + try { + timeZoneMappings.load(TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE)); + } catch (IOException e) { + throw ExceptionFactory.createException(Messages.getString("TimeUtil.LoadTimeZoneMappingError"), exceptionInterceptor); + } + // bridge all Time Zone ids known by Java + for (String tz : TimeZone.getAvailableIDs()) { + if (!timeZoneMappings.containsKey(tz)) { + timeZoneMappings.put(tz, tz); + } + } + } + + public static Timestamp truncateFractionalSeconds(Timestamp timestamp) { + Timestamp truncatedTimestamp = new Timestamp(timestamp.getTime()); + truncatedTimestamp.setNanos(0); + return truncatedTimestamp; + } + + public static Time truncateFractionalSeconds(Time time) { + Time truncatedTime = new Time((time.getTime() / 1000) * 1000); + return truncatedTime; + } + + public static Boolean hasFractionalSeconds(Time t) { + return t.getTime() % 1000 > 0; + } + + /** + * Get SimpleDateFormat with a default Calendar which TimeZone is replaced with the provided one. + *

    + * Note: The SimpleDateFormat object returned by this method contains a default Calendar with an altered TimeZone. It's safe to cache it between this method + * calls because the Calendar object itself is not altered. + * + * @param cachedSimpleDateFormat + * existing SimpleDateFormat to use instead of creating a new one + * @param pattern + * format pattern + * @param tz + * {@link TimeZone} object replacing the default one + * @return {@link SimpleDateFormat} object + */ + public static SimpleDateFormat getSimpleDateFormat(SimpleDateFormat cachedSimpleDateFormat, String pattern, TimeZone tz) { + SimpleDateFormat sdf = cachedSimpleDateFormat != null && cachedSimpleDateFormat.toPattern().equals(pattern) ? cachedSimpleDateFormat + : new SimpleDateFormat(pattern, Locale.US); + if (tz != null) { + sdf.setTimeZone(tz); + } + return sdf; + } + + /** + * Get SimpleDateFormat where a default Calendar is replaced with a clone of the provided one. + *

    + * Note: Don't cache the SimpleDateFormat object returned by this method. Other methods could rely on assumption that the cached SimpleDateFormat has a + * default Calendar and that it is safe to change only it's time zone (see {@link #getSimpleDateFormat(SimpleDateFormat, String, TimeZone)}. + * + * @param pattern + * format pattern + * @param cal + * {@link Calendar} object which clone is replacing the default Calendar + * @return {@link SimpleDateFormat} object + */ + public static SimpleDateFormat getSimpleDateFormat(String pattern, Calendar cal) { + SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.US); + if (cal != null) { + cal = (Calendar) cal.clone(); + sdf.setCalendar(cal); + } + return sdf; + } + + public static Object parseToDateTimeObject(String s, MysqlType targetMysqlType) { + if (DATE_LITERAL_WITH_DELIMITERS.matcher(s).matches()) { + return LocalDate.parse(getCanonicalDate(s), DateTimeFormatter.ISO_LOCAL_DATE); + + } else if (DATE_LITERAL_NO_DELIMITERS.matcher(s).matches() && !(targetMysqlType == MysqlType.TIME && TIME_LITERAL_SHORT6.matcher(s).matches())) { + return s.length() == 8 ? LocalDate.parse(s, DateTimeFormatter.BASIC_ISO_DATE) : LocalDate.parse(s, DateTimeFormatter.ofPattern("yyMMdd")); + + } else if (TIME_LITERAL_WITH_DELIMITERS.matcher(s).matches()) { + return LocalTime.parse(getCanonicalTime(s), + new DateTimeFormatterBuilder().appendPattern("HH:mm:ss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (TIME_LITERAL_SHORT6.matcher(s).matches()) { + return LocalTime.parse(s, + new DateTimeFormatterBuilder().appendPattern("HHmmss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (TIME_LITERAL_SHORT4.matcher(s).matches()) { + return LocalTime.parse("00" + s, + new DateTimeFormatterBuilder().appendPattern("HHmmss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (TIME_LITERAL_SHORT2.matcher(s).matches()) { + return LocalTime.parse("0000" + s, + new DateTimeFormatterBuilder().appendPattern("HHmmss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (DATETIME_LITERAL_SHORT14.matcher(s).matches()) { + return LocalDateTime.parse(s, + new DateTimeFormatterBuilder().appendPattern("yyyyMMddHHmmss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (DATETIME_LITERAL_SHORT12.matcher(s).matches()) { + return LocalDateTime.parse(s, + new DateTimeFormatterBuilder().appendPattern("yyMMddHHmmss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (DATETIME_LITERAL_WITH_DELIMITERS.matcher(s).matches()) { + return LocalDateTime.parse(getCanonicalDateTime(s), + new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd HH:mm:ss").appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter()); + + } else if (DURATION_LITERAL_WITH_DAYS.matcher(s).matches() || DURATION_LITERAL_NO_DAYS.matcher(s).matches()) { + s = s.startsWith("-") ? s.replace("-", "-P") : "P" + s; + s = s.contains(" ") ? s.replace(" ", "DT") : s.replace("P", "PT"); + String[] ch = new String[] { "H", "M", "S" }; + int pos = 0; + while (s.contains(":")) { + s = s.replaceFirst(":", ch[pos++]); + } + s = s + ch[pos]; + return Duration.parse(s); + } + throw ExceptionFactory.createException(WrongArgumentException.class, "There is no known date-time pattern for '" + s + "' value"); + } + + private static String getCanonicalDate(String s) { + String[] sa = s.split("\\p{Punct}"); + StringBuilder sb = new StringBuilder(); + if (sa[0].length() == 2) { + sb.append(Integer.valueOf(sa[0]) > 69 ? "19" : "20"); + } + sb.append(sa[0]); + sb.append("-"); + if (sa[1].length() == 1) { + sb.append("0"); + } + sb.append(sa[1]); + sb.append("-"); + if (sa[2].length() == 1) { + sb.append("0"); + } + sb.append(sa[2]); + + return sb.toString(); + } + + private static String getCanonicalTime(String s) { + String[] sa = s.split("\\p{Punct}"); + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < sa.length; i++) { + if (i > 0) { + sb.append(i < 3 ? ":" : "."); + } + if (i < 3 && sa[i].length() == 1) { + sb.append("0"); + } + sb.append(sa[i]); + + } + if (sa.length < 3) { + sb.append(":00"); + } + + return sb.toString(); + } + + private static String getCanonicalDateTime(String s) { + String[] sa = s.split("[ T]"); + StringBuilder sb = new StringBuilder(); + sb.append(getCanonicalDate(sa[0])); + sb.append(" "); + sb.append(getCanonicalTime(sa[1])); + return sb.toString(); + } + + public static String getDurationString(Duration x) { + String s = (x.isNegative() ? "-" + x.abs().toString() : x.toString()).replace("PT", ""); + if (s.contains("M")) { + s = s.replace("H", ":"); + if (s.contains("S")) { + s = s.replace("M", ":").replace("S", ""); + } else { + s = s.replace("M", ":0"); + } + } else { + s = s.replace("H", ":0:0"); + } + return s; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Util.java b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Util.java new file mode 100644 index 0000000..c3a49a3 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-api/java/com/mysql/cj/util/Util.java @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringWriter; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; + +/** + * Various utility methods for the driver. + */ +public class Util { + private static int jvmVersion = 8; // use default base version supported + + private static int jvmUpdateNumber = -1; + + static { + int startPos = Constants.JVM_VERSION.indexOf('.'); + int endPos = startPos + 1; + if (startPos != -1) { + while (Character.isDigit(Constants.JVM_VERSION.charAt(endPos)) && ++endPos < Constants.JVM_VERSION.length()) { + // continue + } + } + startPos++; + if (endPos > startPos) { + jvmVersion = Integer.parseInt(Constants.JVM_VERSION.substring(startPos, endPos)); + } + startPos = Constants.JVM_VERSION.indexOf("_"); + endPos = startPos + 1; + if (startPos != -1) { + while (Character.isDigit(Constants.JVM_VERSION.charAt(endPos)) && ++endPos < Constants.JVM_VERSION.length()) { + // continue + } + } + startPos++; + if (endPos > startPos) { + jvmUpdateNumber = Integer.parseInt(Constants.JVM_VERSION.substring(startPos, endPos)); + } + + } + + public static int getJVMVersion() { + return jvmVersion; + } + + public static boolean jvmMeetsMinimum(int version, int updateNumber) { + return getJVMVersion() > version || getJVMVersion() == version && getJVMUpdateNumber() >= updateNumber; + } + + public static int getJVMUpdateNumber() { + return jvmUpdateNumber; + } + + /** + * Checks whether the given server version string is a MySQL Community edition + * + * @param serverVersion + * full server version string + * @return true if version does not contain "enterprise", "commercial" or "advanced" + */ + public static boolean isCommunityEdition(String serverVersion) { + return !isEnterpriseEdition(serverVersion); + } + + /** + * Checks whether the given server version string is a MySQL Enterprise edition + * + * @param serverVersion + * full server version string + * @return true if version contains "enterprise", "commercial" or "advanced" + */ + public static boolean isEnterpriseEdition(String serverVersion) { + return serverVersion.contains("enterprise") || serverVersion.contains("commercial") || serverVersion.contains("advanced"); + } + + /** + * Converts a nested exception into a nicer message + * + * @param ex + * the exception to expand into a message. + * + * @return a message containing the exception, the message (if any), and a + * stacktrace. + */ + public static String stackTraceToString(Throwable ex) { + StringBuilder traceBuf = new StringBuilder(); + traceBuf.append(Messages.getString("Util.1")); + + if (ex != null) { + traceBuf.append(ex.getClass().getName()); + + String message = ex.getMessage(); + + if (message != null) { + traceBuf.append(Messages.getString("Util.2")); + traceBuf.append(message); + } + + StringWriter out = new StringWriter(); + + PrintWriter printOut = new PrintWriter(out); + + ex.printStackTrace(printOut); + + traceBuf.append(Messages.getString("Util.3")); + traceBuf.append(out.toString()); + } + + traceBuf.append(Messages.getString("Util.4")); + + return traceBuf.toString(); + } + + public static Object getInstance(String className, Class[] argTypes, Object[] args, ExceptionInterceptor exceptionInterceptor, String errorMessage) { + + try { + return handleNewInstance(Class.forName(className).getConstructor(argTypes), args, exceptionInterceptor); + } catch (SecurityException | NoSuchMethodException | ClassNotFoundException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, errorMessage, e, exceptionInterceptor); + } + } + + public static Object getInstance(String className, Class[] argTypes, Object[] args, ExceptionInterceptor exceptionInterceptor) { + return getInstance(className, argTypes, args, exceptionInterceptor, "Can't instantiate required class"); + } + + /** + * Handles constructing new instance with the given constructor and wrapping + * (or not, as required) the exceptions that could possibly be generated + * + * @param ctor + * constructor + * @param args + * arguments for constructor + * @param exceptionInterceptor + * exception interceptor + * @return object + */ + public static Object handleNewInstance(Constructor ctor, Object[] args, ExceptionInterceptor exceptionInterceptor) { + try { + + return ctor.newInstance(args); + } catch (IllegalArgumentException | InstantiationException | IllegalAccessException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Can't instantiate required class", e, exceptionInterceptor); + } catch (InvocationTargetException e) { + Throwable target = e.getTargetException(); + + if (target instanceof ExceptionInInitializerError) { + target = ((ExceptionInInitializerError) target).getException(); + } else if (target instanceof CJException) { + throw (CJException) target; + } + + throw ExceptionFactory.createException(WrongArgumentException.class, target.getMessage(), target, exceptionInterceptor); + } + } + + /** + * Does a network interface exist locally with the given hostname? + * + * @param hostname + * the hostname (or IP address in string form) to check + * @return true if it exists, false if no, or unable to determine due to VM + * version support of java.net.NetworkInterface + */ + public static boolean interfaceExists(String hostname) { + try { + Class networkInterfaceClass = Class.forName("java.net.NetworkInterface"); + return networkInterfaceClass.getMethod("getByName", (Class[]) null).invoke(networkInterfaceClass, new Object[] { hostname }) != null; + } catch (Throwable t) { + return false; + } + } + + public static Map calculateDifferences(Map map1, Map map2) { + Map diffMap = new HashMap<>(); + + for (Map.Entry entry : map1.entrySet()) { + Object key = entry.getKey(); + + Number value1 = null; + Number value2 = null; + + if (entry.getValue() instanceof Number) { + + value1 = (Number) entry.getValue(); + value2 = (Number) map2.get(key); + } else { + try { + value1 = new Double(entry.getValue().toString()); + value2 = new Double(map2.get(key).toString()); + } catch (NumberFormatException nfe) { + continue; + } + } + + if (value1.equals(value2)) { + continue; + } + + if (value1 instanceof Byte) { + diffMap.put(key, Byte.valueOf((byte) (((Byte) value2).byteValue() - ((Byte) value1).byteValue()))); + } else if (value1 instanceof Short) { + diffMap.put(key, Short.valueOf((short) (((Short) value2).shortValue() - ((Short) value1).shortValue()))); + } else if (value1 instanceof Integer) { + diffMap.put(key, Integer.valueOf((((Integer) value2).intValue() - ((Integer) value1).intValue()))); + } else if (value1 instanceof Long) { + diffMap.put(key, Long.valueOf((((Long) value2).longValue() - ((Long) value1).longValue()))); + } else if (value1 instanceof Float) { + diffMap.put(key, Float.valueOf(((Float) value2).floatValue() - ((Float) value1).floatValue())); + } else if (value1 instanceof Double) { + diffMap.put(key, Double.valueOf((((Double) value2).shortValue() - ((Double) value1).shortValue()))); + } else if (value1 instanceof BigDecimal) { + diffMap.put(key, ((BigDecimal) value2).subtract((BigDecimal) value1)); + } else if (value1 instanceof BigInteger) { + diffMap.put(key, ((BigInteger) value2).subtract((BigInteger) value1)); + } + } + + return diffMap; + } + + public static List loadClasses(String extensionClassNames, String errorMessageKey, ExceptionInterceptor exceptionInterceptor) { + + List instances = new LinkedList<>(); + + List interceptorsToCreate = StringUtils.split(extensionClassNames, ",", true); + + String className = null; + + try { + for (int i = 0, s = interceptorsToCreate.size(); i < s; i++) { + className = interceptorsToCreate.get(i); + @SuppressWarnings("unchecked") + T instance = (T) Class.forName(className).newInstance(); + + instances.add(instance); + } + + } catch (Throwable t) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString(errorMessageKey, new Object[] { className }), t, + exceptionInterceptor); + } + + return instances; + } + + /** Cache for the JDBC interfaces already verified */ + private static final ConcurrentMap, Boolean> isJdbcInterfaceCache = new ConcurrentHashMap<>(); + + /** + * Recursively checks for interfaces on the given class to determine if it implements a java.sql, javax.sql or com.mysql.cj.jdbc interface. + * + * @param clazz + * The class to investigate. + * @return boolean + */ + public static boolean isJdbcInterface(Class clazz) { + if (Util.isJdbcInterfaceCache.containsKey(clazz)) { + return (Util.isJdbcInterfaceCache.get(clazz)); + } + + if (clazz.isInterface()) { + try { + if (isJdbcPackage(clazz.getPackage().getName())) { + Util.isJdbcInterfaceCache.putIfAbsent(clazz, true); + return true; + } + } catch (Exception ex) { + /* + * We may experience a NPE from getPackage() returning null, or class-loading facilities. + * This happens when this class is instrumented to implement runtime-generated interfaces. + */ + } + } + + for (Class iface : clazz.getInterfaces()) { + if (isJdbcInterface(iface)) { + Util.isJdbcInterfaceCache.putIfAbsent(clazz, true); + return true; + } + } + + if (clazz.getSuperclass() != null && isJdbcInterface(clazz.getSuperclass())) { + Util.isJdbcInterfaceCache.putIfAbsent(clazz, true); + return true; + } + + Util.isJdbcInterfaceCache.putIfAbsent(clazz, false); + return false; + } + + /** + * Check if the package name is a known JDBC package. + * + * @param packageName + * The package name to check. + * @return boolean + */ + public static boolean isJdbcPackage(String packageName) { + return packageName != null + && (packageName.startsWith("java.sql") || packageName.startsWith("javax.sql") || packageName.startsWith("com.mysql.cj.jdbc")); + } + + /** Cache for the implemented interfaces searched. */ + private static final ConcurrentMap, Class[]> implementedInterfacesCache = new ConcurrentHashMap<>(); + + /** + * Retrieves a list with all interfaces implemented by the given class. If possible gets this information from a cache instead of navigating through the + * object hierarchy. Results are stored in a cache for future reference. + * + * @param clazz + * The class from which the interface list will be retrieved. + * @return + * An array with all the interfaces for the given class. + */ + public static Class[] getImplementedInterfaces(Class clazz) { + Class[] implementedInterfaces = Util.implementedInterfacesCache.get(clazz); + if (implementedInterfaces != null) { + return implementedInterfaces; + } + + Set> interfaces = new LinkedHashSet<>(); + Class superClass = clazz; + do { + Collections.addAll(interfaces, superClass.getInterfaces()); + } while ((superClass = superClass.getSuperclass()) != null); + + implementedInterfaces = interfaces.toArray(new Class[interfaces.size()]); + Class[] oldValue = Util.implementedInterfacesCache.putIfAbsent(clazz, implementedInterfaces); + if (oldValue != null) { + implementedInterfaces = oldValue; + } + + return implementedInterfaces; + } + + /** + * Computes the number of seconds elapsed since the given time in milliseconds. + * + * @param timeInMillis + * The past instant in milliseconds. + * @return + * The number of seconds, truncated, elapsed since timeInMillis. + */ + public static long secondsSinceMillis(long timeInMillis) { + return (System.currentTimeMillis() - timeInMillis) / 1000; + } + + /** + * Converts long to int, truncating to maximum/minimum value if needed. + * + * @param longValue + * long value + * @return int value + */ + public static int truncateAndConvertToInt(long longValue) { + return longValue > Integer.MAX_VALUE ? Integer.MAX_VALUE : longValue < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) longValue; + } + + /** + * Converts long[] to int[], truncating to maximum/minimum value if needed. + * + * @param longArray + * log values + * @return int values + */ + public static int[] truncateAndConvertToInt(long[] longArray) { + int[] intArray = new int[longArray.length]; + + for (int i = 0; i < longArray.length; i++) { + intArray[i] = longArray[i] > Integer.MAX_VALUE ? Integer.MAX_VALUE : longArray[i] < Integer.MIN_VALUE ? Integer.MIN_VALUE : (int) longArray[i]; + } + return intArray; + } + + /** + * Returns the package name of the given class. + * Using clazz.getPackage().getName() is not an alternative because under some class loaders the method getPackage() just returns null. + * + * @param clazz + * the Class from which to get the package name + * @return the package name + */ + public static String getPackageName(Class clazz) { + String fqcn = clazz.getName(); + int classNameStartsAt = fqcn.lastIndexOf('.'); + if (classNameStartsAt > 0) { + return fqcn.substring(0, classNameStartsAt); + } + return ""; + } + + /** + * Checks if the JVM is running on Windows Operating System. + * + * @return + * true if currently running on Windows, false otherwise. + */ + public static boolean isRunningOnWindows() { + return StringUtils.indexOfIgnoreCase(Constants.OS_NAME, "WINDOWS") != -1; + } + + /** + * Reads length bytes from reader into buf. Blocks until enough input is + * available + * + * @param reader + * {@link Reader} + * @param buf + * char array to read into + * @param length + * number of chars to read + * + * @return the actual number of chars read + * + * @throws IOException + * if an error occurs + */ + public static int readFully(Reader reader, char[] buf, int length) throws IOException { + int numCharsRead = 0; + + while (numCharsRead < length) { + int count = reader.read(buf, numCharsRead, length - numCharsRead); + + if (count < 0) { + break; + } + + numCharsRead += count; + } + + return numCharsRead; + } + + public static final int readBlock(InputStream i, byte[] b, ExceptionInterceptor exceptionInterceptor) { + try { + return i.read(b); + } catch (Throwable ex) { + throw ExceptionFactory.createException(Messages.getString("Util.5") + ex.getClass().getName(), exceptionInterceptor); + } + } + + public static final int readBlock(InputStream i, byte[] b, int length, ExceptionInterceptor exceptionInterceptor) { + try { + int lengthToRead = length; + + if (lengthToRead > b.length) { + lengthToRead = b.length; + } + + return i.read(b, 0, lengthToRead); + } catch (Throwable ex) { + throw ExceptionFactory.createException(Messages.getString("Util.5") + ex.getClass().getName(), exceptionInterceptor); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/AbstractQuery.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/AbstractQuery.java new file mode 100644 index 0000000..b4505ec --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/AbstractQuery.java @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.CJTimeoutException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.OperationCancelledException; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.ProtocolEntityFactory; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.Resultset.Type; + +public abstract class AbstractQuery implements Query { + + /** Used to generate IDs when profiling. */ + static int statementCounter = 1; + + public NativeSession session = null; + + /** Used to identify this statement when profiling. */ + protected int statementId; + + protected RuntimeProperty maxAllowedPacket; + + /** The character encoding to use (if available) */ + protected String charEncoding = null; + + /** Mutex to prevent race between returning query results and noticing that query has been timed-out or cancelled. */ + protected Object cancelTimeoutMutex = new Object(); + + private CancelStatus cancelStatus = CancelStatus.NOT_CANCELED; + + /** The timeout for a query */ + protected int timeoutInMillis = 0; + + /** Holds batched commands */ + protected List batchedArgs; + + /** The type of this result set (scroll sensitive or in-sensitive) */ + protected Resultset.Type resultSetType = Type.FORWARD_ONLY; + + /** The number of rows to fetch at a time (currently ignored) */ + protected int fetchSize = 0; + + /** Currently executing a statement? */ + protected final AtomicBoolean statementExecuting = new AtomicBoolean(false); + + /** The database in use */ + protected String currentDb = null; + + /** Has clearWarnings() been called? */ + protected boolean clearWarningsCalled = false; + + /** Elapsed time of the execution */ + private long executeTime = -1; + + /** Query attributes bindings */ + protected QueryAttributesBindings queryAttributesBindings; + + public AbstractQuery(NativeSession sess) { + statementCounter++; + this.session = sess; + this.maxAllowedPacket = sess.getPropertySet().getIntegerProperty(PropertyKey.maxAllowedPacket); + this.charEncoding = sess.getPropertySet().getStringProperty(PropertyKey.characterEncoding).getValue(); + this.queryAttributesBindings = new NativeQueryAttributesBindings(sess); + } + + @Override + public int getId() { + return this.statementId; + } + + @Override + public void setCancelStatus(CancelStatus cs) { + this.cancelStatus = cs; + } + + @Override + public long getExecuteTime() { + return this.executeTime; + } + + @Override + public void setExecuteTime(long executeTime) { + this.executeTime = executeTime; + } + + @Override + public void checkCancelTimeout() { + synchronized (this.cancelTimeoutMutex) { + if (this.cancelStatus != CancelStatus.NOT_CANCELED) { + CJException cause = this.cancelStatus == CancelStatus.CANCELED_BY_TIMEOUT ? new CJTimeoutException() : new OperationCancelledException(); + resetCancelledState(); + throw cause; + } + } + } + + public void resetCancelledState() { + synchronized (this.cancelTimeoutMutex) { + this.cancelStatus = CancelStatus.NOT_CANCELED; + } + } + + @Override + public ProtocolEntityFactory getResultSetFactory() { + // TODO Auto-generated method stub + return null; + } + + @Override + public NativeSession getSession() { + return this.session; + } + + @Override + public Object getCancelTimeoutMutex() { + return this.cancelTimeoutMutex; + } + + public void closeQuery() { + this.queryAttributesBindings = null; + this.session = null; + } + + public void addBatch(Object batch) { + if (this.batchedArgs == null) { + this.batchedArgs = new ArrayList<>(); + } + this.batchedArgs.add(batch); + } + + public List getBatchedArgs() { + return this.batchedArgs == null ? null : Collections.unmodifiableList(this.batchedArgs); + } + + @Override + public void clearBatchedArgs() { + if (this.batchedArgs != null) { + this.batchedArgs.clear(); + } + } + + @Override + public QueryAttributesBindings getQueryAttributesBindings() { + return this.queryAttributesBindings; + } + + @Override + public int getResultFetchSize() { + return this.fetchSize; + } + + @Override + public void setResultFetchSize(int fetchSize) { + this.fetchSize = fetchSize; + } + + public Resultset.Type getResultType() { + return this.resultSetType; + } + + public void setResultType(Resultset.Type resultSetType) { + this.resultSetType = resultSetType; + } + + public int getTimeoutInMillis() { + return this.timeoutInMillis; + } + + public void setTimeoutInMillis(int timeoutInMillis) { + this.timeoutInMillis = timeoutInMillis; + } + + public CancelQueryTask startQueryTimer(Query stmtToCancel, int timeout) { + if (this.session.getPropertySet().getBooleanProperty(PropertyKey.enableQueryTimeouts).getValue() && timeout != 0) { + CancelQueryTaskImpl timeoutTask = new CancelQueryTaskImpl(stmtToCancel); + this.session.getCancelTimer().schedule(timeoutTask, timeout); + return timeoutTask; + } + return null; + } + + public void stopQueryTimer(CancelQueryTask timeoutTask, boolean rethrowCancelReason, boolean checkCancelTimeout) { + if (timeoutTask != null) { + timeoutTask.cancel(); + + if (rethrowCancelReason && timeoutTask.getCaughtWhileCancelling() != null) { + Throwable t = timeoutTask.getCaughtWhileCancelling(); + throw ExceptionFactory.createException(t.getMessage(), t); + } + + this.session.getCancelTimer().purge(); + + if (checkCancelTimeout) { + checkCancelTimeout(); + } + } + } + + public AtomicBoolean getStatementExecuting() { + return this.statementExecuting; + } + + public String getCurrentDatabase() { + return this.currentDb; + } + + public void setCurrentDatabase(String currentDb) { + this.currentDb = currentDb; + } + + public boolean isClearWarningsCalled() { + return this.clearWarningsCalled; + } + + public void setClearWarningsCalled(boolean clearWarningsCalled) { + this.clearWarningsCalled = clearWarningsCalled; + } + + public void statementBegins() { + this.clearWarningsCalled = false; + this.statementExecuting.set(true); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CancelQueryTaskImpl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CancelQueryTaskImpl.java new file mode 100644 index 0000000..24c5e6e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CancelQueryTaskImpl.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.TimerTask; + +import com.mysql.cj.Query.CancelStatus; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.OperationCancelledException; +import com.mysql.cj.protocol.a.NativeMessageBuilder; + +//TODO should not be protocol-specific + +/** + * Thread used to implement query timeouts...Eventually we could be more + * efficient and have one thread with timers, but this is a straightforward + * and simple way to implement a feature that isn't used all that often. + */ +public class CancelQueryTaskImpl extends TimerTask implements CancelQueryTask { + + Query queryToCancel; + Throwable caughtWhileCancelling = null; + boolean queryTimeoutKillsConnection = false; + + public CancelQueryTaskImpl(Query cancellee) { + this.queryToCancel = cancellee; + NativeSession session = (NativeSession) cancellee.getSession(); + this.queryTimeoutKillsConnection = session.getPropertySet().getBooleanProperty(PropertyKey.queryTimeoutKillsConnection).getValue(); + } + + @Override + public boolean cancel() { + boolean res = super.cancel(); + this.queryToCancel = null; + return res; + } + + @Override + public void run() { + + Thread cancelThread = new Thread() { + + @Override + public void run() { + Query localQueryToCancel = CancelQueryTaskImpl.this.queryToCancel; + if (localQueryToCancel == null) { + return; + } + NativeSession session = (NativeSession) localQueryToCancel.getSession(); + if (session == null) { + return; + } + + try { + if (CancelQueryTaskImpl.this.queryTimeoutKillsConnection) { + localQueryToCancel.setCancelStatus(CancelStatus.CANCELED_BY_TIMEOUT); + session.invokeCleanupListeners(new OperationCancelledException(Messages.getString("Statement.ConnectionKilledDueToTimeout"))); + } else { + synchronized (localQueryToCancel.getCancelTimeoutMutex()) { + long origConnId = session.getThreadId(); + HostInfo hostInfo = session.getHostInfo(); + String database = hostInfo.getDatabase(); + String user = hostInfo.getUser(); + String password = hostInfo.getPassword(); + + NativeSession newSession = null; + try { + newSession = new NativeSession(hostInfo, session.getPropertySet()); + newSession.connect(hostInfo, user, password, database, 30000, new TransactionEventHandler() { + @Override + public void transactionCompleted() { + } + + public void transactionBegun() { + } + }); + newSession.getProtocol().sendCommand(new NativeMessageBuilder(newSession.getServerSession().supportsQueryAttributes()) + .buildComQuery(newSession.getSharedSendPacket(), "KILL QUERY " + origConnId), false, 0); + } finally { + try { + newSession.forceClose(); + } catch (Throwable t) { + // no-op. + } + } + localQueryToCancel.setCancelStatus(CancelStatus.CANCELED_BY_TIMEOUT); + } + } + // } catch (NullPointerException npe) { + // Case when connection closed while starting to cancel. + // We can't easily synchronize this, because then one thread can't cancel() a running query. + // Ignore, we shouldn't re-throw this, because the connection's already closed, so the statement has been timed out. + } catch (Throwable t) { + CancelQueryTaskImpl.this.caughtWhileCancelling = t; + } finally { + setQueryToCancel(null); + } + } + }; + + cancelThread.start(); + } + + public Throwable getCaughtWhileCancelling() { + return this.caughtWhileCancelling; + } + + public void setCaughtWhileCancelling(Throwable caughtWhileCancelling) { + this.caughtWhileCancelling = caughtWhileCancelling; + } + + public Query getQueryToCancel() { + return this.queryToCancel; + } + + public void setQueryToCancel(Query queryToCancel) { + this.queryToCancel = queryToCancel; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ClientPreparedQuery.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ClientPreparedQuery.java new file mode 100644 index 0000000..897f38c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ClientPreparedQuery.java @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.util.StringUtils; + +public class ClientPreparedQuery extends AbstractQuery implements PreparedQuery { + + protected QueryInfo queryInfo; + + protected QueryBindings queryBindings = null; + + /** The SQL that was passed in to 'prepare' */ + protected String originalSql = null; + + /** The number of parameters in this PreparedStatement */ + protected int parameterCount; + + /** Command index of currently executing batch command. */ + protected int batchCommandIndex = -1; + + protected RuntimeProperty autoClosePStmtStreams; + protected RuntimeProperty useStreamLengthsInPrepStmts; + + public ClientPreparedQuery(NativeSession sess) { + super(sess); + this.autoClosePStmtStreams = this.session.getPropertySet().getBooleanProperty(PropertyKey.autoClosePStmtStreams); + this.useStreamLengthsInPrepStmts = this.session.getPropertySet().getBooleanProperty(PropertyKey.useStreamLengthsInPrepStmts); + } + + @Override + public void closeQuery() { + super.closeQuery(); + } + + public QueryInfo getQueryInfo() { + return this.queryInfo; + } + + public void setQueryInfo(QueryInfo queryInfo) { + this.queryInfo = queryInfo; + } + + public String getOriginalSql() { + return this.originalSql; + } + + public void setOriginalSql(String originalSql) { + this.originalSql = originalSql; + } + + public int getParameterCount() { + return this.parameterCount; + } + + public void setParameterCount(int parameterCount) { + this.parameterCount = parameterCount; + } + + @Override + public QueryBindings getQueryBindings() { + return this.queryBindings; + } + + @Override + public void setQueryBindings(QueryBindings queryBindings) { + this.queryBindings = queryBindings; + } + + public int getBatchCommandIndex() { + return this.batchCommandIndex; + } + + public void setBatchCommandIndex(int batchCommandIndex) { + this.batchCommandIndex = batchCommandIndex; + } + + /** + * Computes the optimum number of batched parameter lists to send + * without overflowing max_allowed_packet. + * + * @param numBatchedArgs + * original batch size + * @return computed batch size + */ + public int computeBatchSize(int numBatchedArgs) { + long[] combinedValues = computeMaxParameterSetSizeAndBatchSize(numBatchedArgs); + + long maxSizeOfParameterSet = combinedValues[0]; + long sizeOfEntireBatch = combinedValues[1]; + + if (sizeOfEntireBatch < this.maxAllowedPacket.getValue() - this.originalSql.length()) { + return numBatchedArgs; + } + + return (int) Math.max(1, (this.maxAllowedPacket.getValue() - this.originalSql.length()) / maxSizeOfParameterSet); + } + + /** + * Method checkNullOrEmptyQuery. + * + * @param sql + * the SQL to check + * + * @throws WrongArgumentException + * if query is null or empty. + */ + public void checkNullOrEmptyQuery(String sql) { + if (sql == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedQuery.0"), this.session.getExceptionInterceptor()); + } + + if (sql.length() == 0) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedQuery.1"), this.session.getExceptionInterceptor()); + } + } + + public String asSql() { + StringBuilder buf = new StringBuilder(); + Object batchArg = null; + if (this.batchCommandIndex != -1) { + batchArg = this.batchedArgs.get(this.batchCommandIndex); + } + + byte[][] staticSqlStrings = this.queryInfo.getStaticSqlParts(); + for (int i = 0; i < this.parameterCount; ++i) { + buf.append(this.charEncoding != null ? StringUtils.toString(staticSqlStrings[i], this.charEncoding) : StringUtils.toString(staticSqlStrings[i])); + String val = null; + if (batchArg != null && batchArg instanceof String) { + buf.append((String) batchArg); + continue; + } + val = this.batchCommandIndex == -1 ? (this.queryBindings == null ? null : this.queryBindings.getBindValues()[i].getString()) + : ((QueryBindings) batchArg).getBindValues()[i].getString(); + buf.append(val == null ? "** NOT SPECIFIED **" : val); + } + buf.append(this.charEncoding != null ? StringUtils.toString(staticSqlStrings[this.parameterCount], this.charEncoding) + : StringUtils.toAsciiString(staticSqlStrings[this.parameterCount])); + return buf.toString(); + } + + /** + * Computes the maximum parameter set size, and entire batch size given + * the number of arguments in the batch. + * + * @param numBatchedArgs + * number of batched arguments + * @return new long[] { maxSizeOfParameterSet, sizeOfEntireBatch } + */ + protected long[] computeMaxParameterSetSizeAndBatchSize(int numBatchedArgs) { + long sizeOfEntireBatch = 1 /* com_query */; + long maxSizeOfParameterSet = 0; + + if (this.session.getServerSession().supportsQueryAttributes()) { + sizeOfEntireBatch += 9 /* parameter_count */ + 1 /* parameter_set_count */; + sizeOfEntireBatch += (this.queryAttributesBindings.getCount() + 7) / 8 /* null_bitmap */ + 1 /* new_params_bind_flag */; + for (int i = 0; i < this.queryAttributesBindings.getCount(); i++) { + BindValue queryAttribute = this.queryAttributesBindings.getAttributeValue(i); + sizeOfEntireBatch += 2 /* parameter_type */ + queryAttribute.getName().length() /* parameter_name */ + queryAttribute.getBinaryLength(); + } + } + + for (int i = 0; i < numBatchedArgs; i++) { + long sizeOfParameterSet = 0; + + BindValue[] bindValues = ((QueryBindings) this.batchedArgs.get(i)).getBindValues(); + for (int j = 0; j < bindValues.length; j++) { + sizeOfParameterSet += bindValues[j].getTextLength(); + } + + // + // Account for static part of values clause + // This is a little naive, because the ?s will be replaced but it gives us some padding, and is less housekeeping to ignore them. We're looking + // for a "fuzzy" value here anyway + // + sizeOfParameterSet += this.queryInfo.getValuesClauseLength() != -1 ? this.queryInfo.getValuesClauseLength() + 1 : this.originalSql.length() + 1; + sizeOfEntireBatch += sizeOfParameterSet; + + if (sizeOfParameterSet > maxSizeOfParameterSet) { + maxSizeOfParameterSet = sizeOfParameterSet; + } + } + + return new long[] { maxSizeOfParameterSet, sizeOfEntireBatch }; + } + + @SuppressWarnings("unchecked") + @Override + public M fillSendPacket(QueryBindings bindings) { + return (M) this.session.getProtocol().getMessageBuilder().buildComQuery(this.session.getSharedSendPacket(), this.session, this, bindings, + this.charEncoding); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CoreSession.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CoreSession.java new file mode 100644 index 0000000..15934ea --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/CoreSession.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.net.SocketAddress; + +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.CJOperationNotSupportedException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.log.Log; +import com.mysql.cj.log.LogFactory; +import com.mysql.cj.log.NullLogger; +import com.mysql.cj.log.ProfilerEventHandler; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.Protocol; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.util.Util; + +public abstract class CoreSession implements Session { + + protected PropertySet propertySet; + protected ExceptionInterceptor exceptionInterceptor; + + /** The logger we're going to use */ + protected transient Log log; + + /** Null logger shared by all connections at startup */ + protected static final Log NULL_LOGGER = new NullLogger(Log.LOGGER_INSTANCE_NAME); + + protected transient Protocol protocol; + protected MessageBuilder messageBuilder; + + /** The point in time when this connection was created */ + protected long connectionCreationTimeMillis = 0; + protected HostInfo hostInfo = null; + + protected RuntimeProperty gatherPerfMetrics; + protected RuntimeProperty characterEncoding; + protected RuntimeProperty disconnectOnExpiredPasswords; + protected RuntimeProperty cacheServerConfiguration; + protected RuntimeProperty autoReconnect; + protected RuntimeProperty autoReconnectForPools; + protected RuntimeProperty maintainTimeStats; + + /** The max-rows setting for current session */ + protected int sessionMaxRows = -1; + + /** The event sink to use for profiling */ + private ProfilerEventHandler eventSink; + + public CoreSession(HostInfo hostInfo, PropertySet propSet) { + this.connectionCreationTimeMillis = System.currentTimeMillis(); + this.hostInfo = hostInfo; + this.propertySet = propSet; + + this.gatherPerfMetrics = getPropertySet().getBooleanProperty(PropertyKey.gatherPerfMetrics); + this.characterEncoding = getPropertySet().getStringProperty(PropertyKey.characterEncoding); + this.disconnectOnExpiredPasswords = getPropertySet().getBooleanProperty(PropertyKey.disconnectOnExpiredPasswords); + this.cacheServerConfiguration = getPropertySet().getBooleanProperty(PropertyKey.cacheServerConfiguration); + this.autoReconnect = getPropertySet().getBooleanProperty(PropertyKey.autoReconnect); + this.autoReconnectForPools = getPropertySet().getBooleanProperty(PropertyKey.autoReconnectForPools); + this.maintainTimeStats = getPropertySet().getBooleanProperty(PropertyKey.maintainTimeStats); + + this.log = LogFactory.getLogger(getPropertySet().getStringProperty(PropertyKey.logger).getStringValue(), Log.LOGGER_INSTANCE_NAME); + } + + @Override + public void changeUser(String user, String password, String database) { + // reset maxRows to default value + this.sessionMaxRows = -1; + + this.protocol.changeUser(user, password, database); + } + + @Override + public PropertySet getPropertySet() { + return this.propertySet; + } + + @Override + public ExceptionInterceptor getExceptionInterceptor() { + return this.exceptionInterceptor; + } + + @Override + public void setExceptionInterceptor(ExceptionInterceptor exceptionInterceptor) { + this.exceptionInterceptor = exceptionInterceptor; + } + + @Override + public Log getLog() { + return this.log; + } + + public HostInfo getHostInfo() { + return this.hostInfo; + } + + @SuppressWarnings("unchecked") + @Override + public MessageBuilder getMessageBuilder() { + return (MessageBuilder) this.messageBuilder; + } + + @Override + public ServerSession getServerSession() { + return this.protocol.getServerSession(); + } + + @Override + public boolean versionMeetsMinimum(int major, int minor, int subminor) { + return this.protocol.versionMeetsMinimum(major, minor, subminor); + } + + @Override + public long getThreadId() { + return this.protocol.getServerSession().getCapabilities().getThreadId(); + } + + @Override + public void quit() { + if (this.eventSink != null) { + this.eventSink.destroy(); + this.eventSink = null; + } + } + + @Override + public void forceClose() { + if (this.eventSink != null) { + this.eventSink.destroy(); + this.eventSink = null; + } + } + + public boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public ProfilerEventHandler getProfilerEventHandler() { + if (this.eventSink == null) { + synchronized (this) { + if (this.eventSink == null) { // check again to ensure that other thread didn't set it already + this.eventSink = (ProfilerEventHandler) Util.getInstance( + this.propertySet.getStringProperty(PropertyKey.profilerEventHandler).getStringValue(), new Class[0], new Object[0], + this.exceptionInterceptor); + + this.eventSink.init(this.log); + } + } + } + return this.eventSink; + } + + @Override + public boolean isSSLEstablished() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public SocketAddress getRemoteSocketAddress() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public void addListener(SessionEventListener l) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public void removeListener(SessionEventListener l) { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public String getIdentifierQuoteString() { + throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported"); + } + + @Override + public DataStoreMetadata getDataStoreMetadata() { + return new DataStoreMetadataImpl(this); + } + + @Override + public String getQueryTimingUnits() { + return this.protocol.getQueryTimingUnits(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/DataStoreMetadataImpl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/DataStoreMetadataImpl.java new file mode 100644 index 0000000..46fcfac --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/DataStoreMetadataImpl.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.mysql.cj.result.LongValueFactory; +import com.mysql.cj.xdevapi.ExprUnparser; + +public class DataStoreMetadataImpl implements DataStoreMetadata { + + private Session session; + + public DataStoreMetadataImpl(Session sess) { + this.session = sess; + } + + public boolean schemaExists(String schemaName) { + StringBuilder stmt = new StringBuilder("select count(*) from information_schema.schemata where schema_name = '"); + // TODO: verify quoting rules + stmt.append(schemaName.replaceAll("'", "\\'")); + stmt.append("'"); + + Function rowToLong = r -> r.getValue(0, new LongValueFactory(this.session.getPropertySet())); + List counters = this.session.query(this.session.getMessageBuilder().buildSqlStatement(stmt.toString()), null, rowToLong, Collectors.toList()); + return 1 == counters.get(0); + } + + public boolean tableExists(String schemaName, String tableName) { + StringBuilder stmt = new StringBuilder("select count(*) from information_schema.tables where table_schema = '"); + // TODO: verify quoting rules + stmt.append(schemaName.replaceAll("'", "\\'")); + stmt.append("' and table_name = '"); + stmt.append(tableName.replaceAll("'", "\\'")); + stmt.append("'"); + + Function rowToLong = r -> r.getValue(0, new LongValueFactory(this.session.getPropertySet())); + List counters = this.session.query(this.session.getMessageBuilder().buildSqlStatement(stmt.toString()), null, rowToLong, Collectors.toList()); + return 1 == counters.get(0); + } + + @Override + public long getTableRowCount(String schemaName, String tableName) { + StringBuilder stmt = new StringBuilder("select count(*) from "); + stmt.append(ExprUnparser.quoteIdentifier(schemaName)); + stmt.append("."); + stmt.append(ExprUnparser.quoteIdentifier(tableName)); + + Function rowToLong = r -> r.getValue(0, new LongValueFactory(this.session.getPropertySet())); + List counters = this.session.query(this.session.getMessageBuilder().buildSqlStatement(stmt.toString()), null, rowToLong, Collectors.toList()); + return counters.get(0); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/LicenseConfiguration.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/LicenseConfiguration.java new file mode 100644 index 0000000..7eb30cd --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/LicenseConfiguration.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Map; + +import com.mysql.cj.exceptions.CJException; + +/** + * Used in commercially-licensed clients that require connections to commercially-licensed servers as part of the licensing terms. + */ +public class LicenseConfiguration { + + /** + * Used in commercially-licensed clients that require connections to + * commercially-licensed servers as part of the licensing terms. + * + * @param serverVariables + * a Map of the output of 'show variables' from the server we're + * connecting to. + * + * @throws CJException + * if commercial license is required, but not found + */ + public static void checkLicenseType(Map serverVariables) { + // we don't check anything by default + } + + private LicenseConfiguration() { + // this is a static utility class + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/MysqlxSession.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/MysqlxSession.java new file mode 100644 index 0000000..6c7d7db --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/MysqlxSession.java @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.IOException; +import java.util.Iterator; +import java.util.Spliterators; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collector; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.CJCommunicationsException; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.ResultBuilder; +import com.mysql.cj.protocol.x.StatementExecuteOkBuilder; +import com.mysql.cj.protocol.x.XProtocol; +import com.mysql.cj.protocol.x.XProtocolError; +import com.mysql.cj.protocol.x.XProtocolRowInputStream; +import com.mysql.cj.result.Row; +import com.mysql.cj.xdevapi.PreparableStatement; + +public class MysqlxSession extends CoreSession { + + public MysqlxSession(HostInfo hostInfo, PropertySet propSet) { + super(hostInfo, propSet); + + // create protocol instance + this.protocol = new XProtocol(hostInfo, propSet); + + this.messageBuilder = this.protocol.getMessageBuilder(); + + this.protocol.connect(hostInfo.getUser(), hostInfo.getPassword(), hostInfo.getDatabase()); + } + + public MysqlxSession(XProtocol prot) { + super(null, prot.getPropertySet()); + this.protocol = prot; + this.messageBuilder = this.protocol.getMessageBuilder(); + } + + @Override + public String getProcessHost() { + return this.protocol.getSocketConnection().getHost(); + } + + public int getPort() { + return this.protocol.getSocketConnection().getPort(); + } + + public XProtocol getProtocol() { + return (XProtocol) this.protocol; + } + + @Override + public void quit() { + try { + this.protocol.close(); + } catch (IOException ex) { + throw new CJCommunicationsException(ex); + } + super.quit(); + } + + public boolean isClosed() { + return !((XProtocol) this.protocol).isOpen(); + } + + /** + * Check if current session is using a MySQL server that supports prepared statements. + * + * @return + * {@code true} if the MySQL server in use supports prepared statements + */ + public boolean supportsPreparedStatements() { + return ((XProtocol) this.protocol).supportsPreparedStatements(); + } + + /** + * Check if enough statements were executed in the underlying MySQL server so that another prepare statement attempt should be done. + * + * @return + * {@code true} if enough executions have been done since last time a prepared statement failed to be prepared + */ + public boolean readyForPreparingStatements() { + return ((XProtocol) this.protocol).readyForPreparingStatements(); + } + + /** + * Return an id to be used as a client-managed prepared statement id. + * + * @param preparableStatement + * {@link PreparableStatement} + * @return a new identifier to be used as prepared statement id + */ + public int getNewPreparedStatementId(PreparableStatement preparableStatement) { + return ((XProtocol) this.protocol).getNewPreparedStatementId(preparableStatement); + } + + /** + * Free a prepared statement id so that it can be reused. + * + * @param preparedStatementId + * the prepared statement id to release + */ + public void freePreparedStatementId(int preparedStatementId) { + ((XProtocol) this.protocol).freePreparedStatementId(preparedStatementId); + } + + /** + * Propagate to the underlying protocol instance that preparing a statement on the connected server failed. + * + * @param preparedStatementId + * the id of the prepared statement that failed to be prepared + * @param e + * {@link XProtocolError} + * @return + * {@code true} if the exception was properly handled + */ + public boolean failedPreparingStatement(int preparedStatementId, XProtocolError e) { + return ((XProtocol) this.protocol).failedPreparingStatement(preparedStatementId, e); + } + + public RES query(M message, Predicate rowFilter, Function rowMapper, Collector collector) { + this.protocol.send(message, 0); + ColumnDefinition metadata = this.protocol.readMetadata(); + Iterator ris = new XProtocolRowInputStream(metadata, (XProtocol) this.protocol, null); + Stream stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(ris, 0), false); + if (rowFilter != null) { + stream = stream.filter(rowFilter); + } + RES result = stream.map(rowMapper).collect(collector); + this.protocol.readQueryResult(new StatementExecuteOkBuilder()); + return result; + } + + public R query(M message, ResultBuilder resultBuilder) { + return ((XProtocol) this.protocol).query(message, resultBuilder); + } + + public CompletableFuture queryAsync(M message, ResultBuilder resultBuilder) { + return ((XProtocol) this.protocol).queryAsync(message, resultBuilder); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeCharsetSettings.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeCharsetSettings.java new file mode 100644 index 0000000..344d458 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeCharsetSettings.java @@ -0,0 +1,731 @@ +/* + * Copyright (c) 2021, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.Resultset.Type; +import com.mysql.cj.protocol.ServerCapabilities; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.protocol.a.NativeConstants; +import com.mysql.cj.protocol.a.NativeMessageBuilder; +import com.mysql.cj.protocol.a.NativePacketPayload; +import com.mysql.cj.protocol.a.ResultsetFactory; +import com.mysql.cj.result.IntegerValueFactory; +import com.mysql.cj.result.Row; +import com.mysql.cj.result.StringValueFactory; +import com.mysql.cj.result.ValueFactory; +import com.mysql.cj.util.StringUtils; + +public class NativeCharsetSettings extends CharsetMapping implements CharsetSettings { + + private NativeSession session; + + private ServerSession serverSession; + + public Map collationIndexToCollationName = null; + public Map collationNameToCollationIndex = null; + public Map collationIndexToCharsetName = null; + public Map charsetNameToMblen = null; + public Map charsetNameToJavaEncoding = null; + public Map charsetNameToCollationIndex = null; + public Map javaEncodingUcToCharsetName = null; + public Set multibyteEncodings = null; + + private Integer sessionCollationIndex = null; + + /** + * What character set is the metadata returned in? + */ + private String metadataEncoding = null; + private int metadataCollationIndex; + + /** + * The (Java) encoding used to interpret error messages received from the server. + * We use character_set_results (since MySQL 5.5) if it is not null or UTF-8 otherwise. + */ + private String errorMessageEncoding = "Cp1252"; // to begin with, changes after we talk to the server + + protected RuntimeProperty characterEncoding; + protected RuntimeProperty passwordCharacterEncoding; + protected RuntimeProperty characterSetResults; + protected RuntimeProperty connectionCollation; + protected RuntimeProperty cacheServerConfiguration; + + /** + * If a CharsetEncoder is required for escaping. Needed for SJIS and related problems with \u00A5. + */ + private boolean requiresEscapingEncoder; + + private NativeMessageBuilder commandBuilder = null; + + private static final Map> customCollationIndexToCollationNameByUrl = new HashMap<>(); + private static final Map> customCollationNameToCollationIndexByUrl = new HashMap<>(); + + /** + * Actual collation index to mysql charset name map of user defined charsets for given server URLs. + */ + private static final Map> customCollationIndexToCharsetNameByUrl = new HashMap<>(); + + /** + * Actual mysql charset name to mblen map of user defined charsets for given server URLs. + */ + private static final Map> customCharsetNameToMblenByUrl = new HashMap<>(); + + private static final Map> customCharsetNameToJavaEncodingByUrl = new HashMap<>(); + private static final Map> customCharsetNameToCollationIndexByUrl = new HashMap<>(); + private static final Map> customJavaEncodingUcToCharsetNameByUrl = new HashMap<>(); + private static final Map> customMultibyteEncodingsByUrl = new HashMap<>(); + + /** + * Does the character set of this connection match the character set of the platform + */ + private boolean platformDbCharsetMatches = true; // changed once we've connected. + + private NativeMessageBuilder getCommandBuilder() { + if (this.commandBuilder == null) { + this.commandBuilder = new NativeMessageBuilder(this.serverSession.supportsQueryAttributes()); + } + return this.commandBuilder; + } + + /** + * Determines if the connection charset is the same as the platform charset + */ + private void checkForCharsetMismatch() { + String characterEncodingValue = this.characterEncoding.getValue(); + if (characterEncodingValue != null) { + Charset characterEncodingCs = Charset.forName(characterEncodingValue); + Charset encodingToCheck = Charset.defaultCharset(); + + this.platformDbCharsetMatches = encodingToCheck.equals(characterEncodingCs); + } + } + + @Override + public boolean doesPlatformDbCharsetMatches() { + return this.platformDbCharsetMatches; + } + + public NativeCharsetSettings(NativeSession sess) { + this.session = sess; + this.serverSession = this.session.getServerSession(); + + this.characterEncoding = sess.getPropertySet().getStringProperty(PropertyKey.characterEncoding); + this.characterSetResults = this.session.getPropertySet().getProperty(PropertyKey.characterSetResults); + this.passwordCharacterEncoding = this.session.getPropertySet().getStringProperty(PropertyKey.passwordCharacterEncoding); + this.connectionCollation = this.session.getPropertySet().getStringProperty(PropertyKey.connectionCollation); + this.cacheServerConfiguration = sess.getPropertySet().getBooleanProperty(PropertyKey.cacheServerConfiguration); + + tryAndFixEncoding(this.characterEncoding, true); + tryAndFixEncoding(this.passwordCharacterEncoding, true); + if (!"null".equalsIgnoreCase(this.characterSetResults.getValue())) { // the "null" instead of an encoding name is allowed for characterSetResults + tryAndFixEncoding(this.characterSetResults, false); + } + } + + /** + * Attempt to use the encoding, and bail out if it can't be used. + * + * @param encodingProperty + * connection property containing the Java encoding to try + * @param replaceImpermissibleEncodings + * The character_set_client system variable cannot be set to ucs2, utf16, utf16le, utf32 charsets. If "true" the corresponding connection + * property value will be replaced with "UTF-8" + */ + private void tryAndFixEncoding(RuntimeProperty encodingProperty, boolean replaceImpermissibleEncodings) { + String oldEncoding = encodingProperty.getValue(); + if (oldEncoding != null) { + if (replaceImpermissibleEncodings && ("UnicodeBig".equalsIgnoreCase(oldEncoding) || "UTF-16".equalsIgnoreCase(oldEncoding) + || "UTF-16LE".equalsIgnoreCase(oldEncoding) || "UTF-32".equalsIgnoreCase(oldEncoding))) { + encodingProperty.setValue("UTF-8"); + } else { + try { + StringUtils.getBytes("abc", oldEncoding); + } catch (WrongArgumentException waEx) { + // Try the MySQL character set name, then.... + String newEncoding = getStaticJavaEncodingForMysqlCharset(oldEncoding); + if (newEncoding == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { oldEncoding }), + this.session.getExceptionInterceptor()); + } + StringUtils.getBytes("abc", newEncoding); + encodingProperty.setValue(newEncoding); + } + } + } + } + + @Override + public int configurePreHandshake(boolean reset) { + if (reset) { + this.sessionCollationIndex = null; + } + + // Avoid the second execution of this method + if (this.sessionCollationIndex != null) { + return this.sessionCollationIndex; + } + + ServerCapabilities capabilities = this.serverSession.getCapabilities(); + String encoding = this.passwordCharacterEncoding.getStringValue(); + if (encoding == null) { + String connectionColl = this.connectionCollation.getStringValue(); + if ((connectionColl == null || (this.sessionCollationIndex = getStaticCollationIndexForCollationName(connectionColl)) == null) + && (encoding = this.characterEncoding.getValue()) == null) { + // If none of "passwordCharacterEncoding", "connectionCollation" or "characterEncoding" is specified then use UTF-8. + // It would be better to use the server default collation here, to avoid unnecessary SET NAMES queries after the handshake if server + // default charset if not utf8, but we can not do it until server Bug#32729185 is fixed. Server cuts collation index to lower byte and, for example, + // if the server is started with character-set-server=utf8mb4 and collation-server=utf8mb4_is_0900_ai_ci (collation index 257) the Protocol::HandshakeV10 + // will contain character_set=1, "big5_chinese_ci". This is true not only for MySQL 8.0, where built-in collations with indexes > 255 were first introduced, + // but also other server series would be affected when configured with custom collations, for which the reserved collation id range is >= 1024. + this.sessionCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci; + } + } + + if (this.sessionCollationIndex == null) { + if ((this.sessionCollationIndex = getStaticCollationIndexForJavaEncoding(encoding, capabilities.getServerVersion())) == 0) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("StringUtils.0", new Object[] { encoding })); + } + } + + if (this.sessionCollationIndex > Constants.UNSIGNED_BYTE_MAX_VALUE // + || isStaticImpermissibleCollation(this.sessionCollationIndex)) { // At this point, impermissible charset can be set only with "connectionCollation". + this.sessionCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci; + } + + if (this.sessionCollationIndex == MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci + && !capabilities.getServerVersion().meetsMinimum(new ServerVersion(8, 0, 1))) { + this.sessionCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_general_ci; // use utf8mb4_general_ci instead of utf8mb4_0900_ai_ci for old servers + } + + // error messages are returned according to character_set_results which, at this point, is set from the response packet + this.errorMessageEncoding = getStaticJavaEncodingForCollationIndex(this.sessionCollationIndex); + + String csName = getStaticMysqlCharsetNameForCollationIndex(this.sessionCollationIndex); + this.serverSession.getServerVariables().put(CHARACTER_SET_RESULTS, csName); + + this.serverSession.getServerVariables().put(CHARACTER_SET_CLIENT, csName); + this.serverSession.getServerVariables().put(CHARACTER_SET_CONNECTION, csName); + this.serverSession.getServerVariables().put(COLLATION_CONNECTION, getStaticCollationNameForCollationIndex(this.sessionCollationIndex)); + + return this.sessionCollationIndex; + } + + @Override + public void configurePostHandshake(boolean dontCheckServerMatch) { + + buildCollationMapping(); + + /* + * Configuring characterEncoding. + */ + + String requiredCollation = this.connectionCollation.getStringValue(); + String requiredEncoding = this.characterEncoding.getValue(); + String passwordEncoding = this.passwordCharacterEncoding.getValue(); + Integer requiredCollationIndex; + String sessionCharsetName = getServerDefaultCharset(); + String sessionCollationClause = ""; + + try { + + // connectionCollation overrides the characterEncoding value + if (requiredCollation != null && (requiredCollationIndex = getCollationIndexForCollationName(requiredCollation)) != null) { + if (isImpermissibleCollation(requiredCollationIndex)) { + if (this.serverSession.getCapabilities().getServerVersion().meetsMinimum(new ServerVersion(8, 0, 1))) { + requiredCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci; + requiredCollation = "utf8mb4_0900_ai_ci"; + } else { + requiredCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_general_ci; + requiredCollation = "utf8mb4_general_ci"; + } + } + sessionCollationClause = " COLLATE " + requiredCollation; + sessionCharsetName = getMysqlCharsetNameForCollationIndex(requiredCollationIndex); + requiredEncoding = getJavaEncodingForCollationIndex(requiredCollationIndex, requiredEncoding); + this.sessionCollationIndex = requiredCollationIndex; + } + + if (requiredEncoding != null) { // If either connectionCollation or characterEncoding is defined. + if (sessionCollationClause.length() == 0) { // If no connectionCollation is defined. + sessionCharsetName = getMysqlCharsetForJavaEncoding(requiredEncoding.toUpperCase(Locale.ENGLISH), this.serverSession.getServerVersion()); + } + + } else { // Neither connectionCollation nor characterEncoding are defined. + // Collations with index > 255 don't fit into server greeting packet. + // Now we can set sessionCollationIndex according to "collation_server" value. + if (!StringUtils.isNullOrEmpty(passwordEncoding)) { + if (this.serverSession.getCapabilities().getServerVersion().meetsMinimum(new ServerVersion(8, 0, 1))) { + this.sessionCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci; // We can't do more, just trying to use utf8mb4_0900_ai_ci because the most of collations in that range are utf8mb4. + requiredCollation = "utf8mb4_0900_ai_ci"; + } else { + this.sessionCollationIndex = MYSQL_COLLATION_INDEX_utf8mb4_general_ci; + requiredCollation = "utf8mb4_general_ci"; + } + sessionCollationClause = " COLLATE " + getCollationNameForCollationIndex(this.sessionCollationIndex); + } + + if (((requiredEncoding = getJavaEncodingForCollationIndex(this.sessionCollationIndex, requiredEncoding)) == null)) { + // if there is no mapping for default collation index leave characterEncoding as specified by user + throw ExceptionFactory.createException(Messages.getString("Connection.5", new Object[] { this.sessionCollationIndex.toString() }), + this.session.getExceptionInterceptor()); + } + + sessionCharsetName = getMysqlCharsetNameForCollationIndex(this.sessionCollationIndex); + } + + } catch (ArrayIndexOutOfBoundsException outOfBoundsEx) { + throw ExceptionFactory.createException(Messages.getString("Connection.6", new Object[] { this.sessionCollationIndex }), + this.session.getExceptionInterceptor()); + } + + this.characterEncoding.setValue(requiredEncoding); + + if (sessionCharsetName != null) { + boolean isCharsetDifferent = !characterSetNamesMatches(sessionCharsetName); + boolean isCollationDifferent = sessionCollationClause.length() > 0 + && !requiredCollation.equalsIgnoreCase(this.serverSession.getServerVariable(COLLATION_CONNECTION)); + if (dontCheckServerMatch || isCharsetDifferent || isCollationDifferent) { + this.session.getProtocol().sendCommand(getCommandBuilder().buildComQuery(null, "SET NAMES " + sessionCharsetName + sessionCollationClause), + false, 0); + this.serverSession.getServerVariables().put(CHARACTER_SET_CLIENT, sessionCharsetName); + this.serverSession.getServerVariables().put(CHARACTER_SET_CONNECTION, sessionCharsetName); + + if (sessionCollationClause.length() > 0) { + this.serverSession.getServerVariables().put(COLLATION_CONNECTION, requiredCollation); + } else { + int idx = getCollationIndexForMysqlCharsetName(sessionCharsetName); + if (idx == MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci + && !this.serverSession.getCapabilities().getServerVersion().meetsMinimum(new ServerVersion(8, 0, 1))) { + idx = MYSQL_COLLATION_INDEX_utf8mb4_general_ci; + } + this.serverSession.getServerVariables().put(COLLATION_CONNECTION, getCollationNameForCollationIndex(idx)); + } + } + } + + /* + * Configuring characterSetResults. + * + * We know how to deal with any charset coming back from the database, so tell the server not to do conversion + * if the user hasn't 'forced' a result-set character set. + */ + + String sessionResultsCharset = this.serverSession.getServerVariable(CHARACTER_SET_RESULTS); + String characterSetResultsValue = this.characterSetResults.getValue(); + if (StringUtils.isNullOrEmpty(characterSetResultsValue) || "null".equalsIgnoreCase(characterSetResultsValue)) { + if (!StringUtils.isNullOrEmpty(sessionResultsCharset) && !"NULL".equalsIgnoreCase(sessionResultsCharset)) { + this.session.getProtocol().sendCommand(getCommandBuilder().buildComQuery(null, "SET character_set_results = NULL"), false, 0); + this.serverSession.getServerVariables().put(CHARACTER_SET_RESULTS, null); + } + + String defaultMetadataCharsetMysql = this.serverSession.getServerVariable("character_set_system"); + this.metadataEncoding = defaultMetadataCharsetMysql != null ? getJavaEncodingForMysqlCharset(defaultMetadataCharsetMysql) : "UTF-8"; + this.errorMessageEncoding = "UTF-8"; + + } else { + String resultsCharsetName = getMysqlCharsetForJavaEncoding(characterSetResultsValue.toUpperCase(Locale.ENGLISH), + this.serverSession.getServerVersion()); + + if (resultsCharsetName == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("Connection.7", new Object[] { characterSetResultsValue }), this.session.getExceptionInterceptor()); + } + + if (!resultsCharsetName.equalsIgnoreCase(sessionResultsCharset)) { + this.session.getProtocol().sendCommand(getCommandBuilder().buildComQuery(null, "SET character_set_results = " + resultsCharsetName), false, 0); + this.serverSession.getServerVariables().put(CHARACTER_SET_RESULTS, resultsCharsetName); + } + + this.metadataEncoding = characterSetResultsValue; + this.errorMessageEncoding = characterSetResultsValue; + } + + this.metadataCollationIndex = getCollationIndexForJavaEncoding(this.metadataEncoding, this.serverSession.getServerVersion()); + + checkForCharsetMismatch(); + + /** + * Check if we need a CharsetEncoder for escaping codepoints that are + * transformed to backslash (0x5c) in the connection encoding. + */ + try { + CharsetEncoder enc = Charset.forName(this.characterEncoding.getValue()).newEncoder(); + CharBuffer cbuf = CharBuffer.allocate(1); + ByteBuffer bbuf = ByteBuffer.allocate(1); + + cbuf.put("\u00a5"); + cbuf.position(0); + enc.encode(cbuf, bbuf, true); + if (bbuf.get(0) == '\\') { + this.requiresEscapingEncoder = true; + } else { + cbuf.clear(); + bbuf.clear(); + + cbuf.put("\u20a9"); + cbuf.position(0); + enc.encode(cbuf, bbuf, true); + if (bbuf.get(0) == '\\') { + this.requiresEscapingEncoder = true; + } + } + } catch (java.nio.charset.UnsupportedCharsetException ucex) { + // fallback to String API + byte bbuf[] = StringUtils.getBytes("\u00a5", this.characterEncoding.getValue()); + if (bbuf[0] == '\\') { + this.requiresEscapingEncoder = true; + } else { + bbuf = StringUtils.getBytes("\u20a9", this.characterEncoding.getValue()); + if (bbuf[0] == '\\') { + this.requiresEscapingEncoder = true; + } + } + } + } + + private boolean characterSetNamesMatches(String mysqlEncodingName) { + boolean res = false; + if (mysqlEncodingName != null) { + // set names is equivalent to character_set_client ..._results and ..._connection, but we set _results later, so don't check it here. + res = (mysqlEncodingName.equalsIgnoreCase(this.serverSession.getServerVariable(CHARACTER_SET_CLIENT)) + && mysqlEncodingName.equalsIgnoreCase(this.serverSession.getServerVariable(CHARACTER_SET_CONNECTION))); + // if still doesn't match then checking aliases + List aliases; + if (!res && (aliases = CharsetMapping.getStaticMysqlCharsetAliasesByName(mysqlEncodingName)) != null) { + for (String alias : aliases) { + if (res = (alias.equalsIgnoreCase(this.serverSession.getServerVariable(CHARACTER_SET_CLIENT)) + && alias.equalsIgnoreCase(this.serverSession.getServerVariable(CHARACTER_SET_CONNECTION)))) { + break; + } + } + } + } + return res; + + } + + /** + * Get the server's default character set name according to collation index from server greeting, + * or value of 'character_set_server' variable if there is no mapping for that index + * + * @return MySQL charset name + */ + public String getServerDefaultCharset() { + String charset = getStaticMysqlCharsetNameForCollationIndex(this.sessionCollationIndex); + return charset != null ? charset : this.serverSession.getServerVariable("character_set_server"); + } + + @Override + public String getErrorMessageEncoding() { + return this.errorMessageEncoding; + } + + @Override + public String getMetadataEncoding() { + return this.metadataEncoding; + } + + @Override + public int getMetadataCollationIndex() { + return this.metadataCollationIndex; + } + + @Override + public boolean getRequiresEscapingEncoder() { + return this.requiresEscapingEncoder; + } + + @Override + public String getPasswordCharacterEncoding() { + return getStaticJavaEncodingForCollationIndex(this.sessionCollationIndex); + } + + /** + * Builds the map needed for 4.1.0 and newer servers that maps field-level + * charset/collation info to a java character encoding name. + */ + private void buildCollationMapping() { + + Map customCollationIndexToCollationName = null; + Map customCollationNameToCollationIndex = null; + Map customCollationIndexToCharsetName = null; + Map customCharsetNameToMblen = null; + Map customCharsetNameToJavaEncoding = new HashMap<>(); + Map customJavaEncodingUcToCharsetName = new HashMap<>(); + Map customCharsetNameToCollationIndex = new HashMap<>(); + Set customMultibyteEncodings = new HashSet<>(); + + String databaseURL = this.session.getHostInfo().getDatabaseUrl(); + + if (this.cacheServerConfiguration.getValue()) { + synchronized (customCollationIndexToCharsetNameByUrl) { + customCollationIndexToCollationName = customCollationIndexToCollationNameByUrl.get(databaseURL); + customCollationNameToCollationIndex = customCollationNameToCollationIndexByUrl.get(databaseURL); + customCollationIndexToCharsetName = customCollationIndexToCharsetNameByUrl.get(databaseURL); + customCharsetNameToMblen = customCharsetNameToMblenByUrl.get(databaseURL); + customCharsetNameToJavaEncoding = customCharsetNameToJavaEncodingByUrl.get(databaseURL); + customJavaEncodingUcToCharsetName = customJavaEncodingUcToCharsetNameByUrl.get(databaseURL); + customCharsetNameToCollationIndex = customCharsetNameToCollationIndexByUrl.get(databaseURL); + customMultibyteEncodings = customMultibyteEncodingsByUrl.get(databaseURL); + } + } + + if (customCollationIndexToCharsetName == null && this.session.getPropertySet().getBooleanProperty(PropertyKey.detectCustomCollations).getValue()) { + customCollationIndexToCollationName = new HashMap<>(); + customCollationNameToCollationIndex = new HashMap<>(); + customCollationIndexToCharsetName = new HashMap<>(); + customCharsetNameToMblen = new HashMap<>(); + customCharsetNameToJavaEncoding = new HashMap<>(); + customJavaEncodingUcToCharsetName = new HashMap<>(); + customCharsetNameToCollationIndex = new HashMap<>(); + customMultibyteEncodings = new HashSet<>(); + + String customCharsetMapping = this.session.getPropertySet().getStringProperty(PropertyKey.customCharsetMapping).getValue(); + if (customCharsetMapping != null) { + String[] pairs = customCharsetMapping.split(","); + for (String pair : pairs) { + int keyEnd = pair.indexOf(":"); + if (keyEnd > 0 && (keyEnd + 1) < pair.length()) { + String charset = pair.substring(0, keyEnd); + String encoding = pair.substring(keyEnd + 1); + customCharsetNameToJavaEncoding.put(charset, encoding); + customJavaEncodingUcToCharsetName.put(encoding.toUpperCase(Locale.ENGLISH), charset); + } + } + } + + ValueFactory ivf = new IntegerValueFactory(this.session.getPropertySet()); + + try { + NativePacketPayload resultPacket = this.session.getProtocol().sendCommand(getCommandBuilder().buildComQuery(null, + "SELECT c.COLLATION_NAME, c.CHARACTER_SET_NAME, c.ID, cs.MAXLEN, c.IS_DEFAULT='Yes' from INFORMATION_SCHEMA.COLLATIONS AS c LEFT JOIN" + + " INFORMATION_SCHEMA.CHARACTER_SETS AS cs ON cs.CHARACTER_SET_NAME=c.CHARACTER_SET_NAME"), + false, 0); + Resultset rs = this.session.getProtocol().readAllResults(-1, false, resultPacket, false, null, new ResultsetFactory(Type.FORWARD_ONLY, null)); + ValueFactory svf = new StringValueFactory(this.session.getPropertySet()); + Row r; + while ((r = rs.getRows().next()) != null) { + String collationName = r.getValue(0, svf); + String charsetName = r.getValue(1, svf); + int collationIndex = ((Number) r.getValue(2, ivf)).intValue(); + int maxlen = ((Number) r.getValue(3, ivf)).intValue(); + boolean isDefault = ((Number) r.getValue(4, ivf)).intValue() > 0; + + if (collationIndex >= MAP_SIZE // + || collationIndex != getStaticCollationIndexForCollationName(collationName) + || !charsetName.equals(getStaticMysqlCharsetNameForCollationIndex(collationIndex))) { + customCollationIndexToCollationName.put(collationIndex, collationName); + customCollationNameToCollationIndex.put(collationName, collationIndex); + customCollationIndexToCharsetName.put(collationIndex, charsetName); + if (isDefault || !customCharsetNameToCollationIndex.containsKey(charsetName) + && CharsetMapping.getStaticCollationIndexForMysqlCharsetName(charsetName) == 0) { + customCharsetNameToCollationIndex.put(charsetName, collationIndex); + } + } + // if no static map for charsetName adding to custom map + if (getStaticMysqlCharsetByName(charsetName) == null) { + customCharsetNameToMblen.put(charsetName, maxlen); + if (maxlen > 1) { + String enc = customCharsetNameToJavaEncoding.get(charsetName); + if (enc != null) { + customMultibyteEncodings.add(enc.toUpperCase(Locale.ENGLISH)); + } + } + } + + } + } catch (IOException e) { + throw ExceptionFactory.createException(e.getMessage(), e, this.session.getExceptionInterceptor()); + } + + if (this.cacheServerConfiguration.getValue()) { + synchronized (customCollationIndexToCharsetNameByUrl) { + customCollationIndexToCollationNameByUrl.put(databaseURL, Collections.unmodifiableMap(customCollationIndexToCollationName)); + customCollationNameToCollationIndexByUrl.put(databaseURL, Collections.unmodifiableMap(customCollationNameToCollationIndex)); + customCollationIndexToCharsetNameByUrl.put(databaseURL, Collections.unmodifiableMap(customCollationIndexToCharsetName)); + customCharsetNameToMblenByUrl.put(databaseURL, Collections.unmodifiableMap(customCharsetNameToMblen)); + customCharsetNameToJavaEncodingByUrl.put(databaseURL, Collections.unmodifiableMap(customCharsetNameToJavaEncoding)); + customJavaEncodingUcToCharsetNameByUrl.put(databaseURL, Collections.unmodifiableMap(customJavaEncodingUcToCharsetName)); + customCharsetNameToCollationIndexByUrl.put(databaseURL, Collections.unmodifiableMap(customCharsetNameToCollationIndex)); + customMultibyteEncodingsByUrl.put(databaseURL, Collections.unmodifiableSet(customMultibyteEncodings)); + } + } + } + + if (customCollationIndexToCharsetName != null) { + this.collationIndexToCollationName = customCollationIndexToCollationName; + this.collationNameToCollationIndex = customCollationNameToCollationIndex; + this.collationIndexToCharsetName = customCollationIndexToCharsetName; + this.charsetNameToMblen = customCharsetNameToMblen; + this.charsetNameToJavaEncoding = customCharsetNameToJavaEncoding; + this.javaEncodingUcToCharsetName = customJavaEncodingUcToCharsetName; + this.charsetNameToCollationIndex = customCharsetNameToCollationIndex; + this.multibyteEncodings = customMultibyteEncodings; + } + } + + @Override + public Integer getCollationIndexForCollationName(String collationName) { + Integer collationIndex = null; + if (this.collationNameToCollationIndex == null || (collationIndex = this.collationNameToCollationIndex.get(collationName)) == null) { + collationIndex = getStaticCollationIndexForCollationName(collationName); + } + return collationIndex; + } + + @Override + public String getCollationNameForCollationIndex(Integer collationIndex) { + String collationName = null; + if (collationIndex != null + && (this.collationIndexToCollationName == null || (collationName = this.collationIndexToCollationName.get(collationIndex)) == null)) { + collationName = getStaticCollationNameForCollationIndex(collationIndex); + } + return collationName; + } + + @Override + public String getMysqlCharsetNameForCollationIndex(Integer collationIndex) { + String charset = null; + if (this.collationIndexToCharsetName == null || (charset = this.collationIndexToCharsetName.get(collationIndex)) == null) { + charset = getStaticMysqlCharsetNameForCollationIndex(collationIndex); + } + return charset; + } + + @Override + public String getJavaEncodingForCollationIndex(int collationIndex) { + return getJavaEncodingForCollationIndex(collationIndex, this.characterEncoding.getValue()); + } + + public String getJavaEncodingForCollationIndex(Integer collationIndex, String fallBackJavaEncoding) { + String encoding = null; + String charset = null; + if (collationIndex != NativeConstants.NO_CHARSET_INFO) { + if (this.collationIndexToCharsetName != null && (charset = this.collationIndexToCharsetName.get(collationIndex)) != null) { + encoding = getJavaEncodingForMysqlCharset(charset, fallBackJavaEncoding); + } + if (encoding == null) { + encoding = getStaticJavaEncodingForCollationIndex(collationIndex, fallBackJavaEncoding); + } + } + return encoding != null ? encoding : fallBackJavaEncoding; + } + + public int getCollationIndexForJavaEncoding(String javaEncoding, ServerVersion version) { + return getCollationIndexForMysqlCharsetName(getMysqlCharsetForJavaEncoding(javaEncoding, version)); + } + + public int getCollationIndexForMysqlCharsetName(String charsetName) { + Integer index = null; + if (this.charsetNameToCollationIndex == null || (index = this.charsetNameToCollationIndex.get(charsetName)) == null) { + index = getStaticCollationIndexForMysqlCharsetName(charsetName); + } + return index; + } + + public String getJavaEncodingForMysqlCharset(String mysqlCharsetName) { + String encoding = null; + if (this.charsetNameToJavaEncoding == null || (encoding = this.charsetNameToJavaEncoding.get(mysqlCharsetName)) == null) { + encoding = getStaticJavaEncodingForMysqlCharset(mysqlCharsetName); + } + return encoding; + } + + public String getJavaEncodingForMysqlCharset(String mysqlCharsetName, String javaEncoding) { + String encoding = null; + if (this.charsetNameToJavaEncoding == null || (encoding = this.charsetNameToJavaEncoding.get(mysqlCharsetName)) == null) { + encoding = getStaticJavaEncodingForMysqlCharset(mysqlCharsetName, javaEncoding); + } + return encoding; + } + + public String getMysqlCharsetForJavaEncoding(String javaEncoding, ServerVersion version) { + String charset = null; + if (this.javaEncodingUcToCharsetName == null || (charset = this.javaEncodingUcToCharsetName.get(javaEncoding.toUpperCase(Locale.ENGLISH))) == null) { + charset = getStaticMysqlCharsetForJavaEncoding(javaEncoding, version); + } + return charset; + } + + public boolean isImpermissibleCollation(int collationIndex) { + String charsetName = null; + if (this.collationIndexToCharsetName != null && (charsetName = this.collationIndexToCharsetName.get(collationIndex)) != null) { + if (charsetName.equals(MYSQL_CHARSET_NAME_ucs2) || charsetName.equals(MYSQL_CHARSET_NAME_utf16) || charsetName.equals(MYSQL_CHARSET_NAME_utf16le) + || charsetName.equals(MYSQL_CHARSET_NAME_utf32)) { + return true; + } + } + return isStaticImpermissibleCollation(collationIndex); + } + + public boolean isMultibyteCharset(String javaEncodingName) { + if (this.multibyteEncodings != null && this.multibyteEncodings.contains(javaEncodingName.toUpperCase(Locale.ENGLISH))) { + return true; + } + return isStaticMultibyteCharset(javaEncodingName); + } + + @Override + public int getMaxBytesPerChar(String javaCharsetName) { + return getMaxBytesPerChar(null, javaCharsetName); + } + + @Override + public int getMaxBytesPerChar(Integer charsetIndex, String javaCharsetName) { + String charset = null; + if ((charset = getMysqlCharsetNameForCollationIndex(charsetIndex)) == null) { + // if we didn't find charset name by index + charset = getStaticMysqlCharsetForJavaEncoding(javaCharsetName, this.serverSession.getServerVersion()); + } + Integer mblen = null; + if (this.charsetNameToMblen == null || (mblen = this.charsetNameToMblen.get(charset)) == null) { + mblen = getStaticMblen(charset); + } + return mblen != null ? mblen.intValue() : 1; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryAttributesBindings.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryAttributesBindings.java new file mode 100644 index 0000000..0dec146 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryAttributesBindings.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; + +public class NativeQueryAttributesBindings implements QueryAttributesBindings { + Session session = null; + private List bindAttributes = new ArrayList<>(); + + public NativeQueryAttributesBindings(Session sess) { + this.session = sess; + } + + @Override + public void setAttribute(String name, Object value) { + MysqlType defaultMysqlType = value == null ? MysqlType.NULL : NativeQueryBindings.DEFAULT_MYSQL_TYPES.get(value.getClass()); + Object val = value; + if (defaultMysqlType == null) { + Optional mysqlType = NativeQueryBindings.DEFAULT_MYSQL_TYPES.entrySet().stream() + .filter(m -> m.getKey().isAssignableFrom(value.getClass())).map(m -> m.getValue()).findFirst(); + if (mysqlType.isPresent()) { + defaultMysqlType = mysqlType.get(); + } else { + defaultMysqlType = MysqlType.VARCHAR; + val = value.toString(); + } + } + + NativeQueryBindValue bv = new NativeQueryBindValue(this.session); + bv.setName(name); + bv.setBinding(val, defaultMysqlType, 0, null); + this.bindAttributes.add(bv); + } + + @Override + public int getCount() { + return this.bindAttributes.size(); + } + + @Override + public BindValue getAttributeValue(int index) { + return this.bindAttributes.get(index); + } + + @Override + public void runThroughAll(Consumer bindAttribute) { + this.bindAttributes.forEach(bindAttribute::accept); + } + + @Override + public void clearAttributes() { + this.bindAttributes.clear(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindValue.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindValue.java new file mode 100644 index 0000000..badc0bf --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindValue.java @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.InputStream; +import java.io.Reader; +import java.sql.Blob; +import java.sql.Clob; +import java.util.Calendar; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.Protocol; +import com.mysql.cj.protocol.ServerSession; +import com.mysql.cj.protocol.ValueEncoder; +import com.mysql.cj.result.Field; + +public class NativeQueryBindValue implements BindValue { + + /** NULL indicator */ + protected boolean isNull; + + protected boolean isNational = false; + + protected MysqlType targetType = MysqlType.NULL; + + /** The value to store */ + public Object value; + + /** has this parameter been set? */ + protected boolean isSet = false; + + /* Calendar to be used for DATE and DATETIME values storing */ + public Calendar calendar; + + protected boolean escapeBytesIfNeeded = true; + + /** Is this query a LOAD DATA query? */ + protected boolean isLoadDataQuery = false; + + PropertySet pset; + Protocol protocol; + ServerSession serverSession; + ExceptionInterceptor exceptionInterceptor; + + private Field field = null; + protected boolean keepOrigNanos = false; + protected ValueEncoder valueEncoder = null; + protected long scaleOrLength = -1; + protected long boundBeforeExecutionNum = 0; // specific to ServerPreparedQuery + + /** The query attribute name */ + private String name; + + public NativeQueryBindValue(Session sess) { + this.pset = sess.getPropertySet(); + this.protocol = ((NativeSession) sess).getProtocol(); + this.serverSession = sess.getServerSession(); + this.exceptionInterceptor = sess.getExceptionInterceptor(); + } + + @Override + public NativeQueryBindValue clone() { + return new NativeQueryBindValue(this); + } + + protected NativeQueryBindValue(NativeQueryBindValue copyMe) { + this.isNull = copyMe.isNull; + this.targetType = copyMe.targetType; + if (copyMe.value != null && copyMe.value instanceof byte[]) { + this.value = new byte[((byte[]) copyMe.value).length]; + System.arraycopy(copyMe.value, 0, this.value, 0, ((byte[]) copyMe.value).length); + } else { + this.value = copyMe.value; + } + this.isSet = copyMe.isSet; + this.pset = copyMe.pset; + this.protocol = copyMe.protocol; + this.serverSession = copyMe.serverSession; + this.calendar = copyMe.calendar; + this.escapeBytesIfNeeded = copyMe.escapeBytesIfNeeded; + this.isLoadDataQuery = copyMe.isLoadDataQuery; + this.isNational = copyMe.isNational; + this.field = copyMe.field; + this.keepOrigNanos = copyMe.keepOrigNanos; + this.valueEncoder = copyMe.valueEncoder; + this.scaleOrLength = copyMe.scaleOrLength; + this.boundBeforeExecutionNum = copyMe.boundBeforeExecutionNum; + } + + private boolean resetToType(MysqlType newTargetType) { // specific to ServerPreparedQuery + // clear any possible old value + reset(); + + if (newTargetType == MysqlType.NULL) { + // preserve the previous type to (possibly) avoid sending types at execution time + } else if (this.targetType != newTargetType) { + return true; + } + + return false; + } + + @Override + public void setBinding(Object obj, MysqlType type, int numberOfExecutions, AtomicBoolean sendTypesToServer) { + if (sendTypesToServer != null) { + sendTypesToServer.compareAndSet(false, resetToType(type)); // specific to ServerPreparedQuery + } + + this.value = obj; + this.targetType = type; + this.boundBeforeExecutionNum = numberOfExecutions; + + this.isNull = this.targetType == MysqlType.NULL; + this.isSet = true; + this.escapeBytesIfNeeded = true; + + Supplier vc = this.protocol.getValueEncoderSupplier(this.isNull ? null : this.value); + if (vc != null) { + this.valueEncoder = vc.get(); + this.valueEncoder.init(this.pset, this.serverSession, this.exceptionInterceptor); + } else { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("PreparedStatement.67", new Object[] { obj.getClass().getName(), type.name() }), this.exceptionInterceptor); + } + } + + @Override + public byte[] getByteValue() { + if (this.valueEncoder != null) { + return this.valueEncoder.getBytes(this); + } + return null; + } + + @Override + public void reset() { + this.isNull = false; + this.targetType = MysqlType.NULL; + this.value = null; + this.isSet = false; + this.calendar = null; // TODO how is it set again? + this.escapeBytesIfNeeded = true; + this.isLoadDataQuery = false; + this.isNational = false; + this.field = null; + this.keepOrigNanos = false; + this.valueEncoder = null; + this.scaleOrLength = -1; + } + + @Override + public boolean isNull() { + return this.isNull; + } + + @Override + public void setNull(boolean isNull) { + this.isNull = isNull; + if (isNull) { + this.targetType = MysqlType.NULL; + } + this.isSet = true; + } + + @Override + public boolean isStream() { + return this.value instanceof InputStream || this.value instanceof Reader || this.value instanceof Clob || this.value instanceof Blob; + } + + @Override + public boolean isNational() { + return this.isNational; + } + + @Override + public void setIsNational(boolean isNational) { + this.isNational = isNational; + } + + @Override + public Object getValue() { + return this.value; + } + + @Override + public Field getField() { + return this.field; + } + + @Override + public void setField(Field field) { + this.field = field; + } + + @Override + public boolean keepOrigNanos() { + return this.keepOrigNanos; + } + + @Override + public void setKeepOrigNanos(boolean value) { + this.keepOrigNanos = value; + } + + @Override + public MysqlType getMysqlType() { + return this.targetType; + } + + @Override + public void setMysqlType(MysqlType type) { + this.targetType = type; + } + + @Override + public boolean escapeBytesIfNeeded() { + return this.escapeBytesIfNeeded; + } + + @Override + public void setEscapeBytesIfNeeded(boolean val) { + this.escapeBytesIfNeeded = val; + } + + @Override + public boolean isSet() { + return this.isSet; + } + + @Override + public Calendar getCalendar() { + return this.calendar; + } + + @Override + public void setCalendar(Calendar cal) { + this.calendar = cal; + + } + + public int getFieldType() { + switch (this.targetType) { + case NULL: + return MysqlType.FIELD_TYPE_NULL; + case DECIMAL: + case DECIMAL_UNSIGNED: + return MysqlType.FIELD_TYPE_NEWDECIMAL; + case DOUBLE: + case DOUBLE_UNSIGNED: + return MysqlType.FIELD_TYPE_DOUBLE; + case BIGINT: + case BIGINT_UNSIGNED: + return MysqlType.FIELD_TYPE_LONGLONG; + case BOOLEAN: + case TINYINT: + case TINYINT_UNSIGNED: + return MysqlType.FIELD_TYPE_TINY; + case BINARY: + case VARBINARY: + case CHAR: + case VARCHAR: + return MysqlType.FIELD_TYPE_VAR_STRING; + case FLOAT: + case FLOAT_UNSIGNED: + return MysqlType.FIELD_TYPE_FLOAT; + case SMALLINT: + case SMALLINT_UNSIGNED: + case MEDIUMINT: + case MEDIUMINT_UNSIGNED: + return MysqlType.FIELD_TYPE_SHORT; + case INT: + case INT_UNSIGNED: + case YEAR: + return MysqlType.FIELD_TYPE_LONG; + case DATE: + return MysqlType.FIELD_TYPE_DATE; + case TIME: + return MysqlType.FIELD_TYPE_TIME; + case TIMESTAMP: + return MysqlType.FIELD_TYPE_TIMESTAMP; + case DATETIME: + return MysqlType.FIELD_TYPE_DATETIME; + case BLOB: + case TEXT: + return MysqlType.FIELD_TYPE_BLOB; + case TINYBLOB: + case TINYTEXT: + return MysqlType.FIELD_TYPE_TINY_BLOB; + case MEDIUMBLOB: + case MEDIUMTEXT: + return MysqlType.FIELD_TYPE_MEDIUM_BLOB; + case LONGBLOB: + case LONGTEXT: + return MysqlType.FIELD_TYPE_LONG_BLOB; + // case BIT: + // case JSON: + // case ENUM: + // case SET: + // case GEOMETRY: + default: + return MysqlType.FIELD_TYPE_VAR_STRING; + } + } + + @Override + public long getTextLength() { + return this.valueEncoder == null ? -1 : this.valueEncoder.getTextLength(this); + } + + @Override + public long getBinaryLength() { + return this.valueEncoder == null ? -1 : this.valueEncoder.getBinaryLength(this); + } + + @Override + public long getBoundBeforeExecutionNum() { // specific to ServerPreparedQuery + return this.boundBeforeExecutionNum; + } + + @Override + public String getString() { + if (this.valueEncoder == null) { + return "** NOT SPECIFIED **"; + } + return this.valueEncoder.getString(this); + } + + @Override + public long getScaleOrLength() { + return this.scaleOrLength; + } + + @Override + public void setScaleOrLength(long scaleOrLength) { + this.scaleOrLength = scaleOrLength; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public void writeAsText(Message intoMessage) { + this.valueEncoder.encodeAsText(intoMessage, this); + } + + @Override + public void writeAsBinary(Message intoMessage) { + this.valueEncoder.encodeAsBinary(intoMessage, this); + } + + @Override + public void writeAsQueryAttribute(Message intoMessage) { + this.valueEncoder.encodeAsQueryAttribute(intoMessage, this); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindings.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindings.java new file mode 100644 index 0000000..4333025 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeQueryBindings.java @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.Time; +import java.sql.Timestamp; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.ZonedDateTime; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.MysqlErrorNumbers; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.result.Field; +import com.mysql.cj.util.StringUtils; + +public class NativeQueryBindings implements QueryBindings { + + private Session session; + + /** Bind values for individual fields */ + private BindValue[] bindValues; + + private int numberOfExecutions = 0; + + /** Is this query a LOAD DATA query? */ + private boolean isLoadDataQuery = false; + + private ColumnDefinition columnDefinition; + + /** Do we need to send/resend types to the server? */ + private AtomicBoolean sendTypesToServer = new AtomicBoolean(false); // specific to ServerPreparedQuery + + private Function bindValueConstructor; + /** + * Flag indicating whether or not the long parameters have been 'switched' back to normal parameters. + * We cannot execute() if clearParameters() has not been called in this case. + */ + private boolean longParameterSwitchDetected = false; // specific to ServerPreparedQuery + + public NativeQueryBindings(int parameterCount, Session sess, Function bindValueConstructor) { + this.session = sess; + this.bindValueConstructor = bindValueConstructor; + this.bindValues = new BindValue[parameterCount]; + for (int i = 0; i < parameterCount; i++) { + this.bindValues[i] = bindValueConstructor.apply(this.session); + } + } + + @Override + public QueryBindings clone() { + NativeQueryBindings newBindings = new NativeQueryBindings(this.bindValues.length, this.session, this.bindValueConstructor); + BindValue[] bvs = new BindValue[this.bindValues.length]; + for (int i = 0; i < this.bindValues.length; i++) { + bvs[i] = this.bindValues[i].clone(); + } + newBindings.setBindValues(bvs); + newBindings.isLoadDataQuery = this.isLoadDataQuery; + newBindings.sendTypesToServer.set(this.sendTypesToServer.get()); + newBindings.setLongParameterSwitchDetected(this.isLongParameterSwitchDetected()); + return newBindings; + } + + @Override + public void setColumnDefinition(ColumnDefinition colDef) { + this.columnDefinition = colDef; + } + + @Override + public BindValue[] getBindValues() { + return this.bindValues; + } + + @Override + public void setBindValues(BindValue[] bindValues) { + this.bindValues = bindValues; + } + + @Override + public boolean clearBindValues() { + boolean hadLongData = false; + + if (this.bindValues != null) { + for (int i = 0; i < this.bindValues.length; i++) { + if ((this.bindValues[i] != null) && this.bindValues[i].isStream()) { + hadLongData = true; + } + this.bindValues[i].reset(); + } + } + + return hadLongData; + } + + @Override + public void checkParameterSet(int columnIndex) { + if (!this.bindValues[columnIndex].isSet()) { + throw ExceptionFactory.createException(Messages.getString("PreparedStatement.40") + (columnIndex + 1), + MysqlErrorNumbers.SQL_STATE_WRONG_NO_OF_PARAMETERS, 0, true, null, this.session.getExceptionInterceptor()); + } + } + + public void checkAllParametersSet() { + for (int i = 0; i < this.bindValues.length; i++) { + checkParameterSet(i); + } + } + + public int getNumberOfExecutions() { + return this.numberOfExecutions; + } + + public void setNumberOfExecutions(int numberOfExecutions) { + this.numberOfExecutions = numberOfExecutions; + } + + public boolean isLongParameterSwitchDetected() { + return this.longParameterSwitchDetected; + } + + public void setLongParameterSwitchDetected(boolean longParameterSwitchDetected) { + this.longParameterSwitchDetected = longParameterSwitchDetected; + } + + public AtomicBoolean getSendTypesToServer() { + return this.sendTypesToServer; + } + + /** + * Returns the structure representing the value that (can be)/(is) + * bound at the given parameter index. + * + * @param parameterIndex + * 0-based + * @param forLongData + * is this for a stream? + * @return BindValue + */ + public BindValue getBinding(int parameterIndex, boolean forLongData) { + if (this.bindValues[parameterIndex] != null && this.bindValues[parameterIndex].isStream() && !forLongData) { + this.longParameterSwitchDetected = true; + } + return this.bindValues[parameterIndex]; + } + + public void setFromBindValue(int parameterIndex, BindValue bv) { + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(bv.getValue(), bv.getMysqlType(), this.numberOfExecutions, this.sendTypesToServer); + binding.setKeepOrigNanos(bv.keepOrigNanos()); + binding.setCalendar(bv.getCalendar()); + binding.setEscapeBytesIfNeeded(bv.escapeBytesIfNeeded()); + binding.setIsNational(bv.isNational()); + binding.setField(bv.getField()); + binding.setScaleOrLength(bv.getScaleOrLength()); + } + + static Map, MysqlType> DEFAULT_MYSQL_TYPES = new HashMap<>(); + static { + DEFAULT_MYSQL_TYPES.put(BigDecimal.class, MysqlType.DECIMAL); + DEFAULT_MYSQL_TYPES.put(BigInteger.class, MysqlType.BIGINT); + DEFAULT_MYSQL_TYPES.put(Blob.class, MysqlType.BLOB); + DEFAULT_MYSQL_TYPES.put(Boolean.class, MysqlType.BOOLEAN); + DEFAULT_MYSQL_TYPES.put(Byte.class, MysqlType.TINYINT); + DEFAULT_MYSQL_TYPES.put(byte[].class, MysqlType.BINARY); + DEFAULT_MYSQL_TYPES.put(Calendar.class, MysqlType.TIMESTAMP); + DEFAULT_MYSQL_TYPES.put(Clob.class, MysqlType.TEXT); + DEFAULT_MYSQL_TYPES.put(Date.class, MysqlType.DATE); + DEFAULT_MYSQL_TYPES.put(java.util.Date.class, MysqlType.TIMESTAMP); + DEFAULT_MYSQL_TYPES.put(Double.class, MysqlType.DOUBLE); + DEFAULT_MYSQL_TYPES.put(Duration.class, MysqlType.TIME); + DEFAULT_MYSQL_TYPES.put(Float.class, MysqlType.FLOAT); + DEFAULT_MYSQL_TYPES.put(InputStream.class, MysqlType.BLOB); + DEFAULT_MYSQL_TYPES.put(Instant.class, MysqlType.TIMESTAMP); + DEFAULT_MYSQL_TYPES.put(Integer.class, MysqlType.INT); + DEFAULT_MYSQL_TYPES.put(LocalDate.class, MysqlType.DATE); + DEFAULT_MYSQL_TYPES.put(LocalDateTime.class, MysqlType.DATETIME); // default JDBC mapping is TIMESTAMP, see B-4 + DEFAULT_MYSQL_TYPES.put(LocalTime.class, MysqlType.TIME); + DEFAULT_MYSQL_TYPES.put(Long.class, MysqlType.BIGINT); + DEFAULT_MYSQL_TYPES.put(OffsetDateTime.class, MysqlType.TIMESTAMP); // default JDBC mapping is TIMESTAMP_WITH_TIMEZONE, see B-4 + DEFAULT_MYSQL_TYPES.put(OffsetTime.class, MysqlType.TIME); // default JDBC mapping is TIME_WITH_TIMEZONE, see B-4 + DEFAULT_MYSQL_TYPES.put(Reader.class, MysqlType.TEXT); + DEFAULT_MYSQL_TYPES.put(Short.class, MysqlType.SMALLINT); + DEFAULT_MYSQL_TYPES.put(String.class, MysqlType.VARCHAR); + DEFAULT_MYSQL_TYPES.put(Time.class, MysqlType.TIME); + DEFAULT_MYSQL_TYPES.put(Timestamp.class, MysqlType.TIMESTAMP); + DEFAULT_MYSQL_TYPES.put(ZonedDateTime.class, MysqlType.TIMESTAMP); // no JDBC mapping is defined + } + + @Override + public void setAsciiStream(int parameterIndex, InputStream x, int length) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, true); + binding.setBinding(x, MysqlType.TEXT, this.numberOfExecutions, this.sendTypesToServer); // TODO use length to find right TEXT type + binding.setScaleOrLength(length); + + } + + @Override + public void setBigDecimal(int parameterIndex, BigDecimal x) { + if (x == null) { + setNull(parameterIndex); + return; + } + getBinding(parameterIndex, false).setBinding(x, MysqlType.DECIMAL, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setBigInteger(int parameterIndex, BigInteger x) { + if (x == null) { + setNull(parameterIndex); + return; + } + getBinding(parameterIndex, false).setBinding(x, MysqlType.BIGINT_UNSIGNED, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setBinaryStream(int parameterIndex, InputStream x, int length) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, true); + binding.setBinding(x, MysqlType.BLOB, this.numberOfExecutions, this.sendTypesToServer); // TODO use length to find the right BLOB type + binding.setScaleOrLength(length); + } + + @Override + public void setBlob(int parameterIndex, Blob x) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.BLOB, this.numberOfExecutions, this.sendTypesToServer); + binding.setScaleOrLength(-1); + } + + @Override + public void setBoolean(int parameterIndex, boolean x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.BOOLEAN, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setByte(int parameterIndex, byte x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.TINYINT, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setBytes(int parameterIndex, byte[] x, boolean escapeIfNeeded) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.BINARY, this.numberOfExecutions, this.sendTypesToServer); // TODO VARBINARY ? + binding.setEscapeBytesIfNeeded(escapeIfNeeded); + } + + @Override + public void setCharacterStream(int parameterIndex, Reader reader, int length) { + if (reader == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, true); + binding.setBinding(reader, MysqlType.TEXT, this.numberOfExecutions, this.sendTypesToServer); + binding.setScaleOrLength(length); + } + + @Override + public void setClob(int parameterIndex, Clob x) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.TEXT, this.numberOfExecutions, this.sendTypesToServer); + binding.setScaleOrLength(-1); + } + + @Override + public void setDate(int parameterIndex, Date x, Calendar cal) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.DATE, this.numberOfExecutions, this.sendTypesToServer); + binding.setCalendar(cal == null ? null : (Calendar) cal.clone()); + } + + @Override + public void setDouble(int parameterIndex, double x) { + if (!this.session.getPropertySet().getBooleanProperty(PropertyKey.allowNanAndInf).getValue() + && (x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY || Double.isNaN(x))) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedStatement.64", new Object[] { x }), + this.session.getExceptionInterceptor()); + } + getBinding(parameterIndex, false).setBinding(x, MysqlType.DOUBLE, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setFloat(int parameterIndex, float x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.FLOAT, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setInt(int parameterIndex, int x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.INT, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setLong(int parameterIndex, long x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.BIGINT, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setNCharacterStream(int parameterIndex, Reader reader, long length) { + if (reader == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, true); + binding.setBinding(reader, MysqlType.TEXT, this.numberOfExecutions, this.sendTypesToServer); + binding.setScaleOrLength(length); + binding.setIsNational(true); + } + + @Override + public void setNClob(int parameterIndex, NClob value) { + if (value == null) { + setNull(parameterIndex); + return; + } + try { + setNCharacterStream(parameterIndex, value.getCharacterStream(), value.length()); + } catch (Throwable t) { + throw ExceptionFactory.createException(t.getMessage(), t, this.session.getExceptionInterceptor()); + } + } + + @Override + public void setNString(int parameterIndex, String x) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.VARCHAR, this.numberOfExecutions, this.sendTypesToServer); + binding.setIsNational(true); + } + + @Override + public synchronized void setNull(int parameterIndex) { + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(null, MysqlType.NULL, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public boolean isNull(int parameterIndex) { + return this.bindValues[parameterIndex].isNull(); + } + + @Override + public void setShort(int parameterIndex, short x) { + getBinding(parameterIndex, false).setBinding(x, MysqlType.SMALLINT, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setString(int parameterIndex, String x) { + if (x == null) { + setNull(parameterIndex); + return; + } + getBinding(parameterIndex, false).setBinding(x, MysqlType.VARCHAR, this.numberOfExecutions, this.sendTypesToServer); + } + + @Override + public void setTime(int parameterIndex, Time x, Calendar cal) { + if (x == null) { + setNull(parameterIndex); + return; + } + BindValue binding = getBinding(parameterIndex, false); + binding.setBinding(x, MysqlType.TIME, this.numberOfExecutions, this.sendTypesToServer); + binding.setCalendar(cal == null ? null : (Calendar) cal.clone()); + } + + @Override + public void setTimestamp(int parameterIndex, Timestamp x, Calendar targetCalendar, Field field, MysqlType targetMysqlType) { + + if (x == null) { + setNull(parameterIndex); + return; + } + + if (field == null) { + if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0 + && this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) { + field = this.columnDefinition.getFields()[parameterIndex]; + } + } + + BindValue binding = getBinding(parameterIndex, false); + if (field == null) { + binding.setField(field); + } + binding.setBinding(x, targetMysqlType, this.numberOfExecutions, this.sendTypesToServer); + binding.setCalendar(targetCalendar == null ? null : (Calendar) targetCalendar.clone()); + } + + @Override + public void setObject(int parameterIndex, Object parameterObj) { + if (parameterObj == null) { + setNull(parameterIndex); + return; + } + MysqlType defaultMysqlType = DEFAULT_MYSQL_TYPES.get(parameterObj.getClass()); + if (defaultMysqlType == null) { + Optional mysqlType = DEFAULT_MYSQL_TYPES.entrySet().stream().filter(m -> m.getKey().isAssignableFrom(parameterObj.getClass())) + .map(m -> m.getValue()).findFirst(); + if (mysqlType.isPresent()) { + defaultMysqlType = mysqlType.get(); + } + } + setObject(parameterIndex, parameterObj, defaultMysqlType, -1); + } + + /** + * Set the value of a parameter using an object; use the java.lang equivalent objects for integral values. + * + *

    + * The given Java object will be converted to the targetMysqlType before being sent to the database. + * + * @param parameterIndex + * the first parameter is 1... + * @param parameterObj + * the object containing the input parameter value + * @param targetMysqlType + * The MysqlType to be send to the database + * @param scaleOrLength + * For Types.DECIMAL or Types.NUMERIC types + * this is the number of digits after the decimal. For all other + * types this value will be ignored. + */ + public void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType, int scaleOrLength) { + if (parameterObj == null) { + setNull(parameterIndex); + return; + } + + try { + if (targetMysqlType == null || targetMysqlType == MysqlType.UNKNOWN || parameterObj instanceof java.util.Date + && !this.session.getPropertySet().getBooleanProperty(PropertyKey.treatUtilDateAsTimestamp).getValue()) { + setSerializableObject(parameterIndex, parameterObj); + return; + } + + BindValue binding = getBinding(parameterIndex, false); + if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0) { + // use the column definition if available + binding.setField(this.columnDefinition.getFields()[parameterIndex]); + } + binding.setBinding(parameterObj, targetMysqlType, this.numberOfExecutions, this.sendTypesToServer); + binding.setScaleOrLength(scaleOrLength); + + } catch (Exception ex) { + throw ExceptionFactory.createException( + Messages.getString("PreparedStatement.17") + parameterObj.getClass().toString() + Messages.getString("PreparedStatement.18") + + ex.getClass().getName() + Messages.getString("PreparedStatement.19") + ex.getMessage(), + ex, this.session.getExceptionInterceptor()); + } + } + + /** + * Sets the value for the placeholder as a serialized Java object (used by various forms of setObject() + * + * @param parameterIndex + * parameter index + * @param parameterObj + * value + */ + protected final void setSerializableObject(int parameterIndex, Object parameterObj) { + try { + ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); + ObjectOutputStream objectOut = new ObjectOutputStream(bytesOut); + objectOut.writeObject(parameterObj); + objectOut.flush(); + objectOut.close(); + bytesOut.flush(); + bytesOut.close(); + + byte[] buf = bytesOut.toByteArray(); + ByteArrayInputStream bytesIn = new ByteArrayInputStream(buf); + setBinaryStream(parameterIndex, bytesIn, buf.length); + this.bindValues[parameterIndex].setMysqlType(MysqlType.BINARY); + } catch (Exception ex) { + throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedStatement.54") + ex.getClass().getName(), ex, + this.session.getExceptionInterceptor()); + } + } + + public byte[] getBytesRepresentation(int parameterIndex) { + byte[] parameterVal = this.bindValues[parameterIndex].getByteValue(); + return parameterVal == null ? null : this.bindValues[parameterIndex].isStream() ? parameterVal : StringUtils.unquoteBytes(parameterVal); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeSession.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeSession.java new file mode 100644 index 0000000..bf2c7b4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NativeSession.java @@ -0,0 +1,834 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.lang.ref.WeakReference; +import java.net.SocketAddress; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Timer; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Supplier; + +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.CJCommunicationsException; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ConnectionIsClosedException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.ExceptionInterceptorChain; +import com.mysql.cj.exceptions.MysqlErrorNumbers; +import com.mysql.cj.exceptions.OperationCancelledException; +import com.mysql.cj.interceptors.QueryInterceptor; +import com.mysql.cj.log.Log; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.NetworkResources; +import com.mysql.cj.protocol.ProtocolEntityFactory; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.Resultset.Type; +import com.mysql.cj.protocol.SocketConnection; +import com.mysql.cj.protocol.SocketFactory; +import com.mysql.cj.protocol.a.NativeMessageBuilder; +import com.mysql.cj.protocol.a.NativePacketPayload; +import com.mysql.cj.protocol.a.NativeProtocol; +import com.mysql.cj.protocol.a.NativeServerSession; +import com.mysql.cj.protocol.a.NativeSocketConnection; +import com.mysql.cj.protocol.a.ResultsetFactory; +import com.mysql.cj.result.Field; +import com.mysql.cj.result.LongValueFactory; +import com.mysql.cj.result.Row; +import com.mysql.cj.result.StringValueFactory; +import com.mysql.cj.result.ValueFactory; +import com.mysql.cj.util.StringUtils; + +public class NativeSession extends CoreSession implements Serializable { + + private static final long serialVersionUID = 5323638898749073419L; + + private CacheAdapter> serverConfigCache; + + /** When did the last query finish? */ + private long lastQueryFinishedTime = 0; + + /** Does this connection need to be tested? */ + private boolean needsPing = false; + + private NativeMessageBuilder commandBuilder = null; + + /** Has this session been closed? */ + private boolean isClosed = true; + + /** Why was this session implicitly closed, if known? (for diagnostics) */ + private Throwable forceClosedReason; + + private CopyOnWriteArrayList> listeners = new CopyOnWriteArrayList<>(); + + private transient Timer cancelTimer; + + public NativeSession(HostInfo hostInfo, PropertySet propSet) { + super(hostInfo, propSet); + } + + public void connect(HostInfo hi, String user, String password, String database, int loginTimeout, TransactionEventHandler transactionManager) + throws IOException { + + this.hostInfo = hi; + + // reset max-rows to default value + this.setSessionMaxRows(-1); + + // TODO do we need different types of physical connections? + SocketConnection socketConnection = new NativeSocketConnection(); + socketConnection.connect(this.hostInfo.getHost(), this.hostInfo.getPort(), this.propertySet, getExceptionInterceptor(), this.log, loginTimeout); + + // we use physical connection to create a -> protocol + // this configuration places no knowledge of protocol or session on physical connection. + // physical connection is responsible *only* for I/O streams + if (this.protocol == null) { + this.protocol = NativeProtocol.getInstance(this, socketConnection, this.propertySet, this.log, transactionManager); + } else { + this.protocol.init(this, socketConnection, this.propertySet, transactionManager); + } + + // use protocol to create a -> session + // protocol is responsible for building a session and authenticating (using AuthenticationProvider) internally + this.protocol.connect(user, password, database); + + this.isClosed = false; + + this.commandBuilder = new NativeMessageBuilder(this.getServerSession().supportsQueryAttributes()); + } + + // TODO: this method should not be used in user-level APIs + public NativeProtocol getProtocol() { + return (NativeProtocol) this.protocol; + } + + @Override + public void quit() { + if (this.protocol != null) { + try { + ((NativeProtocol) this.protocol).quit(); + } catch (Exception e) { + } + + } + synchronized (this) { + if (this.cancelTimer != null) { + this.cancelTimer.cancel(); + this.cancelTimer = null; + } + } + this.isClosed = true; + super.quit(); + } + + // TODO: we should examine the call flow here, we shouldn't have to know about the socket connection but this should be address in a wider scope. + @Override + public void forceClose() { + if (this.protocol != null) { + // checking this.protocol != null isn't enough if connection is used concurrently (the usual situation + // with application servers which have additional thread management), this.protocol can become null + // at any moment after this check, causing a race condition and NPEs on next calls; + // but we may ignore them because at this stage null this.protocol means that we successfully closed all resources by other thread. + try { + this.protocol.getSocketConnection().forceClose(); + ((NativeProtocol) this.protocol).releaseResources(); + } catch (Throwable t) { + // can't do anything about it, and we're forcibly aborting + } + //this.protocol = null; // TODO actually we shouldn't remove protocol instance because some it's methods can be called after closing socket + } + synchronized (this) { + if (this.cancelTimer != null) { + this.cancelTimer.cancel(); + this.cancelTimer = null; + } + } + this.isClosed = true; + super.forceClose(); + } + + public void enableMultiQueries() { + this.protocol.sendCommand(this.commandBuilder.buildComSetOption(((NativeProtocol) this.protocol).getSharedSendPacket(), 0), false, 0); + ((NativeServerSession) getServerSession()).preserveOldTransactionState(); + } + + public void disableMultiQueries() { + this.protocol.sendCommand(this.commandBuilder.buildComSetOption(((NativeProtocol) this.protocol).getSharedSendPacket(), 1), false, 0); + ((NativeServerSession) getServerSession()).preserveOldTransactionState(); + } + + @Override + public boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag) { + // Server Bug#66884 (SERVER_STATUS is always initiated with SERVER_STATUS_AUTOCOMMIT=1) invalidates "elideSetAutoCommits" feature. + // TODO Turn this feature back on as soon as the server bug is fixed. Consider making it version specific. + //return this.protocol.getServerSession().isSetNeededForAutoCommitMode(autoCommitFlag, + // getPropertySet().getBooleanReadableProperty(PropertyKey.elideSetAutoCommits).getValue()); + return ((NativeServerSession) this.protocol.getServerSession()).isSetNeededForAutoCommitMode(autoCommitFlag, false); + } + + public int getSessionMaxRows() { + return this.sessionMaxRows; + } + + public void setSessionMaxRows(int sessionMaxRows) { + this.sessionMaxRows = sessionMaxRows; + } + + public void setQueryInterceptors(List queryInterceptors) { + ((NativeProtocol) this.protocol).setQueryInterceptors(queryInterceptors); + } + + public boolean isServerLocal(Session sess) { + SocketFactory factory = this.protocol.getSocketConnection().getSocketFactory(); + return factory.isLocallyConnected(sess); + } + + /** + * Used by MiniAdmin to shutdown a MySQL server + * + */ + public void shutdownServer() { + if (versionMeetsMinimum(5, 7, 9)) { + this.protocol.sendCommand(this.commandBuilder.buildComQuery(getSharedSendPacket(), "SHUTDOWN"), false, 0); + } else { + this.protocol.sendCommand(this.commandBuilder.buildComShutdown(getSharedSendPacket()), false, 0); + } + } + + public void setSocketTimeout(int milliseconds) { + getPropertySet().getProperty(PropertyKey.socketTimeout).setValue(milliseconds); // for re-connects + ((NativeProtocol) this.protocol).setSocketTimeout(milliseconds); + } + + public int getSocketTimeout() { + RuntimeProperty sto = getPropertySet().getProperty(PropertyKey.socketTimeout); + return sto.getValue(); + } + + /** + * Returns the packet used for sending data (used by PreparedStatement) with position set to 0. + * Guarded by external synchronization on a mutex. + * + * @return A packet to send data with + */ + public NativePacketPayload getSharedSendPacket() { + return ((NativeProtocol) this.protocol).getSharedSendPacket(); + } + + public void dumpPacketRingBuffer() { + ((NativeProtocol) this.protocol).dumpPacketRingBuffer(); + } + + public T invokeQueryInterceptorsPre(Supplier sql, Query interceptedQuery, boolean forceExecute) { + return ((NativeProtocol) this.protocol).invokeQueryInterceptorsPre(sql, interceptedQuery, forceExecute); + } + + public T invokeQueryInterceptorsPost(Supplier sql, Query interceptedQuery, T originalResultSet, boolean forceExecute) { + return ((NativeProtocol) this.protocol).invokeQueryInterceptorsPost(sql, interceptedQuery, originalResultSet, forceExecute); + } + + public boolean shouldIntercept() { + return ((NativeProtocol) this.protocol).getQueryInterceptors() != null; + } + + public long getCurrentTimeNanosOrMillis() { + return ((NativeProtocol) this.protocol).getCurrentTimeNanosOrMillis(); + } + + public long getSlowQueryThreshold() { + return ((NativeProtocol) this.protocol).getSlowQueryThreshold(); + } + + public boolean hadWarnings() { + return ((NativeProtocol) this.protocol).hadWarnings(); + } + + public void clearInputStream() { + ((NativeProtocol) this.protocol).clearInputStream(); + } + + public NetworkResources getNetworkResources() { + return this.protocol.getSocketConnection().getNetworkResources(); + } + + @Override + public boolean isSSLEstablished() { + return this.protocol.getSocketConnection().isSSLEstablished(); + } + + public int getCommandCount() { + return ((NativeProtocol) this.protocol).getCommandCount(); + } + + @Override + public SocketAddress getRemoteSocketAddress() { + try { + return this.protocol.getSocketConnection().getMysqlSocket().getRemoteSocketAddress(); + } catch (IOException e) { + throw new CJCommunicationsException(e); + } + } + + public InputStream getLocalInfileInputStream() { + return this.protocol.getLocalInfileInputStream(); + } + + public void setLocalInfileInputStream(InputStream stream) { + this.protocol.setLocalInfileInputStream(stream); + } + + private void createConfigCacheIfNeeded(Object syncMutex) { + synchronized (syncMutex) { + if (this.serverConfigCache != null) { + return; + } + + try { + Class factoryClass = Class.forName(getPropertySet().getStringProperty(PropertyKey.serverConfigCacheFactory).getStringValue()); + + @SuppressWarnings("unchecked") + CacheAdapterFactory> cacheFactory = ((CacheAdapterFactory>) factoryClass.newInstance()); + + this.serverConfigCache = cacheFactory.getInstance(syncMutex, this.hostInfo.getDatabaseUrl(), Integer.MAX_VALUE, Integer.MAX_VALUE); + + ExceptionInterceptor evictOnCommsError = new ExceptionInterceptor() { + + public ExceptionInterceptor init(Properties config, Log log1) { + return this; + } + + public void destroy() { + } + + @SuppressWarnings("synthetic-access") + public Exception interceptException(Exception sqlEx) { + if (sqlEx instanceof SQLException && ((SQLException) sqlEx).getSQLState() != null + && ((SQLException) sqlEx).getSQLState().startsWith("08")) { + NativeSession.this.serverConfigCache.invalidate(NativeSession.this.hostInfo.getDatabaseUrl()); + } + return null; + } + }; + + if (this.exceptionInterceptor == null) { + this.exceptionInterceptor = evictOnCommsError; + } else { + ((ExceptionInterceptorChain) this.exceptionInterceptor).addRingZero(evictOnCommsError); + } + } catch (ClassNotFoundException e) { + throw ExceptionFactory.createException(Messages.getString("Connection.CantFindCacheFactory", + new Object[] { getPropertySet().getStringProperty(PropertyKey.queryInfoCacheFactory).getValue(), PropertyKey.queryInfoCacheFactory }), + e, getExceptionInterceptor()); + } catch (InstantiationException | IllegalAccessException | CJException e) { + throw ExceptionFactory.createException(Messages.getString("Connection.CantLoadCacheFactory", + new Object[] { getPropertySet().getStringProperty(PropertyKey.queryInfoCacheFactory).getValue(), PropertyKey.queryInfoCacheFactory }), + e, getExceptionInterceptor()); + } + } + } + + // TODO what's the purpose of this variable? + private final static String SERVER_VERSION_STRING_VAR_NAME = "server_version_string"; + + /** + * Loads the result of 'SHOW VARIABLES' into the serverVariables field so + * that the driver can configure itself. + * + * @param syncMutex + * synchronization mutex + * @param version + * driver version string + */ + public void loadServerVariables(Object syncMutex, String version) { + + if (this.cacheServerConfiguration.getValue()) { + createConfigCacheIfNeeded(syncMutex); + + Map cachedVariableMap = this.serverConfigCache.get(this.hostInfo.getDatabaseUrl()); + + if (cachedVariableMap != null) { + String cachedServerVersion = cachedVariableMap.get(SERVER_VERSION_STRING_VAR_NAME); + + if (cachedServerVersion != null && getServerSession().getServerVersion() != null + && cachedServerVersion.equals(getServerSession().getServerVersion().toString())) { + Map localVariableMap = this.protocol.getServerSession().getServerVariables(); + Map newLocalVariableMap = new HashMap<>(); + newLocalVariableMap.putAll(cachedVariableMap); + newLocalVariableMap.putAll(localVariableMap); // preserving variables already configured on previous session initialization steps + this.protocol.getServerSession().setServerVariables(newLocalVariableMap); + return; + } + + this.serverConfigCache.invalidate(this.hostInfo.getDatabaseUrl()); + } + } + + try { + if (version != null && version.indexOf('*') != -1) { + StringBuilder buf = new StringBuilder(version.length() + 10); + for (int i = 0; i < version.length(); i++) { + char c = version.charAt(i); + buf.append(c == '*' ? "[star]" : c); + } + version = buf.toString(); + } + + String versionComment = (this.propertySet.getBooleanProperty(PropertyKey.paranoid).getValue() || version == null) ? "" : "/* " + version + " */"; + + this.protocol.getServerSession().setServerVariables(new HashMap()); + + if (versionMeetsMinimum(5, 1, 0)) { + StringBuilder queryBuf = new StringBuilder(versionComment).append("SELECT"); + queryBuf.append(" @@session.auto_increment_increment AS auto_increment_increment"); + queryBuf.append(", @@character_set_client AS character_set_client"); + queryBuf.append(", @@character_set_connection AS character_set_connection"); + queryBuf.append(", @@character_set_results AS character_set_results"); + queryBuf.append(", @@character_set_server AS character_set_server"); + queryBuf.append(", @@collation_server AS collation_server"); + queryBuf.append(", @@collation_connection AS collation_connection"); + queryBuf.append(", @@init_connect AS init_connect"); + queryBuf.append(", @@interactive_timeout AS interactive_timeout"); + if (!versionMeetsMinimum(5, 5, 0)) { + queryBuf.append(", @@language AS language"); + } + queryBuf.append(", @@license AS license"); + queryBuf.append(", @@lower_case_table_names AS lower_case_table_names"); + queryBuf.append(", @@max_allowed_packet AS max_allowed_packet"); + queryBuf.append(", @@net_write_timeout AS net_write_timeout"); + queryBuf.append(", @@performance_schema AS performance_schema"); + if (!versionMeetsMinimum(8, 0, 3)) { + queryBuf.append(", @@query_cache_size AS query_cache_size"); + queryBuf.append(", @@query_cache_type AS query_cache_type"); + } + queryBuf.append(", @@sql_mode AS sql_mode"); + queryBuf.append(", @@system_time_zone AS system_time_zone"); + queryBuf.append(", @@time_zone AS time_zone"); + if (versionMeetsMinimum(8, 0, 3) || (versionMeetsMinimum(5, 7, 20) && !versionMeetsMinimum(8, 0, 0))) { + queryBuf.append(", @@transaction_isolation AS transaction_isolation"); + } else { + queryBuf.append(", @@tx_isolation AS transaction_isolation"); + } + queryBuf.append(", @@wait_timeout AS wait_timeout"); + + NativePacketPayload resultPacket = (NativePacketPayload) this.protocol.sendCommand(this.commandBuilder.buildComQuery(null, queryBuf.toString()), + false, 0); + Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, false, null, + new ResultsetFactory(Type.FORWARD_ONLY, null)); + Field[] f = rs.getColumnDefinition().getFields(); + if (f.length > 0) { + ValueFactory vf = new StringValueFactory(this.propertySet); + Row r; + if ((r = rs.getRows().next()) != null) { + for (int i = 0; i < f.length; i++) { + String value = r.getValue(i, vf); + this.protocol.getServerSession().getServerVariables().put(f[i].getColumnLabel(), value); + } + } + } + + } else { + NativePacketPayload resultPacket = (NativePacketPayload) this.protocol + .sendCommand(this.commandBuilder.buildComQuery(null, versionComment + "SHOW VARIABLES"), false, 0); + Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, false, null, + new ResultsetFactory(Type.FORWARD_ONLY, null)); + ValueFactory vf = new StringValueFactory(this.propertySet); + Row r; + while ((r = rs.getRows().next()) != null) { + this.protocol.getServerSession().getServerVariables().put(r.getValue(0, vf), r.getValue(1, vf)); + } + } + } catch (IOException e) { + throw ExceptionFactory.createException(e.getMessage(), e); + } + + if (this.cacheServerConfiguration.getValue()) { + this.protocol.getServerSession().getServerVariables().put(SERVER_VERSION_STRING_VAR_NAME, getServerSession().getServerVersion().toString()); + Map localVariableMap = new HashMap<>(); + localVariableMap.putAll(this.protocol.getServerSession().getServerVariables()); + this.serverConfigCache.put(this.hostInfo.getDatabaseUrl(), Collections.unmodifiableMap(localVariableMap)); + } + } + + public void setSessionVariables() { + String sessionVariables = getPropertySet().getStringProperty(PropertyKey.sessionVariables).getValue(); + if (sessionVariables != null) { + List variablesToSet = new ArrayList<>(); + for (String part : StringUtils.split(sessionVariables, ",", "\"'(", "\"')", "\"'", true)) { + variablesToSet.addAll(StringUtils.split(part, ";", "\"'(", "\"')", "\"'", true)); + } + + if (!variablesToSet.isEmpty()) { + StringBuilder query = new StringBuilder("SET "); + String separator = ""; + for (String variableToSet : variablesToSet) { + if (variableToSet.length() > 0) { + query.append(separator); + if (!variableToSet.startsWith("@")) { + query.append("SESSION "); + } + query.append(variableToSet); + separator = ","; + } + } + this.protocol.sendCommand(this.commandBuilder.buildComQuery(null, query.toString()), false, 0); + } + } + } + + public String getProcessHost() { + try { + long threadId = getThreadId(); + String processHost = findProcessHost(threadId); + + if (processHost == null) { + // http://bugs.mysql.com/bug.php?id=44167 - connection ids on the wire wrap at 4 bytes even though they're 64-bit numbers + this.log.logWarn(String.format( + "Connection id %d not found in \"SHOW PROCESSLIST\", assuming 32-bit overflow, using SELECT CONNECTION_ID() instead", threadId)); + + NativePacketPayload resultPacket = (NativePacketPayload) this.protocol + .sendCommand(this.commandBuilder.buildComQuery(null, "SELECT CONNECTION_ID()"), false, 0); + Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, false, null, + new ResultsetFactory(Type.FORWARD_ONLY, null)); + + ValueFactory lvf = new LongValueFactory(getPropertySet()); + Row r; + if ((r = rs.getRows().next()) != null) { + threadId = r.getValue(0, lvf); + processHost = findProcessHost(threadId); + } else { + this.log.logError("No rows returned for statement \"SELECT CONNECTION_ID()\", local connection check will most likely be incorrect"); + } + } + + if (processHost == null) { + this.log.logWarn(String.format( + "Cannot find process listing for connection %d in SHOW PROCESSLIST output, unable to determine if locally connected", threadId)); + } + return processHost; + } catch (IOException e) { + throw ExceptionFactory.createException(e.getMessage(), e); + } + } + + private String findProcessHost(long threadId) { + try { + String processHost = null; + + String ps = this.protocol.getServerSession().getServerVariable("performance_schema"); + + NativePacketPayload resultPacket = versionMeetsMinimum(5, 6, 0) // performance_schema.threads in MySQL 5.5 does not contain PROCESSLIST_HOST column + && ps != null && ("1".contentEquals(ps) || "ON".contentEquals(ps)) + ? (NativePacketPayload) this.protocol.sendCommand(this.commandBuilder.buildComQuery(null, + "select PROCESSLIST_ID, PROCESSLIST_USER, PROCESSLIST_HOST from performance_schema.threads where PROCESSLIST_ID=" + + threadId), + false, 0) + : (NativePacketPayload) this.protocol.sendCommand(this.commandBuilder.buildComQuery(null, "SHOW PROCESSLIST"), false, 0); + + Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, false, null, new ResultsetFactory(Type.FORWARD_ONLY, null)); + + ValueFactory lvf = new LongValueFactory(getPropertySet()); + ValueFactory svf = new StringValueFactory(this.propertySet); + Row r; + while ((r = rs.getRows().next()) != null) { + long id = r.getValue(0, lvf); + if (threadId == id) { + processHost = r.getValue(2, svf); + break; + } + } + + return processHost; + + } catch (IOException e) { + throw ExceptionFactory.createException(e.getMessage(), e); + } + } + + /** + * Get the variable value from server. + * + * @param varName + * server variable name + * @return server variable value + */ + public String queryServerVariable(String varName) { + try { + + NativePacketPayload resultPacket = (NativePacketPayload) this.protocol.sendCommand(this.commandBuilder.buildComQuery(null, "SELECT " + varName), + false, 0); + Resultset rs = ((NativeProtocol) this.protocol).readAllResults(-1, false, resultPacket, false, null, new ResultsetFactory(Type.FORWARD_ONLY, null)); + + ValueFactory svf = new StringValueFactory(this.propertySet); + Row r; + if ((r = rs.getRows().next()) != null) { + String s = r.getValue(0, svf); + if (s != null) { + return s; + } + } + + return null; + + } catch (IOException e) { + throw ExceptionFactory.createException(e.getMessage(), e); + } + } + + /** + * Send a query to the server. Returns one of the ResultSet objects. + * To ensure that Statement's queries are serialized, calls to this method + * should be enclosed in a connection mutex synchronized block. + * + * @param + * extends {@link Resultset} + * @param callingQuery + * {@link Query} object + * @param query + * the SQL statement to be executed + * @param maxRows + * rows limit + * @param packet + * {@link NativePacketPayload} + * @param streamResults + * whether a stream result should be created + * @param resultSetFactory + * {@link ProtocolEntityFactory} + * @param cachedMetadata + * use this metadata instead of the one provided on wire + * @param isBatch + * is it a batch query + * + * @return a ResultSet holding the results + */ + public T execSQL(Query callingQuery, String query, int maxRows, NativePacketPayload packet, boolean streamResults, + ProtocolEntityFactory resultSetFactory, ColumnDefinition cachedMetadata, boolean isBatch) { + + long queryStartTime = this.gatherPerfMetrics.getValue() ? System.currentTimeMillis() : 0; + int endOfQueryPacketPosition = packet != null ? packet.getPosition() : 0; + + this.lastQueryFinishedTime = 0; // we're busy! + + if (this.autoReconnect.getValue() && (getServerSession().isAutoCommit() || this.autoReconnectForPools.getValue()) && this.needsPing && !isBatch) { + try { + ping(false, 0); + this.needsPing = false; + + } catch (Exception Ex) { + invokeReconnectListeners(); + } + } + + try { + return packet == null + ? ((NativeProtocol) this.protocol).sendQueryString(callingQuery, query, this.characterEncoding.getValue(), maxRows, streamResults, + cachedMetadata, resultSetFactory) + : ((NativeProtocol) this.protocol).sendQueryPacket(callingQuery, packet, maxRows, streamResults, cachedMetadata, resultSetFactory); + + } catch (CJException sqlE) { + if (getPropertySet().getBooleanProperty(PropertyKey.dumpQueriesOnException).getValue()) { + String extractedSql = NativePacketPayload.extractSqlFromPacket(query, packet, endOfQueryPacketPosition, + getPropertySet().getIntegerProperty(PropertyKey.maxQuerySizeToLog).getValue()); + StringBuilder messageBuf = new StringBuilder(extractedSql.length() + 32); + messageBuf.append("\n\nQuery being executed when exception was thrown:\n"); + messageBuf.append(extractedSql); + messageBuf.append("\n\n"); + sqlE.appendMessage(messageBuf.toString()); + } + + if ((this.autoReconnect.getValue())) { + if (sqlE instanceof CJCommunicationsException) { + // IO may be dirty or damaged beyond repair, force close it. + this.protocol.getSocketConnection().forceClose(); + } + this.needsPing = true; + } else if (sqlE instanceof CJCommunicationsException) { + invokeCleanupListeners(sqlE); + } + throw sqlE; + + } catch (Throwable ex) { + if (this.autoReconnect.getValue()) { + if (ex instanceof IOException) { + // IO may be dirty or damaged beyond repair, force close it. + this.protocol.getSocketConnection().forceClose(); + } else if (ex instanceof IOException) { + invokeCleanupListeners(ex); + } + this.needsPing = true; + } + throw ExceptionFactory.createException(ex.getMessage(), ex, this.exceptionInterceptor); + + } finally { + if (this.maintainTimeStats.getValue()) { + this.lastQueryFinishedTime = System.currentTimeMillis(); + } + + if (this.gatherPerfMetrics.getValue()) { + ((NativeProtocol) this.protocol).getMetricsHolder().registerQueryExecutionTime(System.currentTimeMillis() - queryStartTime); + } + } + + } + + public long getIdleFor() { + return this.lastQueryFinishedTime == 0 ? 0 : System.currentTimeMillis() - this.lastQueryFinishedTime; + } + + public boolean isNeedsPing() { + return this.needsPing; + } + + public void setNeedsPing(boolean needsPing) { + this.needsPing = needsPing; + } + + public void ping(boolean checkForClosedConnection, int timeoutMillis) { + if (checkForClosedConnection) { + checkClosed(); + } + + long pingMillisLifetime = getPropertySet().getIntegerProperty(PropertyKey.selfDestructOnPingSecondsLifetime).getValue(); + int pingMaxOperations = getPropertySet().getIntegerProperty(PropertyKey.selfDestructOnPingMaxOperations).getValue(); + + if ((pingMillisLifetime > 0 && (System.currentTimeMillis() - this.connectionCreationTimeMillis) > pingMillisLifetime) + || (pingMaxOperations > 0 && pingMaxOperations <= getCommandCount())) { + + invokeNormalCloseListeners(); + + throw ExceptionFactory.createException(Messages.getString("Connection.exceededConnectionLifetime"), + MysqlErrorNumbers.SQL_STATE_COMMUNICATION_LINK_FAILURE, 0, false, null, this.exceptionInterceptor); + } + this.protocol.sendCommand(this.commandBuilder.buildComPing(null), false, timeoutMillis); // it isn't safe to use a shared packet here + } + + public long getConnectionCreationTimeMillis() { + return this.connectionCreationTimeMillis; + } + + public void setConnectionCreationTimeMillis(long connectionCreationTimeMillis) { + this.connectionCreationTimeMillis = connectionCreationTimeMillis; + } + + public boolean isClosed() { + return this.isClosed; + } + + public void checkClosed() { + if (this.isClosed) { + if (this.forceClosedReason != null && this.forceClosedReason.getClass().equals(OperationCancelledException.class)) { + throw (OperationCancelledException) this.forceClosedReason; + } + throw ExceptionFactory.createException(ConnectionIsClosedException.class, Messages.getString("Connection.2"), this.forceClosedReason, + getExceptionInterceptor()); + } + } + + public Throwable getForceClosedReason() { + return this.forceClosedReason; + } + + public void setForceClosedReason(Throwable forceClosedReason) { + this.forceClosedReason = forceClosedReason; + } + + @Override + public void addListener(SessionEventListener l) { + this.listeners.addIfAbsent(new WeakReference<>(l)); + } + + @Override + public void removeListener(SessionEventListener listener) { + for (WeakReference wr : this.listeners) { + SessionEventListener l = wr.get(); + if (l == listener) { + this.listeners.remove(wr); + break; + } + } + } + + protected void invokeNormalCloseListeners() { + for (WeakReference wr : this.listeners) { + SessionEventListener l = wr.get(); + if (l != null) { + l.handleNormalClose(); + } else { + this.listeners.remove(wr); + } + } + } + + protected void invokeReconnectListeners() { + for (WeakReference wr : this.listeners) { + SessionEventListener l = wr.get(); + if (l != null) { + l.handleReconnect(); + } else { + this.listeners.remove(wr); + } + } + } + + public void invokeCleanupListeners(Throwable whyCleanedUp) { + for (WeakReference wr : this.listeners) { + SessionEventListener l = wr.get(); + if (l != null) { + l.handleCleanup(whyCleanedUp); + } else { + this.listeners.remove(wr); + } + } + } + + @Override + public String getIdentifierQuoteString() { + return this.protocol != null && this.protocol.getServerSession().useAnsiQuotedIdentifiers() ? "\"" : "`"; + } + + public synchronized Timer getCancelTimer() { + if (this.cancelTimer == null) { + this.cancelTimer = new Timer("MySQL Statement Cancellation Timer", Boolean.TRUE); + } + return this.cancelTimer; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NoSubInterceptorWrapper.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NoSubInterceptorWrapper.java new file mode 100644 index 0000000..b2f3d11 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/NoSubInterceptorWrapper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2009, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.util.Properties; +import java.util.function.Supplier; + +import com.mysql.cj.interceptors.QueryInterceptor; +import com.mysql.cj.log.Log; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.ServerSession; + +/** + * Wraps query interceptors during driver startup so that they don't produce different result sets than we expect. + */ +public class NoSubInterceptorWrapper implements QueryInterceptor { + + private final QueryInterceptor underlyingInterceptor; + + public NoSubInterceptorWrapper(QueryInterceptor underlyingInterceptor) { + if (underlyingInterceptor == null) { + throw new RuntimeException(Messages.getString("NoSubInterceptorWrapper.0")); + } + + this.underlyingInterceptor = underlyingInterceptor; + } + + public void destroy() { + this.underlyingInterceptor.destroy(); + } + + public boolean executeTopLevelOnly() { + return this.underlyingInterceptor.executeTopLevelOnly(); + } + + public QueryInterceptor init(MysqlConnection conn, Properties props, Log log) { + this.underlyingInterceptor.init(conn, props, log); + return this; + } + + public T postProcess(Supplier sql, Query interceptedQuery, T originalResultSet, ServerSession serverSession) { + this.underlyingInterceptor.postProcess(sql, interceptedQuery, originalResultSet, serverSession); + + return null; // don't allow result set substitution + } + + public T preProcess(Supplier sql, Query interceptedQuery) { + this.underlyingInterceptor.preProcess(sql, interceptedQuery); + + return null; // don't allow result set substitution + } + + @Override + public M preProcess(M queryPacket) { + this.underlyingInterceptor.preProcess(queryPacket); + + return null; // don't allow PacketPayload substitution + } + + @Override + public M postProcess(M queryPacket, M originalResponsePacket) { + this.underlyingInterceptor.postProcess(queryPacket, originalResponsePacket); + + return null; // don't allow PacketPayload substitution + } + + public QueryInterceptor getUnderlyingInterceptor() { + return this.underlyingInterceptor; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQuery.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQuery.java new file mode 100644 index 0000000..8f711c4 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQuery.java @@ -0,0 +1,642 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.sql.Clob; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.MysqlErrorNumbers; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.log.ProfilerEvent; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.Message; +import com.mysql.cj.protocol.ProtocolEntityFactory; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.Resultset.Type; +import com.mysql.cj.protocol.a.ColumnDefinitionFactory; +import com.mysql.cj.protocol.a.NativeConstants.IntegerDataType; +import com.mysql.cj.protocol.a.NativeConstants.StringLengthDataType; +import com.mysql.cj.protocol.a.NativeConstants.StringSelfDataType; +import com.mysql.cj.protocol.a.NativeMessageBuilder; +import com.mysql.cj.protocol.a.NativePacketPayload; +import com.mysql.cj.result.Field; +import com.mysql.cj.util.StringUtils; + +// TODO should not be protocol-specific + +public class ServerPreparedQuery extends ClientPreparedQuery { + + public static final int BLOB_STREAM_READ_BUF_SIZE = 8192; + public static final byte OPEN_CURSOR_FLAG = 0x01; + public static final byte PARAMETER_COUNT_AVAILABLE = 0x08; + + /** The ID that the server uses to identify this PreparedStatement */ + private long serverStatementId; + + /** Field-level metadata for parameters */ + private Field[] parameterFields; + + /** Field-level metadata for result sets. From statement prepare. */ + private ColumnDefinition resultFields; + + /** The "profileSQL" connection property value */ + protected boolean profileSQL = false; + + /** The "gatherPerfMetrics" connection property value */ + protected boolean gatherPerfMetrics; + + /** The "logSlowQueries" connection property value */ + protected boolean logSlowQueries = false; + + private boolean useAutoSlowLog; + + protected RuntimeProperty slowQueryThresholdMillis; + + protected RuntimeProperty explainSlowQueries; + protected boolean useCursorFetch = false; + + protected boolean queryWasSlow = false; + + protected NativeMessageBuilder commandBuilder = null; + + public static ServerPreparedQuery getInstance(NativeSession sess) { + if (sess.getPropertySet().getBooleanProperty(PropertyKey.autoGenerateTestcaseScript).getValue()) { + return new ServerPreparedQueryTestcaseGenerator(sess); + } + return new ServerPreparedQuery(sess); + } + + protected ServerPreparedQuery(NativeSession sess) { + super(sess); + this.profileSQL = sess.getPropertySet().getBooleanProperty(PropertyKey.profileSQL).getValue(); + this.gatherPerfMetrics = sess.getPropertySet().getBooleanProperty(PropertyKey.gatherPerfMetrics).getValue(); + this.logSlowQueries = sess.getPropertySet().getBooleanProperty(PropertyKey.logSlowQueries).getValue(); + this.useAutoSlowLog = sess.getPropertySet().getBooleanProperty(PropertyKey.autoSlowLog).getValue(); + this.slowQueryThresholdMillis = sess.getPropertySet().getIntegerProperty(PropertyKey.slowQueryThresholdMillis); + this.explainSlowQueries = sess.getPropertySet().getBooleanProperty(PropertyKey.explainSlowQueries); + this.useCursorFetch = sess.getPropertySet().getBooleanProperty(PropertyKey.useCursorFetch).getValue(); + this.commandBuilder = (NativeMessageBuilder) sess.getProtocol().getMessageBuilder(); + } + + /** + * + * @param sql + * query string + * @throws IOException + * if an i/o error occurs + */ + public void serverPrepare(String sql) throws IOException { + this.session.checkClosed(); + + synchronized (this.session) { + long begin = this.profileSQL ? System.currentTimeMillis() : 0; + + NativePacketPayload prepareResultPacket = this.session.getProtocol() + .sendCommand(this.commandBuilder.buildComStmtPrepare(this.session.getSharedSendPacket(), sql, + this.session.getPropertySet().getStringProperty(PropertyKey.characterEncoding).getValue()), false, 0); + + // 4.1.1 and newer use the first byte as an 'ok' or 'error' flag, so move the buffer pointer past it to start reading the statement id. + prepareResultPacket.setPosition(1); + + this.serverStatementId = prepareResultPacket.readInteger(IntegerDataType.INT4); + int fieldCount = (int) prepareResultPacket.readInteger(IntegerDataType.INT2); + setParameterCount((int) prepareResultPacket.readInteger(IntegerDataType.INT2)); + + this.queryBindings = new NativeQueryBindings(this.parameterCount, this.session, NativeQueryBindValue::new); + + if (this.gatherPerfMetrics) { + this.session.getProtocol().getMetricsHolder().incrementNumberOfPrepares(); + } + + if (this.profileSQL) { + this.session.getProfilerEventHandler().processEvent(ProfilerEvent.TYPE_PREPARE, this.session, this, null, + this.session.getCurrentTimeNanosOrMillis() - begin, new Throwable(), truncateQueryToLog(sql)); + } + + boolean checkEOF = !this.session.getServerSession().isEOFDeprecated(); + + if (this.parameterCount > 0) { + if (checkEOF) { // Skip the following EOF packet. + this.session.getProtocol().skipPacket(); + } + + this.parameterFields = this.session.getProtocol().read(ColumnDefinition.class, new ColumnDefinitionFactory(this.parameterCount, null)) + .getFields(); + } + + // Read in the result set column information + if (fieldCount > 0) { + this.resultFields = this.session.getProtocol().read(ColumnDefinition.class, new ColumnDefinitionFactory(fieldCount, null)); + } + } + } + + @Override + public void statementBegins() { + super.statementBegins(); + this.queryWasSlow = false; + } + + /** + * @param + * extends {@link Resultset} + * @param maxRowsToRetrieve + * rows limit + * @param createStreamingResultSet + * should c/J create a streaming result? + * @param metadata + * use this metadata instead of the one provided on wire + * @param resultSetFactory + * {@link ProtocolEntityFactory} + * @return T instance + */ + public T serverExecute(int maxRowsToRetrieve, boolean createStreamingResultSet, ColumnDefinition metadata, + ProtocolEntityFactory resultSetFactory) { + if (this.session.shouldIntercept()) { + T interceptedResults = this.session.invokeQueryInterceptorsPre(() -> { + return getOriginalSql(); + }, this, true); + + if (interceptedResults != null) { + return interceptedResults; + } + } + String queryAsString = this.profileSQL || this.logSlowQueries || this.gatherPerfMetrics ? asSql() : ""; + return readExecuteResult(sendExecutePacket(prepareExecutePacket(), queryAsString), maxRowsToRetrieve, createStreamingResultSet, metadata, + resultSetFactory, queryAsString); + } + + public NativePacketPayload prepareExecutePacket() { + BindValue[] bindValues = this.queryBindings.getBindValues(); + + if (this.queryBindings.isLongParameterSwitchDetected()) { + // Check when values were bound + boolean firstFound = false; + long boundTimeToCheck = 0; + + for (int i = 0; i < this.parameterCount - 1; i++) { + if (bindValues[i].isStream()) { + if (firstFound && boundTimeToCheck != bindValues[i].getBoundBeforeExecutionNum()) { + throw ExceptionFactory.createException( + Messages.getString("ServerPreparedStatement.11") + Messages.getString("ServerPreparedStatement.12"), + MysqlErrorNumbers.SQL_STATE_DRIVER_NOT_CAPABLE, 0, true, null, this.session.getExceptionInterceptor()); + } + firstFound = true; + boundTimeToCheck = bindValues[i].getBoundBeforeExecutionNum(); + } + } + + // Okay, we've got all "newly"-bound streams, so reset server-side state to clear out previous bindings + serverResetStatement(); + } + + this.queryBindings.checkAllParametersSet(); + + // + // Send all long data + // + for (int i = 0; i < this.parameterCount; i++) { + if (bindValues[i].isStream()) { + serverLongData(i, bindValues[i]); + } + } + + // + // store the parameter values + // + boolean sendQueryAttributes = false; + if (this.session.getServerSession().supportsQueryAttributes()) { + // Servers between 8.0.23 8.0.25 are affected by Bug#103102, Bug#103268 and Bug#103377. Query attributes cannot be sent to these servers. + sendQueryAttributes = this.session.getServerSession().getServerVersion().meetsMinimum(new ServerVersion(8, 0, 26)); + } else if (this.queryAttributesBindings.getCount() > 0) { + this.session.getLog().logWarn(Messages.getString("QueryAttributes.SetButNotSupported")); + } + + byte flags = 0; + if (this.resultFields != null && this.resultFields.getFields() != null && this.useCursorFetch && this.resultSetType == Type.FORWARD_ONLY + && this.fetchSize > 0) { + // we only create cursor-backed result sets if + // a) The query is a SELECT + // b) The server supports it + // c) We know it is forward-only (note this doesn't preclude updatable result sets) + // d) The user has set a fetch size + flags |= OPEN_CURSOR_FLAG; + } + if (sendQueryAttributes) { + flags |= PARAMETER_COUNT_AVAILABLE; + } + + return this.commandBuilder.buildComStmtExecute(this.session.getSharedSendPacket(), this.serverStatementId, flags, sendQueryAttributes, this); + } + + public NativePacketPayload sendExecutePacket(NativePacketPayload packet, String queryAsString) { // TODO queryAsString should be shared instead of passed + final long begin = this.session.getCurrentTimeNanosOrMillis(); + resetCancelledState(); + CancelQueryTask timeoutTask = null; + try { + // Get this before executing to avoid a shared packet pollution in the case some other query is issued internally, such as when using I_S. + timeoutTask = startQueryTimer(this, this.timeoutInMillis); + + statementBegins(); + + NativePacketPayload resultPacket = this.session.getProtocol().sendCommand(packet, false, 0); + + final long queryEndTime = this.session.getCurrentTimeNanosOrMillis(); + + if (timeoutTask != null) { + stopQueryTimer(timeoutTask, true, true); + timeoutTask = null; + } + + final long executeTime = queryEndTime - begin; + setExecuteTime(executeTime); + + if (this.logSlowQueries) { + this.queryWasSlow = this.useAutoSlowLog ? // + this.session.getProtocol().getMetricsHolder().checkAbonormallyLongQuery(executeTime) + : executeTime > this.slowQueryThresholdMillis.getValue(); + + if (this.queryWasSlow) { + this.session.getProfilerEventHandler().processEvent(ProfilerEvent.TYPE_SLOW_QUERY, this.session, this, null, executeTime, new Throwable(), + Messages.getString("ServerPreparedStatement.15", new String[] { String.valueOf(this.session.getSlowQueryThreshold()), + String.valueOf(executeTime), this.originalSql, queryAsString })); + } + } + + if (this.gatherPerfMetrics) { + this.session.getProtocol().getMetricsHolder().registerQueryExecutionTime(executeTime); + this.session.getProtocol().getMetricsHolder().incrementNumberOfPreparedExecutes(); + } + + if (this.profileSQL) { + this.session.getProfilerEventHandler().processEvent(ProfilerEvent.TYPE_EXECUTE, this.session, this, null, executeTime, new Throwable(), + truncateQueryToLog(queryAsString)); + } + + return resultPacket; + + } catch (CJException sqlEx) { + if (this.session.shouldIntercept()) { + this.session.invokeQueryInterceptorsPost(() -> { + return getOriginalSql(); + }, this, null, true); + } + + throw sqlEx; + } finally { + this.statementExecuting.set(false); + stopQueryTimer(timeoutTask, false, false); + } + } + + public T readExecuteResult(NativePacketPayload resultPacket, int maxRowsToRetrieve, boolean createStreamingResultSet, + ColumnDefinition metadata, ProtocolEntityFactory resultSetFactory, String queryAsString) { // TODO queryAsString should be shared instead of passed + try { + long fetchStartTime = this.profileSQL ? this.session.getCurrentTimeNanosOrMillis() : 0; + + T rs = this.session.getProtocol().readAllResults(maxRowsToRetrieve, createStreamingResultSet, resultPacket, true, + metadata != null ? metadata : this.resultFields, resultSetFactory); + + if (this.session.shouldIntercept()) { + T interceptedResults = this.session.invokeQueryInterceptorsPost(() -> { + return getOriginalSql(); + }, this, rs, true); + + if (interceptedResults != null) { + rs = interceptedResults; + } + } + + if (this.profileSQL) { + this.session.getProfilerEventHandler().processEvent(ProfilerEvent.TYPE_FETCH, this.session, this, rs, + this.session.getCurrentTimeNanosOrMillis() - fetchStartTime, new Throwable(), null); + } + + if (this.queryWasSlow && this.explainSlowQueries.getValue()) { + this.session.getProtocol().explainSlowQuery(queryAsString, queryAsString); + } + + this.queryBindings.getSendTypesToServer().set(false); + + if (this.session.hadWarnings()) { + this.session.getProtocol().scanForAndThrowDataTruncation(); + } + + return rs; + } catch (IOException ioEx) { + throw ExceptionFactory.createCommunicationsException(this.session.getPropertySet(), this.session.getServerSession(), + this.session.getProtocol().getPacketSentTimeHolder(), this.session.getProtocol().getPacketReceivedTimeHolder(), ioEx, + this.session.getExceptionInterceptor()); + } catch (CJException sqlEx) { + if (this.session.shouldIntercept()) { + this.session.invokeQueryInterceptorsPost(() -> { + return getOriginalSql(); + }, this, null, true); + } + + throw sqlEx; + } + + } + + /** + * Sends stream-type data parameters to the server. + * + *

    +     *  Long data handling:
    +     * 
    +     *  - Server gets the long data in pieces with command type 'COM_LONG_DATA'.
    +     *  - The packet received will have the format:
    +     *    [COM_LONG_DATA:     1][STMT_ID:4][parameter_number:2][type:2][data]
    +     *  - Checks if the type is specified by client, and if yes reads the type,
    +     *    and  stores the data in that format.
    +     *  - It is up to the client to check for read data ended. The server does not
    +     *    care; and also server does not notify to the client that it got the
    +     *    data  or not; if there is any error; then during execute; the error
    +     *    will  be returned
    +     * 
    + * + * @param parameterIndex + * parameter index + * @param binding + * {@link BindValue containing long data} + * + */ + private void serverLongData(int parameterIndex, BindValue binding) { + synchronized (this) { + NativePacketPayload packet = this.session.getSharedSendPacket(); + Object value = binding.getValue(); + if (value instanceof byte[]) { + this.session.getProtocol() + .sendCommand(this.commandBuilder.buildComStmtSendLongData(packet, this.serverStatementId, parameterIndex, (byte[]) value), true, 0); + } else if (value instanceof InputStream) { + storeStreamOrReader(parameterIndex, packet, (InputStream) value); + } else if (value instanceof java.sql.Blob) { + try { + storeStreamOrReader(parameterIndex, packet, ((java.sql.Blob) value).getBinaryStream()); + } catch (Throwable t) { + throw ExceptionFactory.createException(t.getMessage(), this.session.getExceptionInterceptor()); + } + } else if (value instanceof Reader) { + if (binding.isNational() && !this.charEncoding.equalsIgnoreCase("UTF-8") && !this.charEncoding.equalsIgnoreCase("utf8")) { + throw ExceptionFactory.createException(Messages.getString("ServerPreparedStatement.31"), this.session.getExceptionInterceptor()); + } + storeStreamOrReader(parameterIndex, packet, (Reader) value); + } else if (value instanceof Clob) { + if (binding.isNational() && !this.charEncoding.equalsIgnoreCase("UTF-8") && !this.charEncoding.equalsIgnoreCase("utf8")) { + throw ExceptionFactory.createException(Messages.getString("ServerPreparedStatement.31"), this.session.getExceptionInterceptor()); + } + try { + storeStreamOrReader(parameterIndex, packet, ((Clob) value).getCharacterStream()); + } catch (Throwable t) { + throw ExceptionFactory.createException(t.getMessage(), t); + } + } else { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ServerPreparedStatement.18") + value.getClass().getName() + "'", this.session.getExceptionInterceptor()); + } + } + } + + @Override + public void closeQuery() { + this.queryBindings = null; + this.parameterFields = null; + this.resultFields = null; + super.closeQuery(); + } + + public long getServerStatementId() { + return this.serverStatementId; + } + + public void setServerStatementId(long serverStatementId) { + this.serverStatementId = serverStatementId; + } + + public Field[] getParameterFields() { + return this.parameterFields; + } + + public void setParameterFields(Field[] parameterFields) { + this.parameterFields = parameterFields; + } + + public ColumnDefinition getResultFields() { + return this.resultFields; + } + + public void setResultFields(ColumnDefinition resultFields) { + this.resultFields = resultFields; + } + + private void storeStreamOrReader(int parameterIndex, NativePacketPayload packet, Closeable streamOrReader) { + // TODO consider to use more precise type than just Closable + this.session.checkClosed(); + boolean isStream = InputStream.class.isAssignableFrom(streamOrReader.getClass()); + byte[] bBuf = null; + char[] cBuf = null; + String clobEncoding = null; + + synchronized (this.session) { + if (isStream) { + bBuf = new byte[BLOB_STREAM_READ_BUF_SIZE]; + } else { + clobEncoding = this.session.getPropertySet().getStringProperty(PropertyKey.clobCharacterEncoding).getStringValue(); + if (clobEncoding == null) { + clobEncoding = this.session.getPropertySet().getStringProperty(PropertyKey.characterEncoding).getValue(); + } + int maxBytesChar = 2; + if (clobEncoding != null) { + maxBytesChar = this.session.getServerSession().getCharsetSettings().getMaxBytesPerChar(clobEncoding); + if (maxBytesChar == 1) { + maxBytesChar = 2; // for safety + } + } + cBuf = new char[ServerPreparedQuery.BLOB_STREAM_READ_BUF_SIZE / maxBytesChar]; + } + + boolean readAny = false; + int bytesInPacket = 0; + int totalBytesRead = 0; + int bytesReadAtLastSend = 0; + int packetIsFullAt = this.session.getPropertySet().getMemorySizeProperty(PropertyKey.blobSendChunkSize).getValue(); + int numRead = 0; + + try { + packet.setPosition(0); + this.commandBuilder.buildComStmtSendLongDataHeader(packet, this.serverStatementId, parameterIndex); + + while ((numRead = (isStream ? ((InputStream) streamOrReader).read(bBuf) : ((Reader) streamOrReader).read(cBuf))) != -1) { + readAny = true; + + if (isStream) { + packet.writeBytes(StringLengthDataType.STRING_FIXED, bBuf, 0, numRead); + bytesInPacket += numRead; + totalBytesRead += numRead; + } else { + byte[] valueAsBytes = StringUtils.getBytes(cBuf, 0, numRead, clobEncoding); + packet.writeBytes(StringSelfDataType.STRING_EOF, valueAsBytes); + bytesInPacket += valueAsBytes.length; + totalBytesRead += valueAsBytes.length; + } + + if (bytesInPacket >= packetIsFullAt) { + bytesReadAtLastSend = totalBytesRead; + + this.session.getProtocol().sendCommand(packet, true, 0); + + bytesInPacket = 0; + packet.setPosition(0); + this.commandBuilder.buildComStmtSendLongDataHeader(packet, this.serverStatementId, parameterIndex); + } + } + + if (!readAny || totalBytesRead != bytesReadAtLastSend) { + this.session.getProtocol().sendCommand(packet, true, 0); + } + } catch (IOException ioEx) { + throw ExceptionFactory.createException( + (isStream ? Messages.getString("ServerPreparedStatement.24") : Messages.getString("ServerPreparedStatement.25")) + ioEx.toString(), + ioEx, this.session.getExceptionInterceptor()); + } finally { + if (this.autoClosePStmtStreams.getValue()) { + if (streamOrReader != null) { + try { + streamOrReader.close(); + } catch (IOException ioEx) { + // ignore + } + } + } + } + } + } + + /** + * @param clearServerParameters + * flag indicating whether we need an additional clean up + */ + public void clearParameters(boolean clearServerParameters) { + boolean hadLongData = false; + + if (this.queryBindings != null) { + hadLongData = this.queryBindings.clearBindValues(); + this.queryBindings.setLongParameterSwitchDetected(clearServerParameters && hadLongData ? false : true); + } + + if (clearServerParameters && hadLongData) { + serverResetStatement(); + } + } + + public void serverResetStatement() { + this.session.checkClosed(); + synchronized (this.session) { + try { + this.session.getProtocol().sendCommand(this.commandBuilder.buildComStmtReset(this.session.getSharedSendPacket(), this.serverStatementId), false, + 0); + } finally { + this.session.clearInputStream(); + } + } + } + + /** + * Computes the maximum parameter set size and the size of the entire batch given + * the number of arguments in the batch. + */ + @Override + protected long[] computeMaxParameterSetSizeAndBatchSize(int numBatchedArgs) { + long maxSizeOfParameterSet = 0; + long sizeOfEntireBatch = 1 /* com_stmt_execute */ + 4 /* statement_id */ + 1 /* flags */ + 4 /* iteration_count */ + 1 /* new_params_bind_flag */; + + boolean supportsQueryAttributes = this.session.getServerSession().supportsQueryAttributes(); + if (supportsQueryAttributes) { + sizeOfEntireBatch += 9 /* parameter_count */; + sizeOfEntireBatch += (this.queryAttributesBindings.getCount() + 7) / 8 /* null_bitmap */; + for (int i = 0; i < this.queryAttributesBindings.getCount(); i++) { + BindValue queryAttribute = this.queryAttributesBindings.getAttributeValue(i); + sizeOfEntireBatch += 2 /* parameter_type */ + queryAttribute.getName().length() /* parameter_name */ + queryAttribute.getBinaryLength(); + } + } + + for (int i = 0; i < numBatchedArgs; i++) { + long sizeOfParameterSet = (this.parameterCount + 7) / 8 /* null_bitmap */ + + this.parameterCount * 2 /* parameter_type */; + if (supportsQueryAttributes) { + sizeOfParameterSet += this.parameterCount /* parameter_name (all empty) */; + } + + BindValue[] bindValues = ((QueryBindings) this.batchedArgs.get(i)).getBindValues(); + for (int j = 0; j < bindValues.length; j++) { + sizeOfParameterSet += bindValues[j].getBinaryLength(); + } + + sizeOfEntireBatch += sizeOfParameterSet; + + if (sizeOfParameterSet > maxSizeOfParameterSet) { + maxSizeOfParameterSet = sizeOfParameterSet; + } + } + + return new long[] { maxSizeOfParameterSet, sizeOfEntireBatch }; + } + + private String truncateQueryToLog(String sql) { + String queryStr = null; + + int maxQuerySizeToLog = this.session.getPropertySet().getIntegerProperty(PropertyKey.maxQuerySizeToLog).getValue(); + if (sql.length() > maxQuerySizeToLog) { + StringBuilder queryBuf = new StringBuilder(maxQuerySizeToLog + 12); + queryBuf.append(sql.substring(0, maxQuerySizeToLog)); + queryBuf.append(Messages.getString("MysqlIO.25")); + + queryStr = queryBuf.toString(); + } else { + queryStr = sql; + } + + return queryStr; + } + + @Override + public M fillSendPacket(QueryBindings bindings) { + return null; // we don't use this type of packet + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQueryTestcaseGenerator.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQueryTestcaseGenerator.java new file mode 100644 index 0000000..db96ae2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/ServerPreparedQueryTestcaseGenerator.java @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +import java.io.IOException; + +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.ProtocolEntityFactory; +import com.mysql.cj.protocol.Resultset; +import com.mysql.cj.protocol.a.NativePacketPayload; +import com.mysql.cj.util.TestUtils; + +//TODO should not be protocol-specific + +public class ServerPreparedQueryTestcaseGenerator extends ServerPreparedQuery { + + public ServerPreparedQueryTestcaseGenerator(NativeSession sess) { + super(sess); + } + + @Override + public void closeQuery() { + dumpCloseForTestcase(); + super.closeQuery(); + } + + private void dumpCloseForTestcase() { + StringBuilder buf = new StringBuilder(); + this.session.getProtocol().generateQueryCommentBlock(buf); + buf.append("DEALLOCATE PREPARE debug_stmt_"); + buf.append(this.statementId); + buf.append(";\n"); + + TestUtils.dumpTestcaseQuery(buf.toString()); + } + + @Override + public void serverPrepare(String sql) throws IOException { + dumpPrepareForTestcase(); + super.serverPrepare(sql); + } + + private void dumpPrepareForTestcase() { + StringBuilder buf = new StringBuilder(this.getOriginalSql().length() + 64); + + this.session.getProtocol().generateQueryCommentBlock(buf); + + buf.append("PREPARE debug_stmt_"); + buf.append(this.statementId); + buf.append(" FROM \""); + buf.append(this.getOriginalSql()); + buf.append("\";\n"); + + TestUtils.dumpTestcaseQuery(buf.toString()); + } + + @Override + public T serverExecute(int maxRowsToRetrieve, boolean createStreamingResultSet, ColumnDefinition metadata, + ProtocolEntityFactory resultSetFactory) { + dumpExecuteForTestcase(); + return super.serverExecute(maxRowsToRetrieve, createStreamingResultSet, metadata, resultSetFactory); + } + + private void dumpExecuteForTestcase() { + StringBuilder buf = new StringBuilder(); + + for (int i = 0; i < this.getParameterCount(); i++) { + this.session.getProtocol().generateQueryCommentBlock(buf); + + buf.append("SET @debug_stmt_param"); + buf.append(this.statementId); + buf.append("_"); + buf.append(i); + buf.append("="); + + BindValue bv = this.queryBindings.getBindValues()[i]; + buf.append(bv.isNull() ? "NULL" : bv.getString()); + + buf.append(";\n"); + } + + this.session.getProtocol().generateQueryCommentBlock(buf); + + buf.append("EXECUTE debug_stmt_"); + buf.append(this.statementId); + + if (this.getParameterCount() > 0) { + buf.append(" USING "); + for (int i = 0; i < this.getParameterCount(); i++) { + if (i > 0) { + buf.append(", "); + } + + buf.append("@debug_stmt_param"); + buf.append(this.statementId); + buf.append("_"); + buf.append(i); + + } + } + + buf.append(";\n"); + + TestUtils.dumpTestcaseQuery(buf.toString()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/SimpleQuery.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/SimpleQuery.java new file mode 100644 index 0000000..b84fc91 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/SimpleQuery.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj; + +//TODO should not be protocol-specific + +public class SimpleQuery extends AbstractQuery { + + public SimpleQuery(NativeSession sess) { + super(sess); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/admin/ServerController.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/admin/ServerController.java new file mode 100644 index 0000000..0573655 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/admin/ServerController.java @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.admin; + +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import java.util.Properties; + +import com.mysql.cj.Constants; +import com.mysql.cj.util.StringUtils; + +/** + * Controls a MySQL server using Java RunTime methods + */ +public class ServerController { + + /** + * Where is the server installed? + */ + public static final String BASEDIR_KEY = "basedir"; + + /** + * Where are the databases installed? + */ + public static final String DATADIR_KEY = "datadir"; + + /** + * Where is the config file located? + */ + + public static final String DEFAULTS_FILE_KEY = "defaults-file"; + + /** + * What is the name of the executable to run? + */ + + public static final String EXECUTABLE_NAME_KEY = "executable"; + + /** + * What is the path to the mysql server executable (if not standard?) + */ + + public static final String EXECUTABLE_PATH_KEY = "executablePath"; + + /** + * The default executable to run + */ + + /** + * The process representing the MySQL server + */ + private Process serverProcess = null; + + /** + * The list of properties for this server + */ + private Properties serverProps = null; + + /** + * The system properties + */ + //private Properties systemProps = null; + + /** + * Creates a ServerController with the directory for the MySQL server. + * + * The 'datadir' is set to the same directory. + * + * @param baseDir + * the base directory for the MySQL server. + */ + public ServerController(String baseDir) { + setBaseDir(baseDir); + } + + /** + * Creates a server controller for the MySQL server with the given basedir + * and datadir. + * + * @param basedir + * the basedir to use when starting MySQL. + * @param datadir + * the datadir to use when starting MySQL. + */ + public ServerController(String basedir, String datadir) { + } + + /** + * Sets the basedir to use when starting MySQL. + * + * @param baseDir + * the basedir to use when starting MySQL. + */ + public void setBaseDir(String baseDir) { + getServerProps().setProperty(BASEDIR_KEY, baseDir); + } + + /** + * Sets the data to use when starting MySQL. + * + * @param dataDir + * the basedir to use when starting MySQL. + */ + public void setDataDir(String dataDir) { + getServerProps().setProperty(DATADIR_KEY, dataDir); + } + + /** + * Starts the server, returning a java.lang.Process instance that represents + * the mysql server. + * + * @return Process a java.lang.Process instance representing the mysql + * server process. + * @throws IOException + * if an error occurs while starting the mysql server. + */ + public Process start() throws IOException { + if (this.serverProcess != null) { + throw new IllegalArgumentException("Server already started"); + } + this.serverProcess = Runtime.getRuntime().exec(getCommandLine()); + + return this.serverProcess; + } + + /** + * Stops the server (if started) + * + * @param forceIfNecessary + * use forceStop if mysqladmin doesn't shut the server down + * + * @throws IOException + * if an error occurs while stopping the server + */ + public void stop(boolean forceIfNecessary) throws IOException { + if (this.serverProcess != null) { + + String basedir = getServerProps().getProperty(BASEDIR_KEY); + + StringBuilder pathBuf = new StringBuilder(basedir); + + if (!basedir.endsWith(File.separator)) { + pathBuf.append(File.separator); + } + + //String defaultsFilePath = getServerProps().getProperty(DEFAULTS_FILE_KEY); + + pathBuf.append("bin"); + pathBuf.append(File.separator); + pathBuf.append("mysqladmin shutdown"); + + System.out.println(pathBuf.toString()); + + Process mysqladmin = Runtime.getRuntime().exec(pathBuf.toString()); + + int exitStatus = -1; + + try { + exitStatus = mysqladmin.waitFor(); + } catch (InterruptedException ie) { + // ignore + } + + // + // Terminate the process if mysqladmin couldn't do it, and the user requested a force stop. + // + if (exitStatus != 0 && forceIfNecessary) { + forceStop(); + } + } + } + + /** + * Forcefully terminates the server process (if started). + */ + public void forceStop() { + if (this.serverProcess != null) { + this.serverProcess.destroy(); + this.serverProcess = null; + } + } + + /** + * Returns the list of properties that will be used to start/control the + * server. + * + * @return Properties the list of properties. + */ + public synchronized Properties getServerProps() { + if (this.serverProps == null) { + this.serverProps = new Properties(); + } + + return this.serverProps; + } + + /** + * Returns the full commandline used to start the mysql server, including + * and arguments to be passed to the server process. + * + * @return String the commandline used to start the mysql server. + */ + private String getCommandLine() { + StringBuilder commandLine = new StringBuilder(getFullExecutablePath()); + commandLine.append(buildOptionalCommandLine()); + + return commandLine.toString(); + } + + /** + * Returns the fully-qualifed path to the 'mysqld' executable + * + * @return String the path to the server executable. + */ + private String getFullExecutablePath() { + StringBuilder pathBuf = new StringBuilder(); + + String optionalExecutablePath = getServerProps().getProperty(EXECUTABLE_PATH_KEY); + + if (optionalExecutablePath == null) { + // build the path using the defaults + String basedir = getServerProps().getProperty(BASEDIR_KEY); + pathBuf.append(basedir); + + if (!basedir.endsWith(File.separator)) { + pathBuf.append(File.separatorChar); + } + + if (runningOnWindows()) { + pathBuf.append("bin"); + } else { + pathBuf.append("libexec"); + } + + pathBuf.append(File.separatorChar); + } else { + pathBuf.append(optionalExecutablePath); + + if (!optionalExecutablePath.endsWith(File.separator)) { + pathBuf.append(File.separatorChar); + } + } + + String executableName = getServerProps().getProperty(EXECUTABLE_NAME_KEY, "mysqld"); + + pathBuf.append(executableName); + + return pathBuf.toString(); + } + + /** + * Builds the list of command-line arguments that will be passed to the + * mysql server to be started. + * + * @return String the list of command-line arguments. + */ + private String buildOptionalCommandLine() { + StringBuilder commandLineBuf = new StringBuilder(); + + if (this.serverProps != null) { + + for (Iterator iter = this.serverProps.keySet().iterator(); iter.hasNext();) { + String key = (String) iter.next(); + String value = this.serverProps.getProperty(key); + + if (!isNonCommandLineArgument(key)) { + if (value != null && value.length() > 0) { + commandLineBuf.append(" \""); + commandLineBuf.append("--"); + commandLineBuf.append(key); + commandLineBuf.append("="); + commandLineBuf.append(value); + commandLineBuf.append("\""); + } else { + commandLineBuf.append(" --"); + commandLineBuf.append(key); + } + } + } + } + + return commandLineBuf.toString(); + } + + /** + * Returns true if the property does not belong as a command-line argument + * + * @param propName + * property name + * + * @return boolean if the property should not be a command-line argument. + */ + private boolean isNonCommandLineArgument(String propName) { + return propName.equals(EXECUTABLE_NAME_KEY) || propName.equals(EXECUTABLE_PATH_KEY); + } + + /** + * Is this ServerController running on a Windows operating system? + * + * @return boolean if this ServerController is running on Windows + */ + private boolean runningOnWindows() { + return StringUtils.indexOfIgnoreCase(Constants.OS_NAME, "WINDOWS") != -1; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractPropertyDefinition.java new file mode 100644 index 0000000..eb62d92 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractPropertyDefinition.java @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.io.Serializable; + +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public abstract class AbstractPropertyDefinition implements PropertyDefinition, Serializable { + + private static final long serialVersionUID = 2696624840927848766L; + + private PropertyKey key = null; + private String name; + private String ccAlias; + private T defaultValue; + private boolean isRuntimeModifiable; + private String description; + private String sinceVersion; + private String category; + private int order; + + private int lowerBound; + private int upperBound; + + public AbstractPropertyDefinition(String name, String camelCaseAlias, T defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, + String category, int orderInCategory) { + + this.name = name; + this.ccAlias = camelCaseAlias; + this.setDefaultValue(defaultValue); + this.setRuntimeModifiable(isRuntimeModifiable); + this.setDescription(description); + this.setSinceVersion(sinceVersion); + this.setCategory(category); + this.setOrder(orderInCategory); + } + + public AbstractPropertyDefinition(PropertyKey key, T defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory) { + + this.key = key; + this.name = key.getKeyName(); + this.ccAlias = key.getCcAlias(); + this.setDefaultValue(defaultValue); + this.setRuntimeModifiable(isRuntimeModifiable); + this.setDescription(description); + this.setSinceVersion(sinceVersion); + this.setCategory(category); + this.setOrder(orderInCategory); + } + + public AbstractPropertyDefinition(PropertyKey key, T defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory, int lowerBound, int upperBound) { + this(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + this.setLowerBound(lowerBound); + this.setUpperBound(upperBound); + } + + public boolean hasValueConstraints() { + return (getAllowableValues() != null) && (getAllowableValues().length > 0); + } + + public boolean isRangeBased() { + return false; + } + + @Override + public PropertyKey getPropertyKey() { + return this.key; + } + + public String getName() { + return this.name; + } + + @Override + public String getCcAlias() { + return this.ccAlias; + } + + @Override + public boolean hasCcAlias() { + return this.ccAlias != null && this.ccAlias.length() > 0; + } + + public T getDefaultValue() { + return this.defaultValue; + } + + public void setDefaultValue(T defaultValue) { + this.defaultValue = defaultValue; + } + + public boolean isRuntimeModifiable() { + return this.isRuntimeModifiable; + } + + public void setRuntimeModifiable(boolean isRuntimeModifiable) { + this.isRuntimeModifiable = isRuntimeModifiable; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSinceVersion() { + return this.sinceVersion; + } + + public void setSinceVersion(String sinceVersion) { + this.sinceVersion = sinceVersion; + } + + public String getCategory() { + return this.category; + } + + public void setCategory(String category) { + this.category = category; + } + + public int getOrder() { + return this.order; + } + + public void setOrder(int order) { + this.order = order; + } + + public String[] getAllowableValues() { + return null; + } + + public int getLowerBound() { + return this.lowerBound; + } + + public void setLowerBound(int lowerBound) { + this.lowerBound = lowerBound; + } + + public int getUpperBound() { + return this.upperBound; + } + + public void setUpperBound(int upperBound) { + this.upperBound = upperBound; + } + + public abstract T parseObject(String value, ExceptionInterceptor exceptionInterceptor); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractRuntimeProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractRuntimeProperty.java new file mode 100644 index 0000000..88e2e6a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/AbstractRuntimeProperty.java @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.io.Serializable; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.naming.RefAddr; +import javax.naming.Reference; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.PropertyNotModifiableException; + +public abstract class AbstractRuntimeProperty implements RuntimeProperty, Serializable { + + private static final long serialVersionUID = -3424722534876438236L; + + private PropertyDefinition propertyDefinition; + + protected T value; + + protected T initialValue; + + protected boolean wasExplicitlySet = false; + + private List> listeners; + + public AbstractRuntimeProperty() { + } + + protected AbstractRuntimeProperty(PropertyDefinition propertyDefinition) { + this.propertyDefinition = propertyDefinition; + this.value = propertyDefinition.getDefaultValue(); + this.initialValue = propertyDefinition.getDefaultValue(); + } + + @Override + public PropertyDefinition getPropertyDefinition() { + return this.propertyDefinition; + } + + @Override + public void initializeFrom(Properties extractFrom, ExceptionInterceptor exceptionInterceptor) { + String name = getPropertyDefinition().getName(); + String alias = getPropertyDefinition().getCcAlias(); + if (extractFrom.containsKey(name)) { + String extractedValue = (String) extractFrom.remove(name); + if (extractedValue != null) { + setValueInternal(extractedValue, exceptionInterceptor); + this.initialValue = this.value; + } + } else if (alias != null && extractFrom.containsKey(alias)) { + String extractedValue = (String) extractFrom.remove(alias); + if (extractedValue != null) { + setValueInternal(extractedValue, exceptionInterceptor); + this.initialValue = this.value; + } + } + } + + @Override + public void initializeFrom(Reference ref, ExceptionInterceptor exceptionInterceptor) { + RefAddr refAddr = ref.get(getPropertyDefinition().getName()); + if (refAddr != null) { + String refContentAsString = (String) refAddr.getContent(); + if (refContentAsString != null) { + setValueInternal(refContentAsString, exceptionInterceptor); + this.initialValue = this.value; + } + } + } + + @Override + public void resetValue() { + this.value = this.initialValue; + invokeListeners(); + } + + public boolean isExplicitlySet() { + return this.wasExplicitlySet; + } + + @Override + public void addListener(RuntimePropertyListener l) { + if (this.listeners == null) { + this.listeners = new ArrayList<>(); + } + + boolean found = false; + for (WeakReference weakReference : this.listeners) { + if (l.equals(weakReference.get())) { + found = true; + break; + } + } + if (!found) { + this.listeners.add(new WeakReference<>(l)); + } + } + + @Override + public void removeListener(RuntimePropertyListener listener) { + if (this.listeners != null) { + for (WeakReference wr : this.listeners) { + RuntimePropertyListener l = wr.get(); + if (l.equals(listener)) { + this.listeners.remove(wr); + break; + } + } + } + } + + protected void invokeListeners() { + if (this.listeners != null) { + for (WeakReference wr : this.listeners) { + RuntimePropertyListener l = wr.get(); + if (l != null) { + l.handlePropertyChange(this); + } else { + this.listeners.remove(wr); + } + } + } + } + + @Override + public T getValue() { + return this.value; + } + + @Override + public T getInitialValue() { + return this.initialValue; + } + + @Override + public String getStringValue() { + return this.value == null ? null : this.value.toString(); + } + + /** + * Set the value of a property from a string value. + * It involves the {@link PropertyDefinition#parseObject(String, ExceptionInterceptor)} to validate and parse the string. + * + * @param value + * value + * @param exceptionInterceptor + * exception interceptor + */ + public void setValueInternal(String value, ExceptionInterceptor exceptionInterceptor) { + setValueInternal(getPropertyDefinition().parseObject(value, exceptionInterceptor), value, exceptionInterceptor); + } + + /** + * Internal method for setting property value; ignoring the RUNTIME_NOT_MODIFIABLE flag. + * + * @param value + * value + * @param valueAsString + * value represented by String + * @param exceptionInterceptor + * exception interceptor + */ + public void setValueInternal(T value, String valueAsString, ExceptionInterceptor exceptionInterceptor) { + if (getPropertyDefinition().isRangeBased()) { + checkRange(value, valueAsString, exceptionInterceptor); + } + this.value = value; + this.wasExplicitlySet = true; + } + + /** + * For range-based property, checks that value fit into range given by PropertyDefinition. + * + * @param val + * value + * @param valueAsString + * value represented by String + * @param exceptionInterceptor + * exception interceptor + */ + protected void checkRange(T val, String valueAsString, ExceptionInterceptor exceptionInterceptor) { + // no-op for not range-based properties + } + + @Override + public void setValue(T value) { + setValue(value, null); + } + + @Override + public void setValue(T value, ExceptionInterceptor exceptionInterceptor) { + if (getPropertyDefinition().isRuntimeModifiable()) { + setValueInternal(value, null, exceptionInterceptor); + invokeListeners(); + } else { + throw ExceptionFactory.createException(PropertyNotModifiableException.class, + Messages.getString("ConnectionProperties.dynamicChangeIsNotAllowed", new Object[] { "'" + getPropertyDefinition().getName() + "'" })); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanProperty.java new file mode 100644 index 0000000..f2b5f6b --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanProperty.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +public class BooleanProperty extends AbstractRuntimeProperty { + + private static final long serialVersionUID = 1102859411443650569L; + + protected BooleanProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanPropertyDefinition.java new file mode 100644 index 0000000..cea8b2a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/BooleanPropertyDefinition.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Arrays; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.util.StringUtils; + +public class BooleanPropertyDefinition extends AbstractPropertyDefinition { + + private static final long serialVersionUID = -7288366734350231540L; + + public enum AllowableValues { + TRUE(true), FALSE(false), YES(true), NO(false); + + private boolean asBoolean; + + private AllowableValues(boolean booleanValue) { + this.asBoolean = booleanValue; + } + + public boolean asBoolean() { + return this.asBoolean; + } + } + + public BooleanPropertyDefinition(PropertyKey key, Boolean defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, + String category, int orderInCategory) { + super(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + @Override + public String[] getAllowableValues() { + return getBooleanAllowableValues(); + } + + @Override + public Boolean parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + return booleanFrom(getName(), value, exceptionInterceptor); + } + + /** + * Creates instance of BooleanProperty. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new BooleanProperty(this); + } + + public static Boolean booleanFrom(String name, String value, ExceptionInterceptor exceptionInterceptor) { + try { + return AllowableValues.valueOf(value.toUpperCase()).asBoolean(); + } catch (Exception e) { + throw ExceptionFactory.createException( + Messages.getString("PropertyDefinition.1", + new Object[] { name, StringUtils.stringArrayToString(getBooleanAllowableValues(), "'", "', '", "' or '", "'"), value }), + e, exceptionInterceptor); + } + } + + public static String[] getBooleanAllowableValues() { + return Arrays.stream(AllowableValues.values()).map(AllowableValues::toString).toArray(String[]::new); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/DefaultPropertySet.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/DefaultPropertySet.java new file mode 100644 index 0000000..f32520c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/DefaultPropertySet.java @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyDefinitions.SslMode; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; + +public class DefaultPropertySet implements PropertySet, Serializable { + + private static final long serialVersionUID = -5156024634430650528L; + + private final Map> PROPERTY_KEY_TO_RUNTIME_PROPERTY = new HashMap<>(); + private final Map> PROPERTY_NAME_TO_RUNTIME_PROPERTY = new HashMap<>(); + + public DefaultPropertySet() { + for (PropertyDefinition pdef : PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.values()) { + addProperty(pdef.createRuntimeProperty()); + } + } + + @Override + public void addProperty(RuntimeProperty prop) { + PropertyDefinition def = prop.getPropertyDefinition(); + if (def.getPropertyKey() != null) { + this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.put(def.getPropertyKey(), prop); + } else { + this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.put(def.getName(), prop); + if (def.hasCcAlias()) { + this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.put(def.getCcAlias(), prop); + } + } + } + + @Override + public void removeProperty(String name) { + PropertyKey key = PropertyKey.fromValue(name); + if (key != null) { + this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.remove(key); + } else { + RuntimeProperty prop = this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.remove(name); + if (prop != null) { + if (!name.equals(prop.getPropertyDefinition().getName())) { + this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.remove(prop.getPropertyDefinition().getName()); + } else if (prop.getPropertyDefinition().hasCcAlias()) { + this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.remove(prop.getPropertyDefinition().getCcAlias()); + } + } + } + } + + @Override + public void removeProperty(PropertyKey key) { + this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.remove(key); + } + + @SuppressWarnings("unchecked") + @Override + public RuntimeProperty getProperty(String name) { + try { + PropertyKey key = PropertyKey.fromValue(name); + if (key != null) { + return getProperty(key); + } + // if there is no such PropertyKey then it could be a custom property + return (RuntimeProperty) this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.get(name); + + } catch (ClassCastException ex) { + // TODO improve message + throw ExceptionFactory.createException(WrongArgumentException.class, ex.getMessage(), ex); + } + } + + @SuppressWarnings("unchecked") + @Override + public RuntimeProperty getProperty(PropertyKey key) { + try { + RuntimeProperty prop = (RuntimeProperty) this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.get(key); + // for some of PropertyKey values we don't have property definitions, thus they are cached as custom properties + if (prop == null) { + prop = (RuntimeProperty) this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.get(key.getKeyName()); + } + return prop; + + } catch (ClassCastException ex) { + // TODO improve message + throw ExceptionFactory.createException(WrongArgumentException.class, ex.getMessage(), ex); + } + } + + @Override + public RuntimeProperty getBooleanProperty(String name) { + return getProperty(name); + } + + @Override + public RuntimeProperty getBooleanProperty(PropertyKey key) { + return getProperty(key); + } + + @Override + public RuntimeProperty getIntegerProperty(String name) { + return getProperty(name); + } + + @Override + public RuntimeProperty getIntegerProperty(PropertyKey key) { + return getProperty(key); + } + + @Override + public RuntimeProperty getLongProperty(String name) { + return getProperty(name); + } + + @Override + public RuntimeProperty getLongProperty(PropertyKey key) { + return getProperty(key); + } + + @Override + public RuntimeProperty getMemorySizeProperty(String name) { + return getProperty(name); + } + + @Override + public RuntimeProperty getMemorySizeProperty(PropertyKey key) { + return getProperty(key); + } + + @Override + public RuntimeProperty getStringProperty(String name) { + return getProperty(name); + } + + @Override + public RuntimeProperty getStringProperty(PropertyKey key) { + return getProperty(key); + } + + @Override + public > RuntimeProperty getEnumProperty(String name) { + return getProperty(name); + } + + @Override + public > RuntimeProperty getEnumProperty(PropertyKey key) { + return getProperty(key); + } + + public void initializeProperties(Properties props) { + if (props != null) { + Properties infoCopy = (Properties) props.clone(); + + // TODO do we need to remove next properties (as it was before)? + infoCopy.remove(PropertyKey.HOST.getKeyName()); + infoCopy.remove(PropertyKey.PORT.getKeyName()); + infoCopy.remove(PropertyKey.USER.getKeyName()); + infoCopy.remove(PropertyKey.PASSWORD.getKeyName()); + infoCopy.remove(PropertyKey.DBNAME.getKeyName()); + + for (PropertyKey propKey : PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.keySet()) { + try { + RuntimeProperty propToSet = getProperty(propKey); + propToSet.initializeFrom(infoCopy, null); + + } catch (CJException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, e.getMessage(), e); + } + } + + // Translate legacy SSL properties if sslMode isn't explicitly set. Default sslMode is PREFERRED. + RuntimeProperty sslMode = this. getEnumProperty(PropertyKey.sslMode); + if (!sslMode.isExplicitlySet()) { + RuntimeProperty useSSL = this.getBooleanProperty(PropertyKey.useSSL); + RuntimeProperty verifyServerCertificate = this.getBooleanProperty(PropertyKey.verifyServerCertificate); + RuntimeProperty requireSSL = this.getBooleanProperty(PropertyKey.requireSSL); + if (useSSL.isExplicitlySet() || verifyServerCertificate.isExplicitlySet() || requireSSL.isExplicitlySet()) { + if (!useSSL.getValue()) { + sslMode.setValue(SslMode.DISABLED); + } else if (verifyServerCertificate.getValue()) { + sslMode.setValue(SslMode.VERIFY_CA); + } else if (requireSSL.getValue()) { + sslMode.setValue(SslMode.REQUIRED); + } + } + } + + // add user-defined properties + for (Object key : infoCopy.keySet()) { + String val = infoCopy.getProperty((String) key); + PropertyDefinition def = new StringPropertyDefinition((String) key, null, val, PropertyDefinitions.RUNTIME_MODIFIABLE, + Messages.getString("ConnectionProperties.unknown"), "8.0.10", PropertyDefinitions.CATEGORY_USER_DEFINED, Integer.MIN_VALUE); + RuntimeProperty p = new StringProperty(def); + addProperty(p); + } + postInitialization(); + } + } + + @Override + public void postInitialization() { + // no-op + } + + @Override + public Properties exposeAsProperties() { + Properties props = new Properties(); + for (PropertyKey propKey : this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.keySet()) { + if (!props.containsKey(propKey.getKeyName())) { + RuntimeProperty propToGet = getProperty(propKey); + String propValue = propToGet.getStringValue(); + if (propValue != null) { + props.setProperty(propToGet.getPropertyDefinition().getName(), propValue); + } + } + } + + for (String propName : this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.keySet()) { + if (!props.containsKey(propName)) { + RuntimeProperty propToGet = getProperty(propName); + String propValue = propToGet.getStringValue(); + if (propValue != null) { + props.setProperty(propToGet.getPropertyDefinition().getName(), propValue); + } + } + } + return props; + } + + @Override + public void reset() { + this.PROPERTY_KEY_TO_RUNTIME_PROPERTY.values().forEach(p -> p.resetValue()); + this.PROPERTY_NAME_TO_RUNTIME_PROPERTY.values().forEach(p -> p.resetValue()); + postInitialization(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumProperty.java new file mode 100644 index 0000000..f95478f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumProperty.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +public class EnumProperty> extends AbstractRuntimeProperty { + + private static final long serialVersionUID = -60853080911910124L; + + protected EnumProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumPropertyDefinition.java new file mode 100644 index 0000000..17174bb --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/EnumPropertyDefinition.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Arrays; + +import com.mysql.cj.Messages; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.util.StringUtils; + +public class EnumPropertyDefinition> extends AbstractPropertyDefinition { + + private static final long serialVersionUID = -3297521968759540444L; + + private Class enumType; + + public EnumPropertyDefinition(PropertyKey key, T defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory) { + super(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + if (defaultValue == null) { + throw ExceptionFactory.createException("Enum property '" + key.getKeyName() + "' cannot be initialized with null."); + } + this.enumType = defaultValue.getDeclaringClass(); + } + + @Override + public String[] getAllowableValues() { + return Arrays.stream(this.enumType.getEnumConstants()).map(T::toString).sorted().toArray(String[]::new); + } + + @Override + public T parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + try { + return Enum.valueOf(this.enumType, value.toUpperCase()); + } catch (Exception e) { + throw ExceptionFactory.createException( + Messages.getString("PropertyDefinition.1", + new Object[] { getName(), StringUtils.stringArrayToString(getAllowableValues(), "'", "', '", "' or '", "'"), value }), + e, exceptionInterceptor); + } + } + + /** + * Creates an instance of EnumProperty. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new EnumProperty<>(this); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerProperty.java new file mode 100644 index 0000000..fd16e6f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerProperty.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; + +public class IntegerProperty extends AbstractRuntimeProperty { + + private static final long serialVersionUID = 9208223182595760858L; + + public IntegerProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + } + + @Override + protected void checkRange(Integer val, String valueAsString, ExceptionInterceptor exceptionInterceptor) { + if ((val.intValue() < getPropertyDefinition().getLowerBound()) || (val.intValue() > getPropertyDefinition().getUpperBound())) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "The connection property '" + getPropertyDefinition().getName() + "' only accepts integer values in the range of " + + getPropertyDefinition().getLowerBound() + " - " + getPropertyDefinition().getUpperBound() + ", the value '" + + (valueAsString == null ? val.intValue() : valueAsString) + "' exceeds this range.", + exceptionInterceptor); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerPropertyDefinition.java new file mode 100644 index 0000000..f16fa52 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/IntegerPropertyDefinition.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; + +public class IntegerPropertyDefinition extends AbstractPropertyDefinition { + + private static final long serialVersionUID = 4151893695173946081L; + + protected int multiplier = 1; + + public IntegerPropertyDefinition(PropertyKey key, int defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory) { + super(key, Integer.valueOf(defaultValue), isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + public IntegerPropertyDefinition(PropertyKey key, int defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory, int lowerBound, int upperBound) { + super(key, Integer.valueOf(defaultValue), isRuntimeModifiable, description, sinceVersion, category, orderInCategory, lowerBound, upperBound); + } + + @Override + public boolean isRangeBased() { + return getUpperBound() != getLowerBound(); + } + + @Override + public Integer parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + return integerFrom(getName(), value, this.multiplier, exceptionInterceptor); + } + + /** + * Creates instance of IntegerProperty. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new IntegerProperty(this); + } + + public static Integer integerFrom(String name, String value, int multiplier, ExceptionInterceptor exceptionInterceptor) { + try { + // Parse decimals, too + int intValue = (int) (Double.valueOf(value).doubleValue() * multiplier); + + // TODO check bounds + + return intValue; + + } catch (NumberFormatException nfe) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "The connection property '" + name + "' only accepts integer values. The value '" + value + "' can not be converted to an integer.", + exceptionInterceptor); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongProperty.java new file mode 100644 index 0000000..989579c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongProperty.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; + +public class LongProperty extends AbstractRuntimeProperty { + + private static final long serialVersionUID = 1814429804634837665L; + + protected LongProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + } + + @Override + protected void checkRange(Long val, String valueAsString, ExceptionInterceptor exceptionInterceptor) { + if ((val.longValue() < getPropertyDefinition().getLowerBound()) || (val.longValue() > getPropertyDefinition().getUpperBound())) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "The connection property '" + getPropertyDefinition().getName() + "' only accepts long integer values in the range of " + + getPropertyDefinition().getLowerBound() + " - " + getPropertyDefinition().getUpperBound() + ", the value '" + + (valueAsString == null ? val.longValue() : valueAsString) + "' exceeds this range.", + exceptionInterceptor); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongPropertyDefinition.java new file mode 100644 index 0000000..52903df --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/LongPropertyDefinition.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.WrongArgumentException; + +public class LongPropertyDefinition extends AbstractPropertyDefinition { + + private static final long serialVersionUID = -5264490959206230852L; + + public LongPropertyDefinition(PropertyKey key, long defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory) { + super(key, Long.valueOf(defaultValue), isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + public LongPropertyDefinition(PropertyKey key, long defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory, long lowerBound, long upperBound) { + super(key, Long.valueOf(defaultValue), isRuntimeModifiable, description, sinceVersion, category, orderInCategory, (int) lowerBound, (int) upperBound); + } + + @Override + public Long parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + try { + // Parse decimals, too + return Double.valueOf(value).longValue(); + + } catch (NumberFormatException nfe) { + throw ExceptionFactory.createException(WrongArgumentException.class, "The connection property '" + getName() + + "' only accepts long integer values. The value '" + value + "' can not be converted to a long integer.", exceptionInterceptor); + } + } + + @Override + public boolean isRangeBased() { + return getUpperBound() != getLowerBound(); + } + + /** + * Creates instance of LongProperty. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new LongProperty(this); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizeProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizeProperty.java new file mode 100644 index 0000000..5ee4bc2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizeProperty.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import java.util.Properties; + +import javax.naming.Reference; + +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public class MemorySizeProperty extends IntegerProperty { + + private static final long serialVersionUID = 4200558564320133284L; + + private String initialValueAsString; + + protected String valueAsString; + + protected MemorySizeProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + this.valueAsString = propertyDefinition.getDefaultValue().toString(); + } + + @Override + public void initializeFrom(Properties extractFrom, ExceptionInterceptor exceptionInterceptor) { + super.initializeFrom(extractFrom, exceptionInterceptor); + this.initialValueAsString = this.valueAsString; + } + + @Override + public void initializeFrom(Reference ref, ExceptionInterceptor exceptionInterceptor) { + super.initializeFrom(ref, exceptionInterceptor); + this.initialValueAsString = this.valueAsString; + } + + @Override + public String getStringValue() { + return this.valueAsString; + } + + @Override + public void setValueInternal(Integer value, String valueAsString, ExceptionInterceptor exceptionInterceptor) { + super.setValueInternal(value, valueAsString, exceptionInterceptor); + this.valueAsString = valueAsString == null ? String.valueOf(value.intValue()) : valueAsString; + } + + @Override + public void resetValue() { + this.value = this.initialValue; + this.valueAsString = this.initialValueAsString; + invokeListeners(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizePropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizePropertyDefinition.java new file mode 100644 index 0000000..7444a95 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/MemorySizePropertyDefinition.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.util.StringUtils; + +public class MemorySizePropertyDefinition extends IntegerPropertyDefinition { + + private static final long serialVersionUID = -6878680905514177949L; + + public MemorySizePropertyDefinition(PropertyKey key, int defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, + String category, int orderInCategory) { + super(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + public MemorySizePropertyDefinition(PropertyKey key, int defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, + String category, int orderInCategory, int lowerBound, int upperBound) { + super(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory, lowerBound, upperBound); + } + + @Override + public Integer parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + this.multiplier = 1; + + if (value.endsWith("k") || value.endsWith("K") || value.endsWith("kb") || value.endsWith("Kb") || value.endsWith("kB") || value.endsWith("KB")) { + this.multiplier = 1024; + int indexOfK = StringUtils.indexOfIgnoreCase(value, "k"); + value = value.substring(0, indexOfK); + } else if (value.endsWith("m") || value.endsWith("M") || value.endsWith("mb") || value.endsWith("Mb") || value.endsWith("mB") || value.endsWith("MB")) { + this.multiplier = 1024 * 1024; + int indexOfM = StringUtils.indexOfIgnoreCase(value, "m"); + value = value.substring(0, indexOfM); + } else if (value.endsWith("g") || value.endsWith("G") || value.endsWith("gb") || value.endsWith("Gb") || value.endsWith("gB") || value.endsWith("GB")) { + this.multiplier = 1024 * 1024 * 1024; + int indexOfG = StringUtils.indexOfIgnoreCase(value, "g"); + value = value.substring(0, indexOfG); + } + + return super.parseObject(value, exceptionInterceptor); + } + + /** + * Creates instance of ReadableMemorySizeProperty or ModifiableMemorySizeProperty depending on isRuntimeModifiable() result. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new MemorySizeProperty(this); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringProperty.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringProperty.java new file mode 100644 index 0000000..d9b2752 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringProperty.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +public class StringProperty extends AbstractRuntimeProperty { + + private static final long serialVersionUID = -4141084145739428803L; + + protected StringProperty(PropertyDefinition propertyDefinition) { + super(propertyDefinition); + } + + @Override + public String getStringValue() { + return this.value; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringPropertyDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringPropertyDefinition.java new file mode 100644 index 0000000..7b5445f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/StringPropertyDefinition.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf; + +import com.mysql.cj.exceptions.ExceptionInterceptor; + +public class StringPropertyDefinition extends AbstractPropertyDefinition { + + private static final long serialVersionUID = 8228934389127796555L; + + public StringPropertyDefinition(String name, String alias, String defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, + String category, int orderInCategory) { + super(name, alias, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + public StringPropertyDefinition(PropertyKey key, String defaultValue, boolean isRuntimeModifiable, String description, String sinceVersion, String category, + int orderInCategory) { + super(key, defaultValue, isRuntimeModifiable, description, sinceVersion, category, orderInCategory); + } + + @Override + public String parseObject(String value, ExceptionInterceptor exceptionInterceptor) { + return value; + } + + /** + * Creates instance of ReadableStringProperty or ModifiableStringProperty depending on isRuntimeModifiable() result. + * + * @return RuntimeProperty + */ + @Override + public RuntimeProperty createRuntimeProperty() { + return new StringProperty(this); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverConnectionUrl.java new file mode 100644 index 0000000..d297ae1 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverConnectionUrl.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.Properties; + +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; + +public class FailoverConnectionUrl extends ConnectionUrl { + /** + * Constructs an instance of {@link FailoverConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public FailoverConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.FAILOVER_CONNECTION; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverDnsSrvConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverDnsSrvConnectionUrl.java new file mode 100644 index 0000000..d50d786 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/FailoverDnsSrvConnectionUrl.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.BooleanPropertyDefinition; +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; + +public class FailoverDnsSrvConnectionUrl extends ConnectionUrl { + private static final String DEFAULT_HOST = ""; + private static final int DEFAULT_PORT = HostInfo.NO_PORT; + + /** + * Constructs an instance of {@link FailoverDnsSrvConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public FailoverDnsSrvConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.FAILOVER_DNS_SRV_CONNECTION; + + /* + * Validate the hosts list: + * 1. One host (SRV service name) must be provided. + * 2. No more than one host (SRV service name) can be provided. + * 3. No port can be provided, i.e., port number must be equals to DEFAULT_PORT. + * 4. If property 'dnsSrv' is set then it cannot be "false". + * 5. Property 'protocol' cannot be "PIPE". + */ + HostInfo srvHost = super.getMainHost(); + Map hostProps = srvHost.getHostProperties(); + if (DEFAULT_HOST.equals(srvHost.getHost())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.18")); + } + if (this.hosts.size() != 1) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.19")); + } + if (srvHost.getPort() != DEFAULT_PORT) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.22")); + } + if (hostProps.containsKey(PropertyKey.dnsSrv.getKeyName())) { + if (!BooleanPropertyDefinition.booleanFrom(PropertyKey.dnsSrv.getKeyName(), hostProps.get(PropertyKey.dnsSrv.getKeyName()), null)) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.23", new Object[] { PropertyKey.dnsSrv.getKeyName() })); + } + } + if (hostProps.containsKey(PropertyKey.PROTOCOL.getKeyName()) && hostProps.get(PropertyKey.PROTOCOL.getKeyName()).equalsIgnoreCase("PIPE")) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.24")); + } + } + + @Override + public String getDefaultHost() { + return DEFAULT_HOST; + } + + @Override + public int getDefaultPort() { + return DEFAULT_PORT; + } + + /** + * Returns a hosts list built from the result of the DNS SRV lookup for the original host name. + * + * @param view + * the type of the view to use in the returned list of hosts. This argument is ignored in this implementation. + * + * @return + * the hosts list from the result of the DNS SRV lookup, filtered for the given view. + */ + @Override + public List getHostsList(HostsListView view) { + return getHostsListFromDnsSrv(getMainHost()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceConnectionUrl.java new file mode 100644 index 0000000..d71aea6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceConnectionUrl.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.util.StringUtils; + +public class LoadBalanceConnectionUrl extends ConnectionUrl { + /** + * Constructs an instance of {@link LoadBalanceConnectionUrl}, performing all the required initializations and validations. A load-balanced connection + * cannot deal with multiple hosts with same host:port. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public LoadBalanceConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.LOADBALANCE_CONNECTION; + + // TODO: Validate the hosts list: there can't be any two hosts with same host:port. + // Although this should be required, it also is incompatible with our current tests which are creating load-balanced connections + // using the same host configurations. + // Set visitedHosts = new HashSet<>(); + // for (HostInfo hi : this.hosts) { + // if (visitedHosts.contains(hi.getHostPortPair())) { + // throw ExceptionFactory.createException(WrongArgumentException.class, + // Messages.getString("ConnectionString.12", new Object[] { hi.getHostPortPair(), Type.LOADBALANCE_CONNECTION.getProtocol() })); + // } + // visitedHosts.add(hi.getHostPortPair()); + // } + } + + /** + * Constructs an instance of a {@link LoadBalanceConnectionUrl} based on a list of hosts and a global set of properties instead of connection string + * parsing. + * {@link ConnectionUrl} instances created by this process are not cached. + * + * @param hosts + * the hosts list to use in this connection URL + * @param properties + * the properties common to all hosts + */ + public LoadBalanceConnectionUrl(List hosts, Map properties) { + this.originalConnStr = ConnectionUrl.Type.LOADBALANCE_CONNECTION.getScheme() + "//**internally_generated**" + System.currentTimeMillis() + "**"; + this.originalDatabase = properties.containsKey(PropertyKey.DBNAME.getKeyName()) ? properties.get(PropertyKey.DBNAME.getKeyName()) : ""; + this.type = ConnectionUrl.Type.LOADBALANCE_CONNECTION; + this.properties.putAll(properties); + injectPerTypeProperties(this.properties); + setupPropertiesTransformer(); // This is needed if new hosts come to be spawned in this connection URL. + hosts.stream().map(this::fixHostInfo).forEach(this.hosts::add); // Fix the hosts info based on the new properties before adding them. + } + + /** + * Injects additional properties into the connection arguments while it's being constructed. + * + * @param props + * the properties already containing all known connection arguments + */ + @Override + protected void injectPerTypeProperties(Map props) { + if (props.containsKey(PropertyKey.loadBalanceAutoCommitStatementThreshold.getKeyName())) { + try { + int autoCommitSwapThreshold = Integer.parseInt(props.get(PropertyKey.loadBalanceAutoCommitStatementThreshold.getKeyName())); + if (autoCommitSwapThreshold > 0) { + String queryInterceptors = props.get(PropertyKey.queryInterceptors.getKeyName()); + String lbi = "com.mysql.cj.jdbc.ha.LoadBalancedAutoCommitInterceptor"; + if (StringUtils.isNullOrEmpty(queryInterceptors)) { + props.put(PropertyKey.queryInterceptors.getKeyName(), lbi); + } else { + props.put(PropertyKey.queryInterceptors.getKeyName(), queryInterceptors + "," + lbi); + } + } + } catch (Throwable t) { + // Ignore, this will be handled later. + } + } + } + + /** + * Returns a list of this connection URL hosts in the form of host:port pairs. + * + * @return a list of this connection URL hosts in the form of host:port pairs + */ + public List getHostInfoListAsHostPortPairs() { + return this.hosts.stream().map(hi -> hi.getHostPortPair()).collect(Collectors.toList()); + } + + /** + * Returns the list of {@link HostInfo} instances that matches the given collection of host:port pairs. Isolated host info elements are spawned for the + * missing elements. + * + * @param hostPortPairs + * a list of host:port pairs + * @return a list of {@link HostInfo} instances corresponding to the given host:port pairs + */ + public List getHostInfoListFromHostPortPairs(Collection hostPortPairs) { + return hostPortPairs.stream().map(this::getHostOrSpawnIsolated).collect(Collectors.toList()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceDnsSrvConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceDnsSrvConnectionUrl.java new file mode 100644 index 0000000..48fcdff --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/LoadBalanceDnsSrvConnectionUrl.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.BooleanPropertyDefinition; +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; +import com.mysql.cj.util.StringUtils; + +public class LoadBalanceDnsSrvConnectionUrl extends ConnectionUrl { + private static final String DEFAULT_HOST = ""; + private static final int DEFAULT_PORT = HostInfo.NO_PORT; + + /** + * Constructs an instance of {@link LoadBalanceDnsSrvConnectionUrl}, performing all the required initializations and validations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public LoadBalanceDnsSrvConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.LOADBALANCE_DNS_SRV_CONNECTION; + + /* + * Validate the hosts list: + * 1. One host (SRV service name) must be provided. + * 2. No more than one host (SRV service name) can be provided. + * 3. No port can be provided, i.e., port number must be equals to DEFAULT_PORT. + * 4. If property 'dnsSrv' is set then it cannot be "false". + * 5. Property 'protocol' cannot be "PIPE". + * 6. Property 'loadBalanceConnectionGroup' cannot be set. + */ + HostInfo srvHost = super.getMainHost(); + Map hostProps = srvHost.getHostProperties(); + if (DEFAULT_HOST.equals(srvHost.getHost())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.18")); + } + if (this.hosts.size() != 1) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.19")); + } + if (srvHost.getPort() != DEFAULT_PORT) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.22")); + } + if (hostProps.containsKey(PropertyKey.dnsSrv.getKeyName())) { + if (!BooleanPropertyDefinition.booleanFrom(PropertyKey.dnsSrv.getKeyName(), hostProps.get(PropertyKey.dnsSrv.getKeyName()), null)) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.23", new Object[] { PropertyKey.dnsSrv.getKeyName() })); + } + } + if (hostProps.containsKey(PropertyKey.PROTOCOL.getKeyName()) && hostProps.get(PropertyKey.PROTOCOL.getKeyName()).equalsIgnoreCase("PIPE")) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.24")); + } + if (hostProps.containsKey(PropertyKey.loadBalanceConnectionGroup.getKeyName())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.25", new Object[] { PropertyKey.loadBalanceConnectionGroup.getKeyName() })); + } + } + + /** + * Injects additional properties into the connection arguments while the connection arguments map + * is being constructed. + * + * @param props + * the properties already containing all known connection arguments + */ + @Override + protected void injectPerTypeProperties(Map props) { + if (props.containsKey(PropertyKey.loadBalanceAutoCommitStatementThreshold.getKeyName())) { + try { + int autoCommitSwapThreshold = Integer.parseInt(props.get(PropertyKey.loadBalanceAutoCommitStatementThreshold.getKeyName())); + if (autoCommitSwapThreshold > 0) { + String queryInterceptors = props.get(PropertyKey.queryInterceptors.getKeyName()); + String lbi = "com.mysql.cj.jdbc.ha.LoadBalancedAutoCommitInterceptor"; + if (StringUtils.isNullOrEmpty(queryInterceptors)) { + props.put(PropertyKey.queryInterceptors.getKeyName(), lbi); + } else { + props.put(PropertyKey.queryInterceptors.getKeyName(), queryInterceptors + "," + lbi); + } + } + } catch (Throwable t) { + // Ignore, this will be handled later. + } + } + } + + @Override + public String getDefaultHost() { + return DEFAULT_HOST; + } + + @Override + public int getDefaultPort() { + return DEFAULT_PORT; + } + + /** + * Returns a hosts list built from the result of the DNS SRV lookup for the original host name. + * + * @param view + * the type of the view to use in the returned list of hosts. This argument is ignored in this implementation. + * + * @return + * the hosts list from the result of the DNS SRV lookup, filtered for the given view. + */ + @Override + public List getHostsList(HostsListView view) { + return getHostsListFromDnsSrv(getMainHost()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationConnectionUrl.java new file mode 100644 index 0000000..40ee9f2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationConnectionUrl.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; + +public class ReplicationConnectionUrl extends ConnectionUrl { + private static final String TYPE_SOURCE = "SOURCE"; + private static final String TYPE_REPLICA = "REPLICA"; + @Deprecated + private static final String TYPE_SOURCE_DEPRECATED = "MASTER"; + @Deprecated + private static final String TYPE_REPLICA_DEPRECATED = "SLAVE"; + + private List sourceHosts = new ArrayList<>(); + private List replicaHosts = new ArrayList<>(); + + /** + * Constructs an instance of {@link ReplicationConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public ReplicationConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.REPLICATION_CONNECTION; + + // Split sources and replicas: + LinkedList undefinedHosts = new LinkedList<>(); + for (HostInfo hi : this.hosts) { + Map hostProperties = hi.getHostProperties(); + if (hostProperties.containsKey(PropertyKey.TYPE.getKeyName())) { + if (TYPE_SOURCE.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName())) + || TYPE_SOURCE_DEPRECATED.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName()))) { + this.sourceHosts.add(hi); + } else if (TYPE_REPLICA.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName())) + || TYPE_REPLICA_DEPRECATED.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName()))) { + this.replicaHosts.add(hi); + } else { + undefinedHosts.add(hi); + } + } else { + undefinedHosts.add(hi); + } + } + if (!undefinedHosts.isEmpty()) { + if (this.sourceHosts.isEmpty()) { + this.sourceHosts.add(undefinedHosts.removeFirst()); + } + this.replicaHosts.addAll(undefinedHosts); + } + + // TODO: Validate the hosts list: there can't be any two hosts with same host:port. + // Although this should be required, it also is incompatible with our current tests which are creating replication connections + // using the same host configurations. + // Set visitedHosts = new HashSet<>(); + // for (List hostsLists : Arrays.asList(this.sourceHosts, this.replicaHosts)) { + // for (HostInfo hi : hostsLists) { + // if (visitedHosts.contains(hi.getHostPortPair())) { + // throw ExceptionFactory.createException(WrongArgumentException.class, + // Messages.getString("ConnectionString.13", new Object[] { hi.getHostPortPair(), Type.REPLICATION_CONNECTION.getProtocol() })); + // } + // visitedHosts.add(hi.getHostPortPair()); + // } + // } + } + + /** + * Constructs an instance of a {@link ReplicationConnectionUrl} based on a list of source hosts, a list of replica hosts and a global set of properties + * instead of connection string parsing. + * {@link ConnectionUrl} instances created by this process are not cached. + * + * @param sources + * the source hosts list to use in this connection string + * @param replicas + * the replica hosts list to use in this connection string + * @param properties + * the properties common to all hosts + */ + public ReplicationConnectionUrl(List sources, List replicas, Map properties) { + this.originalConnStr = ConnectionUrl.Type.REPLICATION_CONNECTION.getScheme() + "//**internally_generated**" + System.currentTimeMillis() + "**"; + this.originalDatabase = properties.containsKey(PropertyKey.DBNAME.getKeyName()) ? properties.get(PropertyKey.DBNAME.getKeyName()) : ""; + this.type = ConnectionUrl.Type.REPLICATION_CONNECTION; + this.properties.putAll(properties); + injectPerTypeProperties(this.properties); + setupPropertiesTransformer(); // This is needed if new hosts come to be spawned in this connection URL. + sources.stream().map(this::fixHostInfo).peek(this.sourceHosts::add).forEach(this.hosts::add); // Fix the hosts info based on the new properties before adding them. + replicas.stream().map(this::fixHostInfo).peek(this.replicaHosts::add).forEach(this.hosts::add); // Fix the hosts info based on the new properties before adding them. + } + + /** + * Returns a list of the hosts in this connection URL, filtered for the given view. + * + * @param view + * the type of the view to use in the returned list of hosts. + * @return + * the hosts list from this connection URL, filtered for the given view. + */ + @Override + public List getHostsList(HostsListView view) { + switch (view) { + case SOURCES: + return Collections.unmodifiableList(this.sourceHosts); + case REPLICAS: + return Collections.unmodifiableList(this.replicaHosts); + default: + return super.getHostsList(HostsListView.ALL); + } + } + + /** + * Returns an existing source host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found. + * + * @param hostPortPair + * the host:port part to search for + * @return the existing host info or a new independent one + */ + public HostInfo getSourceHostOrSpawnIsolated(String hostPortPair) { + return super.getHostOrSpawnIsolated(hostPortPair, this.sourceHosts); + } + + /** + * Returns a list of this connection URL source hosts in the form of host:port pairs. + * + * @return a list of this connection URL source hosts in the form of host:port pairs + */ + public List getSourcesListAsHostPortPairs() { + return this.sourceHosts.stream().map(hi -> hi.getHostPortPair()).collect(Collectors.toList()); + } + + /** + * Returns the list of {@link HostInfo} instances that matches the given collection of host:port pairs in the corresponding hosts list. Isolated host info + * elements are spawned for the missing elements. + * + * @param hostPortPairs + * a list of host:port pairs + * @return a list of {@link HostInfo} instances corresponding to the given host:port pairs + */ + public List getSourceHostsListFromHostPortPairs(Collection hostPortPairs) { + return hostPortPairs.stream().map(this::getSourceHostOrSpawnIsolated).collect(Collectors.toList()); + } + + /** + * Returns an existing replica host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found. + * + * @param hostPortPair + * the host:port part to search for + * @return the existing host info or a new independent one + */ + public HostInfo getReplicaHostOrSpawnIsolated(String hostPortPair) { + return super.getHostOrSpawnIsolated(hostPortPair, this.replicaHosts); + } + + /** + * Returns a list of this connection URL replica hosts in the form of host:port pairs. + * + * @return a list of this connection URL replica hosts in the form of host:port pairs + */ + public List getReplicasListAsHostPortPairs() { + return this.replicaHosts.stream().map(hi -> hi.getHostPortPair()).collect(Collectors.toList()); + } + + /** + * Returns the list of {@link HostInfo} instances that matches the given collection of host:port pairs in the corresponding hosts list. Isolated host info + * elements are spawned for the missing elements. + * + * @param hostPortPairs + * a list of host:port pairs + * @return a list of {@link HostInfo} instances corresponding to the given host:port pairs + */ + public List getReplicaHostsListFromHostPortPairs(Collection hostPortPairs) { + return hostPortPairs.stream().map(this::getReplicaHostOrSpawnIsolated).collect(Collectors.toList()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl.java new file mode 100644 index 0000000..892db5c --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/ReplicationDnsSrvConnectionUrl.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.BooleanPropertyDefinition; +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; + +public class ReplicationDnsSrvConnectionUrl extends ConnectionUrl { + private static final String DEFAULT_HOST = ""; + private static final int DEFAULT_PORT = HostInfo.NO_PORT; + private static final String TYPE_SOURCE = "SOURCE"; + private static final String TYPE_REPLICA = "REPLICA"; + @Deprecated + private static final String TYPE_SOURCE_DEPRECATED = "MASTER"; + @Deprecated + private static final String TYPE_REPLICA_DEPRECATED = "SLAVE"; + + private List sourceHosts = new ArrayList<>(); + private List replicaHosts = new ArrayList<>(); + + /** + * Constructs an instance of {@link ReplicationDnsSrvConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public ReplicationDnsSrvConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.REPLICATION_DNS_SRV_CONNECTION; + + // Split sources and replicas: + LinkedList undefinedHosts = new LinkedList<>(); + for (HostInfo hi : this.hosts) { + Map hostProperties = hi.getHostProperties(); + if (hostProperties.containsKey(PropertyKey.TYPE.getKeyName())) { + if (TYPE_SOURCE.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName())) + || TYPE_SOURCE_DEPRECATED.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName()))) { + this.sourceHosts.add(hi); + } else if (TYPE_REPLICA.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName())) + || TYPE_REPLICA_DEPRECATED.equalsIgnoreCase(hostProperties.get(PropertyKey.TYPE.getKeyName()))) { + this.replicaHosts.add(hi); + } else { + undefinedHosts.add(hi); + } + } else { + undefinedHosts.add(hi); + } + } + if (!undefinedHosts.isEmpty()) { + if (this.sourceHosts.isEmpty()) { + this.sourceHosts.add(undefinedHosts.removeFirst()); + } + this.replicaHosts.addAll(undefinedHosts); + } + + /* + * Validate the hosts list: + * 1. Exactly two hosts (SRV service name) must be provided. + * 2. No more than one host (SRV service name) per type can be provided. + * 3. No port can be provided, i.e., port number must be equals to DEFAULT_PORT. + * 4. If property 'dnsSrv' is set then it cannot be "false". + * 5. Property 'protocol' cannot be "PIPE". + * 6. Property 'replicationConnectionGroup' cannot be set. + */ + HostInfo srvHostSource = this.sourceHosts.isEmpty() ? null : this.sourceHosts.get(0); + Map hostPropsSource = srvHostSource == null ? Collections.emptyMap() : srvHostSource.getHostProperties(); + HostInfo srvHostReplica = this.replicaHosts.isEmpty() ? null : this.replicaHosts.get(0); + Map hostPropsReplica = srvHostReplica == null ? Collections.emptyMap() : srvHostReplica.getHostProperties(); + if (srvHostSource == null || srvHostReplica == null || DEFAULT_HOST.equals(srvHostSource.getHost()) || DEFAULT_HOST.equals(srvHostReplica.getHost())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.20")); + } + if (this.sourceHosts.size() != 1 || this.replicaHosts.size() != 1) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.21")); + } + if (srvHostSource.getPort() != DEFAULT_PORT || srvHostReplica.getPort() != DEFAULT_PORT) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.22")); + } + if (hostPropsSource.containsKey(PropertyKey.dnsSrv.getKeyName()) || hostPropsReplica.containsKey(PropertyKey.dnsSrv.getKeyName())) { + if (!BooleanPropertyDefinition.booleanFrom(PropertyKey.dnsSrv.getKeyName(), hostPropsSource.get(PropertyKey.dnsSrv.getKeyName()), null) + || !BooleanPropertyDefinition.booleanFrom(PropertyKey.dnsSrv.getKeyName(), hostPropsReplica.get(PropertyKey.dnsSrv.getKeyName()), null)) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.23", new Object[] { PropertyKey.dnsSrv.getKeyName() })); + } + } + if (hostPropsSource.containsKey(PropertyKey.PROTOCOL.getKeyName()) && hostPropsSource.get(PropertyKey.PROTOCOL.getKeyName()).equalsIgnoreCase("PIPE") + || hostPropsReplica.containsKey(PropertyKey.PROTOCOL.getKeyName()) + && hostPropsReplica.get(PropertyKey.PROTOCOL.getKeyName()).equalsIgnoreCase("PIPE")) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.24")); + } + if (hostPropsSource.containsKey(PropertyKey.replicationConnectionGroup.getKeyName()) + || hostPropsReplica.containsKey(PropertyKey.replicationConnectionGroup.getKeyName())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.25", new Object[] { PropertyKey.replicationConnectionGroup.getKeyName() })); + } + } + + @Override + public String getDefaultHost() { + return DEFAULT_HOST; + } + + @Override + public int getDefaultPort() { + return DEFAULT_PORT; + } + + /** + * Returns a hosts list built from the result of the DNS SRV lookup for the original host name. + * + * @param view + * the type of the view to use in the returned list of hosts. + * + * @return + * the hosts list from the result of the DNS SRV lookup, filtered for the given view. + */ + @Override + public List getHostsList(HostsListView view) { + switch (view) { + case SOURCES: + return getHostsListFromDnsSrv(this.sourceHosts.get(0)); + case REPLICAS: + return getHostsListFromDnsSrv(this.replicaHosts.get(0)); + default: + return super.getHostsList(HostsListView.ALL); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/SingleConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/SingleConnectionUrl.java new file mode 100644 index 0000000..9baaec7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/SingleConnectionUrl.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import java.util.Properties; + +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; + +public class SingleConnectionUrl extends ConnectionUrl { + /** + * Constructs an instance of {@link SingleConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public SingleConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.SINGLE_CONNECTION; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiConnectionUrl.java new file mode 100644 index 0000000..c022da7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiConnectionUrl.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import static com.mysql.cj.util.StringUtils.isNullOrEmpty; +import static com.mysql.cj.util.StringUtils.safeTrim; + +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Set; +import java.util.stream.Collectors; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.ConnectionUrlParser.Pair; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.util.StringUtils; + +public class XDevApiConnectionUrl extends ConnectionUrl { + private static final int DEFAULT_PORT = 33060; + + private boolean prioritySorted = false; + private boolean hasDuplicatedPriorities = false; + + /** + * Constructs an instance of {@link XDevApiConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public XDevApiConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.XDEVAPI_SESSION; + + /* + * Validate the hosts list: + * 1. Same user and password are required in all hosts. + * 2. If the host property 'priority' is set for one host, then in needs to be set on all others too. + * 3. 'Priority' value must be between 0 and 100. + */ + boolean first = true; + String user = null; + String password = null; + boolean hasPriority = false; + Set priorities = new HashSet<>(); + for (HostInfo hi : this.hosts) { + if (first) { + first = false; + user = hi.getUser(); + password = hi.getPassword(); + hasPriority = hi.getHostProperties().containsKey(PropertyKey.PRIORITY.getKeyName()); + } else { + if (!StringUtils.nullSafeEqual(user, hi.getUser()) || !StringUtils.nullSafeEqual(password, hi.getPassword())) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.14", new Object[] { Type.XDEVAPI_SESSION.getScheme() })); + } + if (hasPriority ^ hi.getHostProperties().containsKey(PropertyKey.PRIORITY.getKeyName())) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.15", new Object[] { Type.XDEVAPI_SESSION.getScheme() })); + } + } + if (hasPriority) { + try { + int priority = Integer.parseInt(hi.getProperty(PropertyKey.PRIORITY.getKeyName())); + if (priority < 0 || priority > 100) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.16", new Object[] { Type.XDEVAPI_SESSION.getScheme() })); + } + if (priorities.contains(priority)) { + this.hasDuplicatedPriorities = true; + } else { + priorities.add(priority); + } + } catch (NumberFormatException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, + Messages.getString("ConnectionString.16", new Object[] { Type.XDEVAPI_SESSION.getScheme() })); + } + } + } + + // Sort the hosts list according to their priority settings. + if (hasPriority) { + this.prioritySorted = true; + this.hosts.sort( + Comparator.comparing(hi -> Integer.parseInt(hi.getHostProperties().get(PropertyKey.PRIORITY.getKeyName()))).reversed()); + } + } + + @Override + protected void preprocessPerTypeHostProperties(Map hostProps) { + if (hostProps.containsKey(PropertyKey.ADDRESS.getKeyName())) { + String address = hostProps.get(PropertyKey.ADDRESS.getKeyName()); + Pair hostPortPair = ConnectionUrlParser.parseHostPortPair(address); + String host = safeTrim(hostPortPair.left); + Integer port = hostPortPair.right; + if (!isNullOrEmpty(host) && !hostProps.containsKey(PropertyKey.HOST.getKeyName())) { + hostProps.put(PropertyKey.HOST.getKeyName(), host); + } + if (port != -1 && !hostProps.containsKey(PropertyKey.PORT.getKeyName())) { + hostProps.put(PropertyKey.PORT.getKeyName(), port.toString()); + } + } + } + + @Override + public int getDefaultPort() { + return DEFAULT_PORT; + } + + @Override + protected void fixProtocolDependencies(Map hostProps) { + // Not needed. Abort this operation. + } + + @Override + public List getHostsList(HostsListView view) { + if (this.prioritySorted) { + if (this.hasDuplicatedPriorities) { // Randomly sort hosts with same priority. + Map> hostsByPriority = this.hosts.stream() + .collect(Collectors.groupingBy(hi -> Integer.valueOf(hi.getHostProperties().get(PropertyKey.PRIORITY.getKeyName())))); + this.hosts = hostsByPriority.entrySet().stream() + .sorted(Comparator.>, Integer>comparing(Entry::getKey).reversed()).map(Entry::getValue) + .peek(Collections::shuffle).flatMap(List::stream).collect(Collectors.toList()); + } + } else { // Random sorted. + Collections.shuffle(this.hosts); + } + return super.getHostsList(view); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiDnsSrvConnectionUrl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiDnsSrvConnectionUrl.java new file mode 100644 index 0000000..2a416e7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/conf/url/XDevApiDnsSrvConnectionUrl.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2019, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.conf.url; + +import static com.mysql.cj.util.StringUtils.isNullOrEmpty; +import static com.mysql.cj.util.StringUtils.safeTrim; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.BooleanPropertyDefinition; +import com.mysql.cj.conf.ConnectionUrl; +import com.mysql.cj.conf.ConnectionUrlParser; +import com.mysql.cj.conf.ConnectionUrlParser.Pair; +import com.mysql.cj.conf.HostInfo; +import com.mysql.cj.conf.HostsListView; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.InvalidConnectionAttributeException; + +public class XDevApiDnsSrvConnectionUrl extends ConnectionUrl { + private static final String DEFAULT_HOST = ""; + private static final int DEFAULT_PORT = HostInfo.NO_PORT; + + /** + * Constructs an instance of {@link XDevApiDnsSrvConnectionUrl}, performing all the required initializations. + * + * @param connStrParser + * a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string + * @param info + * the connection arguments map + */ + public XDevApiDnsSrvConnectionUrl(ConnectionUrlParser connStrParser, Properties info) { + super(connStrParser, info); + this.type = Type.XDEVAPI_DNS_SRV_SESSION; + + /* + * Validate the hosts list: + * 1. One host (SRV service name) must be provided. + * 2. No more than one host (SRV service name) can be provided. + * 3. No port can be provided, i.e., port number must be equals to DEFAULT_PORT. + * 4. If property 'xdevapi.dns-srv' is set then it cannot be "false". + */ + HostInfo srvHost = super.getMainHost(); + Map hostProps = srvHost.getHostProperties(); + if (DEFAULT_HOST.equals(srvHost.getHost())) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.18")); + } + if (this.hosts.size() != 1) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.19")); + } + if (srvHost.getPort() != DEFAULT_PORT) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, Messages.getString("ConnectionString.22")); + } + if (hostProps.containsKey(PropertyKey.xdevapiDnsSrv.getKeyName())) { + if (!BooleanPropertyDefinition.booleanFrom(PropertyKey.xdevapiDnsSrv.getKeyName(), hostProps.get(PropertyKey.xdevapiDnsSrv.getKeyName()), null)) { + throw ExceptionFactory.createException(InvalidConnectionAttributeException.class, + Messages.getString("ConnectionString.23", new Object[] { PropertyKey.xdevapiDnsSrv.getKeyName() })); + } + } + } + + @Override + protected void preprocessPerTypeHostProperties(Map hostProps) { + if (hostProps.containsKey(PropertyKey.ADDRESS.getKeyName())) { + String address = hostProps.get(PropertyKey.ADDRESS.getKeyName()); + Pair hostPortPair = ConnectionUrlParser.parseHostPortPair(address); + String host = safeTrim(hostPortPair.left); + Integer port = hostPortPair.right; + if (!isNullOrEmpty(host) && !hostProps.containsKey(PropertyKey.HOST.getKeyName())) { + hostProps.put(PropertyKey.HOST.getKeyName(), host); + } + if (port != -1 && !hostProps.containsKey(PropertyKey.PORT.getKeyName())) { + hostProps.put(PropertyKey.PORT.getKeyName(), port.toString()); + } + } + } + + @Override + public String getDefaultHost() { + return DEFAULT_HOST; + } + + @Override + public int getDefaultPort() { + return DEFAULT_PORT; + } + + @Override + protected void fixProtocolDependencies(Map hostProps) { + // Not needed. Abort this operation. + } + + /** + * Returns a hosts list built from the result of the DNS SRV lookup for the original host name. + * + * @param view + * the type of the view to use in the returned list of hosts. This argument is ignored in this implementation. + * + * @return + * the hosts list from the result of the DNS SRV lookup, filtered for the given view. + */ + @Override + public List getHostsList(HostsListView view) { + return getHostsListFromDnsSrv(getMainHost()); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/BaseMetricsHolder.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/BaseMetricsHolder.java new file mode 100644 index 0000000..c3f86e5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/BaseMetricsHolder.java @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2017, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +public class BaseMetricsHolder { + + private final static int HISTOGRAM_BUCKETS = 20; + + /** + * If gathering metrics, what was the execution time of the longest query so + * far ? + */ + private long longestQueryTimeMs = 0; + + private long maximumNumberTablesAccessed = 0; + + private long minimumNumberTablesAccessed = Long.MAX_VALUE; + + /** When was the last time we reported metrics? */ + //private long metricsLastReportedMs; + + private long numberOfPreparedExecutes = 0; + + private long numberOfPrepares = 0; + + private long numberOfQueriesIssued = 0; + + private long numberOfResultSetsCreated = 0; + + private long[] numTablesMetricsHistBreakpoints; + + private int[] numTablesMetricsHistCounts; + + private long[] oldHistBreakpoints = null; + + private int[] oldHistCounts = null; + + private long shortestQueryTimeMs = Long.MAX_VALUE; + + private double totalQueryTimeMs = 0; + + private long[] perfMetricsHistBreakpoints; + + private int[] perfMetricsHistCounts; + + private long queryTimeCount; + private double queryTimeSum; + private double queryTimeSumSquares; + private double queryTimeMean; + + private void createInitialHistogram(long[] breakpoints, long lowerBound, long upperBound) { + + double bucketSize = (((double) upperBound - (double) lowerBound) / HISTOGRAM_BUCKETS) * 1.25; + + if (bucketSize < 1) { + bucketSize = 1; + } + + for (int i = 0; i < HISTOGRAM_BUCKETS; i++) { + breakpoints[i] = lowerBound; + lowerBound += bucketSize; + } + } + + private void addToHistogram(int[] histogramCounts, long[] histogramBreakpoints, long value, int numberOfTimes, long currentLowerBound, + long currentUpperBound) { + if (histogramCounts == null) { + createInitialHistogram(histogramBreakpoints, currentLowerBound, currentUpperBound); + } else { + for (int i = 0; i < HISTOGRAM_BUCKETS; i++) { + if (histogramBreakpoints[i] >= value) { + histogramCounts[i] += numberOfTimes; + + break; + } + } + } + } + + private void addToPerformanceHistogram(long value, int numberOfTimes) { + checkAndCreatePerformanceHistogram(); + + addToHistogram(this.perfMetricsHistCounts, this.perfMetricsHistBreakpoints, value, numberOfTimes, + this.shortestQueryTimeMs == Long.MAX_VALUE ? 0 : this.shortestQueryTimeMs, this.longestQueryTimeMs); + } + + private void addToTablesAccessedHistogram(long value, int numberOfTimes) { + checkAndCreateTablesAccessedHistogram(); + + addToHistogram(this.numTablesMetricsHistCounts, this.numTablesMetricsHistBreakpoints, value, numberOfTimes, + this.minimumNumberTablesAccessed == Long.MAX_VALUE ? 0 : this.minimumNumberTablesAccessed, this.maximumNumberTablesAccessed); + } + + private void checkAndCreatePerformanceHistogram() { + if (this.perfMetricsHistCounts == null) { + this.perfMetricsHistCounts = new int[HISTOGRAM_BUCKETS]; + } + + if (this.perfMetricsHistBreakpoints == null) { + this.perfMetricsHistBreakpoints = new long[HISTOGRAM_BUCKETS]; + } + } + + private void checkAndCreateTablesAccessedHistogram() { + if (this.numTablesMetricsHistCounts == null) { + this.numTablesMetricsHistCounts = new int[HISTOGRAM_BUCKETS]; + } + + if (this.numTablesMetricsHistBreakpoints == null) { + this.numTablesMetricsHistBreakpoints = new long[HISTOGRAM_BUCKETS]; + } + } + + /** + * @param queryTimeMs + * query execution time in milliseconds + */ + public void registerQueryExecutionTime(long queryTimeMs) { + if (queryTimeMs > this.longestQueryTimeMs) { + this.longestQueryTimeMs = queryTimeMs; + + repartitionPerformanceHistogram(); + } + + addToPerformanceHistogram(queryTimeMs, 1); + + if (queryTimeMs < this.shortestQueryTimeMs) { + this.shortestQueryTimeMs = (queryTimeMs == 0) ? 1 : queryTimeMs; + } + + this.numberOfQueriesIssued++; + + this.totalQueryTimeMs += queryTimeMs; + } + + private void repartitionHistogram(int[] histCounts, long[] histBreakpoints, long currentLowerBound, long currentUpperBound) { + + if (this.oldHistCounts == null) { + this.oldHistCounts = new int[histCounts.length]; + this.oldHistBreakpoints = new long[histBreakpoints.length]; + } + + System.arraycopy(histCounts, 0, this.oldHistCounts, 0, histCounts.length); + + System.arraycopy(histBreakpoints, 0, this.oldHistBreakpoints, 0, histBreakpoints.length); + + createInitialHistogram(histBreakpoints, currentLowerBound, currentUpperBound); + + for (int i = 0; i < HISTOGRAM_BUCKETS; i++) { + addToHistogram(histCounts, histBreakpoints, this.oldHistBreakpoints[i], this.oldHistCounts[i], currentLowerBound, currentUpperBound); + } + } + + private void repartitionPerformanceHistogram() { + checkAndCreatePerformanceHistogram(); + + repartitionHistogram(this.perfMetricsHistCounts, this.perfMetricsHistBreakpoints, + this.shortestQueryTimeMs == Long.MAX_VALUE ? 0 : this.shortestQueryTimeMs, this.longestQueryTimeMs); + } + + private void repartitionTablesAccessedHistogram() { + checkAndCreateTablesAccessedHistogram(); + + repartitionHistogram(this.numTablesMetricsHistCounts, this.numTablesMetricsHistBreakpoints, + this.minimumNumberTablesAccessed == Long.MAX_VALUE ? 0 : this.minimumNumberTablesAccessed, this.maximumNumberTablesAccessed); + } + + public void reportMetrics(Log log) { + StringBuilder logMessage = new StringBuilder(256); + + logMessage.append("** Performance Metrics Report **\n"); + logMessage.append("\nLongest reported query: " + this.longestQueryTimeMs + " ms"); + logMessage.append("\nShortest reported query: " + this.shortestQueryTimeMs + " ms"); + logMessage.append("\nAverage query execution time: " + (this.totalQueryTimeMs / this.numberOfQueriesIssued) + " ms"); + logMessage.append("\nNumber of statements executed: " + this.numberOfQueriesIssued); + logMessage.append("\nNumber of result sets created: " + this.numberOfResultSetsCreated); + logMessage.append("\nNumber of statements prepared: " + this.numberOfPrepares); + logMessage.append("\nNumber of prepared statement executions: " + this.numberOfPreparedExecutes); + + if (this.perfMetricsHistBreakpoints != null) { + logMessage.append("\n\n\tTiming Histogram:\n"); + int maxNumPoints = 20; + int highestCount = Integer.MIN_VALUE; + + for (int i = 0; i < (HISTOGRAM_BUCKETS); i++) { + if (this.perfMetricsHistCounts[i] > highestCount) { + highestCount = this.perfMetricsHistCounts[i]; + } + } + + if (highestCount == 0) { + highestCount = 1; // avoid DIV/0 + } + + for (int i = 0; i < (HISTOGRAM_BUCKETS - 1); i++) { + + if (i == 0) { + logMessage.append("\n\tless than " + this.perfMetricsHistBreakpoints[i + 1] + " ms: \t" + this.perfMetricsHistCounts[i]); + } else { + logMessage.append("\n\tbetween " + this.perfMetricsHistBreakpoints[i] + " and " + this.perfMetricsHistBreakpoints[i + 1] + " ms: \t" + + this.perfMetricsHistCounts[i]); + } + + logMessage.append("\t"); + + int numPointsToGraph = (int) (maxNumPoints * ((double) this.perfMetricsHistCounts[i] / highestCount)); + + for (int j = 0; j < numPointsToGraph; j++) { + logMessage.append("*"); + } + + if (this.longestQueryTimeMs < this.perfMetricsHistCounts[i + 1]) { + break; + } + } + + if (this.perfMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 2] < this.longestQueryTimeMs) { + logMessage.append("\n\tbetween "); + logMessage.append(this.perfMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 2]); + logMessage.append(" and "); + logMessage.append(this.perfMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 1]); + logMessage.append(" ms: \t"); + logMessage.append(this.perfMetricsHistCounts[HISTOGRAM_BUCKETS - 1]); + } + } + + if (this.numTablesMetricsHistBreakpoints != null) { + logMessage.append("\n\n\tTable Join Histogram:\n"); + int maxNumPoints = 20; + int highestCount = Integer.MIN_VALUE; + + for (int i = 0; i < (HISTOGRAM_BUCKETS); i++) { + if (this.numTablesMetricsHistCounts[i] > highestCount) { + highestCount = this.numTablesMetricsHistCounts[i]; + } + } + + if (highestCount == 0) { + highestCount = 1; // avoid DIV/0 + } + + for (int i = 0; i < (HISTOGRAM_BUCKETS - 1); i++) { + + if (i == 0) { + logMessage.append("\n\t" + this.numTablesMetricsHistBreakpoints[i + 1] + " tables or less: \t\t" + this.numTablesMetricsHistCounts[i]); + } else { + logMessage.append("\n\tbetween " + this.numTablesMetricsHistBreakpoints[i] + " and " + this.numTablesMetricsHistBreakpoints[i + 1] + + " tables: \t" + this.numTablesMetricsHistCounts[i]); + } + + logMessage.append("\t"); + + int numPointsToGraph = (int) (maxNumPoints * ((double) this.numTablesMetricsHistCounts[i] / highestCount)); + + for (int j = 0; j < numPointsToGraph; j++) { + logMessage.append("*"); + } + + if (this.maximumNumberTablesAccessed < this.numTablesMetricsHistBreakpoints[i + 1]) { + break; + } + } + + if (this.numTablesMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 2] < this.maximumNumberTablesAccessed) { + logMessage.append("\n\tbetween "); + logMessage.append(this.numTablesMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 2]); + logMessage.append(" and "); + logMessage.append(this.numTablesMetricsHistBreakpoints[HISTOGRAM_BUCKETS - 1]); + logMessage.append(" tables: "); + logMessage.append(this.numTablesMetricsHistCounts[HISTOGRAM_BUCKETS - 1]); + } + } + + log.logInfo(logMessage); + + //this.metricsLastReportedMs = System.currentTimeMillis(); + } + + ///** + // * Reports currently collected metrics if this feature is enabled and the + // * timeout has passed. + // */ + //protected void reportMetricsIfNeeded() { + // if (this.gatherPerfMetrics.getValue()) { + // if ((System.currentTimeMillis() - this.metricsLastReportedMs) > getPropertySet() + // .getIntegerReadableProperty(PropertyDefinitions.PNAME_reportMetricsIntervalMillis).getValue()) { + // reportMetrics(); + // } + // } + //} + + public void reportNumberOfTablesAccessed(int numTablesAccessed) { + if (numTablesAccessed < this.minimumNumberTablesAccessed) { + this.minimumNumberTablesAccessed = numTablesAccessed; + } + + if (numTablesAccessed > this.maximumNumberTablesAccessed) { + this.maximumNumberTablesAccessed = numTablesAccessed; + + repartitionTablesAccessedHistogram(); + } + + addToTablesAccessedHistogram(numTablesAccessed, 1); + } + + public void incrementNumberOfPreparedExecutes() { + this.numberOfPreparedExecutes++; + + // We need to increment this, because server-side prepared statements bypass any execution by the connection itself... + this.numberOfQueriesIssued++; + } + + public void incrementNumberOfPrepares() { + this.numberOfPrepares++; + } + + public void incrementNumberOfResultSetsCreated() { + this.numberOfResultSetsCreated++; + } + + public void reportQueryTime(long millisOrNanos) { + this.queryTimeCount++; + this.queryTimeSum += millisOrNanos; + this.queryTimeSumSquares += (millisOrNanos * millisOrNanos); + this.queryTimeMean = ((this.queryTimeMean * (this.queryTimeCount - 1)) + millisOrNanos) / this.queryTimeCount; + } + + /** + * Update statistics that allows the driver to determine if a query is slow enough to be logged, + * and return the estimation result for millisOrNanos value. + *

    + * Used in case autoSlowLog=true. + * + * @param millisOrNanos + * query execution time + * @return true if millisOrNanos is outside the 99th percentile? + */ + public boolean checkAbonormallyLongQuery(long millisOrNanos) { + boolean res = false; + if (this.queryTimeCount > 14) { // need a minimum amount for this to make sense + double stddev = Math.sqrt((this.queryTimeSumSquares - ((this.queryTimeSum * this.queryTimeSum) / this.queryTimeCount)) / (this.queryTimeCount - 1)); + res = millisOrNanos > (this.queryTimeMean + 5 * stddev); + } + reportQueryTime(millisOrNanos); + return res; + + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LogFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LogFactory.java new file mode 100644 index 0000000..8d273e0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LogFactory.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.util.Util; + +/** + * Creates instances of loggers for the driver to use. + */ +public class LogFactory { + + /** + * Returns a logger instance of the given class, with the given instance + * name. + * + * @param className + * the class to instantiate + * @param instanceName + * the instance name + * @return a logger instance + */ + public static Log getLogger(String className, String instanceName) { + + if (className == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Logger class can not be NULL"); + } + + if (instanceName == null) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Logger instance name can not be NULL"); + } + + try { + Class loggerClass = null; + + try { + loggerClass = Class.forName(className); + } catch (ClassNotFoundException nfe) { + loggerClass = Class.forName(Util.getPackageName(LogFactory.class) + "." + className); + } + + Constructor constructor = loggerClass.getConstructor(new Class[] { String.class }); + + return (Log) constructor.newInstance(new Object[] { instanceName }); + } catch (ClassNotFoundException cnfe) { + throw ExceptionFactory.createException(WrongArgumentException.class, "Unable to load class for logger '" + className + "'", cnfe); + } catch (NoSuchMethodException nsme) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Logger class does not have a single-arg constructor that takes an instance name", nsme); + } catch (InstantiationException inse) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Unable to instantiate logger class '" + className + "', exception in constructor?", inse); + } catch (InvocationTargetException ite) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Unable to instantiate logger class '" + className + "', exception in constructor?", ite); + } catch (IllegalAccessException iae) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Unable to instantiate logger class '" + className + "', constructor not public", iae); + } catch (ClassCastException cce) { + throw ExceptionFactory.createException(WrongArgumentException.class, + "Logger class '" + className + "' does not implement the '" + Log.class.getName() + "' interface", cce); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LoggingProfilerEventHandler.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LoggingProfilerEventHandler.java new file mode 100644 index 0000000..a387bd9 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/LoggingProfilerEventHandler.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2007, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import com.mysql.cj.Constants; +import com.mysql.cj.Query; +import com.mysql.cj.Session; +import com.mysql.cj.protocol.Resultset; + +/** + * A profile event handler that just logs to the standard main.logging mechanism of the driver. + */ +public class LoggingProfilerEventHandler implements ProfilerEventHandler { + private Log logger; + + public LoggingProfilerEventHandler() { + } + + public void consumeEvent(ProfilerEvent evt) { + switch (evt.getEventType()) { + case ProfilerEvent.TYPE_USAGE: + this.logger.logWarn(evt); + break; + + default: + this.logger.logInfo(evt); + break; + } + } + + public void destroy() { + this.logger = null; + } + + public void init(Log log) { + this.logger = log; + } + + @Override + public void processEvent(byte eventType, Session session, Query query, Resultset resultSet, long eventDuration, Throwable eventCreationPoint, + String message) { + + consumeEvent(new ProfilerEventImpl(eventType, // + session == null ? "" : session.getHostInfo().getHost(), // + session == null ? "" : session.getHostInfo().getDatabase(), // + session == null ? ProfilerEvent.NA : session.getThreadId(), // + query == null ? ProfilerEvent.NA : query.getId(), // + resultSet == null ? ProfilerEvent.NA : resultSet.getResultId(), // + eventDuration, // + session == null ? Constants.MILLIS_I18N : session.getQueryTimingUnits(), // + eventCreationPoint, message)); + + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/ProfilerEventImpl.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/ProfilerEventImpl.java new file mode 100644 index 0000000..67a2014 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/log/ProfilerEventImpl.java @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.log; + +import java.util.Date; + +import com.mysql.cj.util.LogUtils; +import com.mysql.cj.util.StringUtils; + +public class ProfilerEventImpl implements ProfilerEvent { + + private byte eventType; + private String hostName; + private String database; + private long connectionId; + private int statementId; + private int resultSetId; + private long eventCreationTime; + private long eventDuration; + private String durationUnits; + private String eventCreationPointDesc; + private String message; + + /** + * Creates a new profiler event + * + * @param eventType + * the event type (from the constants TYPE_????) + * @param hostName + * the hostname where the event occurs + * @param db + * the database in use + * @param connectionId + * the connection id (-1 if N/A) + * @param statementId + * the statement id (-1 if N/A) + * @param resultSetId + * the result set id (-1 if N/A) + * @param eventDuration + * how long did the event last? + * @param durationUnits + * time units user for eventDuration + * @param eventCreationPoint + * event creation point as a Throwable + * @param message + * optional message + */ + public ProfilerEventImpl(byte eventType, String hostName, String db, long connectionId, int statementId, int resultSetId, long eventDuration, + String durationUnits, Throwable eventCreationPoint, String message) { + this(eventType, hostName, db, connectionId, statementId, resultSetId, System.currentTimeMillis(), eventDuration, durationUnits, + LogUtils.findCallingClassAndMethod(eventCreationPoint), message); + } + + private ProfilerEventImpl(byte eventType, String hostName, String db, long connectionId, int statementId, int resultSetId, long eventCreationTime, + long eventDuration, String durationUnits, String eventCreationPointDesc, String message) { + // null-strings are stored as empty strings to get consistent results with pack/unpack + this.eventType = eventType; + this.hostName = hostName == null ? "" : hostName; + this.database = db == null ? "" : db; + this.connectionId = connectionId; + this.statementId = statementId; + this.resultSetId = resultSetId; + this.eventCreationTime = eventCreationTime; + this.eventDuration = eventDuration; + this.durationUnits = durationUnits == null ? "" : durationUnits; + this.eventCreationPointDesc = eventCreationPointDesc == null ? "" : eventCreationPointDesc; + this.message = message == null ? "" : message; + } + + @Override + public byte getEventType() { + return this.eventType; + } + + @Override + public String getHostName() { + return this.hostName; + } + + @Override + public String getDatabase() { + return this.database; + } + + @Override + public long getConnectionId() { + return this.connectionId; + } + + @Override + public int getStatementId() { + return this.statementId; + } + + @Override + public int getResultSetId() { + return this.resultSetId; + } + + @Override + public long getEventCreationTime() { + return this.eventCreationTime; + } + + @Override + public long getEventDuration() { + return this.eventDuration; + } + + @Override + public String getDurationUnits() { + return this.durationUnits; + } + + @Override + public String getEventCreationPointAsString() { + return this.eventCreationPointDesc; + } + + @Override + public String getMessage() { + return this.message; + } + + /** + * Returns a representation of this event as a String. + * + * @return a String representation of this event. + */ + @Override + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("["); + + switch (this.getEventType()) { + case TYPE_EXECUTE: + buf.append("EXECUTE"); + break; + case TYPE_FETCH: + buf.append("FETCH"); + break; + case TYPE_OBJECT_CREATION: + buf.append("CONSTRUCT"); + break; + case TYPE_PREPARE: + buf.append("PREPARE"); + break; + case TYPE_QUERY: + buf.append("QUERY"); + break; + case TYPE_USAGE: + buf.append("USAGE ADVISOR"); + break; + case TYPE_SLOW_QUERY: + buf.append("SLOW QUERY"); + break; + default: + buf.append("UNKNOWN"); + } + buf.append("] "); + + buf.append(this.message); + + buf.append(" [Created on: "); + buf.append(new Date(this.eventCreationTime)); + buf.append(", duration: "); + buf.append(this.eventDuration); + buf.append(", connection-id: "); + buf.append(this.connectionId); + buf.append(", statement-id: "); + buf.append(this.statementId); + buf.append(", resultset-id: "); + buf.append(this.resultSetId); + buf.append(","); + buf.append(this.eventCreationPointDesc); + buf.append("]"); + + return buf.toString(); + } + + /** + * Unpacks a binary representation of this event. + * + * @param buf + * the binary representation of this event + * @return the unpacked Event + */ + public static ProfilerEvent unpack(byte[] buf) { + int pos = 0; + + byte eventType = buf[pos++]; + + byte[] host = readBytes(buf, pos); + pos += 4 + host.length; + + byte[] db = readBytes(buf, pos); + pos += 4 + db.length; + + long connectionId = readLong(buf, pos); + pos += 8; + int statementId = readInt(buf, pos); + pos += 4; + int resultSetId = readInt(buf, pos); + pos += 4; + long eventCreationTime = readLong(buf, pos); + pos += 8; + long eventDuration = readLong(buf, pos); + pos += 8; + + byte[] eventDurationUnits = readBytes(buf, pos); + pos += 4 + eventDurationUnits.length; + + byte[] eventCreationAsBytes = readBytes(buf, pos); + pos += 4 + eventCreationAsBytes.length; + + byte[] message = readBytes(buf, pos); + pos += 4 + message.length; + + // TODO charset? + return new ProfilerEventImpl(eventType, StringUtils.toString(host, "ISO8859_1"), StringUtils.toString(db, "ISO8859_1"), connectionId, statementId, + resultSetId, eventCreationTime, eventDuration, StringUtils.toString(eventDurationUnits, "ISO8859_1"), + StringUtils.toString(eventCreationAsBytes, "ISO8859_1"), StringUtils.toString(message, "ISO8859_1")); + } + + public byte[] pack() { + + // TODO charset (Bug#41172 ?) + byte[] hostNameAsBytes = StringUtils.getBytes(this.hostName, "ISO8859_1"); + byte[] dbAsBytes = StringUtils.getBytes(this.database, "ISO8859_1"); + byte[] durationUnitsAsBytes = StringUtils.getBytes(this.durationUnits, "ISO8859_1"); + byte[] eventCreationAsBytes = StringUtils.getBytes(this.eventCreationPointDesc, "ISO8859_1"); + byte[] messageAsBytes = StringUtils.getBytes(this.message, "ISO8859_1"); + + int len = /* eventType */ 1 + /* hostName */ (4 + hostNameAsBytes.length) + + /* db */ (4 + dbAsBytes.length) + /* connectionId */ 8 + + /* statementId */ 4 + /* resultSetId */ 4 + /* eventCreationTime */ 8 + /* eventDuration */ 8 + + /* durationUnits */ (4 + durationUnitsAsBytes.length) + /* eventCreationPointDesc */ (4 + eventCreationAsBytes.length) + + /* message */ (4 + messageAsBytes.length); + + byte[] buf = new byte[len]; + int pos = 0; + buf[pos++] = this.eventType; + pos = writeBytes(hostNameAsBytes, buf, pos); + pos = writeBytes(dbAsBytes, buf, pos); + pos = writeLong(this.connectionId, buf, pos); + pos = writeInt(this.statementId, buf, pos); + pos = writeInt(this.resultSetId, buf, pos); + pos = writeLong(this.eventCreationTime, buf, pos); + pos = writeLong(this.eventDuration, buf, pos); + pos = writeBytes(durationUnitsAsBytes, buf, pos); + pos = writeBytes(eventCreationAsBytes, buf, pos); + pos = writeBytes(messageAsBytes, buf, pos); + + return buf; + } + + private static int writeInt(int i, byte[] buf, int pos) { + buf[pos++] = (byte) (i & 0xff); + buf[pos++] = (byte) (i >>> 8); + buf[pos++] = (byte) (i >>> 16); + buf[pos++] = (byte) (i >>> 24); + return pos; + } + + private static int writeLong(long l, byte[] buf, int pos) { + buf[pos++] = (byte) (l & 0xff); + buf[pos++] = (byte) (l >>> 8); + buf[pos++] = (byte) (l >>> 16); + buf[pos++] = (byte) (l >>> 24); + buf[pos++] = (byte) (l >>> 32); + buf[pos++] = (byte) (l >>> 40); + buf[pos++] = (byte) (l >>> 48); + buf[pos++] = (byte) (l >>> 56); + return pos; + } + + private static int writeBytes(byte[] msg, byte[] buf, int pos) { + pos = writeInt(msg.length, buf, pos); + System.arraycopy(msg, 0, buf, pos, msg.length); + return pos + msg.length; + } + + private static int readInt(byte[] buf, int pos) { + return (buf[pos++] & 0xff) | ((buf[pos++] & 0xff) << 8) | ((buf[pos++] & 0xff) << 16) | ((buf[pos++] & 0xff) << 24); + } + + private static long readLong(byte[] buf, int pos) { + return (buf[pos++] & 0xff) | ((long) (buf[pos++] & 0xff) << 8) | ((long) (buf[pos++] & 0xff) << 16) | ((long) (buf[pos++] & 0xff) << 24) + | ((long) (buf[pos++] & 0xff) << 32) | ((long) (buf[pos++] & 0xff) << 40) | ((long) (buf[pos++] & 0xff) << 48) + | ((long) (buf[pos++] & 0xff) << 56); + } + + private static byte[] readBytes(byte[] buf, int pos) { + int length = readInt(buf, pos); + byte[] msg = new byte[length]; + System.arraycopy(buf, pos + 4, msg, 0, length); + return msg; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractProtocol.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractProtocol.java new file mode 100644 index 0000000..704d559 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractProtocol.java @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.lang.ref.WeakReference; +import java.util.LinkedList; +import java.util.concurrent.CopyOnWriteArrayList; + +import com.mysql.cj.MessageBuilder; +import com.mysql.cj.Messages; +import com.mysql.cj.Session; +import com.mysql.cj.TransactionEventHandler; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.log.Log; +import com.mysql.cj.protocol.Protocol.ProtocolEventHandler; +import com.mysql.cj.protocol.Protocol.ProtocolEventListener.EventType; +import com.mysql.cj.util.TimeUtil; + +public abstract class AbstractProtocol implements Protocol, ProtocolEventHandler { + + protected Session session; + protected SocketConnection socketConnection; + + protected PropertySet propertySet; + + protected TransactionEventHandler transactionManager; + + /** The logger we're going to use */ + protected transient Log log; + + protected ExceptionInterceptor exceptionInterceptor; + + protected AuthenticationProvider authProvider; + + protected MessageBuilder messageBuilder; + + // Default until packet sender created + private PacketSentTimeHolder packetSentTimeHolder = new PacketSentTimeHolder() { + }; + private PacketReceivedTimeHolder packetReceivedTimeHolder = new PacketReceivedTimeHolder() { + }; + + protected LinkedList packetDebugRingBuffer = null; + + protected boolean useNanosForElapsedTime; + protected String queryTimingUnits; + + private CopyOnWriteArrayList> listeners = new CopyOnWriteArrayList<>(); + + @Override + public void init(Session sess, SocketConnection phConnection, PropertySet propSet, TransactionEventHandler trManager) { + this.session = sess; + this.propertySet = propSet; + + this.socketConnection = phConnection; + this.exceptionInterceptor = this.socketConnection.getExceptionInterceptor(); + + this.transactionManager = trManager; + + this.useNanosForElapsedTime = this.propertySet.getBooleanProperty(PropertyKey.useNanosForElapsedTime).getValue() && TimeUtil.nanoTimeAvailable(); + this.queryTimingUnits = this.useNanosForElapsedTime ? Messages.getString("Nanoseconds") : Messages.getString("Milliseconds"); + + } + + public SocketConnection getSocketConnection() { + return this.socketConnection; + } + + public AuthenticationProvider getAuthenticationProvider() { + return this.authProvider; + } + + public ExceptionInterceptor getExceptionInterceptor() { + return this.exceptionInterceptor; + } + + public PacketSentTimeHolder getPacketSentTimeHolder() { + return this.packetSentTimeHolder; + } + + public void setPacketSentTimeHolder(PacketSentTimeHolder packetSentTimeHolder) { + this.packetSentTimeHolder = packetSentTimeHolder; + } + + public PacketReceivedTimeHolder getPacketReceivedTimeHolder() { + return this.packetReceivedTimeHolder; + } + + public void setPacketReceivedTimeHolder(PacketReceivedTimeHolder packetReceivedTimeHolder) { + this.packetReceivedTimeHolder = packetReceivedTimeHolder; + } + + public PropertySet getPropertySet() { + return this.propertySet; + } + + public void setPropertySet(PropertySet propertySet) { + this.propertySet = propertySet; + } + + @Override + public MessageBuilder getMessageBuilder() { + return this.messageBuilder; + } + + @Override + public void reset() { + // no-op + } + + @Override + public String getQueryTimingUnits() { + return this.queryTimingUnits; + } + + @Override + public void addListener(ProtocolEventListener l) { + this.listeners.addIfAbsent(new WeakReference<>(l)); + } + + @Override + public void removeListener(ProtocolEventListener listener) { + for (WeakReference wr : this.listeners) { + ProtocolEventListener l = wr.get(); + if (l == listener) { + this.listeners.remove(wr); + break; + } + } + } + + @Override + public void invokeListeners(EventType type, Throwable reason) { + for (WeakReference wr : this.listeners) { + ProtocolEventListener l = wr.get(); + if (l != null) { + l.handleEvent(type, this, reason); + } else { + this.listeners.remove(wr); + } + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractSocketConnection.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractSocketConnection.java new file mode 100644 index 0000000..bca7532 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/AbstractSocketConnection.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.Socket; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.CJException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.UnableToConnectException; +import com.mysql.jdbc.SocketFactoryWrapper; + +public abstract class AbstractSocketConnection implements SocketConnection { + + protected String host = null; + protected int port = 3306; + protected SocketFactory socketFactory = null; + protected Socket mysqlSocket = null; + protected FullReadInputStream mysqlInput = null; + protected BufferedOutputStream mysqlOutput = null; + + protected ExceptionInterceptor exceptionInterceptor; + protected PropertySet propertySet; + + public String getHost() { + return this.host; + } + + public int getPort() { + return this.port; + } + + public Socket getMysqlSocket() { + return this.mysqlSocket; + } + + public FullReadInputStream getMysqlInput() throws IOException { + if (this.mysqlInput != null) { + return this.mysqlInput; + } + throw new IOException(Messages.getString("SocketConnection.2")); + } + + public void setMysqlInput(FullReadInputStream mysqlInput) { + this.mysqlInput = mysqlInput; + } + + public BufferedOutputStream getMysqlOutput() throws IOException { + if (this.mysqlOutput != null) { + return this.mysqlOutput; + } + throw new IOException(Messages.getString("SocketConnection.2")); + } + + public boolean isSSLEstablished() { + return ExportControlled.enabled() && ExportControlled.isSSLEstablished(this.getMysqlSocket()); + } + + public SocketFactory getSocketFactory() { + return this.socketFactory; + } + + public void setSocketFactory(SocketFactory socketFactory) { + this.socketFactory = socketFactory; + } + + /** + * Forcibly closes the underlying socket to MySQL. + */ + public void forceClose() { + try { + getNetworkResources().forceClose(); + } finally { + this.mysqlSocket = null; + this.mysqlInput = null; + this.mysqlOutput = null; + } + } + + // We do this to break the chain between MysqlIO and Connection, so that we can have PhantomReferences on connections that let the driver clean up the + // socket connection without having to use finalize() somewhere (which although more straightforward, is horribly inefficient). + public NetworkResources getNetworkResources() { + return new NetworkResources(this.mysqlSocket, this.mysqlInput, this.mysqlOutput); + } + + public ExceptionInterceptor getExceptionInterceptor() { + return this.exceptionInterceptor; + } + + public PropertySet getPropertySet() { + return this.propertySet; + } + + protected SocketFactory createSocketFactory(String socketFactoryClassName) { + try { + if (socketFactoryClassName == null) { + throw ExceptionFactory.createException(UnableToConnectException.class, Messages.getString("SocketConnection.0"), getExceptionInterceptor()); + } + + Object sf = Class.forName(socketFactoryClassName).newInstance(); + if (sf instanceof SocketFactory) { + return (SocketFactory) (Class.forName(socketFactoryClassName).newInstance()); + } + + // wrap legacy socket factories + return new SocketFactoryWrapper(sf); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | CJException ex) { + throw ExceptionFactory.createException(UnableToConnectException.class, + Messages.getString("SocketConnection.1", new String[] { socketFactoryClassName }), getExceptionInterceptor()); + } + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ExportControlled.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ExportControlled.java new file mode 100644 index 0000000..ffd21ac --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ExportControlled.java @@ -0,0 +1,725 @@ +/* + * Copyright (c) 2002, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.Socket; +import java.net.URL; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.KeyFactory; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.Signature; +import java.security.SignatureException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertPath; +import java.security.cert.CertPathValidator; +import java.security.cert.CertPathValidatorException; +import java.security.cert.CertPathValidatorResult; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.PKIXCertPathValidatorResult; +import java.security.cert.PKIXParameters; +import java.security.cert.TrustAnchor; +import java.security.cert.X509CertSelector; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collection; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.naming.InvalidNameException; +import javax.naming.ldap.LdapName; +import javax.naming.ldap.Rdn; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; +import javax.security.auth.x500.X500Principal; + +import com.mysql.cj.ServerVersion; +import com.mysql.cj.conf.PropertyDefinitions; +import com.mysql.cj.conf.PropertyDefinitions.SslMode; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.exceptions.CJCommunicationsException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.exceptions.FeatureNotAvailableException; +import com.mysql.cj.exceptions.RSAException; +import com.mysql.cj.exceptions.SSLParamsException; +import com.mysql.cj.log.Log; +import com.mysql.cj.util.Base64Decoder; +import com.mysql.cj.util.StringUtils; + +/** + * Holds functionality that falls under export-control regulations. + */ +public class ExportControlled { + private static final String TLSv1 = "TLSv1"; + private static final String TLSv1_1 = "TLSv1.1"; + private static final String TLSv1_2 = "TLSv1.2"; + private static final String TLSv1_3 = "TLSv1.3"; + private static final String[] KNOWN_TLS_PROTOCOLS = new String[] { TLSv1_3, TLSv1_2, TLSv1_1, TLSv1 }; + private static final String[] VALID_TLS_PROTOCOLS = new String[] { TLSv1_3, TLSv1_2 }; + + private static final String TLS_SETTINGS_RESOURCE = "/com/mysql/cj/TlsSettings.properties"; + private static final List ALLOWED_CIPHERS = new ArrayList<>(); + private static final List RESTRICTED_CIPHER_SUBSTR = new ArrayList<>(); + + static { + try { + Properties tlsSettings = new Properties(); + tlsSettings.load(ExportControlled.class.getResourceAsStream(TLS_SETTINGS_RESOURCE)); + // Ciphers prefixed with "TLS_" are used by Oracle Java while the ones prefixed with "SSL_" are used by IBM Java + Arrays.stream(tlsSettings.getProperty("TLSCiphers.Mandatory").split("\\s*,\\s*")).forEach(s -> { + ALLOWED_CIPHERS.add("TLS_" + s.trim()); + ALLOWED_CIPHERS.add("SSL_" + s.trim()); + }); + Arrays.stream(tlsSettings.getProperty("TLSCiphers.Approved").split("\\s*,\\s*")).forEach(s -> { + ALLOWED_CIPHERS.add("TLS_" + s.trim()); + ALLOWED_CIPHERS.add("SSL_" + s.trim()); + }); + Arrays.stream(tlsSettings.getProperty("TLSCiphers.Deprecated").split("\\s*,\\s*")).forEach(s -> { + ALLOWED_CIPHERS.add("TLS_" + s.trim()); + ALLOWED_CIPHERS.add("SSL_" + s.trim()); + }); + Arrays.stream(tlsSettings.getProperty("TLSCiphers.Unacceptable.Mask").split("\\s*,\\s*")).forEach(s -> RESTRICTED_CIPHER_SUBSTR.add(s.trim())); + } catch (IOException e) { + throw ExceptionFactory.createException("Unable to load TlsSettings.properties"); + } + } + + private ExportControlled() { /* prevent instantiation */ + } + + public static boolean enabled() { + // we may wish to un-static-ify this class this static method call may be removed entirely by the compiler + return true; + } + + private static String[] getAllowedCiphers(PropertySet pset, List socketCipherSuites) { + String enabledSSLCipherSuites = pset.getStringProperty(PropertyKey.tlsCiphersuites).getValue(); + Stream filterStream = StringUtils.isNullOrEmpty(enabledSSLCipherSuites) ? socketCipherSuites.stream() + : Arrays.stream(enabledSSLCipherSuites.split("\\s*,\\s*")).filter(socketCipherSuites::contains); + + List allowedCiphers = filterStream + // mandatory, approved and deprecated ciphers + .filter(ALLOWED_CIPHERS::contains) + // unacceptable ciphers + .filter(c -> !RESTRICTED_CIPHER_SUBSTR.stream().filter(r -> c.contains(r)).findFirst().isPresent()) + // + .collect(Collectors.toList()); + + return allowedCiphers.toArray(new String[] {}); + } + + private static String[] getAllowedProtocols(PropertySet pset, @SuppressWarnings("unused") ServerVersion serverVersion, String[] socketProtocols) { + List tryProtocols = null; + + RuntimeProperty tlsVersions = pset.getStringProperty(PropertyKey.tlsVersions); + if (tlsVersions != null && tlsVersions.isExplicitlySet()) { + // If tlsVersions configuration option is set then override the default TLS versions restriction. + if (tlsVersions.getValue() == null) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Specified list of TLS versions is empty. Accepted values are TLSv1.2 and TLSv1.3."); + } + tryProtocols = getValidProtocols(tlsVersions.getValue().split("\\s*,\\s*")); + } else { + tryProtocols = new ArrayList<>(Arrays.asList(VALID_TLS_PROTOCOLS)); + } + + List jvmSupportedProtocols = Arrays.asList(socketProtocols); + List allowedProtocols = new ArrayList<>(); + for (String protocol : tryProtocols) { + if (jvmSupportedProtocols.contains(protocol)) { + allowedProtocols.add(protocol); + } + } + return allowedProtocols.toArray(new String[0]); + } + + private static List getValidProtocols(String[] protocols) { + + List requestedProtocols = Arrays.stream(protocols).filter(p -> !StringUtils.isNullOrEmpty(p.trim())).collect(Collectors.toList()); + if (requestedProtocols.size() == 0) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Specified list of TLS versions is empty. Accepted values are TLSv1.2 and TLSv1.3."); + } + + List sanitizedProtocols = new ArrayList<>(); + for (String protocol : KNOWN_TLS_PROTOCOLS) { + if (requestedProtocols.contains(protocol)) { + sanitizedProtocols.add(protocol); + } + } + if (sanitizedProtocols.size() == 0) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Specified list of TLS versions only contains non valid TLS protocols. Accepted values are TLSv1.2 and TLSv1.3."); + } + + List validProtocols = new ArrayList<>(); + for (String protocol : VALID_TLS_PROTOCOLS) { + if (sanitizedProtocols.contains(protocol)) { + validProtocols.add(protocol); + } + } + if (validProtocols.size() == 0) { + throw ExceptionFactory.createException(SSLParamsException.class, + "TLS protocols TLSv1 and TLSv1.1 are not supported. Accepted values are TLSv1.2 and TLSv1.3."); + } + + return validProtocols; + } + + public static void checkValidProtocols(List protocols) { + getValidProtocols(protocols.toArray(new String[0])); + } + + private static class KeyStoreConf { + public String keyStoreUrl = null; + public String keyStorePassword = null; + public String keyStoreType = "JKS"; + + public KeyStoreConf() { + } + + public KeyStoreConf(String keyStoreUrl, String keyStorePassword, String keyStoreType) { + this.keyStoreUrl = keyStoreUrl; + this.keyStorePassword = keyStorePassword; + this.keyStoreType = keyStoreType; + } + } + + private static KeyStoreConf getTrustStoreConf(PropertySet propertySet, boolean required) { + String trustStoreUrl = propertySet.getStringProperty(PropertyKey.trustCertificateKeyStoreUrl).getValue(); + String trustStorePassword = propertySet.getStringProperty(PropertyKey.trustCertificateKeyStorePassword).getValue(); + String trustStoreType = propertySet.getStringProperty(PropertyKey.trustCertificateKeyStoreType).getValue(); + boolean fallbackToSystemTrustStore = propertySet.getBooleanProperty(PropertyKey.fallbackToSystemTrustStore).getValue(); + + if (fallbackToSystemTrustStore && StringUtils.isNullOrEmpty(trustStoreUrl)) { + trustStoreUrl = System.getProperty("javax.net.ssl.trustStore"); + trustStorePassword = System.getProperty("javax.net.ssl.trustStorePassword"); + trustStoreType = System.getProperty("javax.net.ssl.trustStoreType"); + if (StringUtils.isNullOrEmpty(trustStoreType)) { + trustStoreType = propertySet.getStringProperty(PropertyKey.trustCertificateKeyStoreType).getInitialValue(); + } + // check URL + if (!StringUtils.isNullOrEmpty(trustStoreUrl)) { + try { + new URL(trustStoreUrl); + } catch (MalformedURLException e) { + trustStoreUrl = "file:" + trustStoreUrl; + } + } + } + + if (required && StringUtils.isNullOrEmpty(trustStoreUrl)) { + throw new CJCommunicationsException("No truststore provided to verify the Server certificate."); + } + + return new KeyStoreConf(trustStoreUrl, trustStorePassword, trustStoreType); + } + + private static KeyStoreConf getKeyStoreConf(PropertySet propertySet) { + String keyStoreUrl = propertySet.getStringProperty(PropertyKey.clientCertificateKeyStoreUrl).getValue(); + String keyStorePassword = propertySet.getStringProperty(PropertyKey.clientCertificateKeyStorePassword).getValue(); + String keyStoreType = propertySet.getStringProperty(PropertyKey.clientCertificateKeyStoreType).getValue(); + boolean fallbackToSystemKeyStore = propertySet.getBooleanProperty(PropertyKey.fallbackToSystemKeyStore).getValue(); + + if (fallbackToSystemKeyStore && StringUtils.isNullOrEmpty(keyStoreUrl)) { + keyStoreUrl = System.getProperty("javax.net.ssl.keyStore"); + keyStorePassword = System.getProperty("javax.net.ssl.keyStorePassword"); + keyStoreType = System.getProperty("javax.net.ssl.keyStoreType"); + if (StringUtils.isNullOrEmpty(keyStoreType)) { + keyStoreType = propertySet.getStringProperty(PropertyKey.clientCertificateKeyStoreType).getInitialValue(); + } + // check URL + if (!StringUtils.isNullOrEmpty(keyStoreUrl)) { + try { + new URL(keyStoreUrl); + } catch (MalformedURLException e) { + keyStoreUrl = "file:" + keyStoreUrl; + } + } + } + + return new KeyStoreConf(keyStoreUrl, keyStorePassword, keyStoreType); + } + + /** + * Converts the socket being used in the given SocketConnection to an SSLSocket by performing the SSL/TLS handshake. + * + * @param rawSocket + * original non-SSL socket + * @param socketConnection + * the Protocol instance containing the socket to convert to an SSLSocket. + * @param serverVersion + * ServerVersion object + * @param log + * Logger + * @return SSL socket + * @throws IOException + * if i/o exception occurs + * @throws SSLParamsException + * if the handshake fails, or if this distribution of Connector/J doesn't contain the SSL crypto hooks needed to perform the handshake. + * @throws FeatureNotAvailableException + * if TLS is not supported + */ + public static Socket performTlsHandshake(Socket rawSocket, SocketConnection socketConnection, ServerVersion serverVersion, Log log) + throws IOException, SSLParamsException, FeatureNotAvailableException { + PropertySet pset = socketConnection.getPropertySet(); + + SslMode sslMode = pset.getEnumProperty(PropertyKey.sslMode).getValue(); + boolean verifyServerCert = sslMode == SslMode.VERIFY_CA || sslMode == SslMode.VERIFY_IDENTITY; + boolean fallbackToSystemTrustStore = pset.getBooleanProperty(PropertyKey.fallbackToSystemTrustStore).getValue(); + + // (serverVersion == null) means that it was called from the X DevAPI. + KeyStoreConf trustStore = !verifyServerCert ? new KeyStoreConf() + : getTrustStoreConf(pset, serverVersion == null && verifyServerCert && !fallbackToSystemTrustStore); + KeyStoreConf keyStore = getKeyStoreConf(pset); + + SSLSocketFactory socketFactory = getSSLContext(keyStore, trustStore, fallbackToSystemTrustStore, verifyServerCert, + sslMode == PropertyDefinitions.SslMode.VERIFY_IDENTITY ? socketConnection.getHost() : null, socketConnection.getExceptionInterceptor()) + .getSocketFactory(); + + SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(rawSocket, socketConnection.getHost(), socketConnection.getPort(), true); + + String[] allowedProtocols = getAllowedProtocols(pset, serverVersion, sslSocket.getSupportedProtocols()); + sslSocket.setEnabledProtocols(allowedProtocols); + + String[] allowedCiphers = getAllowedCiphers(pset, Arrays.asList(sslSocket.getEnabledCipherSuites())); + if (allowedCiphers != null) { + sslSocket.setEnabledCipherSuites(allowedCiphers); + } + + sslSocket.startHandshake(); + return sslSocket; + } + + /** + * Implementation of X509TrustManager wrapping JVM X509TrustManagers to add expiration and identity check + */ + public static class X509TrustManagerWrapper implements X509TrustManager { + private X509TrustManager origTm = null; + private boolean verifyServerCert = false; + private String hostName = null; + private CertificateFactory certFactory = null; + private PKIXParameters validatorParams = null; + private CertPathValidator validator = null; + + public X509TrustManagerWrapper(X509TrustManager tm, boolean verifyServerCertificate, String hostName) throws CertificateException { + this.origTm = tm; + this.verifyServerCert = verifyServerCertificate; + this.hostName = hostName; + + if (verifyServerCertificate) { + try { + Set anch = Arrays.stream(tm.getAcceptedIssuers()).map(c -> new TrustAnchor(c, null)).collect(Collectors.toSet()); + this.validatorParams = new PKIXParameters(anch); + this.validatorParams.setRevocationEnabled(false); + this.validator = CertPathValidator.getInstance("PKIX"); + this.certFactory = CertificateFactory.getInstance("X.509"); + } catch (Exception e) { + throw new CertificateException(e); + } + } + + } + + public X509TrustManagerWrapper(boolean verifyServerCertificate, String hostName) { + this.verifyServerCert = verifyServerCertificate; + this.hostName = hostName; + } + + public X509Certificate[] getAcceptedIssuers() { + return this.origTm != null ? this.origTm.getAcceptedIssuers() : new X509Certificate[0]; + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + for (int i = 0; i < chain.length; i++) { + chain[i].checkValidity(); + } + + if (this.validatorParams != null) { + X509CertSelector certSelect = new X509CertSelector(); + certSelect.setSerialNumber(chain[0].getSerialNumber()); + + try { + CertPath certPath = this.certFactory.generateCertPath(Arrays.asList(chain)); + // Validate against the truststore. + CertPathValidatorResult result = this.validator.validate(certPath, this.validatorParams); + // Check expiration for the CA used to validate this path. + ((PKIXCertPathValidatorResult) result).getTrustAnchor().getTrustedCert().checkValidity(); + } catch (InvalidAlgorithmParameterException e) { + throw new CertificateException(e); + } catch (CertPathValidatorException e) { + throw new CertificateException(e); + } + } + + if (this.verifyServerCert) { + if (this.origTm != null) { + this.origTm.checkServerTrusted(chain, authType); + } else { + throw new CertificateException("Can't verify server certificate because no trust manager is found."); + } + + // Validate server identity. + if (this.hostName != null) { + boolean hostNameVerified = false; + + // Check each one of the DNS-ID (or IP) entries from the certificate 'subjectAltName' field. + // See https://tools.ietf.org/html/rfc6125#section-6.4 and https://tools.ietf.org/html/rfc2818#section-3.1 + final Collection> subjectAltNames = chain[0].getSubjectAlternativeNames(); + if (subjectAltNames != null) { + boolean sanVerification = false; + for (final List san : subjectAltNames) { + final Integer nameType = (Integer) san.get(0); + // dNSName [2] IA5String + // iPAddress [7] OCTET STRING + if (nameType == 2) { + sanVerification = true; + if (verifyHostName((String) san.get(1))) { // May contain a wildcard char. + // Host name is valid. + hostNameVerified = true; + break; + } + } else if (nameType == 7) { + sanVerification = true; + if (this.hostName.equalsIgnoreCase((String) san.get(1))) { + // Host name (IP) is valid. + hostNameVerified = true; + break; + } + } + } + if (sanVerification && !hostNameVerified) { + throw new CertificateException("Server identity verification failed. " + + "None of the DNS or IP Subject Alternative Name entries matched the server hostname/IP '" + this.hostName + "'."); + } + } + + if (!hostNameVerified) { + // Fall-back to checking the Relative Distinguished Name CN-ID (Common Name/CN) from the certificate 'subject' field. + // https://tools.ietf.org/html/rfc6125#section-6.4.4 + final String dn = chain[0].getSubjectX500Principal().getName(X500Principal.RFC2253); + String cn = null; + try { + LdapName ldapDN = new LdapName(dn); + for (Rdn rdn : ldapDN.getRdns()) { + if (rdn.getType().equalsIgnoreCase("CN")) { + cn = rdn.getValue().toString(); + break; + } + } + } catch (InvalidNameException e) { + throw new CertificateException("Failed to retrieve the Common Name (CN) from the server certificate."); + } + + if (!verifyHostName(cn)) { + throw new CertificateException( + "Server identity verification failed. The certificate Common Name '" + cn + "' does not match '" + this.hostName + "'."); + } + } + } + } + + // Nothing else to validate. + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + this.origTm.checkClientTrusted(chain, authType); + } + + /** + * Verify the host name against the given pattern, using the rules specified in RFC 6125, + * Section 6.4.3. Support wildcard character as defined in the RFC. + * + * @param ptn + * the pattern to match with the host name. + * @return + * true if the host name matches the pattern, false otherwise. + */ + private boolean verifyHostName(String ptn) { + final int indexOfStar = ptn.indexOf('*'); + if (indexOfStar >= 0 && indexOfStar < ptn.indexOf('.')) { + final String head = ptn.substring(0, indexOfStar); + final String tail = ptn.substring(indexOfStar + 1); + + return StringUtils.startsWithIgnoreCase(this.hostName, head) && StringUtils.endsWithIgnoreCase(this.hostName, tail) + && this.hostName.substring(head.length(), this.hostName.length() - tail.length()).indexOf('.') == -1; + } + return this.hostName.equalsIgnoreCase(ptn); + } + } + + /** + * Configure the {@link SSLContext} based on the supplier property set. + * + * @param clientCertificateKeyStore + * clientCertificateKeyStore + * @param trustCertificateKeyStore + * trustCertificateKeyStore + * @param fallbackToDefaultTrustStore + * fallbackToDefaultTrustStore + * @param verifyServerCert + * verifyServerCert + * @param hostName + * host name + * @param exceptionInterceptor + * exception interceptor + * @return SSLContext + * @throws SSLParamsException + * if an error occurs + */ + public static SSLContext getSSLContext(KeyStoreConf clientCertificateKeyStore, KeyStoreConf trustCertificateKeyStore, boolean fallbackToDefaultTrustStore, + boolean verifyServerCert, String hostName, ExceptionInterceptor exceptionInterceptor) throws SSLParamsException { + String clientCertificateKeyStoreUrl = clientCertificateKeyStore.keyStoreUrl; + String clientCertificateKeyStoreType = clientCertificateKeyStore.keyStoreType; + String clientCertificateKeyStorePassword = clientCertificateKeyStore.keyStorePassword; + String trustCertificateKeyStoreUrl = trustCertificateKeyStore.keyStoreUrl; + String trustCertificateKeyStoreType = trustCertificateKeyStore.keyStoreType; + String trustCertificateKeyStorePassword = trustCertificateKeyStore.keyStorePassword; + + TrustManagerFactory tmf = null; + KeyManagerFactory kmf = null; + + KeyManager[] kms = null; + List tms = new ArrayList<>(); + + try { + tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + } catch (NoSuchAlgorithmException nsae) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Default algorithm definitions for TrustManager and/or KeyManager are invalid. Check java security properties file.", nsae, + exceptionInterceptor); + } + + if (!StringUtils.isNullOrEmpty(clientCertificateKeyStoreUrl)) { + InputStream ksIS = null; + try { + if (!StringUtils.isNullOrEmpty(clientCertificateKeyStoreType)) { + KeyStore clientKeyStore = KeyStore.getInstance(clientCertificateKeyStoreType); + URL ksURL = new URL(clientCertificateKeyStoreUrl); + char[] password = (clientCertificateKeyStorePassword == null) ? new char[0] : clientCertificateKeyStorePassword.toCharArray(); + ksIS = ksURL.openStream(); + clientKeyStore.load(ksIS, password); + kmf.init(clientKeyStore, password); + kms = kmf.getKeyManagers(); + } + } catch (UnrecoverableKeyException uke) { + throw ExceptionFactory.createException(SSLParamsException.class, "Could not recover keys from client keystore. Check password?", uke, + exceptionInterceptor); + } catch (NoSuchAlgorithmException nsae) { + throw ExceptionFactory.createException(SSLParamsException.class, "Unsupported keystore algorithm [" + nsae.getMessage() + "]", nsae, + exceptionInterceptor); + } catch (KeyStoreException kse) { + throw ExceptionFactory.createException(SSLParamsException.class, "Could not create KeyStore instance [" + kse.getMessage() + "]", kse, + exceptionInterceptor); + } catch (CertificateException nsae) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Could not load client" + clientCertificateKeyStoreType + " keystore from " + clientCertificateKeyStoreUrl, nsae, exceptionInterceptor); + } catch (MalformedURLException mue) { + throw ExceptionFactory.createException(SSLParamsException.class, clientCertificateKeyStoreUrl + " does not appear to be a valid URL.", mue, + exceptionInterceptor); + } catch (IOException ioe) { + throw ExceptionFactory.createException(SSLParamsException.class, "Cannot open " + clientCertificateKeyStoreUrl + " [" + ioe.getMessage() + "]", + ioe, exceptionInterceptor); + } finally { + if (ksIS != null) { + try { + ksIS.close(); + } catch (IOException e) { + // can't close input stream, but keystore can be properly initialized so we shouldn't throw this exception + } + } + } + } + + InputStream trustStoreIS = null; + try { + String trustStoreType = ""; + char[] trustStorePassword = null; + KeyStore trustKeyStore = null; + + if (!StringUtils.isNullOrEmpty(trustCertificateKeyStoreUrl) && !StringUtils.isNullOrEmpty(trustCertificateKeyStoreType)) { + trustStoreType = trustCertificateKeyStoreType; + trustStorePassword = (trustCertificateKeyStorePassword == null) ? new char[0] : trustCertificateKeyStorePassword.toCharArray(); + trustStoreIS = new URL(trustCertificateKeyStoreUrl).openStream(); + + trustKeyStore = KeyStore.getInstance(trustStoreType); + trustKeyStore.load(trustStoreIS, trustStorePassword); + } + + if (trustKeyStore != null || verifyServerCert && fallbackToDefaultTrustStore) { + tmf.init(trustKeyStore); // (trustKeyStore == null) initializes the TrustManagerFactory with the default truststore. + + // building the customized list of TrustManagers from original one if it's available + TrustManager[] origTms = tmf.getTrustManagers(); + + for (TrustManager tm : origTms) { + // wrap X509TrustManager or put original if non-X509 TrustManager + tms.add(tm instanceof X509TrustManager ? new X509TrustManagerWrapper((X509TrustManager) tm, verifyServerCert, hostName) : tm); + } + } + } catch (MalformedURLException e) { + throw ExceptionFactory.createException(SSLParamsException.class, trustCertificateKeyStoreUrl + " does not appear to be a valid URL.", e, + exceptionInterceptor); + } catch (NoSuchAlgorithmException e) { + throw ExceptionFactory.createException(SSLParamsException.class, "Unsupported keystore algorithm [" + e.getMessage() + "]", e, + exceptionInterceptor); + } catch (KeyStoreException e) { + throw ExceptionFactory.createException(SSLParamsException.class, "Could not create KeyStore instance [" + e.getMessage() + "]", e, + exceptionInterceptor); + } catch (CertificateException e) { + throw ExceptionFactory.createException(SSLParamsException.class, + "Could not load trust" + trustCertificateKeyStoreType + " keystore from " + trustCertificateKeyStoreUrl, e, exceptionInterceptor); + } catch (IOException e) { + throw ExceptionFactory.createException(SSLParamsException.class, "Cannot open " + trustCertificateKeyStoreUrl + " [" + e.getMessage() + "]", e, + exceptionInterceptor); + } finally { + if (trustStoreIS != null) { + try { + trustStoreIS.close(); + } catch (IOException e) { + // can't close input stream, but keystore can be properly initialized so we shouldn't throw this exception + } + } + } + + // if original TrustManagers are not available then putting one X509TrustManagerWrapper which take care only about expiration check + if (tms.size() == 0) { + tms.add(new X509TrustManagerWrapper(verifyServerCert, hostName)); + } + + try { + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(kms, tms.toArray(new TrustManager[tms.size()]), null); + + return sslContext; + + } catch (NoSuchAlgorithmException nsae) { + throw new SSLParamsException("TLS is not a valid SSL protocol.", nsae); + } catch (KeyManagementException kme) { + throw new SSLParamsException("KeyManagementException: " + kme.getMessage(), kme); + } + } + + public static boolean isSSLEstablished(Socket socket) { + return socket == null ? false : SSLSocket.class.isAssignableFrom(socket.getClass()); + } + + public static RSAPublicKey decodeRSAPublicKey(String key) throws RSAException { + if (key == null) { + throw ExceptionFactory.createException(RSAException.class, "Key parameter is null"); + } + + int offset = key.indexOf("\n") + 1; + int len = key.indexOf("-----END PUBLIC KEY-----") - offset; + + // TODO: use standard decoders with Java 6+ + byte[] certificateData = Base64Decoder.decode(key.getBytes(), offset, len); + + X509EncodedKeySpec spec = new X509EncodedKeySpec(certificateData); + try { + KeyFactory kf = KeyFactory.getInstance("RSA"); + return (RSAPublicKey) kf.generatePublic(spec); + } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { + throw ExceptionFactory.createException(RSAException.class, "Unable to decode public key", e); + } + } + + public static byte[] encryptWithRSAPublicKey(byte[] source, RSAPublicKey key, String transformation) throws RSAException { + try { + Cipher cipher = Cipher.getInstance(transformation); + cipher.init(Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(source); + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { + throw ExceptionFactory.createException(RSAException.class, e.getMessage(), e); + } + } + + public static byte[] encryptWithRSAPublicKey(byte[] source, RSAPublicKey key) throws RSAException { + return encryptWithRSAPublicKey(source, key, "RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); + } + + public static RSAPrivateKey decodeRSAPrivateKey(String key) throws RSAException { + if (key == null) { + throw ExceptionFactory.createException(RSAException.class, "Key parameter is null"); + } + + String keyData = key.replace("-----BEGIN PRIVATE KEY-----", "").replaceAll("\\R", "").replace("-----END PRIVATE KEY-----", ""); + byte[] decodedKeyData = Base64.getDecoder().decode(keyData); + + try { + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + return (RSAPrivateKey) keyFactory.generatePrivate(new PKCS8EncodedKeySpec(decodedKeyData)); + } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { + throw ExceptionFactory.createException(RSAException.class, "Unable to decode private key", e); + } + } + + public static byte[] sign(byte[] source, RSAPrivateKey privateKey) throws RSAException { + try { + Signature signature = Signature.getInstance("SHA256withRSA"); + signature.initSign(privateKey); + signature.update(source); + return signature.sign(); + } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { + throw ExceptionFactory.createException(RSAException.class, e.getMessage(), e); + } + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/NamedPipeSocketFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/NamedPipeSocketFactory.java new file mode 100644 index 0000000..1c5f077 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/NamedPipeSocketFactory.java @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2002, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.Closeable; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.net.Socket; +import java.net.SocketException; +import java.util.concurrent.TimeUnit; + +import com.mysql.cj.Messages; +import com.mysql.cj.Session; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.conf.RuntimeProperty; +import com.mysql.cj.log.Log; + +/** + * A socket factory for named pipes (on Windows) + */ +public class NamedPipeSocketFactory implements SocketFactory { + private static final int DEFAULT_TIMEOUT = 100; + + /** + * A socket that encapsulates named pipes on Windows + */ + class NamedPipeSocket extends Socket { + private boolean isClosed = false; + + private RandomAccessFile namedPipeFile; + + NamedPipeSocket(String filePath, int timeout) throws IOException { + if ((filePath == null) || (filePath.length() == 0)) { + throw new IOException(Messages.getString("NamedPipeSocketFactory.4")); + } + + int timeoutCountdown = timeout == 0 ? DEFAULT_TIMEOUT : timeout; + long startTime = System.currentTimeMillis(); + for (;;) { + try { + this.namedPipeFile = new RandomAccessFile(filePath, "rw"); + break; + } catch (FileNotFoundException e) { + if (timeout == 0) { // No timeout was set. + throw new IOException("Named pipe busy error (ERROR_PIPE_BUSY).\nConsider setting a value for " + + "'connectTimeout' or DriverManager.setLoginTimeout(int) to repeatedly try opening the named pipe before failing.", e); + } + if (System.currentTimeMillis() - startTime > timeoutCountdown) { + throw e; + } + } + try { + TimeUnit.MILLISECONDS.sleep(10); + } catch (InterruptedException e) { + throw new IOException(e); + } + } + } + + /** + * @see java.net.Socket#close() + */ + @Override + public synchronized void close() throws IOException { + this.namedPipeFile.close(); + this.isClosed = true; + } + + /** + * @see java.net.Socket#getInputStream() + */ + @Override + public InputStream getInputStream() throws IOException { + return new RandomAccessFileInputStream(this.namedPipeFile); + } + + /** + * @see java.net.Socket#getOutputStream() + */ + @Override + public OutputStream getOutputStream() throws IOException { + return new RandomAccessFileOutputStream(this.namedPipeFile); + } + + /** + * @see java.net.Socket#isClosed() + */ + @Override + public boolean isClosed() { + return this.isClosed; + } + + @Override + public void shutdownInput() throws IOException { + // no-op + } + } + + /** + * Enables OutputStream-type functionality for a RandomAccessFile + */ + class RandomAccessFileInputStream extends InputStream { + RandomAccessFile raFile; + + RandomAccessFileInputStream(RandomAccessFile file) { + this.raFile = file; + } + + /** + * @see java.io.InputStream#available() + */ + @Override + public int available() throws IOException { + return -1; + } + + /** + * @see java.io.InputStream#close() + */ + @Override + public void close() throws IOException { + this.raFile.close(); + } + + /** + * @see java.io.InputStream#read() + */ + @Override + public int read() throws IOException { + return this.raFile.read(); + } + + /** + * @see java.io.InputStream#read(byte[]) + */ + @Override + public int read(byte[] b) throws IOException { + return this.raFile.read(b); + } + + /** + * @see java.io.InputStream#read(byte[], int, int) + */ + @Override + public int read(byte[] b, int off, int len) throws IOException { + return this.raFile.read(b, off, len); + } + } + + /** + * Enables OutputStream-type functionality for a RandomAccessFile + */ + class RandomAccessFileOutputStream extends OutputStream { + RandomAccessFile raFile; + + RandomAccessFileOutputStream(RandomAccessFile file) { + this.raFile = file; + } + + /** + * @see java.io.OutputStream#close() + */ + @Override + public void close() throws IOException { + this.raFile.close(); + } + + /** + * @see java.io.OutputStream#write(byte[]) + */ + @Override + public void write(byte[] b) throws IOException { + this.raFile.write(b); + } + + /** + * @see java.io.OutputStream#write(byte[], int, int) + */ + @Override + public void write(byte[] b, int off, int len) throws IOException { + this.raFile.write(b, off, len); + } + + /** + * @see java.io.OutputStream#write(int) + */ + @Override + public void write(int b) throws IOException { + } + } + + private Socket namedPipeSocket; + + /** + * Constructor for NamedPipeSocketFactory. + */ + public NamedPipeSocketFactory() { + super(); + } + + @Override + public T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession) throws IOException { + return performTlsHandshake(socketConnection, serverSession, null); + } + + @SuppressWarnings("unchecked") + @Override + public T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession, Log log) throws IOException { + return (T) this.namedPipeSocket; + } + + @SuppressWarnings("unchecked") + @Override + public T connect(String host, int portNumber /* ignored */, PropertySet props, int loginTimeout) throws IOException { + String namedPipePath = null; + + RuntimeProperty path = props.getStringProperty(PropertyKey.PATH); + if (path != null) { + namedPipePath = path.getValue(); + } + + if (namedPipePath == null) { + namedPipePath = "\\\\.\\pipe\\MySQL"; + } else if (namedPipePath.length() == 0) { + throw new SocketException( + Messages.getString("NamedPipeSocketFactory.2") + PropertyKey.PATH.getCcAlias() + Messages.getString("NamedPipeSocketFactory.3")); + } + + int connectTimeout = props.getIntegerProperty(PropertyKey.connectTimeout.getKeyName()).getValue(); + int timeout = (connectTimeout > 0 && loginTimeout > 0) ? Math.min(connectTimeout, loginTimeout) : connectTimeout + loginTimeout; + + this.namedPipeSocket = new NamedPipeSocket(namedPipePath, timeout); + + return (T) this.namedPipeSocket; + } + + @Override + public boolean isLocallyConnected(Session sess) { + // Until I learn otherwise (or learn how to detect it), I assume that we are + return true; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ReadAheadInputStream.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ReadAheadInputStream.java new file mode 100644 index 0000000..4c939f6 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/ReadAheadInputStream.java @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import com.mysql.cj.log.Log; + +/** + * A non-blocking buffered input stream. Reads more if it can, won't block to fill the buffer, only blocks to satisfy a request of read(byte[]) + */ +public class ReadAheadInputStream extends InputStream { + + private final static int DEFAULT_BUFFER_SIZE = 4096; + + private InputStream underlyingStream; + + private byte buf[]; + + protected int endOfCurrentData; + + protected int currentPosition; + + protected boolean doDebug = false; + + protected Log log; + + private void fill(int readAtLeastTheseManyBytes) throws IOException { + checkClosed(); + + this.currentPosition = 0; /* no mark: throw away the buffer */ + + this.endOfCurrentData = this.currentPosition; + + // Read at least as many bytes as the caller wants, but don't block to fill the whole buffer (like java.io.BufferdInputStream does) + + int bytesToRead = Math.min(this.buf.length - this.currentPosition, readAtLeastTheseManyBytes); + + int bytesAvailable = this.underlyingStream.available(); + + if (bytesAvailable > bytesToRead) { + + // Great, there's more available, let's grab those bytes too! (read-ahead) + + bytesToRead = Math.min(this.buf.length - this.currentPosition, bytesAvailable); + } + + if (this.doDebug) { + StringBuilder debugBuf = new StringBuilder(); + debugBuf.append(" ReadAheadInputStream.fill("); + debugBuf.append(readAtLeastTheseManyBytes); + debugBuf.append("), buffer_size="); + debugBuf.append(this.buf.length); + debugBuf.append(", current_position="); + debugBuf.append(this.currentPosition); + debugBuf.append(", need to read "); + debugBuf.append(Math.min(this.buf.length - this.currentPosition, readAtLeastTheseManyBytes)); + debugBuf.append(" bytes to fill request,"); + + if (bytesAvailable > 0) { + debugBuf.append(" underlying InputStream reports "); + debugBuf.append(bytesAvailable); + + debugBuf.append(" total bytes available,"); + } + + debugBuf.append(" attempting to read "); + debugBuf.append(bytesToRead); + debugBuf.append(" bytes."); + + if (this.log != null) { + this.log.logTrace(debugBuf.toString()); + } else { + System.err.println(debugBuf.toString()); + } + } + + int n = this.underlyingStream.read(this.buf, this.currentPosition, bytesToRead); + + if (n > 0) { + this.endOfCurrentData = n + this.currentPosition; + } + } + + private int readFromUnderlyingStreamIfNecessary(byte[] b, int off, int len) throws IOException { + checkClosed(); + + int avail = this.endOfCurrentData - this.currentPosition; + + if (this.doDebug) { + StringBuilder debugBuf = new StringBuilder(); + debugBuf.append("ReadAheadInputStream.readIfNecessary("); + debugBuf.append(Arrays.toString(b)); + debugBuf.append(","); + debugBuf.append(off); + debugBuf.append(","); + debugBuf.append(len); + debugBuf.append(")"); + + if (avail <= 0) { + debugBuf.append(" not all data available in buffer, must read from stream"); + + if (len >= this.buf.length) { + debugBuf.append(", amount requested > buffer, returning direct read() from stream"); + } + } + + if (this.log != null) { + this.log.logTrace(debugBuf.toString()); + } else { + System.err.println(debugBuf.toString()); + } + } + + if (avail <= 0) { + + if (len >= this.buf.length) { + return this.underlyingStream.read(b, off, len); + } + + fill(len); + + avail = this.endOfCurrentData - this.currentPosition; + + if (avail <= 0) { + return -1; + } + } + + int bytesActuallyRead = (avail < len) ? avail : len; + + System.arraycopy(this.buf, this.currentPosition, b, off, bytesActuallyRead); + + this.currentPosition += bytesActuallyRead; + + return bytesActuallyRead; + } + + @Override + public synchronized int read(byte b[], int off, int len) throws IOException { + checkClosed(); // Check for closed stream + if ((off | len | (off + len) | (b.length - (off + len))) < 0) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + + int totalBytesRead = 0; + + while (true) { + int bytesReadThisRound = readFromUnderlyingStreamIfNecessary(b, off + totalBytesRead, len - totalBytesRead); + + // end-of-stream? + if (bytesReadThisRound <= 0) { + if (totalBytesRead == 0) { + totalBytesRead = bytesReadThisRound; + } + + break; + } + + totalBytesRead += bytesReadThisRound; + + // Read _at_least_ enough bytes + if (totalBytesRead >= len) { + break; + } + + // Nothing to read? + if (this.underlyingStream.available() <= 0) { + break; + } + } + + return totalBytesRead; + } + + @Override + public int read() throws IOException { + checkClosed(); + + if (this.currentPosition >= this.endOfCurrentData) { + fill(1); + if (this.currentPosition >= this.endOfCurrentData) { + return -1; + } + } + + return this.buf[this.currentPosition++] & 0xff; + } + + @Override + public int available() throws IOException { + checkClosed(); + + return this.underlyingStream.available() + (this.endOfCurrentData - this.currentPosition); + } + + private void checkClosed() throws IOException { + + if (this.buf == null) { + throw new IOException("Stream closed"); + } + } + + public ReadAheadInputStream(InputStream toBuffer, boolean debug, Log logTo) { + this(toBuffer, DEFAULT_BUFFER_SIZE, debug, logTo); + } + + public ReadAheadInputStream(InputStream toBuffer, int bufferSize, boolean debug, Log logTo) { + this.underlyingStream = toBuffer; + this.buf = new byte[bufferSize]; + this.doDebug = debug; + this.log = logTo; + } + + @Override + public void close() throws IOException { + if (this.underlyingStream != null) { + try { + this.underlyingStream.close(); + } finally { + this.underlyingStream = null; + this.buf = null; + this.log = null; + } + } + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public long skip(long n) throws IOException { + checkClosed(); + if (n <= 0) { + return 0; + } + + long bytesAvailInBuffer = this.endOfCurrentData - this.currentPosition; + + if (bytesAvailInBuffer <= 0) { + + fill((int) n); + bytesAvailInBuffer = this.endOfCurrentData - this.currentPosition; + if (bytesAvailInBuffer <= 0) { + return 0; + } + } + + long bytesSkipped = (bytesAvailInBuffer < n) ? bytesAvailInBuffer : n; + this.currentPosition += bytesSkipped; + return bytesSkipped; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/Security.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/Security.java new file mode 100644 index 0000000..61f6bd2 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/Security.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.security.DigestException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import com.mysql.cj.exceptions.AssertionFailedException; +import com.mysql.cj.util.StringUtils; + +/** + * Methods for doing secure authentication with MySQL-4.1 and newer. + */ +public class Security { + + private static int CACHING_SHA2_DIGEST_LENGTH = 32; + + /** + * Encrypt/Decrypt function used for password encryption in authentication + * + * Simple XOR is used here but it is OK as we encrypt random strings + * + * @param from + * IN Data for encryption + * @param to + * OUT Encrypt data to the buffer (may be the same) + * @param scramble + * IN Scramble used for encryption + * @param length + * IN Length of data to encrypt + */ + public static void xorString(byte[] from, byte[] to, byte[] scramble, int length) { + int pos = 0; + int scrambleLength = scramble.length; + + while (pos < length) { + to[pos] = (byte) (from[pos] ^ scramble[pos % scrambleLength]); + pos++; + } + } + + public static byte[] scramble411(String password, byte[] seed, String passwordEncoding) { + byte[] passwordBytes = (passwordEncoding == null || passwordEncoding.length() == 0) ? StringUtils.getBytes(password) + : StringUtils.getBytes(password, passwordEncoding); + return scramble411(passwordBytes, seed); + } + + /** + * Hashing for MySQL-4.1 authentication. Algorithm is as follows (c.f. sql/auth/password.c): + * + *

    +     * SERVER: public_seed=create_random_string()
    +     * send(public_seed)
    +     *
    +     * CLIENT: recv(public_seed)
    +     * hash_stage1=sha1("password")
    +     * hash_stage2=sha1(hash_stage1)
    +     * reply=xor(hash_stage1, sha1(public_seed,hash_stage2))
    +     * send(reply)
    +     * 
    + * + * @param password + * password + * @param seed + * seed + * @return bytes + */ + public static byte[] scramble411(byte[] password, byte[] seed) { + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException ex) { + throw new AssertionFailedException(ex); + } + + byte[] passwordHashStage1 = md.digest(password); + md.reset(); + + byte[] passwordHashStage2 = md.digest(passwordHashStage1); + md.reset(); + + md.update(seed); + md.update(passwordHashStage2); + + byte[] toBeXord = md.digest(); + + int numToXor = toBeXord.length; + + for (int i = 0; i < numToXor; i++) { + toBeXord[i] = (byte) (toBeXord[i] ^ passwordHashStage1[i]); + } + + return toBeXord; + } + + /** + * Scrambling for caching_sha2_password plugin. + * + *
    +     * Scramble = XOR(SHA2(password), SHA2(SHA2(SHA2(password)), Nonce))
    +     * 
    + * + * @param password + * password + * @param seed + * seed + * @return bytes + * + * @throws DigestException + * if an error occurs + */ + public static byte[] scrambleCachingSha2(byte[] password, byte[] seed) throws DigestException { + /* + * Server does it in 4 steps (see sql/auth/sha2_password_common.cc Generate_scramble::scramble method): + * + * SHA2(src) => digest_stage1 + * SHA2(digest_stage1) => digest_stage2 + * SHA2(digest_stage2, m_rnd) => scramble_stage1 + * XOR(digest_stage1, scramble_stage1) => scramble + */ + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException ex) { + throw new AssertionFailedException(ex); + } + + byte[] dig1 = new byte[CACHING_SHA2_DIGEST_LENGTH]; + byte[] dig2 = new byte[CACHING_SHA2_DIGEST_LENGTH]; + byte[] scramble1 = new byte[CACHING_SHA2_DIGEST_LENGTH]; + + // SHA2(src) => digest_stage1 + md.update(password, 0, password.length); + md.digest(dig1, 0, CACHING_SHA2_DIGEST_LENGTH); + md.reset(); + + // SHA2(digest_stage1) => digest_stage2 + md.update(dig1, 0, dig1.length); + md.digest(dig2, 0, CACHING_SHA2_DIGEST_LENGTH); + md.reset(); + + // SHA2(digest_stage2, m_rnd) => scramble_stage1 + md.update(dig2, 0, dig1.length); + md.update(seed, 0, seed.length); + md.digest(scramble1, 0, CACHING_SHA2_DIGEST_LENGTH); + + // XOR(digest_stage1, scramble_stage1) => scramble + byte[] mysqlScrambleBuff = new byte[CACHING_SHA2_DIGEST_LENGTH]; + xorString(dig1, mysqlScrambleBuff, scramble1, CACHING_SHA2_DIGEST_LENGTH); + + return mysqlScrambleBuff; + } + + /** + * Prevent construction. + */ + private Security() { + super(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/SocksProxySocketFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/SocksProxySocketFactory.java new file mode 100644 index 0000000..577caef --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/SocksProxySocketFactory.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2014, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.Closeable; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; +import java.net.Socket; +import java.net.SocketException; + +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; + +/** + * A socket factory used to create sockets connecting through a SOCKS proxy. The socket still supports all the same TCP features as the "standard" socket. + */ +public class SocksProxySocketFactory extends StandardSocketFactory { + + @Override + protected Socket createSocket(PropertySet props) { + String socksProxyHost = props.getStringProperty(PropertyKey.socksProxyHost).getValue(); + int socksProxyPort = props.getIntegerProperty(PropertyKey.socksProxyPort).getValue(); + return new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(socksProxyHost, socksProxyPort))); + } + + @Override + @SuppressWarnings("unchecked") + public T connect(String hostname, int portNumber, PropertySet pset, int loginTimeout) throws IOException { + if (!pset.getBooleanProperty(PropertyKey.socksProxyRemoteDns).getValue()) { + // fall back to the parent connection procedure + return super.connect(hostname, portNumber, pset, loginTimeout); + } + + // proceed without local DNS resolution + this.loginTimeoutCountdown = loginTimeout; + + if (pset != null && hostname != null) { + this.host = hostname; + this.port = portNumber; + + String localSocketHostname = pset.getStringProperty(PropertyKey.localSocketAddress).getValue(); + InetSocketAddress localSockAddr = localSocketHostname != null && localSocketHostname.length() > 0 + ? new InetSocketAddress(InetAddress.getByName(localSocketHostname), 0) + : null; + int connectTimeout = pset.getIntegerProperty(PropertyKey.connectTimeout).getValue(); + + // save last exception to propagate to caller if connection fails + try { + this.rawSocket = createSocket(pset); + configureSocket(this.rawSocket, pset); + + // bind to the local port if not using the ephemeral port + if (localSockAddr != null) { + this.rawSocket.bind(localSockAddr); + } + + this.rawSocket.connect(InetSocketAddress.createUnresolved(this.host, this.port), getRealTimeout(connectTimeout)); + + } catch (SocketException ex) { + this.rawSocket = null; + throw ex; + } + + resetLoginTimeCountdown(); + + this.sslSocket = this.rawSocket; + return (T) this.rawSocket; + } + + throw new SocketException("Unable to create socket"); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/StandardSocketFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/StandardSocketFactory.java new file mode 100644 index 0000000..154d04f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/StandardSocketFactory.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2002, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.Closeable; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketException; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.log.Log; + +/** + * Socket factory for vanilla TCP/IP sockets (the standard) + */ +public class StandardSocketFactory implements SocketFactory { + + /** The hostname to connect to */ + protected String host = null; + + /** The port number to connect to */ + protected int port = 3306; + + /** The underlying TCP/IP socket to use */ + protected Socket rawSocket = null; + + /** The wrapper for underlying TCP/IP socket */ + protected Socket sslSocket = null; + + /** The remaining login time in milliseconds. Initial value set from defined DriverManager.setLoginTimeout() */ + protected int loginTimeoutCountdown = 0; + + /** Time when last Login Timeout check occurred */ + protected long loginTimeoutCheckTimestamp = System.currentTimeMillis(); + + /** Backup original Socket timeout to be restored after handshake */ + protected int socketTimeoutBackup = 0; + + /** + * Create the raw socket. + * + * @param props + * properties available to affect behaviour during socket creation. + * @return socket + */ + protected Socket createSocket(PropertySet props) { + return new Socket(); + } + + /** + * Configures socket properties based on properties from the connection + * (tcpNoDelay, snd/rcv buf, traffic class, etc). + * + * @param sock + * socket + * @param pset + * properties + * @throws SocketException + * if an error occurs + * @throws IOException + * if an error occurs + */ + protected void configureSocket(Socket sock, PropertySet pset) throws SocketException, IOException { + sock.setTcpNoDelay(pset.getBooleanProperty(PropertyKey.tcpNoDelay).getValue()); + sock.setKeepAlive(pset.getBooleanProperty(PropertyKey.tcpKeepAlive).getValue()); + + int receiveBufferSize = pset.getIntegerProperty(PropertyKey.tcpRcvBuf).getValue(); + if (receiveBufferSize > 0) { + sock.setReceiveBufferSize(receiveBufferSize); + } + + int sendBufferSize = pset.getIntegerProperty(PropertyKey.tcpSndBuf).getValue(); + if (sendBufferSize > 0) { + sock.setSendBufferSize(sendBufferSize); + } + + int trafficClass = pset.getIntegerProperty(PropertyKey.tcpTrafficClass).getValue(); + if (trafficClass > 0) { + sock.setTrafficClass(trafficClass); + } + } + + @SuppressWarnings("unchecked") + public T connect(String hostname, int portNumber, PropertySet pset, int loginTimeout) throws IOException { + + this.loginTimeoutCountdown = loginTimeout; + + if (pset != null) { + this.host = hostname; + this.port = portNumber; + + String localSocketHostname = pset.getStringProperty(PropertyKey.localSocketAddress).getValue(); + InetSocketAddress localSockAddr = localSocketHostname != null && localSocketHostname.length() > 0 + ? new InetSocketAddress(InetAddress.getByName(localSocketHostname), 0) + : null; + int connectTimeout = pset.getIntegerProperty(PropertyKey.connectTimeout).getValue(); + + if (this.host != null) { + InetAddress[] possibleAddresses = InetAddress.getAllByName(this.host); + + if (possibleAddresses.length == 0) { + throw new SocketException("No addresses for host"); + } + + // save last exception to propagate to caller if connection fails + SocketException lastException = null; + + // Need to loop through all possible addresses. Name lookup may return multiple addresses including IPv4 and IPv6 addresses. Some versions of + // MySQL don't listen on the IPv6 address so we try all addresses. + for (int i = 0; i < possibleAddresses.length; i++) { + try { + this.rawSocket = createSocket(pset); + + configureSocket(this.rawSocket, pset); + + InetSocketAddress sockAddr = new InetSocketAddress(possibleAddresses[i], this.port); + // bind to the local port if not using the ephemeral port + if (localSockAddr != null) { + this.rawSocket.bind(localSockAddr); + } + + this.rawSocket.connect(sockAddr, getRealTimeout(connectTimeout)); + + break; + } catch (SocketException ex) { + lastException = ex; + resetLoginTimeCountdown(); + this.rawSocket = null; + } + } + + if (this.rawSocket == null && lastException != null) { + throw lastException; + } + + resetLoginTimeCountdown(); + + this.sslSocket = this.rawSocket; + return (T) this.rawSocket; + } + } + + throw new SocketException("Unable to create socket"); + } + + public void beforeHandshake() throws IOException { + resetLoginTimeCountdown(); + this.socketTimeoutBackup = this.rawSocket.getSoTimeout(); + this.rawSocket.setSoTimeout(getRealTimeout(this.socketTimeoutBackup)); + } + + @Override + public T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession) throws IOException { + return performTlsHandshake(socketConnection, serverSession, null); + } + + @SuppressWarnings("unchecked") + @Override + public T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession, Log log) throws IOException { + this.sslSocket = ExportControlled.performTlsHandshake(this.rawSocket, socketConnection, serverSession == null ? null : serverSession.getServerVersion(), + log); + return (T) this.sslSocket; + } + + public void afterHandshake() throws IOException { + resetLoginTimeCountdown(); + this.rawSocket.setSoTimeout(this.socketTimeoutBackup); + } + + /** + * Decrements elapsed time since last reset from login timeout count down. + * + * @throws SocketException + * If the login timeout is reached or exceeded. + */ + protected void resetLoginTimeCountdown() throws SocketException { + if (this.loginTimeoutCountdown > 0) { + long now = System.currentTimeMillis(); + this.loginTimeoutCountdown -= now - this.loginTimeoutCheckTimestamp; + if (this.loginTimeoutCountdown <= 0) { + throw new SocketException(Messages.getString("Connection.LoginTimeout")); + } + this.loginTimeoutCheckTimestamp = now; + } + } + + /** + * Validates the connection/socket timeout that must really be used. + * + * @param expectedTimeout + * The timeout to validate. + * @return The timeout to be used. + */ + protected int getRealTimeout(int expectedTimeout) { + if (this.loginTimeoutCountdown > 0 && (expectedTimeout == 0 || expectedTimeout > this.loginTimeoutCountdown)) { + return this.loginTimeoutCountdown; + } + return expectedTimeout; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableOutputStream.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableOutputStream.java new file mode 100644 index 0000000..44bf1fd --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableOutputStream.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * A java.io.OutputStream used to write ASCII data into Blobs and Clobs + */ +public class WatchableOutputStream extends ByteArrayOutputStream implements WatchableStream { + private OutputStreamWatcher watcher; + + /** + * @see java.io.OutputStream#close() + */ + @Override + public void close() throws IOException { + super.close(); + + if (this.watcher != null) { + this.watcher.streamClosed(this); + } + } + + public void setWatcher(OutputStreamWatcher watcher) { + this.watcher = watcher; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableWriter.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableWriter.java new file mode 100644 index 0000000..7eb4cfe --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WatchableWriter.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +import java.io.CharArrayWriter; + +/** + * A java.io.Writer used to write unicode data into Blobs and Clobs + */ +public class WatchableWriter extends CharArrayWriter { + private WriterWatcher watcher; + + /** + * @see java.io.Writer#close() + */ + @Override + public void close() { + super.close(); + + // Send data to watcher + if (this.watcher != null) { + this.watcher.writerClosed(this); + } + } + + /** + * @param watcher + * {@link WriterWatcher} + */ + public void setWatcher(WriterWatcher watcher) { + this.watcher = watcher; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WriterWatcher.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WriterWatcher.java new file mode 100644 index 0000000..0aeac95 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/WriterWatcher.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2002, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol; + +/** + * Objects that want to be notified of lifecycle events on a WatchableWriter should implement this interface, and register themselves with setWatcher() on the + * WatchableWriter instance. + */ +public interface WriterWatcher { + /** + * Called when the Writer being watched has .close() called + * + * @param out + * WatchableWriter instance + */ + void writerClosed(WatchableWriter out); +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/result/AbstractResultsetRow.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/result/AbstractResultsetRow.java new file mode 100644 index 0000000..13aab0f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/protocol/result/AbstractResultsetRow.java @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2007, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.protocol.result; + +import com.mysql.cj.Messages; +import com.mysql.cj.MysqlType; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.exceptions.ExceptionInterceptor; +import com.mysql.cj.protocol.ColumnDefinition; +import com.mysql.cj.protocol.ResultsetRow; +import com.mysql.cj.protocol.ValueDecoder; +import com.mysql.cj.result.Field; +import com.mysql.cj.result.Row; +import com.mysql.cj.result.ValueFactory; + +public abstract class AbstractResultsetRow implements ResultsetRow { + protected ExceptionInterceptor exceptionInterceptor; + + protected AbstractResultsetRow(ExceptionInterceptor exceptionInterceptor) { + this.exceptionInterceptor = exceptionInterceptor; + } + + /** + * The metadata of the fields of this result set. + */ + protected ColumnDefinition metadata; + + protected ValueDecoder valueDecoder; + + /** Did the previous value retrieval find a NULL? */ + protected boolean wasNull; + + /** + * Decode the wire-level result bytes and call the value factory. + * + * @param columnIndex + * column index + * @param bytes + * bytes array with result data + * @param offset + * offset in array + * @param length + * data length + * @param vf + * {@link ValueFactory} + * @param + * value type + * @return value + */ + private T decodeAndCreateReturnValue(int columnIndex, byte[] bytes, int offset, int length, ValueFactory vf) { + Field f = this.metadata.getFields()[columnIndex]; + + // First, figure out which decoder method to call basing on the protocol value type from metadata; + // it's the best way to find the appropriate decoder, we can't rely completely on MysqlType here + // because the same MysqlType can be represented by different protocol types and also DatabaseMetaData methods, + // eg. buildResultSet(), could imply unexpected conversions when substitutes RowData in ResultSet; + switch (f.getMysqlTypeId()) { + case MysqlType.FIELD_TYPE_DATETIME: + return this.valueDecoder.decodeDatetime(bytes, offset, length, f.getDecimals(), vf); + + case MysqlType.FIELD_TYPE_TIMESTAMP: + return this.valueDecoder.decodeTimestamp(bytes, offset, length, f.getDecimals(), vf); + + case MysqlType.FIELD_TYPE_DATE: + return this.valueDecoder.decodeDate(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_TIME: + return this.valueDecoder.decodeTime(bytes, offset, length, f.getDecimals(), vf); + + case MysqlType.FIELD_TYPE_TINY: + return f.isUnsigned() ? this.valueDecoder.decodeUInt1(bytes, offset, length, vf) : this.valueDecoder.decodeInt1(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_YEAR: + return this.valueDecoder.decodeYear(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_SHORT: + return f.isUnsigned() ? this.valueDecoder.decodeUInt2(bytes, offset, length, vf) : this.valueDecoder.decodeInt2(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_LONG: + return f.isUnsigned() ? this.valueDecoder.decodeUInt4(bytes, offset, length, vf) : this.valueDecoder.decodeInt4(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_INT24: + return this.valueDecoder.decodeInt4(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_LONGLONG: + return f.isUnsigned() ? this.valueDecoder.decodeUInt8(bytes, offset, length, vf) : this.valueDecoder.decodeInt8(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_FLOAT: + return this.valueDecoder.decodeFloat(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_DOUBLE: + return this.valueDecoder.decodeDouble(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_NEWDECIMAL: + case MysqlType.FIELD_TYPE_DECIMAL: + return this.valueDecoder.decodeDecimal(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_VAR_STRING: + case MysqlType.FIELD_TYPE_VARCHAR: + case MysqlType.FIELD_TYPE_STRING: + case MysqlType.FIELD_TYPE_TINY_BLOB: + case MysqlType.FIELD_TYPE_MEDIUM_BLOB: + case MysqlType.FIELD_TYPE_LONG_BLOB: + case MysqlType.FIELD_TYPE_BLOB: + case MysqlType.FIELD_TYPE_ENUM: + case MysqlType.FIELD_TYPE_GEOMETRY: + case MysqlType.FIELD_TYPE_JSON: + return this.valueDecoder.decodeByteArray(bytes, offset, length, f, vf); + + case MysqlType.FIELD_TYPE_SET: + return this.valueDecoder.decodeSet(bytes, offset, length, f, vf); + + case MysqlType.FIELD_TYPE_BIT: + return this.valueDecoder.decodeBit(bytes, offset, length, vf); + + case MysqlType.FIELD_TYPE_NULL: + return vf.createFromNull(); + } + + // If the protocol type isn't available then select decoder basing on MysqlType; that's for some internal + // code that creates rows without MySQL protocol types, only MysqlType types, including PS bindings as RS, DBMD + switch (f.getMysqlType()) { + case TINYINT: + return this.valueDecoder.decodeInt1(bytes, offset, length, vf); + case TINYINT_UNSIGNED: + return this.valueDecoder.decodeUInt1(bytes, offset, length, vf); + case SMALLINT: + return this.valueDecoder.decodeInt2(bytes, offset, length, vf); + case YEAR: + return this.valueDecoder.decodeYear(bytes, offset, length, vf); + case SMALLINT_UNSIGNED: + return this.valueDecoder.decodeUInt2(bytes, offset, length, vf); + case INT: + case MEDIUMINT: + return this.valueDecoder.decodeInt4(bytes, offset, length, vf); + case INT_UNSIGNED: + case MEDIUMINT_UNSIGNED: + return this.valueDecoder.decodeUInt4(bytes, offset, length, vf); + case BIGINT: + return this.valueDecoder.decodeInt8(bytes, offset, length, vf); + case BIGINT_UNSIGNED: + return this.valueDecoder.decodeUInt8(bytes, offset, length, vf); + case FLOAT: + case FLOAT_UNSIGNED: + return this.valueDecoder.decodeFloat(bytes, offset, length, vf); + case DOUBLE: + case DOUBLE_UNSIGNED: + return this.valueDecoder.decodeDouble(bytes, offset, length, vf); + case DECIMAL: + case DECIMAL_UNSIGNED: + return this.valueDecoder.decodeDecimal(bytes, offset, length, vf); + + case BOOLEAN: + case VARBINARY: + case VARCHAR: + case BINARY: + case CHAR: + case TINYBLOB: + case BLOB: + case MEDIUMBLOB: + case LONGBLOB: + case TINYTEXT: + case TEXT: + case MEDIUMTEXT: + case LONGTEXT: + case JSON: + case ENUM: + case SET: + case GEOMETRY: + case UNKNOWN: + return this.valueDecoder.decodeByteArray(bytes, offset, length, f, vf); + + case BIT: + return this.valueDecoder.decodeBit(bytes, offset, length, vf); + + case DATETIME: + case TIMESTAMP: + return this.valueDecoder.decodeTimestamp(bytes, offset, length, f.getDecimals(), vf); + case DATE: + return this.valueDecoder.decodeDate(bytes, offset, length, vf); + case TIME: + return this.valueDecoder.decodeTime(bytes, offset, length, f.getDecimals(), vf); + + case NULL: + return vf.createFromNull(); + + } + + throw new DataReadException(Messages.getString("ResultSet.UnknownSourceType")); + } + + /** + * Get a value from a byte array. The byte array is interpreted by the {@link com.mysql.cj.protocol.ValueDecoder} which uses the value factory create the + * return value. + * + * @param columnIndex + * The (internal) index of the column + * @param bytes + * byte array + * @param offset + * offset into byte array + * @param length + * length of value in byte array + * @param vf + * value factory + * @param + * value type + * @return value + */ + protected T getValueFromBytes(int columnIndex, byte[] bytes, int offset, int length, ValueFactory vf) { + if (getNull(columnIndex)) { + return vf.createFromNull(); + } + + // value factory may return null for zeroDateTimeBehavior=CONVERT_TO_NULL so check the return value + T retVal = decodeAndCreateReturnValue(columnIndex, bytes, offset, length, vf); + this.wasNull = (retVal == null); + return retVal; + } + + @Override + public Row setMetadata(ColumnDefinition f) { + this.metadata = f; + + return this; + } + + public boolean wasNull() { + return this.wasNull; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractDateTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractDateTimeValueFactory.java new file mode 100644 index 0000000..fa7a57a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractDateTimeValueFactory.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyDefinitions; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; +import com.mysql.cj.protocol.a.MysqlTextValueDecoder; +import com.mysql.cj.util.StringUtils; + +public abstract class AbstractDateTimeValueFactory extends DefaultValueFactory { + + public AbstractDateTimeValueFactory(PropertySet pset) { + super(pset); + } + + abstract T localCreateFromDate(InternalDate idate); + + abstract T localCreateFromTime(InternalTime it); + + abstract T localCreateFromTimestamp(InternalTimestamp its); + + abstract T localCreateFromDatetime(InternalTimestamp its); + + @Override + public T createFromDate(InternalDate idate) { + if (idate.isZero()) { + switch (this.pset.getEnumProperty(PropertyKey.zeroDateTimeBehavior).getValue()) { + case CONVERT_TO_NULL: + return null; + case ROUND: + return localCreateFromDate(new InternalDate(1, 1, 1)); + default: + break; + } + } + return localCreateFromDate(idate); + } + + @Override + public T createFromTime(InternalTime it) { + return localCreateFromTime(it); + } + + @Override + public T createFromTimestamp(InternalTimestamp its) { + if (its.isZero()) { + switch (this.pset.getEnumProperty(PropertyKey.zeroDateTimeBehavior).getValue()) { + case CONVERT_TO_NULL: + return null; + case ROUND: + return localCreateFromTimestamp(new InternalTimestamp(1, 1, 1, 0, 0, 0, 0, 0)); + default: + break; + } + } + return localCreateFromTimestamp(its); + } + + @Override + public T createFromDatetime(InternalTimestamp its) { + if (its.isZero()) { + switch (this.pset.getEnumProperty(PropertyKey.zeroDateTimeBehavior).getValue()) { + case CONVERT_TO_NULL: + return null; + case ROUND: + return localCreateFromDatetime(new InternalTimestamp(1, 1, 1, 0, 0, 0, 0, 0)); + default: + break; + } + } + return localCreateFromDatetime(its); + } + + @Override + public T createFromYear(long year) { + if (this.pset.getBooleanProperty(PropertyKey.yearIsDateType).getValue()) { + if (year < 100) { + if (year <= 69) { + year += 100; + } + year += 1900; + } + return createFromDate(new InternalDate((int) year, 1, 1)); + } + return createFromLong(year); + } + + @Override + public T createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return createFromLong(0); + } + + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (MysqlTextValueDecoder.isDate(s)) { + return createFromDate(MysqlTextValueDecoder.getDate(newBytes, 0, newBytes.length)); + + } else if (MysqlTextValueDecoder.isTime(s)) { + return createFromTime(MysqlTextValueDecoder.getTime(newBytes, 0, newBytes.length, f.getDecimals())); + + } else if (MysqlTextValueDecoder.isTimestamp(s)) { + return createFromTimestamp(MysqlTextValueDecoder.getTimestamp(newBytes, 0, newBytes.length, f.getDecimals())); + } + throw new DataConversionException(Messages.getString("ResultSet.UnableToConvertString", new Object[] { s, getTargetTypeName() })); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractNumericValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractNumericValueFactory.java new file mode 100644 index 0000000..4391fa0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/AbstractNumericValueFactory.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2019, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.protocol.a.MysqlTextValueDecoder; +import com.mysql.cj.util.StringUtils; + +public abstract class AbstractNumericValueFactory extends DefaultValueFactory { + + public AbstractNumericValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public T createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return createFromLong(0); + } + + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (s.contains("e") || s.contains("E") || s.matches("-?\\d*\\.\\d*")) { + // floating point + return createFromDouble(MysqlTextValueDecoder.getDouble(newBytes, 0, newBytes.length)); + } else if (s.matches("-?\\d+")) { + // integer + if (s.charAt(0) == '-' // TODO shouldn't we check the length as well? + || length <= (MysqlTextValueDecoder.MAX_SIGNED_LONG_LEN - 1) && newBytes[0] >= '0' && newBytes[0] <= '8') { + return createFromLong(MysqlTextValueDecoder.getLong(newBytes, 0, newBytes.length)); + } + return createFromBigInteger(MysqlTextValueDecoder.getBigInteger(newBytes, 0, newBytes.length)); + } + throw new DataConversionException(Messages.getString("ResultSet.UnableToInterpretString", new Object[] { s })); + } + + @Override + public T createFromYear(long l) { + return createFromLong(l); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BigDecimalValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BigDecimalValueFactory.java new file mode 100644 index 0000000..9bbf066 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BigDecimalValueFactory.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; + +import com.mysql.cj.conf.PropertySet; + +/** + * A value factory for creating {@link java.math.BigDecimal} values. + */ +public class BigDecimalValueFactory extends AbstractNumericValueFactory { + int scale; + boolean hasScale; + + public BigDecimalValueFactory(PropertySet pset) { + super(pset); + } + + public BigDecimalValueFactory(PropertySet pset, int scale) { + super(pset); + this.scale = scale; + this.hasScale = true; + } + + /** + * Adjust the result value by apply the scale, if appropriate. + * + * @param d + * value + * @return result + */ + private BigDecimal adjustResult(BigDecimal d) { + if (this.hasScale) { + try { + return d.setScale(this.scale); + } catch (ArithmeticException ex) { + // try this if above fails + return d.setScale(this.scale, BigDecimal.ROUND_HALF_UP); + } + } + + return d; + } + + @Override + public BigDecimal createFromBigInteger(BigInteger i) { + return adjustResult(new BigDecimal(i)); + } + + @Override + public BigDecimal createFromLong(long l) { + return adjustResult(BigDecimal.valueOf(l)); + } + + @Override + public BigDecimal createFromBigDecimal(BigDecimal d) { + return adjustResult(d); + } + + @Override + public BigDecimal createFromDouble(double d) { + return adjustResult(BigDecimal.valueOf(d)); + } + + @Override + public BigDecimal createFromBit(byte[] bytes, int offset, int length) { + return new BigDecimal(new BigInteger(ByteBuffer.allocate(length + 1).put((byte) 0).put(bytes, offset, length).array())); + } + + public String getTargetTypeName() { + return BigDecimal.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BinaryStreamValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BinaryStreamValueFactory.java new file mode 100644 index 0000000..1f1c7f5 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BinaryStreamValueFactory.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import com.mysql.cj.conf.PropertySet; + +/** + * A value factory for a raw stream of bytes from the value. + */ +public class BinaryStreamValueFactory extends DefaultValueFactory { + + public BinaryStreamValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public InputStream createFromBytes(byte[] bytes, int offset, int length, Field f) { + return new ByteArrayInputStream(bytes, offset, length); + } + + public String getTargetTypeName() { + return InputStream.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BooleanValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BooleanValueFactory.java new file mode 100644 index 0000000..b2c536f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BooleanValueFactory.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.protocol.a.MysqlTextValueDecoder; +import com.mysql.cj.util.DataTypeUtil; +import com.mysql.cj.util.StringUtils; + +/** + * A value factory for creating {@link java.lang.Boolean} values. + */ +public class BooleanValueFactory extends DefaultValueFactory { + + public BooleanValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Boolean createFromLong(long l) { + // Goes back to ODBC driver compatibility, and VB/Automation Languages/COM, where in Windows "-1" can mean true as well. + return (l == -1 || l > 0); + } + + @Override + public Boolean createFromBigInteger(BigInteger i) { + return i.compareTo(Constants.BIG_INTEGER_ZERO) > 0 || i.compareTo(Constants.BIG_INTEGER_NEGATIVE_ONE) == 0; + } + + @Override + // getBoolean() from DOUBLE, DECIMAL are required by JDBC spec.... + public Boolean createFromDouble(double d) { + // this means that 0.1 or -1 will be TRUE + return d > 0 || d == -1.0d; + } + + @Override + public Boolean createFromBigDecimal(BigDecimal d) { + // this means that 0.1 or -1 will be TRUE + return d.compareTo(Constants.BIG_DECIMAL_ZERO) > 0 || d.compareTo(Constants.BIG_DECIMAL_NEGATIVE_ONE) == 0; + } + + @Override + public Boolean createFromBit(byte[] bytes, int offset, int length) { + return createFromLong(DataTypeUtil.bitToLong(bytes, offset, length)); + } + + @Override + public Boolean createFromYear(long l) { + return createFromLong(l); + } + + public String getTargetTypeName() { + return Boolean.class.getName(); + } + + @Override + public Boolean createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return createFromLong(0); + } + + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (s.equalsIgnoreCase("Y") || s.equalsIgnoreCase("yes") || s.equalsIgnoreCase("T") || s.equalsIgnoreCase("true")) { + return createFromLong(1); + } else if (s.equalsIgnoreCase("N") || s.equalsIgnoreCase("no") || s.equalsIgnoreCase("F") || s.equalsIgnoreCase("false")) { + return createFromLong(0); + } else if (s.contains("e") || s.contains("E") || s.matches("-?\\d*\\.\\d*")) { + // floating point + return createFromDouble(MysqlTextValueDecoder.getDouble(newBytes, 0, newBytes.length)); + } else if (s.matches("-?\\d+")) { + // integer + if (s.charAt(0) == '-' // TODO shouldn't we check the length as well? + || length <= (MysqlTextValueDecoder.MAX_SIGNED_LONG_LEN - 1) && newBytes[0] >= '0' && newBytes[0] <= '8') { + return createFromLong(MysqlTextValueDecoder.getLong(newBytes, 0, newBytes.length)); + } + return createFromBigInteger(MysqlTextValueDecoder.getBigInteger(newBytes, 0, newBytes.length)); + } + throw new DataConversionException(Messages.getString("ResultSet.UnableToInterpretString", new Object[] { s })); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BufferedRowList.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BufferedRowList.java new file mode 100644 index 0000000..bd9601d --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/BufferedRowList.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Spliterators; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class BufferedRowList implements RowList { + private List rowList; + private int position = -1; + + public BufferedRowList(List rowList) { + this.rowList = rowList; + } + + /** + * Create a new instance by filling the internal buffer by draining the row stream. + * + * @param ris + * {@link Row}s iterator + */ + public BufferedRowList(Iterator ris) { + this.rowList = StreamSupport.stream(Spliterators.spliteratorUnknownSize(ris, 0), false).collect(Collectors.toList()); + } + + public Row next() { + if (this.position + 1 == this.rowList.size()) { + throw new NoSuchElementException("Can't next() when position=" + this.position + " and size=" + this.rowList.size()); + } + return this.rowList.get(++this.position); + } + + public Row previous() { + if (this.position < 1) { + throw new NoSuchElementException("Can't previous() when position=" + this.position); + } + return this.rowList.get(--this.position); + } + + public Row get(int n) { + if (n < 0 || n >= this.rowList.size()) { + throw new NoSuchElementException("Can't get(" + n + ") when size=" + this.rowList.size()); + } + return this.rowList.get(n); + } + + public int getPosition() { + return this.position; + } + + public int size() { + return this.rowList.size(); + } + + public boolean hasNext() { + return this.position + 1 < this.rowList.size(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ByteValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ByteValueFactory.java new file mode 100644 index 0000000..07a966f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ByteValueFactory.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; +import com.mysql.cj.util.DataTypeUtil; +import com.mysql.cj.util.StringUtils; + +/** + * A value factory for creating byte values. + */ +public class ByteValueFactory extends DefaultValueFactory { + + public ByteValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Byte createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads + && (i.compareTo(Constants.BIG_INTEGER_MIN_BYTE_VALUE) < 0 || i.compareTo(Constants.BIG_INTEGER_MAX_BYTE_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return (byte) i.intValue(); + } + + @Override + public Byte createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < Byte.MIN_VALUE || l > Byte.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (byte) l; + } + + @Override + public Byte createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MIN_BYTE_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_BYTE_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (byte) d.longValue(); + } + + @Override + public Byte createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < Byte.MIN_VALUE || d > Byte.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (byte) d; + } + + @Override + public Byte createFromBit(byte[] bytes, int offset, int length) { + long l = DataTypeUtil.bitToLong(bytes, offset, length); + if (this.jdbcCompliantTruncationForReads && l >> 8 != 0) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (byte) l; + } + + @Override + public Byte createFromYear(long l) { + return createFromLong(l); + } + + public String getTargetTypeName() { + return Byte.class.getName(); + } + + @Override + public Byte createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return (byte) 0; + } + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (this.jdbcCompliantTruncationForReads && newBytes.length != 1) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { s, getTargetTypeName() })); + } + return newBytes[0]; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultColumnDefinition.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultColumnDefinition.java new file mode 100644 index 0000000..6e7646f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultColumnDefinition.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import com.mysql.cj.protocol.ColumnDefinition; + +/** + * Protocol::ColumnDefinition41 object + * + */ +public class DefaultColumnDefinition implements ColumnDefinition { + + protected Field[] fields; + + /** Map column names (and all of their permutations) to column indices */ + private Map columnLabelToIndex = null; + + /** + * The above map is a case-insensitive tree-map, it can be slow, this caches lookups into that map, because the other alternative is to create new + * object instances for every call to findColumn().... + */ + private Map columnToIndexCache = new HashMap<>(); + + /** Map of fully-specified column names to column indices */ + private Map fullColumnNameToIndex = null; + + /** Map column names (and all of their permutations) to column indices */ + private Map columnNameToIndex = null; + + private boolean builtIndexMapping = false; + + public DefaultColumnDefinition() { + } + + public DefaultColumnDefinition(Field[] fields) { + this.fields = fields; + } + + public Field[] getFields() { + return this.fields; + } + + public void setFields(Field[] fields) { + this.fields = fields; + } + + @Override + + /** + * Builds a hash between column names and their indices for fast retrieval. + */ + public void buildIndexMapping() { + int numFields = this.fields.length; + this.columnLabelToIndex = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.fullColumnNameToIndex = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.columnNameToIndex = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + + // We do this in reverse order, so that the 'first' column with a given name ends up as the final mapping in the hashtable... + // + // Quoting the JDBC Spec: + // + // "Column names used as input to getter methods are case insensitive. When a getter method is called with a column name and several columns have the + // same name, the value of the first matching column will be returned. " + // + for (int i = numFields - 1; i >= 0; i--) { + Integer index = Integer.valueOf(i); + String columnName = this.fields[i].getOriginalName(); + String columnLabel = this.fields[i].getName(); + String fullColumnName = this.fields[i].getFullName(); + + if (columnLabel != null) { + this.columnLabelToIndex.put(columnLabel, index); + } + + if (fullColumnName != null) { + this.fullColumnNameToIndex.put(fullColumnName, index); + } + + if (columnName != null) { + this.columnNameToIndex.put(columnName, index); + } + } + + // set the flag to prevent rebuilding... + this.builtIndexMapping = true; + } + + public boolean hasBuiltIndexMapping() { + return this.builtIndexMapping; + } + + public Map getColumnLabelToIndex() { + return this.columnLabelToIndex; + } + + public void setColumnLabelToIndex(Map columnLabelToIndex) { + this.columnLabelToIndex = columnLabelToIndex; + } + + public Map getFullColumnNameToIndex() { + return this.fullColumnNameToIndex; + } + + public void setFullColumnNameToIndex(Map fullColNameToIndex) { + this.fullColumnNameToIndex = fullColNameToIndex; + } + + public Map getColumnNameToIndex() { + return this.columnNameToIndex; + } + + public void setColumnNameToIndex(Map colNameToIndex) { + this.columnNameToIndex = colNameToIndex; + } + + public Map getColumnToIndexCache() { + return this.columnToIndexCache; + } + + public void setColumnToIndexCache(Map columnToIndexCache) { + this.columnToIndexCache = columnToIndexCache; + } + + public void initializeFrom(ColumnDefinition columnDefinition) { + this.fields = columnDefinition.getFields(); + this.columnLabelToIndex = columnDefinition.getColumnNameToIndex(); + this.fullColumnNameToIndex = columnDefinition.getFullColumnNameToIndex(); + this.builtIndexMapping = true; + } + + public void exportTo(ColumnDefinition columnDefinition) { + columnDefinition.setFields(this.fields); + columnDefinition.setColumnNameToIndex(this.columnLabelToIndex); + columnDefinition.setFullColumnNameToIndex(this.fullColumnNameToIndex); + } + + public int findColumn(String columnName, boolean useColumnNamesInFindColumn, int indexBase) { + + Integer index; + + if (!hasBuiltIndexMapping()) { + buildIndexMapping(); + } + + index = this.columnToIndexCache.get(columnName); + + if (index != null) { + return index.intValue() + indexBase; + } + + index = this.columnLabelToIndex.get(columnName); + + if (index == null && useColumnNamesInFindColumn) { + index = this.columnNameToIndex.get(columnName); + } + + if (index == null) { + index = this.fullColumnNameToIndex.get(columnName); + } + + if (index != null) { + this.columnToIndexCache.put(columnName, index); + + return index.intValue() + indexBase; + } + + // Try this inefficient way, now + + for (int i = 0; i < this.fields.length; i++) { + if (this.fields[i].getName().equalsIgnoreCase(columnName)) { + return i + indexBase; + } else if (this.fields[i].getFullName().equalsIgnoreCase(columnName)) { + return i + indexBase; + } + } + + return -1; + } + + /** + * Check if fields with type BLOB, MEDIUMBLOB, LONGBLOB, TEXT, MEDIUMTEXT or LONGTEXT + * exist in this ColumnDefinition. + * This check is used for making a decision about whether we want to force a + * buffer row (better for rows with large fields). + * + * @return true if this ColumnDefinition has large fields + */ + public boolean hasLargeFields() { + if (this.fields != null) { + for (int i = 0; i < this.fields.length; i++) { + switch (this.fields[i].getMysqlType()) { + case BLOB: + case MEDIUMBLOB: + case LONGBLOB: + case TEXT: + case MEDIUMTEXT: + case LONGTEXT: + case JSON: + return true; + default: + break; + } + } + } + return false; + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultValueFactory.java new file mode 100644 index 0000000..4cb169e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DefaultValueFactory.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * The default value factory provides a base class that can be used for value factories that do not support creation from every type. The default value factory + * will thrown an UnsupportedOperationException for every method and individual methods must be overridden by subclasses. + * + * @param + * value type + */ +public abstract class DefaultValueFactory implements ValueFactory { + + protected boolean jdbcCompliantTruncationForReads = true; + + public DefaultValueFactory(PropertySet pset) { + this.pset = pset; + + // TODO we always check initial value here, whatever the setupServerForTruncationChecks() does for writes. + // It also means that runtime changes of this variable have no effect on reads. + this.jdbcCompliantTruncationForReads = this.pset.getBooleanProperty(PropertyKey.jdbcCompliantTruncation).getInitialValue(); + } + + protected PropertySet pset = null; + + @Override + public void setPropertySet(PropertySet pset) { + this.pset = pset; + } + + protected T unsupported(String sourceType) { + throw new DataConversionException(Messages.getString("ResultSet.UnsupportedConversion", new Object[] { sourceType, getTargetTypeName() })); + } + + public T createFromDate(InternalDate idate) { + return unsupported("DATE"); + } + + public T createFromTime(InternalTime it) { + return unsupported("TIME"); + } + + public T createFromTimestamp(InternalTimestamp its) { + return unsupported("TIMESTAMP"); + } + + @Override + public T createFromDatetime(InternalTimestamp its) { + return unsupported("DATETIME"); + } + + public T createFromLong(long l) { + return unsupported("LONG"); + } + + public T createFromBigInteger(BigInteger i) { + return unsupported("BIGINT"); + } + + public T createFromDouble(double d) { + return unsupported("DOUBLE"); + } + + public T createFromBigDecimal(BigDecimal d) { + return unsupported("DECIMAL"); + } + + public T createFromBit(byte[] bytes, int offset, int length) { + return unsupported("BIT"); + } + + @Override + public T createFromYear(long l) { + return unsupported("YEAR"); + } + + public T createFromNull() { + return null; + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DoubleValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DoubleValueFactory.java new file mode 100644 index 0000000..1da7ddf --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DoubleValueFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; + +/** + * A value factory for creating double values. + */ +public class DoubleValueFactory extends AbstractNumericValueFactory { + + public DoubleValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Double createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads && (new BigDecimal(i).compareTo(Constants.BIG_DECIMAL_MAX_NEGATIVE_DOUBLE_VALUE) < 0 + || new BigDecimal(i).compareTo(Constants.BIG_DECIMAL_MAX_DOUBLE_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return i.doubleValue(); + } + + @Override + public Double createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < -Double.MAX_VALUE || l > Double.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { l, getTargetTypeName() })); + } + return (double) l; + } + + @Override + public Double createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MAX_NEGATIVE_DOUBLE_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_DOUBLE_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return d.doubleValue(); + } + + @Override + public Double createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < -Double.MAX_VALUE || d > Double.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return d; + } + + @Override + public Double createFromBit(byte[] bytes, int offset, int length) { + return new BigInteger(ByteBuffer.allocate(length + 1).put((byte) 0).put(bytes, offset, length).array()).doubleValue(); + } + + public String getTargetTypeName() { + return Double.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DurationValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DurationValueFactory.java new file mode 100644 index 0000000..77f92f7 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/DurationValueFactory.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.Duration; + +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * A value factory to create {@link Duration} instances. + */ +public class DurationValueFactory extends AbstractDateTimeValueFactory { + + public DurationValueFactory(PropertySet pset) { + super(pset); + } + + @Override + Duration localCreateFromDate(InternalDate idate) { + return unsupported("DATE"); + } + + @Override + public Duration localCreateFromTime(InternalTime it) { + String ptn = (it.getHours() < 0 ? "-PT" : "PT") + (it.getHours() < 0 ? -it.getHours() : it.getHours()) + "H" + it.getMinutes() + "M" + it.getSeconds() + + "." + it.getNanos() + "S"; + return Duration.parse(ptn); + } + + @Override + public Duration localCreateFromTimestamp(InternalTimestamp its) { + return unsupported("TIMESTAMP"); + } + + @Override + public Duration localCreateFromDatetime(InternalTimestamp its) { + return unsupported("DATETIME"); + } + + public String getTargetTypeName() { + return Duration.class.getName(); + } + +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/FloatValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/FloatValueFactory.java new file mode 100644 index 0000000..38f231e --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/FloatValueFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; + +/** + * A value factory for creating float values. + */ +public class FloatValueFactory extends AbstractNumericValueFactory { + + public FloatValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Float createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads && (new BigDecimal(i).compareTo(Constants.BIG_DECIMAL_MAX_NEGATIVE_FLOAT_VALUE) < 0 + || new BigDecimal(i).compareTo(Constants.BIG_DECIMAL_MAX_FLOAT_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return (float) i.doubleValue(); + } + + @Override + public Float createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < -Float.MAX_VALUE || l > Float.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { l, getTargetTypeName() })); + } + return (float) l; + } + + @Override + public Float createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MAX_NEGATIVE_FLOAT_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_FLOAT_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (float) d.doubleValue(); + } + + @Override + public Float createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < -Float.MAX_VALUE || d > Float.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (float) d; + } + + @Override + public Float createFromBit(byte[] bytes, int offset, int length) { + return new BigInteger(ByteBuffer.allocate(length + 1).put((byte) 0).put(bytes, offset, length).array()).floatValue(); + } + + public String getTargetTypeName() { + return Float.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/IntegerValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/IntegerValueFactory.java new file mode 100644 index 0000000..744ee21 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/IntegerValueFactory.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; +import com.mysql.cj.util.DataTypeUtil; + +/** + * A value factory for creating int values. + */ +public class IntegerValueFactory extends AbstractNumericValueFactory { + + public IntegerValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Integer createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads + && (i.compareTo(Constants.BIG_INTEGER_MIN_INTEGER_VALUE) < 0 || i.compareTo(Constants.BIG_INTEGER_MAX_INTEGER_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return i.intValue(); + } + + @Override + public Integer createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (int) l; + } + + @Override + public Integer createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MIN_INTEGER_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_INTEGER_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (int) d.longValue(); + } + + @Override + public Integer createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < Integer.MIN_VALUE || d > Integer.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (int) d; + } + + @Override + public Integer createFromBit(byte[] bytes, int offset, int length) { + long l = DataTypeUtil.bitToLong(bytes, offset, length); + if (this.jdbcCompliantTruncationForReads && l >> 32 != 0) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (int) l; + } + + public String getTargetTypeName() { + return Integer.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateTimeValueFactory.java new file mode 100644 index 0000000..2fe3127 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateTimeValueFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.LocalDateTime; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * Value factory to create {@link LocalDateTime} instances. + */ +public class LocalDateTimeValueFactory extends AbstractDateTimeValueFactory { + + public LocalDateTimeValueFactory(PropertySet pset) { + super(pset); + } + + /** + * Create a LocalDateTime from a DATE value. + * + * @return a LocalDateTime at midnight on the day given by the DATE value + */ + @Override + public LocalDateTime localCreateFromDate(InternalDate idate) { + return createFromTimestamp(new InternalTimestamp(idate.getYear(), idate.getMonth(), idate.getDay(), 0, 0, 0, 0, 0)); + } + + /** + * Create a LocalDateTime from a TIME value. + * + * @return a LocalDateTime at the given time on 1970 Jan 1. + */ + @Override + public LocalDateTime localCreateFromTime(InternalTime it) { + if (it.getHours() < 0 || it.getHours() >= 24) { + throw new DataReadException(Messages.getString("ResultSet.InvalidTimeValue", new Object[] { it.toString() })); + } + return createFromTimestamp(new InternalTimestamp(1970, 1, 1, it.getHours(), it.getMinutes(), it.getSeconds(), it.getNanos(), it.getScale())); + } + + @Override + public LocalDateTime localCreateFromTimestamp(InternalTimestamp its) { + if (its.getYear() == 0 && its.getMonth() == 0 && its.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDateTime.of(its.getYear(), its.getMonth(), its.getDay(), its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos()); + } + + @Override + public LocalDateTime localCreateFromDatetime(InternalTimestamp its) { + if (its.getYear() == 0 && its.getMonth() == 0 && its.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDateTime.of(its.getYear(), its.getMonth(), its.getDay(), its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos()); + } + + public String getTargetTypeName() { + return LocalDateTime.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateValueFactory.java new file mode 100644 index 0000000..9a8c9b0 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalDateValueFactory.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.LocalDate; + +import com.mysql.cj.Messages; +import com.mysql.cj.WarningListener; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * A value factory for creating {@link LocalDate} values. + */ +public class LocalDateValueFactory extends AbstractDateTimeValueFactory { + private WarningListener warningListener; + + public LocalDateValueFactory(PropertySet pset) { + super(pset); + } + + public LocalDateValueFactory(PropertySet pset, WarningListener warningListener) { + this(pset); + this.warningListener = warningListener; + } + + @Override + public LocalDate localCreateFromDate(InternalDate idate) { + if (idate.getYear() == 0 && idate.getMonth() == 0 && idate.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDate.of(idate.getYear(), idate.getMonth(), idate.getDay()); + } + + @Override + public LocalDate localCreateFromTimestamp(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate any time information + return createFromDate(its); + } + + @Override + public LocalDate localCreateFromDatetime(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate any time information + return createFromDate(its); + } + + @Override + LocalDate localCreateFromTime(InternalTime it) { + return LocalDate.of(1970, 1, 1); + } + + public String getTargetTypeName() { + return LocalDate.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalTimeValueFactory.java new file mode 100644 index 0000000..2b7b808 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LocalTimeValueFactory.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.LocalTime; + +import com.mysql.cj.Messages; +import com.mysql.cj.WarningListener; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * A value factory to create {@link LocalTime} instances. + */ +public class LocalTimeValueFactory extends AbstractDateTimeValueFactory { + private WarningListener warningListener; + + public LocalTimeValueFactory(PropertySet pset) { + super(pset); + } + + public LocalTimeValueFactory(PropertySet pset, WarningListener warningListener) { + this(pset); + this.warningListener = warningListener; + } + + @Override + LocalTime localCreateFromDate(InternalDate idate) { + return LocalTime.of(0, 0); + } + + @Override + public LocalTime localCreateFromTime(InternalTime it) { + if (it.getHours() < 0 || it.getHours() >= 24) { + throw new DataReadException(Messages.getString("ResultSet.InvalidTimeValue", new Object[] { it.toString() })); + } + return LocalTime.of(it.getHours(), it.getMinutes(), it.getSeconds(), it.getNanos()); + } + + @Override + public LocalTime localCreateFromTimestamp(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate date information + return createFromTime(new InternalTime(its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos(), its.getScale())); + } + + @Override + public LocalTime localCreateFromDatetime(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate date information + return createFromTime(new InternalTime(its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos(), its.getScale())); + } + + public String getTargetTypeName() { + return LocalTime.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LongValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LongValueFactory.java new file mode 100644 index 0000000..8a39927 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/LongValueFactory.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; +import com.mysql.cj.util.DataTypeUtil; + +/** + * A value factory for creating long values. + */ +public class LongValueFactory extends AbstractNumericValueFactory { + + public LongValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Long createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads + && (i.compareTo(Constants.BIG_INTEGER_MIN_LONG_VALUE) < 0 || i.compareTo(Constants.BIG_INTEGER_MAX_LONG_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return i.longValue(); + } + + @Override + public Long createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < Long.MIN_VALUE || l > Long.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return l; + } + + @Override + public Long createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MIN_LONG_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_LONG_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return d.longValue(); + } + + @Override + public Long createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < Long.MIN_VALUE || d > Long.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (long) d; + } + + @Override + public Long createFromBit(byte[] bytes, int offset, int length) { + return DataTypeUtil.bitToLong(bytes, offset, length); + } + + public String getTargetTypeName() { + return Long.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetDateTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetDateTimeValueFactory.java new file mode 100644 index 0000000..af6f8c8 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetDateTimeValueFactory.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2020, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.format.DateTimeParseException; +import java.util.TimeZone; + +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; +import com.mysql.cj.protocol.a.MysqlTextValueDecoder; +import com.mysql.cj.util.StringUtils; + +/** + * Value factory to create {@link OffsetDateTime} instances. + */ +public class OffsetDateTimeValueFactory extends AbstractDateTimeValueFactory { + + private TimeZone defaultTimeZone; + private TimeZone connectionTimeZone; + + public OffsetDateTimeValueFactory(PropertySet pset, TimeZone defaultTimeZone, TimeZone connectionTimeZone) { + super(pset); + this.defaultTimeZone = defaultTimeZone; + this.connectionTimeZone = connectionTimeZone; + } + + /** + * Create an OffsetDateTime from a DATE value. + * + * @return an OffsetDateTime at midnight on the day given by the DATE value + */ + @Override + public OffsetDateTime localCreateFromDate(InternalDate idate) { + if (idate.getYear() == 0 && idate.getMonth() == 0 && idate.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDateTime.of(idate.getYear(), idate.getMonth(), idate.getDay(), 0, 0, 0, 0).atZone(this.defaultTimeZone.toZoneId()).toOffsetDateTime(); + } + + /** + * Create an OffsetDateTime from a TIME value. + * + * @return an OffsetDateTime at the given time on 1970 Jan 1. + */ + @Override + public OffsetDateTime localCreateFromTime(InternalTime it) { + if (it.getHours() < 0 || it.getHours() >= 24) { + throw new DataReadException(Messages.getString("ResultSet.InvalidTimeValue", new Object[] { it.toString() })); + } + return LocalDateTime.of(1970, 1, 1, it.getHours(), it.getMinutes(), it.getSeconds(), it.getNanos()).atZone(this.defaultTimeZone.toZoneId()) + .toOffsetDateTime(); + } + + @Override + public OffsetDateTime localCreateFromTimestamp(InternalTimestamp its) { + if (its.getYear() == 0 && its.getMonth() == 0 && its.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDateTime.of(its.getYear(), its.getMonth(), its.getDay(), its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos()) + .atZone((this.pset.getBooleanProperty(PropertyKey.preserveInstants).getValue() ? this.connectionTimeZone : this.defaultTimeZone).toZoneId()) + .toOffsetDateTime(); + } + + @Override + public OffsetDateTime localCreateFromDatetime(InternalTimestamp its) { + if (its.getYear() == 0 && its.getMonth() == 0 && its.getDay() == 0) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + return LocalDateTime.of(its.getYear(), its.getMonth(), its.getDay(), its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos()) + .atZone((this.pset.getBooleanProperty(PropertyKey.preserveInstants).getValue() ? this.connectionTimeZone : this.defaultTimeZone).toZoneId()) + .toOffsetDateTime(); + } + + @Override + public OffsetDateTime createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return createFromLong(0); + } + + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (MysqlTextValueDecoder.isDate(s)) { + return createFromDate(MysqlTextValueDecoder.getDate(newBytes, 0, newBytes.length)); + + } else if (MysqlTextValueDecoder.isTime(s)) { + return createFromTime(MysqlTextValueDecoder.getTime(newBytes, 0, newBytes.length, f.getDecimals())); + + } else if (MysqlTextValueDecoder.isTimestamp(s)) { + return createFromTimestamp(MysqlTextValueDecoder.getTimestamp(newBytes, 0, newBytes.length, f.getDecimals())); + } + + // by default try to parse + try { + return OffsetDateTime.parse(s.replace(" ", "T")); + } catch (DateTimeParseException e) { + throw new DataConversionException(Messages.getString("ResultSet.UnableToConvertString", new Object[] { s, getTargetTypeName() })); + } + + } + + public String getTargetTypeName() { + return OffsetDateTime.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetTimeValueFactory.java new file mode 100644 index 0000000..9e1ae72 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/OffsetTimeValueFactory.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2020, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeParseException; +import java.util.TimeZone; + +import com.mysql.cj.Messages; +import com.mysql.cj.WarningListener; +import com.mysql.cj.conf.PropertyKey; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataConversionException; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; +import com.mysql.cj.protocol.a.MysqlTextValueDecoder; +import com.mysql.cj.util.StringUtils; + +/** + * A value factory to create {@link OffsetTime} instances. + */ +public class OffsetTimeValueFactory extends AbstractDateTimeValueFactory { + private WarningListener warningListener; + private TimeZone tz; + + public OffsetTimeValueFactory(PropertySet pset, TimeZone tz) { + super(pset); + this.tz = tz; + } + + public OffsetTimeValueFactory(PropertySet pset, TimeZone tz, WarningListener warningListener) { + this(pset, tz); + this.warningListener = warningListener; + } + + @Override + OffsetTime localCreateFromDate(InternalDate idate) { + return LocalTime.of(0, 0).atOffset(ZoneOffset.ofTotalSeconds(this.tz.getRawOffset() / 1000)); + } + + @Override + public OffsetTime localCreateFromTime(InternalTime it) { + if (it.getHours() < 0 || it.getHours() >= 24) { + throw new DataReadException(Messages.getString("ResultSet.InvalidTimeValue", new Object[] { it.toString() })); + } + return LocalTime.of(it.getHours(), it.getMinutes(), it.getSeconds(), it.getNanos()).atOffset(ZoneOffset.ofTotalSeconds(this.tz.getRawOffset() / 1000)); + } + + @Override + public OffsetTime localCreateFromTimestamp(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate date information + return createFromTime(new InternalTime(its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos(), its.getScale())); + } + + @Override + public OffsetTime localCreateFromDatetime(InternalTimestamp its) { + if (this.warningListener != null) { + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { getTargetTypeName() })); + } + // truncate date information + return createFromTime(new InternalTime(its.getHours(), its.getMinutes(), its.getSeconds(), its.getNanos(), its.getScale())); + } + + @Override + public OffsetTime createFromBytes(byte[] bytes, int offset, int length, Field f) { + if (length == 0 && this.pset.getBooleanProperty(PropertyKey.emptyStringsConvertToZero).getValue()) { + return createFromLong(0); + } + + String s = StringUtils.toString(bytes, offset, length, f.getEncoding()); + byte[] newBytes = s.getBytes(); + + if (MysqlTextValueDecoder.isDate(s)) { + return createFromDate(MysqlTextValueDecoder.getDate(newBytes, 0, newBytes.length)); + + } else if (MysqlTextValueDecoder.isTime(s)) { + return createFromTime(MysqlTextValueDecoder.getTime(newBytes, 0, newBytes.length, f.getDecimals())); + + } else if (MysqlTextValueDecoder.isTimestamp(s)) { + return createFromTimestamp(MysqlTextValueDecoder.getTimestamp(newBytes, 0, newBytes.length, f.getDecimals())); + } + + // by default try to parse + try { + return OffsetTime.parse(s); + } catch (DateTimeParseException e) { + throw new DataConversionException(Messages.getString("ResultSet.UnableToConvertString", new Object[] { s, getTargetTypeName() })); + } + } + + public String getTargetTypeName() { + return OffsetTime.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ShortValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ShortValueFactory.java new file mode 100644 index 0000000..52a225f --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/ShortValueFactory.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.mysql.cj.Constants; +import com.mysql.cj.Messages; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.NumberOutOfRange; +import com.mysql.cj.util.DataTypeUtil; + +/** + * A value factory for creating short values. + */ +public class ShortValueFactory extends AbstractNumericValueFactory { + + public ShortValueFactory(PropertySet pset) { + super(pset); + } + + @Override + public Short createFromBigInteger(BigInteger i) { + if (this.jdbcCompliantTruncationForReads + && (i.compareTo(Constants.BIG_INTEGER_MIN_SHORT_VALUE) < 0 || i.compareTo(Constants.BIG_INTEGER_MAX_SHORT_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { i, getTargetTypeName() })); + } + return (short) i.intValue(); + } + + @Override + public Short createFromLong(long l) { + if (this.jdbcCompliantTruncationForReads && (l < Short.MIN_VALUE || l > Short.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (short) l; + } + + @Override + public Short createFromBigDecimal(BigDecimal d) { + if (this.jdbcCompliantTruncationForReads + && (d.compareTo(Constants.BIG_DECIMAL_MIN_SHORT_VALUE) < 0 || d.compareTo(Constants.BIG_DECIMAL_MAX_SHORT_VALUE) > 0)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (short) d.longValue(); + } + + @Override + public Short createFromDouble(double d) { + if (this.jdbcCompliantTruncationForReads && (d < Short.MIN_VALUE || d > Short.MAX_VALUE)) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { d, getTargetTypeName() })); + } + return (short) d; + } + + @Override + public Short createFromBit(byte[] bytes, int offset, int length) { + long l = DataTypeUtil.bitToLong(bytes, offset, length); + if (this.jdbcCompliantTruncationForReads && l >> 16 != 0) { + throw new NumberOutOfRange(Messages.getString("ResultSet.NumberOutOfRange", new Object[] { Long.valueOf(l).toString(), getTargetTypeName() })); + } + return (short) l; + } + + public String getTargetTypeName() { + return Short.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlDateValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlDateValueFactory.java new file mode 100644 index 0000000..1d6b68a --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlDateValueFactory.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2015, 2022, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.sql.Date; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; + +import com.mysql.cj.Messages; +import com.mysql.cj.WarningListener; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; +import com.mysql.cj.util.TimeUtil; + +/** + * A value factory for creating {@link java.sql.Date} values. + */ +public class SqlDateValueFactory extends AbstractDateTimeValueFactory { + private WarningListener warningListener; + // cached per instance to avoid re-creation on every create*() call + private Calendar cal; + + public SqlDateValueFactory(PropertySet pset, Calendar calendar, TimeZone tz) { + super(pset); + if (calendar != null) { + this.cal = (Calendar) calendar.clone(); + } else { + // c.f. Bug#11540 for details on locale + this.cal = Calendar.getInstance(tz, Locale.US); + this.cal.set(Calendar.MILLISECOND, 0); + this.cal.setLenient(false); + } + } + + public SqlDateValueFactory(PropertySet pset, Calendar calendar, TimeZone tz, WarningListener warningListener) { + this(pset, calendar, tz); + this.warningListener = warningListener; + } + + @Override + public Date localCreateFromDate(InternalDate idate) { + synchronized (this.cal) { + try { + if (idate.isZero()) { + throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate")); + } + + this.cal.clear(); + this.cal.set(idate.getYear(), idate.getMonth() - 1, idate.getDay()); + long ms = this.cal.getTimeInMillis(); + return new Date(ms); + } catch (IllegalArgumentException e) { + throw ExceptionFactory.createException(WrongArgumentException.class, e.getMessage(), e); + } + } + } + + @Override + public Date localCreateFromTime(InternalTime it) { + if (this.warningListener != null) { + // TODO: need column context + this.warningListener.warningEncountered(Messages.getString("ResultSet.ImplicitDatePartWarning", new Object[] { "java.sql.Date" })); + } + return Date.valueOf(TimeUtil.DEFAULT_DATE); + } + + @Override + public Date localCreateFromTimestamp(InternalTimestamp its) { + if (this.warningListener != null) { + // TODO: need column context + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { "java.sql.Date" })); + } + + // truncate any time information + return createFromDate(its); + } + + @Override + public Date localCreateFromDatetime(InternalTimestamp its) { + if (this.warningListener != null) { + // TODO: need column context + this.warningListener.warningEncountered(Messages.getString("ResultSet.PrecisionLostWarning", new Object[] { "java.sql.Date" })); + } + + // truncate any time information + return createFromDate(its); + } + + public String getTargetTypeName() { + return Date.class.getName(); + } +} diff --git a/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlTimeValueFactory.java b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlTimeValueFactory.java new file mode 100644 index 0000000..a4d37e9 --- /dev/null +++ b/mysql-connector-j-8.0.31/src/main/core-impl/java/com/mysql/cj/result/SqlTimeValueFactory.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2015, 2021, Oracle and/or its affiliates. + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 2.0, as published by the + * Free Software Foundation. + * + * This program is also distributed with certain software (including but not + * limited to OpenSSL) that is licensed under separate terms, as designated in a + * particular file or component or in included license documentation. The + * authors of MySQL hereby grant you an additional permission to link the + * program and your derivative works with the separately licensed software that + * they have included with MySQL. + * + * Without limiting anything contained in the foregoing, this file, which is + * part of MySQL Connector/J, is also subject to the Universal FOSS Exception, + * version 1.0, a copy of which can be found at + * http://oss.oracle.com/licenses/universal-foss-exception. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0, + * for more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package com.mysql.cj.result; + +import java.sql.Time; +import java.util.Calendar; +import java.util.Locale; +import java.util.TimeZone; + +import com.mysql.cj.Messages; +import com.mysql.cj.WarningListener; +import com.mysql.cj.conf.PropertySet; +import com.mysql.cj.exceptions.DataReadException; +import com.mysql.cj.exceptions.ExceptionFactory; +import com.mysql.cj.exceptions.WrongArgumentException; +import com.mysql.cj.protocol.InternalDate; +import com.mysql.cj.protocol.InternalTime; +import com.mysql.cj.protocol.InternalTimestamp; + +/** + * A value factory to create {@link java.sql.Time} instances. As with other date/time types, a time zone is necessary to interpret the + * time values returned from the server. + */ +public class SqlTimeValueFactory extends AbstractDateTimeValueFactory

    8S-Gq2qJK%h`cl-5?3MY(kRfE8N6eY5Abs(<>* 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 iQLz8rcdp*oo7C>XGZWiw33epG%B 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�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 p3qcmY);x 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 z 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 #h!dcWd)ftj!4v5hLdJ!|ulql?lWz zkXEw7IIPcdh0q{|U^mcQqIIk5dN`nAWy)BNPb?J3*;xj(6O46A#l#F;B^a`BchriW zb-M}ZlUMxCPhJg6H#yah?Fl6l0Y^QsBpDG(JZfl z>cK3kb-Jor{~DKiOtJ+d@0v1fl4%HT?(%UX9zJ^%jCUNByrw^nLORs57SuU({$Wt4 z8(*}yBu0cSTNnHgQ4$AIzLy_6>GQE^Be8F%zUr~AbECT=f))=b_!^%c^{jR_h0q6TkNsSuD;Dy;;nko6FV>2K6Q5Dt-HuJ)teEb z2{ql#S%jPT(72m08saS7K8u$!nrlP}u|ZvE1cKg&YM)r|G?W#B__R+y^sMYn%)sENY z6{();!uUqUpLpe$#8fvryb(T2rhhFjg&6 z{gh9;ps@6NJv8D5Ajf)=Zjm?k;pv+7(x^-<$tQ;B|;{~fub%{$NYWE{49q$#@ISsa@ z&W5Cn?`7r=4T&6-81I`>dNOJ}3utg8uZ(gU%uQ5TcMe*a18ZAhOX$cY)Kax6%d`yL zIWiAPK0MuwObnHJQq9F7qgN`%_qUsX#(49z0%h)aB7GG>FAz~Dz~iY;RZZS?RABSN z3`|CmxG>WN7vn3r!= zV*ioWMzbOOgm=yWt4i<}krxH_AtrQbz8dZRPd__hTmyW;r1nQOjCofE3oo-9Rx^u@ ziL*x--DeIJ$bp*>oxs|jcKL~y;Kvc~LTSu_9>6!&xd=X`(2IumYWxv&>LZP4pT)r{ zJdu&|1v)VrIY~jTmN**ab%bJ#j$lX)!vnAvv`RH_xs0n$bwTXMu(0xle-I=DkkRFB|z>-PiF8+Df( zhSAb|f_iK)!y|JYrhQW|dx{?_CZ2Iwkm4vG+R_u`5?#_bSe0S0i7H}*MEg|Tcf`$W z6%H4CPH!ixy?Vw7Z;Y3>mpC?Aj6R-2s2i`iGM@sfLApYqf-x2v`Cy4ckzo*Hf8PRS z0EJ(>v}XzHL7N42AI}Ux*-BWkGTe7!KwB zRF~Sb%+hrrpdbbQJ!Juvj}cWg4Y-OKzH?GbsT~4BBkNEnmOeE=dxAeXkB$viW zl}WJs!7c{f3w^g9qeb4d7a91|pyhmcpn#=ql`K68Yd9O5-l4pY}Pq}4UV zQL6$6fYVkpDiR*QLf|nBtlF?cFsa^SY^<7Un@W>5;1p*P1Z5G6;MI)U2Zwk3m~@h? zMcy+?yPvf3GxJ2Pl?6@f*|VO=rK5HF2l>Ri=)7Z2=BMNv#Bs>DA7xIY|_x=T6u~7f@$*V@RR595ZlOMEpN)r!Y&oj6J_D&}FHmn3YQ7+-I3nSj53to>k{_35 zW9DD5NWneBm{3d`WZz{5r8wM!jE#2Yh;ias?$S-jZRst*3@%CZ8k3|O-`=6e7I%n= z+#+EPj-zFvW$=I9KZ)+kxHH>ootsVVQULFpLj1v2B{7`_gOakuD=b$2N8$~a>7mH6P*fqwE>IE-%DfTpl$mPhvW57VtzklkxI z!F#y;MMkv3HVjfVaiNpkkjXPm~rb>QB5puqMK3VQ1M$*;7WY5){LN<14h7gm&0 zvUEcwrf?Tp#;^G4ZLo{*nkd6_EM3iTq6^CxOO5GcIx?3M*45lLZ*C<(-11GEU)d7h z;qHkR57hL6uA0%^i5tY5vggU(4_4EOoF2Bz+-9x--gJQn+$o`$9ZkayGYGaA@C#PIm=&O9E?^&6 z-weOb%)aKRd|SXuGdlv8I=Ol1R)gU_&(uoj4%cb1E5(@%bpsW*5`j`GeExU5GMA9fBAUy$$Au1lDm9IJoOS-*#^{jf8C=k)zG zJt%h(;Cfh8d|4h<`0O^$f5SJ<_u$eCDT`UDyOeX6*BpzI@w=oRBD|sKU{N1_+JA_- zgzz!2W02QN2+5g~&WHZXz2x?NvhZQ67691+Ouq8carz=gnZB%7maf8JxZaJdf{+Zj!A^PLpZ?^A} zzM5HkqxMm4-Hz-DYQ_%oB?+qX_##3D z3FIJh_g|tbNKjzvC%}IFg8fkee?-9lj!WJD>y7(gP(q>VyDPRR>KAEzV_kUN{4<%Wz!$v4tpN0-qhFE)a0~8zzx!ju=eg_ojTP`28cb4KZ zZPxYe?gtSCkVbyR_QATtHAR-#QOoyy+Q_d}bdWFXCu^@z#3Z@q7o(xTprq{|! z8xW8-?A{W45OG`F{52C~&_x&S@{3gAFr$gg#T!QVbceFS$je)QK7rucowlHSWoUg3 z$RV!|l%}H!Z9A!IjUu6m3eB67AtvX{$Y6k^y5FuSTf$w@IS$Bgnx=d@V%3s{=)rfk zLQc1_EYeA9%=OwS6-h-E_r6TZIvVrcjmVx=x1(_PO(`_#;@Alf<8=y{XWJnY=KUj% zTH_393QzuFYW0q14$Z`N|3jJpWQc+HQn`RFV@;2oEtL3?5*E#-yCPF*Xs0Mu+-X|% z1eZZlu|LuK9z~|}VF)W%0m=#bW=uBjpy_ds6CcWDSceMl60m=b+^LMIYuL7Y>6|@Z z@mAQ>D`)-tI4qR!j6IheM@wCnzFQXszk!vbijgb{#6&np#H@E4G-B08d4<)RHKsI+t!dwy(yx987wi-Mtf6y${rd}rvqesf zi}@iwY<{t9kBH3qw8xJN%uVc$aiAX>vX3zvH=G!)dQ%p?OkcI@jO#mujrB!T;|uJr z@9jH(Qxx5NQ`Xbd`IEKKZ77jjot))VYlb?pC)P@UD?NEwseZ)_^a)$>yq2VMCfvDT z;n8~i=z$XR8yECLaF{&g$vTqh6%Ib-^xdF>&W zGlW3DC(!L<6IUC?z3_5g{&}v6Jg}$DS$NWO2|fHip zhYLemEmeh@N6U%ttE1hcyLvmv3p7X{ri4~Y0YQV;U@-Y}aRBB8t#r;0-J z`~}bCt^|6PY|SkB&dm4vgj2Rii=s^5M9>J$HHWl7_aCrPA?7f**|iZbOc;tE;9_i& zLixP|Na~xo}uhSA#@zBS1*+F?|~VyNqz?R$Pg8% zS33SGwy$9B1|q=l1yP*oUk_{_hOFSCA*M`kpV)z+?0o zDcQhmG>-@OUJM|le(xEGex^{&X(F4A0iAsg7_902f44wz*mQ3-xbiCw4}pl`pf92= zT~VT=_(O{Ybx2zO@bk+yf!;SUN+Al%3*MxXSr#bIBSS&0}$$l zvOqk!)V-mHa4$xLyPdGLzcu*SXnfsuY33@K`(J(`hD(Rko&+=?qnRifi5r9G<(&(I zKElv|rm@r(AG3NOaear)gp_~LP-zQ{ykO7_ktv+IoJLiB9I(k~@sact9ccF|ANF@p zW9{5>K^*0C0r#%A*dpqSUqZ2pm#HgsN)w6;6F(-!l9r;0Kbq@{pYF87;UcsvtY>2Mt4a{1=z8I@M5|+C?VulNwv!(R9W~7AI6EL*PwYjzP;b;MW>C(jqMV!8seB)z>efG*U9&_< z;Q8T0(^4~t4P{RF+nm3>x=>1&p0k$bN%5o_?t zamz&w;4W>A0gY4!q({kfR=4EEC1qMoH5z(DbHUuk24~Zg{N%Y{ znnEs#b$>rQJ;nE@!)mMN5bw%0O5Ks>QsMH4cVKzpn!Utb^H@zm z`5MB~=ZT%FkyMu)XQOoieaVTi7`$`cxmXa-C__G_*nlXgf((So8u`+qfg}`^s~^kn z;WZ<43hjwCu8kG!qanZLpO2DkbLR0aGCe+I;v1}AGU#Onn`Q4AF02N&CjRXh)6^t7 z`6G1}GYLu~H#kR_tA-pz{HBdr4$0J6Dl12Yk za3#wY>n6%+a>{^kd~SJRlnr`Y-Dy)Yi1-%j=3i%&xn@e51%!vjAYh^Os`m*oT|Eb& z!}B6YRF`JRL5Q3j=GAL!^$N`Paw{`}MtBfurFF4iox`97PbT^<9|>JlUSLFNfR6S3dztjT4>JUvjCbB>*N6!s7P{d z#)E1{gUMnJL*&rB5dBbTFf4f8HZZJuanIske7BDsUWJ$Z3Z0w|kypIj19wk$&H444 zT)=M-?zzNdan1;d8a!URNtUGqz;LHYitQzv>jIh+RA-lhuLD+o(wZX#z`G_-3mx4i z`#SZG302puU0LX$z$lb7EbcF(x$4Zpz0=~SxyLmzx51tAWQfB`dhL%E!1e_cK$_Ox zIt**El*d$WhaW6fwl1@4prupNnv#UZe;8h{>_ir#s$){u36x#jlQ-HPsjvE%YkF}u zo5~u{bg631nIkXyi2K8o&^xcb3AMx#C0K=HkEGi|uTVa>Qgik?XTATlx3xkAMkw^T z{Mdp!z14ITMA{L&ZBZwHY@&y+79%7UK{voNBe0QXvr3p|K;}|6K2rFwOM`HD5Hzex zs(K$#5YjWTpwhFU>>1*x?Fhv1%Adazi+$3J(Ln}?Diz#&UeA7zhG|1y@{IP!b@SM@d_Swmh<@VV^}^H9TJTLK@>Oxj_(tZJ$7GV<2Y= z%Z*47kulf|3Z{7gWLCU~roIvWS@!}52RXqJ^)7_g9Ckgn=h>3(EynfeOxd2El@VpsV?3GI14Eew1hpw3OqOBW4Z5&AEg z`L1&Z;lBEwU%>$E-=if4w0&OQL$aD2ojgXLQ2=2e$!%!l{+>K7-u|9FEoY0He*~HF zZQ{!G;BR%DgC%|&9+K>%Jp^3BFYM$cA|Z6uRhSY%mGs%CWSbf z_t66{hR#<-H9dEFtn$O>TWgiFRuI2Y;C2b}5{^nIBJF(O5dugQ(*0hL@B|lqM9KN2 z?kWz96`O;9Z6F(?WJxF4k{k>R{U4DT{CXag^3lZEdGvq6ZiJDh6-p9}P7I(r|I*RX z(~f$Yg*F?vyPB5p0!{;t7&Fz*e6v8_BQ%9_nOg&$q})j3j+mG1S=q8Q7r$KQ{)kVL z&}~n&{+%{2JgL)YB*;ol$t;d@L`l^+xP?J61~X*3x1+UL_Wam2cWN{_@AbME2z*UA zp#2cS07JlaV>dpU`40X=->}%O95ENfU1<`oPQW(cE4w1)$6vxxwhnnOQM+5$`0ys( z08dpn(Qxit!~k4Z|L~6*D_eSZi`;(;Z^1*&ZkqTgc%>ol3w(j26HJCK=%S+Z=&w1{ z$nHOT<78r%@!Jt~xn;E!cdpIyZ;n1$`Z zH!(2X=gIDm8;qHf=n&g{^(c;QH0HDZ@4wZLx5=ruDsQjOZ_GXxiaeS4a-6uGBYJ}E zUw^%tPEpot11!iUx5OW9xRLz7O@-k|-Brb3z1h zAyYnpXbWoz!8mB=Q}&k*Tm02@#jVpU3=b$RFe7v;>0DtS-CGYA4AZ%v5jEmf9oOOe zPp9JG`|bI1YBY5R_&0O{v(Tnub^R&75nAuYIe!_(aU=i3UEa$ey@zt7I~C2V-~e*= zO~k*(y(?$H7K^bVz}@bHec-`n+apa-q*&|-@Arls!!@pTBclp{NQ0F`7=^l-D(Nb_3 zj}H;@k^SN>Lo8)mAo+vU;b2>@YYFzT+jMf(fJb=e$J*37JM&%5mpi{c`$#9bll;`m!dw_G(L8e}77S3No^cKR{ogpF4N+75b{hnv`xEy+!wzE^xtHl@api zZyZL7VLk25GX;%2Nrj(-0Nf!?gZPMXKrF!RMBvCTVk-2!o5%y4~FzeATa!vGk z@@hhDcb=g?2k8~_=B1`5VnJP@kqwF?gnrr5f3ZB5usZ(`zUe-Pe354}aqtS^tU{t7 ziw@7lqszB|pOVn!+Wke{w;**f_+X?Yohk7|O1lAE(L@=?}b9Y8n) zMj^*HsJKHUCC5K!-)QJTP*j{316TUM_UQ=`(HZVJB8c+IuEH^VU+ws`f~52ESLE5-hy=^#so_2MxOCSm`NB>;1#WMfO;K6 z2YHgjJuu6kBx%DxC1}O>Q$YZx!3Eraf<(RjZQ@0xm@O?y`^*|+a8T&H2J#f0Zs((^ zX@Rc0O(4%KpQQRh3S5*?R;~m3x8(VjY|jbc)jLwI{$gwUFBDkL7+;^b=bmA-c?=7v zObbPG!o8lkMJkc$HE2ZImvM=>k_nM8C!^U$NQ}5Z)!C6R_@e%0vHj?50Gdw2ujOnV zm^zw+bQMZCMB1t-_|e5F#zM{-3| z!)y&aU}v9)y{s7D;c2N7xD|)G_N;k`w@+>lpl*7^>cU1cRTRJ`v?zZ_C6T`_O%3*u zPFpQe9dKjMMlXt?)ZFj`kCXn{P&m+*2-#GAHE0M!Yp&+ap%Jp&aoo;v!VXnl88p3; zb||6+>QGsPTt01)wmZG9w!g)r7PY*kTrq7wmb3c=?Xn2G5vtBSFx!?f*o7B?djR-+ z&$(OwN)9<|>>I#wtObf$R3X@K-b8M6HzM0 z|66sL4XSXwSl zdHhGU^PiFf?oc`UoO-orYa3#OGF@_MhFm$TUT2wpc^f8wBjoy`iB_3S@8sE1N!WaF zL7N>kE+e)JZ&2AczoB_sM_nx8Xxq2DSq--kUZyxocVyY1_;_B$n!o)wWt3OF?ehU{Op$Xz*Q2Kh81rMb~&Qmpp~e)B{Jzv&BudVx92G zvqOkdRlN`o04V##iNvr&#)-h+V-_cO2XFC+_(Nw=sUkQ&T$^EO#LiS`+2! zm|I1Z^PRt?SJ5D;o9m?QphdN%6IBP8N^2D_n>Ya~EU)$vhUkdHuggn(=xRWnG;k-@ zo&UZ_f6oLZ^F0s!?yQ8*?QR6qFot}{X3xET0D5Z&;VY-{<3#~~$m0F?wROO~48j@8 z;i@kW-{e7E#4BK1BD$N;$%@vV0AxS#qoBR%lFmCywba2iLr2iG@Crxk{RNZXgw z=i6SCobwg?^`-?~RgG|xgK(m{$G4sIt6}GFQaYSN9cJrHQZuv8rVm;G;~mWCPWM2% zqi7mD&?$ihXD#)WbZ%D>vacS}^hq)tazeKjUiTKAhuERuJEUB9E-2NTgRiZ7ut>4IWv+i-Ft1zh5~!5GQ%z;##F+;1W$D9RYj%(AYaPmCbMX($ho?i{G zT{AxtkKI;ecFr7|V@zu=4yT8vlvO+}m?%@HqB9o3wA2u9RC+;4@lsha!#AJOA7|T) z!rr9CaOSviJs~{WTuw1s9Yn*LU_4Mm@&OIWN6s=jZZ7;s&T}WN$VD~F=^ke#U0F`w zZt{iGY!rQN;YWTf-}JMX(l6WM$mv0u3TKlYXnTfbfsoXs==(v8*}aLE{{pKd(+itu z|4>g$KO<;?|9`{4|4Kdm@7OWmkzf9~`D$Jy!Jt+b0_db|^e2)QL5+n>{hY953QJK|7o~ zUFhq;`V8g1R>~)EUEU4##e#=yZ8-a$ofW+d@n~jH`bYDph0s6$vW)k{=EoIv4>3Lb ztpPzWk&moRJfI>UR_nEhv>bioEE|y0|C7xYM^>T85{=~`CzosXszn%tm1y+^{GST- zCvt@X%TM7PfAYrY{(Hp}cC-7xGRCxJk$+YN=BtAg3U}Ci2vy9W+w!}TVhJe36NrRh z!eZtxoiOV*OY7?a7`};JV)Z9d4L*Rn$RmvWj;w{9<6Q>KOchdz12tbx^>{1tyJKw>@DQ2QyJ507@5HS40HA zxezf*Lqi%sPG=1pJm^G;VKU%0sT&e2gCkhW@i5RcBXY2V81RBmW;YVkf_*dN>dG0? z$E4)yAp1thR$G*Pr6txhO9*zAroB$mnf!*ae5rX^s^)1Rxkkn09qne2BnQCs@C!FO zv4wWbZ6je%wW}GaNvsQ>EJ>Cdf)S*7EHqSmdCy?vZiiTaig6=oZ+E#Y-7(%chxA_R zK)laUW-npr_Fmk9CvqjR3kxDCDpFy@`IORTpX1lD4{X-Ka?Ht>2)wrQT@t)@9nWpW&IDPBE}c0OPJ`ZpHXASAbnpZJkB@>J8A_)#dH zD^890l?V`WOZ+?qQO>JQ$d5o`BMD0+md{t5gIyQjEY)Nrp-2Rf z_Hig+9eT*c%ZP)K@KCJA#Oov)DZ~qlvyyNm9w3c#=V!{c0*yTuX%UhLC!!#~ezKIp zqr&9^gc2l9)r-UrA1;c;KTkRS#Y0JBiB0pTGpA-J2{}N7@g&CUC&CmPfsp*6z!a7i zQM7@1#E=~IQ(}vD*r(tK4M!$ti;EXm%9Lsipx_7$S5D+gjPEZ|lWwI*lq%d~9+NIU zu%n#H-H?)q&fTLPn=AqZhl?uMz#T^C8&Q+&Q}8pq*^}T(LEcsF3<^^4cLliFLy?R$ z$D^An_(ulc?paC1&O(&-L`6o+#7D;+Sxxp|Bpqm;nh$`khXUhbjtJC=xP@0Oj*LRw zK|B@9DW!B;y)e1a3qL)oyP*B%mY?T@Cm--;zRuYg18$-!ME5e6~nJC2gd zE`7h=ss)0knPbhB9ayAv_3cn&L5*3bCq2MUwt9EX?EKo&g>h~eK88{7efpBs*He?> zUBNzI8L=9`b*~4oU%NByZ!6ib%>{@gP zc11PhWyzvwzl$`oJJ@HY94xaaBgJn2qIFq;QB>cZwrZ+_0Db~*mkvi*2!12QG&aAVNcQrK4V+R+@WCNXj_BgyS4UB!mwy-oi-lJXmw zc`;)g(A`#~UT0lcRy~I2l*w&*$O?Xj;R(Pex|)<1KfO?7ljb28HuXwU`S%L!)}H?1 z8HkO&M#PY`=P*%Pc3;END96&&;E8I~xo>7Xj*RtV%yG-JNbjT(i}JglYWY1FYW*Pk z8H@C@f1mCxd8Dq|yQ$$#XuJ?ojX3Dk2obOdXs^wQYit`)cz18|5L3&MkBg{xQ>t1( zT>bYt)QA60`^em|yMq)Zo-+YS6Y5QTJ2L4mWBKrQ#(atw&XL$yw%|vg@4cs(8xzVd zugA`&<&>*Dal`693LW&8JXqCLMq3y7HUzqLNS;L04A=xnr-I*}Ef+^LEF85C? zlhR6CNS?k~a117z!v3Q2HgvYKYcP=Q8VEQs#=tK4(~Uxaro_U^!ZK@h?c$Ld(|Fxt z?oP$l5Sr)^=DP1KdFcpsvE@8Wl0Dc*#eBS=3~{r@r`L&c`OOYlPW9M2yP;!gT?k>4 z3~kV8W_Xp)ZucA(ovVh}iIrE0Bsd$5sm=^(9zc_RunaI{F{k3JrqGEXweBZ5A(Dj- zafHpwc1U-k6H(DoMHHmY!yD=LwZet5(SSCc?Ac$La(i|=nz!CTKVF6nvE{+ddrWNP zo=5{Cibi5Cg-5c4BxxF%-61j?WEv`JQA-2a(@*2hF}3%m&j2rGcqax{V6K@i>oqbw zt6(`LL^i29gO9Y`qMq;!Mrg9a7#bAiY_VAekapETeVJ{V(UZs28AUt9KH0!be(T~z zlH?_TvHnsMm;{wPWq;9w5y2VcH$*q*wSkAST6CBRSE*i&ZVb$BO#4gB>}l`pm_thQ z^AnDoKr0gZ)s8A6?@9joN^TdSydzE$cd-YR7EA?lTGSvU#y-#MqX80W`5IC$KPih) z`_F>`I)L*rGPIvhno^jE292mOi%=CL$_>okt3vAu5-VhQ9HyBE3@m+ZHcFi>qLlwJ zMb1j3jdbNYsxvP=On51A!^S+aVRv-cc}ThpPyIrtr?%K}>tP#yqTdjmu!0DzaiQ zN@Q4O$=$7yVC}Y`%)!6G!y+?h*yxNa z(*n#3bS|!qx*xWixN&q+=*yxT=>CO)@ma1YL&ELVDASm0sA`vj)Pe;W`DxkGsz26Em$kv#HiPrYQ&ku z)wQh6s0S*do1*!H#pxF&U7TApK9{etw9QWUl4pYoP*xpG$M#fxf8Gk)9HCQ=xR`|3 z*fE#xS@YXu*!U=1*c+>uq_oVv*RVo_9JxC4UX+G2b-+Scpehn@zUxT%Y7UIn)51%y`60e>!K!7D0FJobUNY^?Jto?HhY^Ty~?=s7G6 z;^tqasp>4x+cLUSUxw`WF&^_NNQWA4x5k}W(BCabQd?jgzI6C!daq6G2D(z`UtVb{ zC$ra7_}7W1%DT_1##$j3Wvall60i}3duKgymX(iCqkc@HLph~PkufM9_PXIgh|+Ms z**tuRo5>;Y-@OKe*V1A{<8{8a?*L*;;6e!u2`?o`40o#K+2j6u9B|*j| z#<=h-70&Xg&EA_D|b2ex5BAtR4(0OtI$Dt1rX^+wN(DD!nC)=|R!xxgWi<(8ksGgE-6yW3n zlTlv3n5ZQ%3MO$?a6lp9^pp-4)4R{f4LyB&L(DDc?C9(k5MJGP&etkR~ZBDMrWdp^}oFkiA@p4nTKKrtA!S z!XLh@pzWmY%$KZ|s5YNFhj|-z(ax8&6|?13ta?;ZOWBIw5@8PCy^%`U%Ioc->I{)N zeG%eI*-GKnliPDDD3ruUN{O+{SEtJqP9D{nQ~&L$Y#IbZlN;DsQO{ULWr~{EQCJ@^ zLO@zG%2{p@a#oQZuDGIEuGo zrD>WXZ%?CHTwlK8k+mr{n6V;~wK-ukyK1e}k!3x%x>=!Z`mA{SyGhVArUu;kl33IeOc9uFw|4hdf8#jfFgkjUyPxmD+=rZ7s{@~$1z|HA`2Ot}P44;bbC!(xK zS_n*j)ASD?%Oeh$T_3vDc4NdqJB}h7tqV3%7pyZQju5GRh*;Nr1j zNW}3VE$(HZk3FMlGkIh(oSwm*Vm)_6huI_#d_H=XJ$N8xuOU+(P|49nnTV#mgnBUWkqRu|M*+y2hn`(nMk}|D@mM?%Yj3R zAvFYCH>%iIg3KXD4Hi%IpaCQRA$cEgE+{1*J9gxg`k>OTr8H}4=`NE7sEGLREb0SH z6qhX+)oHwb<_IcEO8+1~rIF!QE6bHo{WDqEL-mYkn9w+0TF(alF_&^ll)v;Yllc77y?B36Xj7zB= zJOGfpzDGWFy~YvqSy)>`2arAmi+8eYQ)ye#8LjoQv65g31u#kmls2?Q7)S1Ig3i-R zhf#{>E4HiTV_c;H>&~R#!4SGL>;7!;moNUMI-!ysHdym0z>YFOT#~b6z=R_in>YNt zE4jB6aejNjWFni?i#1%==k(?iOpZtWRMq;2vAr64jrjVkzSX@iHZP*?B+64>3)inS zPQrp@d;GFw2F9+7!vNefV;JNVDaH#p5|dVfq9s90{=y?xI# zOcdP{>C9PrOH+-AyVWwDu_564NY%EC|Ajr-k$zd(c8lf_(OBW|jN$6aMRyloKeQk3 z>sz(-t_3544&a^Y`2Ea~b>a6vC_ASpOM)m}ciFaW+wQV$ciFaW+c;(0)n&W7%Q$6r z*}63|_u<}ont930SP>7ocI*`qEA!vqUt;?;7@H^J4uyyx7GsuzWp-uROn`2|z`{cW z4~{_y0ohFgLEa_u-uCH{Tx5vMXD!*V9Lgb!t{D-o48Y!U) z?h|?tP}grJc7-yl)aZziSl>Z>#HUyijauZ_A)T|6%U(rnxTI7f{yme8Qw36TiIEC^ zfp*2RWV0EewwCCUh*;A~jXInHbO+RF9Y8#+boMZ%28;d6rJJd!rCe~vC;#kfjEOY$ z;CqkL(YGuyv~Y;{AU>9L#V$70&ex*t(TRxcMM?3C3qmX&sv_(O@PLTqIx`+g+@k8! z!*JFb2B86L42Iy7RVg??txFHq!oOnke1tGA4!FgSa~pDgI!Qy&O;=Lo2L@v5`apvp&kr4$>b^akL_ughZ;KtfdP-H9YI z39I%X|M5XN7{@BHW(srmVt`Ls8NhxiaE$cjkxN+-i}R(JPN@$cx#e&S_GPF^tdIC} z3(2k62f~=<5K4C#*C5gd@h{OKtov}oD8iSIpVlGR;$Y@F+Ly|gcn6|j%45ib8?1jq zH!HU8mja0@gX${5y-BUw)NsI?wYFtLP4{WUN0xT zmNxEr(1BG0qfvlp)#zelE{YLVUPx*prp+eeWUfjZ#;e8>eY`Yw4p~7HVT+#EpHH#{P*jkQWTfytud~GVPkY&~@m2;?|}0 z2W=c&?Fzm?t?Q60VY6nI(hLD~ph+k*8OW*XSv) z5s!>W(AskvNdHnr&m$;twYW<|Z=v2(xVw9`*K6bi{JcV2k@&Z0@3aCR#VE|B*RJ3>0MqUs~uEMsOiB6N zl;fKG#Z&x6Qn3S`T-8$JOBdT%lxU+wy<0mypFHlYoiD-WF_if&BW{pKkT3m`tltOYzwg(L&w2s zh#!ZbA@U}G(NN|1@VKPdf7P~WJlo-)Mq`uo79Vn@`?x3SkHpmHB1{Y$5Ya@4)>LtF z6*LGTd}i2|la5l#5~7M`sp34na{j$q0i43W3F3)Ij5J9GT@W;sn;D?X-gdxctoVY@ ze}>c(QN9>EBM2g49*Vsyi64rsh?$?_ga5R{fZ(|B#vZX0LS|J&i7S6K#^uOooQ!xg zhD@`FzD4oR6hB-m*4vLDtK^qVO}HIeP!p6$J$?nQ;_h+GA&sFJsp-115P26djt1%C zBy@2@v!+EU70LzoO%5m(;e(Q;(Q-@ipi|QQVHVEE$-7Fc* z3t#Bu)QAOYLXi^B<>IA$^OKsk0$hr-W&WMDWjSM2h!F@-jOdp|mJp5jgaz`vCKPts zmb-`j$_{_{s;SjM+WMlqzIf`VvM~L|usk@_MJh{M+&E)iK0U`CB{?OE<4gipMY9eF zG6uV!9U}!!O&Wi&Q_5>#w>q(N#16qycg2=>B~B%AOgo3tc)0gQUMSyR@kWxq(4&MHit_+CLqUQv?M3K|BOEXDdo zI&Zthb3e~m|5B~@5X&3B@l(eB*etFwewfo#wBxDm4H%{>--=1lcIkSsOH74+L+aJjamd% zjZl|ZHmga&Z^pqsWo8!#QMx2+NEZKsn+IpjmqDe}e8fCj=LbobT*r7Ws6{#k&iK2F z_=qOgx_5~#ll*@nPH-zI%Q{N=k;pTI$hG1}U*r6VT6DcHEv+*%|7a`K{LPHHRNIW1vuGW!q53z1 z#a!Pg{Lkj!T#PmWV@#)Xd2kCBEJvG?X$-r@S9jyM;dDF}YC+J?3YQ?78}Chv;$IuP z$uxjNYD*p%Z{ufj{D@$0rTLe{;=iI@XX2_AV&?|G>Q=w2r6C-P~u_)?yJWwzwbU#`iR%Cwj`YpR`llDx$T0-Np|LHGe1(EpE7T?RLk^@P(Q- zUU=X~fzb`zHTJ?5eIS3_RmYq<;!-VP-XB3c_fB`7e)u;u%kfq41Hn^t|DlU zU3hzmz&FGGL1VJSR|MS>&<3q2^u@Po;DK^l=8pkPKRvZp-+B3mG09Sghc!2p`P zsAoqfP>Zme&y{)tUV+a0fvaXE^Bl_HTqcdL=&+yc2NiS0^K%0rXLrnUekc;vOhe!g z>J=K_%)1AKDdD3`uq;z$`q4dOe$0YjcrndC>AyX;_99&_9Mk$Dl6w;b??DtEBu~T& zjOagGQnY+ob#dA_XPXf7q4v?quO}I=dmrb!ME7q zWwJqWI-sYP*r~szrcnD!N)Y9e1AtV^j#7X}xU5A32WLm>kQ2>{(qWojTIc2aFqV^* z5;mjN8h0K3`0_39D1gn1aL&YHV^<{}f$