summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2017-01-27 09:30:33 -0500
committerChristopher Speller <crspeller@gmail.com>2017-01-27 09:30:33 -0500
commit8d2e8525a445a80085282142375b0cc68916d552 (patch)
treec2627b71c568346bbcca7be4a555744e3c2c757c
parentcfbace70ca4222e7abba92c5e3af7440539452c7 (diff)
parent0d8bb03b5773923cf52f4d8cb2711131caae105c (diff)
downloadchat-8d2e8525a445a80085282142375b0cc68916d552.tar.gz
chat-8d2e8525a445a80085282142375b0cc68916d552.tar.bz2
chat-8d2e8525a445a80085282142375b0cc68916d552.zip
Merge branch 'release-3.6'
-rw-r--r--cmd/platform/server.go6
-rw-r--r--store/sql_store.go34
-rw-r--r--store/sql_store_test.go48
-rw-r--r--store/sql_team_store.go2
-rw-r--r--webapp/actions/websocket_actions.jsx8
-rw-r--r--webapp/routes/route_team.jsx17
6 files changed, 99 insertions, 16 deletions
diff --git a/cmd/platform/server.go b/cmd/platform/server.go
index 5abc4d6e8..560403a6b 100644
--- a/cmd/platform/server.go
+++ b/cmd/platform/server.go
@@ -38,6 +38,12 @@ func runServerCmd(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
+
+ // Backwards compatibility with -config flag
+ if flagConfigFile != "" {
+ config = flagConfigFile
+ }
+
runServer(config)
return nil
}
diff --git a/store/sql_store.go b/store/sql_store.go
index 6a852430c..214bce720 100644
--- a/store/sql_store.go
+++ b/store/sql_store.go
@@ -462,19 +462,19 @@ func (ss *SqlStore) AlterColumnTypeIfExists(tableName string, columnName string,
return true
}
-func (ss *SqlStore) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) {
- ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_DEFAULT, true)
+func (ss *SqlStore) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool {
+ return ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_DEFAULT, true)
}
-func (ss *SqlStore) CreateIndexIfNotExists(indexName string, tableName string, columnName string) {
- ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_DEFAULT, false)
+func (ss *SqlStore) CreateIndexIfNotExists(indexName string, tableName string, columnName string) bool {
+ return ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_DEFAULT, false)
}
-func (ss *SqlStore) CreateFullTextIndexIfNotExists(indexName string, tableName string, columnName string) {
- ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_FULL_TEXT, false)
+func (ss *SqlStore) CreateFullTextIndexIfNotExists(indexName string, tableName string, columnName string) bool {
+ return ss.createIndexIfNotExists(indexName, tableName, columnName, INDEX_TYPE_FULL_TEXT, false)
}
-func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, columnName string, indexType string, unique bool) {
+func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, columnName string, indexType string, unique bool) bool {
uniqueStr := ""
if unique {
@@ -485,7 +485,7 @@ func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, c
_, err := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName)
// It should fail if the index does not exist
if err == nil {
- return
+ return false
}
query := ""
@@ -512,7 +512,7 @@ func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, c
}
if count > 0 {
- return
+ return false
}
fullTextIndex := ""
@@ -531,15 +531,17 @@ func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, c
time.Sleep(time.Second)
os.Exit(EXIT_CREATE_INDEX_MISSING)
}
+
+ return true
}
-func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) {
+func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) bool {
if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
_, err := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName)
// It should fail if the index does not exist
- if err == nil {
- return
+ if err != nil {
+ return false
}
_, err = ss.GetMaster().Exec("DROP INDEX " + indexName)
@@ -548,6 +550,8 @@ func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) {
time.Sleep(time.Second)
os.Exit(EXIT_REMOVE_INDEX_POSTGRES)
}
+
+ return true
} else if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_MYSQL {
count, err := ss.GetMaster().SelectInt("SELECT COUNT(0) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = ? AND index_name = ?", tableName, indexName)
@@ -557,8 +561,8 @@ func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) {
os.Exit(EXIT_REMOVE_INDEX_MYSQL)
}
- if count > 0 {
- return
+ if count <= 0 {
+ return false
}
_, err = ss.GetMaster().Exec("DROP INDEX " + indexName + " ON " + tableName)
@@ -572,6 +576,8 @@ func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) {
time.Sleep(time.Second)
os.Exit(EXIT_REMOVE_INDEX_MISSING)
}
+
+ return true
}
func IsUniqueConstraintError(err string, indexName []string) bool {
diff --git a/store/sql_store_test.go b/store/sql_store_test.go
index d65d591ad..3c6081e3c 100644
--- a/store/sql_store_test.go
+++ b/store/sql_store_test.go
@@ -118,3 +118,51 @@ func TestAlertDbCmds(t *testing.T) {
t.Fatal("Column should not exist")
}
}
+
+func TestCreateIndexIfNotExists(t *testing.T) {
+ Setup()
+
+ sqlStore := store.(*SqlStore)
+
+ defer sqlStore.RemoveColumnIfExists("Systems", "Test")
+ if !sqlStore.CreateColumnIfNotExists("Systems", "Test", "VARCHAR(50)", "VARCHAR(50)", "") {
+ t.Fatal("Failed to create test column")
+ }
+
+ defer sqlStore.RemoveIndexIfExists("idx_systems_create_index_test", "Systems")
+ if !sqlStore.CreateIndexIfNotExists("idx_systems_create_index_test", "Systems", "Test") {
+ t.Fatal("Should've created test index")
+ }
+
+ if sqlStore.CreateIndexIfNotExists("idx_systems_create_index_test", "Systems", "Test") {
+ t.Fatal("Shouldn't have created index that already exists")
+ }
+}
+
+func TestRemoveIndexIfExists(t *testing.T) {
+ Setup()
+
+ sqlStore := store.(*SqlStore)
+
+ defer sqlStore.RemoveColumnIfExists("Systems", "Test")
+ if !sqlStore.CreateColumnIfNotExists("Systems", "Test", "VARCHAR(50)", "VARCHAR(50)", "") {
+ t.Fatal("Failed to create test column")
+ }
+
+ if sqlStore.RemoveIndexIfExists("idx_systems_remove_index_test", "Systems") {
+ t.Fatal("Should've failed to remove index that doesn't exist")
+ }
+
+ defer sqlStore.RemoveIndexIfExists("idx_systems_remove_index_test", "Systems")
+ if !sqlStore.CreateIndexIfNotExists("idx_systems_remove_index_test", "Systems", "Test") {
+ t.Fatal("Should've created test index")
+ }
+
+ if !sqlStore.RemoveIndexIfExists("idx_systems_remove_index_test", "Systems") {
+ t.Fatal("Should've removed index that exists")
+ }
+
+ if sqlStore.RemoveIndexIfExists("idx_systems_remove_index_test", "Systems") {
+ t.Fatal("Should've failed to remove index that was already removed")
+ }
+}
diff --git a/store/sql_team_store.go b/store/sql_team_store.go
index b0af895c5..6c1cdcad7 100644
--- a/store/sql_team_store.go
+++ b/store/sql_team_store.go
@@ -44,7 +44,7 @@ func NewSqlTeamStore(sqlStore *SqlStore) TeamStore {
func (s SqlTeamStore) CreateIndexesIfNotExists() {
s.CreateIndexIfNotExists("idx_teams_name", "Teams", "Name")
- s.CreateIndexIfNotExists("idx_teams_description", "Teams", "Description")
+ s.RemoveIndexIfExists("idx_teams_description", "Teams")
s.CreateIndexIfNotExists("idx_teams_invite_id", "Teams", "InviteId")
s.CreateIndexIfNotExists("idx_teams_update_at", "Teams", "UpdateAt")
s.CreateIndexIfNotExists("idx_teams_create_at", "Teams", "CreateAt")
diff --git a/webapp/actions/websocket_actions.jsx b/webapp/actions/websocket_actions.jsx
index 9a52eb05c..1a0ddda63 100644
--- a/webapp/actions/websocket_actions.jsx
+++ b/webapp/actions/websocket_actions.jsx
@@ -67,9 +67,15 @@ export function close() {
WebSocketClient.close();
}
-export function reconnect() {
+function reconnectWebSocket() {
close();
initialize();
+}
+
+export function reconnect(includeWebSocket = true) {
+ if (includeWebSocket) {
+ reconnectWebSocket();
+ }
if (Client.teamId) {
loadChannelsForCurrentUser();
diff --git a/webapp/routes/route_team.jsx b/webapp/routes/route_team.jsx
index 4cc85c81b..fe68324c4 100644
--- a/webapp/routes/route_team.jsx
+++ b/webapp/routes/route_team.jsx
@@ -8,6 +8,7 @@ import {browserHistory} from 'react-router/es6';
import TeamStore from 'stores/team_store.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import {loadStatusesForChannelAndSidebar} from 'actions/status_actions.jsx';
+import {reconnect} from 'actions/websocket_actions.jsx';
import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
import Constants from 'utils/constants.jsx';
const ActionTypes = Constants.ActionTypes;
@@ -60,12 +61,28 @@ function doChannelChange(state, replace, callback) {
callback();
}
+let wakeUpInterval;
+let lastTime = (new Date()).getTime();
+const WAKEUP_CHECK_INTERVAL = 30000; // 30 seconds
+const WAKEUP_THRESHOLD = 60000; // 60 seconds
+
function preNeedsTeam(nextState, replace, callback) {
if (RouteUtils.checkIfMFARequired(nextState)) {
browserHistory.push('/mfa/setup');
return;
}
+ clearInterval(wakeUpInterval);
+
+ wakeUpInterval = setInterval(() => {
+ const currentTime = (new Date()).getTime();
+ if (currentTime > (lastTime + WAKEUP_THRESHOLD)) { // ignore small delays
+ console.log('computer woke up - fetching latest'); //eslint-disable-line no-console
+ reconnect(false);
+ }
+ lastTime = currentTime;
+ }, WAKEUP_CHECK_INTERVAL);
+
// First check to make sure you're in the current team
// for the current url.
const teamName = nextState.params.team;