Arquitectura

OpenADS es un sistema de cinco capas. Cada capa es un punto de intercambio que una aplicación o test puede usar independientemente.

L1  ABI               exports extern "C" Ads*
                      (ace32/64.dll, libace.so/.dylib)
L2  Sesión            Connection / Statement / HandleRegistry / Tx
L3  Motor SQL         Lexer → Parser → Resolver → Planner → Ejecutor
                      AEP host, UDFs xBase
L4  Núcleo motor      Table / Index / MemoStore / Cursor / LockMgr
                      TxLog (WAL) / Catalog
L5  Plataforma        File / mmap / locks por rango / sockets / DLL
                      Implementaciones Win32 + POSIX

Responsabilidades por capa

Capa Responsabilidad
L1 Único módulo con ABI C. Traduce llamadas Ads* a la API C++ interna; convierte códigos de error ACE a/desde util::Error; conversiones OEM / ANSI / UTF-8 / UTF-16.
L2 Estado por conexión — tablas abiertas, sentencias SQL preparadas, pila de transacciones, registro de procedimientos AEP, clave de cifrado.
L3 Dialecto SQL completo de Advantage — árboles WHERE booleanos, joins (INNER / LEFT / RIGHT / FULL OUTER), subqueries (correlacionadas y no), GROUP BY + HAVING, UNION, funciones ventana, CTEs, CASE, proyección escalar / agregada / aritmética.
L4 Motor agnóstico al formato — Table, Index, MemoStore, Cursor, LockMgr, TxLog, Catalog. El trait Driver es el punto de extensión para nuevos formatos.
L5 Abstracción multiplataforma del SO (Win32 + POSIX).

Drivers (extensión L4)

AdtDriver    .adt + .adm + .adi    (ADS propietario — fuera de alcance)
CdxDriver    .dbf + .cdx + .fpt    (FoxPro)
NtxDriver    .dbf + .ntx + .dbt    (Clipper)
VfpDriver    .dbf + .cdx + .fpt    (Visual FoxPro)

Servidor Phase 2

openads_serverd corre L2–L5 in-process y los expone vía el protocolo de cable nativo OpenADS sobre TCP. El mismo DLL que habla con un directorio local también habla con un servidor remoto vía URI tcp://host:puerto/<dir>.

Studio Phase 2 (consola web)

Cuando el daemon se compila con OPENADS_WITH_HTTP=ON, un servidor HTTP embebido (cpp-httplib) sirve una SPA de administración en otro puerto. Cada request REST abre una conexión ABI corta — la consola web es otro consumidor del ABI público, igual que una app Harbour.