diff --git a/backend/config/config.exs b/backend/config/config.exs index b1c743f22..be9cb9abb 100644 --- a/backend/config/config.exs +++ b/backend/config/config.exs @@ -28,8 +28,8 @@ config :azimutt, azimutt_github_issues_new: "https://github.com/azimuttapp/azimutt/issues/new", environment: config_env(), # TODO: find an automated process to build it - version: "2.1.10", - version_date: "2024-10-11T00:00:00.000Z", + version: "2.1.11", + version_date: "2024-10-15T00:00:00.000Z", commit_hash: System.cmd("git", ["log", "-1", "--pretty=format:%h"]) |> elem(0) |> String.trim(), commit_message: System.cmd("git", ["log", "-1", "--pretty=format:%s"]) |> elem(0) |> String.trim(), commit_date: System.cmd("git", ["log", "-1", "--pretty=format:%aI"]) |> elem(0) |> String.trim(), diff --git a/backend/lib/azimutt.ex b/backend/lib/azimutt.ex index f169c9e07..aba240777 100644 --- a/backend/lib/azimutt.ex +++ b/backend/lib/azimutt.ex @@ -310,6 +310,20 @@ defmodule Azimutt do ] end + def connectors do + [ + %{id: "postgres", name: "PostgreSQL", color: "#699eca"}, + %{id: "mysql", name: "MySQL", color: "#00758f"}, + %{id: "mariadb", name: "MariaDB", color: "#444b5e"}, + %{id: "sqlserver", name: "SQL Server", color: "#ededee"}, + %{id: "oracle", name: "Oracle", color: "#e61d18"}, + %{id: "mongodb", name: "MongoDB", color: "#20a854"}, + %{id: "couchbase", name: "Couchbase", color: "#ed2226"}, + %{id: "bigquery", name: "BigQuery", color: "#4386fa"}, + %{id: "snowflake", name: "Snowflake", color: "#29b5e8"} + ] + end + def converters do [ %{id: "aml", name: "AML", parse: true, generate: true}, @@ -393,11 +407,19 @@ defmodule Azimutt do %{path: ["api"], name: "API"} ] }, + %{ + path: ["internals"], + name: "Inside Azimutt", + children: [ + %{path: ["infer-relations"], name: "Inferring relations"} + ] + }, %{ path: ["other-tools"], name: "Other tools", children: [ %{path: ["cli"], name: "CLI"}, + %{path: ["gateway"], name: "Gateway"}, %{path: ["converters"], name: "Converters"} ] }, diff --git a/backend/lib/azimutt_web/components/icon.ex b/backend/lib/azimutt_web/components/icon.ex index bdb08499a..2c4a5a980 100644 --- a/backend/lib/azimutt_web/components/icon.ex +++ b/backend/lib/azimutt_web/components/icon.ex @@ -29,6 +29,7 @@ defmodule AzimuttWeb.Components.Icon do "book-open" -> book_open(assigns) "chat-bubble-left-right" -> chat_bubble_left_right(assigns) "check" -> check(assigns) + "check-badge" -> check_badge(assigns) "check-circle" -> check_circle(assigns) "chevron-down" -> chevron_down(assigns) "chevron-right" -> chevron_right(assigns) @@ -537,6 +538,27 @@ defmodule AzimuttWeb.Components.Icon do end end + def check_badge(assigns) do + classes = if assigns[:class], do: " #{assigns[:class]}", else: "" + + case assigns[:kind] do + "outline" -> + ~H""" + <.outline classes={classes}> + """ + + "solid" -> + ~H""" + <.solid classes={classes}> + """ + + _ -> + ~H""" + <.mini classes={classes}> + """ + end + end + def check_circle(assigns) do classes = if assigns[:class], do: " #{assigns[:class]}", else: "" diff --git a/backend/lib/azimutt_web/controllers/website_controller.ex b/backend/lib/azimutt_web/controllers/website_controller.ex index 42f5ded50..04b0879eb 100644 --- a/backend/lib/azimutt_web/controllers/website_controller.ex +++ b/backend/lib/azimutt_web/controllers/website_controller.ex @@ -26,7 +26,41 @@ defmodule AzimuttWeb.WebsiteController do end end - def aml(conn, _params), do: conn |> render("aml.html") + def aml(conn, _params) do + render(conn, "aml.html", + seo: %{ + title: "AML - The easiest DSL for database schemas", + description: "If you ever designed a database schema on a whiteboard, AML is made for you ❤️. It's fast to learn and write, and can be translated to other dialects.", + image: Routes.url(conn) <> "/images/og/aml.jpg" + } + ) + end + + def connectors(conn, _params) do + render(conn, "connectors/index.html", + seo: %{ + title: "Discover all the connectors for Azimutt", + description: + "Azimutt is a database exploration and documentation tool made to help you understand and manage any database. We already have the mainstream ones, and we keep extending the integrations.", + image: Routes.url(conn) <> "/images/og/connectors.jpg" + } + ) + end + + def connector_new(conn, _params), do: conn |> render("connectors/new.html") + + def connector(conn, %{"id" => id}) do + Azimutt.connectors() + |> Enum.find(fn c -> c.id == id end) + |> Result.from_nillable() + |> Result.map(fn connector -> + render(conn, "connectors/#{connector.id}.html", + connector: connector, + seo: %{title: "Explore #{connector.name} with Azimutt"} + ) + end) + end + def converters(conn, _params), do: conn |> render("converters/index.html") def converter(conn, %{"from" => from}) do diff --git a/backend/lib/azimutt_web/router.ex b/backend/lib/azimutt_web/router.ex index 6296ede2a..75c383daf 100644 --- a/backend/lib/azimutt_web/router.ex +++ b/backend/lib/azimutt_web/router.ex @@ -49,8 +49,9 @@ defmodule AzimuttWeb.Router do # get("/analyze", WebsiteController, :analyze) # get("/analyze/rules", WebsiteController, :analyze_rules) # get("/analyze/rules/:id", WebsiteController, :analyze_rule) - # get("/connectors", WebsiteController, :connectors) - # get("/connectors/:id", WebsiteController, :connector) + get("/connectors", WebsiteController, :connectors) + get("/connectors/new", WebsiteController, :connector_new) + get("/connectors/:id", WebsiteController, :connector) get("/converters", WebsiteController, :converters) get("/converters/:from", WebsiteController, :converter) get("/converters/:from/to/:to", WebsiteController, :convert) diff --git a/backend/lib/azimutt_web/templates/sitemap/index.xml.eex b/backend/lib/azimutt_web/templates/sitemap/index.xml.eex index 8108af7a5..ffca565ae 100644 --- a/backend/lib/azimutt_web/templates/sitemap/index.xml.eex +++ b/backend/lib/azimutt_web/templates/sitemap/index.xml.eex @@ -12,6 +12,11 @@ <%= Routes.website_url(@conn, :pricing) %>2023-03-10 <%= Routes.website_url(@conn, :aml) %>2024-09-29 + <%= Routes.website_url(@conn, :connectors) %>2024-10-15 + <%= Routes.website_url(@conn, :connector_new) %>2024-10-15 + <%= for connector <- Azimutt.connectors() do %> + <%= Routes.website_url(@conn, :connector, connector.id) %>2024-10-15 + <% end %> <%= Routes.website_url(@conn, :converters) %>2024-09-29 <%= for parser <- Azimutt.converters() |> Enum.filter(fn c -> c.parse end) do %> <%= Routes.website_url(@conn, :converter, parser.id) %>2024-09-29 diff --git a/backend/lib/azimutt_web/templates/website/_footer.html.heex b/backend/lib/azimutt_web/templates/website/_footer.html.heex index 3db1b6a33..877836734 100644 --- a/backend/lib/azimutt_web/templates/website/_footer.html.heex +++ b/backend/lib/azimutt_web/templates/website/_footer.html.heex @@ -47,7 +47,8 @@
  • AML
  • Azimutt CLI
  • Dialect converters
  • - +
  • Connectors
  • +
  • Browser extension
  • Heroku Add-on
  • Database samples
  • diff --git a/backend/lib/azimutt_web/templates/website/connectors/_article.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_article.html.heex new file mode 100644 index 000000000..34314797a --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_article.html.heex @@ -0,0 +1,24 @@ +
    + ← All connectors +

    <%= @title %>

    +
    + <%= if !Enum.empty?(@features) do %> +

    + <%= for feature <- @features do %> + <%= if feature.available do %> + + <%= feature.name %> + + + <% else %> + + <%= feature.name %> + + + <% end %> + <% end %> +

    + <% end %> + <%= @inner_content %> +
    +
    diff --git a/backend/lib/azimutt_web/templates/website/connectors/_card.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_card.html.heex new file mode 100644 index 000000000..5272992d9 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_card.html.heex @@ -0,0 +1,12 @@ +
    + {"#{@connector.name} +
    +

    + + + <%= @connector.name %> + +

    +

    <%= render "connectors/_description-short.html", conn: @conn, connector: @connector %>

    +
    +
    diff --git a/backend/lib/azimutt_web/templates/website/connectors/_description-short.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_description-short.html.heex new file mode 100644 index 000000000..ab5b636c0 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_description-short.html.heex @@ -0,0 +1,22 @@ +<%= cond do %> + <% @connector.id == "postgres" -> %> + The most powerful open-source relational database, known for extensibility and SQL compliance. Now explorable with Azimutt. + <% @connector.id == "mysql" -> %> + The world's most popular open-source relational database, widely used for web applications. Now accessible within Azimutt. + <% @connector.id == "mariadb" -> %> + An open-source fork of MySQL with improved performance, scalability, and open development. Also available to connect to Azimutt. + <% @connector.id == "sqlserver" -> %> + A robust, enterprise-grade relational database by Microsoft, with integrated analytics and management tools. Integrated in Azimutt. + <% @connector.id == "oracle" -> %> + A high-performance relational database widely used in enterprises for mission-critical applications. Uniquely explorable with Azimutt. + <% @connector.id == "mongodb" -> %> + A NoSQL database designed for flexible, document-oriented storage and scalability. Collection schema and relations are inferred in Azimutt. + <% @connector.id == "couchbase" -> %> + A distributed NoSQL database optimized for interactive applications and real-time analytics. Infer collection schema and relations. + <% @connector.id == "bigquery" -> %> + Google’s fully-managed, serverless data warehouse for large-scale analytics using SQL. Discover your datasets with Azimutt. + <% @connector.id == "snowflake" -> %> + A cloud-native data platform for seamless data warehousing, sharing, and analytics. Easily explorable with this Azimutt connector. + <% true -> %> + This connector makes <%= @connector.name %> schema and data exploration seamless, using Azimutt nice diagrams and great documentation. +<% end %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/_footer.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_footer.html.heex new file mode 100644 index 000000000..cb54b5850 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_footer.html.heex @@ -0,0 +1,13 @@ +
    +
    +

    Other connectors you may want to check:

    +
    + +
    + <%= for connector <- Azimutt.connectors() |> Enum.filter(fn c -> c.id != @connector.id end) |> Enum.shuffle() |> Enum.take(3) do %> + <%= render "connectors/_card.html", conn: @conn, connector: connector %> + <% end %> +
    +
    + +<%= render "_footer.html", conn: @conn %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/_header.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_header.html.heex new file mode 100644 index 000000000..15d4461da --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_header.html.heex @@ -0,0 +1,3 @@ +
    + {"#{@connector.name} +
    diff --git a/backend/lib/azimutt_web/templates/website/connectors/_promo.html.heex b/backend/lib/azimutt_web/templates/website/connectors/_promo.html.heex new file mode 100644 index 000000000..97f51c81a --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/_promo.html.heex @@ -0,0 +1,5 @@ +
    + Azimutt is making the first database explorer targeted for real world databases: large, heterogeneous and messy 😅 + If you ever looked for an Entity-Relationship diagram tool (ERD) or drew your database schema on a sheet or whiteboard, Azimutt is made for you. + But it goes well beyond that with database documentation, cross-database data exploration and even linter and monitoring of your database. +
    diff --git a/backend/lib/azimutt_web/templates/website/connectors/bigquery.html.heex b/backend/lib/azimutt_web/templates/website/connectors/bigquery.html.heex new file mode 100644 index 000000000..33ddf0c16 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/bigquery.html.heex @@ -0,0 +1,52 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Statistics", available: false}, + %{name: "Query history", available: false}, + %{name: "Query data", available: true} +] do %> +

    + BigQuery is Google Cloud's fully-managed, + serverless data warehouse designed for large-scale analytics and business intelligence. + It enables users to quickly analyze massive datasets using SQL without worrying about infrastructure management. + BigQuery is ideal for organizations that need to run complex queries on large volumes of data, offering near real-time insights with fast querying speeds. +

    + <%= render "connectors/_promo.html" %> +

    + The BigQuery connector + on GitHub if you are interested in how it works, or improving it.
    + You will most likely want to have a look at the getSchema function in + src/bigquery.ts. +

    +

    + Few people know and use it but BigQuery has relations. They are not enforced like foreign keys on relational databases, but they help understand your data model.
    + You will most likely not have them, and Azimutt will infer the relations it can for you, + but it could be a good idea to report them back to BigQuery as the golden source of truth. +

    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The BigQuery connector is already included in the Azimutt Gateway, use it following these steps:

    +
      +
    • Launch your Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Download your account key on your computer
    • +
    • + Fill your BigQuery database url (ex: bigquery://bigquery.googleapis.com/your_project?key=path/to/key.json)
      + You can add additional paramters to your url to control the connector behavior: +
        +
      • dataset: filter the datasets to inspect, supports the LIKE syntax
      • +
      • table: filter the tables to inspect, supports the LIKE syntax
      • +
      +
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    + Here is an example of what you can achieve with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/couchbase.html.heex b/backend/lib/azimutt_web/templates/website/connectors/couchbase.html.heex new file mode 100644 index 000000000..ac9b9cd9a --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/couchbase.html.heex @@ -0,0 +1,49 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Collections", available: true}, + %{name: "Statistics", available: false}, + %{name: "Query history", available: false}, + %{name: "Query data", available: true} +] do %> +

    + Couchbase is a high-performance NoSQL database + that combines the flexibility of document-oriented storage with the power of a distributed architecture. + With features like memory-first architecture, integrated caching, and SQL-like querying with N1QL, + Couchbase provides a flexible and efficient solution for modern, data-driven applications that demand speed and reliability. +

    + <%= render "connectors/_promo.html" %> +

    + As a document-oriented database, Couchbase has no formal schema, + so the Couchbase connector + has to iterate over all buckets, scopes and collections to fetch a sample of documents and infer their schema.
    + If collections have an implicit schema, it works really well. If they don't, well, it reflects that also 😬
    + You can check what it does by looking at the getSchema function in the + src/couchbase.ts file. +

    +

    + If you stored different entities inside the same collection, using a field to identify them, the Couchbase connector is able to create several entities out of one collection. + You just have to specify the field name in the `discriminator` attribute in your database url. +

    +

    + Couchbase has no foreign keys defined in the database. Still you can reference entities by storing their ids. + If you do, and follow a naming convention, Azimutt is able to suggest missing relations, making the exploration experience a lot better. + If not, you can still add them manually in Azimutt using AML, this is not a fun work, but it's a good documentation investment ^^ +

    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The Couchbase connector is already included in the Azimutt Gateway, so you just have to:

    +
      +
    • Launch the Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your Couchbase database url (ex: couchbases://user:pass@ej137.couchbase.com)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    + Here is an example of what you can do using Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/index.html.heex b/backend/lib/azimutt_web/templates/website/connectors/index.html.heex new file mode 100644 index 000000000..d495dd2d5 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/index.html.heex @@ -0,0 +1,81 @@ +
    + + +
    +
    +
    +
    +

    <%= @seo.title %>

    +

    + <%= @seo.description %> + If yours is not available, please reach out. +

    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    All connectors

    +
    + +
    + <%= for connector <- Azimutt.connectors() do %> + <%= render "connectors/_card.html", conn: @conn, connector: connector %> + <% end %> +
    + New connector icon +
    +

    + + + Need another one? + +

    +

    You can request it or make it on your own. Check the documentation and/or get in touch to find the best way forward.

    +
    +
    +
    +
    + +<%= render "_footer.html", conn: @conn %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/mariadb.html.heex b/backend/lib/azimutt_web/templates/website/connectors/mariadb.html.heex new file mode 100644 index 000000000..36175cdf4 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/mariadb.html.heex @@ -0,0 +1,50 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Statistics", available: true}, + %{name: "Query history", available: false}, + %{name: "Triggers", available: false}, + %{name: "Procedures", available: false}, + %{name: "Query data", available: true}, +] do %> +

    + MariaDB is an open-source database that + started as a fork of MySQL, offering enhanced performance, security, and scalability. + MariaDB maintains full compatibility with MySQL while introducing advanced features, such as improved storage engines and better query optimization. + It’s highly flexible, supporting various storage formats and workloads, making it a reliable choice for developers looking to build scalable, secure applications. +

    + <%= render "connectors/_promo.html" %> +

    + The MariaDB connector + is available on Azimutt GitHub repository (Open Source FTW 🤘), you can have a look at it and even suggest improvements.
    + In this case, you will be interested in the getSchema function in + src/mariadb.ts + that makes everything necessary to extract the MariaDB schema. +

    +

    Beyond the schema extraction, the MariaDB connector also infers:

    +
      +
    • Polymorphic relations
    • +
    • JSON column schema
    • +
    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The Gateway already integrates the MariaDB connector, you just have to follow these steps to use it:

    +
      +
    • Launch your Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your MariaDB database url (ex: mariadb://user:pass@localhost:3306/your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you don't have a MariaDB database right away, you can use Docker to create one with:

    +
    docker run --name mariadb_sample -p 3307:3306 -e MARIADB_ROOT_PASSWORD=mariadb -e MARIADB_USER=azimutt -e MARIADB_PASSWORD=azimutt -e MARIADB_DATABASE=mariadb_sample mariadb:latest
    +

    And use this sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/mongodb.html.heex b/backend/lib/azimutt_web/templates/website/connectors/mongodb.html.heex new file mode 100644 index 000000000..31c69d242 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/mongodb.html.heex @@ -0,0 +1,52 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Collections", available: true}, + %{name: "Statistics", available: false}, + %{name: "Query history", available: false}, + %{name: "Query data", available: true} +] do %> +

    + MongoDB is a popular NoSQL database designed for applications + that need flexible, scalable, and high-performance storage. + Unlike traditional relational databases, MongoDB stores data in a document-oriented format using JSON-like structures, making it ideal for handling unstructured data. + With built-in features like sharding, replication, and high availability, MongoDB provides a powerful solution for managing large datasets in dynamic environments. +

    + <%= render "connectors/_promo.html" %> +

    + As MongoDB has no formal schema, the MongoDB connector + iterate over all collections and fetch a sample of documents on each to infer its schema.
    + If collections have an implicit schema, it works really well. If they don't, well, it reflects that also 😬
    + You can look at what it does by looking at the getSchema function in the + src/mongodb.ts file. +

    +

    Azimutt not only handles flat tables but also has nested fields, making it quite good for JSON-like structure like in MongoDB.

    +

    + If you stored several entities in the same collection using a field to identify them, + the MongoDB connector is able to create several entities out of one collection if you specify this field name in the `discriminator` attribute in your database url. +

    +

    + MongoDB has no foreign keys in the database. Still you can reference entities by storing their ids. + If you do, and follow a naming convention, Azimutt will suggest missing relations, improving a lot the exploration experience. + If not, you can still add them manually in Azimutt using AML, this is not a fun work, but it's a good documentation investment ^^ +

    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    Using the MongoDB connector in Azimutt is quite easy:

    +
      +
    • Launch the Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your MongoDB database url (ex: mongodb://user:pass@localhost:27017/your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you don't have a MongoDB database, you can launch one with Docker:

    +
    docker run --name mongo_sample -p 27017:27017 mongo:latest
    +

    And here is a sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/mysql.html.heex b/backend/lib/azimutt_web/templates/website/connectors/mysql.html.heex new file mode 100644 index 000000000..1ac373f1c --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/mysql.html.heex @@ -0,0 +1,50 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Statistics", available: true}, + %{name: "Query history", available: false}, + %{name: "Triggers", available: false}, + %{name: "Procedures", available: false}, + %{name: "Query data", available: true}, +] do %> +

    + MySQL is the world’s most popular open-source relational database, + widely used for web development and other applications requiring a reliable and high-performance data storage. + Known for its ease of use, MySQL is often the go-to choice for developers building websites, blogs, and e-commerce platforms. + With features like replication, clustering, and robust security, MySQL provides scalability and stability for applications of any size. +

    + <%= render "connectors/_promo.html" %> +

    + You can find the MySQL connector + on the Azimutt GitHub repository if you are interested in looking what it does or improving it.
    + If so, you will most probably want to have a look at the + src/mysql.ts + getSchema function, which does exactly what you think 😉 +

    +

    In addition to MySQL schema extraction it also infers:

    +
      +
    • Polymorphic relations
    • +
    • JSON column schema
    • +
    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The MySQL connector is baked into the Gateway, to use it you just have to:

    +
      +
    • Launch your Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your MySQL database url (ex: mysql://user:pass@localhost:3306/your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you don't have a MySQL database right away, you can use Docker to create one with:

    +
    docker run --name mysql_sample -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_USER=azimutt -e MYSQL_PASSWORD=azimutt -e MYSQL_DATABASE=mysql_sample mysql:latest
    +

    And use this sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/new.html.heex b/backend/lib/azimutt_web/templates/website/connectors/new.html.heex new file mode 100644 index 000000000..a3311d362 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/new.html.heex @@ -0,0 +1,36 @@ +<% connector = %{id: "new", name: "New connector", color: "#fff"} %> +<%= render "connectors/_header.html", conn: @conn, connector: connector %> + +<%= connector_article conn: @conn, title: "New connector", features: [] do %> +

    Missing a database connector?

    +

    + Azimutt is modular and database connectors are not even embed in the service but in the gateway, remember, you should launch it with npx azimutt@latest gateway.
    + This is just the CLI + published on npm + and launching the gateway. + But of course, you can clone the repo, launch the gateway from the code and add your own connector. +

    + <%= render "docs/_h3.html", title: "Asking for a new connector" %> +

    + We regularly make new connectors, depending on customer or community requests.
    + If you need one not existing yet, check for the + already required ones + and add your voice (reaction & comment), so we know about their popularity.
    + If not requested yet, create an issue so others can add their voice to yours. +

    + <%= render "docs/_h3.html", title: "Creating your connector" %> +

    + If you need a connector fast and are willing to invest a bit of time, you can make it on your own, and either keep it for you or contribute to the community by submitting a PR.
    + The hardest part is always finding a way to extract the schema. Most of the time it's done thought system table (INFORMATION_SCHEMA or more specific ones), + but sometimes it's pure inference when the database has no explicit schema like MongoDB + or Couchbase.
    + Once you know how to extract the schema, you just need to create a new project and implement the getSchema: (application: string, url: DatabaseUrlParsed): Promise<Database> function. + You can look ath the PostgreSQL + or MongoDB connector as inspiration. +

    +

    + In any way, don't hesitate to reach out for any question. +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/oracle.html.heex b/backend/lib/azimutt_web/templates/website/connectors/oracle.html.heex new file mode 100644 index 000000000..91c4581f5 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/oracle.html.heex @@ -0,0 +1,51 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Types", available: true}, + %{name: "Statistics", available: true}, + %{name: "Query history", available: false}, + %{name: "Triggers", available: false}, + %{name: "Procedures", available: false}, + %{name: "Query data", available: true}, +] do %> +

    + Oracle is a powerful, enterprise-grade relational database + designed for handling mission-critical applications and large-scale data. + Known for its exceptional performance, scalability, and advanced security, it has features like real-time data processing and multi-model data support, + providing businesses a robust solution to efficiently manage and analyze large volumes of data while ensuring security and compliance. +

    + <%= render "connectors/_promo.html" %> +

    + The Oracle connector + is available on Azimutt GitHub. Feel free to have a look and even suggest improvements.
    + The heart of its behavior is the getSchema in + src/oracle.ts file. + It gets the Oracle schema. +

    +

    Not only it gets the database schema, but it also infers:

    +
      +
    • Polymorphic relations
    • +
    • JSON column schema
    • +
    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    Using the Oracle connector in Azimutt is really easy:

    +
      +
    • Launch the Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your Oracle database url (ex: oracle:thin:user/pass@localhost:1521/FREE)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you miss an Oracle database, you can launch a free one with Docker:

    +
    docker run --name oracle_sample -p 1521:1521 -e ORACLE_PWD=oracle container-registry.oracle.com/database/free:23.4.0.0-lite
    +

    You can use this sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/postgres.html.heex b/backend/lib/azimutt_web/templates/website/connectors/postgres.html.heex new file mode 100644 index 000000000..5ba17027c --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/postgres.html.heex @@ -0,0 +1,52 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Types", available: true}, + %{name: "Statistics", available: true}, + %{name: "Query history", available: true}, + %{name: "Triggers", available: false}, + %{name: "Procedures", available: false}, + %{name: "Query data", available: true}, +] do %> +

    + PostgreSQL is a powerful, open-source relational database + that is widely used for its reliability, scalability, and advanced features. + Known for being highly SQL-compliant, it supports both structured and unstructured data, making it ideal for a wide range of applications, from web development to data analytics. + Its robust architecture allows developers to extend its functionality, plus, its active community ensures continuous improvement and support. +

    + <%= render "connectors/_promo.html" %> +

    The PostgreSQL connector is full-featured and can do everything available in Azimutt 😎

    +

    + Azimutt being Open Source, you can find the + PostgreSQL connector + on GitHub if you are interested in looking what it does or improving it.
    + The most interesting part being the getSchema function in + src/postgres.ts. +

    +

    In addition to PostgreSQL schema extraction it makes inference for:

    +
      +
    • Polymorphic relations
    • +
    • JSON column schema
    • +
    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The PostgreSQL connector is baked into the Gateway, to use it you just have to:

    +
      +
    • Launch your Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your PostgreSQL database url (ex: postgresql://user:pass@localhost/your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you don't have a PostgreSQL database right away, you can use Docker to create one with:

    +
    docker run --name postgres_sample -p 5433:5432 -e POSTGRES_PASSWORD=postgres postgres:latest
    +

    And use this sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/snowflake.html.heex b/backend/lib/azimutt_web/templates/website/connectors/snowflake.html.heex new file mode 100644 index 000000000..47688ad68 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/snowflake.html.heex @@ -0,0 +1,38 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Statistics", available: false}, + %{name: "Query history", available: false}, + %{name: "Query data", available: true} +] do %> +

    + Snowflake is a cloud-native data platform built for data warehousing, analytics, and seamless data sharing. + Unlike traditional databases, Snowflake is designed to take full advantage of cloud infrastructure, offering scalability, flexibility, and ease of use. + Snowflake’s unique architecture separates storage from compute, allowing users to scale resources independently for optimal performance and cost efficiency. +

    + <%= render "connectors/_promo.html" %> +

    + Azimutt is full Open Source, you can check the Snowflake connector + on GitHub, if you want to have a look, and even suggest improvements.
    + The part you will be interested in is the getSchema function in + src/snowflake.ts. +

    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The Snowflake connector is baked in the Azimutt Gateway, to use it, just:

    +
      +
    • Launch your Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your Snowflake database url (ex: snowflake://user:pass@your_account.snowflakecomputing.com?db=your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    + Here is an example of what you can achieve with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/connectors/sqlserver.html.heex b/backend/lib/azimutt_web/templates/website/connectors/sqlserver.html.heex new file mode 100644 index 000000000..103d8f14b --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/connectors/sqlserver.html.heex @@ -0,0 +1,47 @@ +<%= render "connectors/_header.html", conn: @conn, connector: @connector %> + +<%= connector_article conn: @conn, title: @seo.title, features: [ + %{name: "Tables", available: true}, + %{name: "Relations", available: true}, + %{name: "Statistics", available: false}, + %{name: "Query history", available: false}, + %{name: "Triggers", available: false}, + %{name: "Procedures", available: false}, + %{name: "Query data", available: true}, +] do %> +

    + SQL Server is a powerful, + enterprise-level relational database developed by Microsoft, used for handling large-scale business applications and data analytics. + Known for its seamless integration with other Microsoft tools, such as Azure, Excel, and Power BI, + SQL Server provides a robust solution for both transactional processing and business intelligence. + It offers high availability, built-in security features, and advanced analytics capabilities. +

    + <%= render "connectors/_promo.html" %> +

    + You can access the SQL Server connector + on GitHub, have a look and even suggest improvements.
    + The most interesting part is the getSchema function in + src/sqlserver.ts + that fetch the SQL Server schema and make it accessible to Azimutt. +

    +

    Moreover, it also infers JSON column schema when found columns with JSON inside.

    + + <%= render "docs/_h3.html", title: "How to use it" %> +

    The SQL Server connector is already included in the Gateway, you can use it simply by:

    +
      +
    • Launching the Gateway, if needed (for the local one use npx azimutt@latest gateway)
    • +
    • Create a new project or add a source to an existing one
    • +
    • Fill your SQL Server database url (ex: sqlserver://user:pass@localhost:1433/your_db or Server=localhost,1433;User Id=user;Password=pass;Database=your_db)
    • +
    + Azimutt create project +

    Here are more details about how Azimutt secure your data and especially your database url.

    +

    If you don't have a SQL Server database available, you can create one with Docker:

    +
    docker run --name mssql_sample -p 1433:1433 -e ACCEPT_EULA=Y -e MSSQL_SA_PASSWORD=azimutt_42 -e MSSQL_PID=Evaluation mcr.microsoft.com/mssql/server:2022-latest
    +

    And use this sample script to populate it.

    +

    + Here is what you can do with Azimutt: + Azimutt diagram +

    +<% end %> + +<%= render "connectors/_footer.html", conn: @conn, connector: @connector %> diff --git a/backend/lib/azimutt_web/templates/website/converters/index.html.heex b/backend/lib/azimutt_web/templates/website/converters/index.html.heex index 82265c535..acfb014fb 100644 --- a/backend/lib/azimutt_web/templates/website/converters/index.html.heex +++ b/backend/lib/azimutt_web/templates/website/converters/index.html.heex @@ -14,7 +14,7 @@ <%= for converter <- Azimutt.converters() |> Enum.filter(fn c -> c.parse end) do %>
    - {"#{converter.name} + {"#{converter.name}
    diff --git a/backend/lib/azimutt_web/templates/website/docs/gateway.html.heex b/backend/lib/azimutt_web/templates/website/docs/gateway.html.heex new file mode 100644 index 000000000..b964f6d5b --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/docs/gateway.html.heex @@ -0,0 +1,7 @@ +<%= render "docs/_header.html", conn: @conn, page: @page %> + +<%= doc_prose do %> +

    Work In Progress 😅

    +<% end %> + +<%= render "docs/_footer.html", conn: @conn, page: @page, prev: @prev, next: @next %> diff --git a/backend/lib/azimutt_web/templates/website/docs/infer-relations.html.heex b/backend/lib/azimutt_web/templates/website/docs/infer-relations.html.heex new file mode 100644 index 000000000..b6b5fc569 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/docs/infer-relations.html.heex @@ -0,0 +1,74 @@ +<%= render "docs/_header.html", conn: @conn, page: @page %> + +<%= doc_prose do %> +

    + Databases relations are not always defined in the database schema, + sometimes because the database engine doesn't support them (MongoDB, Couchbase...), + sometimes because the developers decided or forgot to create them (performance?). +

    +

    + Still they are very important to understand the data model and help a lot for the database exploration, + so you can add them on Azimutt (using AML), even if they are not enforced by your database. +

    +

    + To help with that, Azimutt will do its best to identify them and suggest them. + But it will never add they on its own, as false-positive may be very misleading. + Here is how it does: +

    + + <%= render "docs/_h2.html", title: "Naming conventions" %> +

    + It's quite common that attributes storing a reference to another entity reference the entity primary key (often id) and are named with the entity name and attribute name.
    + For example, a project_id attribute will likely reference the id attribute of the projects entity. +

    +

    + Azimutt is smart enough to handle different naming styles (camel case, snake case...), pluralization and even added prefixes/suffixes.
    + So attributes like previous_project_id and ProjectIds + will match entities named projects, Project or even legacy_projects having attributes like id or project_id.
    + Of course, attributes like author, owner or admin will hardly be identified. + Azimutt has a special case for attributes ending by by, like created_by, it will look for tables like users or accounts.
    + Here is the + code + and tests + for the Explorer (Elm), and the + code + and test + for the Analyzer (TypeScript). +

    +

    Let us know if you have a naming convention not well-supported, we will be happy to add it. You can even submit a PR 😉 (tests are the most important part).

    + + <%= render "docs/_h2.html", title: "Join clauses" %> + <%= doc_warning do %> + Not implemented yet! + <% end %> +

    + As naming conventions are not always followed, another way to find relations is by inspecting database queries. + In the case of relational databases, a JOIN clause may hint for a relation. + That's why accessing historical queries is important but Azimutt could also offer you to import the queries you could have gathered by any means. +

    +

    Let us know if this is crucial for you, so we can prioritize it over other features.

    + + <%= render "docs/_h2.html", title: "Unique ids" %> + <%= doc_warning do %> + Not implemented yet! + <% end %> +

    + For databases without joins and which don't follow clear naming conventions, like MongoDB or Couchbase, documenting relations is still a big issue. + After several discussions, it should be possible to infer relations using unique ids (like UUIDs or MongoDB ObjectId).
    + First, we have to identify these columns (database type or pattern in most common values), then we can look for them in all tables with a single attribute primary key having the same type.
    + Then, if there is a match, thanks to unique ids, it's very likely a relation. +

    +

    + For example, if the author column contains UUIDs, we can look in all other tables if a specific id is found in their primary key. + When it's found, for example in the users entity, this relation will be suggestion.
    + As this can be heavy for large databases, this process will be launched on demand and for specific fields. +

    +

    What do you think about it? Will it help you? Let us know, so we can prioritize it over other features.

    + +

    + If you have any other idea to automatically identify relations, especially on schemaless environments, + let us know, and we will happily evaluate and implement them on usage. +

    +<% end %> + +<%= render "docs/_footer.html", conn: @conn, page: @page, prev: @prev, next: @next %> diff --git a/backend/lib/azimutt_web/templates/website/docs/internals.html.heex b/backend/lib/azimutt_web/templates/website/docs/internals.html.heex new file mode 100644 index 000000000..72d97a144 --- /dev/null +++ b/backend/lib/azimutt_web/templates/website/docs/internals.html.heex @@ -0,0 +1,9 @@ +<%= render "docs/_header.html", conn: @conn, page: @page %> + +<%= doc_prose do %> +

    + Here is some explanation of how Azimutt works on specific topics: +

    +<% end %> + +<%= render "docs/_footer.html", conn: @conn, page: @page, prev: @prev, next: @next %> diff --git a/backend/lib/azimutt_web/views/layout_view.ex b/backend/lib/azimutt_web/views/layout_view.ex index 32c4a80dc..87cf30655 100644 --- a/backend/lib/azimutt_web/views/layout_view.ex +++ b/backend/lib/azimutt_web/views/layout_view.ex @@ -37,7 +37,7 @@ defmodule AzimuttWeb.LayoutView do # ratio: 2:1, ex: 1200x600 def og_image(%{assigns: %{seo: %{image: image}}}), do: image - def og_image(conn), do: Routes.static_url(conn, "/images/open-graph.png") + def og_image(conn), do: Routes.static_url(conn, "/images/og/azimutt.jpg") def twitter_card(%{assigns: %{seo: %{card: card}}}), do: card def twitter_card(_conn), do: "summary_large_image" diff --git a/backend/lib/azimutt_web/views/website_view.ex b/backend/lib/azimutt_web/views/website_view.ex index 04b271746..e8c75854a 100644 --- a/backend/lib/azimutt_web/views/website_view.ex +++ b/backend/lib/azimutt_web/views/website_view.ex @@ -29,6 +29,8 @@ defmodule AzimuttWeb.WebsiteView do def doc_info(assigns \\ %{}, do: block), do: render_template("docs/_info.html", assigns, block) def doc_warning(assigns \\ %{}, do: block), do: render_template("docs/_warning.html", assigns, block) + def connector_article(assigns \\ %{}, do: block), do: render_template("connectors/_article.html", assigns, block) + defp render_template(template, assigns, block) do assigns = assigns |> Map.new() |> Map.put(:inner_content, block) AzimuttWeb.WebsiteView.render(template, assigns) diff --git a/backend/priv/static/images/connectors/azimutt-diagram.png b/backend/priv/static/images/connectors/azimutt-diagram.png new file mode 100644 index 000000000..8e57ab3ed Binary files /dev/null and b/backend/priv/static/images/connectors/azimutt-diagram.png differ diff --git a/backend/priv/static/images/connectors/azimutt-project-new.png b/backend/priv/static/images/connectors/azimutt-project-new.png new file mode 100644 index 000000000..2611b90e8 Binary files /dev/null and b/backend/priv/static/images/connectors/azimutt-project-new.png differ diff --git a/backend/priv/static/images/connectors/bigquery-banner.png b/backend/priv/static/images/connectors/bigquery-banner.png new file mode 100644 index 000000000..b5916046c Binary files /dev/null and b/backend/priv/static/images/connectors/bigquery-banner.png differ diff --git a/backend/priv/static/images/connectors/bigquery-icon.svg b/backend/priv/static/images/connectors/bigquery-icon.svg new file mode 100644 index 000000000..7f3d97fb9 --- /dev/null +++ b/backend/priv/static/images/connectors/bigquery-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/backend/priv/static/images/connectors/couchbase-banner.png b/backend/priv/static/images/connectors/couchbase-banner.png new file mode 100644 index 000000000..c0cd53f99 Binary files /dev/null and b/backend/priv/static/images/connectors/couchbase-banner.png differ diff --git a/backend/priv/static/images/connectors/couchbase-icon.svg b/backend/priv/static/images/connectors/couchbase-icon.svg new file mode 100644 index 000000000..4248913f5 --- /dev/null +++ b/backend/priv/static/images/connectors/couchbase-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/backend/priv/static/images/connectors/illustration-1.jpg b/backend/priv/static/images/connectors/illustration-1.jpg new file mode 100644 index 000000000..36f23d97f Binary files /dev/null and b/backend/priv/static/images/connectors/illustration-1.jpg differ diff --git a/backend/priv/static/images/connectors/illustration-2.jpg b/backend/priv/static/images/connectors/illustration-2.jpg new file mode 100644 index 000000000..48225efa5 Binary files /dev/null and b/backend/priv/static/images/connectors/illustration-2.jpg differ diff --git a/backend/priv/static/images/connectors/illustration-3.jpg b/backend/priv/static/images/connectors/illustration-3.jpg new file mode 100644 index 000000000..e89f5d176 Binary files /dev/null and b/backend/priv/static/images/connectors/illustration-3.jpg differ diff --git a/backend/priv/static/images/connectors/illustration-4.jpg b/backend/priv/static/images/connectors/illustration-4.jpg new file mode 100644 index 000000000..a90ac315a Binary files /dev/null and b/backend/priv/static/images/connectors/illustration-4.jpg differ diff --git a/backend/priv/static/images/connectors/illustration-5.jpg b/backend/priv/static/images/connectors/illustration-5.jpg new file mode 100644 index 000000000..aa83d8a70 Binary files /dev/null and b/backend/priv/static/images/connectors/illustration-5.jpg differ diff --git a/backend/priv/static/images/connectors/mariadb-banner.png b/backend/priv/static/images/connectors/mariadb-banner.png new file mode 100644 index 000000000..3d5d4c33d Binary files /dev/null and b/backend/priv/static/images/connectors/mariadb-banner.png differ diff --git a/backend/priv/static/images/connectors/mariadb-icon.svg b/backend/priv/static/images/connectors/mariadb-icon.svg new file mode 100644 index 000000000..d06eac07e --- /dev/null +++ b/backend/priv/static/images/connectors/mariadb-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/backend/priv/static/images/connectors/mongodb-banner.png b/backend/priv/static/images/connectors/mongodb-banner.png new file mode 100644 index 000000000..0690e124a Binary files /dev/null and b/backend/priv/static/images/connectors/mongodb-banner.png differ diff --git a/backend/priv/static/images/connectors/mongodb-icon.svg b/backend/priv/static/images/connectors/mongodb-icon.svg new file mode 100644 index 000000000..1f0456947 --- /dev/null +++ b/backend/priv/static/images/connectors/mongodb-icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/backend/priv/static/images/connectors/mysql-banner.png b/backend/priv/static/images/connectors/mysql-banner.png new file mode 100644 index 000000000..4942ce4a8 Binary files /dev/null and b/backend/priv/static/images/connectors/mysql-banner.png differ diff --git a/backend/priv/static/images/connectors/mysql-icon.svg b/backend/priv/static/images/connectors/mysql-icon.svg new file mode 100644 index 000000000..aa1985d55 --- /dev/null +++ b/backend/priv/static/images/connectors/mysql-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/backend/priv/static/images/connectors/new-banner.png b/backend/priv/static/images/connectors/new-banner.png new file mode 100644 index 000000000..31eae1125 Binary files /dev/null and b/backend/priv/static/images/connectors/new-banner.png differ diff --git a/backend/priv/static/images/connectors/new-icon.svg b/backend/priv/static/images/connectors/new-icon.svg new file mode 100644 index 000000000..5ec73f243 --- /dev/null +++ b/backend/priv/static/images/connectors/new-icon.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/priv/static/images/connectors/oracle-banner.png b/backend/priv/static/images/connectors/oracle-banner.png new file mode 100644 index 000000000..af9dc56dd Binary files /dev/null and b/backend/priv/static/images/connectors/oracle-banner.png differ diff --git a/backend/priv/static/images/connectors/oracle-icon.svg b/backend/priv/static/images/connectors/oracle-icon.svg new file mode 100644 index 000000000..47f9ea220 --- /dev/null +++ b/backend/priv/static/images/connectors/oracle-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/backend/priv/static/images/connectors/postgres-banner.png b/backend/priv/static/images/connectors/postgres-banner.png new file mode 100644 index 000000000..608553b63 Binary files /dev/null and b/backend/priv/static/images/connectors/postgres-banner.png differ diff --git a/backend/priv/static/images/connectors/postgres-icon.svg b/backend/priv/static/images/connectors/postgres-icon.svg new file mode 100644 index 000000000..f61563a78 --- /dev/null +++ b/backend/priv/static/images/connectors/postgres-icon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/backend/priv/static/images/connectors/snowflake-banner.png b/backend/priv/static/images/connectors/snowflake-banner.png new file mode 100644 index 000000000..4ac65846d Binary files /dev/null and b/backend/priv/static/images/connectors/snowflake-banner.png differ diff --git a/backend/priv/static/images/connectors/snowflake-icon.svg b/backend/priv/static/images/connectors/snowflake-icon.svg new file mode 100644 index 000000000..01cc445cb --- /dev/null +++ b/backend/priv/static/images/connectors/snowflake-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/backend/priv/static/images/connectors/sqlserver-banner.png b/backend/priv/static/images/connectors/sqlserver-banner.png new file mode 100644 index 000000000..4c65e5822 Binary files /dev/null and b/backend/priv/static/images/connectors/sqlserver-banner.png differ diff --git a/backend/priv/static/images/connectors/sqlserver-icon.svg b/backend/priv/static/images/connectors/sqlserver-icon.svg new file mode 100644 index 000000000..6573624ca --- /dev/null +++ b/backend/priv/static/images/connectors/sqlserver-icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/priv/static/images/og/aml.jpg b/backend/priv/static/images/og/aml.jpg new file mode 100644 index 000000000..2ad306035 Binary files /dev/null and b/backend/priv/static/images/og/aml.jpg differ diff --git a/backend/priv/static/images/og/azimutt-alt.jpg b/backend/priv/static/images/og/azimutt-alt.jpg new file mode 100644 index 000000000..99ecbab11 Binary files /dev/null and b/backend/priv/static/images/og/azimutt-alt.jpg differ diff --git a/backend/priv/static/images/og/azimutt.jpg b/backend/priv/static/images/og/azimutt.jpg new file mode 100644 index 000000000..2468a51a9 Binary files /dev/null and b/backend/priv/static/images/og/azimutt.jpg differ diff --git a/backend/priv/static/images/og/connectors.jpg b/backend/priv/static/images/og/connectors.jpg new file mode 100644 index 000000000..d79be5cc6 Binary files /dev/null and b/backend/priv/static/images/og/connectors.jpg differ diff --git a/backend/priv/static/images/open-graph.png b/backend/priv/static/images/open-graph.png deleted file mode 100644 index 7e1e99e62..000000000 Binary files a/backend/priv/static/images/open-graph.png and /dev/null differ diff --git a/libs/models/src/analyze/index.ts b/libs/models/src/analyze/index.ts index 020194a67..16b6dfb89 100644 --- a/libs/models/src/analyze/index.ts +++ b/libs/models/src/analyze/index.ts @@ -108,6 +108,7 @@ export function analyzeDatabase(conf: RulesConf, now: Timestamp, db: Database, q // TODO: single column indexes on low cardinality column => suggest bitmap index instead // TODO: warn queries sans where clause ^^ // TODO: locks using https://www.postgresql.org/docs/current/view-pg-locks.html + // TODO: no "SELECT *" query const rules = ruleNames.length > 0 ? analyzeRules.filter(r => ruleNames.indexOf(r.id) !== -1 || ruleNames.indexOf(r.name) !== -1) : analyzeRules return Object.fromEntries(rules.map(r => { const ruleConf = Object.assign({}, r.conf, conf.rules?.[r.id])