public static string ProcessRequest(DBInternal request)
        {
            DBInternal reply = new DBInternal();

            try
            {
                if (request == null)
                {
                    throw new NullReferenceException("Null Request....");
                }

                if (request.Verb != DBVerbs.Create)
                {
                    if (request.Query == null)
                    {
                        throw new ArgumentNullException("When using Query Single/Multi/Change/Delete. Arg: query cannot be null");
                    }
                }

                if (request.Verb == DBVerbs.Create || request.Verb == DBVerbs.Update)
                {
                    if (request.DBObjects == null)
                    {
                        throw new ArgumentNullException("When using Create and Update. Arg: output cannot be null");
                    }
                }

                int rowModified = 0;
                reply.Verb = request.Verb;
                switch (request.Verb)
                {
                case DBVerbs.Create:
                    rowModified      = CommandCreate(request.TableName, request.DBObjects[0]);
                    reply.ResultCode = (DBQueryStatus)rowModified;
                    reply.DBObjects  = GetFirstRecord(request.TableName, "objectId", request.DBObjects[0]["objectId"]);
                    break;

                case DBVerbs.QuerySingle:
                ///There shouldn't be QuerySingle... <see cref="DataBaseOperation.QueryMultipleData{T}(DBQuery, out List{T}, int, int)"/>
                case DBVerbs.QueryMulti:
                    var results = SQLQueryCommand(BuildQueryString(request.TableName, request.Query));
                    rowModified      = results.Length;
                    reply.DBObjects  = results.ToArray();
                    reply.ResultCode = results.Length >= 2 ? DBQueryStatus.MORE_RESULTS : (DBQueryStatus)results.Length;
                    break;

                case DBVerbs.Update:
                    //Only Support first thing....
                    var dict = SQLQueryCommand(BuildQueryString(request.TableName, request.Query));
                    if (dict.Length != 1)
                    {
                        throw new KeyNotFoundException("DBServerCore-->ProcessRequest->Update: Cannot find Specific Record by Query, so Failed to update....");
                    }
                    rowModified      = CommandUpdate(request.TableName, dict[0]["objectId"].ToString(), request.DBObjects[0]);
                    reply.ResultCode = (DBQueryStatus)rowModified;
                    reply.DBObjects  = GetFirstRecord(request.TableName, "objectId", dict[0]["objectId"]);

                    break;

                case DBVerbs.Delete:
                    rowModified      = CommandDelete(request.TableName, request.Query.EqualTo["objectId"].ToString());
                    reply.ResultCode = (DBQueryStatus)rowModified;
                    break;

                default:
                    //HttpUtility.UrlEncode("!@#$%^&*()_+");
                    //break;
                    throw new NotSupportedException("What The Hell you are doing....");
                }
                reply.Message = "操作成功完成(" + rowModified + ")";
            }
            catch (Exception ex)
            {
                reply.ResultCode = DBQueryStatus.INTERNAL_ERROR;
                reply.Message    = ex.Message;
                reply.Exception  = new DataBaseException("DBServer Process Exception", ex);
                LW.E("Exception! => \r\n" + ex);
            }
            return(reply.ToParsedString());
        }
예제 #2
0
        private static DBQueryStatus _DBRequestInternal(string Table, DBVerbs operation, DBQuery query, DataBaseIO output, out DataBaseIO[] results)
        {
            try
            {
                if ((operation == DBVerbs.QueryMulti || operation == DBVerbs.QuerySingle || operation == DBVerbs.Update || operation == DBVerbs.Delete) && query == null)
                {
                    throw new ArgumentNullException("When using Query Single/Multi and Change, Delete. Arg: query cannot be null");
                }
                if ((operation == DBVerbs.Create || operation == DBVerbs.Update) && output == null)
                {
                    throw new ArgumentNullException("When using Query Create and Change. Arg: output cannot be null");
                }
                DBInternal internalQuery = new DBInternal {
                    Verb = operation, TableName = Table
                };
                switch (operation)
                {
                case DBVerbs.Create:
                    internalQuery.DBObjects = output.MoveToArray();
                    break;

                case DBVerbs.QuerySingle:
                case DBVerbs.QueryMulti:
                    internalQuery.Query = query;
                    break;

                case DBVerbs.Update:
                    internalQuery.DBObjects = output.MoveToArray();
                    internalQuery.Query     = query;
                    break;

                case DBVerbs.Delete:
                    internalQuery.Query = query;
                    break;
                }

                string internalQueryString = internalQuery.ToParsedString();

                string _MessageId = MessageId;
                if (!DatabaseSocketsClient.SendData(internalQueryString, _MessageId, out string rcvdData))
                {
                    results = null;
                    throw new DataBaseException("Database is not connected currently...");
                }

                if (!rcvdData.ToParsedObject(out DBInternal reply))
                {
                    throw new DataBaseException("DBInternalReply is null");
                }

                // THERE ARE SOME SPECIAL REPLY CODE....
                switch (reply.ResultCode)
                {
                case DBQueryStatus.INJECTION_DETECTED:
                    throw new DataBaseException("INJECTION DETECTED.", reply.Exception);

                case DBQueryStatus.INTERNAL_ERROR:
                    throw new DataBaseException("Database Server Internal Error", reply.Exception);
                }

                switch (operation)
                {
                case DBVerbs.QueryMulti:
                    results = reply.DBObjects;
                    break;

                case DBVerbs.QuerySingle:
                case DBVerbs.Create:
                case DBVerbs.Update:
                    var singleResult = reply.DBObjects;
                    if (singleResult.Length > 1)
                    {
                        throw new DataBaseException("QuerySingle, Create, Change require only one Return result...");
                    }
                    if (operation == DBVerbs.QuerySingle)
                    {
                        //Allow No results....
                        results =
                            singleResult.Length == 0
                                ? new DataBaseIO[0]
                                : singleResult;
                    }
                    else
                    {
                        //DisAllow Empty Results....
                        results =
                            singleResult.Length == 0
                                ? throw new DataBaseException("Create Update functions expect one result...")
                                : singleResult;
                    }
                    break;

                case DBVerbs.Delete:
                    results = null;
                    break;

                default: throw new DataBaseException("Database Operation " + operation + " is not Supported!");
                }
                return(reply.ResultCode);
            }
            catch (DataBaseException ex)
            {
                results = null;
                LW.E(ex);
                return(DBQueryStatus.INTERNAL_ERROR);
            }
        }