Skip to content

Commit 81c33da

Browse files
authored
Ensure db directory exists (#254)
* Ensure db directory exists. * Add tests.
1 parent 22926ee commit 81c33da

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

pkg/db/db.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"embed"
66
"errors"
77
"fmt"
8+
"os"
89
"path/filepath"
910

1011
"github.com/golang-migrate/migrate/v4"
@@ -60,6 +61,8 @@ func New(opts ...Option) (DAO, error) {
6061
o.dbFile = dbFile
6162
}
6263

64+
ensureDirectoryExists(o.dbFile)
65+
6366
db, err := sql.Open("sqlite", "file:"+o.dbFile+"?_pragma=busy_timeout(5000)&_pragma=foreign_keys(ON)")
6467
if err != nil {
6568
return nil, fmt.Errorf("failed to open database: %w", err)
@@ -102,6 +105,13 @@ func DefaultDatabaseFilename() (string, error) {
102105
return filepath.Join(homeDir, ".docker", "mcp", "mcp-toolkit.db"), nil
103106
}
104107

108+
func ensureDirectoryExists(path string) {
109+
dir := filepath.Dir(path)
110+
if _, err := os.Stat(dir); os.IsNotExist(err) {
111+
_ = os.MkdirAll(dir, 0o755)
112+
}
113+
}
114+
105115
func txClose(tx *sqlx.Tx, err *error) {
106116
if err == nil || *err == nil {
107117
return

pkg/db/db_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package db
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestNewCreatesDirectoryWhenNotExists(t *testing.T) {
13+
// Create a temporary directory for testing
14+
tempDir := t.TempDir()
15+
16+
// Create a nested path that doesn't exist yet
17+
nonExistentDir := filepath.Join(tempDir, "nested", "directories", "that", "dont", "exist")
18+
dbFile := filepath.Join(nonExistentDir, "test.db")
19+
20+
// Verify the directory doesn't exist before creating the database
21+
_, err := os.Stat(nonExistentDir)
22+
assert.True(t, os.IsNotExist(err), "Directory should not exist before database creation")
23+
24+
// Create the database - this should create the directory
25+
dao, err := New(WithDatabaseFile(dbFile))
26+
require.NoError(t, err)
27+
require.NotNil(t, dao)
28+
29+
// Verify the directory was created
30+
stat, err := os.Stat(nonExistentDir)
31+
require.NoError(t, err, "Directory should exist after database creation")
32+
assert.True(t, stat.IsDir(), "Created path should be a directory")
33+
}

0 commit comments

Comments
 (0)