/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.command.ddl; import org.h2.command.CommandInterface; import org.h2.constant.ErrorCode; import org.h2.engine.Comment; import org.h2.engine.Database; import org.h2.engine.DbObject; import org.h2.engine.Session; import org.h2.expression.Expression; import org.h2.message.DbException; import org.h2.table.Table; /** * This class represents the statement * COMMENT */ public class SetComment extends DefineCommand { private String schemaName; private String objectName; private boolean column; private String columnName; private int objectType; private Expression expr; public SetComment(Session session) { super(session); } public int update() { session.commit(true); Database db = session.getDatabase(); session.getUser().checkAdmin(); DbObject object = null; int errorCode = ErrorCode.GENERAL_ERROR_1; if (schemaName == null) { schemaName = session.getCurrentSchemaName(); } switch (objectType) { case DbObject.CONSTANT: object = db.getSchema(schemaName).getConstant(objectName); break; case DbObject.CONSTRAINT: object = db.getSchema(schemaName).getConstraint(objectName); break; case DbObject.FUNCTION_ALIAS: object = db.getSchema(schemaName).findFunction(objectName); errorCode = ErrorCode.FUNCTION_ALIAS_NOT_FOUND_1; break; case DbObject.INDEX: object = db.getSchema(schemaName).getIndex(objectName); break; case DbObject.ROLE: schemaName = null; object = db.findRole(objectName); errorCode = ErrorCode.ROLE_NOT_FOUND_1; break; case DbObject.SCHEMA: schemaName = null; object = db.findSchema(objectName); errorCode = ErrorCode.SCHEMA_NOT_FOUND_1; break; case DbObject.SEQUENCE: object = db.getSchema(schemaName).getSequence(objectName); break; case DbObject.TABLE_OR_VIEW: object = db.getSchema(schemaName).getTableOrView(session, objectName); break; case DbObject.TRIGGER: object = db.getSchema(schemaName).findTrigger(objectName); errorCode = ErrorCode.TRIGGER_NOT_FOUND_1; break; case DbObject.USER: schemaName = null; object = db.getUser(objectName); break; case DbObject.USER_DATATYPE: schemaName = null; object = db.findUserDataType(objectName); errorCode = ErrorCode.USER_DATA_TYPE_ALREADY_EXISTS_1; break; default: } if (object == null) { throw DbException.get(errorCode, objectName); } String text = expr.optimize(session).getValue(session).getString(); if (column) { Table table = (Table) object; table.getColumn(columnName).setComment(text); } else { object.setComment(text); } if (column || objectType == DbObject.TABLE_OR_VIEW || objectType == DbObject.USER || objectType == DbObject.INDEX || objectType == DbObject.CONSTRAINT) { db.update(session, object); } else { Comment comment = db.findComment(object); if (comment == null) { if (text == null) { // reset a non-existing comment - nothing to do } else { int id = getObjectId(); comment = new Comment(db, id, object); comment.setCommentText(text); db.addDatabaseObject(session, comment); } } else { if (text == null) { db.removeDatabaseObject(session, comment); } else { comment.setCommentText(text); db.update(session, comment); } } } return 0; } public void setCommentExpression(Expression expr) { this.expr = expr; } public void setObjectName(String objectName) { this.objectName = objectName; } public void setObjectType(int objectType) { this.objectType = objectType; } public void setColumnName(String columnName) { this.columnName = columnName; } public void setSchemaName(String schemaName) { this.schemaName = schemaName; } public void setColumn(boolean column) { this.column = column; } public int getType() { return CommandInterface.COMMENT; } }