mirror of
https://github.com/haiwen/seafile-server.git
synced 2025-09-19 18:16:25 +00:00
Go support dm dtabase
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"database/sql"
|
||||
_ "dm"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -155,6 +156,29 @@ func loadCcnetDB() {
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to open database %s: %v", ccnetDBPath, err)
|
||||
}
|
||||
} else if strings.EqualFold(dbEngine, "dm") {
|
||||
if key, err = section.GetKey("HOST"); err != nil {
|
||||
log.Fatal("No database host in ccnet.conf.")
|
||||
}
|
||||
host := key.String()
|
||||
// user is required.
|
||||
if key, err = section.GetKey("USER"); err != nil {
|
||||
log.Fatal("No database user in ccnet.conf.")
|
||||
}
|
||||
user := key.String()
|
||||
if key, err = section.GetKey("PASSWD"); err != nil {
|
||||
log.Fatal("No database password in ccnet.conf.")
|
||||
}
|
||||
password := key.String()
|
||||
port := 5236
|
||||
if key, err = section.GetKey("PORT"); err == nil {
|
||||
port, _ = key.Int()
|
||||
}
|
||||
dsn := fmt.Sprintf("dm://%s:%s@%s:%d", user, password, host, port)
|
||||
ccnetDB, err = sql.Open("dm", dsn)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to open dm database: %v", err)
|
||||
}
|
||||
} else {
|
||||
log.Fatalf("Unsupported database %s.", dbEngine)
|
||||
}
|
||||
@@ -263,6 +287,30 @@ func loadSeafileDB() {
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to open database %s: %v", seafileDBPath, err)
|
||||
}
|
||||
} else if strings.EqualFold(dbEngine, "dm") {
|
||||
if key, err = section.GetKey("host"); err != nil {
|
||||
log.Fatal("No database host in seafile.conf.")
|
||||
}
|
||||
host := key.String()
|
||||
// user is required.
|
||||
if key, err = section.GetKey("user"); err != nil {
|
||||
log.Fatal("No database user in seafile.conf.")
|
||||
}
|
||||
user := key.String()
|
||||
|
||||
if key, err = section.GetKey("password"); err != nil {
|
||||
log.Fatal("No database password in seafile.conf.")
|
||||
}
|
||||
password := key.String()
|
||||
port := 5236
|
||||
if key, err = section.GetKey("port"); err == nil {
|
||||
port, _ = key.Int()
|
||||
}
|
||||
dsn := fmt.Sprintf("dm://%s:%s@%s:%d", user, password, host, port)
|
||||
seafileDB, err = sql.Open("dm", dsn)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to open dm database: %v", err)
|
||||
}
|
||||
} else {
|
||||
log.Fatalf("Unsupported database %s.", dbEngine)
|
||||
}
|
||||
@@ -373,7 +421,7 @@ func main() {
|
||||
|
||||
commitmgr.Init(centralDir, dataDir)
|
||||
|
||||
share.Init(ccnetDB, seafileDB, option.GroupTableName, option.CloudMode)
|
||||
share.Init(ccnetDB, seafileDB, option.GroupTableName, option.CloudMode, dbType)
|
||||
|
||||
rpcClientInit()
|
||||
|
||||
|
@@ -11,7 +11,7 @@ require (
|
||||
github.com/json-iterator/go v1.1.12
|
||||
github.com/mattn/go-sqlite3 v1.14.0
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
golang.org/x/text v0.3.7
|
||||
golang.org/x/text v0.13.0
|
||||
gopkg.in/ini.v1 v1.55.0
|
||||
)
|
||||
|
||||
@@ -19,9 +19,10 @@ require (
|
||||
github.com/cespare/xxhash/v2 v2.1.1 // indirect
|
||||
github.com/dustin/go-humanize v1.0.0 // indirect
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/smartystreets/goconvey v1.6.4 // indirect
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect
|
||||
golang.org/x/sys v0.5.0 // indirect
|
||||
)
|
||||
|
@@ -7,16 +7,18 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
|
||||
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
@@ -59,9 +61,13 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc=
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
|
@@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/haiwen/seafile-server/fileserver/option"
|
||||
"github.com/haiwen/seafile-server/fileserver/repomgr"
|
||||
@@ -62,7 +63,12 @@ func checkQuota(repoID string, delta int64) (int, error) {
|
||||
|
||||
func getUserQuota(user string) (int64, error) {
|
||||
var quota int64
|
||||
sqlStr := "SELECT quota FROM UserQuota WHERE user=?"
|
||||
sqlStr := ""
|
||||
if strings.EqualFold(dbType, "mysql") {
|
||||
sqlStr = "SELECT quota FROM UserQuota WHERE user=?"
|
||||
} else {
|
||||
sqlStr = "SELECT quota FROM UserQuota WHERE \"user\"=?"
|
||||
}
|
||||
row := seafileDB.QueryRow(sqlStr, user)
|
||||
if err := row.Scan("a); err != nil {
|
||||
if err != sql.ErrNoRows {
|
||||
|
@@ -607,12 +607,6 @@ func removeVirtualRepoOndisk(repoID string, cloudMode bool) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
sqlStr = "REPLACE INTO GarbageRepos (repo_id) VALUES (?)"
|
||||
_, err := seafileDB.Exec(sqlStr, repoID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@@ -25,13 +25,15 @@ var ccnetDB *sql.DB
|
||||
var seafileDB *sql.DB
|
||||
var groupTableName string
|
||||
var cloudMode bool
|
||||
var dbType string
|
||||
|
||||
// Init ccnetDB, seafileDB, groupTableName, cloudMode
|
||||
func Init(cnDB *sql.DB, seafDB *sql.DB, grpTableName string, clMode bool) {
|
||||
func Init(cnDB *sql.DB, seafDB *sql.DB, grpTableName string, clMode bool, dType string) {
|
||||
ccnetDB = cnDB
|
||||
seafileDB = seafDB
|
||||
groupTableName = grpTableName
|
||||
cloudMode = clMode
|
||||
dbType = dType
|
||||
}
|
||||
|
||||
// CheckPerm get user's repo permission
|
||||
@@ -95,9 +97,15 @@ func getUserGroups(sqlStr string, args ...interface{}) ([]group, error) {
|
||||
}
|
||||
|
||||
func getGroupsByUser(userName string, returnAncestors bool) ([]group, error) {
|
||||
tableName := ""
|
||||
if strings.EqualFold(dbType, "mysql") {
|
||||
tableName = fmt.Sprintf("`%s`", groupTableName)
|
||||
} else {
|
||||
tableName = fmt.Sprintf("\"%s\"", groupTableName)
|
||||
}
|
||||
sqlStr := fmt.Sprintf("SELECT g.group_id, group_name, creator_name, timestamp, parent_group_id FROM "+
|
||||
"`%s` g, GroupUser u WHERE g.group_id = u.group_id AND user_name=? ORDER BY g.group_id DESC",
|
||||
groupTableName)
|
||||
"%s g, GroupUser u WHERE g.group_id = u.group_id AND user_name=? ORDER BY g.group_id DESC",
|
||||
tableName)
|
||||
groups, err := getUserGroups(sqlStr, userName)
|
||||
if err != nil {
|
||||
err := fmt.Errorf("Failed to get groups by user %s: %v", userName, err)
|
||||
@@ -135,8 +143,8 @@ func getGroupsByUser(userName string, returnAncestors bool) ([]group, error) {
|
||||
}
|
||||
|
||||
sqlStr = fmt.Sprintf("SELECT g.group_id, group_name, creator_name, timestamp, parent_group_id FROM "+
|
||||
"`%s` g WHERE g.group_id IN (%s) ORDER BY g.group_id DESC",
|
||||
groupTableName, paths)
|
||||
"%s g WHERE g.group_id IN (%s) ORDER BY g.group_id DESC",
|
||||
tableName, paths)
|
||||
groups, err := getUserGroups(sqlStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@@ -638,10 +638,14 @@ func headCommitsMultiCB(rsp http.ResponseWriter, r *http.Request) *appError {
|
||||
}
|
||||
}
|
||||
|
||||
mode := ""
|
||||
if strings.EqualFold(dbType, "mysql") {
|
||||
mode = "LOCK IN SHARE MODE"
|
||||
}
|
||||
sqlStr := fmt.Sprintf(
|
||||
"SELECT repo_id, commit_id FROM Branch WHERE name='master' AND "+
|
||||
"repo_id IN (%s) LOCK IN SHARE MODE",
|
||||
repoIDs.String())
|
||||
"repo_id IN (%s) %s",
|
||||
repoIDs.String(), mode)
|
||||
|
||||
rows, err := seafileDB.Query(sqlStr)
|
||||
if err != nil {
|
||||
@@ -1068,7 +1072,7 @@ func putUpdateBranchCB(rsp http.ResponseWriter, r *http.Request) *appError {
|
||||
func getHeadCommit(rsp http.ResponseWriter, r *http.Request) *appError {
|
||||
vars := mux.Vars(r)
|
||||
repoID := vars["repoid"]
|
||||
sqlStr := "SELECT EXISTS(SELECT 1 FROM Repo WHERE repo_id=?)"
|
||||
sqlStr := "SELECT 1 FROM Repo WHERE repo_id=?"
|
||||
var exists bool
|
||||
row := seafileDB.QueryRow(sqlStr, repoID)
|
||||
if err := row.Scan(&exists); err != nil {
|
||||
|
Reference in New Issue
Block a user