private void Initialize() { if (!this.disposed) { if (this.serviceProvider == IntPtr.Zero) { lock (this.serviceProviderStateLock) { if (!this.disposed && this.serviceProvider == IntPtr.Zero) { uint errorCode = ServiceInteropWrapper.CreateServiceProvider( this.queryengineConfiguration, out this.serviceProvider); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { throw exception; } } } } } else { throw new ObjectDisposedException(typeof(QueryPartitionProvider).Name); } }
public void TestInteropTest() { try { CosmosClient client = new CosmosClient(connectionString: null); Assert.Fail(); } catch (ArgumentNullException) { } Assert.IsTrue(ServiceInteropWrapper.AssembliesExist.Value); string configJson = "{}"; IntPtr provider; uint result = ServiceInteropWrapper.CreateServiceProvider(configJson, out provider); }
public void Update(IDictionary <string, object> queryengineConfiguration) { if (queryengineConfiguration == null) { throw new ArgumentNullException("queryengineConfiguration"); } if (queryengineConfiguration.Count == 0) { throw new ArgumentException("queryengineConfiguration cannot be empty!"); } if (!this.disposed) { lock (this.serviceProviderStateLock) { this.queryengineConfiguration = JsonConvert.SerializeObject(queryengineConfiguration); if (!this.disposed && this.serviceProvider != IntPtr.Zero) { uint errorCode = ServiceInteropWrapper.UpdateServiceProvider( this.serviceProvider, this.queryengineConfiguration); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { throw exception; } } } } else { throw new ObjectDisposedException(typeof(QueryPartitionProvider).Name); } }
internal PartitionedQueryExecutionInfoInternal GetPartitionedQueryExecutionInfoInternal( SqlQuerySpec querySpec, PartitionKeyDefinition partitionKeyDefinition, bool requireFormattableOrderByQuery, bool isContinuationExpected) { if (querySpec == null || partitionKeyDefinition == null) { return(DefaultInfoInternal); } string queryText = JsonConvert.SerializeObject(querySpec); List <string> paths = new List <string>(partitionKeyDefinition.Paths); List <string[]> pathParts = new List <string[]>(); paths.ForEach(path => { pathParts.Add(PathParser.GetPathParts(path).ToArray()); }); string[] allParts = pathParts.SelectMany(parts => parts).ToArray(); uint[] partsLengths = pathParts.Select(parts => (uint)parts.Length).ToArray(); PartitionKind partitionKind = partitionKeyDefinition.Kind; this.Initialize(); byte[] buffer = new byte[InitialBufferSize]; uint errorCode; uint serializedQueryExecutionInfoResultLength; unsafe { fixed(byte *bytePtr = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); if (errorCode == DISP_E_BUFFERTOOSMALL) { buffer = new byte[serializedQueryExecutionInfoResultLength]; fixed(byte *bytePtr2 = buffer) { errorCode = ServiceInteropWrapper.GetPartitionKeyRangesFromQuery( this.serviceProvider, queryText, requireFormattableOrderByQuery, isContinuationExpected, allParts, partsLengths, (uint)partitionKeyDefinition.Paths.Count, partitionKind, new IntPtr(bytePtr2), (uint)buffer.Length, out serializedQueryExecutionInfoResultLength); } } } } string serializedQueryExecutionInfo = Encoding.UTF8.GetString(buffer, 0, (int)serializedQueryExecutionInfoResultLength); Exception exception = Marshal.GetExceptionForHR((int)errorCode); if (exception != null) { DefaultTrace.TraceInformation("QueryEngineConfiguration: " + this.queryengineConfiguration); throw new BadRequestException( "Message: " + serializedQueryExecutionInfo, exception); } PartitionedQueryExecutionInfoInternal queryInfoInternal = JsonConvert.DeserializeObject <PartitionedQueryExecutionInfoInternal>( serializedQueryExecutionInfo, new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }); return(queryInfoInternal); }