Skip to content

PostgreSQL ​

Production-grade PostgreSQL adapter with connection pooling.

Installation ​

Install PostgreSQL driver:

bash
npm install pg
npm install tonl-mcp-bridge

Configuration ​

typescript
import { PostgresAdapter } from 'tonl-mcp-bridge';

const db = new PostgresAdapter({
  host: 'localhost',
  port: 5432,
  database: 'myapp',
  user: 'admin',
  password: 'your-password'
});

await db.connect();

Connection Pooling ​

Built-in connection pooling (10 connections default):

typescript
const db = new PostgresAdapter({
  host: 'localhost',
  port: 5432,
  database: 'myapp',
  user: 'admin',
  password: 'password',
  max: 20,  // Maximum pool size
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000
});

Query Execution ​

Parameterized Queries ​

typescript
const result = await db.query(
  'SELECT * FROM users WHERE age > $1 AND status = $2',
  [25, 'active']
);

With TONL Conversion ​

typescript
const result = await db.queryWithStats(
  'SELECT * FROM orders WHERE created_at > $1',
  'orders',
  { model: 'gpt-5' }
);

console.log(`Retrieved ${result.rowCount} orders`);
console.log(`Saved ${result.stats.savingsPercent}% tokens`);

Batch Operations ​

Process multiple queries efficiently:

typescript
const results = await db.batchQueryWithStats([
  { sql: 'SELECT * FROM users', name: 'users' },
  { sql: 'SELECT * FROM orders', name: 'orders' },
  { sql: 'SELECT * FROM products', name: 'products' }
], { model: 'gpt-5' });

console.log(`Total queries: ${results.aggregate.totalQueries}`);
console.log(`Total rows: ${results.aggregate.totalRows}`);
console.log(`Total saved: ${results.aggregate.savedTokens} tokens`);
console.log(`Average savings: ${results.aggregate.savingsPercent}%`);

Query Analysis ​

Analyze before execution:

typescript
const analysis = await db.analyzeQuery(
  'SELECT * FROM large_table',
  'data'
);

console.log(`Estimated rows: ${analysis.estimatedRows}`);
console.log(`JSON tokens: ${analysis.estimatedJsonTokens}`);
console.log(`TONL tokens: ${analysis.estimatedTonlTokens}`);
console.log(`Savings: ${analysis.potentialSavingsPercent}%`);
console.log(`Cost impact: ${analysis.costImpact}`);

if (analysis.recommendation === 'use-tonl') {
  const result = await db.queryToTonl(sql, name);
}

Schema Monitoring ​

Track production schema changes:

typescript
// Initial baseline
await db.trackSchema('users');

// Daily check
const drift = await db.detectSchemaDrift('users');

if (drift.hasChanged) {
  console.log(`Schema drift detected on users table`);
  console.log(`New columns: ${drift.newColumns.join(', ')}`);
  console.log(`Removed: ${drift.removedColumns.join(', ')}`);
  console.log(`Savings impact: ${drift.savingsImpact}%`);
  
  if (Math.abs(drift.savingsImpact) > 10) {
    // Alert team
    console.warn(drift.recommendation);
  }
  
  await db.updateSchemaBaseline('users');
}

Production Examples ​

RAG System Integration ​

typescript
async function retrieveContext(query: string) {
  const db = new PostgresAdapter(config);
  await db.connect();
  
  try {
    const result = await db.queryWithStats(
      `SELECT id, content, metadata 
       FROM documents 
       WHERE content ILIKE $1 
       LIMIT 10`,
      'documents'
    );
    
    return {
      context: result.tonl,
      tokensSaved: result.stats.savedTokens
    };
  } finally {
    await db.disconnect();
  }
}

Analytics Pipeline ​

typescript
async function dailyReport() {
  const db = new PostgresAdapter(config);
  await db.connect();
  
  const results = await db.batchQueryWithStats([
    {
      sql: `SELECT * FROM daily_stats 
            WHERE date = CURRENT_DATE`,
      name: 'daily_stats'
    },
    {
      sql: `SELECT * FROM user_activity 
            WHERE date = CURRENT_DATE`,
      name: 'user_activity'
    }
  ]);
  
  console.log(`Report cost: ${results.aggregate.savedTokens} tokens saved`);
  
  await db.disconnect();
}

Connection Management ​

Automatic Reconnection ​

The adapter handles connection drops automatically.

Graceful Shutdown ​

typescript
process.on('SIGTERM', async () => {
  await db.disconnect();
  process.exit(0);
});

Health Checks ​

typescript
if (db.isConnected()) {
  // Database ready
}

Best Practices ​

  1. Use connection pooling for concurrent requests
  2. Parameterize queries to prevent SQL injection
  3. Monitor schema drift in production
  4. Analyze queries before deploying
  5. Close connections properly
  6. Use transactions for multi-step operations

Performance Tuning ​

Indexes ​

sql
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_orders_created_at ON orders(created_at);

Query Optimization ​

typescript
// Inefficient
const all = await db.query('SELECT * FROM users');

// Efficient
const needed = await db.query(
  'SELECT id, name, email FROM users WHERE active = true'
);

Batch Size ​

typescript
// Process in chunks
const limit = 100;
const offset = 0;

const result = await db.queryWithStats(
  `SELECT * FROM logs 
   ORDER BY created_at DESC 
   LIMIT ${limit} OFFSET ${offset}`,
  'logs'
);

Troubleshooting ​

Connection Timeout ​

Increase timeout:

typescript
connectionTimeoutMillis: 5000

Pool Exhaustion ​

Increase pool size:

typescript
max: 30

Slow Queries ​

Use query analysis:

typescript
const analysis = await db.analyzeQuery(sql);
if (analysis.estimatedRows > 10000) {
  // Consider pagination
}

MIT Licensed | v1.0.0