Browse code

graphdb: initialize the database semi-idempotently on every connection.

Docker-DCO-1.1-Signed-off-by: Erik Hollensbe <github@hollensbe.org> (github: erikh)

Erik Hollensbe authored on 2014/12/02 20:02:25
Showing 3 changed files
... ...
@@ -4,31 +4,15 @@ package graphdb
4 4
 
5 5
 import (
6 6
 	"database/sql"
7
-	"os"
8 7
 
9 8
 	_ "code.google.com/p/gosqlite/sqlite3" // registers sqlite
10 9
 )
11 10
 
12 11
 func NewSqliteConn(root string) (*Database, error) {
13
-	initDatabase := false
14
-
15
-	stat, err := os.Stat(root)
16
-	if err != nil {
17
-		if os.IsNotExist(err) {
18
-			initDatabase = true
19
-		} else {
20
-			return nil, err
21
-		}
22
-	}
23
-
24
-	if stat != nil && stat.Size() == 0 {
25
-		initDatabase = true
26
-	}
27
-
28 12
 	conn, err := sql.Open("sqlite3", root)
29 13
 	if err != nil {
30 14
 		return nil, err
31 15
 	}
32 16
 
33
-	return NewDatabase(conn, initDatabase)
17
+	return NewDatabase(conn)
34 18
 }
... ...
@@ -73,45 +73,55 @@ func IsNonUniqueNameError(err error) bool {
73 73
 }
74 74
 
75 75
 // Create a new graph database initialized with a root entity
76
-func NewDatabase(conn *sql.DB, init bool) (*Database, error) {
76
+func NewDatabase(conn *sql.DB) (*Database, error) {
77 77
 	if conn == nil {
78 78
 		return nil, fmt.Errorf("Database connection cannot be nil")
79 79
 	}
80 80
 	db := &Database{conn: conn}
81 81
 
82
-	if init {
83
-		if _, err := conn.Exec(createEntityTable); err != nil {
84
-			return nil, err
85
-		}
86
-		if _, err := conn.Exec(createEdgeTable); err != nil {
87
-			return nil, err
88
-		}
89
-		if _, err := conn.Exec(createEdgeIndices); err != nil {
90
-			return nil, err
91
-		}
82
+	if _, err := conn.Exec(createEntityTable); err != nil {
83
+		return nil, err
84
+	}
85
+	if _, err := conn.Exec(createEdgeTable); err != nil {
86
+		return nil, err
87
+	}
88
+	if _, err := conn.Exec(createEdgeIndices); err != nil {
89
+		return nil, err
90
+	}
92 91
 
93
-		rollback := func() {
94
-			conn.Exec("ROLLBACK")
95
-		}
92
+	rollback := func() {
93
+		conn.Exec("ROLLBACK")
94
+	}
96 95
 
97
-		// Create root entities
98
-		if _, err := conn.Exec("BEGIN"); err != nil {
99
-			return nil, err
100
-		}
101
-		if _, err := conn.Exec("INSERT INTO entity (id) VALUES (?);", "0"); err != nil {
102
-			rollback()
103
-			return nil, err
104
-		}
96
+	// Create root entities
97
+	if _, err := conn.Exec("BEGIN"); err != nil {
98
+		return nil, err
99
+	}
105 100
 
106
-		if _, err := conn.Exec("INSERT INTO edge (entity_id, name) VALUES(?,?);", "0", "/"); err != nil {
107
-			rollback()
108
-			return nil, err
109
-		}
101
+	if _, err := conn.Exec("DELETE FROM entity where id = ?", "0"); err != nil {
102
+		rollback()
103
+		return nil, err
104
+	}
110 105
 
111
-		if _, err := conn.Exec("COMMIT"); err != nil {
112
-			return nil, err
113
-		}
106
+	if _, err := conn.Exec("INSERT INTO entity (id) VALUES (?);", "0"); err != nil {
107
+		rollback()
108
+		return nil, err
109
+	}
110
+
111
+	if _, err := conn.Exec("DELETE FROM edge where entity_id=? and name=?", "0", "/"); err != nil {
112
+		rollback()
113
+		return nil, err
114 114
 	}
115
+
116
+	if _, err := conn.Exec("INSERT INTO edge (entity_id, name) VALUES(?,?);", "0", "/"); err != nil {
117
+		rollback()
118
+		return nil, err
119
+	}
120
+
121
+	if _, err := conn.Exec("COMMIT"); err != nil {
122
+		return nil, err
123
+	}
124
+
115 125
 	return db, nil
116 126
 }
117 127
 
... ...
@@ -14,7 +14,7 @@ import (
14 14
 func newTestDb(t *testing.T) (*Database, string) {
15 15
 	p := path.Join(os.TempDir(), "sqlite.db")
16 16
 	conn, err := sql.Open("sqlite3", p)
17
-	db, err := NewDatabase(conn, true)
17
+	db, err := NewDatabase(conn)
18 18
 	if err != nil {
19 19
 		t.Fatal(err)
20 20
 	}