Skip to content

Commit

Permalink
Complete Enhancement - Issue #30
Browse files Browse the repository at this point in the history
  • Loading branch information
jung-thomas committed Mar 26, 2021
1 parent 0b02e61 commit 2d8b4cb
Show file tree
Hide file tree
Showing 6 changed files with 293 additions and 32 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/).

## 1.202103.3

### Added
- querySimple now allows output to a file and supports table, json, and Excel output formats Issue [#30](https://github.com/SAP-samples/hana-developer-cli-tool-example/issues/30)


## 1.202103.2

### Added
Expand Down
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1043,13 +1043,17 @@ Options:
```shell
hana-cli querySimple
[aliases: qs, querysimple]
Execute single SQL command and output results
Options:
--admin, -a, --Admin Connect via admin (default-env-admin.json)
-a, --admin, --Admin Connect via admin (default-env-admin.json)
[boolean] [default: false]
--query, -q, --Query SQL Statement [string]
-q, --query, --Query SQL Statement [string]
-f, --folder, --Folder DB Module Folder Name [string] [default: "./"]
-n, --filename, --Filename File name [string]
-o, --output, --Output Output Type for Query Results
[string] [choices: "table", "json", "excel"] [default: "table"]
```
![querySimple example](https://raw.githubusercontent.com/wiki/SAP-samples/hana-developer-cli-tool-example/images/querySimple.gif)
Expand Down
1 change: 1 addition & 0 deletions _i18n/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,4 @@ readme=Display Read Me in CLI
matrix=Blue or Red Pill?
rick=For expert users only
useHanaTypes=Use SAP HANA-Specific Data Types See (https://cap.cloud.sap/docs/cds/cdl#predefined-types)
outputTypeQuery=Output Type for Query Results
155 changes: 133 additions & 22 deletions bin/querySimple.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const colors = require("colors/safe");
const bundle = global.__bundle;
const dbClass = require("sap-hdbext-promisfied");
const colors = require("colors/safe")
const bundle = global.__bundle
const dbClass = require("sap-hdbext-promisfied")

exports.command = 'querySimple';
exports.aliases = ['qs', "querysimple"];
exports.describe = bundle.getText("querySimple");
exports.command = 'querySimple'
exports.aliases = ['qs', "querysimple"]
exports.describe = bundle.getText("querySimple")


exports.builder = {
Expand All @@ -18,47 +18,158 @@ exports.builder = {
alias: ['q', 'Query'],
type: 'string',
desc: bundle.getText("query")
},
folder: {
alias: ['f', 'Folder'],
type: 'string',
default: './',
desc: bundle.getText("folder")
},
filename: {
alias: ['n', 'Filename'],
type: 'string',
desc: bundle.getText("filename")
},
output: {
alias: ['o', 'Output'],
choices: ["table", "json", "excel"],
default: "table",
type: 'string',
desc: bundle.getText("outputTypeQuery")
}
};
}

exports.handler = function (argv) {
const prompt = require('prompt');
prompt.override = argv;
prompt.message = colors.green(bundle.getText("input"));
prompt.start();
const prompt = require('prompt')
prompt.override = argv
prompt.message = colors.green(bundle.getText("input"))
prompt.start()

var schema = {
let schema = {
properties: {
admin: {
description: bundle.getText("admin"),
type: 'boolean',
required: true,
ask: () => {
return false;
return false
}
},
query: {
description: bundle.getText("query"),
type: 'string',
required: true
},
folder: {
description: bundle.getText("folder"),
type: 'string',
required: true
},
filename: {
description: bundle.getText("filename"),
type: 'string',
required: true,
ask: () => {
return false
}
},
output: {
description: bundle.getText("outputTypeQuery"),
type: 'string',
required: true
}
}
};
}

prompt.get(schema, (err, result) => {
if (err) {
return console.log(err.message);
return console.log(err.message)
}
global.startSpinner()
dbQuery(result);
});
dbQuery(result)
})
}

async function dbQuery(result) {
const db = new dbClass(await dbClass.createConnectionFromEnv(dbClass.resolveEnv(result)));
let results = await db.execSQL(result.query);
console.table(results);
try {
const db = new dbClass(await dbClass.createConnectionFromEnv(dbClass.resolveEnv(result)))
let results = await db.execSQL(result.query)
if(!results[0]){
global.__spinner.stop()
console.log(`No Query Results`)
return
}

switch (result.output) {

case 'excel':
if (result.filename) {
const excel = require("node-xlsx")
let out = []


//Column Headers
let header = []
for (const [key] of Object.entries(results[0])) {
header.push(key)
}
out.push(header)

for (let item of results) {
let innerItem = []
for (const [key] of Object.entries(item)) {
innerItem.push(item[key])
}
out.push(innerItem)
}
let excelOutput = excel.build([{
name: "Query Results",
data: out
}])
await toFile(result.folder, result.filename, 'xlsx', excelOutput)
} else {
global.__spinner.stop()
console.error(`Excel output only supported when sending content to a file directly`)
}
break
case 'json':
if (result.filename) {
await toFile(result.folder, result.filename, 'json', JSON.stringify(results, null, 2))
} else {
global.__spinner.stop()
console.log(JSON.stringify(results, null, 2))
}
break
default:
if (result.filename) {
const Table = require('easy-table')
await toFile(result.folder, result.filename, 'txt', Table.print(results))
} else {
global.__spinner.stop()
console.table(results)
}
break
}



return
} catch (error) {
global.__spinner.stop()
console.error(error.toString())
return

}
}

global.__spinner.stop()
return;
async function toFile(folder, file, ext, content) {
let fs = require('fs')
let path = require('path')
let dir = folder
!fs.existsSync(dir) && fs.mkdirSync(dir)
file = `${file}.${ext}`
let fileLocal = path.join(dir, file)
fs.writeFileSync(fileLocal, content)
global.__spinner.stop()
console.log(`\n Content written to: ${fileLocal}`)
}
Loading

0 comments on commit 2d8b4cb

Please sign in to comment.