in Microsoft.Azure.Cosmos/src/Pagination/ResourceIdentifier.cs [223:437]
public static bool TryParse(string id, out ResourceIdentifier rid)
{
try
{
uint offer = 0;
uint database = 0;
uint documentCollection = 0;
ulong storedProcedure = 0;
ulong trigger = 0;
ulong userDefinedFunction = 0;
ulong conflict = 0;
ulong document = 0;
ulong partitionKeyRange = 0;
uint user = 0;
uint clientEncryptionKey = 0;
ulong permission = 0;
uint attachment = 0;
ulong schema = 0;
uint userDefinedType = 0;
ulong snapshot = 0;
ulong roleAssignment = 0;
ulong roleDefinition = 0;
if (string.IsNullOrEmpty(id))
{
rid = default;
return false;
}
if (id.Length % 4 != 0)
{
// our resourceId string is always padded
rid = default;
return false;
}
if (ResourceIdentifier.Verify(id, out byte[] buffer) == false)
{
rid = default;
return false;
}
if (buffer.Length % 4 != 0 &&
buffer.Length != ResourceIdentifier.OfferIdLength &&
buffer.Length != ResourceIdentifier.SnapshotIdLength &&
buffer.Length != ResourceIdentifier.RbacResourceIdLength)
{
rid = default;
return false;
}
if (buffer.Length == ResourceIdentifier.OfferIdLength)
{
offer = (uint)ResourceIdentifier.ToUnsignedLong(buffer);
rid = new ResourceIdentifier(offer: offer);
return true;
}
if (buffer.Length == ResourceIdentifier.SnapshotIdLength)
{
snapshot = ResourceIdentifier.ToUnsignedLong(buffer);
rid = new ResourceIdentifier(snapshot: snapshot);
return true;
}
if (buffer.Length == ResourceIdentifier.RbacResourceIdLength)
{
byte rbacResourceType = buffer[ResourceIdentifier.RbacResourceIdLength - 1];
ulong rbacResourceId = ResourceIdentifier.ToUnsignedLong(buffer, 4);
switch ((RbacResourceType)rbacResourceType)
{
case RbacResourceType.RbacResourceType_RoleDefinition:
roleDefinition = rbacResourceId;
rid = new ResourceIdentifier(
offer, database, documentCollection, storedProcedure,
trigger, userDefinedFunction, conflict, document,
partitionKeyRange, user, clientEncryptionKey,
userDefinedType, permission, attachment, schema,
snapshot, roleAssignment, roleDefinition);
return true;
case RbacResourceType.RbacResourceType_RoleAssignment:
roleAssignment = rbacResourceId;
rid = new ResourceIdentifier(
offer, database, documentCollection, storedProcedure,
trigger, userDefinedFunction, conflict, document,
partitionKeyRange, user, clientEncryptionKey,
userDefinedType, permission, attachment, schema,
snapshot, roleAssignment, roleDefinition);
return true;
default:
rid = default;
return false;
}
}
if (buffer.Length >= 4)
database = BitConverter.ToUInt32(buffer, 0);
if (buffer.Length >= 8)
{
byte[] temp = new byte[4];
ResourceIdentifier.BlockCopy(buffer, 4, temp, 0, 4);
bool isCollection = (temp[0] & (128)) > 0;
if (isCollection)
{
documentCollection = BitConverter.ToUInt32(temp, 0);
if (buffer.Length >= 16)
{
byte[] subCollRes = new byte[8];
ResourceIdentifier.BlockCopy(buffer, 8, subCollRes, 0, 8);
UInt64 subCollectionResource = BitConverter.ToUInt64(buffer, 8);
if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Document)
{
document = subCollectionResource;
if (buffer.Length == 20)
{
attachment = BitConverter.ToUInt32(buffer, 16);
}
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.StoredProcedure)
{
storedProcedure = subCollectionResource;
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Trigger)
{
trigger = subCollectionResource;
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.UserDefinedFunction)
{
userDefinedFunction = subCollectionResource;
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Conflict)
{
conflict = subCollectionResource;
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.PartitionKeyRange)
{
partitionKeyRange = subCollectionResource;
}
else if ((subCollRes[7] >> 4) == (byte)CollectionChildResourceType.Schema)
{
schema = subCollectionResource;
}
else
{
rid = default;
return false;
}
}
else if (buffer.Length != 8)
{
rid = default;
return false;
}
}
else
{
user = BitConverter.ToUInt32(temp, 0);
if (buffer.Length == 16)
{
if (user > 0)
{
permission = BitConverter.ToUInt64(buffer, 8);
}
else
{
uint exDatabaseChildResourceId = BitConverter.ToUInt32(buffer, 8);
ExtendedDatabaseChildResourceType exDatabaseChildResType = (ExtendedDatabaseChildResourceType)BitConverter.ToUInt32(buffer, 12);
if (exDatabaseChildResType == ExtendedDatabaseChildResourceType.UserDefinedType)
{
userDefinedType = exDatabaseChildResourceId;
}
else if (exDatabaseChildResType == ExtendedDatabaseChildResourceType.ClientEncryptionKey)
{
clientEncryptionKey = exDatabaseChildResourceId;
}
else
{
rid = default;
return false;
}
}
}
else if (buffer.Length != 8)
{
rid = default;
return false;
}
}
}
rid = new ResourceIdentifier(
offer, database, documentCollection, storedProcedure,
trigger, userDefinedFunction, conflict, document,
partitionKeyRange, user, clientEncryptionKey,
userDefinedType, permission, attachment, schema,
snapshot, roleAssignment, roleDefinition);
return true;
}
catch (Exception)
{
rid = default;
return false;
}
}