2023-05-05 16:47:55 +02:00
import {
2023-05-16 11:48:40 +02:00
ConnectionInfo ,
2023-05-05 16:47:55 +02:00
DatasourceFeature ,
2023-06-28 16:16:47 +02:00
DatasourceFieldType ,
2023-05-05 16:47:55 +02:00
Integration ,
QueryType ,
SqlQuery ,
} from "@budibase/types"
2022-06-01 12:41:41 +02:00
import { Snowflake } from "snowflake-promise"
2022-05-30 22:13:45 +02:00
2022-08-12 18:03:06 +02:00
interface SnowflakeConfig {
account : string
username : string
password : string
warehouse : string
database : string
schema : string
}
2022-05-30 22:13:45 +02:00
2022-08-12 18:03:06 +02:00
const SCHEMA : Integration = {
docs : "https://developers.snowflake.com/" ,
description :
"Snowflake is a solution for data warehousing, data lakes, data engineering, data science, data application development, and securely sharing and consuming shared data." ,
friendlyName : "Snowflake" ,
type : "Relational" ,
2023-05-24 10:50:51 +02:00
features : {
[ DatasourceFeature . CONNECTION_CHECKING ] : true ,
} ,
2022-08-12 18:03:06 +02:00
datasource : {
account : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2022-08-12 18:03:06 +02:00
required : true ,
2022-05-30 22:13:45 +02:00
} ,
2022-08-12 18:03:06 +02:00
username : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2022-08-12 18:03:06 +02:00
required : true ,
2022-05-30 22:13:45 +02:00
} ,
2022-08-12 18:03:06 +02:00
password : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . PASSWORD ,
2022-08-12 18:03:06 +02:00
required : true ,
} ,
2023-05-23 13:38:50 +02:00
role : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2023-05-23 13:38:50 +02:00
} ,
2022-08-12 18:03:06 +02:00
warehouse : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2022-08-12 18:03:06 +02:00
required : true ,
} ,
database : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2022-08-12 18:03:06 +02:00
required : true ,
} ,
schema : {
2023-06-28 16:16:47 +02:00
type : DatasourceFieldType . STRING ,
2022-08-12 18:03:06 +02:00
required : true ,
} ,
} ,
query : {
create : {
type : QueryType . SQL ,
} ,
read : {
type : QueryType . SQL ,
} ,
update : {
type : QueryType . SQL ,
} ,
delete : {
type : QueryType . SQL ,
} ,
} ,
}
2022-05-30 22:13:45 +02:00
2022-08-12 18:03:06 +02:00
class SnowflakeIntegration {
private client : Snowflake
2022-05-30 22:13:45 +02:00
2022-08-12 18:03:06 +02:00
constructor ( config : SnowflakeConfig ) {
this . client = new Snowflake ( config )
}
2022-05-31 14:10:16 +02:00
2023-05-16 11:48:40 +02:00
async testConnection ( ) : Promise < ConnectionInfo > {
2023-05-16 11:40:29 +02:00
try {
await this . client . connect ( )
2023-05-16 11:48:40 +02:00
return { connected : true }
2023-05-16 11:40:29 +02:00
} catch ( e : any ) {
2023-05-16 11:48:40 +02:00
return {
connected : false ,
error : e.message as string ,
}
2023-05-16 11:40:29 +02:00
}
}
2022-08-12 18:03:06 +02:00
async internalQuery ( query : SqlQuery ) {
await this . client . connect ( )
try {
return await this . client . execute ( query . sql )
} catch ( err : any ) {
throw err ? . message . split ( ":" ) [ 1 ] || err ? . message
2022-05-31 14:10:16 +02:00
}
2022-08-12 18:03:06 +02:00
}
2022-05-31 14:10:16 +02:00
2022-08-12 18:03:06 +02:00
async create ( query : SqlQuery ) {
return this . internalQuery ( query )
}
2022-05-31 14:10:16 +02:00
2022-08-12 18:03:06 +02:00
async read ( query : SqlQuery ) {
return this . internalQuery ( query )
}
2022-05-31 14:10:16 +02:00
2022-08-12 18:03:06 +02:00
async update ( query : SqlQuery ) {
return this . internalQuery ( query )
2022-05-30 22:13:45 +02:00
}
2022-08-12 18:03:06 +02:00
async delete ( query : SqlQuery ) {
return this . internalQuery ( query )
2022-05-30 22:13:45 +02:00
}
}
2022-08-12 18:03:06 +02:00
export default {
schema : SCHEMA ,
integration : SnowflakeIntegration ,
}