Beispiel #1
0
        private bool OpenConnection(SdeConnection sdeConnection, IDataset dataset)
        {
            _errMsg = "";

            if (sdeConnection.SeConnection.handle != IntPtr.Zero)
            {
                CloseConnection(sdeConnection);
            }

            string server   = ConfigTextStream.ExtractValue(_connectionString, "server");
            string instance = ConfigTextStream.ExtractValue(_connectionString, "instance");
            string database = ConfigTextStream.ExtractValue(_connectionString, "database");
            string username = ConfigTextStream.ExtractValue(_connectionString, "usr");
            string password = ConfigTextStream.ExtractValue(_connectionString, "pwd");
            string pooling  = ConfigTextStream.ExtractValue(_connectionString, "pooling");

            if (!String.IsNullOrWhiteSpace(pooling) &&
                (pooling.ToLower() == "false" || pooling.ToLower() == "no"))
            {
                sdeConnection.Pooling = false;
            }
            else
            {
                sdeConnection.Pooling = true;
            }

            sdeConnection.Dataset = dataset;

            SE_ERROR error = new SE_ERROR();

            try
            {
                System.Int32 errCode = Wrapper10.SE_connection_create(
                    server,
                    instance,
                    database,
                    username,
                    password,
                    ref error,
                    ref sdeConnection.SeConnection);
                if (errCode != 0)
                {
                    error.sde_error = errCode;
                    _errMsg         = errCode + " " + Wrapper10.GetErrorMsg(sdeConnection.SeConnection, error);
                    return(false);
                }
            }
            catch (Exception ex)
            {
                _errMsg = "SDE ERROR: " + ex.Message;
                return(false);
            }

            return(true);
        }
Beispiel #2
0
        private string FetchNString(System.Int16 index, int size)
        {
            try
            {
                byte[]       buffer = new byte[(size + 1) * 2];
                System.Int32 err_no = Wrapper10.SE_stream_get_nstring(_stream.SeStream, index, buffer);

                if (err_no == -1004)
                {
                    return(String.Empty);                 //return null;
                }
                if (err_no != 0)
                {
                    return("<ERROR>:" + Wrapper10.GetErrorMsg(_connection.SeConnection, err_no));
                }

                return(System.Text.Encoding.Unicode.GetString(buffer).Replace("\0", ""));
            }
            catch (Exception ex) { return("<EXCEPTION>:" + ex.Message); }
        }
Beispiel #3
0
        protected override SdeConnection OpenConnection(IDataset dataset)
        {
            _errMsg = "";

            SdeConnection connection = new SdeConnection(dataset);

            string server   = ConfigTextStream.ExtractValue(_connectionString, "server");
            string instance = ConfigTextStream.ExtractValue(_connectionString, "instance");
            string database = ConfigTextStream.ExtractValue(_connectionString, "database");
            string username = ConfigTextStream.ExtractValue(_connectionString, "usr");
            string password = ConfigTextStream.ExtractValue(_connectionString, "pwd");

            SE_ERROR error = new SE_ERROR();

            try
            {
                if (Wrapper10.SE_connection_create(
                        server,
                        instance,
                        database,
                        username,
                        password,
                        ref error,
                        ref connection.SeConnection) != 0)
                {
                    _errMsg = Wrapper10.GetErrorMsg(connection.SeConnection, error);
                    return(null);
                }
            }
            catch (Exception ex)
            {
                _errMsg = "SDE ERROR: " + ex.Message;
                return(null);
            }
            return(connection);
        }
