Пример #1
0
 Dictionary <int, List <List <long> > > idDict = new Dictionary <int, List <List <long> > >(); //收集cellid消息
 #region 邹开发 select
 public override void SelectFromClientHandler(SelectMessageReader request, SelectResponseWriter response)
 {
     idDict.Clear();
     for (int i = 0; i < Global.ServerCount; i++)
     {
         //每个服务器挨个发送
         SelectMessageWriter smw = new SelectMessageWriter(request.columnNameList,
                                                           request.columnTypeList, request.cellIds, request.usedIndex, request.condition);
         Global.CloudStorage.SelectFromProxyToDatabaseServer(i, smw);
     }
     sem.WaitOne();  //等待服务器全部返回信息
     response.cellIds = new List <List <long> >();
     //将信息合并
     for (int i = 0; i < Global.ServerCount; i++)
     {
         response.cellIds.AddRange(idDict[i]);
     }
 }
Пример #2
0
        /// <summary>
        /// 无into的select语句
        /// </summary>
        /// <param name="fields">三元组数组,第一个表示字段,第二个表示别名</param>
        /// <param name="con">条件表达式</param>
        /// <returns></returns>
        public Table select(Tuple <string, string>[] fields, string con)
        {
            //新表的结构
            List <string> newColumnNames = new List <string>();
            List <int>    newColumnTypes = new List <int>();
            List <int>    usedIndexes    = new List <int>(); //标记被select的索引

            //先检查字段是否符合
            if (fields.Length == 1 && fields[0].Item1.Equals("*"))
            {
                newColumnNames = columnNames;
                newColumnTypes = columnTypes;
            }
            else
            {
                foreach (Tuple <string, string> field in fields)
                {
                    string fieldName = field.Item1;      //字段名
                    if (columnNames.Contains(fieldName)) //直接能识别出该字段
                    {
                        newColumnNames.Add((field.Item2 == null) || (field.Item2.Equals("")) ?
                                           fieldName : field.Item2); //别名
                        newColumnTypes.Add(columnTypes[columnNames.IndexOf(fieldName)]);
                        usedIndexes.Add(columnNames.IndexOf(fieldName));
                    }
                    else  //说明要么该字段不存在,要么没有使用表名直接使用字段名
                    {
                        int count      = 0;
                        int fieldIndex = 0;
                        for (int i = 0; i < columnNames.Count; i++)
                        {
                            if (columnNames.Contains("." + fieldName))  //统计是否重复了
                            {
                                count++;
                                fieldIndex = i;
                            }
                        }
                        if (count == 0)
                        {
                            throw new Exception(String.Format("字段{0}不存在", fieldName));
                        }
                        else if (count > 1)
                        {
                            throw new Exception(String.Format("字段{0}重复,需要指明表名", fieldName));
                        }
                        else
                        {
                            newColumnNames.Add((field.Item2 == null) || (field.Item2.Equals("")) ?
                                               columnNames[fieldIndex] : field.Item2); //别名
                            newColumnTypes.Add(fieldIndex);
                            usedIndexes.Add(fieldIndex);
                        }
                    }
                }
            }
            usedIndexes.Sort();
            //此时,新表的结构构建完成,向proxy发送查询任务
            SelectMessageWriter smw        = new SelectMessageWriter(columnNames, columnTypes, cellIds, usedIndexes, con);
            List <List <long> > newCellIds = Global.CloudStorage.SelectFromClientToDatabaseProxy(0, smw).cellIds;

            return(new Table(newCellIds, newColumnTypes, newColumnNames, this.primaryIndexs,
                             this.defaultValues, this.tableNames));
        }