diff --git a/src/github.com/turt2live/matrix-media-repo/storage/ds_utils.go b/src/github.com/turt2live/matrix-media-repo/storage/ds_utils.go index 08339527c1985a12c6ca1c38f8b8fc588eee28a1..eddbe348c4b6cd1ceed0f26793e925b168e02a39 100644 --- a/src/github.com/turt2live/matrix-media-repo/storage/ds_utils.go +++ b/src/github.com/turt2live/matrix-media-repo/storage/ds_utils.go @@ -12,9 +12,7 @@ import ( ) func GetOrCreateDatastore(ctx context.Context, log *logrus.Entry, basePath string) (*types.Datastore, error) { - logrus.Info("Init DS lookup") mediaService := GetDatabase().GetMediaStore(ctx, log) - return getOrCreateDatastoreWithMediaService(mediaService, basePath) } diff --git a/src/github.com/turt2live/matrix-media-repo/storage/stores/media_store.go b/src/github.com/turt2live/matrix-media-repo/storage/stores/media_store.go index 3396dea2ab76b73db670344c85106978491933b1..09e2a174ce63a0a5d441f16bc5acbd7b1f85752b 100644 --- a/src/github.com/turt2live/matrix-media-repo/storage/stores/media_store.go +++ b/src/github.com/turt2live/matrix-media-repo/storage/stores/media_store.go @@ -22,6 +22,9 @@ const insertDatastore = "INSERT INTO datastores (datastore_id, ds_type, uri) VAL const selectMediaWithoutDatastore = "SELECT origin, media_id, upload_name, content_type, user_id, sha256_hash, size_bytes, datastore_id, location, creation_ts, quarantined FROM media WHERE datastore_id IS NULL OR datastore_id = '';" const updateMediaDatastoreAndLocation = "UPDATE media SET location = $4, datastore_id = $3 WHERE origin = $1 AND media_id = $2;" +var dsCacheByPath = make(map[string]*types.Datastore) +var dsCacheById = make(map[string]*types.Datastore) + type mediaStoreStatements struct { selectMedia *sql.Stmt selectMediaByHash *sql.Stmt @@ -244,13 +247,30 @@ func (s *MediaStore) UpdateDatastoreAndLocation(media *types.Media) (error) { } func (s *MediaStore) GetDatastore(id string) (*types.Datastore, error) { + if v, ok := dsCacheById[id]; ok { + return &types.Datastore{ + DatastoreId: v.DatastoreId, + Type: v.Type, + Uri: v.Uri, + }, nil + } + d := &types.Datastore{} err := s.statements.selectDatastore.QueryRowContext(s.ctx, id).Scan( &d.DatastoreId, &d.Type, &d.Uri, ) - return d, err + if err != nil { + dsCacheById[d.DatastoreId] = d + dsCacheByPath[d.Uri] = d + } + + return &types.Datastore{ + DatastoreId: d.DatastoreId, + Type: d.Type, + Uri: d.Uri, + }, err } func (s *MediaStore) InsertDatastore(datastore *types.Datastore) (error) { @@ -260,17 +280,43 @@ func (s *MediaStore) InsertDatastore(datastore *types.Datastore) (error) { datastore.Type, datastore.Uri, ) + if err != nil { + d := &types.Datastore{ + DatastoreId: datastore.DatastoreId, + Type: datastore.Type, + Uri: datastore.Uri, + } + dsCacheById[d.DatastoreId] = d + dsCacheByPath[d.Uri] = d + } return err } func (s *MediaStore) GetDatastoreByUri(uri string) (*types.Datastore, error) { + if v, ok := dsCacheByPath[uri]; ok { + return &types.Datastore{ + DatastoreId: v.DatastoreId, + Type: v.Type, + Uri: v.Uri, + }, nil + } + d := &types.Datastore{} err := s.statements.selectDatastoreByUri.QueryRowContext(s.ctx, uri).Scan( &d.DatastoreId, &d.Type, &d.Uri, ) - return d, err + if err != nil { + dsCacheById[d.DatastoreId] = d + dsCacheByPath[d.Uri] = d + } + + return &types.Datastore{ + DatastoreId: d.DatastoreId, + Type: d.Type, + Uri: d.Uri, + }, err } func (s *MediaStore) GetAllWithoutDatastore() ([]*types.Media, error) {