From e43bd98c789e54ca302118defcd8ec58e32c225f Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 21 Apr 2015 17:46:05 -0700 Subject: [PATCH 1/6] move InitTables to NewSQLStorageAuthority and add checks so tables are only created if they don't exist --- sa/storage-authority.go | 88 ++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index ef8ece40f71..f01c81859c0 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -19,9 +19,10 @@ import ( ) type SQLStorageAuthority struct { - db *sql.DB - bucket map[string]interface{} // XXX included only for backward compat - log *blog.AuditLogger + db *sql.DB + initCheck bool + bucket map[string]interface{} // XXX included only for backward compat + log *blog.AuditLogger } func digest256(data []byte) []byte { @@ -42,45 +43,88 @@ func NewSQLStorageAuthority(logger *blog.AuditLogger, driver string, name string } ssa = &SQLStorageAuthority{ - db: db, - log: logger, - bucket: make(map[string]interface{}), + db: db, + initCheck: name != ":memory:", + log: logger, + bucket: make(map[string]interface{}), } + + err = ssa.InitTables() + if err != nil { + return + } + return } func (ssa *SQLStorageAuthority) InitTables() (err error) { + var regsExists bool + var pending_authzExists bool + var authzExists bool + var certsExists bool + if ssa.initCheck { + err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'registrations');").Scan(®sExists) + if err != nil { + return + } + err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'pending_authz');").Scan(&pending_authzExists) + if err != nil { + return + } + err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'authz');").Scan(&authzExists) + if err != nil { + return + } + err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'certificates');").Scan(&certsExists) + if err != nil { + return + } + + if regsExists && pending_authzExists && authzExists && certsExists { + return + } + } + + tx, err := ssa.db.Begin() if err != nil { return } // Create registrations table - _, err = tx.Exec("CREATE TABLE registrations (id TEXT, thumbprint TEXT, value TEXT);") - if err != nil { - tx.Rollback() - return + if !regsExists { + _, err = tx.Exec("CREATE TABLE registrations (id TEXT, thumbprint TEXT, value TEXT);") + if err != nil { + tx.Rollback() + return + } } // Create pending authorizations table - _, err = tx.Exec("CREATE TABLE pending_authz (id TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return + if !pending_authzExists { + _, err = tx.Exec("CREATE TABLE pending_authz (id TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return + } } // Create finalized authorizations table - _, err = tx.Exec("CREATE TABLE authz (sequence INTEGER, id TEXT, digest TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return + if !authzExists { + _, err = tx.Exec("CREATE TABLE authz (sequence INTEGER, id TEXT, digest TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return + } } // Create certificates table - _, err = tx.Exec("CREATE TABLE certificates (serial string, digest TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return + if !certsExists { + _, err = tx.Exec("CREATE TABLE certificates (sequence INTEGER, digest TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return + } } err = tx.Commit() From 6944f233d48c483e0856031a5742d971a49ca0d2 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 21 Apr 2015 17:53:53 -0700 Subject: [PATCH 2/6] sqlite doesn't support information_schema table --- sa/storage-authority.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index f01c81859c0..af2efda2fe0 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -44,7 +44,7 @@ func NewSQLStorageAuthority(logger *blog.AuditLogger, driver string, name string ssa = &SQLStorageAuthority{ db: db, - initCheck: name != ":memory:", + initCheck: driver != "sqlite3", log: logger, bucket: make(map[string]interface{}), } From 7cf1872d746997199c912db5b2b0cdb985ff1806 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 21 Apr 2015 18:44:34 -0700 Subject: [PATCH 3/6] typo --- sa/storage-authority.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index af2efda2fe0..302096ff5a7 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -120,7 +120,7 @@ func (ssa *SQLStorageAuthority) InitTables() (err error) { // Create certificates table if !certsExists { - _, err = tx.Exec("CREATE TABLE certificates (sequence INTEGER, digest TEXT, value BLOB);") + _, err = tx.Exec("CREATE TABLE certificates (serial INTEGER, digest TEXT, value BLOB);") if err != nil { tx.Rollback() return From 2c370de691d61d50259dc01b001110ca7c0024d2 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 22 Apr 2015 20:15:57 -0700 Subject: [PATCH 4/6] back to always-init method --- cmd/boulder/main.go | 3 +- sa/storage-authority.go | 76 +++++++++++------------------------------ 2 files changed, 20 insertions(+), 59 deletions(-) diff --git a/cmd/boulder/main.go b/cmd/boulder/main.go index bea4f470dec..aa080f7929e 100644 --- a/cmd/boulder/main.go +++ b/cmd/boulder/main.go @@ -72,8 +72,7 @@ func main() { wfe := wfe.NewWebFrontEndImpl(auditlogger) sa, err := sa.NewSQLStorageAuthority(auditlogger, c.SA.DBDriver, c.SA.DBName) cmd.FailOnError(err, "Unable to create SA") - err = sa.InitTables() - cmd.FailOnError(err, "Unable to initialize SA") + ra := ra.NewRegistrationAuthorityImpl(auditlogger) va := va.NewValidationAuthorityImpl(auditlogger, c.CA.TestMode) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index 302096ff5a7..4cad699fb0b 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -19,10 +19,9 @@ import ( ) type SQLStorageAuthority struct { - db *sql.DB - initCheck bool - bucket map[string]interface{} // XXX included only for backward compat - log *blog.AuditLogger + db *sql.DB + bucket map[string]interface{} // XXX included only for backward compat + log *blog.AuditLogger } func digest256(data []byte) []byte { @@ -44,7 +43,6 @@ func NewSQLStorageAuthority(logger *blog.AuditLogger, driver string, name string ssa = &SQLStorageAuthority{ db: db, - initCheck: driver != "sqlite3", log: logger, bucket: make(map[string]interface{}), } @@ -58,73 +56,37 @@ func NewSQLStorageAuthority(logger *blog.AuditLogger, driver string, name string } func (ssa *SQLStorageAuthority) InitTables() (err error) { - var regsExists bool - var pending_authzExists bool - var authzExists bool - var certsExists bool - if ssa.initCheck { - err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'registrations');").Scan(®sExists) - if err != nil { - return - } - err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'pending_authz');").Scan(&pending_authzExists) - if err != nil { - return - } - err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'authz');").Scan(&authzExists) - if err != nil { - return - } - err = ssa.db.QueryRow("SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'certificates');").Scan(&certsExists) - if err != nil { - return - } - - if regsExists && pending_authzExists && authzExists && certsExists { - return - } - } - - tx, err := ssa.db.Begin() if err != nil { return } // Create registrations table - if !regsExists { - _, err = tx.Exec("CREATE TABLE registrations (id TEXT, thumbprint TEXT, value TEXT);") - if err != nil { - tx.Rollback() - return - } + _, err = tx.Exec("CREATE TABLE IF NOT EXISTS registrations (id TEXT, thumbprint TEXT, value TEXT);") + if err != nil { + tx.Rollback() + return } // Create pending authorizations table - if !pending_authzExists { - _, err = tx.Exec("CREATE TABLE pending_authz (id TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return - } + _, err = tx.Exec("CREATE TABLE IF NOT EXISTS pending_authz (id TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return } // Create finalized authorizations table - if !authzExists { - _, err = tx.Exec("CREATE TABLE authz (sequence INTEGER, id TEXT, digest TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return - } + _, err = tx.Exec("CREATE TABLE IF NOT EXISTS authz (sequence INTEGER, id TEXT, digest TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return } // Create certificates table - if !certsExists { - _, err = tx.Exec("CREATE TABLE certificates (serial INTEGER, digest TEXT, value BLOB);") - if err != nil { - tx.Rollback() - return - } + _, err = tx.Exec("CREATE TABLE IF NOT EXISTS certificates (serial INTEGER, digest TEXT, value BLOB);") + if err != nil { + tx.Rollback() + return } err = tx.Commit() From 828ea5641f6350f449b944d7457c1464f190e088 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 22 Apr 2015 20:27:42 -0700 Subject: [PATCH 5/6] cleanup --- sa/storage-authority.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index 4cad699fb0b..f411a3ecb45 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -42,9 +42,9 @@ func NewSQLStorageAuthority(logger *blog.AuditLogger, driver string, name string } ssa = &SQLStorageAuthority{ - db: db, - log: logger, - bucket: make(map[string]interface{}), + db: db, + log: logger, + bucket: make(map[string]interface{}), } err = ssa.InitTables() From b63c9f3dcf84831c0e021f5902ceb9ab522defbd Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Thu, 23 Apr 2015 13:51:09 -0700 Subject: [PATCH 6/6] fixed typo Not sure how that got changed... --- sa/storage-authority.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sa/storage-authority.go b/sa/storage-authority.go index f411a3ecb45..5c039d8fc61 100644 --- a/sa/storage-authority.go +++ b/sa/storage-authority.go @@ -83,7 +83,7 @@ func (ssa *SQLStorageAuthority) InitTables() (err error) { } // Create certificates table - _, err = tx.Exec("CREATE TABLE IF NOT EXISTS certificates (serial INTEGER, digest TEXT, value BLOB);") + _, err = tx.Exec("CREATE TABLE IF NOT EXISTS certificates (serial STRING, digest TEXT, value BLOB);") if err != nil { tx.Rollback() return