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

📄 databaseinformation.cs

📁 C#数据库中间层处理,支持主流数据库,如sql、oracle等
💻 CS
📖 第 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.Count; i++) 
				{
					Table table = (Table) tTable[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] = !index.isUnique();
							o[5] = index.getName();
							o[6] = 1;
							o[7] = (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();

				ArrayList v = aAccess.getUsers();

				for (int i = 0; i < v.Count; i++) 
				{
					User u = (User) v[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] = u.isAdmin();

						t.insert(o, null);
					}
				}

				return t;
			}

			return null;
		}

		/**
		 * Method declaration
		 *
		 *
		 * @param bDrop
		 * @param bInsert
		 * @param bCached
		 * @param channel
		 *
		 * @return
		 *
		 * @throws Exception
		 */
		public Result getScript(bool bDrop, bool bInsert, bool bCached,
			Channel channel) 
		{
			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";

			StringBuilder a = new StringBuilder();

			for (int i = 0; i < tTable.Count; i++) 
			{
				Table t = (Table) tTable[i];

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

				a.Remove(0,a.Length);
				a.Append("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(",");
					}
				}

				ArrayList v = t.getConstraints();

				for (int j = 0; j < v.Count; j++) 
				{
					Constraint c = (Constraint) v[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.Remove(0,a.Length);
					a.Append("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();
					bool 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.Remove(0,a.Length);
					a.Append("SET TABLE ");

					a.Append(t.getName());
					a.Append(" INDEX '");
					a.Append(t.getIndexRoots());
					a.Append("'");
					addRow(r, a.ToString());
				}

			}

			ArrayList uList = aAccess.getUsers();

			for (int i = 0; i < uList.Count; i++) 
			{
				User u = (User) uList[i];

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

				string name = u.getName();

				if (!name.Equals("PUBLIC")) 
				{
					a.Remove(0,a.Length);
					a.Append("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;
				}

				foreach( string dbObject in rights.Keys)
				{
					int    right = (int) rights[dbObject];

					if (right == 0) 
					{
						continue;
					}

					a.Remove(0,a.Length);
					a.Append("GRANT ");

					a.Append(Access.getRight(right));
					a.Append(" ON ");
					a.Append(dbObject);
					a.Append(" TO ");
					a.Append(u.getName());
					addRow(r, a.ToString());
				}
			}

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

			Hashtable   h = dDatabase.getAlias();

			foreach(string alias in h.Keys)
			{
				string java = (string) h[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) 
		{
			StringBuilder a = new StringBuilder();
			a.Append("(");

			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 + -