1 package com.quadcap.sql; 2 3 40 41 import java.io.IOException ; 42 43 import java.util.Enumeration ; 44 45 import java.sql.SQLException ; 46 47 import com.quadcap.util.Debug; 48 49 54 public class StmtDropConstraint implements Stmt { 55 String tableName; 56 String constraintName; 57 boolean restrict; 58 59 public StmtDropConstraint(String tableName, String constraintName, 60 boolean restrict) { 61 this.tableName = tableName; 62 this.constraintName = constraintName; 63 this.restrict = restrict; 64 } 65 66 public void execute(Session session) throws IOException , SQLException { 67 session.getTableWriteLock("#Schema"); 68 session.getTableWriteLock(tableName); 69 Database db = session.getDatabase(); 70 Table table = (Table)db.getRelation(tableName); 71 if (table == null) { 72 throw new SQLException ("table not found: " + tableName); 73 } 74 Constraint constraint = table.getConstraint(constraintName); 75 if (constraint == null) { 76 throw new SQLException ("constraint not found: " + constraintName); 77 } 78 if (restrict) { 79 if (constraint instanceof UniqueConstraint) { 80 UniqueConstraint uc = (UniqueConstraint)constraint; 81 Enumeration en = uc.getExportConstraints(); 82 if (en.hasMoreElements()) { 83 throw new SQLException ("Can't drop unique/primary key " + 84 "because of referencing foreign " + 85 "key constraints"); 86 } 87 } 88 } else { 89 if (constraint instanceof UniqueConstraint) { 90 UniqueConstraint uc = (UniqueConstraint)constraint; 91 Enumeration en = uc.getExportConstraints(); 92 while (en.hasMoreElements()) { 93 String name = (String )en.nextElement().toString(); 94 ExportedKeyConstraint ec = 95 (ExportedKeyConstraint)table.getConstraint(name); 96 session.doStep(new DeleteConstraint(session, table, ec)); 97 DeleteConstraint.deleteForeign(session, ec); 98 } 99 } 100 } 101 102 if (constraint instanceof IndexConstraint) { 106 int icnt = 0; 107 int num = table.getNumConstraints(); 108 for (int i = 0; i < num; i++) { 109 Constraint c = table.getConstraint(i); 110 if (c instanceof IndexConstraint) icnt++; 111 } 112 if (icnt == 1) { 113 DefaultTableConstraint con = new DefaultTableConstraint(); 114 con.setTable(table); 115 table.nameConstraint(con); 116 session.doStep(new AddConstraint(session, table, con)); 117 } 118 } 119 session.doStep(new DeleteConstraint(session, table, constraint)); 120 DeleteConstraint.deleteForeign(session, constraint); 121 122 } 123 124 } 125 | Popular Tags |