func()

in oracle/pkg/database/dbdaemon/dbdaemon_server.go [1100:1170]


func (s *Server) runSQLPlusHelper(ctx context.Context, req *dbdpb.RunSQLPlusCMDRequest, formattedSQL bool) (*dbdpb.RunCMDResponse, error) {
	if req.GetTnsAdmin() != "" {
		if err := os.Setenv("TNS_ADMIN", req.GetTnsAdmin()); err != nil {
			return nil, fmt.Errorf("failed to set env variable: %v", err)
		}
		defer func() {
			if err := os.Unsetenv("TNS_ADMIN"); err != nil {
				klog.Warningf("failed to unset env variable: %v", err)
			}
		}()
	}

	sqls := req.GetCommands()
	if len(sqls) < 1 {
		return nil, fmt.Errorf("dbdaemon/RunSQLPlus requires a sql statement to run, provided: %d", len(sqls))
	}

	// formattedSQL = query, hence it is not an op that needs a prelim conn.
	// Only enable prelim for known prelim queries, CREATE SPFILE and CREATE PFILE.
	var prelim bool
	if !formattedSQL && (strings.HasPrefix(strings.ToLower(sqls[0]), "create spfile") ||
		strings.HasPrefix(strings.ToLower(sqls[0]), "create pfile")) {
		prelim = true
	}

	// This default connect string requires the ORACLE_SID env variable to be set.
	connectString := "oracle://?sysdba=1"

	switch req.ConnectInfo.(type) {
	case *dbdpb.RunSQLPlusCMDRequest_Dsn:
		connectString = req.GetDsn()
	case *dbdpb.RunSQLPlusCMDRequest_DatabaseName:
		if err := os.Setenv("ORACLE_SID", req.GetDatabaseName()); err != nil {
			return nil, fmt.Errorf("failed to set env variable: %v", err)
		}
	case *dbdpb.RunSQLPlusCMDRequest_Local:
		if err := os.Setenv("ORACLE_SID", s.databaseSid.val); err != nil {
			return nil, fmt.Errorf("failed to set env variable: %v", err)
		}
	default:
		// For backward compatibility if connect_info field isn't defined in the request
		// we fallback to the Local option.
		if err := os.Setenv("ORACLE_SID", s.databaseSid.val); err != nil {
			return nil, fmt.Errorf("failed to set env variable: %v", err)
		}
	}

	db, err := open(ctx, connectString, prelim)
	if err != nil {
		return nil, fmt.Errorf("dbdaemon/RunSQLPlus failed to open a database connection: %v", err)
	}
	defer func() {
		if err := db.Close(); err != nil {
			klog.Warningf("failed to close db connection: %v", err)
		}
	}()

	var o []string
	if formattedSQL {
		o, err = s.database.runQuery(ctx, sqls, db)
	} else {
		o, err = s.database.runSQL(ctx, sqls, prelim, req.GetSuppress(), db)
	}
	if err != nil {
		klog.ErrorS(err, "dbdaemon/RunSQLPlus: error in execution", "formattedSQL", formattedSQL, "ORACLE_SID", s.databaseSid.val)
		return nil, err
	}

	klog.InfoS("dbdaemon/RunSQLPlus", "output", strings.Join(o, "\n"))
	return &dbdpb.RunCMDResponse{Msg: o}, nil
}