/*
 * Copyright 1999-2017 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.druid.sql.ast.statement;

import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;

public class SQLCommitStatement extends SQLStatementImpl {
    // oracle
    private boolean write;
    private Boolean wait;
    private Boolean immediate;

    // mysql
    private boolean work;
    private Boolean chain;
    private Boolean release;

    // sql server
    private SQLExpr transactionName;
    private SQLExpr delayedDurability;

    public SQLCommitStatement() {
    }

    public SQLCommitStatement clone() {
        SQLCommitStatement x = new SQLCommitStatement();
        x.write = write;
        x.wait = wait;
        x.immediate = immediate;
        x.work = work;
        x.chain = chain;
        x.release = release;

        if (transactionName != null) {
            x.setTransactionName(transactionName.clone());
        }
        if (delayedDurability != null) {
            x.setDelayedDurability(delayedDurability.clone());
        }
        return x;
    }

    public void accept0(SQLASTVisitor visitor) {
        if (visitor.visit(this)) {
            if (transactionName != null) {
                transactionName.accept(visitor);
            }

            if (delayedDurability != null) {
                delayedDurability.accept(visitor);
            }
        }
        visitor.endVisit(this);
    }

    // oracle
    public boolean isWrite() {
        return write;
    }

    public void setWrite(boolean write) {
        this.write = write;
    }

    public Boolean getWait() {
        return wait;
    }

    public void setWait(Boolean wait) {
        this.wait = wait;
    }

    public Boolean getImmediate() {
        return immediate;
    }

    public void setImmediate(Boolean immediate) {
        this.immediate = immediate;
    }

    // mysql
    public Boolean getChain() {
        return chain;
    }

    public void setChain(Boolean chain) {
        this.chain = chain;
    }

    public Boolean getRelease() {
        return release;
    }

    public void setRelease(Boolean release) {
        this.release = release;
    }

    public boolean isWork() {
        return work;
    }

    public void setWork(boolean work) {
        this.work = work;
    }

    // sql server
    public SQLExpr getTransactionName() {
        return transactionName;
    }

    public void setTransactionName(SQLExpr transactionName) {
        if (transactionName != null) {
            transactionName.setParent(this);
        }
        this.transactionName = transactionName;
    }

    public SQLExpr getDelayedDurability() {
        return delayedDurability;
    }

    public void setDelayedDurability(SQLExpr delayedDurability) {
        if (delayedDurability != null) {
            delayedDurability.setParent(this);
        }
        this.delayedDurability = delayedDurability;
    }
}
