Skip to content

ROneCOne 1.8.0

Choose a tag to compare

@WilliamSmithEdward WilliamSmithEdward released this 28 Jul 03:21
· 76 commits to main since this release

ROneCOne 1.8.0

ROneCOne 1.8.0 is about doing less work. A query now runs where the data lives instead of after
loading every row into Excel. A command can be held in conversation instead of restarted for each
line. And a large JSON response can be read for the handful of members you actually want, rather
than parsed in full and then discarded. Each one replaces a pattern that looked fine until the
data grew.

Highlights

  • connection.Queryable(tableName) compiles the runtime's own expression trees into parameterized
    SQL, so the filter happens in the database. Where, OrderBy, OrderByDescending, ThenBy,
    ThenByDescending, SelectColumns, Take, and Skip compose immutably; Count, AnyItem,
    FirstOrDefault, ToDataTable, ToDataTableAsync, and CountAsync execute; ToSqlString and
    SqlParameterValues render exactly what will be sent. Every captured constant leaves as a ?
    marker, so a value can never be read as SQL. A Null becomes IS NULL, string helpers become
    dialect-escaped LIKE, and IsIn becomes an IN list. Anything untranslatable refuses with the
    typed ROneCOne.QueryError instead of quietly falling back to a client-side scan
  • ROneCOne.Process.StartSession(command, [workingDirectory], [encodingName]) keeps one cmd.exe
    alive for a real conversation: WriteAsync and WriteLineAsync queue input, CloseInput
    signals end of file, ReadLineAsync and ReadErrorLineAsync await the next line on each stream
    separately, ReadAvailable and ReadErrorAvailable take what is buffered, ReadToEndAsync
    collects the rest, and WaitForExitAsync resolves to the exit code, alongside HasExited,
    ExitCode, ProcessId, and KillProcess. Nothing blocks Excel: reads size themselves from
    PeekNamedPipe, and writes ride an overlapped named pipe so an oversized payload pends instead
    of freezing the host
  • Json.DeserializeOnly(text, paths) walks a document once and materializes only the paths you
    name, preserving structure so navigation is identical to Deserialize, and
    Json.DeserializeAt(text, path) returns the single value one path addresses. DeserializeTable
    and DeserializeObjects now apply arrayPath during the scan rather than after a full parse
  • Binding is also fixed rather than merely faster: DeserializeInto and DeserializeObjects no
    longer raise on a JSON member the target class does not model, matching System.Text.Json
  • A fifteenth demo workbook queries a generated workbook offline through the ACE provider, and the
    process and JSON demos gain sessions and partial reads in situ

Release evidence

Each of three fresh Microsoft 365 Excel processes passed 955 live assertions, including SQL text
and bound values across both dialects, an injection-shaped customer name that matches one row
literally and cannot widen the result set, IS NULL translation, dialect-escaped wildcards, every
query refusal path, a two-answer conversation with one process, separated standard error, sort
finishing only once CloseInput signals end of file, KillProcess, and a partial JSON read that
is required to beat a whole parse on a document whose bulk is one unwanted member. All ten suite
benchmark scenarios met their release gates in every sample; the medians ran invocation 0.10,
collection 0.16, ordering 0.90, SHA-256 at 10,000 and 100,000 elements 0.14 and 0.26, keyed
mutation 0.64, and constrained maintenance 0.45 seconds.

Static analysis reported zero diagnostics across the runtime source, the live test modules, and
all fifteen demo modules; 77 Python contract tests pin the source and demo shapes. Every packaged
VBA module round-tripped byte-for-byte. The fifteen demos executed 144 practical examples without
an Office or VBE popup, and every rendered worksheet passed visual review. The new query demo
counts 50,000 rows server-side in 0.04 seconds against a 5-second gate.

Host boundaries

VBA reserves Kill for its file-deletion statement, so a session terminates through
KillProcess, joining Connect, Disconnect, YieldOnce, IsIn, and SingleItem. VBA also
keeps one global casing per identifier, so declaring a lowercase name anywhere rewrites every
bare Name in the project and breaks bang syntax against a case-sensitive column lookup; a source
contract now refuses that declaration. Neither is visible to static analysis, and both were found
by the live compiler.

Execution and network contract

Tasks remain cooperative on Excel's thread, and ROneCOne makes no VBA parallelism claim. A query
executes through the existing provider path, so its failure detail and cancellation behavior are
unchanged. A session owns kernel32 pipes directly and polls them cooperatively. The network is
touched only by the HTTP client, and only for URLs you request: the runtime never phones home,
sends no telemetry, and requires no VBIDE trust, installs, or references. The HTTP demo and the
HTTP test contract are the only release gates that need internet access; the query, process, and
JSON demos run offline.

Import ROneCOne.cls to begin, or open the Query demo to watch a LINQ expression become SQL
before it runs. SHA-256 checksums for every release asset are included with the download.