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/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()
|
||||||
|
|
||||||
|
@@ -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
|
||||||
)
|
)
|
||||||
|
@@ -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=
|
||||||
|
@@ -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("a); err != nil {
|
if err := row.Scan("a); err != nil {
|
||||||
if err != sql.ErrNoRows {
|
if err != sql.ErrNoRows {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user