Socket
Socket
Sign inDemoInstall

@capacitor-community/sqlite

Package Overview
Dependencies
Maintainers
24
Versions
242
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@capacitor-community/sqlite - npm Package Compare versions

Comparing version 2.9.7 to 2.9.8

android/src/main/java/com/getcapacitor/community/database/sqlite/SQLite/ImportExportJson/JsonTrigger.java

7

CHANGELOG.md

@@ -0,1 +1,8 @@

## 2.9.8 (2021-02-01) REFACTOR
### Bug Fixes
- Fix Data import where the ID is a UUID issue#75
- Fix Can't create my own DB Trigger issue#76
## 2.9.7 (2021-01-30) REFACTOR

@@ -2,0 +9,0 @@

@@ -378,2 +378,6 @@ declare module '@capacitor/core' {

/***
* Array of Trigger (JsonTrigger)
*/
triggers?: JsonTrigger[];
/***
* Array of Table data

@@ -401,2 +405,20 @@ */

}
export interface JsonTrigger {
/**
* The trigger name
*/
name: string;
/**
* The trigger time event fired
*/
timeevent: string;
/**
* The trigger condition
*/
condition?: string;
/**
* The logic of the trigger
*/
logic: string;
}
export interface JsonIndex {

@@ -403,0 +425,0 @@ /**

1

dist/esm/definitions.js

@@ -124,3 +124,2 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {

return __awaiter(this, void 0, void 0, function* () {
console.log('>>> in SQLiteDBConnection open dbName ' + this.dbName);
const res = yield this.sqlite.open({ database: this.dbName });

@@ -127,0 +126,0 @@ return res;

@@ -127,3 +127,2 @@ var capacitorPlugin = (function (exports, core) {

return __awaiter(this, void 0, void 0, function* () {
console.log('>>> in SQLiteDBConnection open dbName ' + this.dbName);
const res = yield this.sqlite.open({ database: this.dbName });

@@ -130,0 +129,0 @@ return res;

@@ -218,5 +218,3 @@ import { __awaiter } from "tslib";

stmt += `${sDate} WHERE id = 1;`;
console.log(`>>> setSyncDate stmt ${stmt}`);
const changes = yield this.executeSQL(stmt);
console.log(`>>> setSyncDate changes ${changes}`);
if (changes < 0) {

@@ -223,0 +221,0 @@ return { result: false, message: 'setSyncDate failed' };

@@ -47,2 +47,9 @@ import { JsonSQLite } from '../../definitions';

/**
* GetTriggers
* @param mDb
* @param sqlStmt
* @param tableName
*/
private getTriggers;
/**
* GetValues

@@ -49,0 +56,0 @@ * @param mDb

@@ -152,2 +152,8 @@ import { __awaiter } from "tslib";

}
// create Table's triggers if any
const triggers = yield this.getTriggers(mDb, tableName);
if (triggers.length > 0) {
// check triggers validity
yield this._uJson.checkTriggersValidity(triggers);
}
// create Table's Data

@@ -167,2 +173,5 @@ const query = `SELECT * FROM ${tableName};`;

}
if (triggers.length > 0) {
table.triggers = triggers;
}
if (values.length > 0) {

@@ -266,3 +275,3 @@ table.values = values;

stmt += `type = 'index' AND tbl_name = '${tableName}' `;
stmt += `AND sql NOTNULL;`;
stmt += `AND sql NOT NULL;`;
const retIndexes = yield this._uSQLite.queryAll(mDb, stmt, []);

@@ -307,2 +316,82 @@ if (retIndexes.length > 0) {

/**
* GetTriggers
* @param mDb
* @param sqlStmt
* @param tableName
*/
getTriggers(mDb, tableName) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
let triggers = [];
try {
let stmt = 'SELECT name,tbl_name,sql FROM sqlite_master WHERE ';
stmt += `type = 'trigger' AND tbl_name = '${tableName}' `;
stmt += `AND sql NOT NULL;`;
const retTriggers = yield this._uSQLite.queryAll(mDb, stmt, []);
if (retTriggers.length > 0) {
for (let j = 0; j < retTriggers.length; j++) {
const keys = Object.keys(retTriggers[j]);
if (keys.length === 3) {
if (retTriggers[j]['tbl_name'] === tableName) {
const sql = retTriggers[j]['sql'];
const name = retTriggers[j]['name'];
let sqlArr = sql.split(name);
if (sqlArr.length != 2) {
reject(new Error(`GetTriggers: sql split name does not return 2 values`));
break;
}
if (!sqlArr[1].includes(tableName)) {
reject(new Error(`GetTriggers: sql split does not contains ${tableName}`));
break;
}
const timeEvent = sqlArr[1].split(tableName, 1)[0].trim();
sqlArr = sqlArr[1].split(timeEvent + ' ' + tableName);
if (sqlArr.length != 2) {
reject(new Error(`GetTriggers: sql split tableName does not return 2 values`));
break;
}
let condition = '';
let logic = '';
if (sqlArr[1].trim().substring(0, 5).toUpperCase() !== 'BEGIN') {
sqlArr = sqlArr[1].trim().split('BEGIN');
if (sqlArr.length != 2) {
reject(new Error(`GetTriggers: sql split BEGIN does not return 2 values`));
break;
}
condition = sqlArr[0].trim();
logic = 'BEGIN' + sqlArr[1];
}
else {
logic = sqlArr[1].trim();
}
let trigger = {};
trigger.name = name;
trigger.logic = logic;
if (condition.length > 0)
trigger.condition = condition;
trigger.timeevent = timeEvent;
triggers.push(trigger);
}
else {
reject(new Error(`GetTriggers: Table ${tableName} doesn't match`));
break;
}
}
else {
reject(new Error(`GetTriggers: Table ${tableName} creating indexes`));
break;
}
}
}
}
catch (err) {
reject(new Error(`GetTriggers: ${err.message}`));
}
finally {
resolve(triggers);
}
}));
});
}
/**
* GetValues

@@ -399,2 +488,3 @@ * @param mDb

let indexes = [];
let triggers = [];
table.name = resTables[i];

@@ -414,2 +504,8 @@ if (modTables[table.name] === 'Create') {

}
// create Table's triggers if any
triggers = yield this.getTriggers(mDb, tableName);
if (triggers.length > 0) {
// check triggers validity
yield this._uJson.checkTriggersValidity(triggers);
}
}

@@ -435,2 +531,5 @@ // create Table's Data

}
if (triggers.length > 0) {
table.triggers = triggers;
}
if (values.length > 0) {

@@ -437,0 +536,0 @@ table.values = values;

@@ -1,2 +0,2 @@

import { JsonColumn, JsonIndex } from '../../definitions';
import { JsonColumn, JsonIndex, JsonTrigger } from '../../definitions';
export declare class UtilsJson {

@@ -86,2 +86,7 @@ private _uSQLite;

/**
* isTriggers
* @param obj
*/
private isTriggers;
/**
* checkSchemaValidity

@@ -96,2 +101,7 @@ * @param schema

checkIndexesValidity(indexes: JsonIndex[]): Promise<void>;
/**
* checkTriggersValidity
* @param triggers
*/
checkTriggersValidity(triggers: JsonTrigger[]): Promise<void>;
}

