Skip to content

Releases: mvx-lang/mvx

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 17 Sep 03:21
2747b20

What's Changed

  • docs: a theory page on classes and objects by @gheydon in #194
  • docs: bind the classes-and-objects page to its tracking issue by @gheydon in #196
  • docs: the real OpenQM syntax in the classes page by @gheydon in #197
  • #198 install the git package with the toolchain, not beside it by @gheydon in #199
  • docs: bump the wiki to the packages-and-install rewrite by @gheydon in #200
  • #201 mkpkg: fall back to a libs: line when pkg-config knows nothing by @gheydon in #202
  • #203 pin the release runner, so the glibc floor stops moving on its own by @gheydon in #204
  • #206 install mvpkg 1.24.0, so a new toolchain gets the new registry default by @gheydon in #207
  • #205 a source tarball says the version it was released as by @gheydon in #208
  • #205 carry the source-version stamp to main, where the action is consumed by @gheydon in #209
  • #210 an installed toolchain finds its own system account, everywhere it looks by @gheydon in #211
  • #212 the install asks which package version instead of pinning one by @gheydon in #213
  • docs: bump the wiki to the install-time version choice by @gheydon in #214
  • #212 the image build lists releases with a token, and a rejected token falls back by @gheydon in #215
  • Merge main into develop so main can take develop cleanly by @gheydon in #216
  • Merge develop into main: v0.2.2 by @gheydon in #217

Full Changelog: v0.2.1...v0.2.2

What's Changed

  • docs: a theory page on classes and objects by @gheydon in #194
  • docs: bind the classes-and-objects page to its tracking issue by @gheydon in #196
  • docs: the real OpenQM syntax in the classes page by @gheydon in #197
  • #198 install the git package with the toolchain, not beside it by @gheydon in #199
  • docs: bump the wiki to the packages-and-install rewrite by @gheydon in #200
  • #201 mkpkg: fall back to a libs: line when pkg-config knows nothing by @gheydon in #202
  • #203 pin the release runner, so the glibc floor stops moving on its own by @gheydon in #204
  • #206 install mvpkg 1.24.0, so a new toolchain gets the new registry default by @gheydon in #207
  • #205 a source tarball says the version it was released as by @gheydon in #208
  • #205 carry the source-version stamp to main, where the action is consumed by @gheydon in #209
  • #210 an installed toolchain finds its own system account, everywhere it looks by @gheydon in #211
  • #212 the install asks which package version instead of pinning one by @gheydon in #213
  • docs: bump the wiki to the install-time version choice by @gheydon in #214
  • #212 the image build lists releases with a token, and a rejected token falls back by @gheydon in #215
  • Merge main into develop so main can take develop cleanly by @gheydon in #216
  • Merge develop into main: v0.2.2 by @gheydon in #217

Full Changelog: v0.2.1...v0.2.2

dev

dev Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Aug 08:58
7386ed6

What's Changed

Full Changelog: v0.1.4...dev

What's Changed

Full Changelog: v0.1.4...dev

What's Changed

  • #136 a package declares its verbs, and mkpkg derives the VOC record by @gheydon in #139
  • #142 PLATFORM.H says it is generated, and names the master file by @gheydon in #143
  • #130 dynamic arrays: the index is reached, believed, and kept by @gheydon in #144
  • #145 COUNT and DCOUNT ask the index instead of scanning by @gheydon in #145
  • #146 INSERT and DELETE stop rebuilding the value by @gheydon in #146
  • #147 the reductions stop paying for generality they do not use by @gheydon in #147
  • #148 a benchmark for the sort inside the SORT and LIST verbs by @gheydon in #148
  • #149 the repository workflow mv_git ended up with by @gheydon in #149
  • #150 A SQLite storage backend, and FILELIST stops naming drivers by @gheydon in #151
  • #152 A MySQL / MariaDB storage backend by @gheydon in #154
  • #155 One logical WRITE is one transaction (driver ABI 11) by @gheydon in #156
  • #158 one column per attribute, and a deterministic read-back by @gheydon in #159
  • #160 don't truncate the package path, don't hash the checkout path by @gheydon in #161
  • #131 cover what mvx-git adopt asks about the open form by @gheydon in #132
  • #164 phrases, a default column list, and a dictionary listing worth reading by @gheydon in #165
  • demo-tests.sh belongs with the account it tests by @gheydon in #163
  • Bump the demo submodule so its suite is reachable by @gheydon in #166

