Skip to content

Commit

Permalink
Merge pull request #48 from kalviumcommunity/feature/add-sqlite-support
Browse files Browse the repository at this point in the history
Add sqlite support
  • Loading branch information
kailashchoudhary11 authored Jun 10, 2024
2 parents a844192 + 5105afe commit 9e65dae
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 1 deletion.
5 changes: 5 additions & 0 deletions configs/app.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
dbConfig: {
PATH: "/tmp/database.db",
}
}
1 change: 1 addition & 0 deletions enums/supportedLanguages.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ module.exports = {
RUBY: 'ruby',
PROMPTV1: 'promptv1',
PROMPTV2: 'promptv2',
SQLITE3: 'sqlite3',
}
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"@builder.io/sqlgenerate": "^1.2.9",
"@supercharge/promise-pool": "^2.3.2",
"axios": "^0.27.2",
"compression": "^1.7.4",
Expand All @@ -21,6 +22,8 @@
"morgan": "^1.10.0",
"node-cache": "^5.1.2",
"openai": "~4.24.1",
"sqlite-parser": "^1.0.1",
"sqlite3": "^5.1.7",
"uuid": "^9.0.0",
"winston": "^3.11.0"
},
Expand Down
107 changes: 106 additions & 1 deletion services/code.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ const util = require('util')
const exec = util.promisify(require('child_process').exec)
const os = require('os')
const fs = require('fs')
const path = require('path')
const sqlite3 = require('sqlite3').verbose()
const { PYTHON, PROMPTV1, PROMPTV2 } = require('../enums/supportedLanguages')
const logger = require('../loader').helpers.l
const OpenAI = require('openai')
Expand All @@ -11,6 +13,11 @@ const { LANGUAGES_CONFIG } = require('../configs/language.config')
const Joi = require('joi')
const memoryUsedThreshold = process.env.MEMORY_USED_THRESHOLD || 512
const getDefaultAIEvalSystemPrompt = require('../helpers/defaultAIEvalSystemPrompt')
const supportedLanguages = require('../enums/supportedLanguages')
const { default: axios } = require('axios')
const { generate } = require('@builder.io/sqlgenerate')
const parser = require('sqlite-parser')
const { dbConfig } = require('../configs/app.config')

const _runScript = async (cmd, res, runMemoryCheck = false) => {
let initialMemory = 0
Expand Down Expand Up @@ -345,7 +352,7 @@ const _getAiScore = async (langConfig, question, response, points, userAnswer, r
points: scoreConfidence.points,
rationale: scoreConfidence.rationale,
confidence:
(scoreConfidence.frequency / scoreConfidence.total) * 100,
(scoreConfidence.frequency / scoreConfidence.total) * 100,
}
return
}
Expand Down Expand Up @@ -380,6 +387,102 @@ const _getAiScore = async (langConfig, question, response, points, userAnswer, r
}
}

const _executeStatement = (db, sql) => {
return new Promise((resolve, reject) => {
db.all(sql, function(err, rows) {
if (err) {
reject(err);
} else {
resolve(rows)
}
})
})
}

const _executeSqlQueries = async (dbPath, queries) => {
const db = new sqlite3.Database(dbPath, sqlite3.OPEN_READWRITE, (err) => {
if (err) {
throw new Error(
'Was not able to connect to the SQLite database: ' + err.message,
)
}
})

const sqlStatements = []
try {
const ast = parser(queries);
if (!ast) {
db.close()
return { data: [] }
}
for (const statement of ast.statement) {
sqlStatements.push(generate(statement))
}
} catch (err) {
db.close()
return { error: true, data: err.message }
}

for (let i = 0; i < sqlStatements.length; i++) {
try {
const res = await _executeStatement(db, sqlStatements[i])
if (i == sqlStatements.length - 1) {
db.close()
return { data: res }
}
} catch (err) {
logger.error(err)
db.close()
return {
error: true, data: `${err.message} at statement ${i + 1}`
}
}
}
}

const _downloadSqliteDatabase = async (fileUrl, dbPath) => {
const writer = fs.createWriteStream(dbPath)
const response = await axios({
url: fileUrl,
method: 'GET',
responseType: 'stream',
})

response.data.pipe(writer)

return new Promise((resolve, reject) => {
writer.on('finish', resolve)
writer.on('error', reject)
})
}

const _executeSqlite3Query = async (req, res, response) => {
const dbPath = dbConfig.PATH
try {
const dbDirectory = path.dirname(dbPath)
if (!fs.existsSync(dbDirectory)) {
fs.mkdirSync(dbDirectory, { recursive: true })
}
if (!fs.existsSync(dbPath)) {
fs.closeSync(fs.openSync(dbPath, 'w'))
}
await _downloadSqliteDatabase(req.stdin, dbPath)
const queryResults = await _executeSqlQueries(dbPath, req.script, response)
if (queryResults.error) {
response.error = 1
}
response.output = JSON.stringify(queryResults.data)

fs.unlinkSync(dbPath)
} catch (err) {
if (fs.existsSync(dbPath)) {
fs.unlinkSync(dbPath)
}
logger.error(err)
throw err
}
}

const execute = async (req, res) => {
const response = {
output: '',
Expand All @@ -403,6 +506,8 @@ const execute = async (req, res) => {
req.userAnswer,
req.rubric,
)
} else if (req.language === supportedLanguages.SQLITE3) {
await _executeSqlite3Query(req, res, response)
} else {
await _executeCode(req, res, response)
}
Expand Down

0 comments on commit 9e65dae

Please sign in to comment.