Skip to content

Commit 7fd3fe5

Browse files
Audit info store DB implementation
Signed-off-by: Alexandros Filios <alexandros.filios@ibm.com>
1 parent 4ec5df6 commit 7fd3fe5

File tree

12 files changed

+204
-3
lines changed

12 files changed

+204
-3
lines changed

platform/view/sdk/dig/providers.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import (
1010
driver4 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver"
1111
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils"
1212
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/collections"
13-
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver"
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/driver"
1414
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
1515
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger"
1616
mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory"
1717
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms"
1818
driver3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms/driver"
1919
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
20+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/auditinfo"
2021
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/binding"
2122
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/signerinfo"
2223
"github.com/pkg/errors"
@@ -75,6 +76,24 @@ func newSignerInfoStore(in struct {
7576
return nil, errors.New("driver not found")
7677
}
7778

79+
func newAuditInfoStore(in struct {
80+
dig.In
81+
KVS *kvs.KVS
82+
Config driver.ConfigService
83+
Drivers []driver2.NamedDriver `group:"db-drivers"`
84+
}) (driver4.AuditInfoStore, error) {
85+
driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.auditinfo.persistence.type"), string(mem.MemoryPersistence)))
86+
if unsupportedStores.Contains(driverName) {
87+
return auditinfo.NewKVSBased(in.KVS), nil
88+
}
89+
for _, d := range in.Drivers {
90+
if d.Name == driverName {
91+
return auditinfo.NewWithConfig(d.Driver, "_default", in.Config)
92+
}
93+
}
94+
return nil, errors.New("driver not found")
95+
}
96+
7897
func newKMSDriver(in struct {
7998
dig.In
8099
Config driver.ConfigService

platform/view/sdk/dig/sdk.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import (
4242
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/metrics/operations"
4343
view3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/server/view"
4444
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/server/view/protos"
45-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/auditinfo"
4645
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/tracing"
4746
"go.opentelemetry.io/otel/trace"
4847
"go.uber.org/dig"
@@ -102,7 +101,7 @@ func (p *SDK) Install() error {
102101
p.C.Provide(view.NewSigService, dig.As(new(view3.VerifierProvider), new(view3.SignerProvider))),
103102
p.C.Provide(newBindingStore, dig.As(new(driver4.BindingStore))),
104103
p.C.Provide(newSignerInfoStore, dig.As(new(driver4.SignerInfoStore))),
105-
p.C.Provide(auditinfo.NewKVSBased, dig.As(new(driver4.AuditInfoStore))),
104+
p.C.Provide(newAuditInfoStore, dig.As(new(driver4.AuditInfoStore))),
106105
p.C.Provide(endpoint.NewService),
107106
p.C.Provide(digutils.Identity[*endpoint.Service](), dig.As(new(driver.EndpointService))),
108107
p.C.Provide(view.NewEndpointService),

platform/view/services/db/driver/badger/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,7 @@ func (d *Driver) NewBinding(string, driver.Config) (driver.BindingPersistence, e
7272
func (d *Driver) NewSignerInfo(string, driver.Config) (driver.SignerInfoPersistence, error) {
7373
panic("not implemented")
7474
}
75+
76+
func (d *Driver) NewAuditInfo(string, driver.Config) (driver.AuditInfoPersistence, error) {
77+
panic("not implemented")
78+
}

platform/view/services/db/driver/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ type BindingPersistence = driver.BindingStore
4949

5050
type SignerInfoPersistence = driver.SignerInfoStore
5151

52+
type AuditInfoPersistence = driver.AuditInfoStore
53+
5254
type BasePersistence[V any, R any] interface {
5355
// SetState sets the given value for the given namespace, key, and version
5456
SetState(namespace driver.Namespace, key driver.PKey, value V) error
@@ -154,6 +156,8 @@ type Driver interface {
154156
NewBinding(dataSourceName string, config Config) (BindingPersistence, error)
155157
// NewSignerInfo returns a new SignerInfoPersistence for the passed data source and config
156158
NewSignerInfo(string, Config) (SignerInfoPersistence, error)
159+
// NewAuditInfo returns a new AuditInfoPersistence for the passed data source and config
160+
NewAuditInfo(string, Config) (AuditInfoPersistence, error)
157161
}
158162

159163
type (

platform/view/services/db/driver/memory/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,7 @@ func (d *Driver) NewBinding(string, driver.Config) (driver.BindingPersistence, e
6868
func (d *Driver) NewSignerInfo(string, driver.Config) (driver.SignerInfoPersistence, error) {
6969
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.SignerInfoConstructors)
7070
}
71+
72+
func (d *Driver) NewAuditInfo(string, driver.Config) (driver.AuditInfoPersistence, error) {
73+
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.AuditInfoConstructors)
74+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package common
8+
9+
import (
10+
"database/sql"
11+
"fmt"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
14+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
15+
"github.com/pkg/errors"
16+
)
17+
18+
func NewAuditInfoPersistence(writeDB *sql.DB, readDB *sql.DB, table string, errorWrapper driver.SQLErrorWrapper, ci Interpreter) *AuditInfoPersistence {
19+
return &AuditInfoPersistence{
20+
table: table,
21+
errorWrapper: errorWrapper,
22+
readDB: readDB,
23+
writeDB: writeDB,
24+
ci: ci,
25+
}
26+
}
27+
28+
type AuditInfoPersistence struct {
29+
table string
30+
errorWrapper driver.SQLErrorWrapper
31+
readDB *sql.DB
32+
writeDB *sql.DB
33+
ci Interpreter
34+
}
35+
36+
func (db *AuditInfoPersistence) GetAuditInfo(id view.Identity) ([]byte, error) {
37+
where, params := Where(db.ci.Cmp("id", "=", id.UniqueID()))
38+
query := fmt.Sprintf("SELECT audit_info FROM %s %s", db.table, where)
39+
logger.Debug(query, params)
40+
41+
return QueryUnique[[]byte](db.readDB, query, params...)
42+
}
43+
44+
func (db *AuditInfoPersistence) PutAuditInfo(id view.Identity, info []byte) error {
45+
query := fmt.Sprintf("INSERT INTO %s (id, audit_info) VALUES ($1, $2)", db.table)
46+
logger.Debugf(query, id, info)
47+
_, err := db.writeDB.Exec(query, id.UniqueID(), info)
48+
if err != nil && errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) {
49+
logger.Warnf("Audit info [%s] already in db. Skipping...", id)
50+
return nil
51+
}
52+
if err != nil {
53+
return errors.Wrapf(err, "failed executing query [%s]", query)
54+
}
55+
logger.Debugf("Signer [%s] registered", id)
56+
return nil
57+
}
58+
59+
func (db *AuditInfoPersistence) CreateSchema() error {
60+
return InitSchema(db.writeDB, fmt.Sprintf(`
61+
CREATE TABLE IF NOT EXISTS %s (
62+
id TEXT NOT NULL PRIMARY KEY,
63+
audit_info BYTEA NOT NULL
64+
);`, db.table))
65+
}

platform/view/services/db/driver/sql/driver.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ type signerInfoPersistence interface {
7373
dbObject
7474
}
7575

76+
type auditInfoPersistence interface {
77+
driver.AuditInfoPersistence
78+
dbObject
79+
}
80+
7681
var UnversionedConstructors = map[common.SQLDriverType]persistenceConstructor[unversionedPersistence]{
7782
Postgres: func(o common.Opts, t string) (unversionedPersistence, error) { return postgres.NewUnversioned(o, t) },
7883
SQLite: func(o common.Opts, t string) (unversionedPersistence, error) { return sqlite.NewUnversioned(o, t) },
@@ -92,6 +97,15 @@ var SignerInfoConstructors = map[common.SQLDriverType]persistenceConstructor[sig
9297
},
9398
}
9499

100+
var AuditInfoConstructors = map[common.SQLDriverType]persistenceConstructor[auditInfoPersistence]{
101+
Postgres: func(o common.Opts, t string) (auditInfoPersistence, error) {
102+
return postgres.NewAuditInfoPersistence(o, t)
103+
},
104+
SQLite: func(o common.Opts, t string) (auditInfoPersistence, error) {
105+
return sqlite.NewAuditInfoPersistence(o, t)
106+
},
107+
}
108+
95109
func (d *Driver) NewVersioned(dataSourceName string, config driver.Config) (driver.VersionedPersistence, error) {
96110
return d.NewTransactionalVersioned(dataSourceName, config)
97111
}
@@ -120,6 +134,10 @@ func (d *Driver) NewSignerInfo(dataSourceName string, config driver.Config) (dri
120134
return newPersistence(dataSourceName, config, SignerInfoConstructors)
121135
}
122136

137+
func (d *Driver) NewAuditInfo(dataSourceName string, config driver.Config) (driver.AuditInfoPersistence, error) {
138+
return newPersistence(dataSourceName, config, AuditInfoConstructors)
139+
}
140+
123141
func newPersistence[V dbObject](dataSourceName string, config driver.Config, constructors map[common.SQLDriverType]persistenceConstructor[V]) (V, error) {
124142
logger.Infof("opening new transactional database %s", dataSourceName)
125143
opts, err := getOps(config)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package postgres
8+
9+
import (
10+
"database/sql"
11+
"fmt"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql/common"
14+
)
15+
16+
type AuditInfoPersistence struct {
17+
*common.AuditInfoPersistence
18+
}
19+
20+
func NewAuditInfoPersistence(opts common.Opts, table string) (*AuditInfoPersistence, error) {
21+
readWriteDB, err := OpenDB(opts.DataSource, opts.MaxOpenConns, opts.MaxIdleConns, opts.MaxIdleTime)
22+
if err != nil {
23+
return nil, fmt.Errorf("error opening db: %w", err)
24+
}
25+
return newAuditInfoPersistence(readWriteDB, readWriteDB, table), nil
26+
}
27+
28+
func newAuditInfoPersistence(readDB, writeDB *sql.DB, table string) *AuditInfoPersistence {
29+
return &AuditInfoPersistence{AuditInfoPersistence: common.NewAuditInfoPersistence(readDB, writeDB, table, &errorMapper{}, NewInterpreter())}
30+
}

platform/view/services/db/driver/sql/postgres/test_utils.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,7 @@ func (t *TestDriver) NewBinding(dataSourceName string, config driver.Config) (dr
299299
func (t *TestDriver) NewSignerInfo(string, driver.Config) (driver.SignerInfoPersistence, error) {
300300
return initPersistence(NewSignerInfoPersistence, t.ConnStr, t.Name, 50, 10, time.Minute)
301301
}
302+
303+
func (t *TestDriver) NewAuditInfo(string, driver.Config) (driver.AuditInfoPersistence, error) {
304+
return initPersistence(NewAuditInfoPersistence, t.ConnStr, t.Name, 50, 10, time.Minute)
305+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package sqlite
8+
9+
import (
10+
"database/sql"
11+
"fmt"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql/common"
14+
)
15+
16+
type AuditInfoPersistence struct {
17+
*common.AuditInfoPersistence
18+
}
19+
20+
func NewAuditInfoPersistence(opts common.Opts, table string) (*AuditInfoPersistence, error) {
21+
readDB, writeDB, err := openDB(opts.DataSource, opts.MaxOpenConns, opts.MaxIdleConns, opts.MaxIdleTime, opts.SkipPragmas)
22+
if err != nil {
23+
return nil, fmt.Errorf("error opening db: %w", err)
24+
}
25+
return newAuditInfoPersistence(readDB, writeDB, table), nil
26+
}
27+
28+
func newAuditInfoPersistence(readDB, writeDB *sql.DB, table string) *AuditInfoPersistence {
29+
return &AuditInfoPersistence{AuditInfoPersistence: common.NewAuditInfoPersistence(readDB, writeDB, table, &errorMapper{}, NewInterpreter())}
30+
}

0 commit comments

Comments
 (0)