diff options
author | Alexey Shchepin <alexey@process-one.net> | 2016-02-12 16:26:51 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2016-03-02 00:12:49 +0300 |
commit | 7f3bffe821f6a898990a27edd4a23ba159596c9a (patch) | |
tree | 94cf5b198fe2196981e0a30d777535130157b2e0 /src | |
parent | Updated some mod_offline SQL queries to the new API (diff) |
Allow balanced expressions inside @(...) in ejabberd_sql_pt
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_sql_pt.erl | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/ejabberd_sql_pt.erl b/src/ejabberd_sql_pt.erl index 23fc263b..6b26cbcd 100644 --- a/src/ejabberd_sql_pt.erl +++ b/src/ejabberd_sql_pt.erl @@ -174,12 +174,12 @@ append_string(S, State) -> State#state{query = [{str, S} | State#state.query]}. parse_name(S, State) -> - parse_name(S, [], State). + parse_name(S, [], 0, State). -parse_name([], Acc, State) -> +parse_name([], _Acc, _Depth, State) -> throw({error, State#state.loc, "expected ')', found end of string"}); -parse_name([$), T | S], Acc, State) -> +parse_name([$), T | S], Acc, 0, State) -> Type = case T of $d -> integer; @@ -190,11 +190,15 @@ parse_name([$), T | S], Acc, State) -> ["unknown type specifier '", T, "'"]}) end, {lists:reverse(Acc), Type, S, State}; -parse_name([$)], Acc, State) -> +parse_name([$)], Acc, 0, State) -> throw({error, State#state.loc, "expected type specifier, found end of string"}); -parse_name([C | S], Acc, State) -> - parse_name(S, [C | Acc], State). +parse_name([$( = C | S], Acc, Depth, State) -> + parse_name(S, [C | Acc], Depth + 1, State); +parse_name([$) = C | S], Acc, Depth, State) -> + parse_name(S, [C | Acc], Depth - 1, State); +parse_name([C | S], Acc, Depth, State) -> + parse_name(S, [C | Acc], Depth, State). make_sql_query(State) -> |