fix: sqlite memory leak

This commit is contained in:
thinkAfCod 2024-05-31 17:50:01 +08:00 committed by Chen Kai
parent 02b87d96e4
commit 3e8973d0c7

View file

@ -204,17 +204,16 @@ func (p *ContentStorage) Close() error {
} }
func (p *ContentStorage) createTable() error { func (p *ContentStorage) createTable() error {
stat, err := p.sqliteDB.Prepare(createSql) stmt, err := p.sqliteDB.Prepare(createSql)
if err != nil { if err != nil {
return err return err
} }
defer func(stat *sql.Stmt) { defer func(stat *sql.Stmt) {
err = stat.Close() if err = stat.Close(); err != nil {
if err != nil {
p.log.Error("failed to close statement", "err", err) p.log.Error("failed to close statement", "err", err)
} }
}(stat) }(stmt)
_, err = stat.Exec() _, err = stmt.Exec()
return err return err
} }
@ -243,13 +242,7 @@ func (p *ContentStorage) initStmts() error {
// Size get database size, content size and similar // Size get database size, content size and similar
func (p *ContentStorage) Size() (uint64, error) { func (p *ContentStorage) Size() (uint64, error) {
sql := "SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size();" sql := "SELECT page_count * page_size as size FROM pragma_page_count(), pragma_page_size();"
stmt, err := p.sqliteDB.Prepare(sql) return p.queryRowUint64(sql)
if err != nil {
return 0, err
}
var res uint64
err = stmt.QueryRow().Scan(&res)
return res, err
} }
func (p *ContentStorage) UnusedSize() (uint64, error) { func (p *ContentStorage) UnusedSize() (uint64, error) {
@ -281,12 +274,17 @@ func (p *ContentStorage) ContentSize() (uint64, error) {
return p.queryRowUint64(sql) return p.queryRowUint64(sql)
} }
func (p *ContentStorage) queryRowUint64(sql string) (uint64, error) { func (p *ContentStorage) queryRowUint64(sqlStr string) (uint64, error) {
// sql := "SELECT SUM(length(value)) FROM kvstore" // sql := "SELECT SUM(length(value)) FROM kvstore"
stmt, err := p.sqliteDB.Prepare(sql) stmt, err := p.sqliteDB.Prepare(sqlStr)
if err != nil { if err != nil {
return 0, err return 0, err
} }
defer func(stat *sql.Stmt) {
if err = stat.Close(); err != nil {
p.log.Error("failed to close statement", "err", err)
}
}(stmt)
var res uint64 var res uint64
err = stmt.QueryRow().Scan(&res) err = stmt.QueryRow().Scan(&res)
return res, err return res, err
@ -298,6 +296,11 @@ func (p *ContentStorage) GetLargestDistance() (*uint256.Int, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer func(stat *sql.Stmt) {
if err = stat.Close(); err != nil {
p.log.Error("failed to close statement", "err", err)
}
}(stmt)
var distance []byte var distance []byte
err = stmt.QueryRow(p.nodeId[:]).Scan(&distance) err = stmt.QueryRow(p.nodeId[:]).Scan(&distance)