Blog » Wersjonowanie w SharePoint 3.0, 2007

Wersjonowanie w SharePoint 3.0, 2007

 
Wersjonowanie w SharePoint 3.0, 2007
Wersjonowanie elementów (dokumentów) w SharePoint jest jednym z głównych opcji tej platformy nawet w bezpłatnej wersji - SharePoint Services 3.0. Prosta w obsłudze funkcja z poziomu UI może jednak dostarczyć paru problemów jeśli chcemy dostać się do niej z poziomu API. Po drugie warto mieć świadomość w jaki sposób przyrasta baza zawartości SharePoint przy włączonym wersjonowaniu. Poniższy post zawiera moje doświadczenia i metody radzenia sobie z tymi problemami.
Na początek trochę teorii jak włączyć wersjonowanie w SharePoint. Domyślnie przy tworzeniu bibliotek dokumentów lub list ta funkcja jest wyłączona. Aby ją włączyć należy wybrać Ustawienia listy lub biblioteki dokumentów, następnie kliknąć link Ustawienia przechowywania wersji i wybrać np.: Utwórz wersje główne.



Gdy wersjonowanie zostanie włączone przy każdym elemencie/dokumencie będzie dostępna opcja prezentowana poniżej.
 
Tyle tytułem wstępu. Teraz przystępujemy do sedna problemu. Proszę zrobić sobie nową bibliotekę dokumentów i włączyć w niej wersjonowanie. Następnie proszę zobaczyć ile miejsca w bazie zajmuje witryna - należy to zrobić za pomocą polecenia stsadm:

STSADM.EXE -o enumsites -url http://omega
 
Jak widać mam założone kolekcje witryn. W tej drugiej http://omega/sites/Dev jest biblioteka, na której będę testował wersjonowanie. Obecnie cała kolekcja witryn zajmuje 0,5 MB.
W kolejnym kroku umieszczę w bibliotece dokumentów plik o wielkości 2,3 MB. Wrzucam specjalnie większy plik aby było widać jak rośnie baza. Teoretycznie baza danych ma wielkość: 0,5 + 2,4 = 2,9.




W tym miejscu teoria sprawdziła się z praktyką. Następnie zmienię tytuł elementu. Powstanie przez to kolejna wersja. Gdy przejdzie się do Historii wersji wyglądać to będzie następująco:

Oczywiście w baza danych również przyrośnie:



UWAGA !!!
SharePoint za każda zmianą - nawet jedynie metainformacji tworzy kopię całego elementu (przez element rozumiem plik + metainformacje). Niestety to jest duży minus i należy na niego uważać.

Dla testu proszę przejść do Historii wersji tego dokumentu i skopiować cały URL do tej strony.  Następnie wyłączyć wersjonowanie i spróbować wejść na stronę, której URL został wcześniej skopiowany. Warto też sprawdzić czy po wyłączeniu wersjonowania zmniejszy się baza danych:


 
UWAGA !!!
Niestety wyłączenie wersjonowanie spowoduje jedynie ukrycie opcji przejścia do historii wersji w UI. Jeśli zna się URL'a nadal będzie można obserwować utworzone wcześniej wersje, z tym że teraz nie będą tworzone nowe. Jak można się spodziewać baza oczywiście się nie zmniejszyła.

Aby sprawdzić dalszą logikę historii wersji należy ją ponownie włączyć. W celu trwałego usunięcia wersji należy przejść do strony z Historią wersji i kliknąć link:
    - Usuń wszystkie wersje - w celu usunięcia wszystkich wersji (pozostanie tylko wersja ostatnia).
    - Usuń - wybrane z menu przy konkretnej wersji (usuwa tylko jedną wybraną wersję).
Niestety jeśli już teraz sprawdzi się wielkość bazy danych to okaże się, że nadal się nie zmniejszyła. Po głębszym zastanowieniu można dojść do wniosku, że jest to oczywiste bo każdy usuwany element w SharePoint po usunięciu trafia do kosza. Proszę też nie zapominać, że kosz w SharePoint jest dwu poziomowy. Dokument trafił do kosza danej witryny: (link: /_layouts/RecycleBin.aspx)
 

