github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/lorry/operations/sql/exec.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package sql 21 22 import ( 23 "context" 24 25 "github.com/go-logr/logr" 26 "github.com/pkg/errors" 27 ctrl "sigs.k8s.io/controller-runtime" 28 29 "github.com/1aal/kubeblocks/pkg/lorry/engines" 30 "github.com/1aal/kubeblocks/pkg/lorry/engines/register" 31 "github.com/1aal/kubeblocks/pkg/lorry/operations" 32 "github.com/1aal/kubeblocks/pkg/lorry/util" 33 ) 34 35 type Exec struct { 36 operations.Base 37 dbManager engines.DBManager 38 logger logr.Logger 39 } 40 41 var exec operations.Operation = &Exec{} 42 43 func init() { 44 err := operations.Register("exec", exec) 45 if err != nil { 46 panic(err.Error()) 47 } 48 } 49 50 func (s *Exec) Init(ctx context.Context) error { 51 dbManager, err := register.GetDBManager() 52 if err != nil { 53 return errors.Wrap(err, "get manager failed") 54 } 55 s.dbManager = dbManager 56 s.logger = ctrl.Log.WithName("exec") 57 return nil 58 } 59 60 func (s *Exec) IsReadonly(ctx context.Context) bool { 61 return false 62 } 63 64 func (s *Exec) Do(ctx context.Context, req *operations.OpsRequest) (*operations.OpsResponse, error) { 65 sql := req.Parameters["sql"].(string) 66 if sql == "" { 67 return nil, errors.New("no sql provided") 68 } 69 70 resp := &operations.OpsResponse{ 71 Data: map[string]any{}, 72 } 73 resp.Data["operation"] = util.ExecOperation 74 75 count, err := s.dbManager.Exec(ctx, sql) 76 if err != nil { 77 s.logger.Info("executing exec error", "error", err) 78 return resp, err 79 } 80 81 resp.Data["count"] = count 82 return resp, err 83 }