@@ -42,6 +42,7 @@ import io.airbyte.cdk.integrations.base.Source
42
42
import io.airbyte.cdk.integrations.source.jdbc.dto.JdbcPrivilegeDto
43
43
import io.airbyte.cdk.integrations.source.relationaldb.AbstractDbSource
44
44
import io.airbyte.cdk.integrations.source.relationaldb.CursorInfo
45
+ import io.airbyte.cdk.integrations.source.relationaldb.InitialLoadHandler
45
46
import io.airbyte.cdk.integrations.source.relationaldb.RelationalDbQueryUtils
46
47
import io.airbyte.cdk.integrations.source.relationaldb.RelationalDbQueryUtils.enquoteIdentifier
47
48
import io.airbyte.cdk.integrations.source.relationaldb.TableInfo
@@ -54,6 +55,7 @@ import io.airbyte.commons.util.AutoCloseableIterator
54
55
import io.airbyte.commons.util.AutoCloseableIterators
55
56
import io.airbyte.protocol.models.CommonField
56
57
import io.airbyte.protocol.models.JsonSchemaType
58
+ import io.airbyte.protocol.models.v0.AirbyteMessage
57
59
import io.airbyte.protocol.models.v0.AirbyteStreamNameNamespacePair
58
60
import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog
59
61
import io.airbyte.protocol.models.v0.ConfiguredAirbyteStream
@@ -62,6 +64,7 @@ import java.sql.Connection
62
64
import java.sql.PreparedStatement
63
65
import java.sql.ResultSet
64
66
import java.sql.SQLException
67
+ import java.time.Instant
65
68
import java.util.*
66
69
import java.util.function.Consumer
67
70
import java.util.function.Function
@@ -84,7 +87,7 @@ import org.slf4j.LoggerFactory
84
87
abstract class AbstractJdbcSource <Datatype >(
85
88
driverClass : String ,
86
89
@JvmField val streamingQueryConfigProvider : Supplier <JdbcStreamingQueryConfig >,
87
- sourceOperations : JdbcCompatibleSourceOperations <Datatype >
90
+ sourceOperations : JdbcCompatibleSourceOperations <Datatype >,
88
91
) : AbstractDbSource<Datatype, JdbcDatabase>(driverClass), Source {
89
92
@JvmField val sourceOperations: JdbcCompatibleSourceOperations <Datatype >
90
93
@@ -95,6 +98,61 @@ abstract class AbstractJdbcSource<Datatype>(
95
98
this .sourceOperations = sourceOperations
96
99
}
97
100
101
+ open fun supportResumableFullRefresh (
102
+ database : JdbcDatabase ,
103
+ airbyteStream : ConfiguredAirbyteStream
104
+ ): Boolean {
105
+ return false
106
+ }
107
+
108
+ open fun getInitialLoadHandler (
109
+ database : JdbcDatabase ,
110
+ airbyteStream : ConfiguredAirbyteStream ,
111
+ catalog : ConfiguredAirbyteCatalog ? ,
112
+ stateManager : StateManager ?
113
+ ): InitialLoadHandler <Datatype >? {
114
+ return null
115
+ }
116
+
117
+ override fun getFullRefreshStream (
118
+ database : JdbcDatabase ,
119
+ airbyteStream : ConfiguredAirbyteStream ,
120
+ catalog : ConfiguredAirbyteCatalog ? ,
121
+ stateManager : StateManager ? ,
122
+ namespace : String ,
123
+ selectedDatabaseFields : List <String >,
124
+ table : TableInfo <CommonField <Datatype >>,
125
+ emittedAt : Instant ,
126
+ syncMode : SyncMode ,
127
+ cursorField : Optional <String >
128
+ ): AutoCloseableIterator <AirbyteMessage > {
129
+ if (
130
+ supportResumableFullRefresh(database, airbyteStream) &&
131
+ syncMode == SyncMode .FULL_REFRESH
132
+ ) {
133
+ val initialLoadHandler =
134
+ getInitialLoadHandler(database, airbyteStream, catalog, stateManager)
135
+ ? : throw IllegalStateException (
136
+ " Must provide initialLoadHandler for resumable full refresh."
137
+ )
138
+ return initialLoadHandler.getIteratorForStream(airbyteStream, table, Instant .now())
139
+ }
140
+
141
+ // If flag is off, fall back to legacy non-resumable refresh
142
+ return super .getFullRefreshStream(
143
+ database,
144
+ airbyteStream,
145
+ catalog,
146
+ stateManager,
147
+ namespace,
148
+ selectedDatabaseFields,
149
+ table,
150
+ emittedAt,
151
+ syncMode,
152
+ cursorField,
153
+ )
154
+ }
155
+
98
156
override fun queryTableFullRefresh (
99
157
database : JdbcDatabase ,
100
158
columnNames : List <String >,
0 commit comments