Beispiel #4
0
        public SdeFeatureCursor(SdeDataset dataset, ITableClass tc, IQueryFilter filter)
            : base((tc is IFeatureClass) && ((IFeatureClass)tc).SpatialReference != null ?
                   ((IFeatureClass)tc).SpatialReference : filter.ContextLayerDefaultSpatialReference,
                   (filter != null) ? filter.FeatureSpatialReference : null)
        {
            try
            {
                if (filter != null && !filter.SubFields.Contains("*"))
                {
                    filter.AddField(tc.IDFieldName, false);
                }
                filter.fieldPrefix  = tc.Name + ".";
                filter.fieldPostfix = "";

                if (filter is ISpatialFilter &&
                    (((ISpatialFilter)filter).SpatialRelation != spatialRelation.SpatialRelationMapEnvelopeIntersects))
                {
                    if (tc is IFeatureClass)
                    {
                        filter.AddField(((IFeatureClass)tc).ShapeFieldName);
                    }
                    _spatialFilter = (ISpatialFilter)filter;
                }

                Int32 err_no = 0;

                _dataset = dataset;
                if (_dataset == null)
                {
                    return;
                }

                //_connection = _dataset.AllocConnection();
                _connection = new ArcSdeConnection(dataset.ConnectionString);
                if (!_connection.Open(this._dataset))
                {
                    return;
                }

                _queryInfo = new SdeQueryInfo(_connection, tc, filter);
                if (_queryInfo.ErrorMessage != "")
                {
                    Dispose();
                    return;
                }

                //if (Wrapper10.SE_stream_create(_connection.SeConnection, ref _stream) != 0)
                //{
                //    Dispose();
                //    return;
                //}

                //_connection.ResetStream();

                _stream = _connection.CreateStream();

                // SE_stream_set_state sollte auch aufgerufen werden (siehe mapsde.c von UMN)
                if (Wrapper10.SE_stream_set_state(
                        _stream.SeStream,
                        CONST.SE_DEFAULT_STATE_ID,
                        CONST.SE_DEFAULT_STATE_ID,
                        CONST.SE_STATE_DIFF_NOCHECK) != 0)
                {
                    Dispose();
                    return;
                }

                if ((err_no = Wrapper10.SE_stream_query_with_info(_stream.SeStream, _queryInfo.SeQueryInfo)) != 0)
                {
                    Dispose();
                    return;
                }

                if (_queryInfo.IsSpatial)
                {
                    SE_FILTER se_filter = _queryInfo.Filter_Shape;
                    if ((err_no = Wrapper10.SE_stream_set_spatial_constraints(_stream.SeStream, CONST.SE_SPATIAL_FIRST, false, 1, ref se_filter)) != 0)
                    {
                        _errMsg = Wrapper10.GetErrorMsg(_connection.SeConnection, err_no);
                        Dispose();
                        return;
                    }
                }
                else
                {
                    /*
                     * SE_FILTER se_filter = _queryInfo.Filter_Id;
                     * if (Wrapper10.SE_stream_set_spatial_constraints(_stream, CONST.SE_SPATIAL_FIRST, false, 1, ref se_filter) != 0)
                     * {
                     *  Release();
                     *  return;
                     * }
                     * */
                }

                if (Wrapper10.SE_stream_execute(_stream.SeStream) != 0)
                {
                    Dispose();
                    return;
                }

                _queryFields = _queryInfo.QueryFields;
                _queryInfo.Dispose();
                _queryInfo = null;
            }
            catch (Exception ex)
            {
                _errMsg = ex.Message + "\n" + ex.StackTrace;
                Dispose();
            }
        }
