00001 #include <config.h>
00002 #include "midgard/midgard_legacy.h"
00003 #include "midgard/pageresolve.h"
00004 #include "midgard/midgard_datatypes.h"
00005 #include <string.h>
00006 #ifdef WIN32
00007 #include <windows.h>
00008 #endif
00009
00010 #include "midgard_mysql.h"
00011
00012 int mgd_find_host(midgard *mgd,
00013 const char *hostname, int port, const char *uri, int null_prefix,
00014 mgd_host_t *parsed)
00015 {
00016 midgard_res *res;
00017
00018 parsed->host = 0;
00019 parsed->style = 0;
00020 parsed->page = 0;
00021 parsed->lang = 0;
00022 parsed->sitegroup = 0;
00023 parsed->auth_required = 0;
00024 parsed->prefix_length = 0;
00025 parsed->found = 0;
00026
00027
00028 res = mgd_ungrouped_select(mgd,
00029 "id,style,root,lang,info&1,Length(prefix)"
00030 ",sitegroup",
00031 "host",
00032 "name=$q AND port in (0,$d) AND"
00033 " ( ($d <> 0 AND prefix = '')"
00034 " OR ($d = 0 AND prefix=Left($q,Length(prefix)) AND"
00035 " IF($d>=Length(prefix),MID($q,1+Length(prefix),1) IN ('','/'),0)=1"
00036 " )"
00037 " )"
00038 " AND online <> 0",
00039 "prefix DESC, port DESC",
00040 hostname, port, null_prefix, null_prefix, uri, strlen(uri), uri
00041 );
00042
00043 if (!res || mgd_rows(res) == 0 || !mgd_fetch(res)) {
00044 if (res) mgd_release(res);
00045 return 0;
00046 }
00047
00048 parsed->host = atoi(mgd_colvalue(res, 0));
00049 parsed->style = atoi(mgd_colvalue(res, 1));
00050 parsed->page = atoi(mgd_colvalue(res, 2));
00051 parsed->lang = atoi(mgd_colvalue(res, 3));
00052 parsed->auth_required = atoi(mgd_colvalue(res, 4));
00053 parsed->prefix_length = atoi(mgd_colvalue(res, 5));
00054 parsed->sitegroup = atoi(mgd_colvalue(res, 6));
00055
00056
00057 mgd_release(res);
00058 parsed->found = 1;
00059 return 1;
00060 }
00061
00062 void __collect_page_elements_from_res(midgard *mgd, long host, long page, midgard_res *res, GHashTable *element_cache, mgd_store_style_elt_cb callback, void *userdata, long caching_page) {
00063
00064 const char *name;
00065 const char *value;
00066 long id;
00067
00068 if (!res)
00069 return;
00070
00071 while (mgd_fetch(res)) {
00072 id = atol(mgd_colvalue(res, 0));
00073 name = mgd_colvalue(res, 1);
00074 value = mgd_colvalue(res, 2);
00075
00076
00077 if (g_hash_table_lookup(element_cache, name) != NULL) { continue; }
00078
00079 g_hash_table_insert(element_cache, g_strdup(name), g_strdup(""));
00080
00081
00082 mgd_cache_add(mgd, host, caching_page, 0, MGD_CACHE_ELT_PAGE, id);
00083
00084 callback(name, value, userdata);
00085 }
00086 mgd_release(res);
00087 }
00088
00089
00090 void _collect_page_elements(midgard *mgd, long host, long page, int inherited_only,
00091 GHashTable *element_cache,
00092 mgd_store_style_elt_cb callback, void *userdata,
00093 long caching_page)
00094 {
00095 midgard_res *res;
00096
00097 if (callback == NULL) return;
00098
00099 res = mgd_ungrouped_select(mgd,
00100 "pageelement.id AS id,name,value",
00101 "pageelement, pageelement_i",
00102 "page=$d AND pageelement.id=pageelement_i.sid AND pageelement_i.lang=$d $s"
00103 " AND pageelement.sitegroup IN (0, $d)",
00104 NULL,
00105 page, mgd->lang, inherited_only ? "AND info&1<>0" : "", mgd_sitegroup(mgd));
00106
00107 __collect_page_elements_from_res(mgd, host, page, res,
00108 element_cache, callback, userdata, caching_page);
00109
00110 if (mgd->lang > 0) {
00111 res = mgd_ungrouped_select(mgd,
00112 "pageelement.id AS id,name,value",
00113 "pageelement, pageelement_i",
00114 "page=$d AND pageelement.id=pageelement_i.sid AND pageelement_i.lang=$d $s"
00115 " AND pageelement.sitegroup IN (0, $d)",
00116 NULL,
00117 page, inherited_only ? "AND info&1<>0" : "",
00118 mgd_get_default_lang(mgd),
00119 mgd_sitegroup(mgd));
00120
00121 __collect_page_elements_from_res(mgd, host, page, res,
00122 element_cache, callback ,userdata, caching_page);
00123 }
00124 }
00125
00126 void __style_load_from_res(midgard *mgd, long host, long cache_for_page, long style, midgard_res *res, GHashTable *element_cache, mgd_store_style_elt_cb callback, void *userdata)
00127 {
00128
00129 const char *name;
00130 const char *value;
00131 long id;
00132
00133 if (!res)
00134 return;
00135
00136 while (mgd_fetch(res)) {
00137 id = atol(mgd_colvalue(res, 0));
00138 name = mgd_colvalue(res, 1);
00139 value = mgd_colvalue(res, 2);
00140
00141
00142 if (g_hash_table_lookup(element_cache, name) != NULL) { continue; }
00143
00144 g_hash_table_insert(element_cache, g_strdup(name), g_strdup(""));
00145
00146 mgd_cache_add(mgd, host, cache_for_page, style, MGD_CACHE_ELT_STYLE, id);
00147 callback(name, value, userdata);
00148 }
00149 mgd_release(res);
00150 }
00151
00152
00153 void mgd_style_load(midgard *mgd, long host, long cache_for_page, long style,
00154 GHashTable *element_cache,
00155 mgd_store_style_elt_cb callback, void *userdata)
00156 {
00157
00158 midgard_res *res;
00159 if (callback == NULL) return;
00160
00161 while (style) {
00162 res = mgd_ungrouped_select(mgd,
00163 "element.id AS id,name,value",
00164 "element, element_i",
00165 "style=$d AND element.id=element_i.sid AND element_i.lang=$d"
00166 " AND element.sitegroup IN (0, $d)",
00167 NULL, style, mgd->lang, mgd_sitegroup(mgd));
00168
00169 __style_load_from_res(mgd, host, cache_for_page,
00170 style, res, element_cache, callback, userdata);
00171
00172 if (mgd->lang > 0) {
00173 res = mgd_ungrouped_select(mgd,
00174 "element.id AS id,name,value",
00175 "element, element_i",
00176 "style=$d AND element.id=element_i.sid AND element_i.lang=$d"
00177 " AND element.sitegroup IN (0, $d)",
00178 NULL, style,
00179 mgd_get_default_lang(mgd),
00180 mgd_sitegroup(mgd));
00181
00182 __style_load_from_res(mgd, host, cache_for_page,
00183 style, res, element_cache, callback, userdata);
00184 }
00185
00186 style = mgd_idfield(mgd, "up", "style", style);
00187 }
00188 }
00189
00190 int mgd_find_blob_global(midgard *mgd, mgd_page_t *page, mgd_host_t *host, char* uri)
00191 {
00192 char *tmp_uri, *dir, *dir2;
00193 int uri_len, id = 0;
00194 midgard_res *res = NULL;
00195 tmp_uri = mgd_strdup(mgd->pool, uri + host->prefix_length);
00196 uri_len = strlen(tmp_uri);
00197
00198 dir = strtok (tmp_uri, "/");
00199 if (dir && strcmp(dir, mgd->ah_prefix) == 0) {
00200 dir = strtok(NULL, "/");
00201
00202 if ((dir2 = strtok(NULL, "/")) && strlen(dir2) == 32) {
00203 if (strtok(NULL, "/")) {
00204 dir = dir2;
00205 }
00206 }
00207
00208 if (dir) {
00209 res = mgd_ungrouped_select(mgd,
00210 "id", "repligard",
00211 "guid=$q and realm='blobs' and (sitegroup in (0,$d) or $d=0)",
00212 NULL, dir, mgd_sitegroup(mgd), mgd_sitegroup(mgd));
00213
00214 if (res && mgd_fetch(res)) {
00215 id = mgd_sql2id(res, 0);
00216 }
00217
00218 if (res) {
00219 mgd_release(res);
00220 }
00221
00222 if (id) {
00223 page->blob = id;
00224 page->found = MGD_FOUND_BLOB;
00225 return 1;
00226 }
00227 }
00228 }
00229
00230 return 0;
00231 }
00232
00233
00234 int mgd_find_blob(midgard *mgd, mgd_page_t *page, char *blobname)
00235 {
00236 midgard_res *res;
00237
00238 if (blobname == NULL) return 0;
00239 if (blobname[0] == '\0') return 0;
00240 if (strchr(blobname, '/') != NULL) return 0;
00241
00242
00243 res = mgd_ungrouped_select(mgd, "id,location", "blobs",
00244 "pid=$d AND ptable='page' AND name=$q AND (lang=$d OR lang=$d)", NULL,
00245 page->page, blobname, mgd->lang, mgd_get_default_lang(mgd));
00246
00247 if (!res || !mgd_fetch(res)) {
00248 if (res) mgd_release(res);
00249
00250 res = mgd_ungrouped_select(mgd, "id,location", "blobs",
00251 "pid=$d AND ptable='style' AND name=$q AND (lang=$d OR lang=$d)", NULL,
00252 page->style, blobname, mgd->lang, mgd_get_default_lang(mgd));
00253
00254 if (!res || !mgd_fetch(res)) {
00255 if (res)
00256 mgd_release(res);
00257
00258 return 0;
00259 }
00260 }
00261
00262 blobname = (char*)mgd_colvalue(res,1);
00263 if (blobname != NULL && blobname[0] == '\0') { blobname = NULL; }
00264 if (blobname != NULL) { page->blob = atoi(mgd_colvalue(res, 0)); }
00265 mgd_release(res);
00266 page->found = MGD_FOUND_BLOB;
00267 return 1;
00268 }
00269
00270 int mgd_parse_uri(midgard *mgd, mgd_host_t *host, char *uri,
00271 mgd_page_t *result,
00272 mgd_pathinfo_cb pathinfo_cb,
00273 GArray *path,
00274 void *userdata)
00275 {
00276 midgard_res *res;
00277 char *tmp_uri;
00278 char *basename, *ext;
00279 int uri_len;
00280 char *dir;
00281 long tmp;
00282 char *blob = NULL;
00283
00284 result->style = host->style;
00285 result->active = 0;
00286 result->page = host->page;
00287 result->auth_required = host->auth_required;
00288 result->author = 0;
00289 result->found = MGD_FOUND_NONE;
00290 result->blob = 0;
00291
00292 g_array_set_size(path, 0);
00293
00294 g_array_append_val(path, host->page);
00295
00296 basename = strrchr(uri + host->prefix_length, '/');
00297 ext = (basename != NULL) ? strrchr(basename + 1, '.') : NULL;
00298 result->addslash = (basename == NULL)
00299 || (basename[1] != '\0' && ext == NULL);
00300
00301 if (ext && strcmp(ext, ".html") == 0) {
00302 uri_len = ext - uri - host->prefix_length;
00303 tmp_uri = mgd_strndup(mgd->pool, uri + host->prefix_length, uri_len);
00304 } else {
00305 tmp_uri = mgd_strdup(mgd->pool, uri + host->prefix_length);
00306 uri_len = strlen(tmp_uri);
00307 }
00308
00309 if (!result->auth_required)
00310 result->auth_required = mgd_idfield(mgd, "info&1", "page", host->page);
00311 result->active = mgd_idfield(mgd, "info&2", "page", host->page);
00312 tmp = mgd_idfield(mgd, "style", "page", host->page);
00313 if (tmp != 0) result->style = tmp;
00314
00315
00316 result->found = MGD_FOUND_PAGE;
00317 for (dir = strtok(tmp_uri, "/");
00318 dir != NULL;
00319 dir = strtok(NULL, "/")) {
00320 if (dir[0] == '\0') { continue; }
00321
00322 res = mgd_ungrouped_select(mgd, "id,style,info&1,info&2,author,owner", "page",
00323 "up=$d AND name=$q", NULL, result->page, dir);
00324
00325 if (!res || !mgd_fetch(res)) {
00326 if (res) mgd_release(res);
00327 result->found = MGD_FOUND_NONE;
00328 break;
00329 }
00330
00331 result->page = atoi(mgd_colvalue(res, 0));
00332
00333 if ((tmp = atoi(mgd_colvalue(res, 1))) != 0) {
00334 result->style = tmp;
00335
00336
00337
00338 }
00339
00340 if (!result->auth_required) result->auth_required = atoi(mgd_colvalue(res, 2));
00341
00342 result->active = atoi(mgd_colvalue(res, 3));
00343 result->author = atol(mgd_colvalue(res, 4));
00344 result->owner = atol(mgd_colvalue(res, 4));
00345 g_array_append_val(path, result->page);
00346
00347 }
00348
00349 result->self_len = host->prefix_length + (dir != NULL ? (dir - tmp_uri) : uri_len);
00350
00351
00352 if (result->found == MGD_FOUND_NONE || result->active) {
00353 blob = uri + result->self_len;
00354 if (mgd_find_blob(mgd, result, blob)) return 1;
00355 }
00356
00357
00358 if (mgd->ah_prefix && result->found == MGD_FOUND_NONE && host->page == result->page) {
00359 if (mgd_find_blob_global(mgd, result, host, uri)) return 1;
00360 }
00361
00362 if (result->found == MGD_FOUND_NONE && !result->active) {
00363 return 0;
00364 }
00365
00366 if (result->active) {
00367 if (dir != NULL) result->addslash = 0;
00368 result->found = MGD_FOUND_PAGE;
00369 if (pathinfo_cb != NULL) {
00370 while (dir != NULL) {
00371 if (dir[0] != '\0') pathinfo_cb(dir, userdata);
00372 dir = strtok(NULL, "/");
00373 }
00374 }
00375 }
00376
00377 return 1;
00378 }
00379
00380 gboolean element_cache_free(gpointer key, gpointer value, gpointer userdata)
00381 {
00382 g_free(key);
00383 return TRUE;
00384 }
00385
00386 void mgd_load_styles(midgard *mgd, GArray* path,
00387 long host, long style,
00388 mgd_store_style_elt_cb style_elt_cb, void *userdata, long cached_page)
00389 {
00390 int i;
00391 midgard_res *res;
00392 long page;
00393 const char *title;
00394 const char *content;
00395 GHashTable *element_cache = NULL;
00396 long parent;
00397
00398 if (style_elt_cb == NULL || (cached_page == 0 && (path == NULL || path->len == 0))) return;
00399
00400 if (cached_page != 0) {
00401 page = cached_page;
00402 } else {
00403 page = g_array_index(path, long, path->len - 1);
00404 }
00405
00406 res = mgd_ungrouped_select(mgd,
00407 "title,content",
00408 "page_i",
00409 "sid=$d AND lang=$d",
00410 NULL, page, mgd->lang);
00411
00412 if (!res || !mgd_fetch(res)) {
00413 if (res)
00414 mgd_release(res);
00415
00416 res = mgd_ungrouped_select(mgd,
00417 "title,content",
00418 "page_i",
00419 "sid=$d AND lang=$d",
00420 NULL, page, mgd_get_default_lang(mgd));
00421
00422 if (!res || !mgd_fetch(res)) {
00423
00424
00425 if (res) mgd_release(res);
00426 return;
00427 }
00428 }
00429
00430 title = mgd_colvalue(res, 0);
00431 content = mgd_colvalue(res, 1);
00432 style_elt_cb("title", title, userdata);
00433 style_elt_cb("content", content, userdata);
00434
00435 mgd_release(res);
00436
00437 if (cached_page != 0) {
00438
00439
00440 res = mgd_ungrouped_select(mgd,
00441 "element.name,element_i.value",
00442 "element,element_i,cache",
00443 "element.id=element_i.sid AND "
00444 "element_i.lang=$d AND cache.page=$d "
00445 " AND cache.type=$d AND cache.id=element.id "
00446 " AND cache.style=element.style"
00447 " AND element.sitegroup IN (0, $d)",
00448 NULL,
00449 mgd_get_default_lang(mgd),
00450 cached_page, MGD_CACHE_ELT_STYLE, mgd_sitegroup(mgd));
00451
00452 if (res) {
00453 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), userdata);
00454 mgd_release(res);
00455 }
00456
00457
00458 if (mgd->lang != 0) {
00459
00460 res = mgd_ungrouped_select(mgd,
00461 "element.name,element_i.value",
00462 "element,element_i,cache",
00463 "element.id=element_i.sid AND "
00464 "element_i.lang=$d AND "
00465 "cache.page=$d AND cache.type=$d AND "
00466 "cache.id=element.id AND "
00467 "cache.style = element.style"
00468 " AND element.sitegroup IN (0, $d)",
00469 NULL, mgd->lang, cached_page, MGD_CACHE_ELT_STYLE, mgd_sitegroup(mgd));
00470
00471 if (res) {
00472 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), userdata);
00473 mgd_release(res);
00474 }
00475 }
00476
00477
00478 res = mgd_ungrouped_select(mgd,
00479 "pageelement.name,pageelement_i.value",
00480 "pageelement,pageelement_i,cache",
00481 "pageelement.id=pageelement_i.sid AND "
00482 "pageelement_i.lang=$d AND cache.page=$d AND "
00483 "cache.type=$d AND cache.id=pageelement.id"
00484 " AND pageelement.sitegroup IN (0, $d)",
00485 NULL,
00486 mgd_get_default_lang(mgd),
00487 cached_page, MGD_CACHE_ELT_PAGE, mgd_sitegroup(mgd));
00488
00489 if (res) {
00490 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), userdata);
00491 mgd_release(res);
00492 }
00493
00494
00495 if (mgd->lang != 0) {
00496
00497 res = mgd_ungrouped_select(mgd,
00498 "pageelement.name,pageelement_i.value",
00499 "pageelement,pageelement_i,cache",
00500 "pageelement.id=pageelement_i.sid AND "
00501 "pageelement_i.lang=$d AND cache.page=$d "
00502 "AND cache.type=$d AND cache.id=pageelement.id "
00503 "AND pageelement.sitegroup IN (0, $d)",
00504 NULL, mgd->lang, cached_page, MGD_CACHE_ELT_PAGE, mgd_sitegroup(mgd));
00505
00506 if (res) {
00507 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), userdata);
00508 mgd_release(res);
00509 }
00510 }
00511
00512 return;
00513 }
00514
00515 element_cache = midgard_hash_strings_new();
00516 g_hash_table_insert(element_cache, g_strdup("title"), g_strdup(""));
00517 g_hash_table_insert(element_cache, g_strdup("content"), g_strdup(""));
00518
00519
00520 _collect_page_elements(mgd, host, page, 0, element_cache, style_elt_cb, userdata, page);
00521
00522 while ((parent = mgd_idfield(mgd, "up", "page", g_array_index(path, long, 0)))) {
00523 g_array_prepend_val(path, parent);
00524 }
00525
00526 for (i = path->len - 2; i >= 0; i--) {
00527 _collect_page_elements(mgd, host,
00528 g_array_index(path, long, i), 1, element_cache, style_elt_cb, userdata, page);
00529 }
00530
00531 mgd_style_load(mgd, host, page, style, element_cache, style_elt_cb, userdata);
00532
00533 g_hash_table_destroy(element_cache);
00534 }
00535
00536 void mgd_cache_touch(midgard *mgd, long page)
00537 {
00538 GString *command;
00539 long sitegroup = (long)mgd_sitegroup(mgd);
00540
00541 if (sitegroup == 0) {
00542 mysql_query(mgd->msql->mysql, "DELETE FROM cache");
00543 } else {
00544 command = g_string_new("");
00545 g_string_append_printf(command, "DELETE FROM cache WHERE sitegroup=%ld", sitegroup);
00546 gchar *tmpstr = g_string_free(command, FALSE);
00547 mysql_query(mgd->msql->mysql, tmpstr);
00548 g_free(tmpstr);
00549 }
00550 }
00551
00552
00553 int mgd_cache_is_current(midgard *mgd, long host, long page, long style)
00554 {
00555 midgard_res *res;
00556 int is_current;
00557
00558
00559
00560
00561
00562 res = mgd_ungrouped_select(mgd, "page", "cache", "host=$d and page=$d AND style=$d AND lang=$d LIMIT 1", NULL , host, page, style, mgd_lang(mgd));
00563
00564 is_current = (res != NULL && mgd_fetch(res));
00565 if (res != NULL) mgd_release(res);
00566 return is_current;
00567 }
00568
00569
00570 void mgd_cache_add(midgard *mgd, long host, long page, long style, int type, long id)
00571 {
00572 g_assert(mgd != NULL);
00573
00574 GString *command = g_string_new("");
00575 g_string_append_printf(command,
00576 "INSERT INTO cache (host,page,style,type,id,lang,sitegroup) VALUES (%ld, %ld, %ld, %d, %ld, %d, %ld)",
00577 host, page, style, type, id, mgd_lang(mgd),
00578 (long)mgd_sitegroup(mgd));
00579 gchar *tmpstr = g_string_free(command, FALSE);
00580 mysql_query(mgd->msql->mysql, tmpstr);
00581 g_free(tmpstr);
00582 }
00583
00584
00585 void midgard_collect_style_elements(midgard *mgd, long host, long style, mgd_store_style_elt_cb style_elt_cb, void *userdata)
00586 {
00587 midgard_res *res;
00588 GHashTable *elements;
00589
00590 if (style_elt_cb == NULL)
00591 return;
00592 elements = g_hash_table_new(g_str_hash, g_str_equal);
00593
00594 res = mgd_ungrouped_select(mgd,
00595 "element.name,element_i.value", "element,element_i",
00596 "element.id=element_i.sid AND element.style=$d"
00597 " AND element.sitegroup IN (0, $d)",
00598 NULL,
00599 style, mgd_sitegroup(mgd));
00600
00601 if (res) {
00602 while (mgd_fetch(res)) {
00603 style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), userdata);
00604 }
00605 mgd_release(res);
00606 }
00607
00608 g_hash_table_foreach_remove(elements, element_cache_free, NULL);
00609 g_hash_table_destroy(elements);
00610
00611
00612 }
00613
00614 midgard_style *midgard_style_new(void){
00615
00616 midgard_style *style = g_new(midgard_style, 1);
00617 style->stack = NULL;
00618 style->styles = g_hash_table_new(g_str_hash, g_str_equal);
00619 style->page_elements = midgard_hash_strings_new();
00620 style->style_elements = midgard_hash_strings_new();
00621
00622 return style;
00623 }
00624
00625
00626 const gchar * midgard_pc_get_element(const gchar * name, GHashTable * table)
00627 {
00628 gchar *value;
00629
00630 if ((value = (gchar *)g_hash_table_lookup(table, name)) == NULL)
00631 value = "";
00632
00633 return value;
00634 }
00635
00636
00637
00638 void midgard_pc_set_element(const gchar * name, const gchar * value, GHashTable * table)
00639 {
00640 g_hash_table_insert(table, g_strdup(name), g_strdup(value));
00641 }
00642
00643
00644 void midgard_pc_output(char *buffer, int len, void *userdata)
00645 {
00646 FILE *f = (FILE *) userdata;
00647
00648 fwrite (buffer, sizeof (char), len, f);
00649 }
00650
00651
00652 void midgard_style_get_elements(midgard * mgd, glong style,
00653 mgd_store_style_elt_cb style_elt_cb, GHashTable *table)
00654 {
00655 g_assert(mgd);
00656
00657 midgard_res *res;
00658
00659 if (style_elt_cb == NULL || !style)
00660 return;
00661
00662
00663 res = mgd_ungrouped_select(mgd,
00664 "element.name,element_i.value", "element,element_i",
00665 "element.id=element_i.sid AND element_i.lang=$d AND element.style=$d"
00666 " AND element.sitegroup IN (0, $d)",
00667 NULL,
00668 mgd_get_default_lang(mgd),
00669 style, mgd_sitegroup(mgd), NULL);
00670
00671 if (res) {
00672 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), table);
00673 mgd_release(res);
00674 }
00675
00676
00677 if (mgd->lang != 0) {
00678 res = mgd_ungrouped_select(mgd,
00679 "element.name,element_i.value", "element,element_i,cache",
00680 "element.id=element_i.sid AND element_i.lang=$d AND element.style=$d"
00681 " AND element.sitegroup IN (0, $d)",
00682 NULL, mgd->lang, style, mgd_sitegroup(mgd), NULL);
00683
00684 if (res) {
00685 while (mgd_fetch(res)) style_elt_cb(mgd_colvalue(res, 0), mgd_colvalue(res, 1), table);
00686 mgd_release(res);
00687 }
00688 }
00689
00690 do {
00691
00692 style = mgd_idfield(mgd, "up", "style", style);
00693 midgard_style_get_elements(mgd, style, style_elt_cb, table);
00694
00695 } while (style != 0);
00696
00697 return;
00698 }
00699
00700 gboolean midgard_style_get_elements_from_dir(midgard *mgd, const gchar *name,
00701 mgd_store_style_elt_cb style_elt_cb, GHashTable *table)
00702 {
00703 gchar *content, **ffname, *fpfname = NULL;
00704 const gchar *fname = NULL;
00705 GDir *dir;
00706
00707 dir = g_dir_open(name, 0, NULL);
00708 if (dir != NULL) {
00709
00710
00711 while ((fname = g_dir_read_name(dir)) != NULL) {
00712
00713 fpfname = g_strconcat( name, "/", fname, NULL);
00714
00715
00716 ffname = g_strsplit(fname, ".", -1);
00717
00718
00719
00720 if (g_file_get_contents(fpfname, &content, NULL, NULL) == TRUE) {
00721
00722 if(!g_hash_table_lookup(table, ffname[0])) {
00723 g_hash_table_insert(table, g_strdup(ffname[0]), g_strdup(content));
00724
00725 }
00726
00727 g_free(content);
00728 g_strfreev(ffname);
00729 }
00730
00731 }
00732
00733 g_dir_close(dir);
00734 return TRUE;
00735 }
00736
00737 return FALSE;
00738 }
00739
00740 gboolean midgard_style_register(midgard *mgd, const gchar *name, midgard_style *mgdstyle)
00741 {
00742 g_assert(mgd);
00743 g_assert(name != NULL);
00744 g_assert(mgdstyle);
00745
00746
00747 return FALSE;
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776 }
00777
00778 void midgard_style_move_prev(midgard_style *style)
00779 {
00780 g_assert(style != NULL);
00781
00782 style->stack = style->stack->prev;
00783 }
00784
00785 void midgard_style_move_next(midgard_style *style)
00786 {
00787 g_assert(style != NULL);
00788
00789 style->stack = style->stack->next;
00790 }
00791
00792 gchar *midgard_style_get_element(midgard_style *style, const gchar *name)
00793 {
00794 g_assert(style != NULL);
00795
00796 gchar *value;
00797
00798
00799 if((value = g_hash_table_lookup(style->page_elements, name)) != NULL)
00800 return value;
00801
00802
00803 if(style->stack == NULL)
00804 return "";
00805
00806 if((value = g_hash_table_lookup((GHashTable *) g_list_nth_data(style->stack, 0),
00807 name )) != NULL)
00808 return value;
00809
00810 return "";
00811
00812 }
00813
00814 gboolean midgard_style_register_from_dir(midgard *mgd, const gchar *stackname,
00815 const gchar *dirname, GHashTable *style_stack)
00816 {
00817 g_assert(mgd);
00818 g_assert(dirname);
00819 g_assert(style_stack);
00820
00821 if(g_hash_table_lookup(style_stack, stackname)){
00822 g_warning("User style %s already registered", stackname);
00823 return FALSE;
00824 }
00825
00826 GHashTable *style_hash = midgard_hash_strings_new();
00827
00828 midgard_style_get_elements_from_dir(mgd, stackname,
00829 midgard_pc_set_element, style_hash);
00830
00831 g_hash_table_insert(style_stack, g_strdup((gchar *)stackname), style_hash);
00832
00833 return TRUE;
00834 }