🐚 Database Integration in TuskLang - Bash Guide
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/bashLoad 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/bashPostgreSQL 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/bashMySQL 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/bashSQLite 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!