Pick BASIC and the D3 Database

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, @SVM delimiters)
  • 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
2
3
4
5
6
7
8
mkdir qmdata
docker run --name scarletdme -d \
-p 4222:22 -p 4242:4242 -p 4243:4243 \
-v $(pwd)/qmdata:/qmdata \
racingmars/scarletdme:latest

docker logs scarletdme # shows the auto-generated qmuser password
telnet localhost 4242 # or: ssh -p 4222 qmuser@localhost

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)

More reading