@@ -146,3 +146,3 @@ import { __awaiter } from "tslib";

const tableName = jsonData.tables[i].name;
let stmt = `CREATE ${Object.keys(index).includes('mode') ? index.mode + ' ' : ''}INDEX `;
let stmt = `CREATE ${Object.keys(index).includes('mode') ? index.mode + ' ' : ''}INDEX IF NOT EXISTS `;
stmt += `${index.name} ON ${tableName} (${index.value});`;

@@ -152,2 +152,15 @@ statements.push(stmt);

}
if (jsonData.tables[i].triggers != null &&
jsonData.tables[i].triggers.length >= 1) {
for (let j = 0; j < jsonData.tables[i].triggers.length; j++) {
const trigger = jsonData.tables[i].triggers[j];
const tableName = jsonData.tables[i].name;
let stmt = `CREATE TRIGGER IF NOT EXISTS `;
stmt += `${trigger.name} ${trigger.timeevent} ON ${tableName} `;
if (trigger.condition)
stmt += `${trigger.condition} `;
stmt += `${trigger.logic};`;
statements.push(stmt);
}
}
}

@@ -310,4 +323,8 @@ resolve(statements);

let ret = false;
const query = `SELECT ${firstColumnName} FROM ` +
`${dbName} WHERE ${firstColumnName} = ${key};`;
let query = `SELECT ${firstColumnName} FROM ` +
`${dbName} WHERE ${firstColumnName} = `;
if (typeof key === 'number')
query += `${key};`;
if (typeof key === 'string')
query += `'${key}';`;
try {

@@ -409,2 +426,3 @@ const resQuery = yield this._uSQLite.queryAll(db, query, []);

'indexes',
'triggers',
'values',

@@ -425,2 +443,4 @@ ];

