private void AddLink(SqlBatchOperation batch, Item item, ItemLink link)
        {
            var insertCommand = LinkDatabaseCommand.CreateInsertCommand(item.Database.Name, item.ID, link.SourceItemLanguage,
                                                                        link.SourceItemVersion, link.SourceFieldID, link.TargetDatabaseName, link.TargetItemID,
                                                                        link.TargetItemLanguage, link.TargetItemVersion, link.TargetPath, batch);

            batch.AddSqlBatchCommand(insertCommand);
        }
        private ID BatchCompact(Database database, int batchSize, ID lastProcessed)
        {
            Assert.ArgumentNotNull(database, nameof(database));

            var selectSql = $@"
SELECT TOP {batchSize} [ID], [SourceItemID], [SourceLanguage], [SourceVersion] 
FROM [Links] WITH (NOLOCK) 
WHERE [SourceDatabase]=@{LinksTableColumns.Database}";

            if (lastProcessed != ID.Null)
            {
                selectSql += $" AND [ID] > @{nameof(lastProcessed)}";
            }
            selectSql += " ORDER BY [ID]";

            var linkList = new List <Tuple <Guid, ID, Language, Sitecore.Data.Version> >();

            using (var reader = DataApi.CreateReader(selectSql,
                                                     LinksTableColumns.Database, GetString(database.Name, DatabaseNameLength),
                                                     nameof(lastProcessed), lastProcessed))
            {
                DataCount.LinksDataRead.Increment();
                while (reader.Read())
                {
                    var id       = DataApi.GetGuid(0, reader);
                    var itemId   = DataApi.GetId(1, reader);
                    var language = DataApi.GetLanguage(2, reader);
                    var version  = DataApi.GetVersion(3, reader);
                    linkList.Add(new Tuple <Guid, ID, Language, Sitecore.Data.Version>(id, itemId, language, version));
                }
            }

            var  batchOperation = new SqlBatchOperation(DataApi);
            Guid lastId         = Guid.Empty;

            foreach (var row in linkList)
            {
                lastId = row.Item1;
                if (ItemExists(row.Item2, null, row.Item3, row.Item4, database))
                {
                    continue;
                }

                var command = LinkDatabaseCommand.CreateDeleteCommand(row.Item1, batchOperation);
                batchOperation.AddSqlBatchCommand(command);
            }

            batchOperation.FlushBatches();
            return(new ID(lastId));
        }
        private void RemoveLink(SqlBatchOperation batch, Guid itemLinkId)
        {
            var removeCommand = LinkDatabaseCommand.CreateDeleteCommand(itemLinkId, batch);

            batch.AddSqlBatchCommand(removeCommand);
        }