/*
* 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.
*/
package org.jdbi.v3.postgres;
import java.util.UUID;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.core.spi.JdbiPlugin;
/**
* Postgres plugin.
*
* <p>
* A note about the mapping between the Postgres {@code interval} type and the Java {@link java.time.Period} and
* {@link java.time.Duration} types:
* The Java library authors are much more strict about the temporal amounts representable by Periods and Durations than
* Postgres is with its {@code interval} type. The argument factories and column mapper factories implemented in this
* package respect this spirit of unambiguous strictness. Consequently:
* <ul>
* <li>All {@link java.time.Period}s can be mapped to {@code interval}s.</li>
* <li>Not all {@link java.time.Duration}s can be mapped to {@code interval}s.</li>
* <li>Not all {@code interval}s can be mapped to {@link java.time.Period}s.</li>
* <li>Not all {@code interval}s can be mapped to {@link java.time.Duration}s.</li>
* </ul>
* For more specific detail, see the caveats in the documentation for {@link DurationArgumentFactory},
* {@link PeriodColumnMapperFactory}, and {@link DurationColumnMapperFactory}.
*
* <p>
* In addition, some potentially unexpected implicit conversions can occur by virtue of the Postgres <em>server</em>
* logic. For example, at the time of writing, storing a Period of -3 years, 2 months, and -1 days results in an
* interval (and consequently, a column-mapped Period) of <em>-2 years, -10 months</em>, and -1 days.
*/
public class PostgresPlugin implements JdbiPlugin {
@Override
public void customizeJdbi(Jdbi db) {
db.registerArgument(new TypedEnumArgumentFactory());
db.registerArgument(new JavaTimeArgumentFactory());
db.registerArgument(new DurationArgumentFactory());
db.registerArgument(new PeriodArgumentFactory());
db.registerArgument(new InetArgumentFactory());
db.registerArgument(new HStoreArgumentFactory());
db.registerArgument(new UUIDArgumentFactory());
db.registerArrayType(int.class, "integer");
db.registerArrayType(Integer.class, "integer");
db.registerArrayType(long.class, "bigint");
db.registerArrayType(Long.class, "bigint");
db.registerArrayType(String.class, "varchar");
db.registerArrayType(UUID.class, "uuid");
db.registerArrayType(float.class, "real");
db.registerArrayType(Float.class, "real");
db.registerArrayType(double.class, "double precision");
db.registerArrayType(Double.class, "double precision");
db.registerColumnMapper(new JavaTimeMapperFactory());
db.registerColumnMapper(new HStoreColumnMapper());
db.registerColumnMapper(new DurationColumnMapperFactory());
db.registerColumnMapper(new PeriodColumnMapperFactory());
}
}