From 2c6ff9b834bbe5ab5f63f7b18a8c9e9d30c8b524 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Wed, 27 Jul 2022 20:15:21 +0200 Subject: [PATCH] More robust rdbms model cache handling --- store/adapters/rdbms/dal/connection.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/store/adapters/rdbms/dal/connection.go b/store/adapters/rdbms/dal/connection.go index 0a236179b..4a6a6f847 100644 --- a/store/adapters/rdbms/dal/connection.go +++ b/store/adapters/rdbms/dal/connection.go @@ -42,27 +42,30 @@ func Connection(db sqlx.ExtContext, dialect drivers.Dialect, cc ...capabilities. } } +// model returns rdbms/dal model (converted dal.Model) +// +// It constructs key from res-type + res + ident +// and caches it in the connection +// +// This allows us to have same resource or ident on different res-types +// For example: module's model for revisions has same resouce and ident but different type func (c *connection) model(m *dal.Model) *model { - if m.Resource == "" { - // if resource is empty, use ident - m.Resource = m.Ident - } - - if m.Resource == "" { - panic("can not add model with empty resource") + key := m.ResourceType + "|" + m.Resource + "|" + m.Ident + if key == "" { + panic("can not add model without a key (combo of resource type, resource and ident)") } c.mux.RLock() - if c.models[m.Resource] == nil { + if c.models[key] == nil { c.mux.RUnlock() c.mux.Lock() - c.models[m.Resource] = Model(m, c.db, c.dialect) + c.models[key] = Model(m, c.db, c.dialect) defer c.mux.Unlock() - return c.models[m.Resource] + return c.models[key] } defer c.mux.RUnlock() - return c.models[m.Resource] + return c.models[key] } func (c *connection) Capabilities() capabilities.Set {