Showing preview only (448K chars total). Download the full file or copy to clipboard to get everything.
Repository: nixys/nxs-data-anonymizer
Branch: main
Commit: ede8bfc83dc2
Files: 77
Total size: 423.1 KB
Directory structure:
gitextract_88iwtv_2/
├── .docker/
│ └── Dockerfile
├── .github/
│ ├── release.yml
│ └── workflows/
│ └── publish.yml
├── .gitignore
├── LICENSE
├── README.md
├── ctx/
│ ├── args.go
│ ├── conf.go
│ └── context.go
├── doc/
│ └── examples/
│ ├── drop/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── filters/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── links/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── security/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ └── variables/
│ ├── MySQL/
│ │ ├── input.sql
│ │ ├── nxs-data-anonymizer.conf
│ │ └── output.sql
│ ├── PostgreSQL/
│ │ ├── input
│ │ ├── nxs-data-anonymizer.conf
│ │ └── output
│ └── Readme.md
├── ds/
│ └── mysql/
│ └── mysql.go
├── go.mod
├── go.sum
├── interfaces/
│ └── anonymizer.go
├── main.go
├── misc/
│ ├── errors.go
│ ├── security.go
│ ├── template.go
│ ├── token.go
│ └── values.go
├── modules/
│ ├── anonymizers/
│ │ ├── mysql/
│ │ │ ├── .testdata/
│ │ │ │ ├── mysql_test.dos.in.sql
│ │ │ │ ├── mysql_test.dos.out.sql
│ │ │ │ ├── mysql_test.in.sql
│ │ │ │ └── mysql_test.out.sql
│ │ │ ├── dh.go
│ │ │ ├── mysql.go
│ │ │ ├── mysql_test.go
│ │ │ ├── security_types.go
│ │ │ └── states.go
│ │ └── pgsql/
│ │ ├── .testdata/
│ │ │ ├── pgsql_test.dos.in.sql
│ │ │ ├── pgsql_test.dos.out.sql
│ │ │ ├── pgsql_test.in.sql
│ │ │ └── pgsql_test.out.sql
│ │ ├── dh.go
│ │ ├── pgsql.go
│ │ ├── pgsql_test.go
│ │ ├── security_types.go
│ │ └── states.go
│ ├── filters/
│ │ └── relfilter/
│ │ ├── column.go
│ │ ├── filter.go
│ │ └── filter_test.go
│ └── progress_reader/
│ └── progress_reader.go
└── routines/
└── anonymizer/
└── anonymizer.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .docker/Dockerfile
================================================
FROM golang:1.21-bullseye as build-env
ARG APP_VERSION
WORKDIR /usr/src/app
ADD ./ /usr/src/app
RUN go build -ldflags "-X github.com/nixys/nxs-data-anonymizer/ctx.version=$APP_VERSION" -o /nxs-data-anonymizer
FROM alpine
RUN apk update --no-cache && apk add --no-cache tar postgresql-client mysql-client libc6-compat s3cmd
COPY --from=build-env /nxs-data-anonymizer /
================================================
FILE: .github/release.yml
================================================
# .github/release.yml
changelog:
exclude:
labels:
- ignore-for-release
categories:
- title: Breaking Changes 🛠
labels:
- Semver-Major
- breaking-change
- title: Exciting New Features 🎉
labels:
- Semver-Minor
- enhancement
- title: Fixes 🪲
labels:
- Semver-Patch
- bug
- title: Other Changes
labels:
- "*"
================================================
FILE: .github/workflows/publish.yml
================================================
name: Release
on:
push:
tags:
- 'v*'
jobs:
build-and-publish-release:
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
TARGET: arm64
- os: ubuntu-latest
TARGET: amd64
steps:
- name: Building ${{ matrix.TARGET }}
run: echo "${{ matrix.TARGET }}"
- uses: actions/checkout@v4
- uses: actions/setup-go@v3
name: Set up Go
with:
go-version: 1.21
- name: Get version
id: get_version
uses: battila7/get-version-action@v2
- name: Build
run: GOOS=linux GOARCH=${{ matrix.TARGET }} CGO_ENABLED=0 go build -ldflags="-s -w -X github.com/nixys/nxs-data-anonymizer/ctx.version=${{ steps.get_version.outputs.version-without-v }}" -v -o nxs-data-anonymizer
- name: Compress
uses: a7ul/tar-action@v1.1.2
id: compress
with:
command: c
files: |
./nxs-data-anonymizer
./README.md
./LICENSE
outPath: nxs-data-anonymizer-${{ matrix.TARGET }}.tar.gz
- uses: actions/upload-artifact@v4
with:
name: nxs-data-anonymizer-${{ matrix.TARGET }}.tar.gz
path: nxs-data-anonymizer-${{ matrix.TARGET }}.tar.gz
- uses: softprops/action-gh-release@v1
name: Upload binaries to release
if: github.ref_type == 'tag'
with:
files: nxs-data-anonymizer-${{ matrix.TARGET }}.tar.gz
prerelease: ${{ contains(github.ref_name, 'rc') }}
generate_release_notes: true
append_body: true
build-and-push-docker:
runs-on: ubuntu-latest
environment: secure
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get version
id: get_version
uses: battila7/get-version-action@v2
- name: Login to Registry Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Docker meta for app
id: meta-app
uses: docker/metadata-action@v4
with:
images: |
nixyslab/nxs-data-anonymizer
- name: Build and push app
uses: docker/build-push-action@v4
with:
context: .
file: .docker/Dockerfile
push: true
tags: ${{ steps.meta-app.outputs.tags }}
build-args: APP_VERSION=${{ steps.get_version.outputs.version-without-v }}"
================================================
FILE: .gitignore
================================================
/.project
/.vscode
/.tmp
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2023 Nixys <hello@nixys.io>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================

