Beispiel #1
0
        public object getAttribute(PDO_ATTR attribute)
        {
            if (this.m_attributes.ContainsKey(attribute))
            {
                return(this.m_attributes[attribute]);
            }

            //TODO : what to do on unknown attribute ?
            return(PhpValue.Null);
        }
Beispiel #2
0
        public PhpValue getAttribute(PDO_ATTR attribute)
        {
            if (this.m_attributes.TryGetValue(attribute, out PhpValue value))
            {
                return(value);
            }

            //TODO : what to do on unknown attribute ?
            return(PhpValue.Null);
        }
        /// <summary>
        /// Retrieve a database connection attribute
        /// </summary>
        /// <param name="attribute">The attribute.</param>
        /// <returns></returns>
        public virtual PhpValue getAttribute(PDO_ATTR attribute)
        {
            if (m_attributes.TryGetValue(attribute, out var value))
            {
                return(value);
            }

            if (attribute > PDO_ATTR.ATTR_DRIVER_SPECIFIC)
            {
                return(Driver.GetAttribute(this, attribute));
            }

            //TODO : what to do on unknown attribute ?
            return(PhpValue.Null);
        }
Beispiel #4
0
        private protected bool TryGetAttribute(PDO_ATTR attribute, out PhpValue value)
        {
            if (_lazyAttributes != null && _lazyAttributes.TryGetValue(attribute, out value))
            {
                return(true);
            }

            // default values:
            switch (attribute)
            {
            case PDO_ATTR.ATTR_DRIVER_NAME: value = Driver.Name; return(true);

            case PDO_ATTR.ATTR_SERVER_VERSION: value = Connection.ServerVersion; return(true);

            case PDO_ATTR.ATTR_CLIENT_VERSION: value = Driver.ClientVersion; return(true);

            case PDO_ATTR.ATTR_ORACLE_NULLS: value = (int)_oracle_nulls; return(true);

            case PDO_ATTR.ATTR_AUTOCOMMIT: value = PhpValue.True; return(true);

            case PDO_ATTR.ATTR_PREFETCH: value = 0; return(true);

            case PDO_ATTR.ATTR_TIMEOUT: value = 30; return(true);

            case PDO_ATTR.ATTR_ERRMODE: value = ERRMODE_EXCEPTION; return(true);

            case PDO_ATTR.ATTR_SERVER_INFO: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_CONNECTION_STATUS: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_CASE: value = (int)PDO_CASE.CASE_LOWER; return(true);

            case PDO_ATTR.ATTR_CURSOR_NAME: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_CURSOR: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_PERSISTENT: value = PhpValue.False; return(true);

            case PDO_ATTR.ATTR_STATEMENT_CLASS: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_FETCH_CATALOG_NAMES: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_FETCH_TABLE_NAMES: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_STRINGIFY_FETCHES: value = this.Stringify; return(true);

            case PDO_ATTR.ATTR_MAX_COLUMN_LEN: value = PhpValue.Null; return(true);

            case PDO_ATTR.ATTR_DEFAULT_FETCH_MODE: value = 0; return(true);

            case PDO_ATTR.ATTR_EMULATE_PREPARES: value = PhpValue.False; return(true);

            default:
                // driver specific:
                if (attribute > PDO_ATTR.ATTR_DRIVER_SPECIFIC)
                {
                    value = Driver.GetAttribute(this, (int)attribute);
                    return(Operators.IsSet(value));
                }

                //TODO : what to do on unknown attribute ?
                value = PhpValue.Null;
                return(false);
            }
        }
