dirsql 0.4.26 → 0.4.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/reference/cli.md +188 -2
- package/package.json +6 -6
package/docs/reference/cli.md
CHANGED
|
@@ -9,9 +9,9 @@ The `dirsql` binary has these modes:
|
|
|
9
9
|
| `dirsql query "<sql>"` | Explicit synonym for the default one-shot query. |
|
|
10
10
|
| `dirsql server` | Start a long-lived HTTP server exposing a SQL view of a directory. See [HTTP API](./http-api.md). |
|
|
11
11
|
| `dirsql init` | Generate a `.dirsql.toml`. |
|
|
12
|
+
| `dirsql` (bare) | Open a [REPL](#the-repl) over the current directory, reading statements until EOF. |
|
|
12
13
|
|
|
13
|
-
Bare `dirsql`
|
|
14
|
-
does **not** start the server.
|
|
14
|
+
Bare `dirsql` does **not** start the server — that is `dirsql server`.
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
@@ -47,6 +47,186 @@ dirsql "SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5"
|
|
|
47
47
|
pipeline, same flags, same output. See that section for config discovery,
|
|
48
48
|
`--persist`, `--on-file`, hooks, and exit codes.
|
|
49
49
|
|
|
50
|
+
## The REPL
|
|
51
|
+
|
|
52
|
+
`dirsql` with no subcommand and no SQL reads statements until EOF:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
dirsql
|
|
56
|
+
# dirsql 0.2.7 — this directory is a database.
|
|
57
|
+
#
|
|
58
|
+
# SELECT basename, size FROM './' ORDER BY size DESC LIMIT 5;
|
|
59
|
+
# SELECT path FROM './**/*.md' WHERE content LIKE '%TODO%';
|
|
60
|
+
#
|
|
61
|
+
# `exit`, `quit`, or Ctrl-D to leave.
|
|
62
|
+
#
|
|
63
|
+
# dirsql> SELECT count(*) AS files FROM './';
|
|
64
|
+
# files
|
|
65
|
+
# -----
|
|
66
|
+
# 128
|
|
67
|
+
#
|
|
68
|
+
# 1 row
|
|
69
|
+
# dirsql>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Statements go through the same pipeline as [`dirsql query`](#dirsql-query) and
|
|
73
|
+
`POST /query`, so a statement typed at the prompt and one passed on the command
|
|
74
|
+
line return identical rows. Every config flag the default mode takes — `-c`,
|
|
75
|
+
`--persist`, `--no-ignore`, `--on-file` — applies unchanged:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
dirsql -c .dirsql.toml --persist
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The index is built **once**, before the first prompt: statements share one scan
|
|
82
|
+
rather than re-walking the directory each time, and the live watcher keeps it
|
|
83
|
+
fresh between them. Files the scan had to skip are named on stderr once, up
|
|
84
|
+
front.
|
|
85
|
+
|
|
86
|
+
### Output format
|
|
87
|
+
|
|
88
|
+
Rows go where they are useful: a **table** when stdout is a terminal, the
|
|
89
|
+
**JSON array** when it is piped or redirected. `SELECT * FROM './'` in a
|
|
90
|
+
5000-file tree should not put a 5000-element JSON array in front of a person,
|
|
91
|
+
and `dirsql "…" | jq` should not have to parse a table.
|
|
92
|
+
|
|
93
|
+
`--format` overrides that, in both directions, and is valid in the REPL and in
|
|
94
|
+
[`dirsql query`](#dirsql-query) alike:
|
|
95
|
+
|
|
96
|
+
| Value | Renders |
|
|
97
|
+
|---|---|
|
|
98
|
+
| `auto` (default) | Table if stdout is a terminal, JSON otherwise. |
|
|
99
|
+
| `table` | Always a table — including into a pipe or a file. |
|
|
100
|
+
| `json` | Always the JSON array — including at a terminal. |
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
dirsql "SELECT basename, size FROM './' ORDER BY basename" --format table
|
|
104
|
+
# basename size
|
|
105
|
+
# -------- ----
|
|
106
|
+
# a.md 6
|
|
107
|
+
# bb.md 10
|
|
108
|
+
#
|
|
109
|
+
# 2 rows
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
There is no `.mode`: dirsql has no dot-commands to extend (see
|
|
113
|
+
[Leaving](#leaving)), and a flag serves the one-shot query too. `dirsql server`
|
|
114
|
+
does not take `--format` — its transport is JSON over HTTP.
|
|
115
|
+
|
|
116
|
+
**`auto` keys on stdout, not stdin.** `dirsql > rows.json` typed at a terminal
|
|
117
|
+
is still headed for a file, and the file gets JSON.
|
|
118
|
+
|
|
119
|
+
Table rendering is deliberately plain: aligned columns, a rule under the
|
|
120
|
+
header, a row count, and `NULL` spelled out so it cannot be confused with an
|
|
121
|
+
empty string. Two things happen to a value on its way into a cell, both
|
|
122
|
+
because a `content` column holds a whole file: **newlines, tabs and other
|
|
123
|
+
control characters are escaped** (`\n`, `\t`, `\u{…}`) so one row cannot span
|
|
124
|
+
several lines, and **anything longer than 60 characters is truncated with
|
|
125
|
+
`…`** so one column cannot set the width of every row. `--format json`
|
|
126
|
+
returns the values unaltered.
|
|
127
|
+
|
|
128
|
+
Laying the table out to the terminal's width, and paging a long result, are
|
|
129
|
+
both out of scope; pipe to `less` for the latter.
|
|
130
|
+
|
|
131
|
+
### Where a statement ends
|
|
132
|
+
|
|
133
|
+
At its semicolon — the same rule `sqlite3` uses, and **SQLite's own tokenizer**
|
|
134
|
+
decides where that semicolon is. So a statement can be laid out over as many
|
|
135
|
+
lines as it needs, and a `;` inside a string literal, a comment, or a
|
|
136
|
+
`BEGIN … END` body is not mistaken for the end of one:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
dirsql> SELECT basename, size
|
|
140
|
+
...> FROM './'
|
|
141
|
+
...> ORDER BY size DESC
|
|
142
|
+
...> LIMIT 5;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The `...>` prompt says the statement is still open. `exit`, `quit`, and a blank
|
|
146
|
+
line are not SQL, so they are taken as typed rather than waiting for a
|
|
147
|
+
terminator.
|
|
148
|
+
|
|
149
|
+
### Editing and history
|
|
150
|
+
|
|
151
|
+
The prompt is a full line editor ([reedline](https://github.com/nushell/reedline)),
|
|
152
|
+
with the emacs bindings a shell prompt has:
|
|
153
|
+
|
|
154
|
+
| Key | Does |
|
|
155
|
+
|---|---|
|
|
156
|
+
| ↑ / ↓ | Walk back and forth through history. |
|
|
157
|
+
| Ctrl-R | Reverse-search history; type to narrow, Enter to accept. |
|
|
158
|
+
| Ctrl-A / Ctrl-E | Jump to the start / end of the line. |
|
|
159
|
+
| Alt-B / Alt-F | Move back / forward a word. |
|
|
160
|
+
| Ctrl-W, Ctrl-K, Ctrl-Y | Kill the previous word, kill to end of line, yank it back. |
|
|
161
|
+
| Ctrl-C | Abandon the line and return to a fresh prompt. **Does not exit.** |
|
|
162
|
+
| Ctrl-D | Leave. |
|
|
163
|
+
|
|
164
|
+
History is kept in one file for every directory — a query worked out in one
|
|
165
|
+
project is worth recalling in the next, the same way `sqlite3` keeps a single
|
|
166
|
+
`~/.sqlite_history`. It holds the last 1000 statements, at
|
|
167
|
+
`$XDG_DATA_HOME/dirsql/history`, falling back to
|
|
168
|
+
`~/.local/share/dirsql/history` (`%APPDATA%\dirsql\history` on Windows). If
|
|
169
|
+
none of those resolve, history is kept in memory for the session only.
|
|
170
|
+
|
|
171
|
+
### Terminal vs. pipe
|
|
172
|
+
|
|
173
|
+
The prompt, banner, editor, and history exist only when **stdin is a terminal**.
|
|
174
|
+
From a pipe or a redirect there is none of that, and the terminator rule does
|
|
175
|
+
not apply either: a redirected script is not being typed, so there is no
|
|
176
|
+
continuation prompt to hang it off. **One statement per line, no `;` needed:**
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
printf "SELECT 1 AS n\nSELECT 2 AS n\n" | dirsql
|
|
180
|
+
# [{"n":1}]
|
|
181
|
+
# [{"n":2}]
|
|
182
|
+
|
|
183
|
+
dirsql < queries.sql > rows.jsonl
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Blank lines do nothing in either mode.
|
|
187
|
+
|
|
188
|
+
### Leaving
|
|
189
|
+
|
|
190
|
+
`exit`, `quit` (either case), or Ctrl-D. There are no dot-commands: the `.`
|
|
191
|
+
prefix exists in `sqlite3` to namespace meta-commands against SQL, and with no
|
|
192
|
+
meta-commands there is nothing to namespace. Schema questions are ordinary SQL:
|
|
193
|
+
|
|
194
|
+
```sql
|
|
195
|
+
SELECT name FROM sqlite_master WHERE type = 'table';
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Errors
|
|
199
|
+
|
|
200
|
+
A statement that fails prints its diagnostic — the same string the HTTP
|
|
201
|
+
`{"error": …}` body carries — to stderr, and **the session continues**. This is
|
|
202
|
+
the one behavioral difference from `dirsql query`, which exits `1` on the first
|
|
203
|
+
failure:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
dirsql> SELECT nope FROM missing;
|
|
207
|
+
dirsql: SQLite error: no such table: missing
|
|
208
|
+
dirsql> SELECT 1 AS n;
|
|
209
|
+
n
|
|
210
|
+
-
|
|
211
|
+
1
|
|
212
|
+
|
|
213
|
+
1 row
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
A config that cannot be loaded is different in kind: it fails identically for
|
|
217
|
+
every statement, so it is reported once and exits `1` before the first prompt.
|
|
218
|
+
|
|
219
|
+
### Exit codes
|
|
220
|
+
|
|
221
|
+
| Code | Meaning |
|
|
222
|
+
|---|---|
|
|
223
|
+
| `0` | Clean EOF (Ctrl-D, `exit`, `quit`, or the end of a piped script) — **including when statements failed**. Matches interactive `sqlite3`; use [`dirsql query`](#dirsql-query) when a script needs a statement's exit status. |
|
|
224
|
+
| `1` | The index could not be built (a bad `-c`, an unresolvable `--on-file`), or stdin could not be read. Nothing was executed. |
|
|
225
|
+
|
|
226
|
+
`23` (partial scan) is not produced here: skipped files are reported before the
|
|
227
|
+
first prompt, and a session's exit code describes the session rather than one
|
|
228
|
+
scan.
|
|
229
|
+
|
|
50
230
|
## `dirsql server`
|
|
51
231
|
|
|
52
232
|
```bash
|
|
@@ -204,6 +384,12 @@ Errors print the same diagnostic the HTTP `{"error": …}` body carries —
|
|
|
204
384
|
config failures, SQL errors, rejected reads, hook failures, timeouts — to
|
|
205
385
|
stderr, with exit code `1`.
|
|
206
386
|
|
|
387
|
+
#### `--format {auto,table,json}`
|
|
388
|
+
|
|
389
|
+
How to render the result rows — the same flag [the REPL](#output-format)
|
|
390
|
+
takes, with the same `auto` default. A one-shot query is usually piped, so
|
|
391
|
+
`auto` usually means JSON; `--format table` is there for the times it is not.
|
|
392
|
+
|
|
207
393
|
### Exit codes
|
|
208
394
|
|
|
209
395
|
| Code | Meaning |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dirsql",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.27",
|
|
4
4
|
"description": "Ephemeral SQL index over a local directory",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": "https://github.com/thekevinscott/dirsql",
|
|
@@ -213,10 +213,10 @@
|
|
|
213
213
|
]
|
|
214
214
|
},
|
|
215
215
|
"optionalDependencies": {
|
|
216
|
-
"@dirsql/lib-linux-x64-gnu": "0.4.
|
|
217
|
-
"@dirsql/lib-linux-arm64-gnu": "0.4.
|
|
218
|
-
"@dirsql/lib-darwin-x64": "0.4.
|
|
219
|
-
"@dirsql/lib-darwin-arm64": "0.4.
|
|
220
|
-
"@dirsql/lib-win32-x64-msvc": "0.4.
|
|
216
|
+
"@dirsql/lib-linux-x64-gnu": "0.4.27",
|
|
217
|
+
"@dirsql/lib-linux-arm64-gnu": "0.4.27",
|
|
218
|
+
"@dirsql/lib-darwin-x64": "0.4.27",
|
|
219
|
+
"@dirsql/lib-darwin-arm64": "0.4.27",
|
|
220
|
+
"@dirsql/lib-win32-x64-msvc": "0.4.27"
|
|
221
221
|
}
|
|
222
222
|
}
|