# nxs-data-anonymizer
[![Telegram News][tg-news-badge]][tg-news-url]
[![Telegram Chat][tg-chat-badge]][tg-chat-url]
## Introduction
nxs-data-anonymizer is a tool for anonymizing **PostgreSQL** and **MySQL/MariaDB/Percona** databases' dump.
### Features
- Supported databases and versions:
- PostgreSQL (9/10/11/12/13/14/15/all versions)
- MySQL/MariaDB/Percona (5.7/8.0/8.1/all versions)
- Flexible data faking based on:
- Go templates and [Sprig template’s library](https://masterminds.github.io/sprig/) like [Helm](https://helm.sh/docs/chart_template_guide/functions_and_pipelines/). You may also use values of other columns for same row to build more flexible rules
- External commands you may execute to create table field values
- Security enforcement rules
- Link cells across the database to generate the same values
- Stream data processing. It means that you can a use the tool through a pipe in command line and redirect dump from source DB directly to the destination DB with required transformations
- Easy to integrate into your CI/CD
### Who can use the tool
Development and project teams which are dealing with production and test/dev/stage or dynamic namespaces with databases and need to ensure security and prevent data leaks.
## Quickstart
Inspect your database structure and [set up](#settings) the nxs-data-anonymizer config in accordance with the sensitive data you need to anonymize.
You are able to use this tool in any way you want. Three most common ways are described below.
#### Console
In order to operate with your database anonymization via console you need to go through the following steps:
- Download and untar the nxs-data-anonymizer [binary](https://github.com/nixys/nxs-data-anonymizer/releases)
- Run the nxs-data-anonymizer through the command line with [arguments](#command-line-arguments) you want to use
For example, use the following command if you need to anonymize your PostgreSQL database from production to dev on fly (PostgreSQL Client need to be installed):
```console
export PGPASSWORD=password; pg_dump -U postgres prod | /path/to/nxs-data-anonymizer -t pgsql -c /path/to/nxs-data-anonymizer.conf | psql -U postgres dev
```
#### GitLab CI
This section describes how to integrate nxs-data-anonymizer into your GitLab CI. You may add jobs presented below into your `.gitlab-ci.yml` and adjust it for yourself.
##### Job: anonymize prod
Job described in this section is able to perform the following tasks:
- Run when special tag for `main` branch is set
- Create a `production` database dump, anonymize and upload it into s3 bucket
Job sample:
```yaml
anonymize:
stage: anonymize
image: nixyslab/nxs-data-anonymizer:latest
variables:
GIT_STRATEGY: none
PG_HOST: ${PG_HOST_PROD}
PG_USER: ${PG_USER_PROD}
PGPASSWORD: ${PG_PASS_PROD}
before_script:
- echo "${S3CMD_CFG}" > ~/.s3cmd
- echo "${NXS_DA_CFG}" > /nxs-data-anonymizer.conf
script:
- pg_dump -h ${PG_HOST} -U ${PG_USER} --schema=${PG_SCHEMA} ${PG_DATABASE} | /nxs-data-anonymizer -t pgsql -c /nxs-data-anonymizer.conf | gzip | s3cmd put - s3://bucket/anondump.sql.gz
only:
- /^v.*$/
except:
- branches
- merge_requests
```
##### Job: update stage
Job described in this section deals with the following:
- Manual job for `stage` branch
- Download the anonymized dump from s3 bucket and load into `stage` database
Job sample:
```yaml
restore-stage:
stage: restore
image: nixyslab/nxs-data-anonymizer:latest
variables:
GIT_STRATEGY: none
PG_HOST: ${PG_HOST_STAGE}
PG_USER: ${PG_USER_STAGE}
PGPASSWORD: ${PG_PASS_STAGE}
before_script:
- echo "${S3CMD_CFG}" > ~/.s3cmd
script:
- s3cmd --no-progress --quiet get s3://bucket/anondump.sql.gz - | gunzip | psql -h ${PG_HOST} -U ${PG_USER} --schema=${PG_SCHEMA} ${PG_DATABASE}
only:
- stage
when: manual
```
##### CI/CD variables
This section contains a description of CI/CD variables used in GitLab CI job samples above.
###### General
| Variable | Description |
| :---: | :---: |
|`S3CMD_CFG` | S3 storage config |
|`PG_SCHEMA`| PgSQL schema |
|`PG_DATABASE`|PgSQL database name|
###### Production
| Variable | Description |
| :---: | :---: |
|`NXS_DA_CFG`|nxs-data-anonymizer config|
|`PG_HOST_PROD` |PgSQL host|
|`PG_USER_PROD`|PgSQL user|
|`PG_PASS_PROD`|PgSQL password|
###### Stage
| Variable | Description |
| :---: | :---: |
|`PG_HOST_STAGE`|PgSQL host|
|`PG_USER_STAGE`|PgSQL user|
|`PG_PASS_STAGE`|PgSQL password|
#### GitHub Actions
This section describes how to integrate nxs-data-anonymizer into your GitHub Actions. You may add jobs presented below into your `.github` workflows and adjust it for yourself.
##### Job: anonymize prod
Job described in this section is able to perform the following tasks:
- Run when special tag is set
- Create a `production` database dump, anonymize and upload it into s3 bucket
```yaml
on:
push:
tags:
- v*.*
jobs:
anonymize:
runs-on: ubuntu-latest
container:
image: nixyslab/nxs-data-anonymizer:latest
env:
PG_HOST: ${{ secrets.PG_HOST_PROD }}
PG_USER: ${{ secrets.PG_USER_PROD }}
PGPASSWORD: ${{ secrets.PG_PASS_PROD }}
PG_SCHEMA: ${{ secrets.PG_SCHEMA }}
PG_DATABASE: ${{ secrets.PG_DATABASE }}
steps:
- name: Create services configs
run: |
echo "${{ secrets.S3CMD_CFG }}" > ~/.s3cmd
echo "${{ secrets.NXS_DA_CFG }}" > /nxs-data-anonymizer.conf
- name: Anonymize
run: |
pg_dump -h ${PG_HOST} -U ${PG_USER} --schema=${PG_SCHEMA} ${PG_DATABASE} | /nxs-data-anonymizer -t pgsql -c /nxs-data-anonymizer.conf | gzip | s3cmd put - s3://bucket/anondump.sql.gz
```
##### Job: update stage
Job described in this section deals with the following:
- Manual job
- Download the anonymized dump from s3 bucket and load into `stage` database
```yaml
on: workflow_dispatch
jobs:
restore-stage:
runs-on: ubuntu-latest
container:
image: nixyslab/nxs-data-anonymizer:latest
env:
PG_HOST: ${{ secrets.PG_HOST_STAGE }}
PG_USER: ${{ secrets.PG_USER_STAGE }}
PGPASSWORD: ${{ secrets.PG_PASS_STAGE }}
PG_SCHEMA: ${{ secrets.PG_SCHEMA }}
PG_DATABASE: ${{ secrets.PG_DATABASE }}
steps:
- name: Create services configs
run: |
echo "${{ secrets.S3CMD_CFG }}" > ~/.s3cmd
- name: Restore
run: |
s3cmd --no-progress --quiet get s3://bucket/anondump.sql.gz - | gunzip | psql -h ${PG_HOST} -U ${PG_USER} --schema=${PG_SCHEMA} ${PG_DATABASE}
```
##### GitHub Actions secrets
This section contains a description of secrets used in GitHub Actions job samples above.
###### General
| Variable | Description |
| :---: | :---: |
|`S3CMD_CFG` | S3 storage config |
|`PG_SCHEMA`| PgSQL schema |
|`PG_DATABASE`|PgSQL database name|
###### Production
| Variable | Description |
| :---: | :---: |
|`NXS_DA_CFG`|nxs-data-anonymizer config|
|`PG_HOST_PROD` |PgSQL host|
|`PG_USER_PROD`|PgSQL user|
|`PG_PASS_PROD`|PgSQL password|
###### Stage
| Variable | Description |
| :---: | :---: |
|`PG_HOST_STAGE`|PgSQL host|
|`PG_USER_STAGE`|PgSQL user|
|`PG_PASS_STAGE`|PgSQL password|
### Settings
Default configuration file path: `/nxs-data-anonymizer.conf`. The file is represented in yaml.
#### Command line arguments
| Argument | Short | Required | Having value | Default value | Description |
| :---: | :---: | :---: | :---: | :---: |--- |
| `--help` | `-h` | No | No | - | Show program help message |
| `--version` | `-v` | No | No | - | Show program version |
| `--conf` | `-c` | No | Yes | `/nxs-data-anonymizer.conf` | Configuration file path |
| `--input` | `-i` | No | Yes | - | File to read data from. If not specified `stdin` will be used |
| `--log-format` | `-l` | No | Yes | `json` | Log file format. You are available to use either `json` or `plain` value |
| `--output` | `-o` | No | Yes | - | File to write data to. If not specified `stdout` will be used |
| `--type` | `-t` | Yes | Yes | - | Database dump file type. Available values: `pgsql`, `mysql` |
#### General settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `logfile` | String | No | `stderr` | Log file path. You may also use `stdout` and `stderr` |
| `loglevel` | String | No | `info` | Log level. Available values: `debug`, `warn`, `error` and `info` |
| `progress` | [Progress](#progress-settings) | No | - | Anonymization progress logging |
| `variables` | Map of [Variables](#variables-settings) (key: variable name) | No | - | Global variables to be used in a filters. Variables are set at the init of application and remain unchanged during the runtime |
| `link` | Slice of [Link](#link-settings) | No | - | Rules to link specified columns across the database |
| `filters` | Map of [Filters](#filters-settings) (key: table name) | No | - | Filters set for specified tables (key as a table name). Note: for PgSQL you also need to specify a scheme (e.g. `public.tablename`) |
| `security` | [Security](#security-settings) | No | - | Security enforcement for anonymizer |
##### Progress settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `rhythm` | String | No | `0s` | Frequency write into the log a read bytes count. Progress will be written to the log only when this option is specified and has none-zero value. You may use a human-readable values (e.g. `30s`, `5m`, etc) |
| `humanize` | Bool | No | `false` | Set this option to `true` if you need to write into the log a read bytes count in a human-readable format. On `false` raw bytes count will be written to the log |
##### Variables settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `type` | String | No | `template` | Type of field `value`: `template` and `command` are available |
| `value` | String | Yes | - | The value to be used as global variable value within the filters. In accordance with the `type` this value may be either `Go template` or `command`. See below for details|
##### Link settings
Link is used to create the same data with specified rules for different cells across the database.
Each link element has following properties:
- Able to contain multiple tables and columns for each table
- All specified cells with the same data before anonymization will have same data after
- One common rule to generate new values
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `type` | String | No | `template` | Type of field `value`: `template` and `command` are available |
| `value` | String | Yes | - | The value to be used to replace at every cell in specified column. In accordance with the `type` this value may be either `Go template` or `command`. See below for details|
| `unique` | Bool | No | `false` | If true checks the generated value for cell is unique whole an all columns specified for `link` element |
##### Filters settings
Filters description for specified table.
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `columns` | Map of [Columns](#columns-settings) (key: column name) | No | - | Filter rules for specified columns of table (key as a column name) |
###### Columns settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `type` | String | No | `template` | Type of field `value`: `template` and `command` are available |
| `value` | String | Yes | - | The value to be used to replace at every cell in specified column. In accordance with the `type` this value may be either `Go template` or `command`. See below for details|
| `unique` | Bool | No | `false` | If true checks the generated value for cell is unique whole the column |
**Go template**
To anonymize a database fields you may use a Go template with the [Sprig template library's](https://masterminds.github.io/sprig/) functions.
Additional filter functions:
- `null`: set a field value to `NULL`
- `isNull`: compare a field value with `NULL`
- `drop`: drop whole row. If table has filters for several columns and at least one of them returns drop value, whole row will be skipped during the anonymization process
You may also use the following data in a templates:
- Current table name. Statement: `{{ .TableName }}`
- Current column name. Statement: `{{ .CurColumnName }}`
- Values of other columns in the rules for same row (with values before substitutions). Statement: `{{ .Values.COLUMN_NAME }}` (e.g.: `{{ .Values.username }}`)
- Global variables. Statement: `{{ .Variables.VARIABLE_NAME }}` (e.g.: `{{ .Variables.password }}`)
- Raw column data type. Statement: `{{ .ColumnTypeRaw }}`
- Regex's capturing groups for the column data type. This variable has array type so you need to use `range` or `index` to access specific element. Statement: `{{ index .ColumnTypeGroups 0 0 }}`. See [Types](#types-settings) for details
**Command**
To anonymize a database fields you may use a commands (scripts or binaries) with any logic you need. The command's concept has following properties:
- The command's `stdout` will be used as a new value for the anonymized field
- Command must return zero exit code, otherwise nxs-data-anonymizer will falls with error (in this case `stderr` will be used as an error text)
- Environment variables with the row data are available within the command:
- `ENVVARTABLE`: contains a name of the current table
- `ENVVARCURCOLUMN`: contains the current column name
- `ENVVARCOLUMN_{COLUMN_NAME}`: contains values (before substitutions) for all columns for the current row
- `ENVVARGLOBAL_{VARIABLE_NAME}`: contains value for specified global variable
- `ENVVARCOLUMNTYPERAW`: contains raw column data type
- `ENVVARCOLUMNTYPEGROUP_{GROUP_NUM}_{SUBGROUPNUM}`: contains regex's capturing groups for the column data type. See [Types](#types-settings) for details
##### Security settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `policy` | [Policy](#policy-settings) | No | - | Security policy for entities |
| `exceptions` | [Exceptions](exceptions-settings) | No | - | Exceptions for entities |
| `defaults` | [Defaults](defaults-settings) | No | - | Default filters for entities |
###### Policy settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `tables` | String | No | `pass` | Security policy for tables. If value `skip` is used all undescribed tables in config will be skipped while anonymization |
| `columns` | String | No | `pass` | Security policy for columns. If value `randomize` is used all undescribed columns in config will be randomized (with default rules in accordance to types) while anonymization |
_Values to masquerade a columns in accordance with the types see below._
**PgSQL:**
| Type | Value to masquerade |
|---|:---:|
| `smallint` | `0` |
| `integer` | `0` |
| `bigint` | `0` |
| `smallserial` | `0` |
| `serial` | `0` |
| `bigserial` | `0` |
| `decimal` | `0.0` |
| `numeric` | `0.0` |
| `real` | `0.0` |
| `double` | `0.0` |
| `character` | `randomized character data"` |
| `bpchar` | `randomized bpchar data` |
| `text` | `randomized text data` |
**MySQL:**
| Type | Value to masquerade |
|---|:---:|
| `bit` | `0` |
| `bool` | `0` |
| `boolean` | `0` |
| `tinyint` | `0` |
| `smallint` | `0` |
| `mediumint` | `0` |
| `int` | `0` |
| `integer` | `0` |
| `bigint` | `0` |
| `float` | `0.0` |
| `double` | `0.0` |
| `double precision` | `0.0` |
| `decimal` | `0.0` |
| `dec` | `0.0` |
| `char` | `randomized char` (String will be truncated to "COLUMN_SIZE" length.)|
| `varchar` | `randomized varchar` (String will be truncated to "COLUMN_SIZE" length.) |
| `tinytext` | `randomized tinytext` |
| `text` | `randomized text` |
| `mediumtext` | `randomized mediumtext` |
| `longtext` | `randomized longtext` |
| `enum` | Last value from `enum` |
| `set` | Last value from `set` |
| `date` | `2024-01-01` |
| `datetime` | `2024-01-01 00:00:00` |
| `timestamp` | `2024-01-01 00:00:00` |
| `time` | `00:00:00` |
| `year` | `2024` |
| `json` | `{"randomized": "json_data"}` |
| `binary` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
| `varbinary` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
| `tinyblob` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
| `blob` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
| `mediumblob` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
| `longblob` | `cmFuZG9taXplZCBiaW5hcnkgZGF0YQo=` |
###### Exceptions settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `tables` | Slice of strings | No | - | Table names without filters which are not be skipped while anonymization if option `security.policy.tables` set to `skip` |
| `columns` | Slice of strings | No | - | Column names (in any table) without filters which are not be randomized while anonymization if option `security.policy.columns` set to `randomize` |
###### Defaults settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `columns` | Map of Filters | No | - | Default filter for columns (in any table). That filters will be applied for columns with this names without described filters |
| `types` | Slice of [Types](#types-settings) | No | - | Custom filters for types (in any table). With this filter rules you may override default filters for types |
###### Types settings
| Option | Type | Required | Default value | Description |
|--- | :---: | :---: | :---: |--- |
| `regex` | String | Yes | - | Regular expression. Will be checked for match for column data type (in `CREATE TABLE` section). Able to use capturing groups within the regex that available as an additional variable data in the filters (see [Columns](#columns-settings) for details). This ability helps to create more flexible rules to generate the cells value in accordance with data type features |
| `rule` | [Columns](#columns-settings) | Yes | - | Rule will be applied columns with data types matched for specified regular expression |
#### Example
Imagine you have a simple database with two tables `users` and `posts` in your production PgSQL like this:
| id | username | password | api_key |
| :---: | :---: | :---: | :---: |
| 1 | `admin` | `ZjCX6wUxtXIMtip` | `epezyj0cj5rqrdtxklnzxr3f333uibtz6avek7926141t1c918` |
| 2 | `alice` | `tuhjLkgwwetiwf8` | `2od4vfsx2irj98hgjaoi6n7wjr02dg79cvqnmet4kyuhol877z` |
| 3 | `bob` | `AjRzvRp3DWo6VbA` | `owp7hob5s3o083d5hmursxgcv9wc4foyl20cbxbrr73egj6jkx` |
| id | poster_id | title | content |
| :---: | :---: | :---: | :---: |
| 1 | 1 | `example_post_1` | `epezyj0cj5rqrdtxklnzxr3f333uibtz6avek7926141t1c918` |
| 2 | 2 | `example_post_2` | `2od4vfsx2irj98hgjaoi6n7wjr02dg79cvqnmet4kyuhol877z` |
| 3 | 3 | `example_post_3` | `owp7hob5s3o083d5hmursxgcv9wc4foyl20cbxbrr73egj6jkx` |
| 4 | 1 | `example_post_4` | `epezyj0cj5rqrdtxklnzxr3f333uibtz6avek7926141t1c918` |
| 5 | 2 | `example_post_5` | `2od4vfsx2irj98hgjaoi6n7wjr02dg79cvqnmet4kyuhol877z` |
| 6 | 3 | `example_post_6` | `owp7hob5s3o083d5hmursxgcv9wc4foyl20cbxbrr73egj6jkx` |
You need to get a dump with fake values:
- For `admin`: preset fixed value for a password and API key to avoid the need to change an app settings in your dev/test/stage or local environment after downloading the dump.
- For others: usernames in format `user_N` (where `N` it is a user ID) and unique random passwords and API keys.
- Need to preserve data mapping between `users` and `posts` tables in `id` and `poster_id` columns
- Need to randomize contents of `content` column.
In accordance with these conditions, the nxs-data-anonymizer config may look like this:
```yaml
variables:
#Global variables.
adminPassword:
type: template
value: "preset_admin_password"
adminAPIKey:
value: "preset_admin_api_key"
#Block defining rules of behavior with fields and tables for which filters are not specified.
security:
# Specifies the required actions for tables and columns that are not specified in the configuration.
policy:
tables: skip
columns: randomize
# Excludes policy actions for the specified tables and columns.
exceptions:
tables:
- public.posts
columns:
- title
# Overrides the default policy actions for the columns specified in this block. The value is generated once and substituted into all instances of the field.
defaults:
columns:
content:
value: "{{- randAlphaNum 20 -}}"
#Here you define the rules that allow you to preserve the mapping of values between tables.
link:
- rule:
#Value generation rule.
value: "{{ randInt 1 15 }}"
unique: true
with:
#Tables and columns to which the rule is applied.
public.users:
- id
public.posts:
- poster_id
#Block describing replacement rules for fields.
filters:
public.users:
columns:
username:
value: "{{ if eq .Values.username \"admin\" }}{{ .Values.username }}{{ else }}user_{{ .Values.id }}{{ end }}"
password:
type: command
value: /path/to/script.sh
unique: true
api_key:
value: "{{ if eq .Values.username \"admin\" }}{{ .Variables.adminAPIKey }}{{ else }}{{- randAlphaNum 50 | nospace | lower -}}{{ end }}"
unique: true
```
The `/path/to/script.sh` script content is following:
```bash
#!/bin/bash
# Print preset password if current user is admin
if [ "$ENVVARCOLUMN_username" == "admin" ];
then
echo -n "$ENVVARGLOBAL_adminPassword"
exit 0
fi
# Generate password for other users
p=$(pwgen -s 5 1 2>&1)
if [ ! $? -eq 0 ];
then
# On error print message to stderr and exit with non zero code
echo -n "$p" >&2
exit 1
fi
# Print generated password
echo $p | tr -d '\n'
exit 0
```
Now you may execute the following command in order to load anonymized data into your dev DB:
```
pg_dump ... | ./nxs-data-anonymizer -c filters.conf | psql -h localhost -U user example
```
As a result:
| id | username | password | api_key |
| :---: | :---: | :---: | :---: |
| 5 | `admin` | `preset_admin_password` | `preset_admin_api_key` |
| 4 | `user_2` | `Pp4HY` | `dhx4mccxyd8ux5uf1khpbqsws8qqeqs4efex1vhfltzhtjcwcu` |
| 7 | `user_3` | `vu5TW` | `lgkkq3csskuyew8fr52vfjjenjzudokmiidg3cohl2bertc93x` |
| id | poster_id | title | content |
| :---: | :---: | :---: | :---: |
| 1 | 5 | `example_post_1` | `EDlT6bGXJ2LOS7CE2E4b` |
| 2 | 4 | `example_post_2` | `EDlT6bGXJ2LOS7CE2E4b` |
| 3 | 7 | `example_post_3` | `EDlT6bGXJ2LOS7CE2E4b` |
| 4 | 5 | `example_post_4` | `EDlT6bGXJ2LOS7CE2E4b` |
| 5 | 4 | `example_post_5` | `EDlT6bGXJ2LOS7CE2E4b` |
| 6 | 7 | `example_post_6` | `EDlT6bGXJ2LOS7CE2E4b` |
It's easy. You can find more examples in doc/examples.
## Roadmap
Following features are already in backlog for our development team and will be released soon:
- [x] Global variables with the templated values you may use through the filters for all tables and columns
- [x] Ability to delete tables and rows from faked dump
- [ ] Ability to output into log a custom messages. It’s quite useful it order to obtain some generated data like admin passwords, etc
- [ ] Support of a big variety of databases
## Feedback
For support and feedback please contact me:
- telegram: [@borisershov](https://t.me/borisershov)
- e-mail: b.ershov@nixys.io
For news and discussions subscribe the channels:
- Telegram community (news): [@nxs_data_anonymizer](https://t.me/nxs_data_anonymizer)
- Telegram community (chat): [@nxs_data_anonymizer_chat](https://t.me/nxs_data_anonymizer_chat)
## License
nxs-data-anonymizer is released under the [Apache License 2.0](LICENSE).
[tg-news-badge]: https://img.shields.io/endpoint?url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Fnxs_data_anonymizer
[tg-chat-badge]: https://img.shields.io/endpoint?url=https%3A%2F%2Ftg.sumanjay.workers.dev%2Fnxs_data_anonymizer_chat
[tg-news-url]: https://t.me/nxs_data_anonymizer
[tg-chat-url]: https://t.me/nxs_data_anonymizer_chat
[aica-badge]: https://img.shields.io/badge/AI-Code%20Assist-EB9FDA
[aica-url]: https://app.commanddash.io/agent?github=https://github.com/nixys/nxs-data-anonymizer
================================================
FILE: ctx/args.go
================================================
package ctx
import (
"fmt"
"os"
"github.com/nixys/nxs-data-anonymizer/misc"
"github.com/pborman/getopt/v2"
)
const (
confPathDefault = "/nxs-data-anonymizer.conf"
)
var version string
// Args contains arguments value read from command line
type Args struct {
ConfigPath string
LogFormat LogFormat
Input *string
Output *string
Cleanup bool
DBType DBType
}
// ArgsRead reads arguments from command line
func ArgsRead() (Args, error) {
args := getopt.New()
helpFlag := args.BoolLong(
"help",
'h',
"Show help")
versionFlag := args.BoolLong(
"version",
'v',
"Show program version")
confPath := args.StringLong(
"conf",
'c',
confPathDefault,
fmt.Sprintf("Config file path"))
input := args.StringLong(
"input",
'i',
"",
"Input file. If not set `stdin` is used")
logformat := args.EnumLong(
"log-format",
'l',
[]string{
string(LogFormatJSON),
string(LogFormatPlain),
},
string(LogFormatJSON),
fmt.Sprintf("Log file format. Values `%s` or `%s` are available", LogFormatJSON, LogFormatPlain),
)
output := args.StringLong(
"output",
'o',
"",
"Output file. If not set `stdout` is used")
dbType := args.EnumLong(
"type",
't',
[]string{
string(DBTypeMySQL),
string(DBTypePgSQL),
},
"",
fmt.Sprintf("Database type you need to operate. Values `%s` or `%s` are available", DBTypePgSQL, DBTypeMySQL),
)
cleanup := args.BoolLong(
"cleanup",
'C',
"Clean up destination database (experimental). Available only for MySQL")
args.Parse(os.Args)
/* Show help */
if *helpFlag == true {
argsHelp(args)
return Args{}, misc.ErrArgSuccessExit
}
/* Show version */
if *versionFlag == true {
argsVersion()
return Args{}, misc.ErrArgSuccessExit
}
if args.IsSet("type") == false {
fmt.Println("args: 'type' option must be specified")
return Args{}, misc.ErrConig
}
return Args{
ConfigPath: *confPath,
LogFormat: LogFormat(*logformat),
Input: func() *string {
if args.IsSet("input") == true {
return input
}
return nil
}(),
Output: func() *string {
if args.IsSet("output") == true {
return output
}
return nil
}(),
Cleanup: *cleanup,
DBType: DBType(*dbType),
}, nil
}
func argsHelp(args *getopt.Set) {
additionalDescription := `
Additional description
Tool for anonymizing PostgreSQL and MySQL databases' dump
`
args.PrintUsage(os.Stdout)
fmt.Println(additionalDescription)
}
func argsVersion() {
fmt.Println(version)
}
================================================
FILE: ctx/conf.go
================================================
package ctx
import (
"fmt"
"github.com/nixys/nxs-data-anonymizer/misc"
conf "github.com/nixys/nxs-go-conf"
)
type confOpts struct {
LogFile string `conf:"logfile" conf_extraopts:"default=stderr"`
LogLevel string `conf:"loglevel" conf_extraopts:"default=info"`
Progress progressConf `conf:"progress"`
Filters map[string]filterConf `conf:"filters"`
Link []linkConf `conf:"link"`
Security securityConf `conf:"security"`
Variables map[string]variableFilterConf `conf:"variables"`
MySQL *mysqlConf `conf:"mysql"`
}
type progressConf struct {
Rhythm string `conf:"rhythm" conf_extraopts:"default=0s"`
Humanize bool `conf:"humanize"`
}
type filterConf struct {
Columns map[string]columnFilterConf `conf:"columns"`
}
type columnFilterConf struct {
Type string `conf:"type" conf_extraopts:"default=template"`
Value string `conf:"value" conf_extraopts:"required"`
Unique bool `conf:"unique"`
}
type linkConf struct {
Rule columnFilterConf `conf:"rule"`
With map[string][]string `conf:"with" conf_extraopts:"required"`
}
type variableFilterConf struct {
Type string `conf:"type" conf_extraopts:"default=template"`
Value string `conf:"value" conf_extraopts:"required"`
}
type securityConf struct {
Policy securityPolicyConf `conf:"policy"`
Exceptions securityExceptionsConf `conf:"exceptions"`
Defaults securityDefaultsConf `conf:"defaults"`
}
type securityPolicyConf struct {
Tables string `conf:"tables" conf_extraopts:"default=pass"`
Columns string `conf:"columns" conf_extraopts:"default=pass"`
}
type securityExceptionsConf struct {
Tables []string `conf:"tables"`
Columns []string `conf:"columns"`
}
type securityDefaultsConf struct {
Columns map[string]columnFilterConf `conf:"columns"`
Types []securityDefaultsTypeConf `conf:"types"`
}
type securityDefaultsTypeConf struct {
Regex string `conf:"regex" conf_extraopts:"required"`
Rule columnFilterConf `conf:"rule" conf_extraopts:"required"`
}
type mysqlConf struct {
Host string `conf:"host" conf_extraopts:"required"`
Port int `conf:"port" conf_extraopts:"required"`
DB string `conf:"db" conf_extraopts:"required"`
User string `conf:"user" conf_extraopts:"required"`
Password string `conf:"password" conf_extraopts:"required"`
}
func confRead(confPath string) (confOpts, error) {
var c confOpts
err := conf.Load(&c, conf.Settings{
ConfPath: confPath,
ConfType: conf.ConfigTypeYAML,
UnknownDeny: true,
})
if err != nil {
return c, err
}
for _, f := range c.Filters {
for _, cf := range f.Columns {
if misc.ValueTypeFromString(cf.Type) == misc.ValueTypeUnknown {
return c, fmt.Errorf("conf read: unknown column filter type")
}
}
}
for _, f := range c.Variables {
if misc.ValueTypeFromString(f.Type) == misc.ValueTypeUnknown {
return c, fmt.Errorf("conf read: unknown variable filter type")
}
}
if misc.SecurityPolicyTablesTypeFromString(c.Security.Policy.Tables) == misc.SecurityPolicyTablesUnknown {
return c, fmt.Errorf("conf read: unknown security policy tables type")
}
if misc.SecurityPolicyColumnsTypeFromString(c.Security.Policy.Columns) == misc.SecurityPolicyColumnsUnknown {
return c, fmt.Errorf("conf read: unknown security policy columns type")
}
for _, cf := range c.Security.Defaults.Columns {
if misc.ValueTypeFromString(cf.Type) == misc.ValueTypeUnknown {
return c, fmt.Errorf("conf read: unknown default filter type")
}
}
return c, nil
}
================================================
FILE: ctx/context.go
================================================
package ctx
import (
"fmt"
"io"
"os"
"time"
"github.com/nixys/nxs-data-anonymizer/interfaces"
mysql_anonymize "github.com/nixys/nxs-data-anonymizer/modules/anonymizers/mysql"
pgsql_anonymize "github.com/nixys/nxs-data-anonymizer/modules/anonymizers/pgsql"
progressreader "github.com/nixys/nxs-data-anonymizer/modules/progress_reader"
"github.com/nixys/nxs-data-anonymizer/ds/mysql"
"github.com/nixys/nxs-data-anonymizer/misc"
"github.com/nixys/nxs-data-anonymizer/modules/filters/relfilter"
"github.com/sirupsen/logrus"
appctx "github.com/nixys/nxs-go-appctx/v3"
)
// Ctx defines application custom context
type Ctx struct {
Log *logrus.Logger
Output io.Writer
Progress progressCtx
DB DBCtx
Anonymizer interfaces.Anonymizer
PR *progressreader.ProgressReader
}
type DBCtx struct {
Cleanup bool
Type DBType
MySQL *mysql.MySQL
}
type DBType string
const (
DBTypeMySQL DBType = "mysql"
DBTypePgSQL DBType = "pgsql"
)
type LogFormat string
const (
LogFormatJSON LogFormat = "json"
LogFormatPlain LogFormat = "plain"
)
type progressCtx struct {
Rhythm time.Duration
Humanize bool
}
type SecurityCtx struct {
TablePolicy misc.SecurityPolicyTablesType
TableExceptions map[string]any
}
// Init initiates application custom context
func AppCtxInit() (any, error) {
var ir io.Reader
c := &Ctx{}
args, err := ArgsRead()
if err != nil {
return nil, err
}
conf, err := confRead(args.ConfigPath)
if err != nil {
tmpLogError("ctx init", err)
return nil, err
}
c.Log, err = logInit(conf.LogFile, conf.LogLevel, args.LogFormat)
if err != nil {
tmpLogError("ctx init", err)
return nil, err
}
if args.Input == nil {
ir = os.Stdin
} else {
ir, err = os.Open(*args.Input)
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init: open input file")
return nil, err
}
}
if args.Output == nil {
c.Output = os.Stdout
} else {
c.Output, err = os.Create(*args.Output)
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init: open output file")
return nil, err
}
}
c.DB = DBCtx{
Cleanup: args.Cleanup,
Type: args.DBType,
}
// DEPRECATED: Connect to MySQL if necessary
if conf.MySQL != nil {
m, err := mysql.Connect(mysql.Settings{
Host: conf.MySQL.Host,
Port: conf.MySQL.Port,
Database: conf.MySQL.DB,
User: conf.MySQL.User,
Password: conf.MySQL.Password,
})
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init")
return nil, err
}
c.DB.MySQL = &m
} else {
if args.Cleanup == true {
c.Log.WithFields(logrus.Fields{
"details": "destination database clean up was requested but connection to database doesn't specified",
}).Errorf("ctx init")
return nil, misc.ErrConig
}
}
c.PR = progressreader.Init(ir)
vr := func() map[string]relfilter.VariableRuleOpts {
rules := make(map[string]relfilter.VariableRuleOpts)
for n, f := range conf.Variables {
rules[n] = relfilter.VariableRuleOpts{
Type: misc.ValueType(f.Type),
Value: f.Value,
}
}
return rules
}()
tr := func() map[string]map[string]relfilter.ColumnRuleOpts {
tables := make(map[string]map[string]relfilter.ColumnRuleOpts)
for t, cs := range conf.Filters {
columns := make(map[string]relfilter.ColumnRuleOpts)
for c, f := range cs.Columns {
columns[c] = relfilter.ColumnRuleOpts{
Type: misc.ValueType(f.Type),
Value: f.Value,
Unique: f.Unique,
}
}
tables[t] = columns
}
return tables
}()
dr := func() map[string]relfilter.ColumnRuleOpts {
cc := make(map[string]relfilter.ColumnRuleOpts)
for c, cf := range conf.Security.Defaults.Columns {
cc[c] = relfilter.ColumnRuleOpts{
Type: misc.ValueTypeFromString(cf.Type),
Value: cf.Value,
Unique: cf.Unique,
}
}
return cc
}()
trc := func() []relfilter.TypeRuleOpts {
cc := []relfilter.TypeRuleOpts{}
for _, t := range conf.Security.Defaults.Types {
cc = append(
cc,
relfilter.TypeRuleOpts{
Selector: t.Regex,
Rule: relfilter.ColumnRuleOpts{
Type: misc.ValueTypeFromString(t.Rule.Type),
Value: t.Rule.Value,
Unique: t.Rule.Unique,
},
},
)
}
return cc
}()
lnk := []relfilter.LinkOpts{}
for _, l := range conf.Link {
lnk = append(
lnk,
relfilter.LinkOpts{
Rule: relfilter.ColumnRuleOpts{
Type: misc.ValueTypeFromString(l.Rule.Type),
Value: l.Rule.Value,
Unique: l.Rule.Unique,
},
With: l.With,
},
)
}
switch args.DBType {
case DBTypeMySQL:
c.Anonymizer, err = mysql_anonymize.Init(
c.PR,
mysql_anonymize.InitOpts{
Variables: vr,
Security: mysql_anonymize.SecurityOpts{
TablesPolicy: misc.SecurityPolicyTablesType(conf.Security.Policy.Tables),
ColumnsPolicy: misc.SecurityPolicyColumnsTypeFromString(conf.Security.Policy.Columns),
TableExceptions: conf.Security.Exceptions.Tables,
},
Rules: mysql_anonymize.RulesOpts{
TableRules: tr,
DefaultRules: dr,
ExceptionColumns: conf.Security.Exceptions.Columns,
TypeRuleCustom: trc,
},
Link: lnk,
},
)
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init")
return nil, err
}
case DBTypePgSQL:
c.Anonymizer, err = pgsql_anonymize.Init(
c.PR,
pgsql_anonymize.InitOpts{
Variables: vr,
Security: pgsql_anonymize.SecurityOpts{
TablesPolicy: misc.SecurityPolicyTablesType(conf.Security.Policy.Tables),
ColumnsPolicy: misc.SecurityPolicyColumnsTypeFromString(conf.Security.Policy.Columns),
TableExceptions: conf.Security.Exceptions.Tables,
},
Rules: pgsql_anonymize.RulesOpts{
TableRules: tr,
DefaultRules: dr,
ExceptionColumns: conf.Security.Exceptions.Columns,
TypeRuleCustom: trc,
},
Link: lnk,
},
)
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init")
return nil, err
}
}
// Progress settings
c.Progress.Humanize = conf.Progress.Humanize
c.Progress.Rhythm, err = time.ParseDuration(conf.Progress.Rhythm)
if err != nil {
c.Log.WithFields(logrus.Fields{
"details": err,
}).Errorf("ctx init")
return nil, err
}
return c, nil
}
func tmpLogError(msg string, err error) {
l, _ := appctx.DefaultLogInit(os.Stderr, logrus.InfoLevel, &logrus.JSONFormatter{})
l.WithFields(logrus.Fields{
"details": err,
}).Errorf(msg)
}
func logInit(file, level string, ft LogFormat) (*logrus.Logger, error) {
var (
f *os.File
err error
)
switch file {
case "stdout":
f = os.Stdout
case "stderr":
f = os.Stderr
default:
f, err = os.OpenFile(file, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)
if err != nil {
return nil, fmt.Errorf("log init: %w", err)
}
}
// Validate log level
l, err := logrus.ParseLevel(level)
if err != nil {
return nil, fmt.Errorf("log init: %w", err)
}
if ft == LogFormatPlain {
return appctx.DefaultLogInit(f, l, nil)
}
return appctx.DefaultLogInit(f, l, &logrus.JSONFormatter{})
}
================================================
FILE: doc/examples/drop/MySQL/input.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (1,'Wilford','Wintheiser','brett35@example.com','1981-10-14','1988-09-10 18:37:25'),(2,'Nyasia','Doyle','aracely46@example.com','2007-07-01','1980-10-28 23:57:00'),(3,'Ken','Haag','carroll.harris@example.com','2003-04-16','1997-03-14 18:41:06'),(4,'Leonor','Mann','johns.janick@example.org','1996-05-18','2010-04-12 00:38:42'),(5,'Eloisa','Ratke','lakin.ramiro@example.net','1982-07-22','1996-03-25 09:07:39'),(6,'Nikolas','Dibbert','judson33@example.com','1970-02-22','1979-03-16 10:10:12'),(7,'Kelley','Koch','kaci.koch@example.net','2013-05-01','2020-08-02 02:01:34'),(8,'Glen','Howe','jprosacco@example.net','1971-08-03','1971-01-02 14:19:52'),(9,'Geovanni','Medhurst','kutch.kylie@example.com','2011-04-20','2004-06-10 12:33:11'),(10,'Zella','Davis','hane.terrill@example.org','1991-11-07','2007-09-19 13:48:20');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (1,1,'Pariatur est in ut provident vero eligendi.','Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum.','Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea.','1975-07-07'),(2,2,'Unde est architecto est.','Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel.','Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem.','1976-05-25'),(3,3,'Dignissimos perspiciatis nobis quisquam saepe ad aut numquam.','Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum.','Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum.','1991-12-21'),(4,4,'Voluptas sint modi magnam.','Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem.','Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam.','2002-01-23'),(5,5,'Sapiente rem eos enim ullam ipsum ut.','Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam.','Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia.','2017-11-19'),(6,6,'Error quas doloremque est sunt quae.','Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis.','Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id.','1974-03-23'),(7,7,'Quo impedit quos molestiae dolorum in soluta dolores non.','Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut.','Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis.','2004-12-08'),(8,8,'Nulla quia repellendus et autem vitae provident.','Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae.','Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque.','1999-02-28'),(9,9,'Similique at quia quia ut recusandae repudiandae delectus.','Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem.','Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis.','2007-08-07'),(10,10,'Est vel aperiam ipsa quod doloremque et est et.','Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem.','Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia.','2009-07-18'),(11,1,'Sint est qui dolorem eum accusantium repudiandae.','Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa.','Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum.','2010-04-16'),(12,2,'Culpa debitis ut non sapiente voluptatem.','Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus.','Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit.','1988-12-26'),(13,3,'Ut ut rerum qui quis sed sunt.','Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni.','Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis.','2001-06-01'),(14,4,'Error inventore delectus sapiente non.','Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores.','Voluptatum id amet qui quia. Nemo nulla atque dignissimos.','1974-12-07'),(15,5,'Ut aut quo aut ea occaecati est voluptas.','Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus.','Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim.','1999-09-12'),(16,6,'Nihil ea qui sequi odit rem.','Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi.','Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut.','2003-07-28'),(17,7,'Quia accusantium deserunt suscipit.','Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi.','Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis.','2015-05-24'),(18,8,'Inventore et eaque temporibus qui aut exercitationem necessitatibus.','Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt.','Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam.','1996-02-06'),(19,9,'Et soluta consequatur porro rem corrupti.','Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et.','Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur.','2018-03-31'),(20,10,'Culpa error rerum voluptatem recusandae quae tempora.','Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia.','Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos.','2007-01-22'),(21,1,'Harum laudantium fugiat debitis atque sed.','Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae.','Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia.','1987-06-29'),(22,2,'Non architecto ut voluptas aut voluptas dolor ut.','Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel.','Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque.','1993-05-06'),(23,3,'Dolores sed hic vitae ut qui.','Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae.','Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur.','1978-09-08'),(24,4,'Deleniti distinctio eos eveniet.','Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni.','Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae.','2003-06-23'),(25,5,'Ea et asperiores odio vel sunt exercitationem.','Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est.','Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio.','1972-09-16'),(26,6,'Accusamus est sed aut minus.','Et libero in in est consequuntur. Illum distinctio doloremque quas.','Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor.','2017-03-08'),(27,7,'Et sed reprehenderit nobis sed.','Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum.','Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est.','1973-08-04'),(28,8,'Autem ullam aperiam totam assumenda quod esse.','Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea.','Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae.','2014-04-26'),(29,9,'Ad dolores amet ea nisi aut enim voluptatem.','Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla.','Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in.','2006-09-07'),(30,10,'Eos fuga at ex sapiente quasi.','Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque.','Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et.','2009-07-23');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/drop/MySQL/nxs-data-anonymizer.conf
================================================
filters:
authors:
columns:
first_name:
value: "John"
last_name:
value: "Smith"
email:
value: "JohnSmith@example.com"
birthdate:
value: "{{ if eq .Values.birthdate \"1981-10-14\" }}{{ drop }}{{ else }}{{ .Values.added }}{{ end }}"
added:
value: "2000-01-01 12:00:00"
posts:
columns:
author_id:
value: "{{ if eq .Values.author_id \"1\" }}{{ drop }}{{ else }}{{ .Values.author_id }}{{ end }}"
title:
value: "anon_title"
description:
value: "anon_description"
content:
value: "anon_content"
date:
value: "2001-01-01 12:00:00"
================================================
FILE: doc/examples/drop/MySQL/output.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (2,'John','Smith','JohnSmith@example.com','1980-10-28 23:57:00','2000-01-01 12:00:00'),(3,'John','Smith','JohnSmith@example.com','1997-03-14 18:41:06','2000-01-01 12:00:00'),(4,'John','Smith','JohnSmith@example.com','2010-04-12 00:38:42','2000-01-01 12:00:00'),(5,'John','Smith','JohnSmith@example.com','1996-03-25 09:07:39','2000-01-01 12:00:00'),(6,'John','Smith','JohnSmith@example.com','1979-03-16 10:10:12','2000-01-01 12:00:00'),(7,'John','Smith','JohnSmith@example.com','2020-08-02 02:01:34','2000-01-01 12:00:00'),(8,'John','Smith','JohnSmith@example.com','1971-01-02 14:19:52','2000-01-01 12:00:00'),(9,'John','Smith','JohnSmith@example.com','2004-06-10 12:33:11','2000-01-01 12:00:00'),(10,'John','Smith','JohnSmith@example.com','2007-09-19 13:48:20','2000-01-01 12:00:00');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (2,2,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(3,3,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(4,4,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(5,5,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(6,6,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(7,7,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(8,8,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(9,9,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(10,10,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(12,2,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(13,3,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(14,4,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(15,5,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(16,6,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(17,7,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(18,8,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(19,9,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(20,10,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(22,2,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(23,3,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(24,4,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(25,5,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(26,6,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(27,7,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(28,8,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(29,9,'anon_title','anon_description','anon_content','2001-01-01 12:00:00'),(30,10,'anon_title','anon_description','anon_content','2001-01-01 12:00:00');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/drop/PostgreSQL/input
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)
-- Dumped by pg_dump version 16.3 (Debian 16.3-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: authors; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.authors (
id integer NOT NULL,
first_name character varying(50) NOT NULL,
last_name character varying(50) NOT NULL,
email character varying(100) NOT NULL,
birthdate date NOT NULL,
added timestamp without time zone NOT NULL
);
ALTER TABLE public.authors OWNER TO postgres;
--
-- Name: posts; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.posts (
id integer NOT NULL,
author_id integer NOT NULL,
title character varying(255) NOT NULL,
description character varying(500) NOT NULL,
content text NOT NULL,
date date NOT NULL
);
ALTER TABLE public.posts OWNER TO postgres;
--
-- Data for Name: authors; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.authors (id, first_name, last_name, email, birthdate, added) FROM stdin;
1 Wilford Wintheiser brett35@example.com 1981-10-14 1988-09-10 18:37:25
2 Nyasia Doyle aracely46@example.com 2007-07-01 1980-10-28 23:57:00
3 Ken Haag carroll.harris@example.com 2003-04-16 1997-03-14 18:41:06
4 Leonor Mann johns.janick@example.org 1996-05-18 2010-04-12 00:38:42
5 Eloisa Ratke lakin.ramiro@example.net 1982-07-22 1996-03-25 09:07:39
6 Nikolas Dibbert judson33@example.com 1970-02-22 1979-03-16 10:10:12
7 Kelley Koch kaci.koch@example.net 2013-05-01 2020-08-02 02:01:34
8 Glen Howe jprosacco@example.net 1971-08-03 1971-01-02 14:19:52
9 Geovanni Medhurst kutch.kylie@example.com 2011-04-20 2004-06-10 12:33:11
10 Zella Davis hane.terrill@example.org 1991-11-07 2007-09-19 13:48:20
\.
--
-- Data for Name: posts; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.posts (id, author_id, title, description, content, date) FROM stdin;
1 1 Pariatur est in ut provident vero eligendi. Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum. Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea. 1975-07-07
2 2 Unde est architecto est. Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel. Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem. 1976-05-25
3 3 Dignissimos perspiciatis nobis quisquam saepe ad aut numquam. Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum. Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum. 1991-12-21
4 4 Voluptas sint modi magnam. Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem. Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam. 2002-01-23
5 5 Sapiente rem eos enim ullam ipsum ut. Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam. Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia. 2017-11-19
6 6 Error quas doloremque est sunt quae. Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis. Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id. 1974-03-23
7 7 Quo impedit quos molestiae dolorum in soluta dolores non. Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut. Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis. 2004-12-08
8 8 Nulla quia repellendus et autem vitae provident. Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae. Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque. 1999-02-28
9 9 Similique at quia quia ut recusandae repudiandae delectus. Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem. Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis. 2007-08-07
10 10 Est vel aperiam ipsa quod doloremque et est et. Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem. Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia. 2009-07-18
11 1 Sint est qui dolorem eum accusantium repudiandae. Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa. Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum. 2010-04-16
12 2 Culpa debitis ut non sapiente voluptatem. Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus. Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit. 1988-12-26
13 3 Ut ut rerum qui quis sed sunt. Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni. Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis. 2001-06-01
14 4 Error inventore delectus sapiente non. Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores. Voluptatum id amet qui quia. Nemo nulla atque dignissimos. 1974-12-07
15 5 Ut aut quo aut ea occaecati est voluptas. Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus. Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim. 1999-09-12
16 6 Nihil ea qui sequi odit rem. Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi. Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut. 2003-07-28
17 7 Quia accusantium deserunt suscipit. Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi. Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis. 2015-05-24
18 8 Inventore et eaque temporibus qui aut exercitationem necessitatibus. Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt. Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam. 1996-02-06
19 9 Et soluta consequatur porro rem corrupti. Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et. Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur. 2018-03-31
20 10 Culpa error rerum voluptatem recusandae quae tempora. Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia. Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos. 2007-01-22
21 1 Harum laudantium fugiat debitis atque sed. Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae. Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia. 1987-06-29
22 2 Non architecto ut voluptas aut voluptas dolor ut. Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel. Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque. 1993-05-06
23 3 Dolores sed hic vitae ut qui. Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae. Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur. 1978-09-08
24 4 Deleniti distinctio eos eveniet. Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni. Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae. 2003-06-23
25 5 Ea et asperiores odio vel sunt exercitationem. Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est. Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio. 1972-09-16
26 6 Accusamus est sed aut minus. Et libero in in est consequuntur. Illum distinctio doloremque quas. Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor. 2017-03-08
27 7 Et sed reprehenderit nobis sed. Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum. Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est. 1973-08-04
28 8 Autem ullam aperiam totam assumenda quod esse. Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea. Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae. 2014-04-26
29 9 Ad dolores amet ea nisi aut enim voluptatem. Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla. Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in. 2006-09-07
30 10 Eos fuga at ex sapiente quasi. Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque. Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et. 2009-07-23
\.
--
-- Name: authors authors_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.authors
ADD CONSTRAINT authors_pkey PRIMARY KEY (id);
--
-- Name: posts posts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.posts
ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/drop/PostgreSQL/nxs-data-anonymizer.conf
================================================
filters:
public.authors:
columns:
first_name:
value: "John"
last_name:
value: "Smith"
email:
value: "JohnSmith@example.com"
birthdate:
value: "{{ if eq .Values.birthdate \"1981-10-14\" }}{{ drop }}{{ else }}{{ .Values.added }}{{ end }}"
added:
value: "2000-01-01 12:00:00"
public.posts:
columns:
author_id:
value: "{{ if eq .Values.author_id \"1\" }}{{ drop }}{{ else }}{{ .Values.author_id }}{{ end }}"
title:
value: "anon_title"
description:
value: "anon_description"
content:
value: "anon_content"
date:
value: "2001-01-01 12:00:00"
================================================
FILE: doc/examples/drop/PostgreSQL/output
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)
-- Dumped by pg_dump version 16.3 (Debian 16.3-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: authors; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.authors (
id integer NOT NULL,
first_name character varying(50) NOT NULL,
last_name character varying(50) NOT NULL,
email character varying(100) NOT NULL,
birthdate date NOT NULL,
added timestamp without time zone NOT NULL
);
ALTER TABLE public.authors OWNER TO postgres;
--
-- Name: posts; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.posts (
id integer NOT NULL,
author_id integer NOT NULL,
title character varying(255) NOT NULL,
description character varying(500) NOT NULL,
content text NOT NULL,
date date NOT NULL
);
ALTER TABLE public.posts OWNER TO postgres;
--
-- Data for Name: authors; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.authors (id, first_name, last_name, email, birthdate, added) FROM stdin;
2 John Smith JohnSmith@example.com 1980-10-28 23:57:00 2000-01-01 12:00:00
3 John Smith JohnSmith@example.com 1997-03-14 18:41:06 2000-01-01 12:00:00
4 John Smith JohnSmith@example.com 2010-04-12 00:38:42 2000-01-01 12:00:00
5 John Smith JohnSmith@example.com 1996-03-25 09:07:39 2000-01-01 12:00:00
6 John Smith JohnSmith@example.com 1979-03-16 10:10:12 2000-01-01 12:00:00
7 John Smith JohnSmith@example.com 2020-08-02 02:01:34 2000-01-01 12:00:00
8 John Smith JohnSmith@example.com 1971-01-02 14:19:52 2000-01-01 12:00:00
9 John Smith JohnSmith@example.com 2004-06-10 12:33:11 2000-01-01 12:00:00
10 John Smith JohnSmith@example.com 2007-09-19 13:48:20 2000-01-01 12:00:00
\.
--
-- Data for Name: posts; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.posts (id, author_id, title, description, content, date) FROM stdin;
2 2 anon_title anon_description anon_content 2001-01-01 12:00:00
3 3 anon_title anon_description anon_content 2001-01-01 12:00:00
4 4 anon_title anon_description anon_content 2001-01-01 12:00:00
5 5 anon_title anon_description anon_content 2001-01-01 12:00:00
6 6 anon_title anon_description anon_content 2001-01-01 12:00:00
7 7 anon_title anon_description anon_content 2001-01-01 12:00:00
8 8 anon_title anon_description anon_content 2001-01-01 12:00:00
9 9 anon_title anon_description anon_content 2001-01-01 12:00:00
10 10 anon_title anon_description anon_content 2001-01-01 12:00:00
12 2 anon_title anon_description anon_content 2001-01-01 12:00:00
13 3 anon_title anon_description anon_content 2001-01-01 12:00:00
14 4 anon_title anon_description anon_content 2001-01-01 12:00:00
15 5 anon_title anon_description anon_content 2001-01-01 12:00:00
16 6 anon_title anon_description anon_content 2001-01-01 12:00:00
17 7 anon_title anon_description anon_content 2001-01-01 12:00:00
18 8 anon_title anon_description anon_content 2001-01-01 12:00:00
19 9 anon_title anon_description anon_content 2001-01-01 12:00:00
20 10 anon_title anon_description anon_content 2001-01-01 12:00:00
22 2 anon_title anon_description anon_content 2001-01-01 12:00:00
23 3 anon_title anon_description anon_content 2001-01-01 12:00:00
24 4 anon_title anon_description anon_content 2001-01-01 12:00:00
25 5 anon_title anon_description anon_content 2001-01-01 12:00:00
26 6 anon_title anon_description anon_content 2001-01-01 12:00:00
27 7 anon_title anon_description anon_content 2001-01-01 12:00:00
28 8 anon_title anon_description anon_content 2001-01-01 12:00:00
29 9 anon_title anon_description anon_content 2001-01-01 12:00:00
30 10 anon_title anon_description anon_content 2001-01-01 12:00:00
\.
--
-- Name: authors authors_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.authors
ADD CONSTRAINT authors_pkey PRIMARY KEY (id);
--
-- Name: posts posts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.posts
ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/drop/Readme.md
================================================
# Example `variables`
An example of using nxs-data-anonymizer in a simple configuration with filters and variables blocks.
In order to use variables in the "filters" block, you need to describe the "variables" block:
```yaml
variables:
some_variable: # Variable name
value: "some_value" # Variable value
```
If you use a function to generate a value, then in this block it will be executed once and the resulting value will be the same for all its occurrences in the dump.
An example of a configuration:
```yaml
variables:
var1:
value: "<fixed_value_or_generation_function_of_value>"
var2:
value: "<fixed_value_or_generation_function_of_value>"
var3:
value: "<fixed_value_or_generation_function_of_value>"
filters:
table1:
columns:
table1_col1:
value: "<fixed_value_or_generation_function_of_value>"
table1_col2:
value: "{{ .Variables.var1 }}"
table1_col3:
value: "{{ .Variables.var2 }}"
table2:
columns:
table2_col1:
value: "<fixed_value_or_generation_function_of_value>"
table2_col2:
value: "{{ .Variables.var1 }}"
table2_col3:
value: "{{ .Variables.var3 }}"
```
Working examples of configurations in the `./MySQL` and `./PostgreSQL` directories.
================================================
FILE: doc/examples/filters/MySQL/input.sql
================================================
-- MySQL dump 10.13 Distrib 8.1.0, for Linux (x86_64)
--
-- Host: localhost Database: test_db
-- ------------------------------------------------------
-- Server version 8.1.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `test_tbl`
--
DROP TABLE IF EXISTS `test_tbl`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `test_tbl` (
`int_count` int NOT NULL,
`int_type` int DEFAULT NULL,
`dbl_type` double DEFAULT NULL,
`vchar_type` varchar(255) DEFAULT NULL,
`date_type` date DEFAULT NULL,
`time_type` time DEFAULT NULL,
PRIMARY KEY (`int_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `test_tbl`
--
LOCK TABLES `test_tbl` WRITE;
/*!40000 ALTER TABLE `test_tbl` DISABLE KEYS */;
INSERT INTO `test_tbl` VALUES (1,1,1.1,'aaaaaa',NULL,NULL),(2,2,2.2,'bbbbbb',NULL,NULL),(3,3,3.3,'cccccc',NULL,NULL),(4,4,4.4,'dddddd',NULL,NULL),(5,5,5.5,'eeeeee',NULL,NULL);
/*!40000 ALTER TABLE `test_tbl` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-08-18 6:52:42
================================================
FILE: doc/examples/filters/MySQL/nxs-data-anonymizer.conf
================================================
filters:
test_tbl:
columns:
int_type:
value: "1"
dbl_type:
value: "99.999"
vchar_type:
value: "anon-data"
date_type:
value: "2001-01-01"
time_type:
value: "20:20:20"
================================================
FILE: doc/examples/filters/MySQL/output.sql
================================================
-- MySQL dump 10.13 Distrib 8.1.0, for Linux (x86_64)
--
-- Host: localhost Database: test_db
-- ------------------------------------------------------
-- Server version 8.1.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `test_tbl`
--
DROP TABLE IF EXISTS `test_tbl`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `test_tbl` (
`int_count` int NOT NULL,
`int_type` int DEFAULT NULL,
`dbl_type` double DEFAULT NULL,
`vchar_type` varchar(255) DEFAULT NULL,
`date_type` date DEFAULT NULL,
`time_type` time DEFAULT NULL,
PRIMARY KEY (`int_count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `test_tbl`
--
LOCK TABLES `test_tbl` WRITE;
/*!40000 ALTER TABLE `test_tbl` DISABLE KEYS */;
INSERT INTO `test_tbl` VALUES (1,1,99.999,'anon-data','2001-01-01','20:20:20'),(2,1,99.999,'anon-data','2001-01-01','20:20:20'),(3,1,99.999,'anon-data','2001-01-01','20:20:20'),(4,1,99.999,'anon-data','2001-01-01','20:20:20'),(5,1,99.999,'anon-data','2001-01-01','20:20:20');
/*!40000 ALTER TABLE `test_tbl` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2023-08-18 6:52:42
================================================
FILE: doc/examples/filters/PostgreSQL/input
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1)
-- Dumped by pg_dump version 16.1 (Debian 16.1-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: list_types; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.list_types (
integer_type integer,
numeric_type numeric,
double_precision_type double precision,
varchar_type character varying,
text_type text,
date_type date,
time_tz_type time with time zone,
boolean_type boolean,
xml_type xml,
jsonb_type jsonb,
id bigint NOT NULL
);
ALTER TABLE public.list_types OWNER TO postgres;
--
-- Name: list_types_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.list_types_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.list_types_id_seq OWNER TO postgres;
--
-- Name: list_types_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.list_types_id_seq OWNED BY public.list_types.id;
--
-- Name: list_types id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.list_types ALTER COLUMN id SET DEFAULT nextval('public.list_types_id_seq'::regclass);
--
-- Data for Name: list_types; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.list_types (integer_type, numeric_type, double_precision_type, varchar_type, text_type, date_type, time_tz_type, boolean_type, xml_type, jsonb_type, id) FROM stdin;
\N 42.99465 \N Biba \N \N 19:51:50+00 \N \N \N 6
\N -84.46685 \N Pupa \N \N 03:34:36+00 \N \N \N 2
\N 72.52040 \N Lupa \N 15:17:37+00 t \N \N 4
\N 99.37111 \N Boba \N 03:34:36+00 \N \N \N 8
\N -90.90125 \N Cerebla \N \N 22:00:45+00 \N \N \N 10
8765542 \N 7.84023409 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel pretium lectus quam id leo in vitae. Dignissim cras tincidunt lobortis feugiat vivamus at augue. Sit amet aliquam id diam maecenas. Ornare lectus sit amet est placerat in egestas erat. Et malesuada fames ac turpis egestas maecenas pharetra convallis. Orci sagittis eu volutpat odio facilisis. Mauris in aliquam sem fringilla ut morbi tincidunt augue interdum. Nisi porta lorem mollis aliquam ut porttitor leo a diam. Amet purus gravida quis blandit turpis cursus in. Risus feugiat in ante metus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices vitae. Faucibus nisl tincidunt eget nullam. Lectus quam id leo in vitae turpis massa. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pretium lectus quam id leo in vitae turpis massa. Blandit aliquam etiam erat velit scelerisque in dictum non. Eu nisl nunc mi ipsum faucibus vitae. 1996-06-15 \N t <root>\n <west>721744494.7994413</west>\n <top>-26197703.515699387</top>\n <or>event</or>\n <art>\n <layers>among</layers>\n <growth>couple</growth>\n <off>official</off>\n <made>spring</made>\n <poem>1032613367</poem>\n </art>\n <strong>198858711</strong>\n</root> {"truck": 1563128845, "little": -1009907448.0705619, "possible": "gave"} 1
4562892 \N 5.8024375 \N Massa sapien faucibus et molestie ac. Praesent elementum facilisis leo vel. Turpis egestas pretium aenean pharetra magna. Facilisi cras fermentum odio eu feugiat pretium nibh ipsum consequat. Auctor neque vitae tempus quam pellentesque. Ornare aenean euismod elementum nisi quis eleifend. Purus sit amet luctus venenatis lectus. Tortor consequat id porta nibh venenatis cras sed felis eget. Felis bibendum ut tristique et egestas quis ipsum. Pretium fusce id velit ut tortor pretium viverra. Nam aliquam sem et tortor consequat. Nisl pretium fusce id velit. Sem integer vitae justo eget magna fermentum iaculis. Sit amet nulla facilisi morbi tempus iaculis urna id volutpat. Vitae auctor eu augue ut lectus arcu. Malesuada fames ac turpis egestas. Ac odio tempor orci dapibus ultrices in. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Et malesuada fames ac turpis egestas integer. Sodales ut eu sem integer vitae justo eget. 2031-07-14 \N f <root>\n <melted>\n <officer>-598731677.6283197</officer>\n <exist>variety</exist>\n <sitting>46234734.5525651</sitting>\n <period>rising</period>\n <rice>-1556052082.582368</rice>\n </melted>\n <got>eleven</got>\n <onlinetools>1863692621</onlinetools>\n <this>-139561185.33627748</this>\n <driver>funny</driver>\n</root> [{"ago": {"shut": "seven", "found": 469996577.0459976, "climate": "early"}, "scene": "slightly", "medicine": true}, true, true] 3
87689278 \N -0.31813426 Id donec ultrices tincidunt arcu. Id nibh tortor id aliquet lectus. Condimentum mattis pellentesque id nibh tortor id aliquet lectus proin. Cursus vitae congue mauris rhoncus. Eu ultrices vitae auctor eu augue ut lectus arcu bibendum. Sed turpis tincidunt id aliquet. Feugiat scelerisque varius morbi enim nunc faucibus a pellentesque sit. Diam donec adipiscing tristique risus nec feugiat in fermentum posuere. Scelerisque eu ultrices vitae auctor eu augue ut. Volutpat ac tincidunt vitae semper quis. 1976-12-10 \N t <root>\n <mission>rise</mission>\n <layers>\n <wire>consist</wire>\n <dinner>someone</dinner>\n <electric>white</electric>\n <heavy>victory</heavy>\n <ice>-761134241.8632131</ice>\n </layers>\n <help>1111641157</help>\n <comfortable>744054503</comfortable>\n <highway>1876042205.1417785</highway>\n</root> {"torn": [false, -1325125579, false], "rising": false, "volume": "grow"} 9
687527896 \N -1.81914025 Facilisi etiam dignissim diam quis enim. Diam ut venenatis tellus in metus vulputate eu. Mattis rhoncus urna neque viverra justo nec ultrices. Sagittis nisl rhoncus mattis rhoncus urna neque viverra. Nec ullamcorper sit amet risus nullam eget felis eget. Fames ac turpis egestas maecenas pharetra convallis posuere. Eget arcu dictum varius duis at consectetur lorem. Porta lorem mollis aliquam ut porttitor leo a diam sollicitudin. Magna fermentum iaculis eu non diam phasellus vestibulum lorem sed. Etiam non quam lacus suspendisse. Parturient montes nascetur ridiculus mus. Ornare suspendisse sed nisi lacus sed viverra tellus in. Interdum velit euismod in pellentesque massa placerat duis ultricies lacus. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. 2051-05-16 \N t <root>\n <piece>\n <vertical>398209907.5902777</vertical>\n <prove>wind</prove>\n <fair>parallel</fair>\n <closely>paint</closely>\n <see>-1386172501</see>\n </piece>\n <hide>previous</hide>\n <among>skill</among>\n <our>conversation</our>\n <cell>keep</cell>\n</root> [[-128477882.56726694, 1569798072.8967233, {"us": 438307927.6373253, "think": -870063635, "product": "stuck"}], [{"name": "broad", "took": "brother", "alphabet": -731303259}, [-1065068182.0998564, "finish", "up"], false], false] 5
8767542 \N 5.08081291 \N Fames ac turpis egestas maecenas. Volutpat lacus laoreet non curabitur gravida arcu ac tortor. Sit amet commodo nulla facilisi nullam vehicula. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Maecenas ultricies mi eget mauris pharetra. Sed faucibus turpis in eu mi bibendum. Massa ultricies mi quis hendrerit dolor magna. Non diam phasellus vestibulum lorem sed. Vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa. Massa ultricies mi quis hendrerit dolor magna eget est lorem. Quam elementum pulvinar etiam non quam lacus suspendisse faucibus. 2058-03-29 \N f <root>\n <invented>concerned</invented>\n <feet>-1671936329.7007055</feet>\n <win>slept</win>\n <until>how</until>\n <lion>-1838021068</lion>\n</root> {"basis": "mine", "company": {"tired": false, "prevent": false, "suppose": 735075799}, "worried": {"iron": 378563223.91183805, "nest": false, "raise": {"date": false, "engineer": true, "television": 136840736.65782642}}} 7
\.
--
-- Name: list_types_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.list_types_id_seq', 10, true);
--
-- Name: list_types list_types_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.list_types
ADD CONSTRAINT list_types_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/filters/PostgreSQL/nxs-data-anonymizer.conf
================================================
filters:
public.list_types:
columns:
integer_type:
value: "{{ if (isNull .Values.integer_type) }}{{ 0 }}{{ else }}{{ 123 }}{{ end }}"
numeric_type:
value: "{{ if (isNull .Values.numeric_type) }}{{ 0 }}{{ else }}{{ 1.23 }}{{ end }}"
double_precision_type:
value: "{{ if (isNull .Values.double_precision_type) }}{{ 10 }}{{ else }}{{ 321 }}{{ end }}"
varchar_type:
value: "anon_text"
text_type:
value: "random text"
date_type:
value: "01-01-2000"
time_tz_type:
value: "20:20:20"
boolean_type:
value: "{{ if (isNull .Values.boolean_type) }}{{ false }}{{ else }}{{ true }}{{ end }}"
xml_type:
value: "random_xml"
jsonb_type:
value: "null"
varchar_mass_type:
value: "{esd,lfg,dil}"
integer_mass_type:
value: "{{`{{4,5,6},{4,5,6}}`}}"
double_mass_type:
value: "{{`{{{0.1,0.2,0.3},{0.1,0.2,0.3}},{{0.1,0.2,0.3},{0.1,0.2,0.3}}}`}}"
================================================
FILE: doc/examples/filters/PostgreSQL/output
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1)
-- Dumped by pg_dump version 16.1 (Debian 16.1-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: list_types; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.list_types (
integer_type integer,
numeric_type numeric,
double_precision_type double precision,
varchar_type character varying,
text_type text,
date_type date,
time_tz_type time with time zone,
boolean_type boolean,
xml_type xml,
jsonb_type jsonb,
id bigint NOT NULL
);
ALTER TABLE public.list_types OWNER TO postgres;
--
-- Name: list_types_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--
CREATE SEQUENCE public.list_types_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE public.list_types_id_seq OWNER TO postgres;
--
-- Name: list_types_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres
--
ALTER SEQUENCE public.list_types_id_seq OWNED BY public.list_types.id;
--
-- Name: list_types id; Type: DEFAULT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.list_types ALTER COLUMN id SET DEFAULT nextval('public.list_types_id_seq'::regclass);
--
-- Data for Name: list_types; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.list_types (integer_type, numeric_type, double_precision_type, varchar_type, text_type, date_type, time_tz_type, boolean_type, xml_type, jsonb_type, id) FROM stdin;
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 6
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 2
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 4
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 8
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 10
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 1
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 3
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 9
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 5
123 1.23 321 anon_text random text 01-01-2000 20:20:20 true random_xml null 7
\.
--
-- Name: list_types_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--
SELECT pg_catalog.setval('public.list_types_id_seq', 10, true);
--
-- Name: list_types list_types_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.list_types
ADD CONSTRAINT list_types_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/filters/Readme.md
================================================
# Example `filters`
An example of using nxs-data-anonymizer in a simple configuration with one filters block.
All that needs to be specified in the configuration file is a list of tables to be processed with a list of replacement rules for the columns that need to be changed.
An example of a configuration:
```yaml
filters:
table1: # Table name to process.
columns:
table1_col1: # Column name to process.
value: "{{ - value_generation_function - }}" # Value for substitution.
unique: true # The unique values flag, default "false", is used only with the value generation function.
table1_col2:
value: "<fixed_value_or_generation_function_of_value>"
table1_col3:
value: "<fixed_value_or_generation_function_of_value>"
table2:
columns:
table2_col1:
value: "{{ - value_generation_function - }}"
unique: true
table2_col2:
value: "<fixed_value_or_generation_function_of_value>"
table2_col3:
value: "<fixed_value_or_generation_function_of_value>"
```
Working examples of configurations in the `./MySQL` and `./PostgreSQL` directories.
================================================
FILE: doc/examples/links/MySQL/input.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (1,'Wilford','Wintheiser','brett35@example.com','1981-10-14','1988-09-10 18:37:25'),(2,'Nyasia','Doyle','aracely46@example.com','2007-07-01','1980-10-28 23:57:00'),(3,'Ken','Haag','carroll.harris@example.com','2003-04-16','1997-03-14 18:41:06'),(4,'Leonor','Mann','johns.janick@example.org','1996-05-18','2010-04-12 00:38:42'),(5,'Eloisa','Ratke','lakin.ramiro@example.net','1982-07-22','1996-03-25 09:07:39'),(6,'Nikolas','Dibbert','judson33@example.com','1970-02-22','1979-03-16 10:10:12'),(7,'Kelley','Koch','kaci.koch@example.net','2013-05-01','2020-08-02 02:01:34'),(8,'Glen','Howe','jprosacco@example.net','1971-08-03','1971-01-02 14:19:52'),(9,'Geovanni','Medhurst','kutch.kylie@example.com','2011-04-20','2004-06-10 12:33:11'),(10,'Zella','Davis','hane.terrill@example.org','1991-11-07','2007-09-19 13:48:20');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (1,1,'Pariatur est in ut provident vero eligendi.','Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum.','Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea.','1975-07-07'),(2,2,'Unde est architecto est.','Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel.','Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem.','1976-05-25'),(3,3,'Dignissimos perspiciatis nobis quisquam saepe ad aut numquam.','Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum.','Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum.','1991-12-21'),(4,4,'Voluptas sint modi magnam.','Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem.','Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam.','2002-01-23'),(5,5,'Sapiente rem eos enim ullam ipsum ut.','Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam.','Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia.','2017-11-19'),(6,6,'Error quas doloremque est sunt quae.','Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis.','Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id.','1974-03-23'),(7,7,'Quo impedit quos molestiae dolorum in soluta dolores non.','Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut.','Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis.','2004-12-08'),(8,8,'Nulla quia repellendus et autem vitae provident.','Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae.','Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque.','1999-02-28'),(9,9,'Similique at quia quia ut recusandae repudiandae delectus.','Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem.','Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis.','2007-08-07'),(10,10,'Est vel aperiam ipsa quod doloremque et est et.','Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem.','Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia.','2009-07-18'),(11,1,'Sint est qui dolorem eum accusantium repudiandae.','Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa.','Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum.','2010-04-16'),(12,2,'Culpa debitis ut non sapiente voluptatem.','Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus.','Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit.','1988-12-26'),(13,3,'Ut ut rerum qui quis sed sunt.','Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni.','Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis.','2001-06-01'),(14,4,'Error inventore delectus sapiente non.','Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores.','Voluptatum id amet qui quia. Nemo nulla atque dignissimos.','1974-12-07'),(15,5,'Ut aut quo aut ea occaecati est voluptas.','Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus.','Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim.','1999-09-12'),(16,6,'Nihil ea qui sequi odit rem.','Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi.','Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut.','2003-07-28'),(17,7,'Quia accusantium deserunt suscipit.','Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi.','Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis.','2015-05-24'),(18,8,'Inventore et eaque temporibus qui aut exercitationem necessitatibus.','Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt.','Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam.','1996-02-06'),(19,9,'Et soluta consequatur porro rem corrupti.','Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et.','Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur.','2018-03-31'),(20,10,'Culpa error rerum voluptatem recusandae quae tempora.','Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia.','Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos.','2007-01-22'),(21,1,'Harum laudantium fugiat debitis atque sed.','Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae.','Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia.','1987-06-29'),(22,2,'Non architecto ut voluptas aut voluptas dolor ut.','Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel.','Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque.','1993-05-06'),(23,3,'Dolores sed hic vitae ut qui.','Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae.','Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur.','1978-09-08'),(24,4,'Deleniti distinctio eos eveniet.','Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni.','Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae.','2003-06-23'),(25,5,'Ea et asperiores odio vel sunt exercitationem.','Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est.','Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio.','1972-09-16'),(26,6,'Accusamus est sed aut minus.','Et libero in in est consequuntur. Illum distinctio doloremque quas.','Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor.','2017-03-08'),(27,7,'Et sed reprehenderit nobis sed.','Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum.','Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est.','1973-08-04'),(28,8,'Autem ullam aperiam totam assumenda quod esse.','Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea.','Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae.','2014-04-26'),(29,9,'Ad dolores amet ea nisi aut enim voluptatem.','Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla.','Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in.','2006-09-07'),(30,10,'Eos fuga at ex sapiente quasi.','Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque.','Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et.','2009-07-23');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/links/MySQL/nxs-data-anonymizer.conf
================================================
link:
- rule:
value: "{{ randInt 1 50 }}"
unique: true
with:
authors:
- id
posts:
- author_id
filters:
authors:
columns:
first_name:
value: "{{- randAlphaNum 20 -}}"
last_name:
value: "{{- randAlphaNum 20 -}}"
birthdate:
value: "1999-12-31"
added:
value: "2000-01-01 12:00:00"
posts:
columns:
id:
value: "{{ randInt 1 100 }}"
unique: true
================================================
FILE: doc/examples/links/MySQL/output.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (26,'lwjNB8ofmQjcmzIKx23U','pBfm9pHABWxqgVMNk1pY','brett35@example.com','1999-12-31','2000-01-01 12:00:00'),(48,'xtc5AqJUOuAGGBir1Gvn','zdi0Y2ntYLIdTMGBhsRd','aracely46@example.com','1999-12-31','2000-01-01 12:00:00'),(9,'719GkwVKuXEKjAAohgrk','jU68LcKRCwZ3yFAOsQws','carroll.harris@example.com','1999-12-31','2000-01-01 12:00:00'),(15,'Bcync5tDYRvDOad9ulHY','70FuTHdJ2diuXKn5FLUl','johns.janick@example.org','1999-12-31','2000-01-01 12:00:00'),(49,'JsRPcdhoD7eUSG2yqaln','LR33Yhxv4bs2LdcvhTvg','lakin.ramiro@example.net','1999-12-31','2000-01-01 12:00:00'),(10,'jckw1fZr214qyZk2N5qd','Dx1dlwV6M9bownRFj8jv','judson33@example.com','1999-12-31','2000-01-01 12:00:00'),(46,'LynAXGoDTGMsFWxjggUr','mW9QmnaWOWeG0uTR3y4v','kaci.koch@example.net','1999-12-31','2000-01-01 12:00:00'),(8,'ZhCmwfvwrOmSTKN9vXrw','MuUlp8h02AyIQapcTNid','jprosacco@example.net','1999-12-31','2000-01-01 12:00:00'),(18,'04b4LKxXcOioU5JkO6Iy','SBoyCTw1RCtx0rMp6qJ7','kutch.kylie@example.com','1999-12-31','2000-01-01 12:00:00'),(42,'21L1p5ixBhOvI3P3iF5F','xsRxqdLYqLIGpdpNYrNA','hane.terrill@example.org','1999-12-31','2000-01-01 12:00:00');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (89,26,'Pariatur est in ut provident vero eligendi.','Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum.','Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea.','1975-07-07'),(5,48,'Unde est architecto est.','Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel.','Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem.','1976-05-25'),(56,9,'Dignissimos perspiciatis nobis quisquam saepe ad aut numquam.','Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum.','Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum.','1991-12-21'),(46,15,'Voluptas sint modi magnam.','Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem.','Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam.','2002-01-23'),(76,49,'Sapiente rem eos enim ullam ipsum ut.','Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam.','Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia.','2017-11-19'),(99,10,'Error quas doloremque est sunt quae.','Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis.','Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id.','1974-03-23'),(13,46,'Quo impedit quos molestiae dolorum in soluta dolores non.','Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut.','Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis.','2004-12-08'),(42,8,'Nulla quia repellendus et autem vitae provident.','Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae.','Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque.','1999-02-28'),(61,18,'Similique at quia quia ut recusandae repudiandae delectus.','Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem.','Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis.','2007-08-07'),(11,42,'Est vel aperiam ipsa quod doloremque et est et.','Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem.','Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia.','2009-07-18'),(87,26,'Sint est qui dolorem eum accusantium repudiandae.','Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa.','Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum.','2010-04-16'),(4,48,'Culpa debitis ut non sapiente voluptatem.','Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus.','Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit.','1988-12-26'),(95,9,'Ut ut rerum qui quis sed sunt.','Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni.','Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis.','2001-06-01'),(52,15,'Error inventore delectus sapiente non.','Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores.','Voluptatum id amet qui quia. Nemo nulla atque dignissimos.','1974-12-07'),(49,49,'Ut aut quo aut ea occaecati est voluptas.','Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus.','Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim.','1999-09-12'),(82,10,'Nihil ea qui sequi odit rem.','Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi.','Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut.','2003-07-28'),(40,46,'Quia accusantium deserunt suscipit.','Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi.','Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis.','2015-05-24'),(28,8,'Inventore et eaque temporibus qui aut exercitationem necessitatibus.','Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt.','Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam.','1996-02-06'),(90,18,'Et soluta consequatur porro rem corrupti.','Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et.','Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur.','2018-03-31'),(36,42,'Culpa error rerum voluptatem recusandae quae tempora.','Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia.','Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos.','2007-01-22'),(9,26,'Harum laudantium fugiat debitis atque sed.','Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae.','Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia.','1987-06-29'),(77,48,'Non architecto ut voluptas aut voluptas dolor ut.','Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel.','Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque.','1993-05-06'),(18,9,'Dolores sed hic vitae ut qui.','Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae.','Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur.','1978-09-08'),(29,15,'Deleniti distinctio eos eveniet.','Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni.','Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae.','2003-06-23'),(80,49,'Ea et asperiores odio vel sunt exercitationem.','Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est.','Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio.','1972-09-16'),(69,10,'Accusamus est sed aut minus.','Et libero in in est consequuntur. Illum distinctio doloremque quas.','Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor.','2017-03-08'),(98,46,'Et sed reprehenderit nobis sed.','Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum.','Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est.','1973-08-04'),(27,8,'Autem ullam aperiam totam assumenda quod esse.','Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea.','Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae.','2014-04-26'),(64,18,'Ad dolores amet ea nisi aut enim voluptatem.','Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla.','Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in.','2006-09-07'),(32,42,'Eos fuga at ex sapiente quasi.','Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque.','Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et.','2009-07-23');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/links/PostgreSQL/input
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)
-- Dumped by pg_dump version 16.3 (Debian 16.3-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: authors; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.authors (
id integer NOT NULL,
first_name character varying(50) NOT NULL,
last_name character varying(50) NOT NULL,
email character varying(100) NOT NULL,
birthdate date NOT NULL,
added timestamp without time zone NOT NULL
);
ALTER TABLE public.authors OWNER TO postgres;
--
-- Name: posts; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.posts (
id integer NOT NULL,
author_id integer NOT NULL,
title character varying(255) NOT NULL,
description character varying(500) NOT NULL,
content text NOT NULL,
date date NOT NULL
);
ALTER TABLE public.posts OWNER TO postgres;
--
-- Data for Name: authors; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.authors (id, first_name, last_name, email, birthdate, added) FROM stdin;
1 Wilford Wintheiser brett35@example.com 1981-10-14 1988-09-10 18:37:25
2 Nyasia Doyle aracely46@example.com 2007-07-01 1980-10-28 23:57:00
3 Ken Haag carroll.harris@example.com 2003-04-16 1997-03-14 18:41:06
4 Leonor Mann johns.janick@example.org 1996-05-18 2010-04-12 00:38:42
5 Eloisa Ratke lakin.ramiro@example.net 1982-07-22 1996-03-25 09:07:39
6 Nikolas Dibbert judson33@example.com 1970-02-22 1979-03-16 10:10:12
7 Kelley Koch kaci.koch@example.net 2013-05-01 2020-08-02 02:01:34
8 Glen Howe jprosacco@example.net 1971-08-03 1971-01-02 14:19:52
9 Geovanni Medhurst kutch.kylie@example.com 2011-04-20 2004-06-10 12:33:11
10 Zella Davis hane.terrill@example.org 1991-11-07 2007-09-19 13:48:20
\.
--
-- Data for Name: posts; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.posts (id, author_id, title, description, content, date) FROM stdin;
1 1 Pariatur est in ut provident vero eligendi. Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum. Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea. 1975-07-07
2 2 Unde est architecto est. Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel. Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem. 1976-05-25
3 3 Dignissimos perspiciatis nobis quisquam saepe ad aut numquam. Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum. Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum. 1991-12-21
4 4 Voluptas sint modi magnam. Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem. Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam. 2002-01-23
5 5 Sapiente rem eos enim ullam ipsum ut. Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam. Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia. 2017-11-19
6 6 Error quas doloremque est sunt quae. Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis. Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id. 1974-03-23
7 7 Quo impedit quos molestiae dolorum in soluta dolores non. Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut. Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis. 2004-12-08
8 8 Nulla quia repellendus et autem vitae provident. Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae. Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque. 1999-02-28
9 9 Similique at quia quia ut recusandae repudiandae delectus. Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem. Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis. 2007-08-07
10 10 Est vel aperiam ipsa quod doloremque et est et. Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem. Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia. 2009-07-18
11 1 Sint est qui dolorem eum accusantium repudiandae. Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa. Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum. 2010-04-16
12 2 Culpa debitis ut non sapiente voluptatem. Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus. Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit. 1988-12-26
13 3 Ut ut rerum qui quis sed sunt. Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni. Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis. 2001-06-01
14 4 Error inventore delectus sapiente non. Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores. Voluptatum id amet qui quia. Nemo nulla atque dignissimos. 1974-12-07
15 5 Ut aut quo aut ea occaecati est voluptas. Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus. Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim. 1999-09-12
16 6 Nihil ea qui sequi odit rem. Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi. Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut. 2003-07-28
17 7 Quia accusantium deserunt suscipit. Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi. Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis. 2015-05-24
18 8 Inventore et eaque temporibus qui aut exercitationem necessitatibus. Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt. Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam. 1996-02-06
19 9 Et soluta consequatur porro rem corrupti. Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et. Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur. 2018-03-31
20 10 Culpa error rerum voluptatem recusandae quae tempora. Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia. Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos. 2007-01-22
21 1 Harum laudantium fugiat debitis atque sed. Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae. Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia. 1987-06-29
22 2 Non architecto ut voluptas aut voluptas dolor ut. Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel. Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque. 1993-05-06
23 3 Dolores sed hic vitae ut qui. Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae. Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur. 1978-09-08
24 4 Deleniti distinctio eos eveniet. Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni. Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae. 2003-06-23
25 5 Ea et asperiores odio vel sunt exercitationem. Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est. Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio. 1972-09-16
26 6 Accusamus est sed aut minus. Et libero in in est consequuntur. Illum distinctio doloremque quas. Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor. 2017-03-08
27 7 Et sed reprehenderit nobis sed. Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum. Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est. 1973-08-04
28 8 Autem ullam aperiam totam assumenda quod esse. Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea. Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae. 2014-04-26
29 9 Ad dolores amet ea nisi aut enim voluptatem. Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla. Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in. 2006-09-07
30 10 Eos fuga at ex sapiente quasi. Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque. Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et. 2009-07-23
\.
--
-- Name: authors authors_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.authors
ADD CONSTRAINT authors_pkey PRIMARY KEY (id);
--
-- Name: posts posts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.posts
ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/links/PostgreSQL/nxs-data-anonymizer.conf
================================================
link:
- rule:
value: "{{ randInt 1 50 }}"
unique: true
with:
public.authors:
- id
public.posts:
- author_id
filters:
public.authors:
columns:
first_name:
value: "{{- randAlphaNum 20 -}}"
last_name:
value: "{{- randAlphaNum 20 -}}"
birthdate:
value: "1999-12-31"
added:
value: "2000-01-01 12:00:00"
public.posts:
columns:
id:
value: "{{ randInt 1 100 }}"
unique: true
================================================
FILE: doc/examples/links/PostgreSQL/output
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)
-- Dumped by pg_dump version 16.3 (Debian 16.3-1.pgdg120+1)
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- Name: authors; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.authors (
id integer NOT NULL,
first_name character varying(50) NOT NULL,
last_name character varying(50) NOT NULL,
email character varying(100) NOT NULL,
birthdate date NOT NULL,
added timestamp without time zone NOT NULL
);
ALTER TABLE public.authors OWNER TO postgres;
--
-- Name: posts; Type: TABLE; Schema: public; Owner: postgres
--
CREATE TABLE public.posts (
id integer NOT NULL,
author_id integer NOT NULL,
title character varying(255) NOT NULL,
description character varying(500) NOT NULL,
content text NOT NULL,
date date NOT NULL
);
ALTER TABLE public.posts OWNER TO postgres;
--
-- Data for Name: authors; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.authors (id, first_name, last_name, email, birthdate, added) FROM stdin;
23 35sXOxBxUPRVA0NnIIZq 6eurfFlAsmrwlshZ9lBO brett35@example.com 1999-12-31 2000-01-01 12:00:00
19 5nBuYvwvvwHmCMPA80ui NhCGMK31icSCJjXJjfCj aracely46@example.com 1999-12-31 2000-01-01 12:00:00
10 f6R0k3DQr9GWGSqjhQZZ ep3asHE3WfCICDoeHiuw carroll.harris@example.com 1999-12-31 2000-01-01 12:00:00
36 6nenSS75QXj0FjujvehB iNGLlJWPeEzewRAmVq06 johns.janick@example.org 1999-12-31 2000-01-01 12:00:00
17 GJsk4D80CbJGJREN1Vub HLzLFc3lmD3jCWh9h0QV lakin.ramiro@example.net 1999-12-31 2000-01-01 12:00:00
42 1FkGPmdU0PLYg9S33ZsB U6kT2W9bYV1An8MWTux6 judson33@example.com 1999-12-31 2000-01-01 12:00:00
39 OEzarFYC58fr4RQGQ7mm csA3jA009Q1wH6AJaq4q kaci.koch@example.net 1999-12-31 2000-01-01 12:00:00
37 UaNlog7FzeYvEufa4LEb CPr3R2HG3SvH5FCHUeht jprosacco@example.net 1999-12-31 2000-01-01 12:00:00
9 6VJrbHj1s3O87C6rcjGj ATUdQe47dfexdIq6YjVs kutch.kylie@example.com 1999-12-31 2000-01-01 12:00:00
35 vdu1dbX34myf6S2wAYhG 292VinyFnt8MTThIYwk4 hane.terrill@example.org 1999-12-31 2000-01-01 12:00:00
\.
--
-- Data for Name: posts; Type: TABLE DATA; Schema: public; Owner: postgres
--
COPY public.posts (id, author_id, title, description, content, date) FROM stdin;
52 23 Pariatur est in ut provident vero eligendi. Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum. Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea. 1975-07-07
88 19 Unde est architecto est. Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel. Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem. 1976-05-25
96 10 Dignissimos perspiciatis nobis quisquam saepe ad aut numquam. Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum. Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum. 1991-12-21
71 36 Voluptas sint modi magnam. Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem. Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam. 2002-01-23
25 17 Sapiente rem eos enim ullam ipsum ut. Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam. Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia. 2017-11-19
43 42 Error quas doloremque est sunt quae. Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis. Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id. 1974-03-23
11 39 Quo impedit quos molestiae dolorum in soluta dolores non. Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut. Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis. 2004-12-08
4 37 Nulla quia repellendus et autem vitae provident. Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae. Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque. 1999-02-28
85 9 Similique at quia quia ut recusandae repudiandae delectus. Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem. Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis. 2007-08-07
15 35 Est vel aperiam ipsa quod doloremque et est et. Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem. Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia. 2009-07-18
22 23 Sint est qui dolorem eum accusantium repudiandae. Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa. Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum. 2010-04-16
17 19 Culpa debitis ut non sapiente voluptatem. Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus. Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit. 1988-12-26
61 10 Ut ut rerum qui quis sed sunt. Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni. Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis. 2001-06-01
5 36 Error inventore delectus sapiente non. Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores. Voluptatum id amet qui quia. Nemo nulla atque dignissimos. 1974-12-07
24 17 Ut aut quo aut ea occaecati est voluptas. Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus. Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim. 1999-09-12
68 42 Nihil ea qui sequi odit rem. Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi. Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut. 2003-07-28
82 39 Quia accusantium deserunt suscipit. Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi. Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis. 2015-05-24
65 37 Inventore et eaque temporibus qui aut exercitationem necessitatibus. Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt. Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam. 1996-02-06
70 9 Et soluta consequatur porro rem corrupti. Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et. Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur. 2018-03-31
10 35 Culpa error rerum voluptatem recusandae quae tempora. Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia. Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos. 2007-01-22
51 23 Harum laudantium fugiat debitis atque sed. Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae. Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia. 1987-06-29
57 19 Non architecto ut voluptas aut voluptas dolor ut. Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel. Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque. 1993-05-06
31 10 Dolores sed hic vitae ut qui. Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae. Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur. 1978-09-08
72 36 Deleniti distinctio eos eveniet. Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni. Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae. 2003-06-23
54 17 Ea et asperiores odio vel sunt exercitationem. Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est. Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio. 1972-09-16
75 42 Accusamus est sed aut minus. Et libero in in est consequuntur. Illum distinctio doloremque quas. Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor. 2017-03-08
39 39 Et sed reprehenderit nobis sed. Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum. Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est. 1973-08-04
47 37 Autem ullam aperiam totam assumenda quod esse. Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea. Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae. 2014-04-26
66 9 Ad dolores amet ea nisi aut enim voluptatem. Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla. Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in. 2006-09-07
32 35 Eos fuga at ex sapiente quasi. Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque. Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et. 2009-07-23
\.
--
-- Name: authors authors_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.authors
ADD CONSTRAINT authors_pkey PRIMARY KEY (id);
--
-- Name: posts posts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--
ALTER TABLE ONLY public.posts
ADD CONSTRAINT posts_pkey PRIMARY KEY (id);
--
-- PostgreSQL database dump complete
--
================================================
FILE: doc/examples/links/Readme.md
================================================
# Example `variables`
An example of using nxs-data-anonymizer in a simple configuration with filters and link blocks.
Configuration block description:
```yaml
link:
- rule: # Description of the value generation rule.
value: "some_value_generator" # Some function for generating values with given parameters.
unique: true # Flag of uniqueness of the value.
with: # Description of tables with fields for which value coherence must be maintained.
some_table1:
- id
some_table2:
- id_from_table1
```
An example of a configuration:
```yaml
link:
- rule:
value: "<generation_function_of_value>"
unique: true
with:
table1:
- col1_linked
table2:
- col2_linked
filters:
table1:
columns:
col2:
value: "<fixed_value_or_generation_function_of_value>"
col3:
value: "<fixed_value_or_generation_function_of_value>"
table2:
columns:
col1:
value: "<fixed_value_or_generation_function_of_value>"
col3:
value: "<fixed_value_or_generation_function_of_value>"
```
Working examples of configurations in the `./MySQL` and `./PostgreSQL` directories.
================================================
FILE: doc/examples/security/MySQL/input.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (1,'Wilford','Wintheiser','brett35@example.com','1981-10-14','1988-09-10 18:37:25'),(2,'Nyasia','Doyle','aracely46@example.com','2007-07-01','1980-10-28 23:57:00'),(3,'Ken','Haag','carroll.harris@example.com','2003-04-16','1997-03-14 18:41:06'),(4,'Leonor','Mann','johns.janick@example.org','1996-05-18','2010-04-12 00:38:42'),(5,'Eloisa','Ratke','lakin.ramiro@example.net','1982-07-22','1996-03-25 09:07:39'),(6,'Nikolas','Dibbert','judson33@example.com','1970-02-22','1979-03-16 10:10:12'),(7,'Kelley','Koch','kaci.koch@example.net','2013-05-01','2020-08-02 02:01:34'),(8,'Glen','Howe','jprosacco@example.net','1971-08-03','1971-01-02 14:19:52'),(9,'Geovanni','Medhurst','kutch.kylie@example.com','2011-04-20','2004-06-10 12:33:11'),(10,'Zella','Davis','hane.terrill@example.org','1991-11-07','2007-09-19 13:48:20');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (1,1,'Pariatur est in ut provident vero eligendi.','Consequatur quae odio in animi. Quis dolorem aut corporis sed ratione animi et. Iure sunt qui eligendi laudantium harum maxime id id. Quia eos beatae temporibus eos rerum ipsum.','Velit voluptatibus quo est dolorem quos sed et. Illum similique atque et qui. Perspiciatis magnam saepe quis. Consequatur aut dolorem ea.','1975-07-07'),(2,2,'Unde est architecto est.','Consectetur quidem aut eligendi quas. Voluptas aut voluptas ratione reiciendis magnam sint. Ratione et omnis assumenda deserunt voluptatem perspiciatis. Non voluptates quia distinctio nam consectetur vel.','Sed sint at consectetur. Fugiat fugiat omnis debitis dolore. Incidunt vero incidunt enim reiciendis. Odio et illo facilis quo sit quia consequatur voluptatem.','1976-05-25'),(3,3,'Dignissimos perspiciatis nobis quisquam saepe ad aut numquam.','Voluptatibus eum voluptas eveniet veniam ducimus. Modi id vitae est accusamus. Quaerat perferendis voluptas minima dignissimos et. Sapiente explicabo voluptas commodi voluptatem autem totam. Adipisci quos quos quo ea aliquid rerum.','Repellat minus enim occaecati sunt quas. Ab ipsa voluptatibus sunt eos omnis quisquam at voluptatibus. Quo vitae doloremque nesciunt doloremque. Temporibus rerum sunt iste dolores rerum.','1991-12-21'),(4,4,'Voluptas sint modi magnam.','Facere harum pariatur quo eveniet dolor molestias. Quo debitis corporis quasi minima et optio. Ut maiores nihil rerum autem culpa et voluptates. Amet totam rem optio in. Provident ea repudiandae quisquam unde occaecati autem.','Sed quia assumenda quis rerum praesentium harum. Quia minima quo natus. Impedit temporibus perspiciatis et enim doloremque nihil et. Perspiciatis nam occaecati illo dicta asperiores eos nam.','2002-01-23'),(5,5,'Sapiente rem eos enim ullam ipsum ut.','Officia quos voluptas autem consequuntur. Quis consequatur aut vel dolor. Sapiente voluptatem quibusdam dolor nobis earum laboriosam quisquam.','Quibusdam vel tempora explicabo qui. Sunt animi a unde veritatis perferendis similique nostrum vel. Porro ab ad cumque dolorum provident distinctio est ipsum. Esse maxime ea quia.','2017-11-19'),(6,6,'Error quas doloremque est sunt quae.','Corporis quis in sint. Eos vitae aut provident distinctio ullam. Corporis mollitia quam natus qui sapiente officiis.','Ipsam animi aperiam ipsa fuga. Sunt blanditiis possimus aut quod. Doloremque possimus occaecati numquam omnis dolor. Qui nihil qui atque vitae sapiente illo id.','1974-03-23'),(7,7,'Quo impedit quos molestiae dolorum in soluta dolores non.','Harum quasi dolorum et harum iste eveniet et. Cumque ab recusandae architecto est ipsam est. Eligendi et earum ea alias odio sed ut.','Illo earum porro corporis sunt aut. Vel quisquam ut voluptas reiciendis maiores cumque. Qui hic maiores voluptas sapiente reprehenderit. Eos non autem quis maiores perferendis.','2004-12-08'),(8,8,'Nulla quia repellendus et autem vitae provident.','Facere deserunt suscipit quia et et totam vel at. Cumque suscipit est ea quis in quos. Harum dolorum consequuntur illum voluptatem iste enim recusandae.','Excepturi hic tenetur sint nostrum. Nihil itaque repudiandae qui hic minima quis ut. Dolor et aut quaerat exercitationem minima ut. Blanditiis minus et qui dolor ut atque.','1999-02-28'),(9,9,'Similique at quia quia ut recusandae repudiandae delectus.','Et necessitatibus aut accusantium quisquam harum est. Non quam id impedit deleniti. Eaque non architecto facere dolorem nesciunt perferendis. Delectus nihil ut dignissimos. Voluptate rerum reprehenderit aut voluptatem quibusdam quidem.','Tempore iusto minus omnis tempore. Hic aut sequi temporibus consequatur. In vel enim eos nihil sed eos debitis.','2007-08-07'),(10,10,'Est vel aperiam ipsa quod doloremque et est et.','Facere ut et similique voluptates voluptas blanditiis explicabo. Eaque molestiae nihil sed et repellat voluptatem eum autem.','Rem laudantium in aut assumenda. Aspernatur id illo pariatur aut deleniti rem et. Nisi velit neque qui quia.','2009-07-18'),(11,1,'Sint est qui dolorem eum accusantium repudiandae.','Quia tenetur culpa maiores molestias. Id numquam illum earum quos sint ad dolore corrupti. Consequatur quasi itaque est odit qui quod culpa.','Omnis tenetur occaecati accusamus quis corrupti et ipsam. Ullam nobis tempore officia nesciunt iste. Nesciunt vel in eos. Dolor voluptates quod sed quibusdam ut. Fuga quia eum quidem cum.','2010-04-16'),(12,2,'Culpa debitis ut non sapiente voluptatem.','Commodi fugit ullam quaerat quam quo minus. Harum quam ipsam ducimus sit expedita sit. Eos natus quo quibusdam quam repudiandae. Assumenda et sint sit quia qui necessitatibus.','Eum molestiae cupiditate ut minus. Eaque eos eos ipsam voluptatem. Sint aut aliquid modi id dolores consequatur. Aut nemo blanditiis nisi ea nam velit.','1988-12-26'),(13,3,'Ut ut rerum qui quis sed sunt.','Tenetur enim et nisi ex et consequatur omnis nisi. Eos deleniti aut amet illo sed quibusdam. Consequuntur sint quia quia aut magni.','Aut eveniet natus ut. Nostrum aliquid qui nam hic iusto id occaecati qui. Est dolor accusamus qui saepe voluptatem dolorem omnis.','2001-06-01'),(14,4,'Error inventore delectus sapiente non.','Aliquam ut aliquid et laboriosam distinctio ab. Tempore molestiae aut ea nesciunt culpa. Eum maiores molestiae voluptatem animi aliquam. Aspernatur aut soluta totam occaecati in nam ratione asperiores.','Voluptatum id amet qui quia. Nemo nulla atque dignissimos.','1974-12-07'),(15,5,'Ut aut quo aut ea occaecati est voluptas.','Non deleniti molestias velit ut eos veritatis. Et id eaque numquam ipsa iure ut. Molestiae et minus natus.','Necessitatibus asperiores adipisci eaque. Alias sunt illum fugit ab labore laborum est odio. Aspernatur esse qui ut omnis autem. Laudantium quos corporis numquam sapiente enim.','1999-09-12'),(16,6,'Nihil ea qui sequi odit rem.','Omnis ea accusantium qui commodi et ducimus. Magni deserunt sed quo velit. Hic cum tenetur facilis. Non eum quis molestias sunt. Illo saepe architecto doloremque illum sequi.','Nihil iste illum vitae ipsa et et. Reiciendis sint illum quo dignissimos veritatis. Velit eum architecto enim ratione aut.','2003-07-28'),(17,7,'Quia accusantium deserunt suscipit.','Repellat et molestiae magnam quaerat et iure. Enim enim cum quisquam quasi.','Maiores officiis beatae hic hic dolor non officiis. Nulla beatae at aut fugit doloribus et provident. Debitis non dolores iusto impedit. Alias blanditiis velit voluptate et debitis.','2015-05-24'),(18,8,'Inventore et eaque temporibus qui aut exercitationem necessitatibus.','Omnis molestias nemo culpa est dicta dolorem porro. Illum est ut ut molestias similique sit sunt. Consequatur asperiores quaerat voluptate incidunt.','Unde quibusdam asperiores voluptates quaerat et aliquam. Libero at est quibusdam eos aut. Aut voluptatem tempora a nam.','1996-02-06'),(19,9,'Et soluta consequatur porro rem corrupti.','Ullam doloremque explicabo ea ab quam ipsum. Et qui iure vero tempore voluptate aut. Ullam id ab accusamus optio voluptas. Quia quaerat quibusdam aut accusantium impedit et.','Perspiciatis sed dolores aut. Animi sed totam exercitationem fugiat dolores. Ipsa dolorem quia non aliquam. Rerum exercitationem voluptatem dolor beatae veritatis quasi omnis consectetur.','2018-03-31'),(20,10,'Culpa error rerum voluptatem recusandae quae tempora.','Est ullam tempore autem et. Dolorum est eius eaque veniam in quibusdam neque. Ut aspernatur earum sint delectus voluptate deserunt sapiente quia.','Enim quos facere rerum ipsa. Eveniet expedita id eligendi voluptatem magnam quo eos.','2007-01-22'),(21,1,'Harum laudantium fugiat debitis atque sed.','Et asperiores magni qui voluptas a consequatur totam. Inventore enim quaerat consequatur sint quam voluptatibus optio. Est aut repellendus repudiandae reiciendis eveniet veniam. Minima a corrupti non quae.','Voluptate officia ut debitis explicabo corrupti facere reprehenderit. Enim id recusandae vitae est dolores. Aperiam consequuntur ex beatae et alias quia.','1987-06-29'),(22,2,'Non architecto ut voluptas aut voluptas dolor ut.','Dolore delectus optio fuga aut labore necessitatibus. Laborum quis nulla deserunt. Aut corporis repellendus inventore vel.','Facilis soluta ab culpa est. Aut pariatur et dicta sit. Sed qui est numquam est.\nAtque ex sit eveniet. Iure accusamus optio placeat voluptate non sit ea. Sint dignissimos dolorum debitis ipsam neque.','1993-05-06'),(23,3,'Dolores sed hic vitae ut qui.','Libero illum dolorum est eaque ut. Nesciunt qui vitae recusandae eveniet saepe et ut. Aliquid enim vitae beatae animi quam doloribus accusamus. Eos eos excepturi accusamus ut recusandae.','Distinctio molestiae sint qui. Expedita qui ex dignissimos architecto quo sapiente alias eveniet. Laborum qui aut est doloribus a beatae. Unde adipisci consequuntur et tenetur.','1978-09-08'),(24,4,'Deleniti distinctio eos eveniet.','Ex aperiam animi quis excepturi. Velit qui molestias iste iure voluptatem. Eveniet adipisci quasi amet. Soluta laborum aperiam magni.','Deserunt dolores ut ut ex cum. Quae iusto rerum voluptatum aperiam. Vel voluptatem ut nesciunt delectus blanditiis. Sequi consequuntur temporibus sunt dolores repudiandae.','2003-06-23'),(25,5,'Ea et asperiores odio vel sunt exercitationem.','Quod necessitatibus quis sit aspernatur a. Molestias laudantium voluptatibus quaerat rerum cupiditate. Aut consectetur quia doloribus repellat porro est.','Et alias soluta aliquam qui aut. Explicabo quo consequuntur consequuntur velit distinctio.','1972-09-16'),(26,6,'Accusamus est sed aut minus.','Et libero in in est consequuntur. Illum distinctio doloremque quas.','Neque vel tenetur libero sed aut voluptas. Itaque quod et laudantium magnam tempora qui non. Et sapiente dolores reiciendis sit ab fugiat sed sequi. Reiciendis maxime qui aut laborum dolor.','2017-03-08'),(27,7,'Et sed reprehenderit nobis sed.','Totam amet nisi id quod. Laudantium maxime rem velit consequuntur amet. Et enim eum aspernatur totam. Nulla consequatur similique maxime et qui rerum.','Iure sequi unde consectetur neque in magni. Illo ipsa commodi quae placeat modi numquam numquam. Quae culpa sit distinctio vitae est.','1973-08-04'),(28,8,'Autem ullam aperiam totam assumenda quod esse.','Aut incidunt aspernatur aut sapiente ipsum repellat. Molestiae eaque accusantium maxime. Velit modi ea consectetur natus ea.','Molestias voluptatum cupiditate et minus qui consequuntur. Reprehenderit aut at corrupti. Eius unde ullam aut cum eius molestiae.','2014-04-26'),(29,9,'Ad dolores amet ea nisi aut enim voluptatem.','Eum voluptates sunt occaecati molestiae. Cupiditate labore expedita eius in omnis non. Sit cumque unde cupiditate sequi eius reprehenderit nulla.','Voluptates modi esse quas sit eos praesentium. Quas et rem vero quo veritatis voluptas. Inventore dolorem ut praesentium consequatur rem. Amet ipsam quia officia iste est in.','2006-09-07'),(30,10,'Eos fuga at ex sapiente quasi.','Facere dolores non omnis facilis. Nam cupiditate maiores iure quia adipisci numquam magnam. Esse voluptas voluptatem cum ea voluptas doloremque.','Voluptatem qui qui magnam quis eos. Consequatur ut repudiandae libero dignissimos et quia velit. Eum nisi facere consequatur quod ut. Ad molestiae voluptatem eaque iste et.','2009-07-23');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/security/MySQL/nxs-data-anonymizer.conf
================================================
security:
policy:
tables: skip
columns: randomize
exceptions:
columns:
- email
- id
defaults:
columns:
birthdate:
value: "1999-12-31"
filters:
authors:
columns:
first_name:
value: "{{- randAlphaNum 20 -}}"
added:
value: "2000-01-01 12:00:00"
================================================
FILE: doc/examples/security/MySQL/output.sql
================================================
-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)
--
-- Host: localhost Database: name_db
-- ------------------------------------------------------
-- Server version 8.4.0
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `authors`
--
DROP TABLE IF EXISTS `authors`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `authors` (
`id` int NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`last_name` varchar(50) COLLATE utf8mb3_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8mb3_unicode_ci NOT NULL,
`birthdate` date NOT NULL,
`added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `authors`
--
LOCK TABLES `authors` WRITE;
/*!40000 ALTER TABLE `authors` DISABLE KEYS */;
INSERT INTO `authors` VALUES (1,'1l03v4S3kULe9MT504eo','randomized varchar','brett35@example.com','1999-12-31','2000-01-01 12:00:00'),(2,'qQOaG6T57jIUbjFswSZY','randomized varchar','aracely46@example.com','1999-12-31','2000-01-01 12:00:00'),(3,'r5INLGwas75FRG8HlxIH','randomized varchar','carroll.harris@example.com','1999-12-31','2000-01-01 12:00:00'),(4,'RQ8g1cPBpGlDBXozyOCS','randomized varchar','johns.janick@example.org','1999-12-31','2000-01-01 12:00:00'),(5,'d2sJnwtCGDAeBUszVtnS','randomized varchar','lakin.ramiro@example.net','1999-12-31','2000-01-01 12:00:00'),(6,'rTJerd760gdClROJjVAe','randomized varchar','judson33@example.com','1999-12-31','2000-01-01 12:00:00'),(7,'RMsGEydALqtyaTPBKsp9','randomized varchar','kaci.koch@example.net','1999-12-31','2000-01-01 12:00:00'),(8,'bmz2gTMJRYF4HHPn2wiu','randomized varchar','jprosacco@example.net','1999-12-31','2000-01-01 12:00:00'),(9,'ifxehp3b3jrbafETxeab','randomized varchar','kutch.kylie@example.com','1999-12-31','2000-01-01 12:00:00'),(10,'tAbuLmPP94Z41b1Pp5SZ','randomized varchar','hane.terrill@example.org','1999-12-31','2000-01-01 12:00:00');
/*!40000 ALTER TABLE `authors` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `posts`
--
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` int NOT NULL AUTO_INCREMENT,
`author_id` int NOT NULL,
`title` varchar(255) COLLATE utf8mb3_unicode_ci NOT NULL,
`description` varchar(500) COLLATE utf8mb3_unicode_ci NOT NULL,
`content` text COLLATE utf8mb3_unicode_ci NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-07-19 10:47:53
================================================
FILE: doc/examples/security/PostgreSQL/input
================================================
--
-- PostgreSQL database dump
--
-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)
-- Dumped
gitextract_88iwtv_2/
├── .docker/
│ └── Dockerfile
├── .github/
│ ├── release.yml
│ └── workflows/
│ └── publish.yml
├── .gitignore
├── LICENSE
├── README.md
├── ctx/
│ ├── args.go
│ ├── conf.go
│ └── context.go
├── doc/
│ └── examples/
│ ├── drop/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── filters/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── links/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ ├── security/
│ │ ├── MySQL/
│ │ │ ├── input.sql
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output.sql
│ │ ├── PostgreSQL/
│ │ │ ├── input
│ │ │ ├── nxs-data-anonymizer.conf
│ │ │ └── output
│ │ └── Readme.md
│ └── variables/
│ ├── MySQL/
│ │ ├── input.sql
│ │ ├── nxs-data-anonymizer.conf
│ │ └── output.sql
│ ├── PostgreSQL/
│ │ ├── input
│ │ ├── nxs-data-anonymizer.conf
│ │ └── output
│ └── Readme.md
├── ds/
│ └── mysql/
│ └── mysql.go
├── go.mod
├── go.sum
├── interfaces/
│ └── anonymizer.go
├── main.go
├── misc/
│ ├── errors.go
│ ├── security.go
│ ├── template.go
│ ├── token.go
│ └── values.go
├── modules/
│ ├── anonymizers/
│ │ ├── mysql/
│ │ │ ├── .testdata/
│ │ │ │ ├── mysql_test.dos.in.sql
│ │ │ │ ├── mysql_test.dos.out.sql
│ │ │ │ ├── mysql_test.in.sql
│ │ │ │ └── mysql_test.out.sql
│ │ │ ├── dh.go
│ │ │ ├── mysql.go
│ │ │ ├── mysql_test.go
│ │ │ ├── security_types.go
│ │ │ └── states.go
│ │ └── pgsql/
│ │ ├── .testdata/
│ │ │ ├── pgsql_test.dos.in.sql
│ │ │ ├── pgsql_test.dos.out.sql
│ │ │ ├── pgsql_test.in.sql
│ │ │ └── pgsql_test.out.sql
│ │ ├── dh.go
│ │ ├── pgsql.go
│ │ ├── pgsql_test.go
│ │ ├── security_types.go
│ │ └── states.go
│ ├── filters/
│ │ └── relfilter/
│ │ ├── column.go
│ │ ├── filter.go
│ │ └── filter_test.go
│ └── progress_reader/
│ └── progress_reader.go
└── routines/
└── anonymizer/
└── anonymizer.go
SYMBOL INDEX (217 symbols across 39 files)
FILE: ctx/args.go
constant confPathDefault (line 12) | confPathDefault = "/nxs-data-anonymizer.conf"
type Args (line 18) | type Args struct
function ArgsRead (line 28) | func ArgsRead() (Args, error) {
function argsHelp (line 126) | func argsHelp(args *getopt.Set) {
function argsVersion (line 139) | func argsVersion() {
FILE: ctx/conf.go
type confOpts (line 10) | type confOpts struct
type progressConf (line 23) | type progressConf struct
type filterConf (line 28) | type filterConf struct
type columnFilterConf (line 32) | type columnFilterConf struct
type linkConf (line 38) | type linkConf struct
type variableFilterConf (line 43) | type variableFilterConf struct
type securityConf (line 48) | type securityConf struct
type securityPolicyConf (line 54) | type securityPolicyConf struct
type securityExceptionsConf (line 59) | type securityExceptionsConf struct
type securityDefaultsConf (line 64) | type securityDefaultsConf struct
type securityDefaultsTypeConf (line 69) | type securityDefaultsTypeConf struct
type mysqlConf (line 74) | type mysqlConf struct
function confRead (line 82) | func confRead(confPath string) (confOpts, error) {
FILE: ctx/context.go
type Ctx (line 23) | type Ctx struct
type DBCtx (line 32) | type DBCtx struct
type DBType (line 38) | type DBType
constant DBTypeMySQL (line 41) | DBTypeMySQL DBType = "mysql"
constant DBTypePgSQL (line 42) | DBTypePgSQL DBType = "pgsql"
type LogFormat (line 45) | type LogFormat
constant LogFormatJSON (line 48) | LogFormatJSON LogFormat = "json"
constant LogFormatPlain (line 49) | LogFormatPlain LogFormat = "plain"
type progressCtx (line 52) | type progressCtx struct
type SecurityCtx (line 57) | type SecurityCtx struct
function AppCtxInit (line 63) | func AppCtxInit() (any, error) {
function tmpLogError (line 281) | func tmpLogError(msg string, err error) {
function logInit (line 288) | func logInit(file, level string, ft LogFormat) (*logrus.Logger, error) {
FILE: doc/examples/drop/MySQL/input.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 53) | CREATE TABLE `posts` (
FILE: doc/examples/drop/MySQL/output.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 53) | CREATE TABLE `posts` (
FILE: doc/examples/filters/MySQL/input.sql
type `test_tbl` (line 25) | CREATE TABLE `test_tbl` (
FILE: doc/examples/filters/MySQL/output.sql
type `test_tbl` (line 25) | CREATE TABLE `test_tbl` (
FILE: doc/examples/links/MySQL/input.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 54) | CREATE TABLE `posts` (
FILE: doc/examples/links/MySQL/output.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 54) | CREATE TABLE `posts` (
FILE: doc/examples/security/MySQL/input.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 54) | CREATE TABLE `posts` (
FILE: doc/examples/security/MySQL/output.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 54) | CREATE TABLE `posts` (
FILE: doc/examples/variables/MySQL/input.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 53) | CREATE TABLE `posts` (
FILE: doc/examples/variables/MySQL/output.sql
type `authors` (line 25) | CREATE TABLE `authors` (
type `posts` (line 53) | CREATE TABLE `posts` (
FILE: ds/mysql/mysql.go
type MySQL (line 10) | type MySQL struct
method Close (line 39) | func (m *MySQL) Close() error {
method DBCleanup (line 44) | func (m *MySQL) DBCleanup() error {
type Settings (line 14) | type Settings struct
function Connect (line 22) | func Connect(s Settings) (MySQL, error) {
FILE: interfaces/anonymizer.go
type Anonymizer (line 8) | type Anonymizer interface
FILE: main.go
function main (line 16) | func main() {
function sigHandlerTerm (line 46) | func sigHandlerTerm(sig appctx.Signal) {
FILE: misc/security.go
type SecurityPolicyTablesType (line 3) | type SecurityPolicyTablesType
method String (line 11) | func (v SecurityPolicyTablesType) String() string {
constant SecurityPolicyTablesUnknown (line 6) | SecurityPolicyTablesUnknown SecurityPolicyTablesType = "unknown"
constant SecurityPolicyTablesPass (line 7) | SecurityPolicyTablesPass SecurityPolicyTablesType = "pass"
constant SecurityPolicyTablesSkip (line 8) | SecurityPolicyTablesSkip SecurityPolicyTablesType = "skip"
function SecurityPolicyTablesTypeFromString (line 15) | func SecurityPolicyTablesTypeFromString(v string) SecurityPolicyTablesTy...
type SecurityPolicyColumnsType (line 26) | type SecurityPolicyColumnsType
method String (line 34) | func (v SecurityPolicyColumnsType) String() string {
constant SecurityPolicyColumnsUnknown (line 29) | SecurityPolicyColumnsUnknown SecurityPolicyColumnsType = "unknown"
constant SecurityPolicyColumnsPass (line 30) | SecurityPolicyColumnsPass SecurityPolicyColumnsType = "pass"
constant SecurityPolicyColumnsRandomize (line 31) | SecurityPolicyColumnsRandomize SecurityPolicyColumnsType = "randomize"
function SecurityPolicyColumnsTypeFromString (line 38) | func SecurityPolicyColumnsTypeFromString(v string) SecurityPolicyColumns...
FILE: misc/template.go
type TemlateRes (line 15) | type TemlateRes struct
function TemplateExec (line 21) | func TemplateExec(tpl string, d any) (TemlateRes, error) {
FILE: misc/token.go
function TokenGen (line 9) | func TokenGen(tokenLen int64) string {
FILE: misc/values.go
type ValueType (line 3) | type ValueType
method String (line 22) | func (v ValueType) String() string {
constant ValueTypeUnknown (line 6) | ValueTypeUnknown ValueType = "unkonwn"
constant ValueTypeTemplate (line 7) | ValueTypeTemplate ValueType = "template"
constant ValueTypeCommand (line 8) | ValueTypeCommand ValueType = "command"
function ValueTypeFromString (line 11) | func ValueTypeFromString(v string) ValueType {
FILE: modules/anonymizers/mysql/.testdata/mysql_test.dos.in.sql
type `table1` (line 25) | CREATE TABLE `table1` (
type `table2` (line 55) | CREATE TABLE `table2` (
type `table3` (line 85) | CREATE TABLE `table3` (
FILE: modules/anonymizers/mysql/.testdata/mysql_test.dos.out.sql
type `table1` (line 25) | CREATE TABLE `table1` (
type `table2` (line 55) | CREATE TABLE `table2` (
type `table3` (line 85) | CREATE TABLE `table3` (
FILE: modules/anonymizers/mysql/.testdata/mysql_test.in.sql
type `table1` (line 25) | CREATE TABLE `table1` (
type `table2` (line 55) | CREATE TABLE `table2` (
type `table3` (line 85) | CREATE TABLE `table3` (
FILE: modules/anonymizers/mysql/.testdata/mysql_test.out.sql
type `table1` (line 25) | CREATE TABLE `table1` (
type `table2` (line 55) | CREATE TABLE `table2` (
type `table3` (line 85) | CREATE TABLE `table3` (
FILE: modules/anonymizers/mysql/dh.go
function dhSecurityInsertInto (line 11) | func dhSecurityInsertInto(usrCtx any, deferred, token []byte) ([]byte, e...
function dhSecurityInsertIntoTableNameSearch (line 21) | func dhSecurityInsertIntoTableNameSearch(usrCtx any, deferred, token []b...
function dhSecurityInsertIntoValues (line 31) | func dhSecurityInsertIntoValues(usrCtx any, deferred, token []byte) ([]b...
function dhSecurityInsertIntoValueSearch (line 45) | func dhSecurityInsertIntoValueSearch(usrCtx any, deferred, token []byte)...
function dhSecurityValuesEnd (line 58) | func dhSecurityValuesEnd(usrCtx any, deferred, token []byte) ([]byte, er...
function dhCreateTableName (line 73) | func dhCreateTableName(usrCtx any, deferred, token []byte) ([]byte, erro...
function dhCreateTableFieldName (line 81) | func dhCreateTableFieldName(usrCtx any, deferred, token []byte) ([]byte,...
function checkGenerated (line 91) | func checkGenerated(t []byte) bool {
function dhCreateTableColumnAdd (line 99) | func dhCreateTableColumnAdd(usrCtx any, deferred, token []byte) ([]byte,...
function dhInsertIntoTableName (line 130) | func dhInsertIntoTableName(usrCtx any, deferred, token []byte) ([]byte, ...
function dhCreateTableValues (line 159) | func dhCreateTableValues(usrCtx any, deferred, token []byte) ([]byte, er...
function dhCreateTableValuesString (line 177) | func dhCreateTableValuesString(usrCtx any, deferred, token []byte) ([]by...
function dhCreateTableValuesEnd (line 191) | func dhCreateTableValuesEnd(usrCtx any, deferred, token []byte) ([]byte,...
function dhCreateTableValuesStringEnd (line 226) | func dhCreateTableValuesStringEnd(usrCtx any, deferred, token []byte) ([...
function rowDataGen (line 254) | func rowDataGen(uctx *userCtx) []byte {
function securityPolicyCheck (line 289) | func securityPolicyCheck(uctx *userCtx, tname string) bool {
FILE: modules/anonymizers/mysql/mysql.go
type MySQL (line 15) | type MySQL struct
method Run (line 176) | func (m *MySQL) Run(ctx context.Context, w io.Writer) error {
type InitOpts (line 20) | type InitOpts struct
type RulesOpts (line 27) | type RulesOpts struct
type SecurityOpts (line 34) | type SecurityOpts struct
type userCtx (line 40) | type userCtx struct
type securityCtx (line 49) | type securityCtx struct
type optKind (line 57) | type optKind struct
type columnType (line 62) | type columnType
method String (line 71) | func (c columnType) String() string {
constant columnTypeNone (line 65) | columnTypeNone columnType = "none"
constant columnTypeString (line 66) | columnTypeString columnType = "string"
constant columnTypeNum (line 67) | columnTypeNum columnType = "numeric"
constant columnTypeBinary (line 68) | columnTypeBinary columnType = "binary"
function userCtxInit (line 113) | func userCtxInit(s InitOpts) (*userCtx, error) {
function Init (line 163) | func Init(r io.Reader, s InitOpts) (*MySQL, error) {
FILE: modules/anonymizers/mysql/mysql_test.go
function TestMySQL (line 13) | func TestMySQL(t *testing.T) {
function TestMySQLDos (line 84) | func TestMySQLDos(t *testing.T) {
FILE: modules/anonymizers/pgsql/.testdata/pgsql_test.dos.in.sql
type public (line 27) | CREATE TABLE public.list_types (
type public (line 48) | CREATE TABLE public.list_types2 (
type public (line 69) | CREATE TABLE public.list_types3 (
FILE: modules/anonymizers/pgsql/.testdata/pgsql_test.dos.out.sql
type public (line 27) | CREATE TABLE public.list_types (
type public (line 48) | CREATE TABLE public.list_types2 (
type public (line 69) | CREATE TABLE public.list_types3 (
FILE: modules/anonymizers/pgsql/.testdata/pgsql_test.in.sql
type public (line 27) | CREATE TABLE public.list_types (
type public (line 48) | CREATE TABLE public.list_types2 (
type public (line 69) | CREATE TABLE public.list_types3 (
FILE: modules/anonymizers/pgsql/.testdata/pgsql_test.out.sql
type public (line 27) | CREATE TABLE public.list_types (
type public (line 48) | CREATE TABLE public.list_types2 (
type public (line 69) | CREATE TABLE public.list_types3 (
FILE: modules/anonymizers/pgsql/dh.go
function dhSecurityCopy (line 12) | func dhSecurityCopy(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhCopyValuesEnd (line 22) | func dhCopyValuesEnd(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhCreateTableName (line 37) | func dhCreateTableName(usrCtx any, deferred, token []byte) ([]byte, erro...
function dhCreateTableDesc (line 47) | func dhCreateTableDesc(usrCtx any, deferred, token []byte) ([]byte, erro...
function dhTableName (line 78) | func dhTableName(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhFieldName (line 104) | func dhFieldName(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhTableCopyTail (line 124) | func dhTableCopyTail(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhValue (line 137) | func dhValue(usrCtx any, deferred, token []byte) ([]byte, error) {
function dhValueEnd (line 155) | func dhValueEnd(usrCtx any, deferred, token []byte) ([]byte, error) {
function rowDataGen (line 188) | func rowDataGen(filter *relfilter.Filter) []byte {
function securityPolicyCheck (line 216) | func securityPolicyCheck(uctx *userCtx, tname string) bool {
FILE: modules/anonymizers/pgsql/pgsql.go
type PgSQL (line 14) | type PgSQL struct
method Run (line 102) | func (p *PgSQL) Run(ctx context.Context, w io.Writer) error {
type InitOpts (line 19) | type InitOpts struct
type RulesOpts (line 26) | type RulesOpts struct
type SecurityOpts (line 33) | type SecurityOpts struct
type userCtx (line 39) | type userCtx struct
type securityCtx (line 47) | type securityCtx struct
function userCtxInit (line 55) | func userCtxInit(s InitOpts) (*userCtx, error) {
function Init (line 89) | func Init(r io.Reader, s InitOpts) (*PgSQL, error) {
FILE: modules/anonymizers/pgsql/pgsql_test.go
function TestPgSQL (line 13) | func TestPgSQL(t *testing.T) {
function TestPgSQLDos (line 84) | func TestPgSQLDos(t *testing.T) {
FILE: modules/filters/relfilter/column.go
type columns (line 5) | type columns struct
method add (line 29) | func (c *columns) add(name string, rt string, pts [][]string, r *Colum...
method getNameByIndex (line 64) | func (c *columns) getNameByIndex(index int) string {
method delByName (line 71) | func (c *columns) delByName(name string) {
type column (line 10) | type column struct
type columnTypes (line 15) | type columnTypes struct
function columnsInit (line 22) | func columnsInit() columns {
FILE: modules/filters/relfilter/filter.go
type InitOpts (line 13) | type InitOpts struct
type TypeRuleOpts (line 28) | type TypeRuleOpts struct
type ColumnRuleOpts (line 33) | type ColumnRuleOpts struct
type VariableRuleOpts (line 39) | type VariableRuleOpts struct
type LinkOpts (line 44) | type LinkOpts struct
type Filter (line 49) | type Filter struct
method TableCreate (line 235) | func (filter *Filter) TableCreate(name string) {
method TableNameGet (line 244) | func (filter *Filter) TableNameGet() string {
method TableRulesLookup (line 249) | func (filter *Filter) TableRulesLookup(name string) map[string]ColumnR...
method ColumnAdd (line 257) | func (filter *Filter) ColumnAdd(name string, rt string) {
method ColumnGetName (line 280) | func (filter *Filter) ColumnGetName(index int) string {
method ValueAdd (line 284) | func (filter *Filter) ValueAdd(b string) {
method ValuePop (line 294) | func (filter *Filter) ValuePop() Row {
method Apply (line 306) | func (filter *Filter) Apply() error {
method applyRules (line 401) | func (filter *Filter) applyRules(tname string, rls []applyRule) error {
method applyColumnFilter (line 527) | func (filter *Filter) applyColumnFilter(cn string, cr ColumnRuleOpts, ...
method applyLinkFilter (line 572) | func (filter *Filter) applyLinkFilter(cn string, cr ColumnRuleOpts, u ...
method rowCleanup (line 609) | func (filter *Filter) rowCleanup() {
type Row (line 58) | type Row struct
type rules (line 62) | type rules struct
type typeRule (line 77) | type typeRule struct
type tableData (line 82) | type tableData struct
type rowValue (line 89) | type rowValue struct
type linkValues (line 93) | type linkValues struct
type execFilterOpts (line 108) | type execFilterOpts struct
constant uniqueAttempts (line 113) | uniqueAttempts = 5
constant envVarGlobalPrefix (line 116) | envVarGlobalPrefix = "ENVVARGLOBAL_"
constant envVarTable (line 117) | envVarTable = "ENVVARTABLE"
constant envVarColumnPrefix (line 118) | envVarColumnPrefix = "ENVVARCOLUMN_"
constant envVarCurColumn (line 119) | envVarCurColumn = "ENVVARCURCOLUMN"
constant envVarColumnTypeRAW (line 120) | envVarColumnTypeRAW = "ENVVARCOLUMNTYPERAW"
constant envVarColumnTypeGroupPrefix (line 121) | envVarColumnTypeGroupPrefix = "ENVVARCOLUMNTYPEGROUP_"
type applyRule (line 124) | type applyRule struct
function Init (line 132) | func Init(opts InitOpts) (*Filter, error) {
function execFilter (line 613) | func execFilter(f execFilterOpts, td any, tde []string) (string, bool, e...
FILE: modules/filters/relfilter/filter_test.go
function TestExecFilter (line 9) | func TestExecFilter(t *testing.T) {
function TestFilterApply (line 44) | func TestFilterApply(t *testing.T) {
function TestFilterApplyDropFunction (line 50) | func TestFilterApplyDropFunction(t *testing.T) {
function TestFilterApplyNullFunction (line 85) | func TestFilterApplyNullFunction(t *testing.T) {
function TestLinkFilterApply (line 120) | func TestLinkFilterApply(t *testing.T) {
function TestLinkFilterApplyDropFunction (line 211) | func TestLinkFilterApplyDropFunction(t *testing.T) {
function testFilterTableInit (line 281) | func testFilterTableInit(f *Filter) {
function testLinkFilterTable1Init (line 294) | func testLinkFilterTable1Init(f *Filter) {
function testLinkFilterTable2Init (line 307) | func testLinkFilterTable2Init(f *Filter) {
FILE: modules/progress_reader/progress_reader.go
type ProgressReader (line 5) | type ProgressReader struct
method Read (line 21) | func (pr *ProgressReader) Read(dst []byte) (int, error) {
method Bytes (line 33) | func (pr *ProgressReader) Bytes() int64 {
function Init (line 14) | func Init(r io.Reader) *ProgressReader {
FILE: routines/anonymizer/anonymizer.go
type anonymizeOpts (line 17) | type anonymizeOpts struct
function Runtime (line 26) | func Runtime(app appctx.App) error {
function anonymize (line 105) | func anonymize(st anonymizeOpts) error {
function progressLog (line 125) | func progressLog(l *logrus.Logger, b int64, h bool) {
Condensed preview — 77 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (463K chars).
[
{
"path": ".docker/Dockerfile",
"chars": 375,
"preview": "FROM golang:1.21-bullseye as build-env\n\nARG APP_VERSION\n\nWORKDIR /usr/src/app\nADD ./ /usr/src/app\n\nRUN go build -ldflags"
},
{
"path": ".github/release.yml",
"chars": 369,
"preview": "# .github/release.yml\n\nchangelog:\n exclude:\n labels:\n - ignore-for-release\n categories:\n - title: Breaking Chan"
},
{
"path": ".github/workflows/publish.yml",
"chars": 2500,
"preview": "name: Release\n\non:\n push:\n tags:\n - 'v*'\n\njobs:\n\n build-and-publish-release:\n runs-on: ${{ matrix.os }}\n s"
},
{
"path": ".gitignore",
"chars": 25,
"preview": "/.project\n/.vscode\n/.tmp\n"
},
{
"path": "LICENSE",
"chars": 11353,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 26973,
"preview": "\n\ncons"
},
{
"path": "ctx/conf.go",
"chars": 3556,
"preview": "package ctx\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\tconf \"github.com/nixys/nxs-go-conf\"\n)\n\ntype "
},
{
"path": "ctx/context.go",
"chars": 7172,
"preview": "package ctx\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/interfaces\"\n\tmysql_anonymize \"g"
},
{
"path": "doc/examples/drop/MySQL/input.sql",
"chars": 15105,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/drop/MySQL/nxs-data-anonymizer.conf",
"chars": 673,
"preview": "filters:\n authors:\n columns:\n first_name:\n value: \"John\"\n last_name:\n value: \"Smith\"\n e"
},
{
"path": "doc/examples/drop/MySQL/output.sql",
"chars": 5824,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/drop/PostgreSQL/input",
"chars": 13716,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/drop/PostgreSQL/nxs-data-anonymizer.conf",
"chars": 688,
"preview": "filters:\n public.authors:\n columns:\n first_name:\n value: \"John\"\n last_name:\n value: \"Smith\"\n"
},
{
"path": "doc/examples/drop/PostgreSQL/output",
"chars": 4477,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/drop/Readme.md",
"chars": 1274,
"preview": "# Example `variables`\n\nAn example of using nxs-data-anonymizer in a simple configuration with filters and variables bloc"
},
{
"path": "doc/examples/filters/MySQL/input.sql",
"chars": 2157,
"preview": "-- MySQL dump 10.13 Distrib 8.1.0, for Linux (x86_64)\n--\n-- Host: localhost Database: test_db\n-- -------------------"
},
{
"path": "doc/examples/filters/MySQL/nxs-data-anonymizer.conf",
"chars": 244,
"preview": "filters:\n test_tbl:\n columns:\n int_type:\n value: \"1\"\n dbl_type:\n value: \"99.999\"\n vchar"
},
{
"path": "doc/examples/filters/MySQL/output.sql",
"chars": 2257,
"preview": "-- MySQL dump 10.13 Distrib 8.1.0, for Linux (x86_64)\n--\n-- Host: localhost Database: test_db\n-- -------------------"
},
{
"path": "doc/examples/filters/PostgreSQL/input",
"chars": 8679,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/filters/PostgreSQL/nxs-data-anonymizer.conf",
"chars": 1014,
"preview": "filters:\n public.list_types:\n columns:\n integer_type:\n value: \"{{ if (isNull .Values.integer_type) }}{{ 0"
},
{
"path": "doc/examples/filters/PostgreSQL/output",
"chars": 3081,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.1 (Debian 16.1-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/filters/Readme.md",
"chars": 1146,
"preview": "# Example `filters`\n\nAn example of using nxs-data-anonymizer in a simple configuration with one filters block.\n\nAll that"
},
{
"path": "doc/examples/links/MySQL/input.sql",
"chars": 15137,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/links/MySQL/nxs-data-anonymizer.conf",
"chars": 456,
"preview": "link:\n- rule:\n value: \"{{ randInt 1 50\t}}\"\n unique: true\n with:\n authors:\n - id\n posts:\n - author_id\n"
},
{
"path": "doc/examples/links/MySQL/output.sql",
"chars": 15457,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/links/PostgreSQL/input",
"chars": 13716,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/links/PostgreSQL/nxs-data-anonymizer.conf",
"chars": 484,
"preview": "link:\n- rule:\n value: \"{{ randInt 1 50\t}}\"\n unique: true\n with:\n public.authors:\n - id\n public.posts:\n "
},
{
"path": "doc/examples/links/PostgreSQL/output",
"chars": 14041,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/links/Readme.md",
"chars": 1153,
"preview": "# Example `variables`\n\nAn example of using nxs-data-anonymizer in a simple configuration with filters and link blocks.\n\n"
},
{
"path": "doc/examples/security/MySQL/input.sql",
"chars": 15137,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/security/MySQL/nxs-data-anonymizer.conf",
"chars": 320,
"preview": "security:\n policy:\n tables: skip\n columns: randomize\n exceptions:\n columns:\n - email\n - id\n defaults:\n"
},
{
"path": "doc/examples/security/MySQL/output.sql",
"chars": 4082,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/security/PostgreSQL/input",
"chars": 13716,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/security/PostgreSQL/nxs-data-anonymizer.conf",
"chars": 327,
"preview": "security:\n policy:\n tables: skip\n columns: randomize\n exceptions:\n columns:\n - email\n - id\n defaults:\n"
},
{
"path": "doc/examples/security/PostgreSQL/output",
"chars": 2975,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/security/Readme.md",
"chars": 1124,
"preview": "# Example `security`\n\nAn example of using nxs-data-anonymizer in a simple configuration with filters and security block."
},
{
"path": "doc/examples/variables/MySQL/input.sql",
"chars": 15105,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/variables/MySQL/nxs-data-anonymizer.conf",
"chars": 1017,
"preview": "variables:\n first_name:\n value: \"John\"\n last_name:\n value: \"Smith\"\n email:\n value: \"JohnSmith@example.com\"\n "
},
{
"path": "doc/examples/variables/MySQL/output.sql",
"chars": 6075,
"preview": "-- MySQL dump 10.13 Distrib 8.4.0, for Linux (x86_64)\n--\n-- Host: localhost Database: name_db\n-- -------------------"
},
{
"path": "doc/examples/variables/PostgreSQL/input",
"chars": 13716,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/variables/PostgreSQL/nxs-data-anonymizer.conf",
"chars": 1031,
"preview": "variables:\n first_name:\n value: \"John\"\n last_name:\n value: \"Smith\"\n email:\n value: \"JohnSmith@example.com\"\n "
},
{
"path": "doc/examples/variables/PostgreSQL/output",
"chars": 4686,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "doc/examples/variables/Readme.md",
"chars": 1274,
"preview": "# Example `variables`\n\nAn example of using nxs-data-anonymizer in a simple configuration with filters and variables bloc"
},
{
"path": "ds/mysql/mysql.go",
"chars": 959,
"preview": "package mysql\n\nimport (\n\t\"fmt\"\n\n\tgmysql \"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\ntype MySQL struct {\n\tclient *gorm.DB\n}"
},
{
"path": "go.mod",
"chars": 1291,
"preview": "module github.com/nixys/nxs-data-anonymizer\n\ngo 1.21.1\n\nrequire (\n\tgithub.com/Masterminds/sprig/v3 v3.2.3\n\tgithub.com/do"
},
{
"path": "go.sum",
"chars": 11157,
"preview": "github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=\ngithub.com/Masterminds/goutils v1."
},
{
"path": "interfaces/anonymizer.go",
"chars": 118,
"preview": "package interfaces\n\nimport (\n\t\"context\"\n\t\"io\"\n)\n\ntype Anonymizer interface {\n\tRun(context.Context, io.Writer) error\n}\n"
},
{
"path": "main.go",
"chars": 823,
"preview": "package main\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"syscall\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/ctx\"\n\t\"github.com/nixys/nxs-d"
},
{
"path": "misc/errors.go",
"chars": 338,
"preview": "package misc\n\nimport \"errors\"\n\nvar (\n\tErrNotFound = errors.New(\"entity not found\")\n\tErrIDEmpty = errors.New"
},
{
"path": "misc/security.go",
"chars": 1257,
"preview": "package misc\n\ntype SecurityPolicyTablesType string\n\nconst (\n\tSecurityPolicyTablesUnknown SecurityPolicyTablesType = \"unk"
},
{
"path": "misc/template.go",
"chars": 1389,
"preview": "package misc\n\nimport (\n\t\"bytes\"\n\tttemplate \"text/template\"\n\n\t\"github.com/Masterminds/sprig/v3\"\n)\n\nvar (\n\tTemplateNULL = "
},
{
"path": "misc/token.go",
"chars": 356,
"preview": "package misc\n\nimport (\n\t\"math/rand\"\n\t\"time\"\n)\n\n// TokenGen generates token string\nfunc TokenGen(tokenLen int64) string {"
},
{
"path": "misc/values.go",
"chars": 448,
"preview": "package misc\n\ntype ValueType string\n\nconst (\n\tValueTypeUnknown ValueType = \"unkonwn\"\n\tValueTypeTemplate ValueType = \"te"
},
{
"path": "modules/anonymizers/mysql/.testdata/mysql_test.dos.in.sql",
"chars": 4156,
"preview": "-- MariaDB dump 10.19 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64)\r\n--\r\n-- Host: 127.0.0.1 Database: db\r\n-"
},
{
"path": "modules/anonymizers/mysql/.testdata/mysql_test.dos.out.sql",
"chars": 3818,
"preview": "-- MariaDB dump 10.19 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64)\r\n--\r\n-- Host: 127.0.0.1 Database: db\r\n-"
},
{
"path": "modules/anonymizers/mysql/.testdata/mysql_test.in.sql",
"chars": 4051,
"preview": "-- MariaDB dump 10.19 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64)\n--\n-- Host: 127.0.0.1 Database: db\n-- -"
},
{
"path": "modules/anonymizers/mysql/.testdata/mysql_test.out.sql",
"chars": 3713,
"preview": "-- MariaDB dump 10.19 Distrib 10.6.12-MariaDB, for debian-linux-gnu (x86_64)\n--\n-- Host: 127.0.0.1 Database: db\n-- -"
},
{
"path": "modules/anonymizers/mysql/dh.go",
"chars": 6446,
"preview": "package mysql_anonymize\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"regexp\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n)\n\nfunc dhSecu"
},
{
"path": "modules/anonymizers/mysql/mysql.go",
"chars": 12303,
"preview": "package mysql_anonymize\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"regexp\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"gith"
},
{
"path": "modules/anonymizers/mysql/mysql_test.go",
"chars": 3234,
"preview": "package mysql_anonymize\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"g"
},
{
"path": "modules/anonymizers/mysql/security_types.go",
"chars": 5543,
"preview": "package mysql_anonymize\n\nimport (\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"github.com/nixys/nxs-data-anonymizer/mo"
},
{
"path": "modules/anonymizers/mysql/states.go",
"chars": 1640,
"preview": "package mysql_anonymize\n\nimport fsm \"github.com/nixys/nxs-go-fsm\"\n\nvar (\n\tstateCreateSearch = fsm.StateNam"
},
{
"path": "modules/anonymizers/pgsql/.testdata/pgsql_test.dos.in.sql",
"chars": 22585,
"preview": "--\r\n-- PostgreSQL database dump\r\n--\r\n\r\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\r\n-- Dumped by pg_d"
},
{
"path": "modules/anonymizers/pgsql/.testdata/pgsql_test.dos.out.sql",
"chars": 14884,
"preview": "--\r\n-- PostgreSQL database dump\r\n--\r\n\r\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\r\n-- Dumped by pg_d"
},
{
"path": "modules/anonymizers/pgsql/.testdata/pgsql_test.in.sql",
"chars": 22409,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "modules/anonymizers/pgsql/.testdata/pgsql_test.out.sql",
"chars": 14715,
"preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 16.3 (Debian 16.3-1.pgdg120+1)\n-- Dumped by pg_dump v"
},
{
"path": "modules/anonymizers/pgsql/dh.go",
"chars": 4445,
"preview": "package pgsql_anonymize\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"github.com/"
},
{
"path": "modules/anonymizers/pgsql/pgsql.go",
"chars": 5323,
"preview": "package pgsql_anonymize\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"github.com/nix"
},
{
"path": "modules/anonymizers/pgsql/pgsql_test.go",
"chars": 3456,
"preview": "package pgsql_anonymize\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"g"
},
{
"path": "modules/anonymizers/pgsql/security_types.go",
"chars": 2986,
"preview": "package pgsql_anonymize\n\nimport (\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"github.com/nixys/nxs-data-anonymizer/mo"
},
{
"path": "modules/anonymizers/pgsql/states.go",
"chars": 448,
"preview": "package pgsql_anonymize\n\nimport fsm \"github.com/nixys/nxs-go-fsm\"\n\nvar (\n\tstateInit = fsm.StateName(\"init\")\n\t"
},
{
"path": "modules/filters/relfilter/column.go",
"chars": 1342,
"preview": "package relfilter\n\nimport \"fmt\"\n\ntype columns struct {\n\tcc []*column\n\tm map[string]*column\n}\n\ntype column struct {\n\tn s"
},
{
"path": "modules/filters/relfilter/filter.go",
"chars": 12468,
"preview": "package relfilter\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc"
},
{
"path": "modules/filters/relfilter/filter_test.go",
"chars": 5924,
"preview": "package relfilter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n)\n\nfunc TestExecFilter(t *testing.T"
},
{
"path": "modules/progress_reader/progress_reader.go",
"chars": 532,
"preview": "package progressreader\n\nimport \"io\"\n\ntype ProgressReader struct {\n\n\t// Source reader\n\tr io.Reader\n\n\t// Total read bytes\n"
},
{
"path": "routines/anonymizer/anonymizer.go",
"chars": 2467,
"preview": "package anonymizer\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/docker/go-units\"\n\t\"github.com/nixys/nxs-d"
}
]
About this extraction
This page contains the full source code of the nixys/nxs-data-anonymizer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 77 files (423.1 KB), approximately 128.6k tokens, and a symbol index with 217 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.