I jeśli się go stamtąd usunie, to należy go następnie usunąć z Kosza zbioru witryn (link: /_layouts/AdminRecycleBin.aspx?View=2):




W tym momencie jedna z wersji dokumentu została kompletnie usunięta co można również zauważyć po rozmiarze bazy danych:




2,9 MB czyli dosłownie tyle samo co na początku po umieszczeniu dokumentu w bibliotece dokumentów.

Tak jak to ma miejsce w SharePoint w większości przypadków, to co da się zrobić z poziomu UI to można również wykonać z poziomu API.  Tak też jest w tym przypadku. Każdy obiekt klasy SPListItem ma właściwość Versions. Jest to kolekcja obiektów typu SPListItem odpowiadających kolejnym wersjom elementu. Usuwanie wersji odbywa się w następujący sposób:

    - Lista
	SPListItem item = SPContext.Current.ListItem;  
	SPListItemVersionCollection versionCol = item.Versions;                  
	item.Versions.DeleteAll() lub file.Version.RecycleAll();
	item.Update(); 


    - Biblioteka dokumentów
	SPListItem item = SPContext.Current.ListItem;  
	SPFile file = item.File;  
	file .Versions.DeleteAll() lub file.Version.RecycleAll();


Jest jedna ciekawa kwestia przy korzystaniu z metody DeleteAll(). Niestety ona nie usuwa pliku z bazy danych. Wpis o wersji zostaje usunięty jedynie ze strony Historia wersji. Odwołanie się do tej konkretnej wersji nie będzie też możliwe z poziomu API. Tak naprawdę nie ma żadnej metody odwołania się do wersji w ten sposób usuniętej, a miejsce w bazie nadal jest zajmowane. Po takim usunięciu oczyścić bazę można jedynie usuwając całkowicie dokument (wersję główną) na podstawie którego tworzone były kolejne wersje. Aby tych problemów uniknąć należy zastosować metodę RecycleAll(). Oczywiście metoda ta tak jak ma to miejsce w przypadku UI nie usunie wersji tylko przeniesie ją do kosza. Następnie należy usunąć ją wersję z kosza. Aby usunąć element z kosza należy posłużyć się poniższym kodem:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(siteUrl))
    {
        SPRecycleBinQuery query = new SPRecycleBinQuery();
        query.ItemCollectionPosition = SPRecycleBinItemCollectionPosition.FirstPage;
        query.ItemState = SPRecycleBinItemState.FirstStageRecycleBin;
        query.RowLimit = 500;
        query.IsAscending = ascending;
        query.OrderBy = orderBy;
    SPRecycleBinItemCollection binItems = site.GetRecycleBinItems(query);
    var filteredItems = from i in binItems.OfType<SPRecycleBinItem>()
                            where i.ItemType == SPRecycleBinItemType.File && i.Title.Contains("YYY")
                && i.DeletedBy.LoginName == "basesmcdev2\\steve.curran"
                        select i;
    if (filteredItems != null & filteredItems.Count() > 0)
                        filteredItems.First().Delete();
    }
});



Przykład zamieszczony powyżej wykorzystuje SPRecycleBinQuery przez co jest dużo wydajniejszy od zwykłego usuwania poprzez iterację kolekcji SPWeb.RecycleBin.


Zobacz także:

Klasy do operowania na koszu

 

Dodany: 2010-07-12 23:58:02 przez Michał Nikołajuk | Wypowiedzi: 0
Dodaj do Yahoo Bookmarks Dodaj do Facebook Dodaj do Twitter Dodaj do Live Dodaj do Yahoo MyWeb Dodaj do MySpace Dodaj do Google Bookmarks
Komentarze
Wpis nie posiada komentarzy.
Zostaw komentarz Subskrybuj



 Security code