Beispiel #5
0
        public virtual bool setAttribute(PDO_ATTR attribute, PhpValue value)
        {
            long l; // temp value

            switch (attribute)
            {
            //readonly
            case PDO_ATTR.ATTR_SERVER_INFO:
            case PDO_ATTR.ATTR_SERVER_VERSION:
            case PDO_ATTR.ATTR_CLIENT_VERSION:
            case PDO_ATTR.ATTR_CONNECTION_STATUS:
            case PDO_ATTR.ATTR_DRIVER_NAME:
                return(false);

            //boolean

            case PDO_ATTR.ATTR_AUTOCOMMIT:
            case PDO_ATTR.ATTR_EMULATE_PREPARES:
                GetOrCreateAttributes()[attribute] = value.ToBoolean();
                return(true);

            case PDO_ATTR.ATTR_STRINGIFY_FETCHES:
                Driver.TrySetStringifyFetches(this, value.ToBoolean());
                return(true);    // always returns TRUE

            //strict positif integers

            case PDO_ATTR.ATTR_PREFETCH:
            case PDO_ATTR.ATTR_TIMEOUT:
                // TODO: strict positif integers
                GetOrCreateAttributes()[attribute] = value.GetValue().DeepCopy();
                return(true);

            //remaining

            case PDO_ATTR.ATTR_ERRMODE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_ERRMODE), (int)l))
                {
                    GetOrCreateAttributes()[attribute] = l;
                    return(true);
                }
                else
                {
                    // Warning: PDO::setAttribute(): SQLSTATE[HY000]: General error: invalid error mode
                    // TODO: this.RaiseError( ... ) ?
                    PhpException.InvalidArgument(nameof(value));
                    return(false);
                }

            case PDO_ATTR.ATTR_CASE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_CASE), (int)l))
                {
                    GetOrCreateAttributes()[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_CURSOR:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_CURSOR), (int)l))
                {
                    GetOrCreateAttributes()[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_DEFAULT_FETCH_MODE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_FETCH), (int)l))
                {
                    GetOrCreateAttributes()[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_STATEMENT_CLASS:
                if (value.IsPhpArray(out var arr) && arr != null && arr.Count != 0)
                {
                    GetOrCreateAttributes()[attribute] = arr.DeepCopy();
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_ORACLE_NULLS:
                if (value.IsLong(out l))
                {
                    Debug.Assert(l == (long)PDO_NULL.NULL_NATURAL, "nonstandard ATTR_ORACLE_NULLS is not yet supported");
                    _oracle_nulls = (PDO_NULL)l;
                    return(true);
                }
                else
                {
                    HandleError("attribute value must be an integer");
                    return(false);
                }

            case PDO_ATTR.ATTR_FETCH_CATALOG_NAMES:
            case PDO_ATTR.ATTR_FETCH_TABLE_NAMES:
            case PDO_ATTR.ATTR_MAX_COLUMN_LEN:
            case PDO_ATTR.ATTR_PERSISTENT:
                throw new NotImplementedException($"setAttribute({attribute})");

            //statement only
            case PDO_ATTR.ATTR_CURSOR_NAME:
                return(false);

            default:

                // driver specific
                try
                {
                    if (attribute >= PDO_ATTR.ATTR_DRIVER_SPECIFIC)
                    {
                        return(Driver.TrySetAttribute(GetOrCreateAttributes(), (int)attribute, value));
                    }
                }
                catch (System.Exception ex)
                {
                    this.HandleError(ex);
                    return(false);
                }

                // invalid attribute:
                Debug.WriteLine($"PDO_ATTR {attribute} is not known.");
                return(false);
            }
        }
Beispiel #6
0
 public virtual PhpValue getAttribute(PDO_ATTR attribute) => TryGetAttribute(attribute, out var value) ? value : PhpValue.Null;
        /// <summary>
        /// Set an attribute.
        /// </summary>
        /// <param name="attribute">The attribute.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public virtual bool setAttribute(PDO_ATTR attribute, PhpValue value)
        {
            try
            {
                if (attribute >= PDO_ATTR.ATTR_DRIVER_SPECIFIC)
                {
                    return(Driver.TrySetAttribute(m_attributes, attribute, value));
                }
            }
            catch (System.Exception ex)
            {
                this.HandleError(ex);
                return(false);
            }

            long l; // temp value

            switch (attribute)
            {
            //readonly
            case PDO_ATTR.ATTR_SERVER_INFO:
            case PDO_ATTR.ATTR_SERVER_VERSION:
            case PDO_ATTR.ATTR_CLIENT_VERSION:
            case PDO_ATTR.ATTR_CONNECTION_STATUS:
            case PDO_ATTR.ATTR_DRIVER_NAME:
                return(false);

            //boolean

            case PDO_ATTR.ATTR_AUTOCOMMIT:
            case PDO_ATTR.ATTR_EMULATE_PREPARES:
                m_attributes[attribute] = value;
                return(true);

            //strict positif integers

            case PDO_ATTR.ATTR_PREFETCH:
            case PDO_ATTR.ATTR_TIMEOUT:
                m_attributes[attribute] = value;
                return(true);

            //remaining

            case PDO_ATTR.ATTR_ERRMODE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_ERRMODE), (int)l))
                {
                    m_attributes[attribute] = l;
                    return(true);
                }
                else
                {
                    // Warning: PDO::setAttribute(): SQLSTATE[HY000]: General error: invalid error mode
                    PhpException.InvalidArgument(nameof(value));
                    return(false);
                }

            case PDO_ATTR.ATTR_CASE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_CASE), (int)l))
                {
                    m_attributes[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_CURSOR:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_CURSOR), (int)l))
                {
                    m_attributes[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_DEFAULT_FETCH_MODE:
                l = value.ToLong();
                if (Enum.IsDefined(typeof(PDO_FETCH), (int)l))
                {
                    m_attributes[attribute] = l;
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_STATEMENT_CLASS:
                if (value.IsPhpArray(out var arr) && arr.Count != 0)
                {
                    m_attributes[attribute] = arr.DeepCopy();
                    return(true);
                }
                return(false);

            case PDO_ATTR.ATTR_FETCH_CATALOG_NAMES:
            case PDO_ATTR.ATTR_FETCH_TABLE_NAMES:
            case PDO_ATTR.ATTR_MAX_COLUMN_LEN:
            case PDO_ATTR.ATTR_ORACLE_NULLS:
            case PDO_ATTR.ATTR_PERSISTENT:
            case PDO_ATTR.ATTR_STRINGIFY_FETCHES:
                throw new NotImplementedException();

            //statement only
            case PDO_ATTR.ATTR_CURSOR_NAME:
                return(false);

            default:
                return(false);
            }
        }
Beispiel #8
0
        public bool setAttribute(PDO_ATTR attribute, PhpValue value)
        {
            try
            {
                if ((int)attribute >= (int)PDO_ATTR.ATTR_DRIVER_SPECIFIC)
                {
                    return(this.m_driver.TrySetAttribute(this.m_attributes, attribute, value));
                }
                switch (attribute)
                {
                //readonly
                case PDO_ATTR.ATTR_SERVER_INFO:
                case PDO_ATTR.ATTR_SERVER_VERSION:
                case PDO_ATTR.ATTR_CLIENT_VERSION:
                case PDO_ATTR.ATTR_CONNECTION_STATUS:
                case PDO_ATTR.ATTR_DRIVER_NAME:
                    return(false);

                //boolean
                case PDO_ATTR.ATTR_AUTOCOMMIT:
                case PDO_ATTR.ATTR_EMULATE_PREPARES:
                    this.m_attributes.Set(attribute, value.ToBoolean());
                    return(true);


                //strict positif integers
                case PDO_ATTR.ATTR_PREFETCH:
                case PDO_ATTR.ATTR_TIMEOUT:
                    this.m_attributes.Set(attribute, (int)value.ToLong());
                    return(true);

                //remaining

                case PDO_ATTR.ATTR_ERRMODE:
                    int errmodeValue = (int)value.ToLong();
                    if (Enum.IsDefined(typeof(PDO_ERRMODE), errmodeValue))
                    {
                        this.m_attributes.Set(attribute, (PDO_ERRMODE)errmodeValue);
                        return(true);
                    }
                    return(false);

                case PDO_ATTR.ATTR_CASE:
                    int caseValue = (int)value.ToLong();
                    if (Enum.IsDefined(typeof(PDO_CASE), caseValue))
                    {
                        this.m_attributes.Set(attribute, (PDO_CASE)caseValue);
                        return(true);
                    }
                    return(false);

                case PDO_ATTR.ATTR_CURSOR:
                    int cursorValue = (int)value.ToLong();
                    if (Enum.IsDefined(typeof(PDO_CURSOR), cursorValue))
                    {
                        this.m_attributes.Set(attribute, (PDO_CURSOR)cursorValue);
                        return(true);
                    }
                    return(false);

                case PDO_ATTR.ATTR_DEFAULT_FETCH_MODE:
                case PDO_ATTR.ATTR_FETCH_CATALOG_NAMES:
                case PDO_ATTR.ATTR_FETCH_TABLE_NAMES:
                case PDO_ATTR.ATTR_MAX_COLUMN_LEN:
                case PDO_ATTR.ATTR_ORACLE_NULLS:
                case PDO_ATTR.ATTR_PERSISTENT:
                case PDO_ATTR.ATTR_STATEMENT_CLASS:
                case PDO_ATTR.ATTR_STRINGIFY_FETCHES:
                    throw new NotImplementedException();

                //statement only
                case PDO_ATTR.ATTR_CURSOR_NAME:
                    return(false);

                default:
                    return(false);
                }
            }
            catch (System.Exception ex)
            {
                this.HandleError(ex);
                return(false);
            }
        }