1
0
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:
杨赫然
2023-10-16 10:06:40 +08:00
parent c95fc7d943
commit 74f0ef968c
7 changed files with 87 additions and 20 deletions

View File

@@ -5,6 +5,7 @@ import (
"crypto/tls" "crypto/tls"
"crypto/x509" "crypto/x509"
"database/sql" "database/sql"
_ "dm"
"flag" "flag"
"fmt" "fmt"
"io" "io"
@@ -155,6 +156,29 @@ func loadCcnetDB() {
if err != nil { if err != nil {
log.Fatalf("Failed to open database %s: %v", ccnetDBPath, err) 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 { } else {
log.Fatalf("Unsupported database %s.", dbEngine) log.Fatalf("Unsupported database %s.", dbEngine)
} }
@@ -263,6 +287,30 @@ func loadSeafileDB() {
if err != nil { if err != nil {
log.Fatalf("Failed to open database %s: %v", seafileDBPath, err) 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 { } else {
log.Fatalf("Unsupported database %s.", dbEngine) log.Fatalf("Unsupported database %s.", dbEngine)
} }
@@ -373,7 +421,7 @@ func main() {
commitmgr.Init(centralDir, dataDir) commitmgr.Init(centralDir, dataDir)
share.Init(ccnetDB, seafileDB, option.GroupTableName, option.CloudMode) share.Init(ccnetDB, seafileDB, option.GroupTableName, option.CloudMode, dbType)
rpcClientInit() rpcClientInit()

View File

@@ -11,7 +11,7 @@ require (
github.com/json-iterator/go v1.1.12 github.com/json-iterator/go v1.1.12
github.com/mattn/go-sqlite3 v1.14.0 github.com/mattn/go-sqlite3 v1.14.0
github.com/sirupsen/logrus v1.8.1 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 gopkg.in/ini.v1 v1.55.0
) )
@@ -19,9 +19,10 @@ require (
github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // 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/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/smartystreets/goconvey v1.6.4 // 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
) )

View File

@@ -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/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 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= 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 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= 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 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 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 h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 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/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 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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-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 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 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.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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -3,6 +3,7 @@ package main
import ( import (
"database/sql" "database/sql"
"fmt" "fmt"
"strings"
"github.com/haiwen/seafile-server/fileserver/option" "github.com/haiwen/seafile-server/fileserver/option"
"github.com/haiwen/seafile-server/fileserver/repomgr" "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) { func getUserQuota(user string) (int64, error) {
var quota int64 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) row := seafileDB.QueryRow(sqlStr, user)
if err := row.Scan(&quota); err != nil { if err := row.Scan(&quota); err != nil {
if err != sql.ErrNoRows { if err != sql.ErrNoRows {

View File

@@ -607,12 +607,6 @@ func removeVirtualRepoOndisk(repoID string, cloudMode bool) error {
if err != nil { if err != nil {
return err return err
} }
} else {
sqlStr = "REPLACE INTO GarbageRepos (repo_id) VALUES (?)"
_, err := seafileDB.Exec(sqlStr, repoID)
if err != nil {
return err
}
} }
return nil return nil

View File

@@ -25,13 +25,15 @@ var ccnetDB *sql.DB
var seafileDB *sql.DB var seafileDB *sql.DB
var groupTableName string var groupTableName string
var cloudMode bool var cloudMode bool
var dbType string
// Init ccnetDB, seafileDB, groupTableName, cloudMode // 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 ccnetDB = cnDB
seafileDB = seafDB seafileDB = seafDB
groupTableName = grpTableName groupTableName = grpTableName
cloudMode = clMode cloudMode = clMode
dbType = dType
} }
// CheckPerm get user's repo permission // 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) { 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 "+ 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", "%s g, GroupUser u WHERE g.group_id = u.group_id AND user_name=? ORDER BY g.group_id DESC",
groupTableName) tableName)
groups, err := getUserGroups(sqlStr, userName) groups, err := getUserGroups(sqlStr, userName)
if err != nil { if err != nil {
err := fmt.Errorf("Failed to get groups by user %s: %v", userName, err) 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 "+ 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", "%s g WHERE g.group_id IN (%s) ORDER BY g.group_id DESC",
groupTableName, paths) tableName, paths)
groups, err := getUserGroups(sqlStr) groups, err := getUserGroups(sqlStr)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -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( sqlStr := fmt.Sprintf(
"SELECT repo_id, commit_id FROM Branch WHERE name='master' AND "+ "SELECT repo_id, commit_id FROM Branch WHERE name='master' AND "+
"repo_id IN (%s) LOCK IN SHARE MODE", "repo_id IN (%s) %s",
repoIDs.String()) repoIDs.String(), mode)
rows, err := seafileDB.Query(sqlStr) rows, err := seafileDB.Query(sqlStr)
if err != nil { 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 { func getHeadCommit(rsp http.ResponseWriter, r *http.Request) *appError {
vars := mux.Vars(r) vars := mux.Vars(r)
repoID := vars["repoid"] repoID := vars["repoid"]
sqlStr := "SELECT EXISTS(SELECT 1 FROM Repo WHERE repo_id=?)" sqlStr := "SELECT 1 FROM Repo WHERE repo_id=?"
var exists bool var exists bool
row := seafileDB.QueryRow(sqlStr, repoID) row := seafileDB.QueryRow(sqlStr, repoID)
if err := row.Scan(&exists); err != nil { if err := row.Scan(&exists); err != nil {