пятница, июля 28, 2006

Ghost from SharePoint

Потребовалось сделать обход всех существующих структур Шарепойнта и достать все библиотеки документов и рисунков. Выяснилось, что в базе существует много объектов, которых как бы и нет (на страницах не отображаются), но в объектную модель попадают. На них вылетают всякие исключения, которых вовсе не ожидаешь, но которые в итоге следует учитывать. После всех этих «учётов» ожидаемый метод из 10 строк вылился вот во что (здесь log – мой собственный логгер, к делу не относится):
 
/// <summary>
///
Выдаёт все библиотеки документов

/// </summary>

/// <returns>очередную библиотеку </returns>

/// <remarks>вызывать в цикле вида

/// foreach (SPDocumentLibrary lib in DocLibs()){ ... }

/// </remarks>

IEnumerable< SPDocumentLibrary>DocLibs() {

    SPGlobalAdmin ga = new SPGlobalAdmin();

    string[] vsNames = ga.VirtualServerNames;

    for(int vs=0;vs<vsNames.Length;vs++){

        SPVirtualServer srv = null;

        try {

            srv = ga.VirtualServers[vs];

        } catch (Exception err) {

            log.WriteException(err, false, vsNames[vs], 68);

            continue;//next VirtualServer

        }

        int nSites = -1;

        try {

            nSites = srv.Sites.Count;

        } catch { }

        if (nSites > 0) {

            string[] siteNames = new string[srv.Sites.Count];

            for (int s = 0; s < siteNames.Length; s++)//fill names

                try {

                    siteNames[s] = srv.Sites[s].Url;

                } catch {

                    siteNames[s] = null;

                }

            foreach (string siteName in siteNames) {

                if (string.IsNullOrEmpty(siteName)) continue; //next Site

                SPSite site = null;

                try {

                    site = new SPSite(siteName);

                } catch (Exception err) {

                    log.WriteException(err, false, siteName, 69);

                    continue; //next Site

                }

                site.CatchAccessDeniedException = false;

                string[] webNames;

                try {

                    webNames = site.AllWebs.Names;

                } catch (Exception err) {

                    log.WriteException(err, false, siteName, 691);

                    continue; //next Site

                }

                foreach (string webUrl in webNames) {

                    SPWeb web = null;

                    try {

                        web = site.AllWebs[webUrl];

                    } catch (Exception err) {

                        log.WriteException(err, false, webUrl, 70);

                        continue;//next web

                    }

                    int listsCount=-1;

                    try {

                        listsCount=web.Lists.Count;

                    } catch { }

                    if (listsCount > 0) {

                        string[] listNames = new string[listsCount];

                        for (int l = 0; l < listsCount; l++) {

                            try {

                                listNames[l] = web.Lists[l].Title;

                            } catch (Exception err) {

                                log.WriteException(err, false,

                                         string .Format("List number {0}", l + 1), 71);

                                 listNames[l] = string.Empty;

                             }

                         }

                         foreach (string listName in listNames) {

                             if (!string.IsNullOrEmpty(listName)) {

                                 SPList list = null;

                                 try {

                                     list = web.Lists[listName];

                                 } catch (Exception err) {

                                     log.WriteException(err, false, listName, 72);

                                     continue; //next List

                                 }

                                 if (list != null && list is SPDocumentLibrary)

                                     yield return list as SPDocumentLibrary;

                             }

                         }

                     }

                     web.Dispose();                }

                site.Dispose();            }

        }

    }

    ga.Dispose();

}

понедельник, июля 24, 2006

Опять прикол от SharePoint

Нужно было воспользоваться свойством списка list.LastItemModifiedDate - gets the date and time that an item, field, or property of the list was last modified.

При этом время выдаётся по Гринвичу независимо от региональных установок на объектах SPWeb и SPSite. Выкрутился использованием конструкции
  list.ParentWeb.RegionalSettings. TimeZone.UTCToLocalTime(list.LastItemModifiedDate )

В это же самое время для отдельных items списка данные, например, list.Items [0]["Modified"], выдаются в соответствии с региональными установками.

Вот же, блин. Горелый.

четверг, июля 13, 2006

Встраиваемые СУБД

В проекте потребовалось сохранять промежуточные данные, чтоб потом их считывать. Можно, конечно, сериализовать и сохранять в файл (двоичный или xml), но подумалось, что попользоваться базой данных проще и привычней. База там, естественно, есть, однако это MS SQL Server, занятый своей собственной неслабой работой, поэтому сразу решил поискать чего-то встраиваемого в саму программу, небольшого размера и, желательно, бесплатного.

Вот результаты изысканий:

Vieka eSQL – бесплатная для любого применения, платить нужно только при использовании в продажных продуктах для мобильных девайсов. Для использования требуются библиотеки размером ок. 450 кб. Наследник SQLite, имеет минимальный набор типов, с небольшими базами работает быстро (при размерах в сотни мегабайт народ жалуется на тормоза). Имеет интерфейс с .NET, работает с SQL-92. База однофайловая. Требуются операции сжатия базы. Имеется пример, который получается изменять – бум смотреть в качестве кандидата.

db4o
– распространяется по GPL. Для использования требуются библиотеки размером ок. 860 кб. Имеется интерфейс с .NET 2.0 и .NETCF 2.0. Объектная база. Народ жалуется на задержки при открытии файла базы. База однофайловая. Мало какой-либо хорошей информации, хотя имеющиеся примеры работают.

SQL Server Everywhere Edition – пока что существует в виде CTP, но к концу года обещают выпустить релиз, да ещё и бесплатный. Для использования требуются библиотеки размером ок. 1.5 Мб. Имеется интерфейс с .NET 2.0 и .NETCF 2.0. Программная модель – как у SQL Server 2005. База однофайловая. Штука привлекательная, надо её поизучать на будущее.

VistaDB – продаётся за деньги, но лицензия позволяет распространять использующий базу продукт бесплатно. Для использования требуются библиотеки размером ок. 650 кб. Имеется интерфейс с .NET 2.0, работает с SQL-92. Также имеется интерфейс DDA – прямой доступ к данным, быстрая работа на низком уровне с таблицами, записями и т.д. Набор типов почти как у SQL Server. База однофайловая. Примеры работают, поддаются изменению.

Пост из Word 2007

Обнаружилась встроенная фича – постить в блоги.

Щас и проверим.


Это наляпано в Word’е 2007 beta2

Всё, вроде, ничего, даже постит в блоги на Sharepoint 2007. Повторный пост воспринимается как новый, в Шарепойнте заменяет старый.

среда, июля 05, 2006

Sharepoint 2007

После установки Office Sharepoint Server:
 
в Рефлекторе вот такое -
[Obsolete( "This class is obsolete.")]
public class Area{ ... }
И все портальные структуры тоже. Слава богу, что от чепухи отказались.

Добавились разные хитрые шаблоны узлов и сервисы, но на моём тестовом "сервере" они не фурычат (жидковата машинка, конечно).
 

вторник, июля 04, 2006

Sharepoint 2007 (WSS v.3)

Из того, что пока увиделось (повозился с WSS 3):
  • блог и WiKi - вполне рабочие сайты.
  • Discussion - уже совсем на форум похожа, хоть с мелкими глюками.
  • Списки - в ссылочных полях можно делать множественный выбор, список с другого сайта подключить не получилось (хотя и были разговоры о подобных пряниках).