Install by adding it to
~/.config/JetBrains/PhpStorm2020.3/extensions/com.intellij.database/data/extractors
| /* | |
| * Based on IntelliJ PHPStorm JSON exporter. | |
| * | |
| * Available context bindings: | |
| * COLUMNS List<DataColumn> | |
| * ROWS Iterable<DataRow> | |
| * OUT { append() } | |
| * FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); } | |
| * TRANSPOSED Boolean | |
| * plus ALL_COLUMNS, TABLE, DIALECT | |
| * | |
| * where: | |
| * DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object } | |
| * DataColumn { columnNumber(), name() } | |
| */ | |
| import static com.intellij.openapi.util.text.StringUtil.escapeStringCharacters as escapeStr | |
| NEWLINE = System.getProperty("line.separator") | |
| INDENT = " " | |
| def printPHPArray(level, col, o) { | |
| switch (o) { | |
| case null: OUT.append("null"); break | |
| case Tuple: printPHPArray(level, o[0], o[1]); break | |
| case Map: | |
| OUT.append("[") | |
| o.entrySet().eachWithIndex { entry, i -> | |
| OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}") | |
| OUT.append("\"${escapeStr(entry.getKey().toString())}\"") | |
| OUT.append(" => ") | |
| printPHPArray(level + 1, col, entry.getValue()) | |
| } | |
| OUT.append("$NEWLINE${INDENT * level}]") | |
| break | |
| case Object[]: | |
| case Iterable: | |
| OUT.append("[") | |
| def plain = true | |
| o.eachWithIndex { item, i -> | |
| plain = item == null || item instanceof Number || item instanceof Boolean || item instanceof String | |
| if (plain) { | |
| OUT.append(i > 0 ? ", " : "") | |
| } | |
| else { | |
| OUT.append("${i > 0 ? "," : ""}$NEWLINE${INDENT * (level + 1)}") | |
| } | |
| printPHPArray(level + 1, col, item) | |
| } | |
| if (plain) OUT.append("]") else OUT.append("$NEWLINE${INDENT * level}]") | |
| break | |
| case Boolean: OUT.append("$o"); break | |
| default: | |
| def str = FORMATTER.formatValue(o, col) | |
| OUT.append(FORMATTER.isStringLiteral(o, col) ? "\"${escapeStr(str)}\"" : str); | |
| break | |
| } | |
| } | |
| printPHPArray(0, null, ROWS.transform { row -> | |
| def map = new LinkedHashMap<String, String>() | |
| COLUMNS.each { col -> | |
| if (row.hasValue(col)) { | |
| def val = row.value(col) | |
| map.put(col.name(), new Tuple(col, val)) | |
| } | |
| } | |
| map | |
| }) |
