Versão analisada: 1.5.x (paridade SQLRDD)
Data: 2026-06-28
Sumário Executivo
O OpenADS reimplementa o Advantage Database Server (ADS) da SAP como uma biblioteca partilhada (ace64.dll) e um daemon de servidor. O engine cobre a maioria das operações ACE API do dia-a-dia, com suporte completo a CDX/NTX, suporte parcial a ADT/ADI, e um motor SQL robusto mas com lacunas significativas em DDL avançado. A camada remota suporta ~84 opcodes do wire protocol. Existem 39 funções AdsDD* documentadas, das quais a maioria está implementada.
1. ACE API — Funções Exportadas
1.1 Cobertura Geral
Das ~300+ funções Ads* definidas no arquivo ace_exports.cpp (~20.000 linhas):
Categoria
Total
Implementadas
Stubs/No-op
Não implementadas
Conexão
6
4
0
2 (AdsFindConnection, AdsFindConnection25)
Tabelas
25
22
1
2 (AdsGetTableHandle25, AdsOpenTable90)
Índices
22
20
0
2 (AdsCreateFTSIndex, AdsGetFTSIndexes)
Campos/I-O
30
28
0
2 (AdsGetFieldW, AdsSetStringW)
SQL
12
10
0
2 (AdsExecuteSQL, AdsPrepareSQL parcial)
Transações
7
5
2
0
Filtros/AOF
8
6
2
0
Relações
4
3
1
0
Bloqueios
8
6
2
0
Bookmarks
4
4
0
0
Memo/Binário
6
5
0
1 (AdsGetMemoDataType parcial)
Encriptação
7
2
5
0
Data Dictionary
39
30+
9
0
Management (Mg)
14
10
4
0
Configuração
12
8
4
0
1.2 Funções Completamente Implementadas (exemplos principais)
† SELECT * FROM system.tables / system.columns / system.iota é reescrito para information_schema ou sqlite_master em ligações URI SQL. Ver docs/OPENADS_PLUS.md.
6. Data Dictionary (AdsDD*)
6.1 Operações Implementadas
Operação
Estado
AdsDDCreate
✅
AdsDDAddTable (AddTableToDatabase)
✅
AdsDDRemoveTable
✅
AdsDDAddIndexFile
✅
AdsDDRemoveIndexFile
✅
AdsDDCreateUser
✅
AdsDDDeleteUser
✅
AdsDDAddUserToGroup
✅
AdsDDRemoveUserFromGroup
✅
AdsDDCreateLink
✅
AdsDDDropLink
✅
AdsDDModifyLink
✅
AdsDDCreateRefIntegrity
✅
AdsDDRemoveRefIntegrity
✅
AdsDDCreateTrigger
✅
AdsDDDropTrigger
✅
AdsDDCreateProcedure
✅
AdsDDDropProcedure
✅
AdsDDCreateFunction
✅
AdsDDDropFunction
✅
AdsDDCreateView
✅
AdsDDDropView
✅
AdsDDGetTableProperty
✅ (props 202, 213, 704)
AdsDDSetTableProperty
✅ (props 202, 213, 704)
AdsDDGetFieldProperty
✅
AdsDDSetFieldProperty
✅
AdsDDGetDatabaseProperty
✅
AdsDDSetDatabaseProperty
✅
AdsDDGetUserProperty
✅
AdsDDSetUserProperty
✅
AdsDDGrantPermission
✅
AdsDDRevokePermission
✅
AdsDDGetPermissions
✅ (lazy cache O(1))
AdsDDGetUserTableRights
✅
6.2 Formato Binário SAP .add
Característica
Estado
Leitura de Records Tables/Indexes/Users/Groups
✅
Leitura de Permission Records
✅
Decodificação XOR de group membership
✅
Escrita no formato nativo OpenADS
✅
Compatibilidade com SAP ACE DLL
⚠️ Parcial (group membership encriptado não decodificado)
7. Encriptação
Característica
Estado
AES-256-CTR (CDX tables)
✅ (via AdsEncryptTable)
SQLCipher (SQLite)
✅ (OPENADS_WITH_SQLCIPHER)
MSSQL TLS-in-TDS
✅ (OPENADS_WITH_MSSQL)
AdsSetEncryptionPassword
✅
AdsEncryptTable
✅
AdsDecryptTable
❌ (não implementado)
AdsEncryptRecord
❌ (não implementado)
AdsDecryptRecord
❌ (não implementado)
AdsEnableEncryption
❌ (não implementado)
AdsDisableEncryption
✅ (no-op)
AdsIsEncryptionEnabled
✅ (retorna 0)
AdsIsTableEncrypted
✅ (retorna 0)
AdsIsRecordEncrypted
✅ (retorna 0)
8. Memo / Campos Binários
Característica
Estado
Formato FPT (FoxPro)
✅
Formato DBT (dBASE)
✅
Formato ADM (ADT)
✅
Leitura de memo
✅
Escrita de memo
✅
Block type (Text/Picture/Object)
✅
field_memo_type
✅
Memo block reclamation (PACK)
❌ (no-op)
Blob via SQLite/PostgreSQL/MariaDB
✅
Blob via MSSQL/Firebird
⚠️ Parcial
9. Funcionalidades Não Implementadas ou Parciais
9.1 Completamente Ausentes
VFP (Visual FoxPro) — driver declarado mas retorna erro
DROP TABLE / DROP INDEX / ALTER TABLE — sem DDL destrutivo
CREATE VIEW / CREATE TRIGGER — sem SQL DDL avançado
COMMIT / ROLLBACK SQL — sem transações via SQL
TRUNCATE TABLE
Views (CREATE VIEW, DROP VIEW)
Sequences / Auto-increment via SQL
Funções de janela além de ROW_NUMBER/RANK/DENSE_RANK
Agregações além de COUNT/SUM/AVG/MIN/MAX (sem STRING_AGG, LISTAGG, etc.)
CROSS JOIN, NATURAL JOIN, SELF JOIN
FULL OUTER JOIN para 3+ tabelas
CHECK constraints, DEFAULT values no CREATE TABLE
UPDATE com expressões (SET col = col + 1)
Memo block reclamation (PACK não limpa blocos livres)
Server-side TLS (requer proxy reverso)
Transações via wire protocol
CreateTable/DropTable via wire protocol
9.2 Parcialmente Implementadas
ADI Index — multi-tag e character keys, mas sem descending e sem conditional
VFP — driver declarado mas inoperacional
MSSQL — escrita e DDL navegacional disponíveis via URI; wire protocol remoto ainda sem CreateTable/DropTable
Encriptação — AdsEncryptTable funciona, mas AdsDecryptTable/AdsEncryptRecord/AdsDecryptRecord não
SAP .add group membership — decodificação XOR funciona mas criptografia proprietária não decodificada
CTEs — apenas single CTE (sem nested/multi-level)
FULL OUTER JOIN — apenas para 2 tabelas
10. Testes Unitários
O projeto contém 873 testes unitários (doctest), dos quais 872 passam e 1 falha (concorrência SQLite). A cobertura inclui: