public IEnumerable <Dto> ExecuteQuery(string queryText)
        {
            var dtos = new List <Dto>();

            switch (this.dialect)
            {
            case Dialect.SQL2012:
            case Dialect.SQL2014:
                // Not developed yet.
                throw new NotImplementedException();

            case Dialect.MYSQL:
                using (var sqlConnection = new MySqlConnection(this.connectionString))
                {
                    MySqlDataReader rdr = null;
                    try
                    {
                        sqlConnection.Open();
                        var cmd = new MySqlCommand(queryText, sqlConnection);
                        rdr = cmd.ExecuteReader();
                        while (rdr.Read())
                        {
                            //var row = Enumerable.Range(0, rdr.FieldCount).ToDictionary(rdr.GetName, rdr.GetValue);
                            //var row = Enumerable.Range(0, rdr.FieldCount).ToDictionary(i => rdr.GetName(i), i => rdr.GetValue(i));
                            var dto = new Dto();
                            for (int i = 0; i < rdr.FieldCount; i++)
                            {
                                //var dotNetType = rdr.GetFieldType(i);
                                //var sqlType = rdr.GetDataTypeName(i);
                                //var specificType = rdr.GetProviderSpecificFieldType(i);
                                dto.Add(rdr.GetName(i), new JValue(rdr.GetValue(i)));
                            }
                            dtos.Add(dto);
                        }
                    }
                    finally
                    {
                        if (rdr != null)
                        {
                            rdr.Close();
                        }

                        if (sqlConnection != null)
                        {
                            sqlConnection.Close();
                        }
                    }
                }
                break;

            default:
                break;
            }

            return(dtos);
        }
