github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/sqlstore/link_metadata_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"database/sql"
     8  
     9  	sq "github.com/Masterminds/squirrel"
    10  	"github.com/pkg/errors"
    11  
    12  	"github.com/mattermost/mattermost-server/v5/model"
    13  	"github.com/mattermost/mattermost-server/v5/store"
    14  )
    15  
    16  type SqlLinkMetadataStore struct {
    17  	*SqlStore
    18  }
    19  
    20  func newSqlLinkMetadataStore(sqlStore *SqlStore) store.LinkMetadataStore {
    21  	s := &SqlLinkMetadataStore{sqlStore}
    22  
    23  	for _, db := range sqlStore.GetAllConns() {
    24  		table := db.AddTableWithName(model.LinkMetadata{}, "LinkMetadata").SetKeys(false, "Hash")
    25  		table.ColMap("URL").SetMaxSize(2048)
    26  		table.ColMap("Type").SetMaxSize(16)
    27  		table.ColMap("Data").SetMaxSize(4096)
    28  	}
    29  
    30  	return s
    31  }
    32  
    33  func (s SqlLinkMetadataStore) createIndexesIfNotExists() {
    34  	if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
    35  		s.CreateCompositeIndexIfNotExists("idx_link_metadata_url_timestamp", "LinkMetadata", []string{"URL(512)", "Timestamp"})
    36  	} else {
    37  		s.CreateCompositeIndexIfNotExists("idx_link_metadata_url_timestamp", "LinkMetadata", []string{"URL", "Timestamp"})
    38  	}
    39  }
    40  
    41  func (s SqlLinkMetadataStore) Save(metadata *model.LinkMetadata) (*model.LinkMetadata, error) {
    42  	if err := metadata.IsValid(); err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	metadata.PreSave()
    47  
    48  	err := s.GetMaster().Insert(metadata)
    49  	if err != nil && !IsUniqueConstraintError(err, []string{"PRIMARY", "linkmetadata_pkey"}) {
    50  		return nil, errors.Wrap(err, "could not save link metadata")
    51  	}
    52  
    53  	return metadata, nil
    54  }
    55  
    56  func (s SqlLinkMetadataStore) Get(url string, timestamp int64) (*model.LinkMetadata, error) {
    57  	var metadata *model.LinkMetadata
    58  	query, args, err := s.getQueryBuilder().
    59  		Select("*").
    60  		From("LinkMetadata").
    61  		Where(sq.Eq{"URL": url, "Timestamp": timestamp}).
    62  		ToSql()
    63  	if err != nil {
    64  		return nil, errors.Wrap(err, "could not create query with querybuilder")
    65  	}
    66  	err = s.GetReplica().SelectOne(&metadata, query, args...)
    67  	if err != nil {
    68  		if err == sql.ErrNoRows {
    69  			return nil, store.NewErrNotFound("LinkMetadata", "url="+url)
    70  		}
    71  		return nil, errors.Wrapf(err, "could not get metadata with selectone: url=%s", url)
    72  	}
    73  
    74  	err = metadata.DeserializeDataToConcreteType()
    75  	if err != nil {
    76  		return nil, errors.Wrapf(err, "could not deserialize metadata to concrete type for url=%s", url)
    77  	}
    78  
    79  	return metadata, nil
    80  }