github.com/vnforks/kid/v5@v5.22.1-0.20200408055009-b89d99c65676/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 "net/http" 9 10 "github.com/vnforks/kid/v5/model" 11 "github.com/vnforks/kid/v5/store" 12 ) 13 14 type SqlLinkMetadataStore struct { 15 SqlStore 16 } 17 18 func newSqlLinkMetadataStore(sqlStore SqlStore) store.LinkMetadataStore { 19 s := &SqlLinkMetadataStore{sqlStore} 20 21 for _, db := range sqlStore.GetAllConns() { 22 table := db.AddTableWithName(model.LinkMetadata{}, "LinkMetadata").SetKeys(false, "Hash") 23 table.ColMap("URL").SetMaxSize(2048) 24 table.ColMap("Type").SetMaxSize(16) 25 table.ColMap("Data").SetMaxSize(4096) 26 } 27 28 return s 29 } 30 31 func (s SqlLinkMetadataStore) createIndexesIfNotExists() { 32 if s.DriverName() == model.DATABASE_DRIVER_MYSQL { 33 s.CreateCompositeIndexIfNotExists("idx_link_metadata_url_timestamp", "LinkMetadata", []string{"URL(512)", "Timestamp"}) 34 } else { 35 s.CreateCompositeIndexIfNotExists("idx_link_metadata_url_timestamp", "LinkMetadata", []string{"URL", "Timestamp"}) 36 } 37 } 38 39 func (s SqlLinkMetadataStore) Save(metadata *model.LinkMetadata) (*model.LinkMetadata, *model.AppError) { 40 if err := metadata.IsValid(); err != nil { 41 return nil, err 42 } 43 44 metadata.PreSave() 45 46 err := s.GetMaster().Insert(metadata) 47 if err != nil && !IsUniqueConstraintError(err, []string{"PRIMARY", "linkmetadata_pkey"}) { 48 return nil, model.NewAppError("SqlLinkMetadataStore.Save", "store.sql_link_metadata.save.app_error", nil, "url="+metadata.URL+", "+err.Error(), http.StatusInternalServerError) 49 } 50 51 return metadata, nil 52 } 53 54 func (s SqlLinkMetadataStore) Get(url string, timestamp int64) (*model.LinkMetadata, *model.AppError) { 55 var metadata *model.LinkMetadata 56 57 err := s.GetReplica().SelectOne(&metadata, 58 `SELECT 59 * 60 FROM 61 LinkMetadata 62 WHERE 63 URL = :URL 64 AND Timestamp = :Timestamp`, map[string]interface{}{"URL": url, "Timestamp": timestamp}) 65 if err != nil { 66 if err == sql.ErrNoRows { 67 return nil, model.NewAppError("SqlLinkMetadataStore.Get", "store.sql_link_metadata.get.app_error", nil, "url="+url+", "+err.Error(), http.StatusNotFound) 68 } 69 return nil, model.NewAppError("SqlLinkMetadataStore.Get", "store.sql_link_metadata.get.app_error", nil, "url="+url+", "+err.Error(), http.StatusInternalServerError) 70 } 71 72 err = metadata.DeserializeDataToConcreteType() 73 if err != nil { 74 return nil, model.NewAppError("SqlLinkMetadataStore.Get", "store.sql_link_metadata.get.app_error", nil, "url="+url+", "+err.Error(), http.StatusInternalServerError) 75 } 76 77 return metadata, nil 78 }