public Table createTable(string name, string[] primaryKeyList, params Tuple <int, string, object>[] fields) { if (tableExists(name)) //表已存在 { throw new Exception(String.Format("表{0}已经存在!", name)); } TableHeadCell thc = new TableHeadCell(tableName: name, columnNameList: new List <string>(), columnTypeList: new List <int>(), cellIds: new List <List <long> >(), defaultValue: new List <Element>(), primaryIndex: new List <int>()); if (fields == null || fields.Length == 0) { throw new Exception("建立表至少要有一个字段"); } for (int i = 0; i < fields.Length; i++) { int type = fields[i].Item1; string fieldName = fields[i].Item2; object defaultValue = fields[i].Item3; if (thc.columnNameList.Contains(fieldName)) { throw new Exception(String.Format("重复声明的字段:{0}.", fieldName)); } thc.columnNameList.Add(fieldName); thc.columnTypeList.Add(type); thc.defaultValue.Add(FieldType.setValue(defaultValue, type)); } if (primaryKeyList != null && primaryKeyList.Length > 0) { for (int i = 0; i < primaryKeyList.Length; i++) { string key = primaryKeyList[i]; if (!thc.columnNameList.Contains(key)) { throw new Exception(String.Format("字段{0}不在字段列表中,不能作为主键.", key)); } thc.primaryIndex.Add(thc.columnNameList.IndexOf(key)); } } //cell已经建好,存储于云端 Global.CloudStorage.SaveTableHeadCell(thc); //向数据库写入表的信息,并更新到云 tableIdList.Add(thc.CellID); tableNameList.Add(thc.tableName); //更新databasecell DatabaseCell dc = new DatabaseCell(this.name, tableNameList, tableIdList); long databaseId = HashHelper.HashString2Int64(this.name); Global.CloudStorage.SaveDatabaseCell(databaseId, dc); return(new Table(name)); }
public void rename(string newName) { long tableId = Database.getCurrentDatabase().getTableIdList().ElementAt(Database.getCurrentDatabase().getTableNameList().IndexOf(tableNames [0])); TableHeadCell thc = new TableHeadCell(newName, this.columnNames, this.columnTypes, this.primaryIndexs, this.defaultValues, this.cellIds); Global.CloudStorage.SaveTableHeadCell(tableId, thc); //更改数据库里的tablelist信息 List <string> tbName = Database.getCurrentDatabase().getTableNameList(); List <long> tbID = Database.getCurrentDatabase().getTableIdList(); tbName.RemoveAt(tbID.IndexOf(tableId)); tbID.Remove(tableId); tbName.Add(newName); tbID.Add(tableId); long dbId = HashHelper.HashString2Int64(Database.getCurrentDatabase().getName()); DatabaseCell dbc = new DatabaseCell(Database.getCurrentDatabase().getName(), tbName, tbID); Global.CloudStorage.SaveDatabaseCell(dbId, dbc); }
/// <summary> /// 建立一个新的数据库 /// </summary> /// <param name="name">数据库的名字</param> /// <returns>对应于该数据库的Database的实例化对象</returns> public static Database createDatabase(string name) { long databaseId = HashHelper.HashString2Int64(name); //先确认该数据库并不存在 if (Global.CloudStorage.Contains(databaseId)) { throw new Exception(String.Format("数据库{0}已经存在!", name)); } DatabaseCell dbc = new DatabaseCell(name: name, tableIdList: new List <long>(), tableNameList: new List <string>()); //以数据库名的hash为cellId,存入云端 Global.CloudStorage.SaveDatabaseCell(databaseId, dbc); Database database = new Database(name, dbc.tableIdList, dbc.tableNameList); currentDatabase = database; return(database); }
/// <summary> /// 删除一个已经存在的表 /// </summary> /// <param name="name">要删除的表名</param> public void dropTable(string name) { if (!tableExists(name)) { throw new Exception(String.Format("表{0}不存在.", name)); } new Table(name).truncate(); //先清空 //先移除cell long cellId = tableIdList.ElementAt(tableNameList.IndexOf(name)); Global.CloudStorage.RemoveCell(cellId); //再移除数据库内信息 tableNameList.Remove(name); tableIdList.Remove(cellId); //再同步云端的数据库 DatabaseCell dc = new DatabaseCell(this.name, tableNameList, tableIdList); long databaseId = HashHelper.HashString2Int64(this.name); Global.CloudStorage.SaveDatabaseCell(databaseId, dc); }