Updated 12/11/2026
I’ve been working with a D3 database, which is a Pick/MultiValue system, and the tape restore commands in TCL are not what you’d guess. These are my notes on what Pick is, the tape verbs I keep needing, and how to practice them in Docker without a licence or a tape drive.
What Pick and D3 are
Pick (the “Pick Operating System”, or more broadly MultiValue) dates from the 1960s-70s. It uses a nested data model (files → items → attributes → values → subvalues) instead of normalized relational tables. It bundles its own:
- Database engine: hashed files, dictionaries, dynamic/static file types
- Query language: ENGLISH / RetrieVe for ad hoc reporting
- Programming language: Pick/BASIC (a.k.a. DataBasic), a BASIC dialect with native multivalued dynamic arrays (
@FM,@VM,@SVMdelimiters) - TCL (Terminal Control Language): the shell-equivalent command line
D3 is one of the major commercial implementations. It was Pick Systems, then Raining Data, then TigerLogic, and is now Rocket D3 from Rocket Software. Its siblings are UniVerse, UniData, jBASE, OpenQM and Caché. They are mostly source-compatible at the Pick/BASIC and TCL level, with vendor-specific extensions.
Tape commands in TCL
D3 inherited a full magnetic-tape command set, prefixed T-, for backups, restores and media handling.
| Command | Purpose |
|---|---|
T-ATT |
Attach a tape device to your process (optionally setting block size) |
T-DET |
Detach the tape device |
T-DUMP |
Dump items from a file to the attached tape (writes a tape label first) |
T-LOAD |
Restore, reads back data written by T-DUMP |
T-REW |
Rewind the tape to load point |
T-WEOF |
Write an end-of-file (tape mark) |
T-FSF / T-BSF |
Forward-space / backspace over file marks |
T-FSR / T-BSR |
Forward-space / backspace over records |
T-SPACE |
General space-forward/backward over tape marks |
T-RDLBL |
Read the tape label |
T-STAT / T-STATUS |
Report tape device status |
T-EOD |
Space to end of recorded data |
T-ERASE |
Erase tape |
T-RET / T-RETEN |
Retension the tape |
T-UNLD / T-UNLOAD |
Unload/eject the tape |
T-VERIFY |
Verify a tape dump |
T-CHK |
Check tape readability |
T-SELECT |
Select items for a subsequent T-DUMP |
T-BCK |
Space backward |
The two to remember: restore is T-LOAD (there is no T-RESTORE) and rewind is T-REW. T-LOAD also takes selection criteria, so you can restore a subset.
Docs: T (TCL command reference) • t-load Command • TCL Command Categories
Run something similar in Docker
There is no official Docker image for Rocket D3. It’s licensed software and Rocket doesn’t publish one. The practical alternative is ScarletDME, a community GPL fork of OpenQM, which is another Pick/MultiValue engine from the same lineage.
1 | mkdir qmdata |
Mount /qmdata as a volume so accounts and data survive container restarts. Add -e QMUSER_PASSWORD=<your-password> if you’d rather not use the generated one.
See Docker Commands if you need a refresher on the docker CLI.
Docs: racingmars/scarletdme • geneb/ScarletDME
The syntax is not identical to D3
OpenQM and ScarletDME use dots instead of hyphens for the tape verbs.
| D3 | OpenQM / ScarletDME |
|---|---|
T-DUMP |
T.DUMP |
T-LOAD (restore) |
T.LOAD |
T-REW (rewind) |
T.REW |
T-ATT |
T.ATT / SET.DEVICE |
T-DET, T-WEOF, T-STAT, T-RDLBL, T-EOD, T-FWD |
T.DET, T.WEOF, T.STAT, T.RDLBL, T.EOD, T.FWD |
The concepts and muscle memory carry over, but D3 scripts won’t run unmodified.
Docs: QM Commands
Test without a tape drive
Both D3 and OpenQM support pseudo-tapes, where the tape device points at an ordinary disk file instead of a physical drive (via SET.DEVICE in OpenQM). That’s how you’d exercise T.DUMP, T.LOAD and T.REW in a container anyway, since there’s no tape hardware to pass through. The file-mark handling still behaves correctly.
If the goal is to rehearse a D3 restore for production, ScarletDME teaches the mental model, but check the exact syntax against the Rocket D3 manual before relying on it for anything real.
Docs: SET.DEVICE • Restoring D3 (mvdbms discussion)