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 }