Merge pull request #196 from sosedoff/switch-db
Allow switching between databases
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
neturl "net/url"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -118,6 +120,62 @@ func Connect(c *gin.Context) {
|
|||||||
c.JSON(200, info.Format()[0])
|
c.JSON(200, info.Format()[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SwitchDb(c *gin.Context) {
|
||||||
|
if command.Opts.LockSession {
|
||||||
|
c.JSON(400, Error{"Session is locked"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
name := c.Request.URL.Query().Get("db")
|
||||||
|
if name == "" {
|
||||||
|
name = c.Request.FormValue("db")
|
||||||
|
}
|
||||||
|
if name == "" {
|
||||||
|
c.JSON(400, Error{"Database name is not provided"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
conn := DB(c)
|
||||||
|
if conn == nil {
|
||||||
|
c.JSON(400, Error{"Not connected"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
currentUrl, err := neturl.Parse(conn.ConnectionString)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(400, Error{"Unable to parse current connection string"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newStr := strings.Replace(conn.ConnectionString, currentUrl.Path, "/"+name, 1)
|
||||||
|
|
||||||
|
cl, err := client.NewFromUrl(newStr, nil)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(400, Error{err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cl.Test()
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(400, Error{err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
info, err := cl.Info()
|
||||||
|
if err == nil {
|
||||||
|
err = setClient(c, cl)
|
||||||
|
if err != nil {
|
||||||
|
cl.Close()
|
||||||
|
c.JSON(400, Error{err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conn.Close()
|
||||||
|
|
||||||
|
c.JSON(200, info.Format()[0])
|
||||||
|
}
|
||||||
|
|
||||||
func Disconnect(c *gin.Context) {
|
func Disconnect(c *gin.Context) {
|
||||||
if command.Opts.LockSession {
|
if command.Opts.LockSession {
|
||||||
c.JSON(400, Error{"Session is locked"})
|
c.JSON(400, Error{"Session is locked"})
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ func SetupRoutes(router *gin.Engine) {
|
|||||||
api.GET("/info", GetInfo)
|
api.GET("/info", GetInfo)
|
||||||
api.POST("/connect", Connect)
|
api.POST("/connect", Connect)
|
||||||
api.POST("/disconnect", Disconnect)
|
api.POST("/disconnect", Disconnect)
|
||||||
|
api.POST("/switchdb", SwitchDb)
|
||||||
api.GET("/databases", GetDatabases)
|
api.GET("/databases", GetDatabases)
|
||||||
api.GET("/connection", GetConnectionInfo)
|
api.GET("/connection", GetConnectionInfo)
|
||||||
api.GET("/activity", GetActivity)
|
api.GET("/activity", GetActivity)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -111,6 +111,7 @@
|
|||||||
|
|
||||||
#sidebar div.tables-list .title span.current-database {
|
#sidebar div.tables-list .title span.current-database {
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
#sidebar div.tables-list .title:hover span.refresh {
|
#sidebar div.tables-list .title:hover span.refresh {
|
||||||
|
|||||||
@@ -241,5 +241,8 @@
|
|||||||
<li><a href="#" data-action="delete">Delete table</a></li>
|
<li><a href="#" data-action="delete">Delete table</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="databases_context_menu">
|
||||||
|
<ul class="dropdown-menu" role="menu"></ul>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -744,6 +744,20 @@ function bindContextMenus() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#current_database").contextmenu({
|
||||||
|
target: "#databases_context_menu",
|
||||||
|
onItem: function(context, e) {
|
||||||
|
var name = $(e.target).text();
|
||||||
|
apiCall("post", "/switchdb", { db: name }, function(resp) {
|
||||||
|
if (resp.error) {
|
||||||
|
alert(resp.error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
@@ -929,6 +943,16 @@ $(document).ready(function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#current_database").on("click", function(e) {
|
||||||
|
apiCall("get", "/databases", {}, function(resp) {
|
||||||
|
$("#databases_context_menu > ul > li").remove();
|
||||||
|
resp.forEach(function(name) {
|
||||||
|
$("<li><a href='#'>" + name + "</a></li>").appendTo("#databases_context_menu > ul");
|
||||||
|
});
|
||||||
|
$("#current_database").triggerHandler("contextmenu");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$("#edit_connection").on("click", function() {
|
$("#edit_connection").on("click", function() {
|
||||||
if (connected) {
|
if (connected) {
|
||||||
$("#close_connection_window").show();
|
$("#close_connection_window").show();
|
||||||
@@ -1073,6 +1097,7 @@ $(document).ready(function() {
|
|||||||
if (resp.error) {
|
if (resp.error) {
|
||||||
connected = false;
|
connected = false;
|
||||||
showConnectionSettings();
|
showConnectionSettings();
|
||||||
|
$(".connection-actions").show();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
connected = true;
|
connected = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user