src/pageresolve.c

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   /* valgrind reports leak here , however res is released */
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         /* skip storing the element if it's allready defined */
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         //g_hash_table_insert(mgd->elements, g_strdup(name), g_strdup(value));
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             /* skip storing the element if it's allready defined */
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             //g_hash_table_insert(mgd->elements, g_strdup(name), g_strdup(value));
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    /*[eeh]  We always have a root page */
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          /*[eeh]  don't reset path of pages so lower inherited page
00336           *       elements 'show through'
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    /*[eeh]  page not found or active page, try blob */
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    /* page not found, try attachment host */
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        /* EEH: This should never happen */
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         /* Get style elements with default lang(mgd->default_lang) */
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         /* Get style elements with lang already being set (mgd->lang != 0) */
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         /* Get page elements with default lang (mgd->lang = 0) */
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         /* Get page elements with lang already being set (mgd->lang != 0) */
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    /*[eeh] page, type, id, sitegroup */
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 /* Get element from table hash */
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 /* Add element to table hash */
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     /* Get style elements with default (mgd->lang = 0) */
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     /* Get style elements with lang already being set (mgd->lang != 0) */
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     } /* Get all elements from parent style(s) */
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         /* Read files form directory */
00711         while ((fname = g_dir_read_name(dir)) != NULL) {
00712    
00713             fpfname = g_strconcat( name, "/", fname, NULL);
00714             
00715             /* Get filename without extension. */ 
00716             ffname = g_strsplit(fname, ".", -1);
00717 
00718             /* Get file content and set as value in hash table ,
00719              * filename without extension is a key */
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         /* guint id; */
00747         return FALSE;
00748         
00749         /*
00750         GHashTable *rstyles = g_hash_table_lookup(mgdstyle->styles, stackname);
00751         
00752         if(rstyles == NULL){
00753                 g_warning("User style %s already registered", stackname);
00754                 return FALSE;
00755         }
00756 
00757         mgdstyle->style_elements = midgard_hash_strings_new();
00758 
00759         MgdObject *object = midgard_object_new_by_id(mgd, "midgard_style", (gpointer) guid);
00760         if (object == NULL)
00761                 return FALSE;
00762         
00763         g_object_get(G_OBJECT(object), "id", &id, NULL);      
00764                 
00765         midgard_style_get_elements(mgd, id, midgard_pc_set_element, mgdstyle->style_elements);
00766 
00767         g_hash_table_insert(mgdstyle->styles, g_strdup((gchar *)stackname), 
00768                         mgdstyle->style_elements);
00769              
00770         mgdstyle->stack = g_list_prepend(mgdstyle->stack, (gpointer) mgdstyle->style_elements);
00771         
00772         g_object_unref(object);
00773         
00774         return TRUE;    
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         /* Get element from page elements which do not change during request */
00799         if((value = g_hash_table_lookup(style->page_elements, name)) != NULL)
00800                 return value;
00801 
00802         /* Get style elements from top of the stack */
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 }

Generated on Thu Feb 22 06:15:18 2007 for midgard-core by  doxygen 1.4.6