fix: support mongodb copy insert statements
This commit is contained in:
5 files changed
+169
-9
No files matched your search
@@ -12,6 +12,7 @@ import { formatSqlInsert } from "@/lib/exportFormats";
|
||||
import { uuid } from "@/lib/utils";
|
||||
import { useSettingsStore } from "@/stores/settingsStore";
|
||||
import { expandNestedJsonStringsForCopy } from "@/lib/jsonCopyValue";
|
||||
import { buildMongoCopyInsertDocument, formatMongoShellLiteral, type MongoInputValue } from "@/lib/mongoDocumentValues";
|
||||
import type { DatabaseType, QueryResult } from "@/types/database";
|
||||
import type { QueryResultExportRequest } from "@/lib/api";
|
||||
|
||||
@@ -31,6 +32,7 @@ export interface UseDataGridExportOptions {
|
||||
displayItems: ComputedRef<RowItem[]>;
|
||||
sql: ComputedRef<string | undefined>;
|
||||
tableMeta: ComputedRef<DataGridTableMeta | undefined>;
|
||||
copyInsertTargetLabel?: ComputedRef<string | undefined>;
|
||||
databaseType: ComputedRef<DatabaseType | undefined>;
|
||||
connectionId: ComputedRef<string | undefined>;
|
||||
database: ComputedRef<string | undefined>;
|
||||
@@ -100,6 +102,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
|
||||
displayItems,
|
||||
sql,
|
||||
tableMeta,
|
||||
copyInsertTargetLabel,
|
||||
sourceColumns,
|
||||
databaseType,
|
||||
connectionId,
|
||||
@@ -192,6 +195,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
|
||||
databaseType: databaseType.value ?? null,
|
||||
schema: tableMeta.value?.schema ?? null,
|
||||
tableName: tableMeta.value?.tableName ?? null,
|
||||
copyInsertTargetLabel: copyInsertTargetLabel?.value ?? null,
|
||||
columns: columns.value,
|
||||
sourceColumns: sourceColumns.value ?? null,
|
||||
excludePrimaryKeys,
|
||||
@@ -238,14 +242,23 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
|
||||
});
|
||||
|
||||
try {
|
||||
const statement = await buildDataGridCopyInsertStatement({
|
||||
databaseType: databaseType.value,
|
||||
tableMeta: tableMeta.value,
|
||||
columns: columns.value,
|
||||
sourceColumns: sourceColumns.value,
|
||||
rows: rows.map((item) => item.data),
|
||||
excludePrimaryKeys,
|
||||
});
|
||||
const statement =
|
||||
databaseType.value === "mongodb"
|
||||
? buildMongoCopyInsertStatement({
|
||||
collection: copyInsertTargetLabel?.value || tableMeta.value?.tableName || "collection",
|
||||
columns: columns.value,
|
||||
sourceColumns: sourceColumns.value,
|
||||
rows: rows.map((item) => item.data),
|
||||
excludePrimaryKeys,
|
||||
})
|
||||
: await buildDataGridCopyInsertStatement({
|
||||
databaseType: databaseType.value,
|
||||
tableMeta: tableMeta.value,
|
||||
columns: columns.value,
|
||||
sourceColumns: sourceColumns.value,
|
||||
rows: rows.map((item) => item.data),
|
||||
excludePrimaryKeys,
|
||||
});
|
||||
const latest = insertCopyCache(excludePrimaryKeys);
|
||||
if (latest.key !== key) return;
|
||||
setInsertCopyCache(excludePrimaryKeys, {
|
||||
@@ -1093,6 +1106,17 @@ function replaceControlCharacters(value: string, replacement: string): string {
|
||||
.join("");
|
||||
}
|
||||
|
||||
function buildMongoCopyInsertStatement(options: { collection: string; columns: string[]; sourceColumns?: Array<string | undefined>; rows: CellValue[][]; excludePrimaryKeys?: boolean }): string | undefined {
|
||||
const saveColumns = effectiveColumns(options.sourceColumns, options.columns);
|
||||
const columnIndexes = saveColumns.map((column, index) => ({ column, index })).filter((item): item is { column: string; index: number } => !!item.column);
|
||||
if (columnIndexes.length === 0 || options.rows.length === 0) return undefined;
|
||||
const documentColumns = columnIndexes.map((item) => item.column);
|
||||
const documents = options.rows.map((row) => buildMongoCopyInsertDocument(columnIndexes.map((item) => row[item.index]) as MongoInputValue[], documentColumns, { excludePrimaryKeys: options.excludePrimaryKeys }));
|
||||
const collection = `db.getCollection(${JSON.stringify(options.collection)})`;
|
||||
if (documents.length === 1) return `${collection}.insert(${formatMongoShellLiteral(documents[0])});`;
|
||||
return `${collection}.insertMany(${formatMongoShellLiteral(documents)});`;
|
||||
}
|
||||
|
||||
function compactLocalTimestamp(date = new Date()): string {
|
||||
const yy = String(date.getFullYear() % 100).padStart(2, "0");
|
||||
const month = String(date.getMonth() + 1).padStart(2, "0");
|
||||
|
||||
Reference in new issue
Block a user