diff --git a/fileserver/fileserver.go b/fileserver/fileserver.go index 9b84ec9..66a72bb 100644 --- a/fileserver/fileserver.go +++ b/fileserver/fileserver.go @@ -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() diff --git a/fileserver/go.mod b/fileserver/go.mod index 75b7867..62c9e6a 100644 --- a/fileserver/go.mod +++ b/fileserver/go.mod @@ -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 ) diff --git a/fileserver/go.sum b/fileserver/go.sum index f4660cd..7cbdbdd 100644 --- a/fileserver/go.sum +++ b/fileserver/go.sum @@ -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= diff --git a/fileserver/quota.go b/fileserver/quota.go index b82c1c6..824955a 100644 --- a/fileserver/quota.go +++ b/fileserver/quota.go @@ -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 { diff --git a/fileserver/repomgr/repomgr.go b/fileserver/repomgr/repomgr.go index a617197..b945bf0 100644 --- a/fileserver/repomgr/repomgr.go +++ b/fileserver/repomgr/repomgr.go @@ -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 diff --git a/fileserver/share/share.go b/fileserver/share/share.go index 8a77963..510b3c2 100644 --- a/fileserver/share/share.go +++ b/fileserver/share/share.go @@ -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 diff --git a/fileserver/sync_api.go b/fileserver/sync_api.go index 4a0161c..16eb6e3 100644 --- a/fileserver/sync_api.go +++ b/fileserver/sync_api.go @@ -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 {