Full Changelog: v0.1.4...dev

What's Changed

  • #136 a package declares its verbs, and mkpkg derives the VOC record by @gheydon in #139
  • #142 PLATFORM.H says it is generated, and names the master file by @gheydon in #143
  • #130 dynamic arrays: the index is reached, believed, and kept by @gheydon in #144
  • #145 COUNT and DCOUNT ask the index instead of scanning by @gheydon in #145
  • #146 INSERT and DELETE stop rebuilding the value by @gheydon in #146
  • #147 the reductions stop paying for generality they do not use by @gheydon in #147
  • #148 a benchmark for the sort inside the SORT and LIST verbs by @gheydon in #148
  • #149 the repository workflow mv_git ended up with by @gheydon in #149
  • #150 A SQLite storage backend, and FILELIST stops naming drivers by @gheydon in #151
  • #152 A MySQL / MariaDB storage backend by @gheydon in #154
  • #155 One logical WRITE is one transaction (driver ABI 11) by @gheydon in #156
  • #158 one column per attribute, and a deterministic read-back by @gheydon in #159
  • #160 don't truncate the package path, don't hash the checkout path by @gheydon in #161
  • #131 cover what mvx-git adopt asks about the open form by @gheydon in #132
  • #164 phrases, a default column list, and a dictionary listing worth reading by @gheydon in #165
  • demo-tests.sh belongs with the account it tests by @gheydon in #163
  • Bump the demo submodule so its suite is reachable by @gheydon in #166

Full Changelog: v0.1.4...dev

What's Changed

  • #136 a package declares its verbs, and mkpkg derives the VOC record by @gheydon in #139
  • #142 PLATFORM.H says it is generated, and names the master file by @gheydon in #143
  • #130 dynamic arrays: the index is reached, believed, and kept by @gheydon in #144
  • #145 COUNT and DCOUNT ask the index instead of scanning by @gheydon in #145
  • #146 INSERT and DELETE stop rebuilding the value by @gheydon in #146
  • #147 the reductions stop paying for generality they do not use by @gheydon in #147
  • #148 a benchmark for the sort inside the SORT and LIST verbs by @gheydon in #148
  • #149 the repository workflow mv_git ended up with by @gheydon in #149
  • #150 A SQLite storage backend, and FILELIST stops naming drivers by @gheydon in #151
  • #152 A MySQL / MariaDB storage backend by @gheydon in #154
  • #155 One logical WRITE is one transaction (driver ABI 11) by @gheydon in #156
  • #158 one column per attribute, and a deterministic read-back by @gheydon in #159
  • #160 don't truncate the package path, don't hash the checkout path by @gheydon in #161
  • #131 cover what mvx-git adopt asks about the open form by @gheydon in #132
  • #164 phrases, a default column list, and a dictionary listing worth reading by @gheydon in #165
  • demo-tests.sh belongs with the account it tests by @gheydon in #163
  • Bump the demo submodule so its suite is reachable by @gheydon in #166
  • publish-source: take an artifact base, like the build actions do by @gheydon in #167

Full Changelog: v0.1.4...dev

What's Changed

  • #136 a package declares its verbs, and mkpkg derives the VOC record by @gheydon in #139
  • #142 PLATFORM.H says it is generated, and names the master file by @gheydon in #143
  • #130 dynamic arrays: the index is reached, believed, and kept by @gheydon in #144
  • #145 COUNT and DCOUNT ask the index instead of scanning by @gheydon in #145
  • #146 INSERT and DELETE stop rebuilding the value by @gheydon in #146
  • #147 the reductions stop paying for generality they do not use by @gheydon in #147
  • #148 a benchmark for the sort inside the SORT and LIST verbs by @gheydon in #148
  • #149 the repository workflow mv_git ended up with by @gheydon in #149
  • #150 A SQLite storage backend, and FILELIST stops naming drivers by @gheydon in #151
  • #152 A MySQL / MariaDB storage backend by @gheydon in #154
  • #155 One logical WRITE is one transaction (driver ABI 11) by @gheydon in #156
  • #158 one column per attribute, and a deterministic read-back by @gheydon in #159
  • #160 don't truncate the package path, don't hash the checkout path by @gheydon in #161
  • #131 cover what mvx-git adopt asks about the open f...
