版本控制與相容性

目標是在各個版本之間保持 **ABI 相容性**。因此,做出了一些選擇。

  • 大多數結構不包含嵌入式欄位或函數,而是使用自由函數,以便於新增函數。

  • 列舉類型透過 typedef/#define 定義。

當然,我們永遠不能新增/移除/變更結構成員,而且我們永遠不能變更現有函數的簽名。

在 ADBC 1.1.0 中,決定這僅適用於「公開」API,而不適用於驅動程式內部 API (AdbcDriver)。在 1.1.0 版本中,已在此結構中新增了新成員。相容性處理方式如下:

驅動程式的進入點 AdbcDriverInitFunc 會接收一個版本和一個指向函數指標表格的指標以進行初始化(即 AdbcDriver)。表格的大小將取決於版本;當接受新版本的 ADBC 時,可以擴展新的函數指標表格。對於每個版本,驅動程式都知道表格的預期大小,並且不得讀取/寫入超出該大小的欄位。如果/當我們新增新的 ADBC 版本時,可能會發生以下情況:

  • 更新後的用戶端應用程式使用舊的驅動程式程式庫。用戶端將傳遞一個大於驅動程式所識別的 version 欄位,因此驅動程式將傳回 ADBC_STATUS_NOT_IMPLEMENTED,並且用戶端可以決定是否中止或使用較舊的版本重試。

  • 舊的用戶端應用程式使用更新後的驅動程式程式庫。用戶端將傳遞一個低於驅動程式所識別的 version,因此驅動程式可能會出錯,或者如果它仍然可以實作舊的 API 契約,則初始化對應於較舊版本的表格子集。

這種方法不允許我們變更現有函數的簽名,但是我們可以新增新函數並移除現有函數。

版本控制

ADBC 的版本控制與核心 Arrow 專案分開。API 標準和組件(驅動程式管理器、驅動程式)也分別進行版本控制,但兩者都遵循語義化版本控制。

例如:組件可能會發布向後相容的版本,如 1.0.0、1.0.1、1.1.0、1.2.0 等。它們可能會發布向後不相容的版本,如 2.0.0,但仍然實作 API 標準版本 1.0.0。

同樣地,本文件描述了 ADBC API 標準版本 1.1.0。如果/當進行相容的修訂時(例如,定義了新的標準選項或 API 函數),則下一個版本將為 1.2.0。如果進行不相容的變更(例如,變更函數的簽名或語義),則下一個版本將為 2.0.0。