Closes: #180.
Closes: #177.
Closes: #184.
Accounts can be created with the `/create` or `/createaccount` command. Existing accounts can be listed with the `/list` or `/listaccounts` command.
Account keyuid is now being generated on the multiaccount.
account.loginTimestamp is now NULL when inserted in the DB, and can be updated using `updateAccount` or `updateAccountTimestamp`.
fix: run migrations only on non-existant DBs
Removes the need to pass in a migration definition file. We do not need to run migrations, unless we are instantiating a DB.
Make consistent use of the "test helpers" `procSuite` and `asyncTest`.
A couple of test suites are presently disabled: `accounts` and
`login_and_logout`. Changes out of scope for this PR need to be introduced and
the tests need to be refactored accordingly.
* feat: migrations
* Verify if there are more migrations executed in the db than in the code
* fix - code review
* fix: missing text
* test: cat content of sql_scripts.nim
* fix: unwanted stdout/stderr in sql_scripts.nim
Co-authored-by: Michael Bradley, Jr <michaelsbradleyjr@gmail.com>
Support getting row data by column name.
fix: change intVal of 0 to false, combine bool type tests
fix: try forcing val to be read through toOption
feat: handle bool option conversion
feat: switch from using a custom `toOption` proc to using the `fromDbValue` procs defined in nim-sqlcipher. The `fromDbValue` overload that creates `Option[T]` was changed so that we can handle cases when we have null values for `sqliteText` and `sqliteInteger`.
Support typecasting a row (seq[DbColumn]) in to an object type.
Update to execQuery, remove need to cast row
chore: bump nim-sqlcipher
Introduce a Nim implementation of `hashMessage` situated in a reorganized
library with *Nim-oriented* and *C-oriented* entry points inspired by the
[shim strategy][shim-strat] suggested by @arnetheduck.
The goal of this approach (per @iurimatias, at least as I understood what was
discussed and tasked) is for Nim implementations of equivalent functionality to
eventually supersede existing [status-go][sgo] implementations.
These changes will benefit from feedback by @arnetheduck, @zah,
@stefantalpalaru, @siphiuel, other members of stimbus/desktop, et al. – my dev
experiences with Nim and C are quite limited to date. Some of the changes may
be problematic, unnecessary, suboptimal, etc. I may have reified the *"shim
strategy"* badly. Please shred this PR apart and lead me to the 💡
light. Thanks for your help!
N.B. `tests/nim/login.nim` and `tests/c/login.c` use loops that never
terminate (introduced prior to this PR). Future work will attempt to remedy
that shortcoming but it's out of scope for this PR.
The reorganized library can be grouped into two trees of `.nim` sources, but
note that `import` statements interlink some of them.
**Nim-oriented**
```
├── src
│ ├── nim_status
│ │ ├── go
│ │ │ └── shim.nim
│ │ ├── lib
│ │ │ ├── shim.nim
│ │ │ └── util.nim
│ │ ├── lib.nim
│ │ └── types.nim
│ └── nim_status.nim
```
**C-oriented**
```
├── src
│ ├── nim_status
│ │ ├── c
│ │ │ ├── go
│ │ │ │ └── shim.nim
│ │ │ ├── lib
│ │ │ │ └── shim.nim
│ │ │ ├── lib.nim
│ │ │ ├── nim_status.nim
│ │ │ └── sys.nim
```
The key difference between the Nim sources in one tree and the other is that
the Nim-oriented sources are intended to be consumed by other Nim
sources (e.g. [status-im/nim-status-client][nsc] via Nim's built-in `import`),
while the C-oriented sources are intended to be compiled to a C
library (e.g. `nim_status.a`) and then linked/called by other C code. To that
end, the former use e.g. `string` in call signatures while the latter use
`cstring`. Along the same lines, the C-oriented `proc`s may return pointers to
memory allocated with `c_malloc` such that it's up to the caller to free the
memory occupied by the return values.
Both `src/nim_status/go/shim.nim` and `src/nim_status/c/go/shim.nim` are pure
shims around status-go, the main difference being their call signatures.
With `src/nim_status/lib.nim` the intention is to implement functionality in a
manner independent of status-go's idioms.
In `src/nim_status/[c/]lib/shim.nim` the intention is to wrap around
`src/nim_status/lib.nim` in a way that preserves status-go's call signatures
and formatting. For example, the `hashMessage` proc introduced in this PR in
`src/nim_status/lib.nim` returns a hex string like `0xabcd...` while
`lib/shim.nim` returns JSON that's a match for status-go:
`{"result":"0xabcd..."}`.
Both `src/nim_status.nim` and `src/nim_status/c/nim_status.nim` represent a
hybrid of `go/shim.nim` and `lib/shim.nim`. Again, the goal is that over time
more and more `proc`s implemented in Nim replace the shims around status-go.
Callers that don't need to consume return values formatted according to
status-go conventions can use `lib.nim` directly, e.g. via `import
nim_status/lib` or by compiling `src/nim_status/c/lib.nim` and linking/calling
from C.
`c_malloc` has been copied (in `src/nim_status/c/sys.nim`) from the source of
Nim's `system/ansi_c` because `ansi_c` is an undocumented internal API.
A Nim template or pragma might be useful with respect to usgae of `c_malloc` in
`src/nim_status/c/*`, i.e. to cut down on repetition.
Use of `{.exportc.}` is limited to the `src/nim_status/c/nim_status.nim` hybrid
shim to avoid imposing exported symbols on C-oriented library consumers who may
wish to compose things in a different manner.
With respect to the Nim implementation of `hashMessage`, both Nim-oriented and
C-oriented tests have been implemented. Whether doubling up the tests is really
necessary/desirable for all `proc`s is probably worth discussing.
Adjust `.gitignore` and refactor `Makefile` accordingly; apply some lessons
learned while working on [status-im/nim-status-client][nsc].
Closes#34.
[shim-strat]: https://github.com/status-im/nim-status/issues/5#issuecomment-647497745
[sgo]: https://github.com/status-im/status-go
[nsc]: https://github.com/status-im/nim-status-client