Read more

mvx v0.2.1

Choose a tag to compare

@gheydon gheydon released this 09 Sep 07:52

A new account keeps its files in sqlite

This changes where a new account stores its data. Existing accounts do not move.

lmdb pushes nothing down. Its driver implements select_begin/next/end/count and the index hooks and nothing else — no select_where, no select_order, no filtered COUNT, no SUM, no join, no explain — so every WITH streamed the whole id list to the verb and filtered it there. sqlite answers those in SQL, and is the same deal for the operator: one local file, no server to run.

The difference shows in what DESCRIBE reports. Where a new account used to say:

lmdb: no server-side query planner; the driver returns the id list ...

it now says:

sqlite: SELECT id FROM "CUST" WHERE ...

Nothing existing moves

An account that has lmdb files keeps lmdb. Accounts made before this release declare no backend, so they are asked rather than assumed: if lmdb already holds files for the account, lmdb is what it keeps getting.

The first time such an account is entered from TCL, the backend holding its VOC is recorded in .mvx (voc = lmdb), so it is settled once and never worked out again. If VOC cannot be found in lmdb either, MVX asks — on a terminal — and records the answer rather than guessing; off a terminal it changes nothing.

An account now says what it uses

.mvx carries two declarations:

driver = sqlite     the default for a file nothing else placed
voc    = sqlite     VOC's own

VOC is declared separately because it is the bootstrap file: it must be opened before anything that could describe it, and it need not match the default — an account keeps the VOC it was made with while later files go elsewhere.

Moving a file between backends

CONVERT-FILE <file> <type> is the operator route, and it moves VOC too:

CONVERT-FILE VOC lmdb

.mvx is updated to match, because a stale voc = does not merely mislead — VOC is the one file nothing else can describe, so it would lock the account.

CONVERT-FILE <file> lmdb was broken by the default change and is fixed here. It created the target with the account default, so it reported converted to lmdb and left the file where it was.

Also

  • LISTF reports a file whatever local backend holds it. It asked lmdb only, so a file the account placed in sqlite was invisible — and because mvx-git finds an account's files through that list, such an account committed without its records.
  • .gitignore covers every backend's store, not just lmdb's. lmdb's is a directory; sqlite's is a file with -shm and -wal, so a run in a source tree left three untracked files behind.

If you use mvx-git

Update the git package to 2.0.4 or later. Earlier versions commit a sqlite-backed account's raw database instead of its records, because the store-exclusion rule named mvxdata.lmdb literally.

What's Changed

Full Changelog: v0.2.0...v0.2.1

What's Changed

Full Changelog: v0.2.0...v0.2.1

mvx v0.2.0

Choose a tag to compare

@gheydon gheydon released this 09 Sep 05:09

Records are stored as documents, not blobs

This release changes how records are stored, and existing files must be converted.

A record used to go into every SQL backend as one opaque blob column, so the backend could not see a single field of it. It is now a document: attributes become JSON keys, multivalues become arrays, subvalues nest inside those.

backend before now
sqlite blob doc TEXT
postgres blob doc jsonb
mysql blob doc JSON
mongo a wrapped blob a real BSON subdocument

Values are stored as text and cast at query time, so the document holds what you wrote and the query decides what it means. A value that is not valid UTF-8 is carried as {"$b64": ...} rather than corrupted.

Migrating

Existing files are not readable by this release until they are converted:

mvx-doc-migrate <driver> <location>

It converts every file in a location in place, one transaction per file, and is safe to re-run. The location is written the way BINDINGS writes it — for a connection profile that is @name, so run it from the account. An old file cannot simply be opened, which is why the tool walks the backend's own catalogue rather than asking MVX for a file list.

Files now also record what format they are, so a file can say what it is instead of being guessed at.

Why it was worth breaking

Once the backend can see inside a record, the query goes to the data instead of the data coming to the verb:

  • WITH matches any value of a multivalued attribute, and gives the same answer whether an index exists or not — previously the indexed and unindexed paths disagreed.
  • ORDER BY pushes down on an unmapped attribute when the sort is numeric, reproducing MV's own ordering.
  • CREATE-INDEX works on an unmapped attribute on mysql.
  • DESCRIBE reports the query that will actually run, including a plain BY and unmapped attributes.

