Esempio n. 1
0
        public PreparedStatementTask(PreparedStatementBase stmt, bool hasResult = false)
        {
            _stmt      = stmt;
            _hasResult = hasResult;

            _result = new Promise <PreparedQueryResult?>();
        }
Esempio n. 2
0
        protected void AppendPreparedStatement(PreparedStatementBase stmt)
        {
            SqlElementData data = new SqlElementData();

            data.Type         = SQL_ELEMENT_PREPARED;
            data.Element.Stmt = stmt;
            _queries.Add(data);
        }
Esempio n. 3
0
        bool _Query(PreparedStatementBase stmt, ref MySqlPreparedStatement?mysqlStmt, ref IntPtr pResult, ref long pRowCount, ref int pFieldCount)
        {
            if (_mysql == default)
            {
                return(false);
            }

            var index = stmt.Index;

            var mStmt = GetPreparedStatement(index);

            Assert(mStmt != null);            // Can only be null if preparation failed, server side error or bad query

            mStmt !.BindParameters(stmt);
            mysqlStmt = mStmt;

            var         msql_STMT = mStmt.STMT;
            MYSQL_BIND *msql_BIND = mStmt.Bind;

            var _s = GetMSTime();

            if (mysql_stmt_bind_param(msql_STMT, msql_BIND))
            {
                var lErrno = mysql_errno(_mysql);
                FEL_LOG_ERROR("sql.sql", "SQL(p): {0}\n [ERROR]: [{1}] {2}", mStmt.GetQueryString(), lErrno, mysql_stmt_error(msql_STMT));

                if (_HandleMySqlErrno(lErrno))                                                        // If it returns true, an error was handled successfully (i.e. reconnection)
                {
                    return(_Query(stmt, ref mysqlStmt, ref pResult, ref pRowCount, ref pFieldCount)); // Try again
                }
                mStmt.ClearParameters();
                return(false);
            }

            if (mysql_stmt_execute(msql_STMT) != 0)
            {
                var lErrno = mysql_errno(_mysql);
                FEL_LOG_ERROR("sql.sql", "SQL(p): {0}\n [ERROR]: [{1}] {2}", mStmt.GetQueryString(), lErrno, mysql_stmt_error(msql_STMT));

                if (_HandleMySqlErrno(lErrno))                                                        // If it returns true, an error was handled successfully (i.e. reconnection)
                {
                    return(_Query(stmt, ref mysqlStmt, ref pResult, ref pRowCount, ref pFieldCount)); // Try again
                }
                mStmt.ClearParameters();
                return(false);
            }

            FEL_LOG_DEBUG("sql.sql", "[{0} ms] SQL(p): {1}", GetMSTimeDiff(_s, GetMSTime()), mStmt.GetQueryString());

            mStmt.ClearParameters();

            pResult     = mysql_stmt_result_metadata(msql_STMT);
            pRowCount   = mysql_stmt_num_rows(msql_STMT);
            pFieldCount = mysql_stmt_field_count(msql_STMT);

            return(true);
        }
Esempio n. 4
0
        public bool Execute(PreparedStatementBase stmt)
        {
            if (_mysql == IntPtr.Zero)
            {
                return(false);
            }

            int index = stmt.Index;
            var mStmt = GetPreparedStatement(index);

            Assert(mStmt != null); // Can only be null if preparation failed, server side error or bad query

            mStmt !.BindParameters(stmt);

            var msql_STMT = mStmt.STMT;
            var msql_BIND = mStmt.Bind;

            var _s = GetMSTime();

            if (mysql_stmt_bind_param(msql_STMT, msql_BIND))
            {
                var lErrno = mysql_errno(_mysql);
                FEL_LOG_ERROR("sql.sql", "SQL(p): {0}\n [ERROR]: [{1}] {2}", mStmt.GetQueryString(), lErrno, mysql_stmt_error(msql_STMT));

                if (_HandleMySqlErrno(lErrno))  // If it returns true, an error was handled successfully (i.e. reconnection)
                {
                    return(Execute(stmt));      // Try again
                }
                mStmt.ClearParameters();
                return(false);
            }

            if (mysql_stmt_execute(msql_STMT) != 0)
            {
                var lErrno = mysql_errno(_mysql);
                FEL_LOG_ERROR("sql.sql", "SQL(p): {0}\n [ERROR]: [{1}] {2}", mStmt.GetQueryString(), lErrno, mysql_stmt_error(msql_STMT));

                if (_HandleMySqlErrno(lErrno))  // If it returns true, an error was handled successfully (i.e. reconnection)
                {
                    return(Execute(stmt));      // Try again
                }
                mStmt.ClearParameters();
                return(false);
            }

            FEL_LOG_DEBUG("sql.sql", "[{0} ms] SQL(p): {1}", GetMSTimeDiff(_s, GetMSTime()), mStmt.GetQueryString());

            mStmt.ClearParameters();
            return(true);
        }
Esempio n. 5
0
        public PreparedQueryResult?Query(PreparedStatementBase stmt)
        {
            MySqlPreparedStatement?mysqlStmt = null;
            IntPtr result     = default;
            long   rowCount   = 0;
            int    fieldCount = 0;

            if (!_Query(stmt, ref mysqlStmt, ref result, ref rowCount, ref fieldCount))
            {
                return(null);
            }

            if (mysql_more_results(_mysql))
            {
                mysql_next_result(_mysql);
            }
            return(new PreparedQueryResult(mysqlStmt !.STMT, result, rowCount, fieldCount));
        }
Esempio n. 6
0
        public void BindParameters(PreparedStatementBase stmt)
        {
            _stmt = stmt;

            byte pos = 0;

            foreach (var data in stmt.Parameters)
            {
                if (pos == stmt.ParameterCount)
                {
                    break;
                }

                switch (data)
                {
                case bool val:
                    SetParameter(pos, val);
                    break;

                case byte val:
                    SetParameter(pos, val);
                    break;

                case sbyte val:
                    SetParameter(pos, val);
                    break;

                case ushort val:
                    SetParameter(pos, val);
                    break;

                case short val:
                    SetParameter(pos, val);
                    break;

                case uint val:
                    SetParameter(pos, val);
                    break;

                case int val:
                    SetParameter(pos, val);
                    break;

                case ulong val:
                    SetParameter(pos, val);
                    break;

                case long val:
                    SetParameter(pos, val);
                    break;

                case float val:
                    SetParameter(pos, val);
                    break;

                case double val:
                    SetParameter(pos, val);
                    break;

                case decimal val:
                    SetParameter(pos, val);
                    break;

                case null:
                    SetParameterNull(pos);
                    break;

                case byte[] val:
                    SetParameter(pos, val);
                    break;

                case string val:
                    SetParameter(pos, val);
                    break;

                case DateTime val:
                    SetParameter(pos, val);
                    break;

                case TimeSpan val:
                    SetParameter(pos, val);
                    break;

                default:
                    FEL_LOG_WARN("sql.sql", "[WARN] Prepared Statement (id: {0}, param pos: {1}) bound to unsupported parameter data type: {2}!", _stmt !.Index, pos, data.GetType().Name);
                    break;
                }
                ++pos;
            }
        }