Compare commits

..

4 Commits

Author SHA1 Message Date
Avraham Sakal 0119df3a20 my first content! 2024-11-19 21:20:04 -05:00
Avraham Sakal d090f650af wrap sample pages in Layout 2024-11-19 21:19:51 -05:00
Avraham Sakal 490ae1898e add build script 2024-11-19 21:19:31 -05:00
Avraham Sakal b46f213b2d bump Node version 2024-11-19 21:19:07 -05:00
6 changed files with 62 additions and 30 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
nodejs 20.15.1 nodejs 22.8.0
# python 3.12.4 # python 3.12.4
pnpm 9.7.1 pnpm 9.7.1
+1 -1
View File
@@ -13,7 +13,7 @@ COPY . /app
RUN pnpm run build RUN pnpm run build
FROM base FROM base AS final
WORKDIR /app WORKDIR /app
COPY --from=prod /app/node_modules /app/node_modules COPY --from=prod /app/node_modules /app/node_modules
COPY --from=prod /app/dist /app COPY --from=prod /app/dist /app
Executable
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
REGISTRY=registry.sakal.us
IMAGE_NAME=blog-astro
# get version from package.json and remove quotes:
VERSION=$(pnpm pkg get version | xargs)
docker build -t "${REGISTRY}/${IMAGE_NAME}:v${VERSION}" --target final .
docker push "${REGISTRY}/${IMAGE_NAME}:v${VERSION}"
+32
View File
@@ -0,0 +1,32 @@
---
title: MySQL JSON Shenanigans
date: 2024-11-19
---
In an effort to support out-of-date installations of our app, I had to keep a JSON column in our database. The column is obsolete, as are the values within it; but these installations continue to use it. So, knowing this, I decided to put the proper values into the column. I didn't want to pollute the code of our services to do so, though. So I made it into a `GENERATED` column.
I ran into two issues.
First, MySQL doesn't have a way to omit `NULL` values from a JSON array.
Second, the strings in the resulting array had `\u0000` interspersed between each character. This is due to how MySQL represents strings in a regular column versus how they are represented in a JSON column. I'd have to look it up, but I think I recall that by default MySQL varchars are 16-bits per character, and JSON strings are UTF-8.
I "solved" the first issue by using `IF()` statements to represent all possible combinations of values. Luckily there were only 4. The only other solution I saw involved `TRIGGER`s. No, thank you.
The second issue was solved by using `JSON_QUOTE()` followed by `JSON_UNQUOTE()` to remove the `\u0000` characters.
```sql
ALTER TABLE lectures
MODIFY COLUMN vimeo_video_links JSON GENERATED ALWAYS AS (
IF(m3u8_url IS NOT NULL AND mp4_url IS NOT NULL,
JSON_ARRAY(JSON_UNQUOTE(JSON_QUOTE(m3u8_url)), JSON_UNQUOTE(JSON_QUOTE(mp4_url))),
IF(m3u8_url IS NOT NULL AND mp4_url IS NULL,
JSON_ARRAY(JSON_UNQUOTE(JSON_QUOTE(m3u8_url))),
IF(m3u8_url IS NULL AND mp4_url IS NOT NULL,
JSON_ARRAY(JSON_UNQUOTE(JSON_QUOTE(mp4_url))),
NULL
)
)
)
) STORED;
```
+9 -14
View File
@@ -1,17 +1,12 @@
--- ---
import Layout from "../layouts/Layout.astro";
export const prerender = false; export const prerender = false;
--- ---
<html lang="en"> <Layout title="Current Time">
<head> <h1>Current Time</h1>
<meta charset="UTF-8" /> <p>This page is rendered on the server.</p>
<meta name="viewport" content="width=device-width" /> <time datetime={new Date().toISOString()}>
<title>Current Time</title> {new Date().toLocaleString()}
</head> </time>
<body> </Layout>
<h1>Current Time</h1>
<p>This page is rendered on the server.</p>
<time datetime={new Date().toISOString()}>
{new Date().toLocaleString()}
</time>
</body>
</html>
+8 -14
View File
@@ -1,16 +1,10 @@
--- ---
import Layout from '../layouts/Layout.astro';
--- ---
<html lang="en"> <Layout title='Prerendered Time'>
<head> <h1>Current Time</h1>
<meta charset="UTF-8" /> <p>This page is rendered on the server.</p>
<meta name="viewport" content="width=device-width" /> <time datetime={new Date().toISOString()}>
<title>Current Time</title> {new Date().toLocaleString()}
</head> </time>
<body> </Layout>
<h1>Current Time</h1>
<p>This page is rendered on the server.</p>
<time datetime={new Date().toISOString()}>
{new Date().toLocaleString()}
</time>
</body>
</html>