Not everything pushes. On an unmapped attribute:

= # ranges (> < >= <=)
sqlite pushes pushes pushes
postgres pushes pushes pushes
mysql pushes pushes verb
mongo pushes verb verb

mysql is the odd one because JSON_TABLE does not correlate inside EXISTS, so its predicate is built from JSON_CONTAINS, which expresses containment and its negation but not an ordering. mongo also has no select_order or explain, so every BY sorts in the verb. Every one of these returns the right answer, just without the backend's help — a mapped column has none of these limits.

Driver ABI 11 → 14

Any out-of-tree storage driver must be rebuilt. Compiled artifacts now carry the ABI they were built against and are refused at load with a clear message, rather than failing later as an undefined symbol.


Also in this release

  • The R83 command stack.L, .R, .RU, .DE, .X, .?, with D3's semantics: unique commands only, entry 1 is the most recent, and re-running or editing an entry moves it to the top. One history, shared with the line editor.
  • TCL macrosM/N items in VOC, run by typing their name, plus .C, .CO and .X name.
  • Arithmetic and aggregate I-typesPRICE * QTY and SUM(EPRICE) evaluate instead of listing blank, per value across an association.
  • STOP "message" prints and stops, and ABORT exists. The concatenated form used to abort the compiler with invalid IR.
  • @SENTENCE is populated, so portable code needs no $IFDEF between it and SENTENCE().
  • Packages can export a FUNCTION, resolved across a package boundary by DEFFUN.
  • mvx --version, the VERSION verb, MVXVERSION() and SYSTEM(1001) — the release and the driver ABI. A package can declare !mvx>=x.y.z or !mvx-abi>=n, and LINK-PKG refuses what it cannot satisfy.
  • The package submodules are gone; the JSON codec is built into the runtime.

What's Changed

Full Changelog: v0.1.4...v0.2.0

What's Changed

  • #136 a package declares its verbs, and mkpkg derives the VOC record by @gheydon in #139
  • #142 PLATFORM.H says it is generated, and names the master file by @gheydon in #143
  • #130 dynamic arrays: the index is reached, believed, and kept by @gheydon in #144
  • #145 COUNT and DCOUNT ask the index instead of scanning by @gheydon in #145
  • #146 INSERT and DELETE stop rebuilding the value by @gheydon in #146
  • #147 the reductions stop paying for generality they do not use by @gheydon in #147
  • #148 a benchmark for the sort inside the SORT and LIST verbs by @gheydon in #148
  • #149 the repository workflow mv_git ended up with by @gheydon in #149
  • #150 A SQLite storage backend, and FILELIST stops naming drivers by @gheydon in #151
  • #152 A MySQL / MariaDB storage backend by @gheydon in #154
  • #155 One logical WRITE is one transaction (driver ABI 11) by @gheydon in #156
  • #158 one column per attribute, and a deterministic read-back by @gheydon in #159
  • #160 don't truncate the package path, don't hash the checkout path by @gheydon in #161
  • #131 cover what mvx-git adopt asks about the open form by @gheydon in #132
  • #164 phrases, a default column list, and a dictionary listing worth reading by @gheydon in #165
  • demo-tests.sh belongs with the account it tests by @gheydon in #163
  • Bump the demo submodule so its suite is reachable by @gheydon in #166
  • publish-source: take an artifact base, like the build actions do by @gheydon in #167
  • Merge develop into main: publish-source takes an artifact base by @gheydon in #168
  • #169 drop the package submodules; JSON is built into the runtime by @gheydon in #170
  • #122 a test system for the demo account, outside it by @gheydon in #176...
Read more

v0.1.4

Choose a tag to compare

@github-actions github-actions released this 26 Aug 01:38
b069595

What's Changed

Full Changelog: v0.1.3...v0.1.4

What's Changed

Full Changelog: v0.1.3...v0.1.4

v0.1.3

Choose a tag to compare

@github-actions github-actions released this 26 Aug 00:11
3f9a643

