🐚 Database Integration in TuskLang - Bash Guide

Bash Documentation

Database Integration in TuskLang - Bash Guide

🗄️ Revolutionary Database Configuration

Database integration in TuskLang transforms your configuration files into intelligent data management systems. No more separate database configurations or complex connection management - everything lives in your TuskLang configuration with dynamic queries, automatic connection pooling, and intelligent data caching.

> "We don't bow to any king" - TuskLang database integration breaks free from traditional database constraints and brings modern data capabilities to your Bash applications.

🚀 Core Database Directives

Basic Database Setup

#database: postgresql              # Database type
#db-type: postgresql               # Alternative syntax
#db-host: localhost                # Database host
#db-port: 5432                     # Database port
#db-name: myapp                    # Database name
#db-user: myuser                   # Database user
#db-password: mypassword           # Database password

Advanced Database Configuration

#db-pool-size: 10                  # Connection pool size
#db-timeout: 30                    # Connection timeout
#db-ssl: true                      # Enable SSL
#db-migrations: true               # Enable migrations
#db-backup: true                   # Enable backups
#db-monitoring: true               # Enable monitoring

🔧 Bash Database Implementation

Basic Database Manager

#!/bin/bash

Load database configuration

source <(tsk load database.tsk)

Database configuration

DB_TYPE="${db_type:-postgresql}" DB_HOST="${db_host:-localhost}" DB_PORT="${db_port:-5432}" DB_NAME="${db_name:-myapp}" DB_USER="${db_user:-myuser}" DB_PASSWORD="${db_password:-mypassword}"

Database manager

