Example #1
0
        /// <summary>
        /// Executes the given SQL character sequence directly,
        /// returning a scalar value.
        /// </summary>
        /// <param name="sql">
        /// The SQL character sequence to execute.
        /// </param>
        /// <returns>
        /// A scalar value representing the result of the execution.
        /// </returns>
        internal object ExecuteScalarDirect(string sql)
        {
            Request request = s_protocol.CreateExecuteDirectRequest(sql);

            s_protocol.SetMaxRows(request, 1);

            Response response = Execute(request);

            if (response.isUpdateCount() ||
                0 >= response.getColumnCount() ||
                response.isEmpty())
            {
                return(null);
            }

            object value = response.rRoot.data[0];

            if (value == null)
            {
                return(null);
            }
            else if (value is string)
            {
                return(value);
            }
            else
            {
                int type = response.metaData.colTypes[0];

                return(HsqlConvert.FromJava.ToObject(value, type));
            }
        }
Example #2
0
 public HsqlDataReader(org.hsqldb.Result result)
 {
     if (result == null)
     {
         throw new ArgumentNullException("result");
     }
     else if (result.isError())
     {
         throw new HsqlDataSourceException(result);
     }
     else if (result.isUpdateCount())
     {
         m_recordsAffected = result.getUpdateCount();
     }
     else if (result.isData())
     {
         m_recordsAffected = -1;
         m_result          = result;
         m_fieldCount      = result.getColumnCount();
         m_metaData        = result.metaData;
         m_columnTypes     = m_metaData.colTypes;
     }
     else
     {
         throw new InvalidOperationException(
                   "Unhandled Result Mode: " + result.mode);
     }
 }
Example #3
0
        /// <summary>
        /// Executes the given prepared request, returning a scalar value.
        /// </summary>
        /// <param name="request">The prepared request.</param>
        /// <returns>
        /// The scalar value. This is the first column of first row;
        /// <c>null</c> when the result has no columns or no rows.
        /// </returns>
        internal object ExecuteScalarPrepared(Request request)
        {
            s_protocol.SetMaxRows(request, 1);

            Response response = Execute(request);

            if (response.isUpdateCount() ||
                (0 >= response.getColumnCount()) ||
                response.isEmpty())
            {
                return(null);
            }

            // No check for null pointers or array bounds violation.
            // We cannot get this far and still
            // have a rRoot == null, rRoot.data == null or
            // rRoot.data.Length < 1 condition, unless
            // there is an actual (and serious) bug in the
            // underlying libraries.
            object value = response.rRoot.data[0];

            if (value == null)
            {
                return(null);
            }
            else if (value is string)
            {
                return(value);
            }
            else
            {
                int type = response.metaData.colTypes[0];

                return(HsqlConvert.FromJava.ToObject(value, type));
            }
        }
        /// <summary>
        /// Retrieves a <c>DataTable</c> object representing the column
        /// metadata of the given data reader's current result.
        /// </summary>
        /// <param name="reader">
        /// A reader object for which to retrieve the column metadata.
        /// </param>
        /// <returns>
        /// A <c>DataTable</c> object representing the column metadata of the
        /// given data reader's current result.
        /// </returns>
        /// <exception cref="HsqlDataSourceException">
        /// If a data access error occurs.
        /// </exception>
        public static DataTable CreateSchemaTable(HsqlDataReader reader)
        {
            Result         result         = reader.m_result;
            int            columnCount    = result.getColumnCount();
            ResultMetaData metaData       = result.metaData;
            DataTable      table          = CreateTable(columnCount);
            bool           includeKeyInfo = reader.HasCommandBehavior(CommandBehavior.KeyInfo);
            Dictionary <ColumnIdentifier, KeyInfo> keyInfoMap = (includeKeyInfo)
                ? HsqlResultSetMetaData.GetKeyInfo(reader)
                : null;

            string catalogName = reader.OriginatingConnection.Database;

            for (int i = 0; i < columnCount; i++)
            {
                bool   isAutoIncrement  = metaData.isIdentity[i];
                string columnName       = metaData.colLabels[i];
                int    columnOrdinal    = i;
                int    columnSize       = metaData.colSizes[i];
                int    numericPrecision = metaData.colSizes[i];
                int    numericScale     = metaData.colScales[i];
                bool   isUnique         = false; // isAutoIncrement;
                bool   isKey            = isAutoIncrement;
                string baseServerName   = null;
                string baseCatalogName  = catalogName;//metaData.catalogNames[i];
                string baseColumnName   = metaData.colNames[i];
                string baseSchemaName   = metaData.schemaNames[i];
                string baseTableName    = metaData.tableNames[i];
                int    providerType     = metaData.colTypes[i];
                Type   dataType         = HsqlConvert.ToDataType(providerType);
                int    nullability      = metaData.colNullable[i];
                bool   allowDBNull      = isAutoIncrement || (nullability != 0);
                bool   isAliased        = (columnName != baseColumnName);
                bool   isExpression     = string.IsNullOrEmpty(baseTableName);
                bool   isIdentity       = isAutoIncrement;
                bool   isRowVersion     = false;
                bool   isHidden         = false;
                bool   isLong           = HsqlConvert.ToIsLongProviderType(providerType);
                bool   isReadOnly       = !metaData.isWritable[i];

                if ((columnSize == 0) &&
                    HsqlTypes.isCharacterType(providerType))
                {
                    columnSize = HsqlTypes.getPrecision(providerType);
                }

                if ((numericPrecision == 0) &&
                    HsqlTypes.isNumberType(providerType))
                {
                    numericPrecision = HsqlTypes.getPrecision(providerType);
                }

                if (includeKeyInfo)
                {
                    if (!(string.IsNullOrEmpty(baseTableName) ||
                          string.IsNullOrEmpty(baseColumnName)))
                    {
                        ColumnIdentifier key = new ColumnIdentifier(
                            baseSchemaName, baseTableName, baseColumnName);
                        KeyInfo keyInfo;

                        if (keyInfoMap.TryGetValue(key, out keyInfo))
                        {
                            isKey    = keyInfo.m_isKey;
                            isUnique = keyInfo.m_isUnique;
                        }
                    }
                }

                HsqlResultSetMetaData.AddRow(table, columnName, columnOrdinal,
                                             columnSize, numericPrecision, numericScale, isUnique,
                                             isKey, baseServerName, baseCatalogName, baseColumnName,
                                             baseSchemaName, baseTableName, dataType, allowDBNull,
                                             providerType, isAliased, isExpression, isIdentity,
                                             isAutoIncrement, isRowVersion, isHidden, isLong,
                                             isReadOnly);
            }

            DataColumnCollection columns = table.Columns;
            int count = columns.Count;

            for (int i = 0; i < count; i++)
            {
                columns[i].ReadOnly = true;
            }

            return(table);
        }