What's Changed

  • A banked sieve, so every MV BASIC can run the full benchmark by @gheydon in #125
  • Make dynamic-array access fast: reuse buffers, patch in place, index long ranges by @gheydon in #127
  • suite: normalise package versions, and follow mv_git's fixed behaviour by @gheydon in #129
  • mvx-basic: predefine ENGINE beside MVX by @gheydon in #128
  • #133 a catalogued verb is rebuilt, not carried by @gheydon in #134
  • #131 packages/git was 90 commits stale, so the suite tested something else by @gheydon in #135

Full Changelog: v0.1.2...v0.1.3

What's Changed

  • A banked sieve, so every MV BASIC can run the full benchmark by @gheydon in #125
  • Make dynamic-array access fast: reuse buffers, patch in place, index long ranges by @gheydon in #127
  • suite: normalise package versions, and follow mv_git's fixed behaviour by @gheydon in #129
  • mvx-basic: predefine ENGINE beside MVX by @gheydon in #128
  • #133 a catalogued verb is rebuilt, not carried by @gheydon in #134
  • #131 packages/git was 90 commits stale, so the suite tested something else by @gheydon in #135

Full Changelog: v0.1.2...v0.1.3

v0.1.2

Choose a tag to compare

@github-actions github-actions released this 21 Aug 06:50
f8060b1

What's Changed

  • #95 compiler: $INCLUDE FILE ITEM account-relative; mkpkg per-platform PLATFORM.H by @gheydon in #96
  • #98 test: fix tcl-mvxgit-remote — pin the bare remote's HEAD to main by @gheydon in #99
  • #100 integrate getopt + declarative flags (cmd/git) on the PLATFORM.H seam by @gheydon in #102
  • mkpkg: resolve a standalone package's own PLATFORM.H via MVXACCOUNT by @gheydon in #103
  • mkpkg: place a standalone package's PLATFORM.H beside the BP sources (baseDir) by @gheydon in #104
  • bump packages/git to 1.5.1 (inline single-caller GITUDT.* helpers) by @gheydon in #105
  • bump cmd to 1.2.1 and git to the PLATFORM.H ignore fix by @gheydon in #106
  • packages: build dependencies, marked '+' in PKG by @gheydon in #107
  • bump git to 1.5.2 and getopt to its build-dep declaration by @gheydon in #108
  • bump json to its current main by @gheydon in #109
  • bump mapfield to its current main by @gheydon in #110
  • bump git to 1.6.1 (account attributes + the VOC-deletion fix) by @gheydon in #111
  • #113 a backend you have not got is a question, not a fatal error by @gheydon in #115
  • publish-source: a tag with a suffix is a pre-release by @gheydon in #116
  • release: check out the submodules the build installs by @gheydon in #118

New Contributors

Full Changelog: v0.1.1...v0.1.2

What's Changed

  • #95 compiler: $INCLUDE FILE ITEM account-relative; mkpkg per-platform PLATFORM.H by @gheydon in #96
  • #98 test: fix tcl-mvxgit-remote — pin the bare remote's HEAD to main by @gheydon in #99
  • #100 integrate getopt + declarative flags (cmd/git) on the PLATFORM.H seam by @gheydon in #102
  • mkpkg: resolve a standalone package's own PLATFORM.H via MVXACCOUNT by @gheydon in #103
  • mkpkg: place a standalone package's PLATFORM.H beside the BP sources (baseDir) by @gheydon in #104
  • bump packages/git to 1.5.1 (inline single-caller GITUDT.* helpers) by @gheydon in #105
  • bump cmd to 1.2.1 and git to the PLATFORM.H ignore fix by @gheydon in #106
  • packages: build dependencies, marked '+' in PKG by @gheydon in #107
  • bump git to 1.5.2 and getopt to its build-dep declaration by @gheydon in #108
  • bump json to its current main by @gheydon in #109
  • bump mapfield to its current main by @gheydon in #110
  • bump git to 1.6.1 (account attributes + the VOC-deletion fix) by @gheydon in #111
  • #113 a backend you have not got is a question, not a fatal error by @gheydon in #115
  • publish-source: a tag with a suffix is a pre-release by @gheydon in #116
  • release: check out the submodules the build installs by @gheydon in #118

New Contributors

Full Changelog: v0.1.1...v0.1.2

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 01 Aug 00:32

Full Changelog: v0.1.0...v0.1.1

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 05:00