66package ca
77
88import (
9- "database/sql"
109 "errors"
1110 "time"
1211
1312 "github.com/letsencrypt/boulder/core"
1413 blog "github.com/letsencrypt/boulder/log"
14+ "github.com/letsencrypt/boulder/sa"
15+
16+ gorp "github.com/letsencrypt/boulder/Godeps/_workspace/src/gopkg.in/gorp.v1"
1517)
1618
1719// CertificateAuthorityDatabaseImpl represents a database used by the CA; it
1820// enforces transaction semantics, and is effectively single-threaded.
1921type CertificateAuthorityDatabaseImpl struct {
2022 log * blog.AuditLogger
21- db * sql.DB
22- activeTx * sql.Tx
23+ dbMap * gorp.DbMap
24+ activeTx * gorp.Transaction
25+ }
26+
27+ type SerialNumber struct {
28+ ID int `db:"id"`
29+ Number int64 `db:"number"`
30+ LastUpdated time.Time `db:"lastUpdated"`
2331}
2432
2533// NewCertificateAuthorityDatabaseImpl constructs a Database for the
2634// Certificate Authority.
2735func NewCertificateAuthorityDatabaseImpl (driver string , name string ) (cadb core.CertificateAuthorityDatabase , err error ) {
2836 logger := blog .GetAuditLogger ()
2937
30- db , err := sql . Open (driver , name )
38+ dbMap , err := sa . NewDbMap (driver , name )
3139 if err != nil {
32- return
33- }
34- if err = db .Ping (); err != nil {
35- return
40+ return nil , err
3641 }
3742
43+ dbMap .AddTableWithName (SerialNumber {}, "serialNumber" ).SetKeys (true , "ID" )
44+
3845 cadb = & CertificateAuthorityDatabaseImpl {
39- db : db ,
40- log : logger ,
46+ dbMap : dbMap ,
47+ log : logger ,
4148 }
42- return
49+ return cadb , nil
4350}
4451
4552// createTablesIfNotExist builds the database tables and inserts the initial
4653// state, if the tables do not already exist. It is not an error for the tables
4754// to already exist.
4855func (cadb * CertificateAuthorityDatabaseImpl ) CreateTablesIfNotExists () (err error ) {
49- tx , err := cadb .db .Begin ()
50- if err != nil {
51- return
52- }
53-
5456 // Create serial number table
55- _ , err = tx . Exec ( "CREATE TABLE serialNumber (id INTEGER, number INTEGER, lastUpdated DATETIME);" )
57+ err = cadb . dbMap . CreateTablesIfNotExists ( )
5658 if err != nil {
57- // If the table exists, exit early
58- tx .Rollback ()
59- return nil
60- }
61-
62- // Initialize the serial number
63- _ , err = tx .Exec ("INSERT INTO serialNumber (id, number, lastUpdated) VALUES (1, 1, ?);" , time .Now ())
64- if err != nil {
65- tx .Rollback ()
6659 return
6760 }
6861
69- err = tx .Commit ()
62+ // Initialize the serial number
63+ err = cadb .dbMap .Insert (& SerialNumber {ID : 1 , Number : 1 , LastUpdated : time .Now ()})
7064 return
7165}
7266
@@ -77,7 +71,7 @@ func (cadb *CertificateAuthorityDatabaseImpl) Begin() (err error) {
7771 err = errors .New ("Transaction already open" )
7872 return
7973 }
80- cadb .activeTx , err = cadb .db .Begin ()
74+ cadb .activeTx , err = cadb .dbMap .Begin ()
8175 return
8276}
8377
@@ -109,21 +103,23 @@ func (cadb *CertificateAuthorityDatabaseImpl) Rollback() (err error) {
109103// it in the database before returning. There must be an active transaction to
110104// call this method. Callers should Begin the transaction, call this method,
111105// perform any other work, and Commit at the end once the certificate is issued.
112- func (cadb * CertificateAuthorityDatabaseImpl ) IncrementAndGetSerial () (val int , err error ) {
106+ func (cadb * CertificateAuthorityDatabaseImpl ) IncrementAndGetSerial () (val int64 , err error ) {
113107 if cadb .activeTx == nil {
114108 err = errors .New ("No transaction open" )
115109 return
116110 }
117111
118- row := cadb .activeTx .QueryRow ("SELECT number FROM serialNumber LIMIT 1;" )
119-
120- err = row .Scan (& val )
112+ rowObj , err := cadb .activeTx .Get (SerialNumber {}, 1 )
121113 if err != nil {
122114 cadb .activeTx .Rollback ()
123115 return
124116 }
125117
126- _ , err = cadb .activeTx .Exec ("UPDATE serialNumber SET number=?, lastUpdated=? WHERE id=1" , val + 1 , time .Now ())
118+ row := rowObj .(* SerialNumber )
119+ val = row .Number
120+ row .Number = val + 1
121+
122+ _ , err = cadb .activeTx .Update (row )
127123 if err != nil {
128124 cadb .activeTx .Rollback ()
129125 return
0 commit comments