Investigation and Documentation: - Discovered and documented test database system on AD2 server - Created comprehensive TEST_DATABASE_ARCHITECTURE.md with full system details - Retrieved all key database files from AD2 (import.js, schema.sql, server configs) - Documented data flow: DOS machines → NAS → AD2 → SQLite → Web interface - Verified database health: 1,027,517 records, 1075 MB, dates back to 1990 Database System Architecture: - SQLite database with Node.js/Express.js web server (port 3000) - Automated import via Sync-FromNAS.ps1 (runs every 15 minutes) - 8 log types supported: DSCLOG, 5BLOG, 7BLOG, 8BLOG, PWRLOG, SCTLOG, VASLOG, SHT - FTS5 full-text search, comprehensive indexes for performance - API endpoints: search, stats, export, datasheet generation Troubleshooting Scripts Created: - Database diagnostics: check-db-simple.ps1, test-db-directly.ps1 - Server status checks: check-node-running.ps1, check-db-server.ps1 - Performance analysis: check-db-performance.ps1, check-wal-files.ps1 - API testing: test-api-endpoint.ps1, test-query.js - Import monitoring: check-new-records.ps1 - Database optimization attempts: api-js-optimized.js, api-js-fixed.js - Deployment scripts: deploy-db-optimization.ps1, deploy-db-fix.ps1, restore-original.ps1 Key Findings: - Database file healthy and queryable (verified with test-query.js) - Node.js server not running (port 3000 closed) - root cause of web interface issues - Database last updated 8 days ago (01/13/2026) - automated sync may be broken - Attempted performance optimizations (WAL mode) incompatible with readonly connections - Original api.js restored from backup after optimization conflicts Retrieved Documentation: - QUICKSTART-retrieved.md: Quick start guide for database server - SESSION_NOTES-retrieved.md: Complete session notes from database creation - Sync-FromNAS-retrieved.ps1: Full sync script with database import logic - import-js-retrieved.js: Node.js import script (12,774 bytes) - schema-retrieved.sql: SQLite schema with FTS5 triggers - server-js-retrieved.js: Express.js server configuration - api-js-retrieved.js: API routes and endpoints - package-retrieved.json: Node.js dependencies Action Items Identified: 1. Start Node.js server on AD2 to restore web interface functionality 2. Investigate why automated sync hasn't updated database in 8 days 3. Check Windows Task Scheduler for Sync-FromNAS.ps1 scheduled task 4. Run manual import to catch up on 8 days of test data if needed Technical Details: - Database path: C:\Shares\testdatadb\database\testdata.db - Web interface: http://192.168.0.6:3000 (when running) - Database size: 1075.14 MB (1,127,362,560 bytes) - Total records: 1,027,517 (slight variance from original 1,030,940) - Pass rate: 99.82% (1,029,046 passed, 1,888 failed) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
449 lines
12 KiB
Markdown
449 lines
12 KiB
Markdown
# Dataforth Test Data Database - System Architecture
|
|
|
|
**Location:** C:\Shares\testdatadb\ (on AD2 server)
|
|
**Created:** 2026-01-13
|
|
**Purpose:** Consolidate and search 1M+ test records from DOS machines
|
|
**Last Retrieved:** 2026-01-21
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
A Node.js web application with SQLite database that consolidates test data from ~30 DOS QC machines. Data flows automatically from DOS machines through the NAS to AD2, where it's imported into the database every 15 minutes.
|
|
|
|
---
|
|
|
|
## System Architecture
|
|
|
|
### Technology Stack
|
|
- **Database:** SQLite 3 (better-sqlite3)
|
|
- **Server:** Node.js + Express.js (port 3000)
|
|
- **Import:** Automated via Sync-FromNAS.ps1 PowerShell script
|
|
- **Web UI:** HTML/JavaScript search interface
|
|
- **Parsers:** Custom parsers for multiple data formats
|
|
|
|
### Data Flow
|
|
```
|
|
DOS Machines (CTONW.BAT)
|
|
↓
|
|
NAS: /data/test/TS-XX/LOGS/[LOG_TYPE]/*.DAT
|
|
↓ (Every 15 minutes)
|
|
AD2: C:\Shares\test\TS-XX\LOGS\[LOG_TYPE]/*.DAT
|
|
↓ (Automated import via Node.js)
|
|
SQLite Database: C:\Shares\testdatadb\database\testdata.db
|
|
↓
|
|
Web Interface: http://localhost:3000
|
|
```
|
|
|
|
---
|
|
|
|
## Database Details
|
|
|
|
### File Location
|
|
`C:\Shares\testdatadb\database\testdata.db`
|
|
|
|
### Database Type
|
|
SQLite 3 (single-file database)
|
|
|
|
### Current Size
|
|
**1,030,940 records** (as of 2026-01-13)
|
|
|
|
### Table Schema
|
|
```sql
|
|
test_records (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
log_type TEXT NOT NULL, -- DSCLOG, 5BLOG, 7BLOG, 8BLOG, PWRLOG, SCTLOG, VASLOG, SHT
|
|
model_number TEXT NOT NULL, -- DSCA38-1793, SCM5B30-01, etc.
|
|
serial_number TEXT NOT NULL, -- 176923-1, 105840-2, etc.
|
|
test_date TEXT NOT NULL, -- YYYY-MM-DD format
|
|
test_station TEXT, -- TS-1L, TS-3R, etc.
|
|
overall_result TEXT, -- PASS/FAIL
|
|
raw_data TEXT, -- Full original record
|
|
source_file TEXT, -- Original file path
|
|
import_date TEXT DEFAULT (datetime('now')),
|
|
UNIQUE(log_type, model_number, serial_number, test_date, test_station)
|
|
)
|
|
```
|
|
|
|
### Indexes
|
|
- `idx_serial` - Fast lookup by serial number
|
|
- `idx_model` - Fast lookup by model number
|
|
- `idx_date` - Fast lookup by test date
|
|
- `idx_model_serial` - Combined model + serial lookup
|
|
- `idx_result` - Filter by PASS/FAIL
|
|
- `idx_log_type` - Filter by log type
|
|
|
|
### Full-Text Search
|
|
- FTS5 virtual table: `test_records_fts`
|
|
- Searches: serial_number, model_number, raw_data
|
|
- Automatic sync via triggers
|
|
|
|
---
|
|
|
|
## Import System
|
|
|
|
### Import Script
|
|
**Location:** `C:\Shares\testdatadb\database\import.js`
|
|
**Language:** Node.js
|
|
**Duration:** ~30 minutes for full import (1M+ records)
|
|
|
|
### Data Sources (Priority Order)
|
|
1. **HISTLOGS** - `C:\Shares\test\Ate\HISTLOGS\` (consolidated history)
|
|
- Authoritative source
|
|
- 576,416 records imported
|
|
2. **Recovery-TEST** - `C:\Shares\Recovery-TEST\` (backup dates)
|
|
- Multiple backup dates (12-13-25 to 12-18-25)
|
|
- 454,383 records imported from 12-18-25
|
|
3. **Live Data** - `C:\Shares\test\TS-XX\LOGS\`
|
|
- Current test station logs
|
|
- 59 records imported (rest are duplicates)
|
|
|
|
### Automated Import (via Sync-FromNAS.ps1)
|
|
**Configuration in Sync-FromNAS.ps1 (lines 46-48):**
|
|
```powershell
|
|
$IMPORT_SCRIPT = "C:\Shares\testdatadb\database\import.js"
|
|
$NODE_PATH = "node"
|
|
```
|
|
|
|
**Import Function (lines 122-141):**
|
|
```powershell
|
|
function Import-ToDatabase {
|
|
param([string[]]$FilePaths)
|
|
|
|
if ($FilePaths.Count -eq 0) { return }
|
|
|
|
Write-Log "Importing $($FilePaths.Count) file(s) to database..."
|
|
|
|
# Build argument list
|
|
$args = @("$IMPORT_SCRIPT", "--file") + $FilePaths
|
|
|
|
try {
|
|
$output = & $NODE_PATH $args 2>&1
|
|
foreach ($line in $output) {
|
|
Write-Log " [DB] $line"
|
|
}
|
|
Write-Log "Database import complete"
|
|
} catch {
|
|
Write-Log "ERROR: Database import failed: $_"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Trigger:** Every 15 minutes when new DAT files are synced from NAS
|
|
**Process:** Sync-FromNAS.ps1 → import.js --file [file1] [file2] ... → SQLite insert
|
|
|
|
---
|
|
|
|
## Supported Log Types
|
|
|
|
| Log Type | Description | Format | Parser | Records |
|
|
|----------|-------------|--------|--------|---------|
|
|
| 5BLOG | 5B product line | Multi-line DAT | multiline | 425,378 |
|
|
| 7BLOG | 7B product line | CSV DAT | csvline | 262,404 |
|
|
| DSCLOG | DSC product line | Multi-line DAT | multiline | 181,160 |
|
|
| 8BLOG | 8B product line | Multi-line DAT | multiline | 135,858 |
|
|
| PWRLOG | Power tests | Multi-line DAT | multiline | 12,374 |
|
|
| VASLOG | VAS tests | Multi-line DAT | multiline | 10,327 |
|
|
| SCTLOG | SCT product line | Multi-line DAT | multiline | 3,439 |
|
|
| SHT | Test sheets | SHT format | shtfile | (varies) |
|
|
|
|
---
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
C:\Shares\testdatadb/
|
|
├── database/
|
|
│ ├── testdata.db # SQLite database (1M+ records)
|
|
│ ├── import.js # Import script (12,774 bytes)
|
|
│ └── schema.sql # Database schema with FTS5
|
|
├── parsers/
|
|
│ ├── multiline.js # Parser for multi-line DAT files
|
|
│ ├── csvline.js # Parser for 7BLOG CSV format
|
|
│ └── shtfile.js # Parser for SHT test sheets
|
|
├── public/
|
|
│ └── index.html # Web search interface
|
|
├── routes/
|
|
│ └── api.js # API endpoints
|
|
├── templates/
|
|
│ └── datasheet.js # Datasheet generator
|
|
├── node_modules/ # Dependencies
|
|
├── package.json # Node.js project file (342 bytes)
|
|
├── package-lock.json # Dependency lock file (43,983 bytes)
|
|
├── server.js # Express.js server (1,443 bytes)
|
|
├── QUICKSTART.md # Quick start guide (1,019 bytes)
|
|
├── SESSION_NOTES.md # Complete session notes (4,788 bytes)
|
|
└── start-server.bat # Windows startup script (97 bytes)
|
|
```
|
|
|
|
---
|
|
|
|
## Web Interface
|
|
|
|
### Starting the Server
|
|
```bash
|
|
cd C:\Shares\testdatadb
|
|
node server.js
|
|
```
|
|
**Access:** http://localhost:3000 (on AD2)
|
|
|
|
### API Endpoints
|
|
|
|
**Search:**
|
|
```
|
|
GET /api/search?serial=...&model=...&from=...&to=...&result=...&q=...
|
|
```
|
|
- `serial` - Serial number (partial match)
|
|
- `model` - Model number (partial match)
|
|
- `from` - Start date (YYYY-MM-DD)
|
|
- `to` - End date (YYYY-MM-DD)
|
|
- `result` - PASS or FAIL
|
|
- `q` - Full-text search in raw data
|
|
|
|
**Record Details:**
|
|
```
|
|
GET /api/record/:id
|
|
```
|
|
|
|
**Generate Datasheet:**
|
|
```
|
|
GET /api/datasheet/:id
|
|
```
|
|
|
|
**Database Statistics:**
|
|
```
|
|
GET /api/stats
|
|
```
|
|
|
|
**Export to CSV:**
|
|
```
|
|
GET /api/export?format=csv
|
|
```
|
|
|
|
---
|
|
|
|
## Database Statistics (as of 2026-01-13)
|
|
|
|
### Total Records
|
|
**1,030,940 records**
|
|
|
|
### Date Range
|
|
**1990 to November 2025** (35 years of test data)
|
|
|
|
### Pass/Fail Distribution
|
|
- **PASS:** 1,029,046 (99.82%)
|
|
- **FAIL:** 1,888 (0.18%)
|
|
- **UNKNOWN:** 6 (0.0006%)
|
|
|
|
### Test Stations
|
|
TS-1L, TS-3R, TS-4L, TS-4R, TS-8R, TS-10L, TS-11L, and others
|
|
|
|
---
|
|
|
|
## Manual Operations
|
|
|
|
### Full Re-Import (if needed)
|
|
```bash
|
|
cd C:\Shares\testdatadb
|
|
del database\testdata.db
|
|
node database\import.js
|
|
```
|
|
**Duration:** ~30 minutes
|
|
**When needed:** Parser updates, schema changes, corruption recovery
|
|
|
|
### Incremental Import (single file)
|
|
```bash
|
|
node database\import.js --file C:\Shares\test\TS-4R\LOGS\8BLOG\test.DAT
|
|
```
|
|
|
|
### Incremental Import (multiple files)
|
|
```bash
|
|
node database\import.js --file file1.DAT file2.DAT file3.DAT
|
|
```
|
|
This is the method used by Sync-FromNAS.ps1
|
|
|
|
---
|
|
|
|
## Integration with DOS Update System
|
|
|
|
### CTONW.BAT (v1.2+)
|
|
**Purpose:** Upload test data from DOS machines to NAS
|
|
|
|
**Test Data Upload (lines 234-272):**
|
|
```batch
|
|
ECHO [3/3] Uploading test data to LOGS...
|
|
|
|
REM Create log subdirectories
|
|
IF NOT EXIST %LOGSDIR%\8BLOG\NUL MD %LOGSDIR%\8BLOG
|
|
IF NOT EXIST %LOGSDIR%\DSCLOG\NUL MD %LOGSDIR%\DSCLOG
|
|
IF NOT EXIST %LOGSDIR%\HVLOG\NUL MD %LOGSDIR%\HVLOG
|
|
IF NOT EXIST %LOGSDIR%\PWRLOG\NUL MD %LOGSDIR%\PWRLOG
|
|
IF NOT EXIST %LOGSDIR%\RMSLOG\NUL MD %LOGSDIR%\RMSLOG
|
|
IF NOT EXIST %LOGSDIR%\7BLOG\NUL MD %LOGSDIR%\7BLOG
|
|
|
|
REM Upload test data files to appropriate log folders
|
|
IF EXIST C:\ATE\8BDATA\NUL XCOPY C:\ATE\8BDATA\*.DAT %LOGSDIR%\8BLOG\ /Y /Q
|
|
IF EXIST C:\ATE\DSCDATA\NUL XCOPY C:\ATE\DSCDATA\*.DAT %LOGSDIR%\DSCLOG\ /Y /Q
|
|
IF EXIST C:\ATE\HVDATA\NUL XCOPY C:\ATE\HVDATA\*.DAT %LOGSDIR%\HVLOG\ /Y /Q
|
|
IF EXIST C:\ATE\PWRDATA\NUL XCOPY C:\ATE\PWRDATA\*.DAT %LOGSDIR%\PWRLOG\ /Y /Q
|
|
IF EXIST C:\ATE\RMSDATA\NUL XCOPY C:\ATE\RMSDATA\*.DAT %LOGSDIR%\RMSLOG\ /Y /Q
|
|
IF EXIST C:\ATE\7BDATA\NUL XCOPY C:\ATE\7BDATA\*.DAT %LOGSDIR%\7BLOG\ /Y /Q
|
|
```
|
|
|
|
**Target:** `T:\TS-4R\LOGS\8BLOG\` (on NAS)
|
|
|
|
### Sync-FromNAS.ps1
|
|
**Schedule:** Every 15 minutes via Windows Task Scheduler
|
|
**PULL Operation (lines 157-213):**
|
|
1. Find new DAT files on NAS (modified in last 24 hours)
|
|
2. Copy to AD2: `C:\Shares\test\TS-XX\LOGS\[LOG_TYPE]\`
|
|
3. Import to database via `import.js --file [files]`
|
|
4. Delete from NAS after successful import
|
|
|
|
**Result:** Test data flows automatically from DOS → NAS → AD2 → Database
|
|
|
|
---
|
|
|
|
## Deduplication
|
|
|
|
**Unique Key:** (log_type, model_number, serial_number, test_date, test_station)
|
|
|
|
**Effect:** Same test result imported multiple times (from HISTLOGS, Recovery backups, live data) is stored only once
|
|
|
|
**Example:**
|
|
```
|
|
Record in HISTLOGS: DSCLOG, DSCA38-1793, 173672-1, 2025-02-15, TS-4R
|
|
Same record in Recovery-TEST/12-18-25: DSCLOG, DSCA38-1793, 173672-1, 2025-02-15, TS-4R
|
|
Result: Only 1 record in database
|
|
```
|
|
|
|
---
|
|
|
|
## Search Examples
|
|
|
|
### By Serial Number
|
|
```
|
|
http://localhost:3000/api/search?serial=176923
|
|
```
|
|
Returns all records with serial numbers containing "176923"
|
|
|
|
### By Model Number
|
|
```
|
|
http://localhost:3000/api/search?model=DSCA38-1793
|
|
```
|
|
Returns all records for model DSCA38-1793
|
|
|
|
### By Date Range
|
|
```
|
|
http://localhost:3000/api/search?from=2025-01-01&to=2025-12-31
|
|
```
|
|
Returns all records tested in 2025
|
|
|
|
### By Pass/Fail Status
|
|
```
|
|
http://localhost:3000/api/search?result=FAIL
|
|
```
|
|
Returns all failed tests (1,888 records)
|
|
|
|
### Full-Text Search
|
|
```
|
|
http://localhost:3000/api/search?q=voltage
|
|
```
|
|
Searches within raw test data for "voltage"
|
|
|
|
### Combined Search
|
|
```
|
|
http://localhost:3000/api/search?model=DSCA38&result=PASS&from=2025-01-01
|
|
```
|
|
All passed tests for DSCA38 models since Jan 1, 2025
|
|
|
|
---
|
|
|
|
## Known Issues
|
|
|
|
### Model Number Parsing
|
|
- Parser was updated after initial import
|
|
- To fix: Delete testdata.db and re-run full import
|
|
- Impact: Model number searches may not be accurate for all records
|
|
|
|
### Performance
|
|
- Full import: ~30 minutes
|
|
- Database file: ~112 KB (compressed by SQLite)
|
|
- Search performance: Very fast (indexed queries)
|
|
|
|
---
|
|
|
|
## Maintenance
|
|
|
|
### Regular Tasks
|
|
- **None required** - Database updates automatically via Sync-FromNAS.ps1
|
|
|
|
### Occasional Tasks
|
|
- **Re-import** - If parser updates or schema changes (delete testdata.db and re-run)
|
|
- **Backup** - Copy testdata.db to backup location periodically
|
|
|
|
### Monitoring
|
|
- Check Sync-FromNAS.ps1 log: `C:\Shares\test\scripts\sync-from-nas.log`
|
|
- Check sync status: `C:\Shares\test\_SYNC_STATUS.txt`
|
|
- View database stats: http://localhost:3000/api/stats (when server running)
|
|
|
|
---
|
|
|
|
## Original Use Case (2026-01-13)
|
|
|
|
**Request:** Search for serial numbers 176923-1 through 176923-26 for model DSCA38-1793
|
|
|
|
**Result:** **NOT FOUND** - These devices haven't been tested yet
|
|
|
|
**Most Recent Serials:** 173672-x, 173681-x (February 2025)
|
|
|
|
**Outcome:** Database created to enable easy searching of 1M+ test records going back to 1990
|
|
|
|
---
|
|
|
|
## Dependencies (from package.json)
|
|
|
|
- **better-sqlite3** - Fast SQLite database
|
|
- **express** - Web server framework
|
|
- **csv-writer** - CSV export functionality
|
|
- **Node.js** - Required to run the application
|
|
|
|
---
|
|
|
|
## Connection Information
|
|
|
|
**Server:** AD2 (192.168.0.6)
|
|
**Database Path:** C:\Shares\testdatadb\database\testdata.db
|
|
**Web Server Port:** 3000 (http://localhost:3000 when running)
|
|
**Access:** Local only (on AD2 server)
|
|
|
|
**To Access:**
|
|
1. SSH or RDP to AD2 (192.168.0.6)
|
|
2. Start server: `cd C:\Shares\testdatadb && node server.js`
|
|
3. Open browser: http://localhost:3000
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
**In ClaudeTools:**
|
|
- `CTONW_V1.2_CHANGELOG.md` - Test data routing to LOGS folders
|
|
- `DOS_DEPLOYMENT_STATUS.md` - Database import workflow
|
|
- `Sync-FromNAS-retrieved.ps1` - Complete sync script with database import
|
|
- `import-js-retrieved.js` - Complete import script
|
|
- `schema-retrieved.sql` - Database schema
|
|
- `QUICKSTART-retrieved.md` - Quick start guide
|
|
- `SESSION_NOTES-retrieved.md` - Complete session notes
|
|
|
|
**On AD2:**
|
|
- `C:\Shares\testdatadb\QUICKSTART.md`
|
|
- `C:\Shares\testdatadb\SESSION_NOTES.md`
|
|
- `C:\Shares\test\scripts\Sync-FromNAS.ps1`
|
|
|
|
---
|
|
|
|
**Created:** 2026-01-13
|
|
**Last Updated:** 2026-01-21
|
|
**Status:** Production - Operational
|
|
**Automation:** Complete (test data imports automatically every 15 minutes)
|