Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Database Support

DBSurveyor supports multiple database engines with comprehensive schema collection capabilities. This guide details the support level and specific features for each database type.

Supported Databases

DatabaseStatusFeature FlagDefaultVersion Support
PostgreSQL✅ Fullpostgresql✅ Yes9.6+
SQLite✅ Fullsqlite✅ Yes3.6+
MySQL🚧 Partialmysql❌ No5.7+, 8.0+
MongoDB🚧 Plannedmongodb❌ No4.0+
SQL Server🚧 Plannedmssql❌ No2017+

Legend:

  • ✅ Full: Complete feature support with comprehensive testing
  • ⚠️ Partial: Core features supported, some limitations
  • 🚧 Basic: Minimal support, under development

PostgreSQL Support

Status: ✅ Full Support (Default)
Feature Flag: postgresql
Driver: SQLx with Tokio runtime

Connection Examples

# Basic connection
dbsurveyor-collect postgres://user:password@localhost:5432/mydb

# With SSL
dbsurveyor-collect "postgres://user:pass@localhost/db?sslmode=require"

# Connection pooling
dbsurveyor-collect "postgres://user:pass@localhost/db?pool_max_conns=5"

# Multiple schemas
dbsurveyor-collect "postgres://user:pass@localhost/db?search_path=public,custom"

Supported Objects

Object TypeSupportNotes
Tables✅ FullIncluding partitioned tables
Views✅ FullRegular and materialized views
Indexes✅ FullAll index types (B-tree, Hash, GiST, etc.)
Constraints✅ FullPK, FK, Check, Unique, Exclusion
Functions✅ FullSQL and PL/pgSQL functions
Procedures✅ FullStored procedures (PostgreSQL 11+)
Triggers✅ FullRow and statement triggers
Types✅ FullCustom types, domains, enums
Extensions✅ FullInstalled extensions
Schemas✅ FullMultiple schema support

PostgreSQL-Specific Features

-- Advanced data types
CREATE TABLE example (
    id SERIAL PRIMARY KEY,
    data JSONB,
    tags TEXT[],
    coordinates POINT,
    search_vector TSVECTOR
);

-- Custom types
CREATE TYPE status_enum AS ENUM ('active', 'inactive', 'pending');
CREATE DOMAIN email AS TEXT CHECK (VALUE ~ '^[^@]+@[^@]+\.[^@]+$');

-- Advanced indexes
CREATE INDEX CONCURRENTLY idx_data_gin ON example USING GIN (data);
CREATE INDEX idx_search ON example USING GIN (search_vector);

Collection Output

{
  "database_info": {
    "name": "mydb",
    "version": "13.7",
    "encoding": "UTF8",
    "collation": "en_US.UTF-8"
  },
  "tables": [
    {
      "name": "example",
      "schema": "public",
      "columns": [
        {
          "name": "data",
          "data_type": {
            "Json": {}
          },
          "is_nullable": true
        }
      ]
    }
  ]
}

SQLite Support

Status: ✅ Full Support (Default)
Feature Flag: sqlite
Driver: SQLx with Tokio runtime

Connection Examples

# File path
dbsurveyor-collect sqlite:///path/to/database.db
dbsurveyor-collect /path/to/database.sqlite

# Read-only mode
dbsurveyor-collect "sqlite:///path/to/db.sqlite?mode=ro"

# In-memory database (for testing)
dbsurveyor-collect "sqlite://:memory:"

Supported Objects

Object TypeSupportNotes
Tables✅ FullIncluding WITHOUT ROWID tables
Views✅ FullRegular views
Indexes✅ FullB-tree and partial indexes
Constraints⚠️ PartialLimited constraint introspection
Triggers✅ FullBEFORE, AFTER, INSTEAD OF
Virtual Tables✅ FullFTS, R-Tree, etc.
Attached DBs✅ FullMultiple attached databases

SQLite-Specific Features

-- WITHOUT ROWID tables
CREATE TABLE example (
    id TEXT PRIMARY KEY,
    data TEXT
) WITHOUT ROWID;

-- Virtual tables
CREATE VIRTUAL TABLE docs_fts USING fts5(title, content);

