diff --git a/Node.JS/Md5.js b/Node.JS/Md5.js deleted file mode 100755 index 74afbc707b8b2bdab9c09b49d36683e8a02a6d8d..0000000000000000000000000000000000000000 --- a/Node.JS/Md5.js +++ /dev/null @@ -1,15 +0,0 @@ -const crypto = require('crypto') - -/** - * md5 加密 - * @param {String} content 明文 - */ -function _md5(content) { - const md5 = crypto.createHash('md5') - return md5.update(content).digest('hex') -} -function doCrypto(content) { - const str = `password=${content}&key=${CRYPTO_SECRET_KEY}` - return _md5(str) -} -module.exports = {_md5,doCrypto}; \ No newline at end of file diff --git a/Node.JS/SqlDrive.js b/Node.JS/SqlDrive.js deleted file mode 100755 index ac413cb415688d596aa6c409f052f375144a8da8..0000000000000000000000000000000000000000 --- a/Node.JS/SqlDrive.js +++ /dev/null @@ -1,84 +0,0 @@ - -var _md5 = require("./Md5"); -function setRemote(remote) { - /** - * Remote Value = Url + Port || Or only use url; - */ - this.remote = remote; -} -function setLoginUser(user) { - this.user = user; -} -function setLoginPasswd(passwd){ - this.passwd = _md5._md5(passwd); -} -function run(command) { - //console.log(this.user+" "+this.passwd+" "+this.command); - var http = require('http'); - try{ - http.get(this.remote+"/?Logon="+this.user+"?Passwd="+this.passwd+"?Command="+command, function(res) { - var data = ''; - var mes = ""; - res.setEncoding("utf8"); - res.on('data', function(chunk) { - data += chunk; - }).on('end', function() { - var s = data.split("\n"); - for (var i = 0 ; i < s.length ; i++) { - if (s[i] == "") { - break; - } - console.log(" -- "+s[i]); - } - }).on('err', function () { - return false; - }); - }); - return true; - }catch (err) { - console.log(err); - return false; - } -} -function createData(name,value,note,database) { - run("create data '"+name+"' setting('"+value+"','"+note+"') in "+database); -} -function createDatabase(name) { - run("create database '"+name+"'"); -} -function deleteData(name,database) { - run("delete data '"+name+"' in "+database); -} -function deleteDatabase(name) { - run("delete database "+name); -} -function findData(name) { - run("find data "+name); -} -function findDatabase(name) { - run("find database "+name); -} -function indexData(name,database) { - run("index '"+name+"' in "+database); -} -function reNameDatabase(database,rename) { - run("rename database '"+database+"' '"+rename+"'"); -} -function reNameData(data,rename,database) { - run("rename data '"+database+"' '"+rename+"' in "+database); -} - -module.exports = { - createData, - createDatabase, - deleteData, - deleteDatabase, - findData, - findDatabase, - indexData, - reNameData, - reNameDatabase, - setLoginPasswd, - setLoginUser, - setRemote -}; \ No newline at end of file diff --git a/Node.JS/main.js b/Node.JS/main.js deleted file mode 100755 index 9d142885f8332acd8ece5997b2efebd91b73c584..0000000000000000000000000000000000000000 --- a/Node.JS/main.js +++ /dev/null @@ -1,54 +0,0 @@ -var _md5 = require("./Md5"); - -var message = ""; - -function setLoginUser(user) { - this.user = user; -} -function setLoginPasswd(passwd){ - this.passwd = _md5._md5(passwd); -} -function setCommand(line) { - this.command = line; -} -function setRemote(remote) { - /** - * Remote Value = Url + Port || Or only use url; - */ - this.remote = remote; -} -function setMes(mes) { - message = mes; -} -function getContent() { - return message; -} -function run() { - //console.log(this.user+" "+this.passwd+" "+this.command); - var http = require('http'); - try{ - http.get(this.remote+"/?Logon="+this.user+"?Passwd="+this.passwd+"?Command="+this.command, function(res) { - var data = ''; - var mes = ""; - res.setEncoding("utf8"); - res.on('data', function(chunk) { - data += chunk; - }).on('end', function() { - var s = data.split("\n"); - for (var i = 0 ; i < s.length ; i++) { - if (s[i] == "") { - break; - } - console.log(" -- "+s[i]); - } - }).on('err', function () { - return false; - }); - }); - return true; - }catch (err) { - console.log(err); - return false; - } -} -module.exports = {setLoginUser,setCommand,setLoginPasswd,run,setRemote,getContent,message}; \ No newline at end of file diff --git a/Node.JS/test.js b/Node.JS/test.js deleted file mode 100755 index 7505d4e8ce13a6847510c707376e526387757a01..0000000000000000000000000000000000000000 --- a/Node.JS/test.js +++ /dev/null @@ -1,6 +0,0 @@ -var a = require( "./main" ); - -a.setCommand("list database"); -a.setLoginPasswd("123456"); -a.setLoginUser("root"); -a.setRemote("http://127.0.0.1:8888/"); \ No newline at end of file diff --git a/Node/.gitignore b/Node/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..25c8fdbaba62c31aacfa2307975b06fbfd017485 --- /dev/null +++ b/Node/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json \ No newline at end of file diff --git a/Node/README.md b/Node/README.md new file mode 100644 index 0000000000000000000000000000000000000000..dea8b1564a9fdb632439bed0bcebc216583b0354 --- /dev/null +++ b/Node/README.md @@ -0,0 +1,41 @@ +# Node Api +### 安装依赖 (npm, yarn, pnpm) +>**npm** 安装 +>```shell +>npm install +>``` + +>**yarn** 安装 +>```shell +>yarn install +>``` + +>**pnpm** 安装 +>```shell +>pnpm install +>``` + +### 测试 (以**npm**为例) +```commandline +npm test +``` +### 示例 +*example.**ts*** +```typescript +const Driver = require("./main"); +const driver = new Driver.Driver( + "root", // username + "123456", // password + "127.0.0.1", // hostname +); + +driver.listDatabase( + console.log // callback +); +``` +##### 运行 +```commandline +$ ts-node example.ts + +[ 'linwin', 'wangguana', 'zmh-program' ] +``` \ No newline at end of file diff --git a/Node/drive.ts b/Node/drive.ts new file mode 100644 index 0000000000000000000000000000000000000000..f12f6d0893e8beebab60643594e54db83060bce2 --- /dev/null +++ b/Node/drive.ts @@ -0,0 +1,103 @@ +import { IncomingMessage } from "http"; +const md5 = require("md5-node"); +const http = require('http'); + +export default class Driver { + public host: string; + public port: number; + public username: string; + public password: string; + public enable_ssl: boolean; + private readonly remote: string; + + public constructor (username: string, password: string, host: string = "127.0.0.1", port: number = 8888, enable_ssl: boolean = false) { + /** + * @param username: user name (like root, linwin) + * @param password: raw password (like 123456) + * @param host: host name of the database (like 127.0.0.1, localhost, example.org) + * @param port: port of the database, default is 8888 + * @param enable_ssl: enable ssl. if the variable is true, it will be https:// . + **/ + + this.host = host; + this.port = port; + this.enable_ssl = enable_ssl; + this.remote = `${this.enable_ssl?'https':'http'}://${this.host}:${this.port}/` + this.username = username; + this.password = md5(password); + } + protected _execute(script: string, callback: (data: string) => any): void { + http.get( + `${this.remote}/?Logon=${this.username}?Passwd=${this.password}?Command=${script}`, + function (response: IncomingMessage) { + response.setEncoding("utf8"); + let data = ''; + response.on('data', function (chunk: any) { + data += chunk; + }).on('end', function () { + callback(data); + }); + } + ) + } + + public getRemote(): string { + return this.remote; + } + + public execute(script: string, callback: (data: string) => any): void { + this._execute(script, function(data: string) { + if (data == '\n') { + throw new Error('Request execution failure!'); + } else { + return callback(data.trim()); + } + }) + } + + public execute_ignore(script: string, callback : (response: boolean) => any): void { + this._execute(script, function(data: string) { + return callback(data !== '\n'); + }) + } + + public createData(name: string, value: string, note: string, database: string, callback: (data: string) => any): void { + this.execute(`create data '${name}' setting('${value}','${note}') in ${database}`, callback); + } + public createDatabase(name: string, callback: (data: boolean) => any): void { + this.execute_ignore(`create database '${name}'`, callback); + } + public renameDatabase(database: string, rename: string, callback: (data: boolean) => any): void { + this.execute_ignore(`rename database '${database}' '${rename}'`, callback); + } + public renameData(data: string, rename: string, database: string, callback: (data: boolean) => any): void { + this.execute_ignore(`rename data '${database}' '${rename}' in ${database}`, callback); + } + public findData(name: string, callback: (data: object) => any): void { + this.execute(`find data ${name}`, (data: string) => (callback(data.split("\n")))); + } + public findDatabase(name: string, callback: (data: object) => any): void { + this.execute(`find database ${name}`, (data: string) => callback(data.split("\n"))); + } + public getData(name: string, type: string, database: string, callback: (data: string) => any): void { + this.execute(`get '${name}'.${type} in ${database}`, (data: string) => (callback(data.replace("\n", "")))) + } + public indexData(name: string,database: string, callback : (data : object) => any): void { + this.execute(`index '${name}' in ${database}`, (data: string) => (callback(data.split("\n")))); + } + public deleteData(name: string, database: string, callback: (data: boolean) => any): void { + this.execute_ignore(`delete data '${name}' in ${database}`, callback); + } + public deleteDatabase(name: string, callback: (data: boolean) => any): void { + this.execute_ignore(`delete database ${name}`, callback); + } + public copyDatabase(name: string, target: string, callback: (data: boolean) => any): void { + this.execute_ignore(`copy '${name}' '${target}'`, callback) + } + public listDatabase(callback: (data: object) => any): void { + this.execute('list database', (data: string) => (callback(data.split("\n")))) + } + public listDataFromDatabase(database: string, callback: (data: object) => any): void { + this.execute(`ls ${database}`, (data: string) => (callback(data.split("\n")))) + } +} \ No newline at end of file diff --git a/Node/main.ts b/Node/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..4dac671e850f23bbf466b0dbabea916372e5e301 --- /dev/null +++ b/Node/main.ts @@ -0,0 +1 @@ +export const Driver = require("./drive").default; diff --git a/Node/package.json b/Node/package.json new file mode 100644 index 0000000000000000000000000000000000000000..9797b46a9df8ddeea5ce1eb4888f121b05863641 --- /dev/null +++ b/Node/package.json @@ -0,0 +1,29 @@ +{ + "name": "linwindb", + "version": "1.0.0", + "description": "the node API of Linwin DB Server", + "main": "main.ts", + "scripts": { + "test": "ts-node test.ts" + }, + "repository": { + "type": "git", + "url": "https://gitee.com/LinwinSoft/open-data-api" + }, + "keywords": [ + "Linwin DB Server", + "database", + "api" + ], + "author": "Linwin-cloud & zmh-program", + "license": "Apache-2.0", + "dependencies": { + "http": "^0.0.1-security", + "md5-node": "^1.0.1", + "ts-node": "^10.9.1" + }, + "devDependencies": { + "@types/node": "^18.11.18", + "typescript": "^4.9.5" + } +} diff --git a/Node/test.ts b/Node/test.ts new file mode 100644 index 0000000000000000000000000000000000000000..01b7254048307bf57372ced619919c8f53a3a4b8 --- /dev/null +++ b/Node/test.ts @@ -0,0 +1,12 @@ +const Driver = require("./main"); +const driver = new Driver.Driver( + "root", + "123456", + "127.0.0.1", + 8888, + false, +); + +driver.listDatabase( + console.log +); \ No newline at end of file diff --git a/Python/drive/driver.py b/Python/drive/driver.py index 53784052782a64ba2cb6cd905f356d6374da2c3b..cea73c70414c73ab17f3f22300552616004b93b6 100644 --- a/Python/drive/driver.py +++ b/Python/drive/driver.py @@ -57,26 +57,17 @@ class Driver(object): def __str__(self) -> str: return f"Driver(username={self.username}, password={self.password}, remote={self.remote})" - def listDatabase(self) -> List[str]: - return self.execute("list database").split("\n") - - def deleteDatabase(self, name: str) -> bool: - return self.execute_ignore(f"delete database {name}") - - def deleteData(self, name: str, database: str) -> bool: - return self.execute_ignore(f"delete data '{name}' in {database}") - - def renameDatabase(self, name: str, NewName: str) -> bool: - return self.execute_ignore(f"rename database '{name}' '{NewName}'") - - def renameData(self, name: str, NewName: str, database: str) -> bool: - return self.execute_ignore(f"rename data '{name}' '{NewName}' in {database}") - def createDatabase(self, name: str) -> bool: return self.execute_ignore(f"create database '{name}'") - def createData(self, name: str, database: str) -> bool: - return self.execute_ignore(f"create data '{name}' in {database}") + def createData(self, name: str, value: str, note: str, database: str) -> bool: + return self.execute_ignore(f"create data '{name}' setting('{value}','{note}') in {database}") + + def renameDatabase(self, name: str, rename: str) -> bool: + return self.execute_ignore(f"rename database '{name}' '{rename}'") + + def renameData(self, name: str, rename: str, database: str) -> bool: + return self.execute_ignore(f"rename data '{name}' '{rename}' in {database}") def findDatabase(self, index: str) -> List[str]: return self.execute(f"find database {index}").split("\n") @@ -90,8 +81,17 @@ class Driver(object): def indexData(self, index: str, database: str) -> List[str]: return self.execute(f"index '{index}' in {database}").split("\n") + def deleteDatabase(self, name: str) -> bool: + return self.execute_ignore(f"delete database {name}") + + def deleteData(self, name: str, database: str) -> bool: + return self.execute_ignore(f"delete data '{name}' in {database}") + def copyDatabase(self, name: str, target: str) -> bool: return self.execute_ignore(f"copy '{name}' '{target}'") - def iterFromDatabase(self, database: str) -> Iterable[str]: - return iter(self.execute(f"ls {database}").split("\n")) + def listDatabase(self) -> List[str]: + return self.execute("list database").split("\n") + + def listDataFromDatabase(self, database: str) -> List[str]: + return self.execute(f"ls {database}").split("\n")