Beispiel #5
0
        public SdeQueryInfo(ArcSdeConnection connection, ITableClass tc, IQueryFilter filter)
        {
            if (tc == null)
            {
                return;
            }

            try
            {
                if (filter is ISpatialFilter && ((ISpatialFilter)filter).Geometry != null && tc is IFeatureClass && tc.Dataset is SdeDataset)
                {
                    SE_ENVELOPE maxExtent = new SE_ENVELOPE();
                    SE_COORDREF coordRef  = ((SdeDataset)tc.Dataset).GetSeCoordRef(connection, tc.Name, ((IFeatureClass)tc).ShapeFieldName, ref maxExtent);
                    if (((SdeDataset)tc.Dataset).lastErrorMsg != "")
                    {
                        return;
                    }

                    _isSpatial = true;
                    _err_no    = Wrapper10.SE_shape_create(coordRef, ref _shape);
                    ((SdeDataset)tc.Dataset).FreeSeCoordRef(coordRef);
                    if (_err_no != 0)
                    {
                        return;
                    }

                    //IEnvelope env = ((ISpatialFilter)filter).Geometry.Envelope;
                    //SE_ENVELOPE seEnvelope = new SE_ENVELOPE();

                    //seEnvelope.minx = Math.Max(env.minx, maxExtent.minx);
                    //seEnvelope.miny = Math.Max(env.miny, maxExtent.miny);
                    //seEnvelope.maxx = Math.Min(env.maxx, maxExtent.maxx);
                    //seEnvelope.maxy = Math.Min(env.maxy, maxExtent.maxy);

                    //if (seEnvelope.minx == seEnvelope.maxx && seEnvelope.miny == seEnvelope.maxy)
                    //{
                    //    /* fudge a rectangle so we have a valid one for generate_rectangle */
                    //    /* FIXME: use the real shape for the query and set the filter_type
                    //       to be an appropriate type */
                    //    seEnvelope.minx = seEnvelope.minx - 0.001;
                    //    seEnvelope.maxx = seEnvelope.maxx + 0.001;
                    //    seEnvelope.miny = seEnvelope.miny - 0.001;
                    //    seEnvelope.maxy = seEnvelope.maxy + 0.001;
                    //}

                    //_err_no = Wrapper10.SE_shape_generate_rectangle(ref seEnvelope, _shape);
                    _err_no = gView.SDEWrapper.a10.Functions.SE_GenerateGeometry(_shape, ((ISpatialFilter)filter).Geometry, maxExtent);
                    if (_err_no != 0)
                    {
                        return;
                    }

                    _seFilter.shape = _shape;

                    /* set spatial constraint column and table */
                    _seFilter.table  = tc.Name.PadRight(CONST.SE_QUALIFIED_TABLE_NAME, '\0');;
                    _seFilter.column = ((IFeatureClass)tc).ShapeFieldName.PadRight(CONST.SE_MAX_COLUMN_LEN, '\0');

                    /* set a couple of other spatial constraint properties */

                    switch (((ISpatialFilter)filter).SpatialRelation)
                    {
                    /*case spatialRelation.SpatialRelationMapEnvelopeIntersects:
                     *  _seFilter.method = CONST.SM_ENVP_BY_GRID;
                     *  break;
                     * */
                    case spatialRelation.SpatialRelationEnvelopeIntersects:
                        _seFilter.method = CONST.SM_ENVP;
                        break;

                    default:
                        _seFilter.method = CONST.SM_AI;
                        break;
                    }


                    _seFilter.filter_type = CONST.SE_SHAPE_FILTER;
                    _seFilter.truth       = true; // True;
                }

                _err_no = Wrapper10.SE_queryinfo_create(ref _queryInfo);
                if (_err_no != 0)
                {
                    return;
                }

                _err_no = Wrapper10.SE_queryinfo_set_tables(_queryInfo, 1, new string[] { tc.Name }, null);
                if (_err_no != 0)
                {
                    return;
                }

                string [] fields;
                if (filter.SubFields == "" || filter.SubFields.Contains("*") || filter.SubFields == null)
                {
                    StringBuilder subFields = new StringBuilder();
                    foreach (IField field in tc.Fields.ToEnumerable())
                    {
                        if (subFields.Length != 0)
                        {
                            subFields.Append(" ");
                        }
                        subFields.Append(tc.Name + "." + field.name);
                        _queryFields.Add(field);
                    }
                    fields = subFields.ToString().Split(' ');
                }
                else
                {
                    fields = filter.SubFields.Split(' ');
                    foreach (string fieldname in fields)
                    {
                        string fname = fieldname;
                        if (fieldname.ToLower().IndexOf("distinct(") == 0)
                        {
                            fname = fieldname.Substring(9, fieldname.IndexOf(")") - 9);
                        }

                        IField field = tc.FindField(fname);
                        if (field == null)
                        {
                            if (filter.IgnoreUndefinedFields)
                            {
                                continue;
                            }

                            _errMsg = "Can't get Field " + fname;
                            Cleanup();
                            return;
                        }
                        _queryFields.Add(field);
                    }
                }

                _err_no = Wrapper10.SE_queryinfo_set_columns(_queryInfo, fields.Length, fields);
                if (_err_no != 0)
                {
                    return;
                }

                string where = "";
                if (filter != null)
                {
                    if (filter is IRowIDFilter)
                    {
                        where = ((IRowIDFilter)filter).RowIDWhereClause;
                    }
                    else
                    {
                        where = filter.WhereClause;
                    }
                }
                if (where != "")
                {
                    _err_no = Wrapper10.SE_queryinfo_set_where_clause(_queryInfo, where);
                    if (_err_no != 0)
                    {
                        return;
                    }
                }

                _err_no = Wrapper10.SE_queryinfo_set_query_type(_queryInfo, CONST.SE_QUERYTYPE_JSFA);
                if (_err_no != 0)
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                _errMsg = "SeQueryInfo:" + ex.Message + "\n" + ex.StackTrace;
                _err_no = -1;
            }
            finally
            {
                if (_err_no != 0)
                {
                    _errMsg = Wrapper10.GetErrorMsg(new SE_CONNECTION(), _err_no);
                    Cleanup();
                }
            }
        }