예제 #2
0
        //// Experiment 1
        //public static T Extend1<T>(T target, params object[] sources)
        //{
        //    foreach (var source in sources)
        //    {
        //        JObject.FromObject(source).ToObject<T>();
        //    }
        //    return target;
        //}

        //// Experiment 2
        //public static Dto Extend2(Dto target, params Dto[] sources)
        //{
        //    foreach (var source in sources)
        //    {
        //        foreach (var prop in source)
        //        {
        //            target[prop.Key] = prop.Value;
        //        }
        //    }
        //    return target;
        //}

        public static Dto Extend(Dto target, Dto source, bool onlyExistingProperties = false)
        {
            foreach (var prop in source)
            {
                if (!(onlyExistingProperties && target.ContainsKey(prop.Key)))
                {
                    target[prop.Key] = prop.Value;
                }
            }
            return(target);
        }
        public static bool ValidDtoKey(string entityTypeName, Dto dto, MetadataSrv.Metadata metadataSrv)
        {
            var keyNames = metadataSrv.EntityTypes[entityTypeName].Key;

            foreach (var name in keyNames)
            {
                if (!(dto.ContainsKey(name) || Regex.IsMatch(dto[name].ToString(), @"^\d+$")))
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #4
0
        public ResultSingleSerialData HandleInsertEntity(string entitySetName, Dto dto)
        {
            entitySetName = ApiProviderDtoUtils.FixEntitySetNameCase(entitySetName, this.metadataSrv);
            var entityTypeName = ApiProviderDtoUtils.GetEntityTypeName(entitySetName, this.metadataSrv);

            if (!ApiProviderDtoUtils.ValidDtoKey(entityTypeName, dto, this.metadataSrv))
            {
                throw new DtosException(code: 400, message: "Bad Request");
            }
            var resultSingleSerialData = this.dataViewDto.InsertItem(entityTypeName, dto);

            return(resultSingleSerialData);
        }
        internal ResultSerialData FetchOne(string entityTypeName, Dto dto, string[] expand)
        {
            var keyNames    = this.metadataSrv.EntityTypes[entityTypeName].Key;
            var queryObject = new QueryObject()
            {
                Filter = Utils.GetFilterFromKey(keyNames, dto),
                Expand = expand,
                Count  = false,
                Top    = 1
            };

            return(this.Fetch(entityTypeName, queryObject));
        }
        /**
         * Retrive a single entity
         */
        public ResultSingleSerialData GetSingleItem(string entityTypeName, Dto dto, string[] expand)
        {
            var resultSerialData = this.dataAdapterRead.FetchOne(entityTypeName, dto, expand);

            if (resultSerialData.Items.Count() > 0)
            {
                return(resultSerialData.ToSingle());
            }
            else
            {
                throw new DtosException(code: 404, message: "Not Found");
            }
        }
            public static bool KeyPresent(string entityTypeName, Dto dto, MetadataSrv.Metadata metadataSrv)
            {
                var keyNames = metadataSrv.EntityTypes[entityTypeName].Key;

                foreach (var keyName in keyNames)
                {
                    if (!dto.ContainsKey(keyName))
                    {
                        return(false);
                    }
                }
                return(true);
            }
        public static bool ValidDto(string entityTypeName, Dto key, Dto dto, MetadataSrv.Metadata metadataSrv)
        {
            var keyNames = metadataSrv.EntityTypes[entityTypeName].Key;

            // if dto has key fields, their values should match the key values from query string
            foreach (var name in keyNames)
            {
                if (dto.ContainsKey(name) && dto[name] != key[name])
                {
                    return(false);
                }
            }
            return(true);
        }
        /**
         * Delete single entity
         */
        public ResultSingleSerialData DeleteItem(string entityTypeName, Dto dto)
        {
            var resultSerialDataOriginal = this.dataAdapterRead.FetchOne(entityTypeName, dto, null);

            if (resultSerialDataOriginal.Items.Count() == 0)
            {
                throw new DtosException(code: 404, message: "Not Found");
            }
            else
            {
                this.dataAdapterCud.DeleteEntity(entityTypeName, dto);
                return(resultSerialDataOriginal.ToSingle());
            }
        }
            internal static string GetFilterFromKey(string[] keyNames, Dto dto)
            {
                var result = new List <string>();

                if (keyNames.Length == 0)
                {
                    throw new Exception("Invalid key");
                }
                foreach (var keyName in keyNames)
                {
                    if (!dto.ContainsKey(keyName))
                    {
                        throw new Exception("Key fiels not present");
                    }
                    result.Add(keyName + "=" + dto[keyName]);
                }
                return(string.Join(" AND ", result));
            }
        /**
         * Insert single entity
         */
        public ResultSingleSerialData InsertItem(string entityTypeName, Dto dto)
        {
            ResultSerialData resultSerialDataOriginal = null;

            if (Utils.KeyPresent(entityTypeName, dto, this.metadataSrv))
            {
                resultSerialDataOriginal = this.dataAdapterRead.FetchOne(entityTypeName, dto, null);
            }
            if (resultSerialDataOriginal != null && resultSerialDataOriginal.Items.Count() > 0)
            {
                throw new DtosException(code: 409, message: "Conflict");
            }
            else
            {
                var resultSerialData = this.dataAdapterCud.InsertEntity(entityTypeName, dto);
                return(resultSerialData.ToSingle());
            }
        }
        public ResultSerialData InsertEntity(string entityTypeName, Dto dto)
        {
            var qryFieldsNames  = new List <string>();
            var qryFieldsValues = new List <string>();

            var tableName            = metadataSrv.EntityTypes[entityTypeName].TableName;
            var calculatedProperties = metadataSrv.EntityTypes[entityTypeName].CalculatedProperties;

            var fields = metadataSrv.EntityTypes[entityTypeName].Properties.ToDictionary((it) => it.Key, (it) => it.Value.FieldName);

            foreach (var prop in dto)
            {
                if (!Utils.IsCalculated(calculatedProperties, prop.Key))
                {
                    qryFieldsNames.Add(fields[prop.Key]);
                    qryFieldsValues.Add(string.Format("'{0}'", prop.Value));
                }
            }

            if (qryFieldsValues.Count > 0)
            {
                var qryInsert            = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", tableName, string.Join(",", qryFieldsNames), string.Join(",", qryFieldsValues));
                var result               = this.databaseOperations.CudQuery(qryInsert);
                var identityPropertyName = Utils.GetIdentityPropertyName(calculatedProperties, metadataSrv.EntityTypes[entityTypeName].Key);
                if (!string.IsNullOrEmpty(identityPropertyName))
                {
                    var dtonew = new Dto()
                    {
                        { identityPropertyName, new JValue(result) }
                    };
                    return(this.dataAdapterRead.FetchOne(entityTypeName, dtonew, null));
                }
                else
                {
                    return(this.dataAdapterRead.FetchOne(entityTypeName, dto, null));
                }
            }
            else
            {
                return(null);
            }
        }
예제 #13
0
        public ResultSingleSerialData HandleUpdateEntity(string entitySetName, QueryParams queryParams, Dto dto)
        {
            entitySetName = ApiProviderDtoUtils.FixEntitySetNameCase(entitySetName, this.metadataSrv);
            var queryObject    = QueryUtils.RenderQueryObject(queryParams);
            var entityTypeName = ApiProviderDtoUtils.GetEntityTypeName(entitySetName, this.metadataSrv);

            if (queryObject.Keys == null || queryObject.Keys.Count() != 1 || !ApiProviderDtoUtils.ValidKeys(entityTypeName, queryObject.Keys, this.metadataSrv))
            {
                throw new DtosException(code: 400, message: "Bad Request");
            }
            if (!ApiProviderDtoUtils.ValidDto(entityTypeName, queryObject.Keys.FirstOrDefault(), dto, this.metadataSrv))
            {
                throw new DtosException(code: 400, message: "Bad Request");
            }
            var resultSingleSerialData = this.dataViewDto.UpdateItem(entityTypeName, DalUtils.Extend(dto, queryObject.Keys.FirstOrDefault()));

            return(resultSingleSerialData);
        }