@@ -3,10 +3,11 @@ package postgres
33import (
44 "context"
55 "database/sql"
6+ "encoding/json"
67 "errors"
7- "fmt"
88
9- "cosmossdk.io/schema/appdata"
9+ "cosmossdk.io/schema/indexer"
10+ "cosmossdk.io/schema/logutil"
1011)
1112
1213type Config struct {
@@ -22,9 +23,28 @@ type Config struct {
2223
2324type SqlLogger = func (msg , sql string , params ... interface {})
2425
25- func StartIndexer (ctx context.Context , logger SqlLogger , config Config ) (appdata.Listener , error ) {
26+ type indexerImpl struct {
27+ ctx context.Context
28+ db * sql.DB
29+ tx * sql.Tx
30+ opts options
31+ modules map [string ]* moduleIndexer
32+ logger logutil.Logger
33+ }
34+
35+ func StartIndexer (params indexer.InitParams ) (indexer.InitResult , error ) {
36+ config , err := decodeConfig (params .Config .Config )
37+ if err != nil {
38+ return indexer.InitResult {}, err
39+ }
40+
41+ ctx := params .Context
42+ if ctx == nil {
43+ ctx = context .Background ()
44+ }
45+
2646 if config .DatabaseURL == "" {
27- return appdata. Listener {}, errors .New ("missing database URL" )
47+ return indexer. InitResult {}, errors .New ("missing database URL" )
2848 }
2949
3050 driver := config .DatabaseDriver
@@ -34,48 +54,51 @@ func StartIndexer(ctx context.Context, logger SqlLogger, config Config) (appdata
3454
3555 db , err := sql .Open (driver , config .DatabaseURL )
3656 if err != nil {
37- return appdata. Listener {}, err
57+ return indexer. InitResult {}, err
3858 }
3959
4060 tx , err := db .BeginTx (ctx , nil )
4161 if err != nil {
42- return appdata. Listener {}, err
62+ return indexer. InitResult {}, err
4363 }
4464
4565 // commit base schema
46- _ , err = tx .Exec (BaseSQL )
66+ _ , err = tx .Exec (baseSQL )
4767 if err != nil {
48- return appdata.Listener {}, err
68+ return indexer.InitResult {}, err
69+ }
70+
71+ moduleIndexers := map [string ]* moduleIndexer {}
72+ opts := options {
73+ disableRetainDeletions : config .DisableRetainDeletions ,
74+ logger : params .Logger ,
4975 }
5076
51- moduleIndexers := map [string ]* ModuleIndexer {}
52- opts := Options {
53- DisableRetainDeletions : config .DisableRetainDeletions ,
54- Logger : logger ,
77+ idx := & indexerImpl {
78+ ctx : ctx ,
79+ db : db ,
80+ tx : tx ,
81+ opts : opts ,
82+ modules : moduleIndexers ,
83+ logger : params .Logger ,
5584 }
5685
57- return appdata.Listener {
58- InitializeModuleData : func (data appdata.ModuleInitializationData ) error {
59- moduleName := data .ModuleName
60- modSchema := data .Schema
61- _ , ok := moduleIndexers [moduleName ]
62- if ok {
63- return fmt .Errorf ("module %s already initialized" , moduleName )
64- }
65-
66- mm := NewModuleIndexer (moduleName , modSchema , opts )
67- moduleIndexers [moduleName ] = mm
68-
69- return mm .InitializeSchema (ctx , tx )
70- },
71- Commit : func (data appdata.CommitData ) (completionCallback func () error , err error ) {
72- err = tx .Commit ()
73- if err != nil {
74- return nil , err
75- }
76-
77- tx , err = db .BeginTx (ctx , nil )
78- return nil , err
79- },
86+ return indexer.InitResult {
87+ Listener : idx .listener (),
8088 }, nil
8189}
90+
91+ func decodeConfig (rawConfig map [string ]interface {}) (* Config , error ) {
92+ bz , err := json .Marshal (rawConfig )
93+ if err != nil {
94+ return nil , err
95+ }
96+
97+ var config Config
98+ err = json .Unmarshal (bz , & config )
99+ if err != nil {
100+ return nil , err
101+ }
102+
103+ return & config , nil
104+ }
0 commit comments