# Versioning

## Structure

The files are stored in `DATABASE/.versions/TAG/DATE` and the file contents are identical to the Record.

## Limit Versions

When initializing, add `limit:number` to the versioning object to limit the number of stored versions.

{% code lineNumbers="true" %}

```javascript
const db = new Dubnium('dir', 'txt', { versioning:{ enabled:true, limit:10 } })
```

{% endcode %}

## Read A Version

{% code lineNumbers="true" %}

```javascript
db.get('tag').getVersion('date')
```

{% endcode %}

<table><thead><tr><th>Parameter</th><th>About</th><th>Type</th><th data-type="checkbox">Required</th></tr></thead><tbody><tr><td>tag</td><td>Record tag</td><td>String</td><td>true</td></tr><tr><td>date</td><td>Date of version</td><td>String (ISO date)</td><td>true</td></tr></tbody></table>

## Manually Save Snapshot

{% hint style="info" %}
This allows you to create a version at any point in time, even if automatic versioning is disabled or the limit has been reached.
{% endhint %}

{% code lineNumbers="true" %}

```javascript
db.get('tag').saveSnapshot()
```

{% endcode %}

### Example

{% code lineNumbers="true" %}

```javascript
await db.create('snapshot_test', { value: 'snapshot' });
const { timestamp, record:snapshotRecord } = await db.get('snapshot_test').saveSnapshot();
const snapshotData = await db.get('snapshot_test').getVersion(timestamp);
assert.equal(snapshotData, (await snapshotRecord.read(true)), 'Snapshot data mismatch');
```

{% endcode %}

## Generator

{% code lineNumbers="true" %}

```javascript
for (const version of db.get('tag').versions()) {
const { timestamp, record } = version
}
```

{% endcode %}

## Rollback

{% code lineNumbers="true" %}

```javascript
db.get('tag').rollback('date?')
```

{% endcode %}

<table><thead><tr><th>Parameter</th><th>About</th><th>Type</th><th data-type="checkbox">Required</th></tr></thead><tbody><tr><td>tag</td><td>Record tag</td><td>String</td><td>true</td></tr><tr><td>date</td><td>Date of version</td><td>String (ISO date)</td><td>false</td></tr></tbody></table>
