Full Code of nixys/nxs-data-anonymizer for AI

main ede8bfc83dc2 cached
77 files
423.1 KB
128.6k tokens
217 symbols
1 requests
Download .txt
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
================================================
![photo_2023-07-28_15-28-52](https://github.com/nixys/nxs-data-anonymizer/assets/27485608/165a90a0-929f-460b-8dbd-2903c0d91f36)

# 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 
Download .txt
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
Download .txt
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": "![photo_2023-07-28_15-28-52](https://github.com/nixys/nxs-data-anonymizer/assets/27485608/165a90a0-929f-460b-8dbd-2903c0"
  },
  {
    "path": "ctx/args.go",
    "chars": 2502,
    "preview": "package ctx\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/nixys/nxs-data-anonymizer/misc\"\n\t\"github.com/pborman/getopt/v2\"\n)\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.

Copied to clipboard!