| 79 | |
| 80 | @util.decorator |
| 81 | def cache( |
| 82 | fn: Callable[..., _R], |
| 83 | self: Dialect, |
| 84 | con: Connection, |
| 85 | *args: Any, |
| 86 | **kw: Any, |
| 87 | ) -> _R: |
| 88 | info_cache = kw.get("info_cache", None) |
| 89 | if info_cache is None: |
| 90 | return fn(self, con, *args, **kw) |
| 91 | exclude = {"info_cache", "unreflectable"} |
| 92 | key = ( |
| 93 | fn.__name__, |
| 94 | tuple( |
| 95 | (str(a), a.quote) if isinstance(a, quoted_name) else a |
| 96 | for a in args |
| 97 | if isinstance(a, str) |
| 98 | ), |
| 99 | tuple( |
| 100 | (k, (str(v), v.quote) if isinstance(v, quoted_name) else v) |
| 101 | for k, v in kw.items() |
| 102 | if k not in exclude |
| 103 | ), |
| 104 | ) |
| 105 | ret: _R = info_cache.get(key) |
| 106 | if ret is None: |
| 107 | ret = fn(self, con, *args, **kw) |
| 108 | info_cache[key] = ret |
| 109 | return ret |
| 110 | |
| 111 | |
| 112 | def flexi_cache( |