Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions ocp/data/internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/code-payments/ocp-server/ocp/data/timelock"
"github.com/code-payments/ocp-server/ocp/data/transaction"
"github.com/code-payments/ocp-server/ocp/data/vault"
vm_metadata "github.com/code-payments/ocp-server/ocp/data/vm/metadata"
vm_ram "github.com/code-payments/ocp-server/ocp/data/vm/ram"
vm_storage "github.com/code-payments/ocp-server/ocp/data/vm/storage"

Expand All @@ -51,6 +52,7 @@ import (
timelock_memory_client "github.com/code-payments/ocp-server/ocp/data/timelock/memory"
transaction_memory_client "github.com/code-payments/ocp-server/ocp/data/transaction/memory"
vault_memory_client "github.com/code-payments/ocp-server/ocp/data/vault/memory"
vm_metadata_memory_client "github.com/code-payments/ocp-server/ocp/data/vm/metadata/memory"
vm_ram_memory_client "github.com/code-payments/ocp-server/ocp/data/vm/ram/memory"
vm_storage_memory_client "github.com/code-payments/ocp-server/ocp/data/vm/storage/memory"

Expand All @@ -68,6 +70,7 @@ import (
timelock_postgres_client "github.com/code-payments/ocp-server/ocp/data/timelock/postgres"
transaction_postgres_client "github.com/code-payments/ocp-server/ocp/data/transaction/postgres"
vault_postgres_client "github.com/code-payments/ocp-server/ocp/data/vault/postgres"
vm_metadata_postgres_client "github.com/code-payments/ocp-server/ocp/data/vm/metadata/postgres"
vm_ram_postgres_client "github.com/code-payments/ocp-server/ocp/data/vm/ram/postgres"
vm_storage_postgres_client "github.com/code-payments/ocp-server/ocp/data/vm/storage/postgres"
)
Expand Down Expand Up @@ -239,6 +242,11 @@ type DatabaseData interface {
ReserveVmMemory(ctx context.Context, vm string, accountType vm.VirtualAccountType, address string) (string, uint16, error)
GetVmMemoryLocationByAddress(ctx context.Context, address string) (string, uint16, error)

// VM Metadata
// --------------------------------------------------------------------------------
PutVmMetadata(ctx context.Context, record *vm_metadata.Record) error
GetVmMetadataByMint(ctx context.Context, mint string) (*vm_metadata.Record, error)

// VM Storage
// --------------------------------------------------------------------------------
InitializeVmStorage(ctx context.Context, record *vm_storage.Record) error
Expand Down Expand Up @@ -269,6 +277,7 @@ type DatabaseProvider struct {
timelocks timelock.Store
transactions transaction.Store
vault vault.Store
vmMetadata vm_metadata.Store
vmRam vm_ram.Store
vmStorage vm_storage.Store

Expand Down Expand Up @@ -314,6 +323,7 @@ func NewDatabaseProvider(dbConfig *pg.Config) (DatabaseData, error) {
timelocks: timelock_postgres_client.New(db),
transactions: transaction_postgres_client.New(db),
vault: vault_postgres_client.New(db),
vmMetadata: vm_metadata_postgres_client.New(db),
vmRam: vm_ram_postgres_client.New(db),
vmStorage: vm_storage_postgres_client.New(db),

Expand All @@ -340,6 +350,7 @@ func NewTestDatabaseProvider() DatabaseData {
timelocks: timelock_memory_client.New(),
transactions: transaction_memory_client.New(),
vault: vault_memory_client.New(),
vmMetadata: vm_metadata_memory_client.New(),
vmRam: vm_ram_memory_client.New(),
vmStorage: vm_storage_memory_client.New(),

Expand Down Expand Up @@ -863,6 +874,15 @@ func (dp *DatabaseProvider) SaveKey(ctx context.Context, record *vault.Record) e
return dp.vault.Save(ctx, record)
}

// VM Metadata
// --------------------------------------------------------------------------------
func (dp *DatabaseProvider) PutVmMetadata(ctx context.Context, record *vm_metadata.Record) error {
return dp.vmMetadata.Put(ctx, record)
}
func (dp *DatabaseProvider) GetVmMetadataByMint(ctx context.Context, mint string) (*vm_metadata.Record, error) {
return dp.vmMetadata.GetByMint(ctx, mint)
}

// VM RAM
// --------------------------------------------------------------------------------
func (dp *DatabaseProvider) InitializeVmMemory(ctx context.Context, record *vm_ram.Record) error {
Expand Down
81 changes: 81 additions & 0 deletions ocp/data/vm/metadata/memory/store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package memory

import (
"context"
"sync"
"time"

"github.com/code-payments/ocp-server/ocp/data/vm/metadata"
)

type store struct {
mu sync.Mutex
last uint64
records []*metadata.Record
}

// New returns a new in memory vm.metadata.Store
func New() metadata.Store {
return &store{}
}

// Put implements vm.metadata.Store.Put
func (s *store) Put(_ context.Context, record *metadata.Record) error {
if err := record.Validate(); err != nil {
return err
}

s.mu.Lock()
defer s.mu.Unlock()

if item := s.find(record); item != nil {
return metadata.ErrAlreadyExists
}

s.last++
record.Id = s.last
if record.CreatedAt.IsZero() {
record.CreatedAt = time.Now()
}

cloned := record.Clone()
s.records = append(s.records, &cloned)

return nil
}

// GetByMint implements vm.metadata.Store.GetByMint
func (s *store) GetByMint(_ context.Context, mint string) (*metadata.Record, error) {
s.mu.Lock()
defer s.mu.Unlock()

for _, item := range s.records {
if item.Mint == mint {
cloned := item.Clone()
return &cloned, nil
}
}

return nil, metadata.ErrNotFound
}

func (s *store) find(data *metadata.Record) *metadata.Record {
for _, item := range s.records {
if item.Id == data.Id && data.Id != 0 {
return item
}

if item.Mint == data.Mint {
return item
}
}

return nil
}

func (s *store) reset() {
s.mu.Lock()
defer s.mu.Unlock()
s.last = 0
s.records = nil
}
15 changes: 15 additions & 0 deletions ocp/data/vm/metadata/memory/store_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package memory

import (
"testing"

"github.com/code-payments/ocp-server/ocp/data/vm/metadata/tests"
)

func TestVmMetadataMemoryStore(t *testing.T) {
testStore := New()
teardown := func() {
testStore.(*store).reset()
}
tests.RunTests(t, testStore, teardown)
}
104 changes: 104 additions & 0 deletions ocp/data/vm/metadata/postgres/model.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package postgres

import (
"context"
"database/sql"
"time"

"github.com/jmoiron/sqlx"

pgutil "github.com/code-payments/ocp-server/database/postgres"
"github.com/code-payments/ocp-server/ocp/data/vm/metadata"
)

const (
tableName = "ocp__core_vmmetadata"
)

type model struct {
Id sql.NullInt64 `db:"id"`

Mint string `db:"mint"`
Authority string `db:"authority"`
Vm string `db:"vm"`
VmBump uint8 `db:"vm_bump"`
Omnibus string `db:"omnibus"`
OmnibusBump uint8 `db:"omnibus_bump"`
DaysLocked uint8 `db:"days_locked"`

CreatedAt time.Time `db:"created_at"`
}

func toModel(obj *metadata.Record) (*model, error) {
if err := obj.Validate(); err != nil {
return nil, err
}

return &model{
Mint: obj.Mint,
Authority: obj.Authority,
Vm: obj.Vm,
VmBump: obj.VmBump,
Omnibus: obj.Omnibus,
OmnibusBump: obj.OmnibusBump,
DaysLocked: obj.DaysLocked,

CreatedAt: obj.CreatedAt,
}, nil
}

func fromModel(obj *model) *metadata.Record {
return &metadata.Record{
Id: uint64(obj.Id.Int64),

Mint: obj.Mint,
Authority: obj.Authority,
Vm: obj.Vm,
VmBump: obj.VmBump,
Omnibus: obj.Omnibus,
OmnibusBump: obj.OmnibusBump,
DaysLocked: obj.DaysLocked,

CreatedAt: obj.CreatedAt,
}
}

func (m *model) dbPut(ctx context.Context, db *sqlx.DB) error {
query := `INSERT INTO ` + tableName + `
(mint, authority, vm, vm_bump, omnibus, omnibus_bump, days_locked, created_at)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
RETURNING id, mint, authority, vm, vm_bump, omnibus, omnibus_bump, days_locked, created_at
`

if m.CreatedAt.IsZero() {
m.CreatedAt = time.Now()
}

err := db.QueryRowxContext(
ctx,
query,
m.Mint,
m.Authority,
m.Vm,
m.VmBump,
m.Omnibus,
m.OmnibusBump,
m.DaysLocked,
m.CreatedAt,
).StructScan(m)

return pgutil.CheckUniqueViolation(err, metadata.ErrAlreadyExists)
}

func dbGetByMint(ctx context.Context, db *sqlx.DB, mint string) (*model, error) {
var res model
query := `SELECT id, mint, authority, vm, vm_bump, omnibus, omnibus_bump, days_locked, created_at FROM ` + tableName + `
WHERE mint = $1
`

err := db.GetContext(ctx, &res, query, mint)
if err != nil {
return nil, pgutil.CheckNoRows(err, metadata.ErrNotFound)
}
return &res, nil
}
47 changes: 47 additions & 0 deletions ocp/data/vm/metadata/postgres/store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package postgres

import (
"context"
"database/sql"

"github.com/jmoiron/sqlx"

"github.com/code-payments/ocp-server/ocp/data/vm/metadata"
)

type store struct {
db *sqlx.DB
}

// New returns a new postgres vm.metadata.Store
func New(db *sql.DB) metadata.Store {
return &store{
db: sqlx.NewDb(db, "pgx"),
}
}

// Put implements vm.metadata.Store.Put
func (s *store) Put(ctx context.Context, record *metadata.Record) error {
obj, err := toModel(record)
if err != nil {
return err
}

err = obj.dbPut(ctx, s.db)
if err != nil {
return err
}

fromModel(obj).CopyTo(record)

return nil
}

// GetByMint implements vm.metadata.Store.GetByMint
func (s *store) GetByMint(ctx context.Context, mint string) (*metadata.Record, error) {
obj, err := dbGetByMint(ctx, s.db, mint)
if err != nil {
return nil, err
}
return fromModel(obj), nil
}
Loading
Loading