github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/sqlstore/system_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  	"context"
     8  	"database/sql"
     9  	"strconv"
    10  	"strings"
    11  	"time"
    12  
    13  	"github.com/pkg/errors"
    14  
    15  	"github.com/mattermost/mattermost-server/v5/model"
    16  	"github.com/mattermost/mattermost-server/v5/store"
    17  	"github.com/mattermost/mattermost-server/v5/utils"
    18  )
    19  
    20  type SqlSystemStore struct {
    21  	*SqlStore
    22  }
    23  
    24  func newSqlSystemStore(sqlStore *SqlStore) store.SystemStore {
    25  	s := &SqlSystemStore{sqlStore}
    26  
    27  	for _, db := range sqlStore.GetAllConns() {
    28  		table := db.AddTableWithName(model.System{}, "Systems").SetKeys(false, "Name")
    29  		table.ColMap("Name").SetMaxSize(64)
    30  		table.ColMap("Value").SetMaxSize(1024)
    31  	}
    32  
    33  	return s
    34  }
    35  
    36  func (s SqlSystemStore) createIndexesIfNotExists() {
    37  }
    38  
    39  func (s SqlSystemStore) Save(system *model.System) error {
    40  	if err := s.GetMaster().Insert(system); err != nil {
    41  		return errors.Wrapf(err, "failed to save system property with name=%s", system.Name)
    42  	}
    43  	return nil
    44  }
    45  
    46  func (s SqlSystemStore) SaveOrUpdate(system *model.System) error {
    47  	if err := s.GetMaster().SelectOne(&model.System{}, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": system.Name}); err == nil {
    48  		if _, err := s.GetMaster().Update(system); err != nil {
    49  			return errors.Wrapf(err, "failed to update system property with name=%s", system.Name)
    50  		}
    51  	} else {
    52  		if err := s.GetMaster().Insert(system); err != nil {
    53  			return errors.Wrapf(err, "failed to save system property with name=%s", system.Name)
    54  		}
    55  	}
    56  	return nil
    57  }
    58  
    59  func (s SqlSystemStore) SaveOrUpdateWithWarnMetricHandling(system *model.System) error {
    60  	if err := s.GetMaster().SelectOne(&model.System{}, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": system.Name}); err == nil {
    61  		if _, err := s.GetMaster().Update(system); err != nil {
    62  			return errors.Wrapf(err, "failed to update system property with name=%s", system.Name)
    63  		}
    64  	} else {
    65  		if err := s.GetMaster().Insert(system); err != nil {
    66  			return errors.Wrapf(err, "failed to save system property with name=%s", system.Name)
    67  		}
    68  	}
    69  
    70  	if strings.HasPrefix(system.Name, model.WARN_METRIC_STATUS_STORE_PREFIX) && (system.Value == model.WARN_METRIC_STATUS_RUNONCE || system.Value == model.WARN_METRIC_STATUS_LIMIT_REACHED) {
    71  		if err := s.SaveOrUpdate(&model.System{Name: model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY, Value: strconv.FormatInt(utils.MillisFromTime(time.Now()), 10)}); err != nil {
    72  			return errors.Wrapf(err, "failed to save system property with name=%s", model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    73  		}
    74  	}
    75  
    76  	return nil
    77  }
    78  
    79  func (s SqlSystemStore) Update(system *model.System) error {
    80  	if _, err := s.GetMaster().Update(system); err != nil {
    81  		return errors.Wrapf(err, "failed to update system property with name=%s", system.Name)
    82  	}
    83  	return nil
    84  }
    85  
    86  func (s SqlSystemStore) Get() (model.StringMap, error) {
    87  	var systems []model.System
    88  	props := make(model.StringMap)
    89  	if _, err := s.GetReplica().Select(&systems, "SELECT * FROM Systems"); err != nil {
    90  		return nil, errors.Wrap(err, "failed to system properties")
    91  	}
    92  	for _, prop := range systems {
    93  		props[prop.Name] = prop.Value
    94  	}
    95  
    96  	return props, nil
    97  }
    98  
    99  func (s SqlSystemStore) GetByName(name string) (*model.System, error) {
   100  	var system model.System
   101  	if err := s.GetMaster().SelectOne(&system, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
   102  		return nil, errors.Wrapf(err, "failed to get system property with name=%s", system.Name)
   103  	}
   104  
   105  	return &system, nil
   106  }
   107  
   108  func (s SqlSystemStore) PermanentDeleteByName(name string) (*model.System, error) {
   109  	var system model.System
   110  	if _, err := s.GetMaster().Exec("DELETE FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
   111  		return nil, errors.Wrapf(err, "failed to permanent delete system property with name=%s", system.Name)
   112  	}
   113  
   114  	return &system, nil
   115  }
   116  
   117  // InsertIfExists inserts a given system value if it does not already exist. If a value
   118  // already exists, it returns the old one, else returns the new one.
   119  func (s SqlSystemStore) InsertIfExists(system *model.System) (*model.System, error) {
   120  	tx, err := s.GetMaster().BeginTx(context.Background(), &sql.TxOptions{
   121  		Isolation: sql.LevelSerializable,
   122  	})
   123  	if err != nil {
   124  		return nil, errors.Wrap(err, "begin_transaction")
   125  	}
   126  	defer finalizeTransaction(tx)
   127  
   128  	var origSystem model.System
   129  	if err := tx.SelectOne(&origSystem, `SELECT * FROM Systems
   130  		WHERE Name = :Name`,
   131  		map[string]interface{}{"Name": system.Name}); err != nil && err != sql.ErrNoRows {
   132  		return nil, errors.Wrapf(err, "failed to get system property with name=%s", system.Name)
   133  	}
   134  
   135  	if origSystem.Value != "" {
   136  		// Already a value exists, return that.
   137  		return &origSystem, nil
   138  	}
   139  
   140  	// Key does not exist, need to insert.
   141  	if err := tx.Insert(system); err != nil {
   142  		return nil, errors.Wrapf(err, "failed to save system property with name=%s", system.Name)
   143  	}
   144  
   145  	if err := tx.Commit(); err != nil {
   146  		return nil, errors.Wrap(err, "commit_transaction")
   147  	}
   148  	return system, nil
   149  }