mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-30 15:03:57 +00:00
read json lines field values
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
const { filterName } = require('dbgate-tools');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const lineReader = require('line-reader');
|
const lineReader = require('line-reader');
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
@@ -148,6 +149,19 @@ module.exports = {
|
|||||||
return {};
|
return {};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
loadFieldValues_meta: true,
|
||||||
|
async loadFieldValues({ jslid, field, search }) {
|
||||||
|
const datastore = await this.ensureDatastore(jslid);
|
||||||
|
const res = new Set();
|
||||||
|
await datastore.enumRows(row => {
|
||||||
|
if (!filterName(search, row[field])) return true;
|
||||||
|
res.add(row[field]);
|
||||||
|
return res.size < 100;
|
||||||
|
});
|
||||||
|
// @ts-ignore
|
||||||
|
return [...res].map(value => ({ value }));
|
||||||
|
},
|
||||||
|
|
||||||
async notifyChangedStats(stats) {
|
async notifyChangedStats(stats) {
|
||||||
// console.log('SENDING STATS', JSON.stringify(stats));
|
// console.log('SENDING STATS', JSON.stringify(stats));
|
||||||
const datastore = this.datastores[stats.jslid];
|
const datastore = this.datastores[stats.jslid];
|
||||||
|
|||||||
@@ -159,6 +159,18 @@ class JsonLinesDatastore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async enumRows(eachRow) {
|
||||||
|
await lock.acquire('reader', async () => {
|
||||||
|
await this._ensureReader(0, null);
|
||||||
|
for (;;) {
|
||||||
|
const line = await this._readLine(true);
|
||||||
|
if (line == null) break;
|
||||||
|
const shouldContinue = eachRow(line);
|
||||||
|
if (!shouldContinue) break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async getRows(offset, limit, filter) {
|
async getRows(offset, limit, filter) {
|
||||||
const res = [];
|
const res = [];
|
||||||
await lock.acquire('reader', async () => {
|
await lock.acquire('reader', async () => {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
export let conid = null;
|
export let conid = null;
|
||||||
export let database = null;
|
export let database = null;
|
||||||
export let driver = null;
|
export let driver = null;
|
||||||
|
export let jslid = null;
|
||||||
|
|
||||||
export let pureName = null;
|
export let pureName = null;
|
||||||
export let schemaName = null;
|
export let schemaName = null;
|
||||||
@@ -177,9 +178,8 @@
|
|||||||
{ onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' },
|
{ onClick: () => openFilterWindow('>='), text: 'Greater Than Or Equal To...' },
|
||||||
{ onClick: () => openFilterWindow('<'), text: 'Less Than...' },
|
{ onClick: () => openFilterWindow('<'), text: 'Less Than...' },
|
||||||
{ onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' },
|
{ onClick: () => openFilterWindow('<='), text: 'Less Than Or Equal To...' },
|
||||||
|
|
||||||
{ divider: true },
|
|
||||||
|
|
||||||
|
{ divider: true },
|
||||||
|
|
||||||
{ onClick: () => openFilterWindow('+'), text: 'Contains...' },
|
{ onClick: () => openFilterWindow('+'), text: 'Contains...' },
|
||||||
{ onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' },
|
{ onClick: () => openFilterWindow('~'), text: 'Does Not Contain...' },
|
||||||
@@ -248,6 +248,7 @@
|
|||||||
conid,
|
conid,
|
||||||
database,
|
database,
|
||||||
driver,
|
driver,
|
||||||
|
jslid,
|
||||||
multiselect: true,
|
multiselect: true,
|
||||||
schemaName,
|
schemaName,
|
||||||
pureName,
|
pureName,
|
||||||
@@ -304,6 +305,10 @@
|
|||||||
<FontIcon icon="icon dots-vertical" />
|
<FontIcon icon="icon dots-vertical" />
|
||||||
</InlineButton>
|
</InlineButton>
|
||||||
{/if}
|
{/if}
|
||||||
|
{:else if jslid}
|
||||||
|
<InlineButton on:click={handleShowValuesModal} narrow square>
|
||||||
|
<FontIcon icon="icon dots-vertical" />
|
||||||
|
</InlineButton>
|
||||||
{/if}
|
{/if}
|
||||||
<DropDownButton icon="icon filter" menu={createMenu} narrow />
|
<DropDownButton icon="icon filter" menu={createMenu} narrow />
|
||||||
{#if showResizeSplitter}
|
{#if showResizeSplitter}
|
||||||
|
|||||||
@@ -336,6 +336,7 @@
|
|||||||
export let tabControlHiddenTab = false;
|
export let tabControlHiddenTab = false;
|
||||||
export let onCustomGridRefresh;
|
export let onCustomGridRefresh;
|
||||||
export let useEvalFilters = false;
|
export let useEvalFilters = false;
|
||||||
|
export let jslid;
|
||||||
// export let generalAllowSave = false;
|
// export let generalAllowSave = false;
|
||||||
|
|
||||||
export const activator = createActivator('DataGridCore', false);
|
export const activator = createActivator('DataGridCore', false);
|
||||||
@@ -1548,6 +1549,7 @@
|
|||||||
schemaName={col.schemaName}
|
schemaName={col.schemaName}
|
||||||
{conid}
|
{conid}
|
||||||
{database}
|
{database}
|
||||||
|
{jslid}
|
||||||
driver={display?.driver}
|
driver={display?.driver}
|
||||||
filterType={useEvalFilters ? 'eval' : col.filterType || getFilterType(col.dataType)}
|
filterType={useEvalFilters ? 'eval' : col.filterType || getFilterType(col.dataType)}
|
||||||
filter={display.getFilter(col.uniqueName)}
|
filter={display.getFilter(col.uniqueName)}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
export let field;
|
export let field;
|
||||||
export let driver;
|
export let driver;
|
||||||
export let multiselect = false;
|
export let multiselect = false;
|
||||||
|
export let jslid;
|
||||||
|
|
||||||
// console.log('ValueLookupModal', conid, database, pureName, schemaName, columnName, driver);
|
// console.log('ValueLookupModal', conid, database, pureName, schemaName, columnName, driver);
|
||||||
|
|
||||||
@@ -36,14 +37,22 @@
|
|||||||
|
|
||||||
async function reload() {
|
async function reload() {
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
rows = await apiCall('database-connections/load-field-values', {
|
if (jslid) {
|
||||||
conid,
|
rows = await apiCall('jsldata/load-field-values', {
|
||||||
database,
|
jslid,
|
||||||
search,
|
search,
|
||||||
schemaName,
|
field,
|
||||||
pureName,
|
});
|
||||||
field,
|
} else {
|
||||||
});
|
rows = await apiCall('database-connections/load-field-values', {
|
||||||
|
conid,
|
||||||
|
database,
|
||||||
|
search,
|
||||||
|
schemaName,
|
||||||
|
pureName,
|
||||||
|
field,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user