return false;
if (key === 'triggers' && typeof obj[key] != 'object')
return false;
if (key === 'values' && typeof obj[key] != 'object')

@@ -447,2 +467,9 @@ return false;

}
if (key === 'triggers') {
for (let i = 0; i < obj[key].length; i++) {
const retTriggers = this.isTriggers(obj[key][i]);
if (!retTriggers)
return false;
}
}
if (key === 'values') {

@@ -511,2 +538,30 @@ if (nbColumn > 0) {

/**
* isTriggers
* @param obj
*/
isTriggers(obj) {
const keyTriggersLevel = [
'name',
'timeevent',
'condition',
'logic',
];
if (obj == null ||
(Object.keys(obj).length === 0 && obj.constructor === Object))
return false;
for (var key of Object.keys(obj)) {
if (keyTriggersLevel.indexOf(key) === -1)
return false;
if (key === 'name' && typeof obj[key] != 'string')
return false;
if (key === 'timeevent' && typeof obj[key] != 'string')
return false;
if (key === 'condition' && typeof obj[key] != 'string')
return false;
if (key === 'logic' && typeof obj[key] != 'string')
return false;
}
return true;
}
/**
* checkSchemaValidity

@@ -570,3 +625,34 @@ * @param schema

}
/**
* checkTriggersValidity
* @param triggers
*/
checkTriggersValidity(triggers) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
for (let i = 0; i < triggers.length; i++) {
let trigger = {};
let keys = Object.keys(triggers[i]);
if (keys.includes('logic')) {
trigger.logic = triggers[i].logic;
}
if (keys.includes('name')) {
trigger.name = triggers[i].name;
}
if (keys.includes('timeevent')) {
trigger.timeevent = triggers[i].timeevent;
}
if (keys.includes('condition')) {
trigger.condition = triggers[i].condition;
}
let isValid = this.isTriggers(trigger);
if (!isValid) {
reject(new Error(`CheckTriggersValidity: triggers[${i}] not valid`));
}
}
resolve();
}));
});
}
}
//# sourceMappingURL=utilsJson.js.map

@@ -106,3 +106,2 @@ import { __awaiter } from "tslib";

retPath = this.Path.join(dir, 'app', 'assets', this.pathDB.toLowerCase());
console.log(`$$$ AssetsDatabases ${retPath}`);
return retPath;

@@ -109,0 +108,0 @@ }

@@ -566,3 +566,2 @@ import { __awaiter } from "tslib";

const ret = yield mDB.setSyncDate(syncDate);
console.log(`$$$ setSyncDate ${JSON.stringify(ret)}`);
return Promise.resolve(ret);

@@ -642,3 +641,2 @@ });