class DatabaseManager { constructor() { this.type = DB_TYPE this.host = DB_HOST this.port = DB_PORT this.name = DB_NAME this.user = DB_USER this.password = DB_PASSWORD this.connections = new Map() this.stats = { queries: 0, errors: 0, connections: 0 } } connect() { const connectionString = this.buildConnectionString() try { const connection = this.createConnection(connectionString) this.connections.set(connection.id, connection) this.stats.connections++ return connection } catch (error) { this.stats.errors++ throw new Error(Database connection failed: ${error.message}) } } query(sql, params = []) { this.stats.queries++ try { return this.executeQuery(sql, params) } catch (error) { this.stats.errors++ throw new Error(Query execution failed: ${error.message}) } } transaction(callback) { const connection = this.connect() try { connection.beginTransaction() const result = callback(connection) connection.commit() return result } catch (error) { connection.rollback() throw error } finally { this.closeConnection(connection.id) } } buildConnectionString() { switch (this.type) { case 'postgresql': return postgresql://${this.user}:${this.password}@${this.host}:${this.port}/${this.name} case 'mysql': return mysql://${this.user}:${this.password}@${this.host}:${this.port}/${this.name} case 'sqlite': return sqlite://${this.name}.db case 'mongodb': return mongodb://${this.user}:${this.password}@${this.host}:${this.port}/${this.name} default: throw new Error(Unsupported database type: ${this.type}) } } getStats() { return { ...this.stats } } }

Initialize database manager

const dbManager = new DatabaseManager()

PostgreSQL Integration

#!/bin/bash

PostgreSQL database integration

postgresql_integration() { local operation="$1" local query="$2" local params="$3" # PostgreSQL configuration local pg_host="${db_host:-localhost}" local pg_port="${db_port:-5432}" local pg_db="${db_name:-myapp}" local pg_user="${db_user:-myuser}" local pg_password="${db_password:-mypassword}" # Set environment variables for psql export PGHOST="$pg_host" export PGPORT="$pg_port" export PGDATABASE="$pg_db" export PGUSER="$pg_user" export PGPASSWORD="$pg_password" case "$operation" in "query") postgresql_query "$query" "$params" ;; "execute") postgresql_execute "$query" "$params" ;; "transaction") postgresql_transaction "$query" ;; "backup") postgresql_backup ;; "restore") postgresql_restore "$params" ;; *) echo "Unknown PostgreSQL operation: $operation" return 1 ;; esac }

postgresql_query() { local query="$1" local params="$2" # Build psql command local psql_cmd="psql -t -A -F','" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do psql_cmd="$psql_cmd -v param_$i='$param'" done fi # Execute query local result=$(echo "$query" | $psql_cmd 2>/dev/null) if [[ $? -eq 0 ]]; then echo "$result" return 0 else echo "Query failed" return 1 fi }

postgresql_execute() { local query="$1" local params="$2" # Build psql command for execution local psql_cmd="psql -q" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do psql_cmd="$psql_cmd -v param_$i='$param'" done fi # Execute query echo "$query" | $psql_cmd 2>/dev/null return $? }

postgresql_transaction() { local queries="$1" # Start transaction echo "BEGIN;" | psql -q 2>/dev/null if [[ $? -ne 0 ]]; then echo "Failed to start transaction" return 1 fi # Execute queries local success=true while IFS= read -r query; do if [[ -n "$query" ]]; then echo "$query" | psql -q 2>/dev/null if [[ $? -ne 0 ]]; then success=false break fi fi done <<< "$queries" if [[ "$success" == "true" ]]; then # Commit transaction echo "COMMIT;" | psql -q 2>/dev/null echo "Transaction committed successfully" else # Rollback transaction echo "ROLLBACK;" | psql -q 2>/dev/null echo "Transaction rolled back" return 1 fi }

postgresql_backup() { local backup_dir="${db_backup_dir:-/var/backups/postgresql}" local timestamp=$(date +%Y%m%d_%H%M%S) local backup_file="$backup_dir/${db_name}_$timestamp.sql" # Create backup directory mkdir -p "$backup_dir" # Create backup pg_dump -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" > "$backup_file" if [[ $? -eq 0 ]]; then echo "Backup created: $backup_file" # Compress backup gzip "$backup_file" echo "Backup compressed: $backup_file.gz" else echo "Backup failed" return 1 fi }

postgresql_restore() { local backup_file="$1" if [[ ! -f "$backup_file" ]]; then echo "Backup file not found: $backup_file" return 1 fi # Restore database if [[ "$backup_file" == *.gz ]]; then gunzip -c "$backup_file" | psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" else psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" < "$backup_file" fi if [[ $? -eq 0 ]]; then echo "Database restored successfully" else echo "Database restore failed" return 1 fi }

MySQL Integration

#!/bin/bash

MySQL database integration

mysql_integration() { local operation="$1" local query="$2" local params="$3" # MySQL configuration local mysql_host="${db_host:-localhost}" local mysql_port="${db_port:-3306}" local mysql_db="${db_name:-myapp}" local mysql_user="${db_user:-myuser}" local mysql_password="${db_password:-mypassword}" case "$operation" in "query") mysql_query "$query" "$params" ;; "execute") mysql_execute "$query" "$params" ;; "transaction") mysql_transaction "$query" ;; "backup") mysql_backup ;; "restore") mysql_restore "$params" ;; *) echo "Unknown MySQL operation: $operation" return 1 ;; esac }

mysql_query() { local query="$1" local params="$2" # Build mysql command local mysql_cmd="mysql -h $mysql_host -P $mysql_port -u $mysql_user -p$mysql_password $mysql_db -B -N" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do query=$(echo "$query" | sed "s/\\?/$param/") done fi # Execute query local result=$(echo "$query" | $mysql_cmd 2>/dev/null) if [[ $? -eq 0 ]]; then echo "$result" return 0 else echo "Query failed" return 1 fi }

mysql_execute() { local query="$1" local params="$2" # Build mysql command for execution local mysql_cmd="mysql -h $mysql_host -P $mysql_port -u $mysql_user -p$mysql_password $mysql_db" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do query=$(echo "$query" | sed "s/\\?/$param/") done fi # Execute query echo "$query" | $mysql_cmd 2>/dev/null return $? }

mysql_transaction() { local queries="$1" # Build mysql command local mysql_cmd="mysql -h $mysql_host -P $mysql_port -u $mysql_user -p$mysql_password $mysql_db" # Start transaction echo "START TRANSACTION;" | $mysql_cmd 2>/dev/null if [[ $? -ne 0 ]]; then echo "Failed to start transaction" return 1 fi # Execute queries local success=true while IFS= read -r query; do if [[ -n "$query" ]]; then echo "$query" | $mysql_cmd 2>/dev/null if [[ $? -ne 0 ]]; then success=false break fi fi done <<< "$queries" if [[ "$success" == "true" ]]; then # Commit transaction echo "COMMIT;" | $mysql_cmd 2>/dev/null echo "Transaction committed successfully" else # Rollback transaction echo "ROLLBACK;" | $mysql_cmd 2>/dev/null echo "Transaction rolled back" return 1 fi }

mysql_backup() { local backup_dir="${db_backup_dir:-/var/backups/mysql}" local timestamp=$(date +%Y%m%d_%H%M%S) local backup_file="$backup_dir/${db_name}_$timestamp.sql" # Create backup directory mkdir -p "$backup_dir" # Create backup mysqldump -h "$mysql_host" -P "$mysql_port" -u "$mysql_user" -p"$mysql_password" "$mysql_db" > "$backup_file" if [[ $? -eq 0 ]]; then echo "Backup created: $backup_file" # Compress backup gzip "$backup_file" echo "Backup compressed: $backup_file.gz" else echo "Backup failed" return 1 fi }

mysql_restore() { local backup_file="$1" if [[ ! -f "$backup_file" ]]; then echo "Backup file not found: $backup_file" return 1 fi # Build mysql command local mysql_cmd="mysql -h $mysql_host -P $mysql_port -u $mysql_user -p$mysql_password $mysql_db" # Restore database if [[ "$backup_file" == *.gz ]]; then gunzip -c "$backup_file" | $mysql_cmd else $mysql_cmd < "$backup_file" fi if [[ $? -eq 0 ]]; then echo "Database restored successfully" else echo "Database restore failed" return 1 fi }

SQLite Integration

#!/bin/bash

SQLite database integration

sqlite_integration() { local operation="$1" local query="$2" local params="$3" # SQLite configuration local sqlite_db="${db_name:-myapp.db}" case "$operation" in "query") sqlite_query "$query" "$params" ;; "execute") sqlite_execute "$query" "$params" ;; "transaction") sqlite_transaction "$query" ;; "backup") sqlite_backup ;; "restore") sqlite_restore "$params" ;; *) echo "Unknown SQLite operation: $operation" return 1 ;; esac }

sqlite_query() { local query="$1" local params="$2" # Build sqlite3 command local sqlite_cmd="sqlite3 -csv -header" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do query=$(echo "$query" | sed "s/\\?/$param/") done fi # Execute query local result=$(echo "$query" | $sqlite_cmd "$sqlite_db" 2>/dev/null) if [[ $? -eq 0 ]]; then echo "$result" return 0 else echo "Query failed" return 1 fi }

sqlite_execute() { local query="$1" local params="$2" # Build sqlite3 command for execution local sqlite_cmd="sqlite3" if [[ -n "$params" ]]; then # Handle parameterized queries local param_array=($params) for param in "${param_array[@]}"; do query=$(echo "$query" | sed "s/\\?/$param/") done fi # Execute query echo "$query" | $sqlite_cmd "$sqlite_db" 2>/dev/null return $? }

sqlite_transaction() { local queries="$1" # Build sqlite3 command local sqlite_cmd="sqlite3 $sqlite_db" # Start transaction echo "BEGIN TRANSACTION;" | $sqlite_cmd 2>/dev/null if [[ $? -ne 0 ]]; then echo "Failed to start transaction" return 1 fi # Execute queries local success=true while IFS= read -r query; do if [[ -n "$query" ]]; then echo "$query" | $sqlite_cmd 2>/dev/null if [[ $? -ne 0 ]]; then success=false break fi fi done <<< "$queries" if [[ "$success" == "true" ]]; then # Commit transaction echo "COMMIT;" | $sqlite_cmd 2>/dev/null echo "Transaction committed successfully" else # Rollback transaction echo "ROLLBACK;" | $sqlite_cmd 2>/dev/null echo "Transaction rolled back" return 1 fi }

sqlite_backup() { local backup_dir="${db_backup_dir:-/var/backups/sqlite}" local timestamp=$(date +%Y%m%d_%H%M%S) local backup_file="$backup_dir/${sqlite_db%.*}_$timestamp.db" # Create backup directory mkdir -p "$backup_dir" # Create backup sqlite3 "$sqlite_db" ".backup '$backup_file'" if [[ $? -eq 0 ]]; then echo "Backup created: $backup_file" # Compress backup gzip "$backup_file" echo "Backup compressed: $backup_file.gz" else echo "Backup failed" return 1 fi }

sqlite_restore() { local backup_file="$1" if [[ ! -f "$backup_file" ]]; then echo "Backup file not found: $backup_file" return 1 fi # Restore database if [[ "$backup_file" == *.gz ]]; then gunzip -c "$backup_file" > "$sqlite_db" else cp "$backup_file" "$sqlite_db" fi if [[ $? -eq 0 ]]; then echo "Database restored successfully" else echo "Database restore failed" return 1 fi }

🎯 Real-World Configuration Examples

Complete Database Configuration

database-config.tsk

database_config: type: postgresql host: localhost port: 5432 name: myapp user: myuser password: mypassword

#database: postgresql #db-type: postgresql #db-host: localhost #db-port: 5432 #db-name: myapp #db-user: myuser #db-password: mypassword

#db-pool-size: 10 #db-timeout: 30 #db-ssl: true #db-migrations: true #db-backup: true #db-monitoring: true

#db-config:

postgresql:

host: localhost

port: 5432

name: myapp

user: myuser

password: "${DB_PASSWORD}"

pool_size: 10

timeout: 30

ssl: true

ssl_mode: require

ssl_cert: /path/to/cert.pem

ssl_key: /path/to/key.pem

mysql:

host: localhost

port: 3306

name: myapp

user: myuser

password: "${DB_PASSWORD}"

charset: utf8mb4

collation: utf8mb4_unicode_ci

sqlite:

name: myapp.db

path: /var/lib/myapp

journal_mode: WAL

synchronous: NORMAL

backup:

enabled: true

schedule: "0 2 *"

retention: 30

compression: true

encryption: true

monitoring:

enabled: true

metrics:

- "connection_count"

- "query_execution_time"

- "slow_queries"

- "deadlocks"

alerts:

- condition: "connection_count > 80%"

action: "scale_connections"

- condition: "query_execution_time > 1000ms"

action: "optimize_queries"

Multi-Database Configuration

multi-db-config.tsk

multi_db_config: primary: type: postgresql host: db-primary.example.com port: 5432 name: myapp_prod user: app_user password: "${PRIMARY_DB_PASSWORD}" replica: type: postgresql host: db-replica.example.com port: 5432 name: myapp_prod user: app_user password: "${REPLICA_DB_PASSWORD}" cache: type: redis host: cache.example.com port: 6379 password: "${REDIS_PASSWORD}"

#db-primary: postgresql://app_user:${PRIMARY_DB_PASSWORD}@db-primary.example.com:5432/myapp_prod #db-replica: postgresql://app_user:${REPLICA_DB_PASSWORD}@db-replica.example.com:5432/myapp_prod #db-cache: redis://:${REDIS_PASSWORD}@cache.example.com:6379

#db-config:

primary:

type: postgresql

host: db-primary.example.com

port: 5432

name: myapp_prod

user: app_user

password: "${PRIMARY_DB_PASSWORD}"

pool_size: 20

ssl: true

replica:

type: postgresql

host: db-replica.example.com

port: 5432

name: myapp_prod

user: app_user

password: "${REPLICA_DB_PASSWORD}"

pool_size: 10

ssl: true

read_only: true

cache:

type: redis

host: cache.example.com

port: 6379

password: "${REDIS_PASSWORD}"

pool_size: 5

timeout: 5

load_balancing:

strategy: round_robin

health_check: true

failover: true

🚨 Troubleshooting Database Integration

Common Issues and Solutions

1. Connection Issues

Debug database connection

debug_database_connection() { local db_type="$1" echo "Debugging database connection for: $db_type" case "$db_type" in "postgresql") debug_postgresql_connection ;; "mysql") debug_mysql_connection ;; "sqlite") debug_sqlite_connection ;; *) echo "Unknown database type: $db_type" ;; esac }

debug_postgresql_connection() { echo "Testing PostgreSQL connection..." # Test basic connection if psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" -c "SELECT 1;" >/dev/null 2>&1; then echo "✓ PostgreSQL connection successful" # Test query execution local result=$(psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" -t -c "SELECT version();" 2>/dev/null) if [[ -n "$result" ]]; then echo "✓ Query execution successful" echo " Version: $result" else echo "✗ Query execution failed" fi else echo "✗ PostgreSQL connection failed" echo " Host: $pg_host" echo " Port: $pg_port" echo " Database: $pg_db" echo " User: $pg_user" fi }

debug_mysql_connection() { echo "Testing MySQL connection..." # Test basic connection if mysql -h "$mysql_host" -P "$mysql_port" -u "$mysql_user" -p"$mysql_password" "$mysql_db" -e "SELECT 1;" >/dev/null 2>&1; then echo "✓ MySQL connection successful" # Test query execution local result=$(mysql -h "$mysql_host" -P "$mysql_port" -u "$mysql_user" -p"$mysql_password" "$mysql_db" -N -e "SELECT VERSION();" 2>/dev/null) if [[ -n "$result" ]]; then echo "✓ Query execution successful" echo " Version: $result" else echo "✗ Query execution failed" fi else echo "✗ MySQL connection failed" echo " Host: $mysql_host" echo " Port: $mysql_port" echo " Database: $mysql_db" echo " User: $mysql_user" fi }

debug_sqlite_connection() { echo "Testing SQLite connection..." # Check if database file exists if [[ -f "$sqlite_db" ]]; then echo "✓ SQLite database file exists: $sqlite_db" # Test basic connection if sqlite3 "$sqlite_db" "SELECT 1;" >/dev/null 2>&1; then echo "✓ SQLite connection successful" # Test query execution local result=$(sqlite3 "$sqlite_db" "SELECT sqlite_version();" 2>/dev/null) if [[ -n "$result" ]]; then echo "✓ Query execution successful" echo " Version: $result" else echo "✗ Query execution failed" fi else echo "✗ SQLite connection failed" fi else echo "✗ SQLite database file not found: $sqlite_db" fi }

2. Performance Issues

Debug database performance

debug_database_performance() { local db_type="$1" echo "Debugging database performance for: $db_type" case "$db_type" in "postgresql") debug_postgresql_performance ;; "mysql") debug_mysql_performance ;; "sqlite") debug_sqlite_performance ;; esac }

debug_postgresql_performance() { echo "Testing PostgreSQL performance..." # Test query performance local start_time=$(date +%s%N) for i in {1..100}; do psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" -c "SELECT 1;" >/dev/null 2>&1 done local end_time=$(date +%s%N) local duration=$(( (end_time - start_time) / 1000000 )) echo " Query performance: 100 operations in ${duration}ms" # Check connection pool local active_connections=$(psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" -t -c "SELECT count(*) FROM pg_stat_activity;" 2>/dev/null) echo " Active connections: $active_connections" # Check slow queries local slow_queries=$(psql -h "$pg_host" -p "$pg_port" -U "$pg_user" -d "$pg_db" -t -c "SELECT count(*) FROM pg_stat_activity WHERE state = 'active' AND now() - query_start > interval '1 second';" 2>/dev/null) echo " Slow queries (>1s): $slow_queries" }

🔒 Security Best Practices

Database Security Checklist

Security validation

validate_database_security() { echo "Validating database security configuration..." # Check password configuration if [[ -n "$DB_PASSWORD" ]]; then echo "✓ Database password configured" if [[ ${#DB_PASSWORD} -ge 12 ]]; then echo "✓ Database password length adequate" else echo "⚠ Database password should be at least 12 characters" fi else echo "✗ Database password not configured" fi # Check SSL configuration if [[ "${db_ssl}" == "true" ]]; then echo "✓ Database SSL enabled" if [[ -n "${db_ssl_cert}" ]] && [[ -f "${db_ssl_cert}" ]]; then echo "✓ SSL certificate configured" else echo "⚠ SSL certificate not configured" fi else echo "⚠ Database SSL not enabled" fi # Check connection pooling if [[ -n "${db_pool_size}" ]]; then echo "✓ Connection pool configured: ${db_pool_size}" else echo "⚠ Connection pool not configured" fi # Check backup configuration if [[ "${db_backup}" == "true" ]]; then echo "✓ Database backup enabled" if [[ -n "${db_backup_encryption}" ]] && [[ "${db_backup_encryption}" == "true" ]]; then echo "✓ Backup encryption enabled" else echo "⚠ Backup encryption not enabled" fi else echo "⚠ Database backup not enabled" fi }

📈 Performance Optimization Tips

Database Performance Checklist

Performance validation

validate_database_performance() { echo "Validating database performance configuration..." # Check connection pool size if [[ -n "${db_pool_size}" ]]; then echo "✓ Connection pool size configured: ${db_pool_size}" if [[ "${db_pool_size}" -ge 5 ]] && [[ "${db_pool_size}" -le 50 ]]; then echo "✓ Connection pool size reasonable" else echo "⚠ Connection pool size should be between 5 and 50" fi else echo "⚠ Connection pool size not configured" fi # Check timeout configuration if [[ -n "${db_timeout}" ]]; then echo "✓ Connection timeout configured: ${db_timeout}s" else echo "⚠ Connection timeout not configured" fi # Check monitoring if [[ "${db_monitoring}" == "true" ]]; then echo "✓ Database monitoring enabled" else echo "⚠ Database monitoring not enabled" fi # Check query optimization if [[ "${db_query_optimization}" == "true" ]]; then echo "✓ Query optimization enabled" else echo "⚠ Query optimization not enabled" fi }

🎯 Next Steps

- Testing Database Integration: Learn about testing database functionality - Plugin Integration: Explore database plugins - Advanced Patterns: Understand complex database patterns - Performance Tuning: Optimize database performance - Migration Strategies: Plan database migrations

---

Database integration transforms your TuskLang configuration into a powerful data management system. They bring modern database capabilities to your Bash applications with intelligent connection management, automatic optimization, and comprehensive security policies!