-- Partial indexes
CREATE INDEX idx_active_users ON users(name) WHERE active = 1;

-- JSON support (SQLite 3.38+)
CREATE TABLE events (
    id INTEGER PRIMARY KEY,
    data JSON
);

Limitations

  • Limited constraint introspection (SQLite stores constraints as DDL text)
  • No stored procedures or functions
  • No custom types (uses affinity system)
  • No schemas (single namespace per database file)

MySQL Support

Status: ⚠️ Partial Support
Feature Flag: mysql (not default)
Driver: SQLx with Tokio runtime

Connection Examples

# Basic connection
dbsurveyor-collect mysql://root:password@localhost:3306/mydb

# With SSL
dbsurveyor-collect "mysql://user:pass@localhost/db?ssl-mode=REQUIRED"

# Character set
dbsurveyor-collect "mysql://user:pass@localhost/db?charset=utf8mb4"

Supported Objects

Object TypeSupportNotes
Tables✅ FullAll storage engines
Views✅ FullRegular views
Indexes✅ FullPrimary, Unique, Index, Fulltext
Constraints⚠️ PartialPK, FK, Check (MySQL 8.0+)
Procedures✅ FullStored procedures
Functions✅ FullUser-defined functions
Triggers✅ FullBEFORE, AFTER triggers
Events✅ FullScheduled events

MySQL-Specific Features

-- Storage engines
CREATE TABLE innodb_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    data TEXT
) ENGINE=InnoDB;

-- Partitioning
CREATE TABLE partitioned (
    id INT,
    created_date DATE
) PARTITION BY RANGE (YEAR(created_date)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025)
);

-- Full-text indexes
CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
);

Known Limitations

  • Check constraints only supported in MySQL 8.0+
  • Limited JSON introspection compared to PostgreSQL
  • Some storage engine specific features not captured

Security Advisory

⚠️ RUSTSEC-2023-0071: MySQL support uses the RSA crate which has a known timing side-channel vulnerability. MySQL support is disabled by default. Use PostgreSQL or SQLite for production environments.

MongoDB Support

Status: 🚧 Basic Support
Feature Flag: mongodb (not default)
Driver: Official MongoDB Rust driver

Connection Examples

# Basic connection
dbsurveyor-collect mongodb://user:password@localhost:27017/mydb

# With authentication database
dbsurveyor-collect "mongodb://user:pass@localhost/mydb?authSource=admin"

# Replica set
dbsurveyor-collect "mongodb://user:pass@host1,host2,host3/mydb?replicaSet=rs0"

Supported Objects

Object TypeSupportNotes
Collections✅ FullDocument collections
Indexes✅ FullSingle field, compound, text, geo
Schema Inference✅ BasicInferred from document sampling
GridFS⚠️ PartialBasic GridFS collection detection
Views🚧 PlannedAggregation pipeline views

MongoDB-Specific Features

// Schema inference from documents
{
    "_id": ObjectId("..."),
    "name": "string",
    "age": "number",
    "tags": ["array", "of", "strings"],
    "address": {
        "street": "string",
        "city": "string"
    }
}

// Index types
db.users.createIndex({
    "name": 1
}) // Single field
db.users.createIndex({
    "name": 1,
    "age": -1
}) // Compound
db.articles.createIndex({
    "title": "text"
}) // Text search
db.locations.createIndex({
    "coordinates": "2dsphere"
}) // Geospatial

Current Limitations

  • Schema inference is sampling-based (may miss rare fields)
  • No aggregation pipeline analysis
  • Limited sharding information
  • No user-defined functions

SQL Server Support

Status: 🚧 Basic Support
Feature Flag: mssql (not default)
Driver: Tiberius (native TDS protocol)

Connection Examples

# Basic connection
dbsurveyor-collect mssql://sa:password@localhost:1433/mydb

# Windows Authentication (planned)
dbsurveyor-collect "mssql://localhost/mydb?trusted_connection=yes"

# Named instance
dbsurveyor-collect "mssql://sa:pass@localhost\\SQLEXPRESS/mydb"

Supported Objects

