воскресенье, 21 августа 2011 г.

Razor Extensions

Пример дополнения движка Razor собственными функциями.
Сначала, как для любого метода расширения, надо заиметь свой публичный статический класс и в нём определить публичные статические методы расширения того, что вы хотите, собственно, расширить.

В данном примере я расширил строковые и булевские переменные весьма простыми, но чрезвычайно полезными и короткими в употреблении, условиями:

public static class RazorExtensions
{   
       public static HelperResult IfHasValue(this string str
                                             Func<object, HelperResult> template)
       {
             return new HelperResult(writer =>
                                     {
                                        if (!string.IsNullOrWhiteSpace(str))
                                                template(str).WriteTo(writer);
                                     });
       }

       public static HelperResult IfTrue(this bool @bool
                                         Func<object, HelperResult> template)
       {
              return new HelperResult(writer =>
                                      {
                                         if (@bool)
                                                template(true).WriteTo(writer);
                                      });
       }
}

Примеры использования:

<a @Model.Boolean.IfTrue(@class="cur"href="@Url.Url()">Сслыка</a>

@Model.String.IfHasValue(@<p><big>@itembig>p>)

Стало ли лучше? )
Источники (раз, два)

SQL задачки

Решение пары бытовых задачек в sql server.
1. Надо было узнать, к каким колонкам и каким таблицам в базе привязан FILESTREAM:
select 
st.name as 'Table', 
sc.name as 'Column' 
from 
sys.columns sc
join 
sys.tables st on st.object_id = sc.object_id
where 
is_filestream = 1

2. Отследить прогресс бекапирования, целых два скрипта:
SELECT r.session_id,r.command,CONVERT(NUMERIC(6,2),r.percent_complete)
AS [Percent Complete],CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time],
CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min],
CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours],
CONVERT(VARCHAR(1000),(SELECT SUBSTRING(text,r.statement_start_offset/2,
CASE WHEN r.statement_end_offset = -1 THEN 1000 ELSE (r.statement_end_offset-r.statement_start_offset)/2 END)
FROM sys.dm_exec_sql_text(sql_handle)))
FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')


SELECT command,
            s.text,
            start_time,
            percent_complete,
            CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), '
                  + CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, '
                  + CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time,
            CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), '
                  + CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, '
                  + CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go,
            dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.command in ('RESTORE DATABASE', 'BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')


Может пригодится кому-нибудь, может быть даже снова мне )

суббота, 6 августа 2011 г.

BB-коды в qip

Думаю, многие, кто хотя бы иногда  обновляет qip, с некоторых пор стали замечать что картинки и видео можно просматривать прямо в окне сообщений, что есть достаточно приятное нововведение.
Недавно обнаружил также, что в чате можно применять BB-коды и украшать (или портить) текст: увеличивать размер, изменять цвет, вставлять код (!) с кривой подсветочкой и прочие радости жизни.
Полный список кодов с примерами тут.