dbList.forEach((db) => __awaiter(this, void 0, void 0, function* () {
console.log(`>>> ${db}`);
// for each check if the suffix SQLite.db is there or add it

@@ -645,0 +643,0 @@ let toDb = this._uFile.setPathSuffix(db);

@@ -378,2 +378,6 @@ declare module '@capacitor/core' {

/***
* Array of Trigger (JsonTrigger)
*/
triggers?: JsonTrigger[];
/***
* Array of Table data

@@ -401,2 +405,20 @@ */

}
export interface JsonTrigger {
/**
* The trigger name
*/
name: string;
/**
* The trigger time event fired
*/
timeevent: string;
/**
* The trigger condition
*/
condition?: string;
/**
* The logic of the trigger
*/
logic: string;
}
export interface JsonIndex {

@@ -403,0 +425,0 @@ /**

@@ -116,3 +116,2 @@ import { __awaiter } from "tslib";

return __awaiter(this, void 0, void 0, function* () {
console.log('>>> in SQLiteDBConnection open dbName ' + this.dbName);
const res = yield this.sqlite.open({ database: this.dbName });

@@ -119,0 +118,0 @@ return res;

@@ -239,5 +239,3 @@ import { UtilsFile } from './utilsFile';

stmt += `${sDate} WHERE id = 1;`;
console.log(`>>> setSyncDate stmt ${stmt}`);
const changes: number = await this.executeSQL(stmt);
console.log(`>>> setSyncDate changes ${changes}`);
if (changes < 0) {

@@ -244,0 +242,0 @@ return { result: false, message: 'setSyncDate failed' };

@@ -6,2 +6,3 @@ import {

JsonIndex,
JsonTrigger,
} from '../../definitions';

@@ -153,2 +154,11 @@ import { UtilsSQLite } from '../utilsSQLite';

}
// create Table's triggers if any
const triggers: JsonTrigger[] = await this.getTriggers(
mDb,
tableName,
);
if (triggers.length > 0) {
// check triggers validity
await this._uJson.checkTriggersValidity(triggers);
}
// create Table's Data

@@ -167,2 +177,5 @@ const query: string = `SELECT * FROM ${tableName};`;

}
if (triggers.length > 0) {
table.triggers = triggers;
}
if (values.length > 0) {

@@ -265,3 +278,3 @@ table.values = values;

stmt += `type = 'index' AND tbl_name = '${tableName}' `;
stmt += `AND sql NOTNULL;`;
stmt += `AND sql NOT NULL;`;
const retIndexes = await this._uSQLite.queryAll(mDb, stmt, []);

@@ -304,2 +317,101 @@ if (retIndexes.length > 0) {

/**
* GetTriggers
* @param mDb
* @param sqlStmt
* @param tableName
*/
private async getTriggers(
mDb: any,
tableName: string,
): Promise<JsonTrigger[]> {
return new Promise(async (resolve, reject) => {
let triggers: JsonTrigger[] = [];
try {
let stmt: string = 'SELECT name,tbl_name,sql FROM sqlite_master WHERE ';
stmt += `type = 'trigger' AND tbl_name = '${tableName}' `;
stmt += `AND sql NOT NULL;`;
const retTriggers = await this._uSQLite.queryAll(mDb, stmt, []);
if (retTriggers.length > 0) {
for (let j: number = 0; j < retTriggers.length; j++) {
const keys: Array<string> = Object.keys(retTriggers[j]);
if (keys.length === 3) {
if (retTriggers[j]['tbl_name'] === tableName) {
const sql: string = retTriggers[j]['sql'];
const name: string = retTriggers[j]['name'];
let sqlArr: string[] = sql.split(name);
if (sqlArr.length != 2) {
reject(
new Error(
`GetTriggers: sql split name does not return 2 values`,
),
);
break;
}
if (!sqlArr[1].includes(tableName)) {
reject(
new Error(
`GetTriggers: sql split does not contains ${tableName}`,
),
);
break;
}
const timeEvent = sqlArr[1].split(tableName, 1)[0].trim();
sqlArr = sqlArr[1].split(timeEvent + ' ' + tableName);
if (sqlArr.length != 2) {
reject(
new Error(
`GetTriggers: sql split tableName does not return 2 values`,
),
);
break;
}
let condition: string = '';
let logic: string = '';
if (
sqlArr[1].trim().substring(0, 5).toUpperCase() !== 'BEGIN'
) {
sqlArr = sqlArr[1].trim().split('BEGIN');
if (sqlArr.length != 2) {
reject(
new Error(
`GetTriggers: sql split BEGIN does not return 2 values`,
),
);
break;
}
condition = sqlArr[0].trim();
logic = 'BEGIN' + sqlArr[1];
} else {
logic = sqlArr[1].trim();
}
let trigger: JsonTrigger = {} as JsonTrigger;
trigger.name = name;
trigger.logic = logic;
if (condition.length > 0) trigger.condition = condition;
trigger.timeevent = timeEvent;
triggers.push(trigger);
} else {
reject(
new Error(`GetTriggers: Table ${tableName} doesn't match`),
);
break;
}
} else {
reject(
new Error(`GetTriggers: Table ${tableName} creating indexes`),
);
break;
}
}
}
} catch (err) {
reject(new Error(`GetTriggers: ${err.message}`));
} finally {
resolve(triggers);
}
});
}
/**
* GetValues

@@ -403,2 +515,3 @@ * @param mDb

let indexes: JsonIndex[] = [];
let triggers: JsonTrigger[] = [];
table.name = resTables[i];

@@ -418,2 +531,8 @@ if (modTables[table.name] === 'Create') {

}
// create Table's triggers if any
triggers = await this.getTriggers(mDb, tableName);
if (triggers.length > 0) {
// check triggers validity
await this._uJson.checkTriggersValidity(triggers);
}
}

@@ -439,2 +558,5 @@ // create Table's Data

}
if (triggers.length > 0) {
table.triggers = triggers;
}
if (values.length > 0) {

@@ -441,0 +563,0 @@ table.values = values;

import { UtilsSQLite } from '../utilsSQLite';
import { JsonColumn, JsonIndex } from '../../definitions';
import { JsonColumn, JsonIndex, JsonTrigger } from '../../definitions';

@@ -151,2 +151,3 @@ export class UtilsJson {

statements.push(');');
// create trigger last_modified associated with the table

@@ -173,3 +174,3 @@ let trig: string = 'CREATE TRIGGER IF NOT EXISTS ';

Object.keys(index).includes('mode') ? index.mode + ' ' : ''
}INDEX `;
}INDEX IF NOT EXISTS `;
stmt += `${index.name} ON ${tableName} (${index.value});`;

@@ -179,2 +180,21 @@ statements.push(stmt);

}
if (
jsonData.tables[i].triggers != null &&
jsonData.tables[i].triggers!.length >= 1
) {
for (
let j: number = 0;
j < jsonData.tables[i].triggers!.length;
j++
) {
const trigger = jsonData.tables[i].triggers![j];
const tableName = jsonData.tables[i].name;
let stmt: string = `CREATE TRIGGER IF NOT EXISTS `;
stmt += `${trigger.name} ${trigger.timeevent} ON ${tableName} `;
if (trigger.condition) stmt += `${trigger.condition} `;
stmt += `${trigger.logic};`;
statements.push(stmt);
}
}
}

@@ -377,5 +397,7 @@ resolve(statements);

let ret: boolean = false;
const query: string =
let query: string =
`SELECT ${firstColumnName} FROM ` +
`${dbName} WHERE ${firstColumnName} = ${key};`;
`${dbName} WHERE ${firstColumnName} = `;
if (typeof key === 'number') query += `${key};`;
if (typeof key === 'string') query += `'${key}';`;
try {

@@ -476,2 +498,3 @@ const resQuery: Array<any> = await this._uSQLite.queryAll(

'indexes',
'triggers',
'values',

@@ -490,2 +513,3 @@ ];

if (key === 'indexes' && typeof obj[key] != 'object') return false;
if (key === 'triggers' && typeof obj[key] != 'object') return false;
if (key === 'values' && typeof obj[key] != 'object') return false;

@@ -498,2 +522,3 @@ if (key === 'schema') {

foreignkey?: string;
constraint?: string;
}) => {

@@ -516,2 +541,8 @@ if (element.column) {

}
if (key === 'triggers') {
for (let i: number = 0; i < obj[key].length; i++) {
const retTriggers: boolean = this.isTriggers(obj[key][i]);
if (!retTriggers) return false;
}
}
if (key === 'values') {

@@ -580,2 +611,27 @@ if (nbColumn > 0) {

}
/**
* isTriggers
* @param obj
*/
private isTriggers(obj: any): boolean {
const keyTriggersLevel: Array<string> = [
'name',
'timeevent',
'condition',
'logic',
];
if (
obj == null ||
(Object.keys(obj).length === 0 && obj.constructor === Object)
)
return false;
for (var key of Object.keys(obj)) {
if (keyTriggersLevel.indexOf(key) === -1) return false;
if (key === 'name' && typeof obj[key] != 'string') return false;
if (key === 'timeevent' && typeof obj[key] != 'string') return false;
if (key === 'condition' && typeof obj[key] != 'string') return false;
if (key === 'logic' && typeof obj[key] != 'string') return false;
}
return true;
}

@@ -638,2 +694,32 @@ /**

}
/**
* checkTriggersValidity
* @param triggers
*/
public async checkTriggersValidity(triggers: JsonTrigger[]): Promise<void> {
return new Promise(async (resolve, reject) => {
for (let i: number = 0; i < triggers.length; i++) {
let trigger: JsonTrigger = {} as JsonTrigger;
let keys: string[] = Object.keys(triggers[i]);
if (keys.includes('logic')) {
trigger.logic = triggers[i].logic;
}
if (keys.includes('name')) {
trigger.name = triggers[i].name;
}
if (keys.includes('timeevent')) {
trigger.timeevent = triggers[i].timeevent;
}
if (keys.includes('condition')) {
trigger.condition = triggers[i].condition;
}
let isValid: boolean = this.isTriggers(trigger);
if (!isValid) {
reject(new Error(`CheckTriggersValidity: triggers[${i}] not valid`));
}
}
resolve();
});
}
}

@@ -113,3 +113,2 @@ export class UtilsFile {

retPath = this.Path.join(dir, 'app', 'assets', this.pathDB.toLowerCase());
console.log(`$$$ AssetsDatabases ${retPath}`);
return retPath;

@@ -116,0 +115,0 @@ }

@@ -580,3 +580,2 @@ import { WebPlugin } from '@capacitor/core';

const ret: any = await mDB.setSyncDate(syncDate);
console.log(`$$$ setSyncDate ${JSON.stringify(ret)}`);
return Promise.resolve(ret);

@@ -657,3 +656,2 @@ }

dbList.forEach(async (db: string) => {
console.log(`>>> ${db}`);
// for each check if the suffix SQLite.db is there or add it

@@ -660,0 +658,0 @@ let toDb: string = this._uFile.setPathSuffix(db);

{
"name": "@capacitor-community/sqlite",
"version": "2.9.7",
"version": "2.9.8",
"description": "Capacitor SQLite Plugin",

@@ -5,0 +5,0 @@ "homepage": "https://github.com/capacitor-community/sqlite",

@@ -40,2 +40,6 @@ <p align="center"><br><img src="https://user-images.githubusercontent.com/236501/85893648-1c92e880-b7a8-11ea-926d-95355b8175c7.png" width="128" height="128" /></p>

- a [Ionic/React app](https://github.com/jepiqueau/react-sqlite-app-starter)
- a [Ionic/Vue app](https://github.com/jepiqueau/vue-sqlite-app-starter)
<br>

@@ -42,0 +46,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc