From ccb002a9459027e817e76694bb79c91b37a4473e Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Mon, 21 Aug 2023 12:59:50 +0800 Subject: [PATCH] d --- features/dbrest/dbrest.go | 177 +++++++++++++++++++++++++++++++++++++- lib/routes/routes.go | 5 ++ 2 files changed, 179 insertions(+), 3 deletions(-) diff --git a/features/dbrest/dbrest.go b/features/dbrest/dbrest.go index 0d08ab05..4afcd3e1 100644 --- a/features/dbrest/dbrest.go +++ b/features/dbrest/dbrest.go @@ -41,9 +41,10 @@ var ( CustomXormUpdateDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/update/{databaseName}/{tableName}" CustomXormDeleteDataUri = config.UriPrefix + "/databaseManagement/{apiVersion}/delete/{databaseName}/{tableName}" - XormCommonUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/{databaseName}/{tableName}" // for internal - XormExtDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}" // for external - XormDataSQLUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}" // for external + XormCommonUri = config.DefaultUriPrefix + "/databaseManagement/{apiVersion}/{databaseName}/{tableName}" // for internal + XormDatabaseUri = config.DefaultUriPrefix + "/database/{apiVersion}/{databaseName}/{tableName}" // for crontask + XormExtDataUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}" // for external + XormDataSQLUri = config.DefaultUriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}" // for external CustomXormCommonUri = config.UriPrefix + "/databaseManagement/{apiVersion}/{databaseName}/{tableName}" // for internal CustomXormExtDataUri = config.UriPrefix + "/dataManagement/{apiVersion}/{dataStorage}/{dataObject}" // for external @@ -733,3 +734,173 @@ func DbStop(w http.ResponseWriter, r *http.Request) { } services.ResponseWithJson(w, 200, rse) } + +// xorm Get data from database +func TaskDatabaseGetData(w http.ResponseWriter, r *http.Request) { + log.Debug("DatabaseGetData processing... ") + + var sql []string + var err error + + vars := mux.Vars(r) + tblName := vars["tableName"] + sql = GetUriSQLArray(r) + // select as must, todo ... + + if sql == nil { + wc := services.GetUriWhereString(r) + if wc == "" { + sql = append(sql, fmt.Sprintf("select * from %s", tblName)) + } else { + sql = append(sql, fmt.Sprintf("select * from %s where %s", tblName, wc)) + } + } + + ls := services.GetUriPageLimitString(r) + + // data := make([]map[string]interface{}, 0) + // xormResponse := make([]map[string]interface{}, len(sql)) + var xormResponse XormResponse + data := make([]map[string]interface{}, 0) + for i, s := range sql { + log.Tracef("SQL[%d]: %s", i, sql[i]) + + rows := make([]map[string]interface{}, 0) + mapRows := make(map[string]interface{}) + + if s != "" { + // err = XEngine.SQL(s).Find(&rows) + if IsQuerySQL(s) == false { + services.ResponseNotAcceptable406QuerySQLError(w) + return + } + + querySQL := s + if i == (len(sql) - 1) { + querySQL = querySQL + " " + ls + } + log.Debug("querySQL:", querySQL) + rows, err = DbClient.XEngine.QueryInterface(querySQL) + if err != nil { + log.Error("SQL failed:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + tableName := GetTableName(s) + log.Debugf("s:%s tableName:%s", s, tableName) + mapRows[tableName] = rows + data = append(data, mapRows) + log.Trace("data:", data) + } + i++ + } + xormResponse.Data = data + + services.ResponseWithJson(w, http.StatusOK, xormResponse) +} + +func TaskDatabaseInsertData(w http.ResponseWriter, r *http.Request) { + log.Debug("DatabaseInsertData processing... ") + + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) //io.LimitReader限制大小 + if err != nil { + log.Error("io.ReadAll failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + + vars := mux.Vars(r) + tableName := vars["tableName"] + log.Debug("Request body:", string(body), "tableName:", tableName) + insertData := make(map[string]interface{}) + _ = json.Unmarshal(body, &insertData) + + tn, sql := dborm.ConstructInsertSQL(tableName, insertData) + log.Tracef("tn: %s sql :%s", tn, sql) + xSession := DbClient.XEngine.NewSession() + defer xSession.Close() + var affected int64 + for _, s := range sql { + res, err := xSession.Exec(s) + if err != nil { + log.Error("Insert failed:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + n, _ := res.RowsAffected() + affected = affected + n + } + xSession.Commit() + // affected, err := InsertDataWithJson(insertData) + mapRow := make(map[string]interface{}) + row := map[string]interface{}{"affectedRows": affected} + mapRow[tn] = row + // xormResponse.Data = mapRow + services.ResponseWithJson(w, http.StatusOK, mapRow) +} + +func TaskDatabaseUpdateData(w http.ResponseWriter, r *http.Request) { + log.Debug("DatabaseUpdateData processing... ") + + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + + vars := mux.Vars(r) + tblName := vars["tableName"] + wc := services.GetUriWhereString(r) + + log.Debug("Request body:", string(body), "Table name:", tblName, "wc:", wc) + updateData := make(map[string]interface{}) + _ = json.Unmarshal(body, &updateData) + + tn, sql := dborm.ConstructUpdateSQL(tblName, updateData, wc) + log.Tracef("tn: %s sql :%s", tn, sql) + xSession := DbClient.XEngine.NewSession() + defer xSession.Close() + var affected int64 + for _, s := range sql { + res, err := xSession.Exec(s) + if err != nil { + log.Error("Update failed:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + n, _ := res.RowsAffected() + affected = affected + n + } + xSession.Commit() + mapRow := make(map[string]interface{}) + row := map[string]interface{}{"affectedRows": affected} + mapRow[tn] = row + services.ResponseWithJson(w, http.StatusOK, mapRow) +} + +func TaskDatabaseDeleteData(w http.ResponseWriter, r *http.Request) { + log.Debug("DatabaseDeleteData processing... ") + + vars := mux.Vars(r) + tblName := vars["tableName"] + wc := services.GetUriWhereString(r) + + log.Debug("Table name:", tblName, "wc:", wc) + + sql := dborm.ConstructDeleteSQL(tblName, wc) + xSession := DbClient.XEngine.NewSession() + defer xSession.Close() + res, err := xSession.Exec(sql) + if err != nil { + log.Error("Update failed, err:", err) + services.ResponseInternalServerError500DatabaseOperationFailed(w) + return + } + affected, _ := res.RowsAffected() + xSession.Commit() + mapRow := make(map[string]interface{}) + row := map[string]interface{}{"affectedRows": affected} + mapRow["data"] = row + services.ResponseWithJson(w, http.StatusOK, mapRow) +} diff --git a/lib/routes/routes.go b/lib/routes/routes.go index b1a72d1c..b4bf8c02 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -76,6 +76,11 @@ func init() { Register("PUT", dbrest.XormCommonUri, dbrest.DatabaseUpdateData, nil) Register("DELETE", dbrest.XormCommonUri, dbrest.DatabaseDeleteData, nil) + Register("GET", dbrest.XormDatabaseUri, dbrest.TaskDatabaseGetData, nil) + Register("POST", dbrest.XormDatabaseUri, dbrest.TaskDatabaseInsertData, nil) + Register("PUT", dbrest.XormDatabaseUri, dbrest.TaskDatabaseUpdateData, nil) + Register("DELETE", dbrest.XormDatabaseUri, dbrest.TaskDatabaseDeleteData, nil) + Register("GET", dbrest.CustomXormCommonUri, dbrest.DatabaseGetData, nil) Register("POST", dbrest.CustomXormCommonUri, dbrest.DatabaseInsertData, nil) Register("PUT", dbrest.CustomXormCommonUri, dbrest.DatabaseUpdateData, nil)