in src/blob/persistence/LokiBlobMetadataStore.ts [1306:1399]
public async deleteBlob(
context: Context,
account: string,
container: string,
blob: string,
options: Models.BlobDeleteMethodOptionalParams
): Promise<void> {
const coll = this.db.getCollection(this.BLOBS_COLLECTION);
await this.checkContainerExist(context, account, container);
const doc = await this.getBlobWithLeaseUpdated(
account,
container,
blob,
options.snapshot,
context,
false
);
validateWriteConditions(context, options.modifiedAccessConditions, doc);
if (!doc) {
throw StorageErrorFactory.getBlobNotFound(context.contextId);
}
const againstBaseBlob = doc.snapshot === "";
// Check bad requests
if (!againstBaseBlob && options.deleteSnapshots !== undefined) {
throw StorageErrorFactory.getInvalidOperation(
context.contextId!,
"Invalid operation against a blob snapshot."
);
}
new BlobWriteLeaseValidator(options.leaseAccessConditions).validate(
new BlobLeaseAdapter(doc),
context
);
// Scenario: Delete base blob only
if (againstBaseBlob && options.deleteSnapshots === undefined) {
const count = coll.count({
accountName: account,
containerName: container,
name: blob
});
if (count > 1) {
throw StorageErrorFactory.getSnapshotsPresent(context.contextId!);
} else {
coll.findAndRemove({
accountName: account,
containerName: container,
name: blob
});
}
}
// Scenario: Delete one snapshot only
if (!againstBaseBlob) {
coll.findAndRemove({
accountName: account,
containerName: container,
name: blob,
snapshot: doc.snapshot
});
}
// Scenario: Delete base blob and snapshots
if (
againstBaseBlob &&
options.deleteSnapshots === Models.DeleteSnapshotsOptionType.Include
) {
coll.findAndRemove({
accountName: account,
containerName: container,
name: blob
});
}
// Scenario: Delete all snapshots only
if (
againstBaseBlob &&
options.deleteSnapshots === Models.DeleteSnapshotsOptionType.Only
) {
const query = {
accountName: account,
containerName: container,
name: blob,
snapshot: { $gt: "" }
};
coll.findAndRemove(query);
}
}