Beispiel #6
0
        /*
         * internal SdeConnection AllocConnection()
         * {
         *  if (_sConnection == null) return null;
         *  return _current = _sConnection.AllocConnection();
         * }
         *
         * internal void FreeConnection()
         * {
         *  if (_sConnection == null) return;
         *  _current = null;
         *  _sConnection.FreeConnection();
         * }
         */

        internal SE_COORDREF GetSeCoordRef(ArcSdeConnection connection, string table, string spatialColumnName, ref SE_ENVELOPE envelope)
        {
            _errMsg = "";
            if (connection == null || connection.SeConnection.handle == IntPtr.Zero)
            {
                _errMsg = "GetSeCoordRef:\n No Connection allocated!";
                return(new SE_COORDREF());
            }

            SE_COORDREF  coordRef  = new SE_COORDREF();
            SE_LAYERINFO layerInfo = new SE_LAYERINFO();
            Int32        _err_no   = 0;

            try
            {
                _err_no = Wrapper10.SE_coordref_create(ref coordRef);
                if (_err_no != 0)
                {
                    return(new SE_COORDREF());
                }

                _err_no = Wrapper10.SE_layerinfo_create(coordRef, ref layerInfo);
                if (_err_no != 0)
                {
                    return(new SE_COORDREF());
                }

                _err_no = Wrapper10.SE_layer_get_info(connection.SeConnection, table, spatialColumnName, layerInfo);
                if (_err_no != 0)
                {
                    return(new SE_COORDREF());
                }

                _err_no = Wrapper10.SE_layerinfo_get_coordref(layerInfo, coordRef);
                if (_err_no != 0)
                {
                    return(new SE_COORDREF());
                }

                _err_no = Wrapper10.SE_coordref_get_xy_envelope(coordRef, ref envelope);
                if (_err_no != 0)
                {
                    return(new SE_COORDREF());
                }

                return(coordRef);
            }
            catch (Exception ex)
            {
                _errMsg = "GetSeCoordRef:\n " + ex.Message + "\n" + ex.StackTrace;
                return(new SE_COORDREF());
            }
            finally
            {
                if (layerInfo.handle != IntPtr.Zero)
                {
                    Wrapper10.SE_layerinfo_free(layerInfo);
                }

                if (_err_no != 0)
                {
                    if (coordRef.handle != IntPtr.Zero)
                    {
                        Wrapper10.SE_coordref_free(coordRef);
                    }
                    _errMsg = Wrapper10.GetErrorMsg(new SE_CONNECTION(), _err_no);
                }
            }
        }
Beispiel #7
0
        internal ISpatialReference GetLayerSpatialReference(SE_CONNECTION connection, string table, string spatialColumnName)
        {
            _errMsg = "";
            if (connection.handle == IntPtr.Zero)
            {
                _errMsg = "GetLayerSpatialReference:\n No Connection allocated!";
                return(null);
            }

            SE_COORDREF  coordRef  = new SE_COORDREF();
            SE_LAYERINFO layerInfo = new SE_LAYERINFO();
            Int32        _err_no   = 0;

            try
            {
                _err_no = Wrapper10.SE_coordref_create(ref coordRef);
                if (_err_no != 0)
                {
                    return(null);
                }

                _err_no = Wrapper10.SE_layerinfo_create(coordRef, ref layerInfo);
                if (_err_no != 0)
                {
                    return(null);
                }

                _err_no = Wrapper10.SE_layer_get_info(connection, table, spatialColumnName, layerInfo);
                if (_err_no != 0)
                {
                    return(null);
                }

                _err_no = Wrapper10.SE_layerinfo_get_coordref(layerInfo, coordRef);
                if (_err_no != 0)
                {
                    return(null);
                }

                System.Int32 srid = 0;
                _err_no = Wrapper10.SE_coordref_get_srid(coordRef, ref srid);
                if (_err_no != 0)
                {
                    return(null);
                }

                byte[] description = new byte[1024 * 4];
                _err_no = Wrapper10.SE_coordref_get_description(coordRef, description);
                if (_err_no != 0)
                {
                    return(null);
                }

                string            wkt  = Functions.GetASCIIString(description);
                ISpatialReference sRef = gView.Framework.Geometry.SpatialReference.FromWKT(wkt);

                return(sRef);
            }
            catch (Exception ex)
            {
                _errMsg = "GetLayerSpatialReference:\n " + ex.Message + "\n" + ex.StackTrace;
                return(null);
            }
            finally
            {
                if (layerInfo.handle != IntPtr.Zero)
                {
                    Wrapper10.SE_layerinfo_free(layerInfo);
                }
                if (coordRef.handle != IntPtr.Zero)
                {
                    Wrapper10.SE_coordref_free(coordRef);
                }

                if (_err_no != 0)
                {
                    _errMsg = Wrapper10.GetErrorMsg(new SE_CONNECTION(), _err_no);
                }
            }
        }