github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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  	"net/http"
    10  
    11  	"github.com/mattermost/mattermost-server/v5/model"
    12  	"github.com/mattermost/mattermost-server/v5/store"
    13  )
    14  
    15  type SqlSystemStore struct {
    16  	SqlStore
    17  }
    18  
    19  func newSqlSystemStore(sqlStore SqlStore) store.SystemStore {
    20  	s := &SqlSystemStore{sqlStore}
    21  
    22  	for _, db := range sqlStore.GetAllConns() {
    23  		table := db.AddTableWithName(model.System{}, "Systems").SetKeys(false, "Name")
    24  		table.ColMap("Name").SetMaxSize(64)
    25  		table.ColMap("Value").SetMaxSize(1024)
    26  	}
    27  
    28  	return s
    29  }
    30  
    31  func (s SqlSystemStore) createIndexesIfNotExists() {
    32  }
    33  
    34  func (s SqlSystemStore) Save(system *model.System) *model.AppError {
    35  	if err := s.GetMaster().Insert(system); err != nil {
    36  		return model.NewAppError("SqlSystemStore.Save", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
    37  	}
    38  	return nil
    39  }
    40  
    41  func (s SqlSystemStore) SaveOrUpdate(system *model.System) *model.AppError {
    42  	if err := s.GetMaster().SelectOne(&model.System{}, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": system.Name}); err == nil {
    43  		if _, err := s.GetMaster().Update(system); err != nil {
    44  			return model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
    45  		}
    46  	} else {
    47  		if err := s.GetMaster().Insert(system); err != nil {
    48  			return model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
    49  		}
    50  	}
    51  	return nil
    52  }
    53  
    54  func (s SqlSystemStore) Update(system *model.System) *model.AppError {
    55  	if _, err := s.GetMaster().Update(system); err != nil {
    56  		return model.NewAppError("SqlSystemStore.Update", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
    57  	}
    58  	return nil
    59  }
    60  
    61  func (s SqlSystemStore) Get() (model.StringMap, *model.AppError) {
    62  	var systems []model.System
    63  	props := make(model.StringMap)
    64  	if _, err := s.GetReplica().Select(&systems, "SELECT * FROM Systems"); err != nil {
    65  		return nil, model.NewAppError("SqlSystemStore.Get", "store.sql_system.get.app_error", nil, err.Error(), http.StatusInternalServerError)
    66  	}
    67  	for _, prop := range systems {
    68  		props[prop.Name] = prop.Value
    69  	}
    70  
    71  	return props, nil
    72  }
    73  
    74  func (s SqlSystemStore) GetByName(name string) (*model.System, *model.AppError) {
    75  	var system model.System
    76  	if err := s.GetMaster().SelectOne(&system, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
    77  		return nil, model.NewAppError("SqlSystemStore.GetByName", "store.sql_system.get_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
    78  	}
    79  
    80  	return &system, nil
    81  }
    82  
    83  func (s SqlSystemStore) PermanentDeleteByName(name string) (*model.System, *model.AppError) {
    84  	var system model.System
    85  	if _, err := s.GetMaster().Exec("DELETE FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
    86  		return nil, model.NewAppError("SqlSystemStore.PermanentDeleteByName", "store.sql_system.permanent_delete_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
    87  	}
    88  
    89  	return &system, nil
    90  }
    91  
    92  // InsertIfExists inserts a given system value if it does not already exist. If a value
    93  // already exists, it returns the old one, else returns the new one.
    94  func (s SqlSystemStore) InsertIfExists(system *model.System) (*model.System, *model.AppError) {
    95  	tx, err := s.GetMaster().BeginTx(context.Background(), &sql.TxOptions{
    96  		Isolation: sql.LevelSerializable,
    97  	})
    98  	if err != nil {
    99  		return nil, model.NewAppError("SqlSystemStore.InsertIfExists", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
   100  	}
   101  	defer finalizeTransaction(tx)
   102  
   103  	var origSystem model.System
   104  	if err := tx.SelectOne(&origSystem, `SELECT * FROM Systems
   105  		WHERE Name = :Name`,
   106  		map[string]interface{}{"Name": system.Name}); err != nil && err != sql.ErrNoRows {
   107  		return nil, model.NewAppError("SqlSystemStore.InsertIfExists", "store.sql_system.get_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
   108  	}
   109  
   110  	if origSystem.Value != "" {
   111  		// Already a value exists, return that.
   112  		return &origSystem, nil
   113  	}
   114  
   115  	// Key does not exist, need to insert.
   116  	if err := tx.Insert(system); err != nil {
   117  		return nil, model.NewAppError("SqlSystemStore.InsertIfExists", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
   118  	}
   119  
   120  	if err := tx.Commit(); err != nil {
   121  		return nil, model.NewAppError("SqlSystemStore.InsertIfExists", "store.sql_system.save.commit_transaction.app_error", nil, err.Error(), http.StatusInternalServerError)
   122  	}
   123  	return system, nil
   124  }