Skip to content

Commit

Permalink
added export custom query
Browse files Browse the repository at this point in the history
  • Loading branch information
vwh committed Jul 28, 2024
1 parent 90e0f9c commit 0fd0ff3
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 34 deletions.
9 changes: 7 additions & 2 deletions src/components/export-buttons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import useSQLiteStore from "@/store/useSQLiteStore";
import {
exportTableAsCSV,
exportAllTablesAsCSV,
exportCustomQueryAsCSV,
downloadDatabase
} from "@/lib/sqlite";

Expand All @@ -18,7 +19,7 @@ import {
import { FileDownIcon } from "lucide-react";

export default function ExportButtons() {
const { selectedTable, tables, db } = useSQLiteStore();
const { selectedTable, tables, customQuery, db } = useSQLiteStore();

const renderExportButton = useCallback(
(onClick: () => void, label: string, className?: string) => (
Expand All @@ -42,9 +43,13 @@ export default function ExportButtons() {
() => exportAllTablesAsCSV(db),
"Export all tables as CSV"
)}
{renderExportButton(
() => exportCustomQueryAsCSV(db, customQuery),
"Export custom query"
)}
</div>
),
[db, renderExportButton, selectedTable]
[db, renderExportButton, selectedTable, tables, customQuery]
);

return (
Expand Down
18 changes: 9 additions & 9 deletions src/components/table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ export default function DBTable() {
setQueryError,
rowPerPageOrAuto,
isCustomQuery,
setIsCustomQuery
setIsCustomQuery,
customQuery,
setCustomQuery
} = useSQLiteStore();

const { page, setPage, rowsPerPage } = usePagination(rowPerPageOrAuto);
Expand All @@ -37,14 +39,12 @@ export default function DBTable() {
[tables, selectedTable]
);

const {
data,
columns,
customQuery,
setCustomQuery,
isQueryLoading,
handleCustomQuery
} = useQueryData(tableName, rowsPerPage, page, isCustomQuery);
const { data, columns, isQueryLoading, handleCustomQuery } = useQueryData(
tableName,
rowsPerPage,
page,
isCustomQuery
);

const handleResetQuery = useCallback(() => {
setQueryError(null);
Expand Down
12 changes: 9 additions & 3 deletions src/hooks/useQueryData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,18 @@ export function useQueryData(
page: number,
isCustomQuery: boolean
) {
const { db, setQueryError, setIsCustomQuery, query, appendToQueryHestory } =
useSQLiteStore();
const {
db,
setQueryError,
setIsCustomQuery,
query,
appendToQueryHestory,
customQuery,
setCustomQuery
} = useSQLiteStore();

const [data, setData] = useState<TableRow[]>([]);
const [columns, setColumns] = useState<string[]>([]);
const [customQuery, setCustomQuery] = useState<string>("");
const [isQueryLoading, setIsQueryLoading] = useState(true);

useEffect(() => {
Expand Down
45 changes: 25 additions & 20 deletions src/lib/sqlite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,41 +100,46 @@ const arrayToCSV = (columns: string[], rows: any[]): string => {
return [header, ...csvRows].join("\n");
};

export const exportTableAsCSV = (
const exportFromQuery = (
query: string,
database: Database,
tableIndex: number
tableName: string
): void => {
const tableNames = getTableNames(database);
const tableName = tableNames[tableIndex];
try {
const result = database.exec(`SELECT * FROM "${tableName}"`);
const result = database.exec(query);
if (result.length === 0) {
throw new Error(`Table ${tableName} is empty or does not exist.`);
throw new Error(`Query "${query}" returned no results.`);
}
const { data, columns } = mapQueryResults(result);
const csvContent = arrayToCSV(columns, data);
const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
saveAs(blob, `${tableName}.csv`);
} catch (error) {
console.error(`Failed to export table "${tableName}" as CSV:`, error);
console.error(`Failed to get CSV for query "${query}":`, error);
throw error;
}
};

export const exportTableAsCSV = (
database: Database,
tableIndex: number
): void => {
const tableNames = getTableNames(database);
const tableName = tableNames[tableIndex];
const query = `SELECT * FROM "${tableName}"`;
exportFromQuery(query, database, tableName);
};

export const exportAllTablesAsCSV = (database: Database): void => {
getTableNames(database).forEach((tableName) => {
try {
const result = database.exec(`SELECT * FROM "${tableName}"`);
if (result.length === 0) {
console.warn(`Table ${tableName} is empty or does not exist.`);
return;
}
const { data, columns } = mapQueryResults(result);
const csvContent = arrayToCSV(columns, data);
const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
saveAs(blob, `${tableName}.csv`);
} catch (error) {
console.error(`Failed to export table "${tableName}" as CSV:`, error);
}
const query = `SELECT * FROM "${tableName}"`;
exportFromQuery(query, database, tableName);
});
};

export const exportCustomQueryAsCSV = (
database: Database,
query: string
): void => {
exportFromQuery(query, database, "custom_query");
};
4 changes: 4 additions & 0 deletions src/store/useSQLiteStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ interface SQLiteState {
setTableSchemas: (schemas: TableInfo) => void;
rowPerPageOrAuto: number | "auto";
setRowPerPageOrAuto: (value: number | "auto") => void;
customQuery: string;
setCustomQuery: (value: string) => void;
isCustomQuery: boolean;
setIsCustomQuery: (value: boolean) => void;
queryHestory: string[];
Expand Down Expand Up @@ -87,7 +89,9 @@ const initializeStore = create<SQLiteState>((set, get) => ({
setRowPerPageOrAuto: (value: number | "auto") =>
set({ rowPerPageOrAuto: value }),

customQuery: "",
setIsCustomQuery: (value: boolean) => set({ isCustomQuery: value }),
setCustomQuery: (value: string) => set({ customQuery: value }),

queryHestory: [],
setQueryHestory: (value: string[]) => set({ queryHestory: value }),
Expand Down

0 comments on commit 0fd0ff3

Please sign in to comment.