Object TypeSupportNotes
Tables✅ FullUser tables
Views✅ FullRegular views
Indexes⚠️ PartialBasic index information
Constraints⚠️ PartialPK, FK constraints
Procedures🚧 PlannedStored procedures
Functions🚧 PlannedUser-defined functions
Triggers🚧 PlannedDML triggers

Current Limitations

  • Limited to basic table and view introspection
  • No stored procedure analysis yet
  • No advanced SQL Server features (CLR, XML, spatial)
  • Windows Authentication not yet supported

Feature Comparison Matrix

FeaturePostgreSQLSQLiteMySQLMongoDBSQL Server
Tables
Views🚧
Indexes⚠️
Constraints⚠️⚠️⚠️
Procedures🚧
Functions🚧
Triggers🚧
Custom Types⚠️🚧
JSON Support⚠️🚧
Multi-DB⚠️🚧

Building with Database Support

Default Build

# Includes PostgreSQL and SQLite
cargo build --release

Custom Database Selection

# PostgreSQL only
cargo build --release --no-default-features --features postgresql

# All databases
cargo build --release --all-features

# Specific combination
cargo build --release --no-default-features --features postgresql,mysql,encryption

Feature Dependencies

[features]
postgresql = ["sqlx", "sqlx/postgres", "sqlx/runtime-tokio-rustls"]
mysql = ["sqlx", "sqlx/mysql", "sqlx/runtime-tokio-rustls"]
sqlite = ["sqlx", "sqlx/sqlite", "sqlx/runtime-tokio-rustls"]
mongodb = ["dep:mongodb"]
mssql = ["dep:tiberius"]

Database-Specific Best Practices

PostgreSQL

# Use read-only user
CREATE USER dbsurveyor_readonly;
GRANT CONNECT ON DATABASE mydb TO dbsurveyor_readonly;
GRANT USAGE ON SCHEMA public TO dbsurveyor_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO dbsurveyor_readonly;

# For multiple schemas
GRANT USAGE ON SCHEMA schema1, schema2 TO dbsurveyor_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA schema1, schema2 TO dbsurveyor_readonly;

MySQL

# Create read-only user
CREATE USER 'dbsurveyor_readonly'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON mydb.* TO 'dbsurveyor_readonly'@'%';
GRANT SELECT ON information_schema.* TO 'dbsurveyor_readonly'@'%';

SQLite

# Ensure read permissions
chmod 644 /path/to/database.db

# Use read-only mode for safety
dbsurveyor-collect "sqlite:///path/to/db.sqlite?mode=ro"

MongoDB

// Create read-only user
use admin
db.createUser({
    user: "dbsurveyor_readonly",
    pwd: "password",
    roles: [{
            role: "read",
            db: "mydb"
        }, {
            role: "read",
            db: "config"
        } // For sharding info
    ]
})

Troubleshooting Database Connections

Connection Issues

# Test connection first
dbsurveyor-collect test postgres://user:pass@localhost/db

# Check network connectivity
telnet localhost 5432  # PostgreSQL
telnet localhost 3306  # MySQL
telnet localhost 27017 # MongoDB
telnet localhost 1433  # SQL Server

Permission Issues

# PostgreSQL: Check permissions
psql -h localhost -U user -d db -c "\dt"

# MySQL: Check permissions
mysql -h localhost -u user -p -e "SHOW TABLES;" db

# SQLite: Check file permissions
ls -la /path/to/database.db

Driver Issues

# Check compiled features
dbsurveyor-collect list

# Verify feature compilation
cargo build --features postgresql --verbose

Roadmap

Planned Improvements

PostgreSQL:

  • Advanced partitioning support
  • Extension-specific object types
  • Performance statistics collection

MySQL:

  • Enhanced JSON column support
  • Partition pruning analysis
  • Storage engine optimization hints

MongoDB:

  • Aggregation pipeline analysis
  • Sharding topology mapping
  • Index usage statistics

SQL Server:

  • Complete stored procedure support
  • CLR integration analysis
  • Spatial data type support

General:

  • Cross-database schema comparison
  • Migration script generation
  • Performance benchmarking integration

Contributing Database Support

See the Contributing Guide for information on adding support for new database engines or improving existing support.