⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 databaseinformation.java

📁 Java写的含有一个jdbc驱动的小型数据库数据库引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	    }

	    return t;
	} else if (name.equals("SYSTEM_INDEXINFO")) {
	    Table t = createTable(name);

	    t.addColumn("TABLE_" + META_CAT, Column.VARCHAR);
	    t.addColumn("TABLE_" + META_SCHEM, Column.VARCHAR);
	    t.addColumn("TABLE_NAME", Column.VARCHAR);
	    t.addColumn("NON_UNIQUE", Column.BIT);
	    t.addColumn("INDEX_QUALIFIER", Column.VARCHAR);
	    t.addColumn("INDEX_NAME", Column.VARCHAR);
	    t.addColumn("TYPE", Column.SMALLINT);
	    t.addColumn(META_ORDINAL_POSITON, Column.SMALLINT);
	    t.addColumn("COLUMN_NAME", Column.VARCHAR);
	    t.addColumn(META_ASC_OR_DESC, Column.VARCHAR);
	    t.addColumn("CARDINALITY", Column.INTEGER);
	    t.addColumn("PAGES", Column.INTEGER);
	    t.addColumn("FILTER_CONDITION", Column.VARCHAR);
	    t.createPrimaryKey();

	    for (int i = 0; i < tTable.size(); i++) {
		Table table = (Table) tTable.elementAt(i);
		Index index = null;

		while (true) {
		    index = table.getNextIndex(index);

		    if (index == null) {
			break;
		    }

		    int cols[] = index.getColumns();
		    int len = cols.length;

		    // this removes the column that makes every index unique
		    if (!index.isUnique()) {
			len--;
		    }

		    for (int j = 0; j < len; j++) {
			Object o[] = t.getNewRow();

			o[2] = table.getName();
			o[3] = new Boolean(!index.isUnique());
			o[5] = index.getName();
			o[6] = new Short(DatabaseMetaData.tableIndexOther);
			o[7] = new Short((short) (j + 1));
			o[8] = table.getColumnName(cols[j]);
			o[9] = "A";

			t.insert(o, null);
		    }
		}
	    }

	    return t;
	} else if (name.equals("SYSTEM_UDTS")) {
	    Table t = createTable(name);

	    t.addColumn("TYPE_" + META_CAT, Column.VARCHAR);
	    t.addColumn("TYPE_" + META_SCHEM, Column.VARCHAR);
	    t.addColumn("TYPE_NAME", Column.VARCHAR);
	    t.addColumn("CLASS_NAME", Column.BIT);
	    t.addColumn("DATA_TYPE", Column.VARCHAR);
	    t.addColumn("REMARKS", Column.VARCHAR);
	    t.createPrimaryKey();

	    return t;
	} else if (name.equals("SYSTEM_CONNECTIONINFO")) {
	    Table t = createTable(name);

	    t.addColumn("KEY", Column.VARCHAR);
	    t.addColumn("VALUE", Column.VARCHAR);
	    t.createPrimaryKey();

	    Object o[] = t.getNewRow();

	    o[0] = "USER";
	    o[1] = channel.getUsername();

	    t.insert(o, null);

	    o = t.getNewRow();
	    o[0] = "READONLY";
	    o[1] = channel.isReadOnly() ? "TRUE" : "FALSE";

	    t.insert(o, null);

	    o = t.getNewRow();
	    o[0] = "MAXROWS";
	    o[1] = "" + channel.getMaxRows();

	    t.insert(o, null);

	    o = t.getNewRow();
	    o[0] = "DATABASE";
	    o[1] = "" + channel.getDatabase().getName();

	    t.insert(o, null);

	    o = t.getNewRow();
	    o[0] = "IDENTITY";
	    o[1] = "" + channel.getLastIdentity();

	    t.insert(o, null);

	    return t;
	} else if (name.equals("SYSTEM_USERS")) {
	    Table t = createTable(name);

	    t.addColumn("USER", Column.VARCHAR);
	    t.addColumn("ADMIN", Column.BIT);
	    t.createPrimaryKey();

	    Vector v = aAccess.getUsers();

	    for (int i = 0; i < v.size(); i++) {
		User u = (User) v.elementAt(i);

		// todo: this is not a nice implementation
		if (u == null) {
		    continue;
		}

		String user = u.getName();

		if (!user.equals("PUBLIC")) {
		    Object o[] = t.getNewRow();

		    o[0] = user;
		    o[1] = new Boolean(u.isAdmin());

		    t.insert(o, null);
		}
	    }

	    return t;
	}

	return null;
    }

    /**
     * Method declaration
     *
     *
     * @param bDrop
     * @param bInsert
     * @param bCached
     * @param channel
     *
     * @return
     *
     * @throws SQLException
     */
    Result getScript(boolean bDrop, boolean bInsert, boolean bCached,
		     Channel channel) throws SQLException {
	channel.checkAdmin();

	Result r = new Result(1);

	r.iType[0] = Column.VARCHAR;
	r.sTable[0] = "SYSTEM_SCRIPT";
	r.sLabel[0] = "COMMAND";
	r.sName[0] = "COMMAND";

	StringBuffer a;

	for (int i = 0; i < tTable.size(); i++) {
	    Table t = (Table) tTable.elementAt(i);

	    if (bDrop) {
		addRow(r, "DROP TABLE " + t.getName());
	    }

	    a = new StringBuffer("CREATE ");

	    if (t.isCached()) {
		a.append("CACHED ");
	    }

	    a.append("TABLE ");
	    a.append(t.getName());
	    a.append('(');

	    int   columns = t.getColumnCount();
	    Index pki = t.getIndex("SYSTEM_PK");
	    int   pk = (pki == null) ? -1 : pki.getColumns()[0];

	    for (int j = 0; j < columns; j++) {
		a.append(t.getColumnName(j));
		a.append(' ');
		a.append(Column.getType(t.getType(j)));

		if (!t.getColumnIsNullable(j)) {
		    a.append(" NOT NULL");
		}

		if (j == t.getIdentityColumn()) {
		    a.append(" IDENTITY");
		}

		if (j == pk) {
		    a.append(" PRIMARY KEY");
		}

		if (j < columns - 1) {
		    a.append(',');
		}
	    }

	    Vector v = t.getConstraints();

	    for (int j = 0; j < v.size(); j++) {
		Constraint c = (Constraint) v.elementAt(j);

		if (c.getType() == Constraint.FOREIGN_KEY) {
		    a.append(",FOREIGN KEY");

		    int col[] = c.getRefColumns();

		    a.append(getColumnList(c.getRef(), col, col.length));
		    a.append("REFERENCES ");
		    a.append(c.getMain().getName());

		    col = c.getMainColumns();

		    a.append(getColumnList(c.getMain(), col, col.length));
		} else if (c.getType() == Constraint.UNIQUE) {
		    a.append(",UNIQUE");

		    int col[] = c.getMainColumns();

		    a.append(getColumnList(c.getMain(), col, col.length));
		}
	    }

	    a.append(')');
	    addRow(r, a.toString());

	    Index index = null;

	    while (true) {
		index = t.getNextIndex(index);

		if (index == null) {
		    break;
		}

		String indexname = index.getName();

		if (indexname.equals("SYSTEM_PK")) {
		    continue;
		} else if (indexname.startsWith("SYSTEM_FOREIGN_KEY")) {

		    // foreign keys where created in the 'create table'
		    continue;
		} else if (indexname.startsWith("SYSTEM_CONSTRAINT")) {

		    // constraints where created in the 'create table'
		    continue;
		}

		a = new StringBuffer("CREATE ");

		if (index.isUnique()) {
		    a.append("UNIQUE ");
		}

		a.append("INDEX ");
		a.append(indexname);
		a.append(" ON ");
		a.append(t.getName());

		int col[] = index.getColumns();
		int len = col.length;

		if (!index.isUnique()) {
		    len--;
		}

		a.append(getColumnList(t, col, len));
		addRow(r, a.toString());
	    }

	    if (bInsert) {
		Index   primary = t.getPrimaryIndex();
		Node    x = primary.first();
		boolean integrity = true;

		if (x != null) {
		    integrity = false;

		    addRow(r, "SET REFERENTIAL_INTEGRITY FALSE");
		}

		while (x != null) {
		    addRow(r, t.getInsertStatement(x.getData()));

		    x = primary.next(x);
		}

		if (!integrity) {
		    addRow(r, "SET REFERENTIAL_INTEGRITY TRUE");
		}
	    }

	    if (bCached && t.isCached()) {
		a = new StringBuffer("SET TABLE ");

		a.append(t.getName());
		a.append(" INDEX '");
		a.append(t.getIndexRoots());
		a.append("'");
		addRow(r, a.toString());
	    }

	    // trigger script
	    int numTrigs = TriggerDef.numTrigs();
	    for (int tv = 0; tv < numTrigs; tv++) {
		    Vector trigVec = t.vTrigs[tv];
			int trCount = trigVec.size();

    		for (int k = 0; k < trCount; k++) {
	    	a = ((TriggerDef) trigVec.elementAt(k)).toBuf();

		    addRow(r, a.toString());
		}
	    }
	}

	Vector v = aAccess.getUsers();

	for (int i = 0; i < v.size(); i++) {
	    User u = (User) v.elementAt(i);

	    // todo: this is not a nice implementation
	    if (u == null) {
		continue;
	    }

	    String name = u.getName();

	    if (!name.equals("PUBLIC")) {
		a = new StringBuffer("CREATE USER ");

		a.append(name);
		a.append(" PASSWORD ");
		a.append("\"" + u.getPassword() + "\"");

		if (u.isAdmin()) {
		    a.append(" ADMIN");
		}

		addRow(r, a.toString());
	    }

	    Hashtable rights = u.getRights();

	    if (rights == null) {
		continue;
	    }

	    Enumeration e = rights.keys();

	    while (e.hasMoreElements()) {
		String object = (String) e.nextElement();
		int    right = ((Integer) (rights.get(object))).intValue();

		if (right == 0) {
		    continue;
		}

		a = new StringBuffer("GRANT ");

		a.append(Access.getRight(right));
		a.append(" ON ");
		a.append(object);
		a.append(" TO ");
		a.append(u.getName());
		addRow(r, a.toString());
	    }
	}

	if (dDatabase.isIgnoreCase()) {
	    addRow(r, "SET IGNORECASE TRUE");
	}

	Hashtable   h = dDatabase.getAlias();
	Enumeration e = h.keys();

	while (e.hasMoreElements()) {
	    String alias = (String) e.nextElement();
	    String java = (String) h.get(alias);

	    addRow(r, "CREATE ALIAS " + alias + " FOR \"" + java + "\"");
	}

	return r;
    }

    /**
     * Method declaration
     *
     *
     * @param t
     * @param col
     * @param len
     *
     * @return
     */
    private String getColumnList(Table t, int col[], int len) {
	StringBuffer a = new StringBuffer("(");

	for (int i = 0; i < len; i++) {
	    a.append(t.getColumnName(col[i]));

	    if (i < len - 1) {
		a.append(',');
	    }
	}

	return a.append(')').toString();
    }

    /**
     * Method declaration
     *
     *
     * @param r
     * @param sql
     */
    private void addRow(Result r, String sql) {
	String s[] = new String[1];

	s[0] = sql;

	r.add(s);
    }

    /**
     * Method declaration
     *
     *
     * @param name
     *
     * @return
     */
    private Table createTable(String name) {
	return new Table(dDatabase, false, name, false);
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -