mikopbx / sqlite-inspector
Install for your project team
Run this command in your project directory to install the skill for your entire team:
mkdir -p .claude/skills/sqlite-inspector && curl -L -o skill.zip "https://fastmcp.me/Skills/Download/375" && unzip -o skill.zip -d .claude/skills/sqlite-inspector && rm skill.zip
Project Skills
This skill will be saved in .claude/skills/sqlite-inspector/ and checked into git. All team members will have access to it automatically.
Important: Please verify the skill by reviewing its instructions before using it.
Проверка консистентности данных в SQLite баз данных MikoPBX после операций REST API. Использовать при валидации результатов API, отладке проблем с данными, проверке связей внешних ключей или инспектировании CDR записей для тестирования.
35 views
0 installs
Skill Content
---
name: sqlite-inspector
description: Проверка консистентности данных в SQLite базах данных MikoPBX после операций REST API. Использовать при валидации результатов API, отладке проблем с данными, проверке связей внешних ключей или инспектировании CDR записей для тестирования.
allowed-tools: Bash, Read, Grep, Glob
---
# MikoPBX SQLite Database Inspecting
Quick database verification for MikoPBX after REST API operations to ensure data consistency and referential integrity.
## What This Skill Does
- ✅ Verifies REST API results are correctly persisted in database
- ✅ Validates foreign key relationships and referential integrity
- ✅ Checks data consistency against model schemas
- ✅ Inspects CDR (Call Detail Records) for call routing verification
- ✅ Debugs data issues at the lowest database level
## When to Use
Use this skill when you need to:
- **After API operations** - Verify create/update/delete operations modified database correctly
- **Debugging data issues** - Investigate inconsistencies between API responses and database state
- **Before integration tests** - Ensure database is in expected state
- **Validating foreign keys** - Check relationships between tables are correct
- **Inspecting CDR records** - Query call history for testing routing and recording
## How It Works
All queries execute inside the MikoPBX Docker container using `docker exec` with `sqlite3`:
```bash
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT * FROM m_Extensions LIMIT 5"
```
## Available Databases
### Main Database: `/cf/conf/mikopbx.db`
Primary configuration database containing:
- Extensions (SIP/IAX, queues, IVR, conferences)
- Users and authentication
- Routing rules (incoming/outgoing)
- Providers (SIP/IAX trunks)
- Security settings (firewall, fail2ban, network filters)
### CDR Database: Location varies
Call detail records database:
- `cdr_general` - Historical call records
- `cdr` - Active calls
---
## Quick Start
### 1. Get Container ID
```bash
# List MikoPBX containers
docker ps | grep mikopbx
# Or use auto-detection script
./scripts/db_query.sh "SELECT 1"
```
### 2. Execute Simple Query
```bash
# Using docker exec directly
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -header -column
# Using helper script
./scripts/db_query.sh "SELECT * FROM m_Extensions LIMIT 5"
```
### 3. Common Output Formats
```bash
# Column format (default, readable)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -header -column
# JSON format (for scripts)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -json
# CSV export
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions" -csv -header > extensions.csv
```
---
## Top 5 Common Verification Patterns
### 1. Verify Extension Creation
After creating extension via API:
```bash
# Check extension exists
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT number, type, callerid, userid FROM m_Extensions WHERE number='100'" \
-header -column
# Check SIP account created (for SIP extensions)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT extension, secret, transport FROM m_Sip WHERE extension='100'" \
-header -column
# Verify complete profile with foreign keys
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT e.number, e.type, e.callerid, u.username, u.email, s.secret
FROM m_Extensions e
LEFT JOIN m_Users u ON e.userid = u.id
LEFT JOIN m_Sip s ON e.number = s.extension
WHERE e.number='100'" \
-header -column
```
**Expected**: All fields populated, foreign keys valid (no NULLs for required relationships)
---
### 2. Verify Provider Configuration
After creating/updating provider:
```bash
# Check provider record
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT uniqid, type, description, host, disabled FROM m_Providers
WHERE uniqid='PROVIDER_ID'" -header -column
# Verify routing rules exist
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT
(SELECT COUNT(*) FROM m_IncomingRoutingTable WHERE provider='PROVIDER_ID') as incoming,
(SELECT COUNT(*) FROM m_OutgoingRoutingTable WHERE providerid='PROVIDER_ID') as outbound"
```
**Expected**: Provider exists, has at least one routing rule
---
### 3. Verify Queue Configuration
After creating/modifying queue:
```bash
# Check queue with members
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT cq.name, cq.extension, cq.strategy,
e.number as member_ext, e.callerid as member_name,
cqm.priority
FROM m_CallQueues cq
LEFT JOIN m_CallQueueMembers cqm ON cq.uniqid = cqm.queue
LEFT JOIN m_Extensions e ON cqm.extension = e.number
WHERE cq.uniqid='QUEUE_ID'
ORDER BY cqm.priority" -header -column
```
**Expected**: Queue exists, all members have valid extensions, priorities are correct
---
### 4. Check Data Consistency (Find Orphans)
Find broken foreign key relationships:
```bash
# Orphaned SIP accounts (no matching extension)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT s.extension FROM m_Sip s
LEFT JOIN m_Extensions e ON s.extension = e.number
WHERE e.number IS NULL"
# SIP extensions without accounts
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT e.number FROM m_Extensions e
LEFT JOIN m_Sip s ON e.number = s.extension
WHERE e.type='SIP' AND s.extension IS NULL"
# Routing rules pointing to non-existent extensions
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT ir.number, ir.extension FROM m_IncomingRoutingTable ir
LEFT JOIN m_Extensions e ON ir.extension = e.number
WHERE ir.action='extension' AND e.number IS NULL"
```
**Expected**: No results (empty) - indicates data integrity is maintained
---
### 5. Query CDR Records
Verify call routing and recording:
```bash
# Calls for specific extension (last 20)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT start, src_num, dst_num, duration, billsec, disposition
FROM cdr_general
WHERE src_num = '100' OR dst_num = '100'
ORDER BY start DESC
LIMIT 20" -header -column
# Answered calls today
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT COUNT(*) as total_calls, SUM(billsec) as total_duration
FROM cdr_general
WHERE DATE(start) = DATE('now')
AND disposition = 'ANSWERED'"
# Active calls right now
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT src_num, dst_num, start, duration FROM cdr
WHERE endtime IS NULL OR endtime = ''" -header -column
```
**Expected**: Call records match expected call flow
---
## Key Tables Reference
### Core Tables
- **m_Extensions** - All phone numbers (SIP, queues, IVR, conferences)
- **m_Sip** - SIP account configurations
- **m_Users** - User accounts and profiles
- **m_Providers** - SIP/IAX trunks
### Routing
- **m_IncomingRoutingTable** - DID/incoming routes
- **m_OutgoingRoutingTable** - Outbound routes
### Call Features
- **m_CallQueues** + **m_CallQueueMembers** - Call queues
- **m_ConferenceRooms** - Conference rooms
- **m_IvrMenu** + **m_IvrMenuActions** - IVR menus
### Security
- **m_NetworkFilters** - IP-based restrictions
- **m_FirewallRules** - Firewall rules
- **m_Fail2BanRules** - Intrusion prevention
### CDR
- **cdr_general** - Historical call records
- **cdr** - Active calls
For complete schema with all columns and relationships, see [Schema Reference](reference/schema-reference.md)
---
## Helper Script Usage
The `scripts/db_query.sh` helper script simplifies queries:
```bash
# Auto-detect container
./scripts/db_query.sh "SELECT * FROM m_Extensions LIMIT 5"
# Specify container
./scripts/db_query.sh -c abc123 "SELECT * FROM m_Users"
# JSON output
./scripts/db_query.sh -f json "SELECT * FROM m_Extensions"
# CSV export
./scripts/db_query.sh -f csv "SELECT * FROM m_Extensions" > extensions.csv
# Different database (CDR)
./scripts/db_query.sh -d /storage/usbdisk1/mikopbx/astlogs/asterisk_cdr/master.db \
"SELECT * FROM cdr LIMIT 10"
# Show help
./scripts/db_query.sh --help
```
---
## Troubleshooting
### Database Locked Error
```bash
# Check processes using database
docker exec <container_id> lsof /cf/conf/mikopbx.db
# Use read-only mode
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions" -readonly
```
### Permission Denied
```bash
# Run as root
docker exec -u root <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT 1"
```
### Database Not Found
```bash
# Verify database exists
docker exec <container_id> ls -l /cf/conf/mikopbx.db
# Find CDR database location
docker exec <container_id> find /storage -name "*.db"
```
---
## Additional Resources
### Complete Documentation
- **[Schema Reference](reference/schema-reference.md)** - Complete table definitions, columns, foreign keys, enum values
- **[Common Queries](reference/common-queries.md)** - SQL query patterns library with 50+ examples
- **[Verification Scenarios](reference/verification-scenarios.md)** - Step-by-step verification workflows for all entity types
### Related Resources
- **Model Documentation** - `/Users/nb/PhpstormProjects/mikopbx/Core/src/Common/Models/CLAUDE.md`
- **REST API Documentation** - `/Users/nb/PhpstormProjects/mikopbx/Core/src/PBXCoreREST/CLAUDE.md`
---
## Tips & Best Practices
1. **Always use `-header -column`** for readable output during development
2. **Use `-json`** for scripting and automation
3. **Check both directions** of relationships (e.g., extension→user AND user→extensions)
4. **Use LEFT JOIN** to detect missing foreign key relationships
5. **Export to CSV** for complex analysis in spreadsheets
6. **Quote queries properly** - use double quotes for entire query
7. **Limit large queries** - Use `LIMIT` for tables like CDR
8. **Verify enum values** - Check DISTINCT values match expected enums
---
## Quick Commands Cheat Sheet
```bash
# List all tables
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db ".tables"
# Show table schema
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db ".schema m_Extensions"
# Count records
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT COUNT(*) FROM m_Extensions"
# Interactive mode
docker exec -it <container_id> sqlite3 /cf/conf/mikopbx.db
```
---
**Need more examples?** See [Common Queries](reference/common-queries.md) for 50+ query patterns.
**Need verification workflows?** See [Verification Scenarios](reference/verification-scenarios.md) for complete step-by-step guides.