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  }