fs_value fn_contains(fs_query *q, fs_value arg1, fs_value arg2) { if (!fs_is_plain_or_string(arg1) || !fs_is_plain_or_string(arg2)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } arg1 = fs_value_fill_lexical(q, arg1); arg2 = fs_value_fill_lexical(q, arg2); return fs_value_boolean(strstr(arg1.lex, arg2.lex) != NULL); }
fs_value fn_uri(fs_query *q, fs_value a) { if (a.valid & fs_valid_bit(FS_V_TYPE_ERROR)) { return a; } if (a.valid & fs_valid_bit(FS_V_RID) && FS_IS_BNODE(a.rid)) { fs_value v = fs_value_blank(); v.lex = g_strdup_printf("bnode:b%llx", FS_BNODE_NUM(a.rid)); fs_query_add_freeable(q, v.lex); v.rid = fs_hash_uri_ignore_bnode(v.lex); v.valid = fs_valid_bit(FS_V_RID); v.attr = FS_RID_NULL; return v; } if (a.lex) { return fs_value_uri(a.lex); } a = fs_value_fill_lexical(q, a); fs_value v = fs_value_uri(a.lex); return v; }
fs_value fn_strends(fs_query *q, fs_value arg1, fs_value arg2) { if (!fs_is_plain_or_string(arg1) || !fs_is_plain_or_string(arg2)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } arg1 = fs_value_fill_lexical(q, arg1); arg2 = fs_value_fill_lexical(q, arg2); const int a1l = strlen(arg1.lex); const int a2l = strlen(arg2.lex); if (a2l > a1l) { return fs_value_boolean(0); } return fs_value_boolean(strncmp(arg1.lex + a1l - a2l, arg2.lex, a2l) == 0); }
fs_value fn_day(fs_query *q, fs_value v) { if (v.attr != fs_c.xsd_datetime) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } v = fs_value_fill_lexical(q, v); fs_date_fields df; if (date_from_iso8601(v.lex, &df)) { return fs_value_error(FS_ERROR_INVALID_TYPE, "cannot get day from xsd:dateTime"); } return fs_value_integer(df.day); }
fs_value fn_seconds(fs_query *q, fs_value v) { if (v.attr != fs_c.xsd_datetime) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } v = fs_value_fill_lexical(q, v); GTimeVal tv; if (!g_time_val_from_iso8601(v.lex, &tv)) { return fs_value_error(FS_ERROR_INVALID_TYPE, "cannot get seconds from xsd:date"); } return fs_value_integer(tv.tv_sec % 60); }
fs_value fn_lcase(fs_query *q, fs_value v) { if (!fs_is_plain_or_string(v)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } v = fs_value_fill_lexical(q, v); char *lex = g_utf8_strdown(v.lex, -1); fs_query_add_freeable(q, lex); fs_value ret = fs_value_plain(lex); ret.attr = v.attr; return ret; }
fs_value fn_year(fs_query *q, fs_value v) { if (v.attr != fs_c.xsd_datetime) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } v = fs_value_fill_lexical(q, v); fs_date_fields df; if (date_from_iso8601(v.lex, &df)) { char *err = g_strdup_printf("cannot get year from xsd:dateTime %s", v.lex); fs_query_add_freeable(q, err); return fs_value_error(FS_ERROR_INVALID_TYPE, err); } return fs_value_integer(df.year); }
fs_value fn_encode_for_uri(fs_query *q, fs_value v) { if (!fs_is_plain_or_string(v)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } v = fs_value_fill_lexical(q, v); #ifdef HAVE_G_URI_ESCAPE_STRING char *lex = g_uri_escape_string(v.lex, NULL, TRUE); #else char *lex = fs_uri_escape(v.lex); #endif fs_query_add_freeable(q, lex); fs_value ret = fs_value_plain(lex); return ret; }
fs_resource *fs_resource_value(fs_query *q, fs_value v) { v = fs_value_fill_lexical(q, v); v = fs_value_fill_rid(q, v); #if DEBUG_FILTER printf("resource->value "); fs_value_print(v); printf("\n"); #endif fs_resource *res = malloc(sizeof(fs_resource)); res->rid = v.rid; res->attr = v.attr; res->lex = strdup(v.lex); return res; }
fs_value fs_value_fill_rid(fs_query *q, fs_value a) { if (a.valid & fs_valid_bit(FS_V_RID)) { return a; } if (a.valid & fs_valid_bit(FS_V_TYPE_ERROR)) { a.rid = FS_RID_NULL; } fs_value_fill_lexical(q, a); a.rid = fs_hash_literal(a.lex, a.attr); a.valid |= fs_valid_bit(FS_V_RID); return a; }
static fs_value cast_datetime(fs_query *q, fs_value a) { if (a.lex) { fs_value ret = fs_value_datetime_from_string(a.lex); ret.lex = g_strdup(a.lex); fs_query_add_freeable(q, ret.lex); return ret; } if (a.valid & fs_valid_bit(FS_V_IN) && a.attr == fs_c.xsd_datetime) { fs_value b = fs_value_fill_lexical(q, a); return b; } return fs_value_error(FS_ERROR_INVALID_TYPE, "bad cast to datetime"); }
fs_value fn_cast_intl(fs_query *q, fs_value v, fs_rid dt) { if (dt == fs_c.xsd_double || dt == fs_c.xsd_float) { v = cast_double(v); } else if (dt == fs_c.xsd_integer || dt == fs_c.xsd_int) { v = cast_integer(v); } else if (dt == fs_c.xsd_decimal) { v = cast_decimal(v); } else if (dt == fs_c.xsd_string) { v = fs_value_fill_lexical(q, v); } else if (dt == fs_c.xsd_datetime) { v = cast_datetime(q, v); } else if (dt == fs_c.xsd_boolean) { v = cast_boolean(v); } v.attr = dt; return v; }
fs_value fn_substring(fs_query *q, fs_value str, fs_value start, fs_value length) { if (!fs_is_plain_or_string(str)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } if (!fs_is_numeric(&start)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } start = cast_integer(start); /* 2 arg form */ if (length.rid == FS_RID_NULL) { length = fs_value_integer(INT_MAX); } else { if (!fs_is_numeric(&length)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } length = cast_integer(length); } str = fs_value_fill_lexical(q, str); const int slen = g_utf8_strlen(str.lex, -1); if (start.in > slen || length.in <= 0) { fs_value ret = fs_value_plain(""); ret.attr = str.attr; return ret; } gchar *spos = g_utf8_offset_to_pointer(str.lex, start.in - 1); int retlen_utf8 = g_utf8_strlen(spos, -1); if (retlen_utf8 > length.in) { retlen_utf8 = length.in; } gchar *epos = g_utf8_offset_to_pointer(spos, retlen_utf8); int retlen_bytes = epos - spos + 1; char *retstr = g_malloc(retlen_bytes+1); retstr[retlen_bytes] = '\0'; g_utf8_strncpy(retstr, spos, retlen_utf8); fs_query_add_freeable(q, retstr); fs_value ret = fs_value_plain(retstr); ret.attr = str.attr; return ret; }
fs_value fn_str(fs_query *q, fs_value a) { if (a.valid & fs_valid_bit(FS_V_TYPE_ERROR)) { return a; } if (a.valid & fs_valid_bit(FS_V_RID) && FS_IS_BNODE(a.rid)) { return fs_value_error(FS_ERROR_INVALID_TYPE, NULL); } if (a.lex) { return fs_value_plain(a.lex); } fs_value v = fs_value_plain(NULL); a = fs_value_fill_lexical(q, a); v.lex = a.lex; return v; }