Jdbc2JavaConverter.java

/*
 * SPDX-FileCopyrightText: 2025 kaumei.io
 * SPDX-License-Identifier: Apache-2.0
 */
package io.kaumei.jdbc.anno.jdbc2java;

import com.palantir.javapoet.CodeBlock;
import io.kaumei.jdbc.anno.gen.TargetMethod;
import io.kaumei.jdbc.anno.model.*;
import io.kaumei.jdbc.anno.store.Converter;
import io.kaumei.jdbc.anno.store.ConverterBasis;
import io.kaumei.jdbc.anno.store.SearchKey;
import io.kaumei.jdbc.anno.store.SourceDV;

import javax.lang.model.type.TypeMirror;
import java.util.Map;

public sealed class Jdbc2JavaConverter
        extends ConverterBasis
        permits Jdbc2JavaConverter.ColumnConverter, Jdbc2JavaConverter.RowConverter {

    interface Placeholder extends Converter.Placeholder {
        Jdbc2JavaConverter resolve(Map<SearchKey, Jdbc2JavaConverter> converter);
    }

    public abstract static sealed class ColumnConverter
            extends Jdbc2JavaConverter
            permits ConverterColumnNative, ConverterColumnObject, ConverterColumnResultSet {

        protected ColumnConverter(TypeMirror type, SourceDV source, Visibility visibility) {
            super(type, source, visibility);
        }

        public abstract boolean hasSqlType();

        public abstract SQLTypeDV sqlType();

        public abstract CodeBlock columnNullCheck(String varName);

        public abstract CodeBlock callNullCheck(String varName);

        public abstract void addColumnByIndex(TargetMethod builder, String localVarName, ColumnIndex index, OptionalFlag optional);

        public abstract void addColumnByName(TargetMethod builder, String localVarName, SQLNameDV columnName, OptionalFlag optional);
    }

    public interface Callable {
            //boolean hasSqlType();
        void addCallToRow(TargetMethod builder, String localVarName, OptionalFlag optional, Map<String, ColumnIndex> map);
    }

    public abstract static sealed class RowConverter
            extends Jdbc2JavaConverter
            permits ConverterRowObjects, ConverterRowResultSet {
        protected RowConverter(TypeMirror type, SourceDV source, Visibility visibility) {
            super(type, source, visibility);
        }

        public abstract void addResultSetToRow(TargetMethod builder, String localVarName, OptionalFlag optional);
    }

    // ------------------------------------------------------------------------

    protected Jdbc2JavaConverter(TypeMirror type, SourceDV source, Visibility visibility) {
        super(type, source, visibility);
    }

}