{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "architecture": {
    "summary": "A wire-protocol decoder that writes Apache Arrow column buffers as it reads the socket.",
    "dataPath": [
      "Database wire protocol",
      "Arpeio driver (native protocol decoder)",
      "Arrow column buffers",
      "Your dataframe"
    ],
    "comparison": {
      "odbcJdbcStack": {
        "steps": [
          "Database wire protocol",
          "Vendor client library (OCI, libpq, MSODBCSQL)",
          "ODBC / JDBC row API",
          "Row objects, one per record",
          "Column-wise conversion to Arrow",
          "Your dataframe"
        ],
        "cost": "Five hops, two full copies of the data and a client library to deploy on every machine."
      },
      "arpeioStack": {
        "steps": [
          "Database wire protocol",
          "Arpeio driver (native protocol decoder)",
          "Arrow column buffers",
          "Your dataframe"
        ],
        "cost": "The driver writes Arrow buffers as it decodes the wire. Nothing to convert afterwards."
      },
      "note": "Because the result is already Arrow, pandas, Polars, DuckDB and Spark consume it with zero copy."
    },
    "runtimeDependencies": "OpenSSL, beyond libc",
    "standard": {
      "name": "ADBC (Arrow Database Connectivity)",
      "specification": "https://arrow.apache.org/adbc/",
      "apiShape": "Columnar - a query returns Arrow RecordBatches rather than rows"
    }
  },
  "installation": {
    "model": "One-line installer that downloads the driver, installs it per-user by default and registers an ADBC manifest so clients can find it by name.",
    "commands": {
      "linuxMacOS": "curl -fsSL https://raw.githubusercontent.com/arpe-io/adbc-drivers/main/install.sh | sh -s -- arrowtds --license /path/to/your.lic",
      "windowsPowerShell": "& ([scriptblock]::Create((irm https://raw.githubusercontent.com/arpe-io/adbc-drivers/main/install.ps1))) arrowtds -License C:\\path\\to\\your.lic",
      "swapNote": "Replace arrowtds with arrowfebe or arrowttc as needed.",
      "systemWide": "Use --system (with sudo or an elevated shell) for a machine-wide installation."
    },
    "maintenance": {
      "list": "curl -fsSL https://raw.githubusercontent.com/arpe-io/adbc-drivers/main/install.sh | sh -s -- --list",
      "installed": "curl -fsSL https://raw.githubusercontent.com/arpe-io/adbc-drivers/main/install.sh | sh -s -- --installed",
      "uninstall": "curl -fsSL https://raw.githubusercontent.com/arpe-io/adbc-drivers/main/install.sh | sh -s -- --uninstall arrowtds"
    },
    "paths": [
      { "os": "Linux", "driverFiles": "~/.local/lib/arpeio-adbc/", "manifestSearchPath": "~/.config/adbc/drivers" },
      { "os": "macOS", "driverFiles": "~/.local/lib/arpeio-adbc/", "manifestSearchPath": "~/Library/Application Support/ADBC/Drivers" },
      { "os": "Windows", "driverFiles": "%LOCALAPPDATA%\\arpeio-adbc\\", "manifestSearchPath": "%LOCALAPPDATA%\\ADBC\\Drivers" }
    ],
    "loadByName": "Because the installer registers an ADBC manifest, clients find the driver from its name alone - no path, no LD_LIBRARY_PATH."
  },
  "connectionUris": {
    "arrowtds": "sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true",
    "arrowfebe": "postgresql://dbuser:<password>@host:5432/appdb?sslmode=require",
    "arrowttc": "oracle://dbuser:<password>@dbhost:1521/appdb?ssl_mode=verify-full",
    "arrowdrda": "db2://dbuser:<password>@host:50000/appdb",
    "note": "Full option reference per driver lives in the documentation under drivers/<driver>/connection/."
  },
  "adbcOptions": {
    "uri": "Connection URI, passed as the standard ADBC uri option",
    "licence": [
      "arpeio.adbc.license - inline licence text",
      "arpeio.adbc.license_file - path to a licence file"
    ],
    "environmentVariables": [
      "ARPEIO_ADBC_LICENCE",
      "ARPEIO_ADBC_LICENCE_FILE"
    ]
  },
  "clientExamples": {
    "python": "import adbc_driver_manager.dbapi as dbapi\n\nwith dbapi.connect(driver=\"arrowtds\",\n                   db_kwargs={\"uri\": \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\"}) as conn:\n    cur = conn.cursor()\n    cur.execute(\"SELECT * FROM dbo.orders\")\n    table = cur.fetch_arrow_table()   # ready as Arrow",
    "c": "#include <arrow-adbc/adbc.h>\n// (error checks elided for brevity)\n\nAdbcError e = {}; AdbcDatabase db = {}; AdbcConnection conn = {}; AdbcStatement st = {};\n\nAdbcDatabaseNew(&db, &e);\nAdbcDatabaseSetOption(&db, \"driver\", \"arrowtds\", &e);\nAdbcDatabaseSetOption(&db, \"uri\", \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\", &e);\nAdbcDatabaseInit(&db, &e);\n\nAdbcConnectionNew(&conn, &e); AdbcConnectionInit(&conn, &db, &e);\nAdbcStatementNew(&conn, &st, &e);\nAdbcStatementSetSqlQuery(&st, \"SELECT * FROM dbo.orders\", &e);\n\nArrowArrayStream stream = {}; int64_t n = -1;\nAdbcStatementExecuteQuery(&st, &stream, &n, &e);   // consume `stream`",
    "csharp": "using Apache.Arrow.Adbc;\nusing Apache.Arrow.Adbc.DriverManager;\n\nusing var driver = AdbcDriverManager.FindLoadDriver(\"arrowtds\", loadOptions: AdbcLoadFlags.Default);\nusing var database = driver.Open(new Dictionary<string, string> {\n    [\"uri\"] = \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\" });\n\nusing var connection = database.Connect(null);\nusing var statement = connection.CreateStatement();\nstatement.SqlQuery = \"SELECT * FROM dbo.orders\";\nusing var stream = statement.ExecuteQuery().Stream!;   // IArrowArrayStream",
    "go": "var drv drivermgr.Driver\n\ndb, _ := drv.NewDatabase(map[string]string{\n    \"driver\":           \"arrowtds\",\n    adbc.OptionKeyURI:  \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\",\n})\n\nconn, _ := db.Open(ctx)\nstmt, _ := conn.NewStatement()\n_ = stmt.SetSqlQuery(\"SELECT * FROM dbo.orders\")\n\nreader, _, _ := stmt.ExecuteQuery(ctx)   // array.RecordReader\ndefer reader.Release()",
    "java": "Map<String, Object> params = new HashMap<>();\nJniDriver.PARAM_DRIVER.set(params, \"arrowtds\");\nAdbcDriver.PARAM_URI.set(params, \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\");\n\ntry (BufferAllocator a = new RootAllocator();\n     AdbcDatabase db = new JniDriver(a).open(params);\n     AdbcConnection conn = db.connect();\n     AdbcStatement st = conn.createStatement()) {\n    st.setSqlQuery(\"SELECT * FROM dbo.orders\");\n    try (AdbcStatement.QueryResult r = st.executeQuery()) {\n        ArrowReader reader = r.getReader();\n    }\n}",
    "r": "library(adbcdrivermanager)\n\ndb <- adbc_database_init(adbc_driver(\"arrowtds\"),\n                         uri = \"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\")\ncon <- adbc_connection_init(db)\n\ntable <- read_adbc(con, \"SELECT * FROM dbo.orders\") |> arrow::as_arrow_table()",
    "rust": "use adbc_core::{Connection, Database, Driver, Statement, LOAD_FLAG_DEFAULT};\nuse adbc_core::options::{AdbcVersion, OptionDatabase, OptionValue};\nuse adbc_driver_manager::ManagedDriver;\n\nlet mut driver = ManagedDriver::load_from_name(\"arrowtds\", None, AdbcVersion::default(), LOAD_FLAG_DEFAULT, None)?;\nlet mut db = driver.new_database_with_opts([(OptionDatabase::Uri,\n    OptionValue::String(\"sqlserver://dbuser:<password>@host:1433/?database=appdb&encrypt=true\".into()))])?;\n\nlet mut conn = db.new_connection()?;\nlet mut stmt = conn.new_statement()?;\nstmt.set_sql_query(\"SELECT * FROM dbo.orders\")?;\nlet reader = stmt.execute()?;   // impl RecordBatchReader"
  },
  "documentationPages": {
    "baseUrl": "https://adbc-drivers-docs.arpe.io/drivers/",
    "perDriver": [
      "connection/ - connection and URI options",
      "authentication/ - authentication mechanisms",
      "data-types/ - type mappings",
      "compatibility/ - supported versions and services",
      "examples/ - client examples",
      "environment-variables/ - environment variable reference",
      "licensing/ - licence configuration",
      "troubleshooting/ - troubleshooting guide",
      "whats-new/ - release notes"
    ]
  },
  "metadata": {
    "lastUpdated": "2026-09-07",
    "dataFormat": "JSON",
    "purpose": "AI Agent Knowledge Base",
    "audience": "LLMs and AI Agents",
    "schemaVersion": "1.0.0"
  }
}
