@@ -79,6 +79,11 @@ func Driver(maxQueryResults int, timeout time.Duration, savePath string, include
7979 return nil , err
8080 }
8181
82+ // Configure connection pool to prevent resource leaks
83+ d .db .SetMaxOpenConns (10 )
84+ d .db .SetMaxIdleConns (2 )
85+ d .db .SetConnMaxLifetime (time .Hour )
86+
8287 err = d .setSQLTimeout (d .timeout .Seconds ())
8388
8489 return d , err
@@ -88,6 +93,14 @@ func (d *crtsh) GetName() string {
8893 return driverName
8994}
9095
96+ // Close closes the database connection
97+ func (d * crtsh ) Close () error {
98+ if d .db != nil {
99+ return d .db .Close ()
100+ }
101+ return nil
102+ }
103+
91104func (d * crtsh ) setSQLTimeout (sec float64 ) error {
92105 _ , err := d .db .Exec (fmt .Sprintf ("SET statement_timeout TO %f;" , (1000 * sec )))
93106 return err
@@ -161,6 +174,7 @@ func (d *crtsh) QueryDomain(domain string) (driver.Result, error) {
161174 if err != nil {
162175 return results , err
163176 }
177+ defer func () { _ = rows .Close () }()
164178
165179 for rows .Next () {
166180 var hash []byte
@@ -202,6 +216,7 @@ func (d *crtsh) QueryCert(fp fingerprint.Fingerprint) (*driver.CertResult, error
202216 if err != nil {
203217 return certNode , err
204218 }
219+ defer func () { _ = rows .Close () }()
205220
206221 for rows .Next () {
207222 var domain string
@@ -214,7 +229,7 @@ func (d *crtsh) QueryCert(fp fingerprint.Fingerprint) (*driver.CertResult, error
214229
215230 if d .save {
216231 var rawCert []byte
217- queryStr = `SELECT certificate FORM certificate_and_identities WHERE digest(certificate, 'sha256') = $1;`
232+ queryStr = `SELECT certificate FROM certificate_and_identities WHERE digest(certificate, 'sha256') = $1;`
218233 row := d .db .QueryRow (queryStr , fp [:])
219234 err = row .Scan (& rawCert )
220235 if err != nil {
0 commit comments