diff --git a/Blog/blog.conf b/Blog/blog.conf
index 365921c..860be9d 100644
--- a/Blog/blog.conf
+++ b/Blog/blog.conf
@@ -5,7 +5,7 @@ port = 8080
staticdir = static/
[database]
-path = host=localhost password=31415
+path = host=rtfm-server password=31415
[cache]
backend = filesystem
diff --git a/Framework/Storage.hs b/Framework/Storage.hs
index 234f61a..56981ec 100644
--- a/Framework/Storage.hs
+++ b/Framework/Storage.hs
@@ -12,7 +12,7 @@ module Framework.Storage
import Data.String.Utils
import qualified Database.HDBC.Sqlite3 as Sqlite3
-import qualified Database.HDBC.MySQL as MySQL
+-- import qualified Database.HDBC.MySQL as MySQL
import qualified Database.HDBC.PostgreSQL as PostgreSQL
import qualified Database.HDBC as D
@@ -26,16 +26,16 @@ connect' :: String -- ^ DB backend
-> IO DBConnection
connect' "sqlite3" file = DBC `fmap` (Sqlite3.connectSqlite3 file)
connect' "psql" str = DBC `fmap` (PostgreSQL.connectPostgreSQL str)
-connect' "mysql" str = DBC `fmap` (MySQL.connectMySQL $ parsedMySQL)
- where
- parsedMySQL = MySQL.defaultMySQLConnectInfo {
- MySQL.mysqlUser = user,
- MySQL.mysqlPassword = pass,
- MySQL.mysqlHost = server,
- MySQL.mysqlDatabase = db}
- [user,x] = split ":" str
- [pass,x'] = split "@" x
- [server,db] = split "/" x'
+-- connect' "mysql" str = DBC `fmap` (MySQL.connectMySQL $ parsedMySQL)
+-- where
+-- parsedMySQL = MySQL.defaultMySQLConnectInfo {
+-- MySQL.mysqlUser = user,
+-- MySQL.mysqlPassword = pass,
+-- MySQL.mysqlHost = server,
+-- MySQL.mysqlDatabase = db}
+-- [user,x] = split ":" str
+-- [pass,x'] = split "@" x
+-- [server,db] = split "/" x'
connect' _ _ = error "Unknown DB driver!"
-- | Connect to DB, get parameters from "StaticConfig"
diff --git a/TODO b/TODO
index e665bf7..9da3b80 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,4 @@
-INPROGRESS [forms] Удобные средства расширения форм (в т.ч. и для использования в Form processors);
+INPROGRESS [forms] Удобные средства расширения форм в т.ч. и для использования в Form processors;
* [forms] Больше виджетов для форм;
* [forms] Средства создания "мастеров";
? Более удобный paginator;
@@ -6,7 +6,7 @@ INPROGRESS [CRUD] Автоматические CRUD-контроллеры;
* Человеческая обработка завершения программы;
* [config] Все параметры, которые сейчас hard-coded, брать из конфига;
INPROGRESS [i18n] Полу-автоматическая интернационализация с помощью какого-л. Middleware;
-INPROGRESS [cache] Более высокоуровневый интерфейс для кэша - чтоб было легко закэшировать результат всей функции;
+INPROGRESS [cache] Более высокоуровневый интерфейс для кэша чтобы было легко закэшировать результат всей функции;
INPROGRESS [cache] Соответственно, простые средства для инвалидации кэша;
INPROGRESS [SQL ORM] Более продвинутые и высокоуровневые функции генерации SQL;
? [SQL] Слой абстракции от диалекта SQL;
@@ -14,11 +14,11 @@ INPROGRESS [SQL ORM] Более продвинутые и высокоуровн
! [DOC] Документация ко всей этой красоте.
* [TEST PUT] Протестировать поддержку PUT web-сервером;
-DONE Генерация структуры Form по Model (с возможностью переопределить, или просто не использовать);
+DONE Генерация структуры Form по Model с возможностью переопределить, или просто не использовать;
DONE Бэкенд для MySQL;
DONE Чтение конфига из файла либо удобный EDSL для конфига;
DONE Перенести текущий правленный Network.Shed.Httpd в дерево проекта (написать свой?);
DONE Лучше интегрировать Httpd в движок, в частности - чтоб средствами движка писал логи итп;
-DONE Лучше формализовать формат запроса (reqMethod=="GET" -> reqMethod==GET итп), вероятно, следует привести в соответствие с Network.HTTP;
+DONE Лучше формализовать формат запроса reqMethod=="GET" -> reqMethod==GET итп, вероятно, следует привести в соответствие с Network.HTTP;
DONE При отдаче статики не коннектиться к БД и прочему;
-DONE Отдельная структура (и модуль?) для конфига (StaticConfig в нынешнем виде должна стать промежуточной структурой, заполняемой из конфига);
+DONE Отдельная структура (и модуль?) для конфига StaticConfig в нынешнем виде должна стать промежуточной структурой, заполняемой из конфига;
diff --git a/graph.dot b/graph.dot
index 1576083..15e88b1 100644
--- a/graph.dot
+++ b/graph.dot
@@ -1,81 +1,471 @@
digraph G {
-u49[label="TemplateParser"];
-u48[label="Settings"];
-u45[label="Models"];
-u0[label="Main",color=green];
-
+u76[label="TemplateParser"];
+u75[label="TemplateGen"];
+u73[label="Templates"];
+u71[label="Models"];
+u70[label="Invalidation"];
+u0[label="Main"];
subgraph cluster_0 {
+label="Extensions";
+color="#ccffcc";
+style="filled";
+u69[label="Signals"];
+u68[label="Middlewares"];
+u66[label="Handlers"];
+u63[label="FormProcessors"];
+u59[label="Context"];
+
+}
+subgraph cluster_1 {
label="Framework";
+color="#ccffcc";
+style="filled";
+u53[label="Pager"];
+u52[label="ContextProcessors"];
+u30[label="Wrapper"];
+u29[label="Urls"];
+u26[label="ORM"];
+u25[label="Storage"];
+u22[label="Cache"];
+u21[label="Config"];
+u18[label="SignalTypes"];
+u15[label="Signals"];
+u11[label="Utils"];
+u9[label="Logger"];
+u8[label="Exceptions"];
+u6[label="Controller"];
+u5[label="Pool"];
+u2[label="Types"];
+u1[label="API"];
+subgraph cluster_2 {
+label="API";
+color="#99ff99";
+style="filled";
+u50[label="Logger"];
+u47[label="UserMessage"];
+u46[label="CRUD"];
+u39[label="SQLUtils"];
+u38[label="SQL"];
+u37[label="Storage"];
+u36[label="Sessions"];
+u35[label="Cache"];
-api[label="API",shape=box];
-forms[label=Forms,shape=box];
-tengine[label=TEngine,shape=box];
-u47[label="Markdown"];
-u44[label="Pager"];
-u43[label="ContextProcessors"];
+}
+subgraph cluster_3 {
+label="Cache";
+color="#99ff99";
+style="filled";
+u24[label="Instances"];
+u23[label="Cache"];
+u4[label="Types"];
-subgraph cluster_1 {
-color=gray;
-label=DB;
-orm[label="ORM",shape=box];
-u19[label="Storage"];
}
+subgraph cluster_4 {
+label="Forms";
+color="#99ff99";
+style="filled";
+u49[label="Validators"];
+u48[label="ModelForm"];
+u43[label="Validation"];
+u42[label="HTML"];
+u41[label="Rendering"];
+u40[label="Types"];
+u17[label="HTMLTypes"];
-cache[label="Cache",shape=box];
-u15[label="Config"];
-u12[label="GetText"];
+}
+subgraph cluster_5 {
+label="GetText";
+color="#99ff99";
+style="filled";
+u64[label="HTML"];
+u33[label="Init"];
+u14[label="IO"];
+u13[label="Controller"];
+
+}
+subgraph cluster_6 {
+label="Http";
+color="#99ff99";
+style="filled";
+u45[label="PostParser"];
+u44[label="Vars"];
+u34[label="Static"];
+u32[label="Middlewares"];
+u31[label="Sessions"];
+u20[label="HTTPServer"];
+u19[label="Cookies"];
+u12[label="Httpd"];
+u10[label="Response"];
+u3[label="SessionTypes"];
+
+}
+subgraph cluster_7 {
+label="Modules";
+color="#99ff99";
+style="filled";
+u55[label="SHA1"];
+subgraph cluster_8 {
+label="Auth";
+color="#66ff66";
+style="filled";
+u67[label="Handlers"];
+u61[label="ShowForm"];
+u60[label="Context"];
+u57[label="Utils"];
+u56[label="Models"];
+u54[label="Controllers"];
+
+}
+subgraph cluster_9 {
+label="Formatters";
+color="#66ff66";
+style="filled";
+u72[label="Markdown"];
+
+}
+subgraph cluster_10 {
+label="Registration";
+color="#66ff66";
+style="filled";
+u62[label="Context"];
+u58[label="Forms"];
+
+}
+subgraph cluster_11 {
+label="TextCaptcha";
+color="#66ff66";
+style="filled";
+u65[label="FormProcessors"];
+
+}
+
+}
+subgraph cluster_12 {
+label="ORM";
+color="#99ff99";
+style="filled";
+u28[label="SQL"];
+u27[label="Models"];
+u16[label="Types"];
+
+}
+subgraph cluster_13 {
+label="TEngine";
+color="#99ff99";
+style="filled";
+u74[label="TemplateFuncs"];
+u51[label="TemplateUtil"];
+u7[label="Types"];
-subgraph cluster_3 {
-color=gray;
-label=Network;
-http[label=HTTP,shape=box,color=red];
-u25[label="Wrapper"];
-u24[label="Urls"];
}
}
-api -> cache;
-api -> forms;
-api -> http;
-api -> orm;
-api -> tengine;
-api -> u12;
-api -> u19;
-api -> u24;
-api -> u44;
-forms -> api;
-forms -> http;
-forms -> orm;
-forms -> u48;
-http -> cache;
-http -> u12;
-http -> u15;
-http -> u19;
-http -> u24;
-http -> u48;
-tengine -> api;
-tengine -> cache;
-tengine -> http;
-tengine -> u43;
-tengine -> u45;
-u0 -> api;
-u0 -> u45;
-u19 -> orm;
-u24 -> http;
-u24 -> u25;
-u25 -> cache;
-u25 -> http;
-u25 -> u19;
-u43 -> api;
-u44 -> api;
-u44 -> forms;
-u44 -> http;
-u44 -> orm;
-u45 -> forms;
-u45 -> orm;
-u45 -> u47;
-u48 -> forms;
-u48 -> tengine;
+u75 -> u11;
+u75 -> u76;
+u74 -> u7;
+u73 -> u11;
+u73 -> u7;
+u73 -> u74;
+u73 -> u71;
+u71 -> u7;
+u71 -> u40;
+u71 -> u42;
+u71 -> u49;
+u71 -> u48;
+u71 -> u26;
+u71 -> u72;
+u70 -> u18;
+u70 -> u26;
+u70 -> u35;
+u70 -> u38;
+u70 -> u71;
+u69 -> u18;
+u69 -> u70;
+u67 -> u6;
+u67 -> u11;
+u67 -> u47;
+u67 -> u36;
+u67 -> u10;
+u66 -> u2;
+u66 -> u6;
+u66 -> u7;
+u66 -> u51;
+u66 -> u67;
+u65 -> u6;
+u65 -> u44;
+u65 -> u40;
+u65 -> u42;
+u65 -> u48;
+u64 -> u6;
+u64 -> u40;
+u64 -> u13;
+u63 -> u40;
+u63 -> u64;
+u63 -> u65;
+u62 -> u2;
+u62 -> u7;
+u62 -> u6;
+u62 -> u11;
+u62 -> u58;
+u61 -> u6;
+u61 -> u40;
+u61 -> u41;
+u61 -> u56;
+u60 -> u2;
+u60 -> u7;
+u60 -> u6;
+u60 -> u11;
+u60 -> u61;
+u59 -> u6;
+u59 -> u60;
+u59 -> u62;
+u58 -> u2;
+u58 -> u6;
+u58 -> u26;
+u58 -> u15;
+u58 -> u40;
+u58 -> u49;
+u58 -> u43;
+u58 -> u41;
+u58 -> u42;
+u58 -> u44;
+u58 -> u10;
+u58 -> u38;
+u58 -> u37;
+u58 -> u36;
+u58 -> u56;
+u58 -> u55;
+u57 -> u1;
+u56 -> u7;
+u56 -> u40;
+u56 -> u42;
+u56 -> u49;
+u56 -> u26;
+u54 -> u40;
+u54 -> u43;
+u54 -> u1;
+u54 -> u11;
+u54 -> u55;
+u54 -> u56;
+u53 -> u40;
+u53 -> u42;
+u53 -> u16;
+u53 -> u28;
+u53 -> u38;
+u53 -> u2;
+u53 -> u11;
+u53 -> u6;
+u53 -> u44;
+u52 -> u2;
+u52 -> u7;
+u52 -> u11;
+u52 -> u6;
+u52 -> u36;
+u52 -> u44;
+u52 -> u59;
+u51 -> u10;
+u51 -> u2;
+u51 -> u7;
+u51 -> u6;
+u51 -> u36;
+u51 -> u35;
+u51 -> u22;
+u51 -> u52;
+u51 -> u73;
+u50 -> u2;
+u50 -> u6;
+u50 -> u9;
+u49 -> u40;
+u48 -> u40;
+u48 -> u49;
+u48 -> u42;
+u48 -> u26;
+u47 -> u6;
+u47 -> u36;
+u46 -> u2;
+u46 -> u11;
+u46 -> u6;
+u46 -> u44;
+u46 -> u10;
+u46 -> u16;
+u46 -> u39;
+u46 -> u47;
+u46 -> u40;
+u46 -> u41;
+u46 -> u48;
+u46 -> u13;
+u45 -> u2;
+u45 -> u11;
+u44 -> u2;
+u44 -> u11;
+u44 -> u12;
+u44 -> u45;
+u43 -> u2;
+u43 -> u26;
+u43 -> u44;
+u43 -> u40;
+u43 -> u42;
+u42 -> u40;
+u42 -> u11;
+u42 -> u2;
+u41 -> u2;
+u41 -> u11;
+u41 -> u6;
+u41 -> u40;
+u41 -> u42;
+u41 -> u43;
+u41 -> u26;
+u41 -> u36;
+u41 -> u10;
+u41 -> u63;
+u40 -> u2;
+u40 -> u16;
+u40 -> u6;
+u40 -> u17;
+u39 -> u2;
+u39 -> u6;
+u39 -> u8;
+u39 -> u15;
+u39 -> u40;
+u39 -> u41;
+u39 -> u43;
+u39 -> u26;
+u39 -> u38;
+u39 -> u37;
+u38 -> u2;
+u38 -> u6;
+u38 -> u25;
+u38 -> u16;
+u38 -> u28;
+u38 -> u27;
+u37 -> u2;
+u37 -> u6;
+u37 -> u16;
+u37 -> u25;
+u36 -> u2;
+u36 -> u6;
+u36 -> u31;
+u35 -> u2;
+u35 -> u6;
+u35 -> u22;
+u35 -> u10;
+u34 -> u2;
+u34 -> u11;
+u34 -> u10;
+u32 -> u2;
+u32 -> u11;
+u32 -> u33;
+u32 -> u21;
+u32 -> u68;
+u31 -> u2;
+u31 -> u11;
+u31 -> u19;
+u31 -> u3;
+u30 -> u31;
+u30 -> u25;
+u30 -> u10;
+u30 -> u22;
+u30 -> u2;
+u30 -> u11;
+u29 -> u11;
+u29 -> u2;
+u29 -> u30;
+u29 -> u6;
+u29 -> u8;
+u29 -> u31;
+u29 -> u10;
+u28 -> u16;
+u28 -> u27;
+u27 -> u7;
+u27 -> u16;
+u26 -> u16;
+u26 -> u27;
+u26 -> u28;
+u25 -> u2;
+u25 -> u26;
+u25 -> u5;
+u24 -> u11;
+u24 -> u4;
+u23 -> u5;
+u23 -> u4;
+u23 -> u24;
+u22 -> u4;
+u22 -> u23;
+u21 -> u2;
+u20 -> u21;
+u20 -> u4;
+u20 -> u22;
+u20 -> u25;
+u20 -> u5;
+u20 -> u9;
+u20 -> u2;
+u20 -> u8;
+u20 -> u29;
+u20 -> u11;
+u20 -> u10;
+u20 -> u32;
+u20 -> u12;
+u20 -> u34;
+u19 -> u2;
+u19 -> u11;
+u18 -> u6;
+u18 -> u16;
+u17 -> u2;
+u16 -> u2;
+u16 -> u17;
+u15 -> u6;
+u15 -> u16;
+u15 -> u18;
+u15 -> u69;
+u13 -> u6;
+u13 -> u14;
+u12 -> u2;
+u12 -> u9;
+u11 -> u12;
+u11 -> u2;
+u10 -> u2;
+u10 -> u11;
+u10 -> u12;
+u9 -> u2;
+u8 -> u2;
+u8 -> u6;
+u8 -> u9;
+u8 -> u10;
+u8 -> u66;
+u6 -> u2;
+u6 -> u7;
+u2 -> u3;
+u2 -> u4;
+u2 -> u5;
+u1 -> u2;
+u1 -> u6;
+u1 -> u8;
+u1 -> u13;
+u1 -> u15;
+u1 -> u19;
+u1 -> u20;
+u1 -> u35;
+u1 -> u36;
+u1 -> u37;
+u1 -> u38;
+u1 -> u39;
+u1 -> u46;
+u1 -> u50;
+u1 -> u47;
+u1 -> u7;
+u1 -> u51;
+u1 -> u41;
+u1 -> u53;
+u1 -> u44;
+u1 -> u29;
+u1 -> u26;
+u1 -> u10;
+u0 -> u1;
+u0 -> u11;
+u0 -> u54;
+u0 -> u57;
+u0 -> u58;
+u0 -> u71;
}