Add tests, schema sync safeguards, and query/handler improvements
- Add bun test suite: SQL generator and value unit tests, plus MariaDB integration tests gated on BUN_MARIADB_TEST_DB - schema: add --dry-run and require confirmation (or --yes) before dropping tables/columns; block unapproved destructive statements - Always AND targetId with the query, regardless of searchOperator - Initialize lazily on first call; init throws instead of exiting - Generate IN (?, ?, ...) lists for IN / NOT IN - Share value binding between insert and update (booleans, embeddings, function values, "" -> NULL for non-text columns) - Keep Buffers and convert BigInt/Date without a JSON round-trip - DbSQL: report success for empty SELECT results - Run update() in a transaction with row locking - Key the client cache on the full connection config - Consolidate identifier quoting, drop dead code, merge column lookup - Read CLI version from package.json, pin @types/bun, chmod CLI on compile - Rebuild dist Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Vendored
+9
-27
@@ -1,6 +1,6 @@
|
||||
function quoteIdentifier(identifier) {
|
||||
return `\`${identifier.replace(/`/g, "``")}\``;
|
||||
}
|
||||
import { quoteIdentifier } from "./sql-identifier";
|
||||
import sqlValuePlaceholder from "./sql-value-placeholder";
|
||||
import grabTableFields from "./grab-table-fields";
|
||||
/**
|
||||
* # SQL Insert Generator
|
||||
*/
|
||||
@@ -17,37 +17,19 @@ export default function sqlInsertGenerator({ tableName, data, dbFullName, }) {
|
||||
}
|
||||
});
|
||||
});
|
||||
const fieldsMap = new Map(grabTableFields(tableName).map((f) => [f.fieldName, f]));
|
||||
let queryBatches = [];
|
||||
let queryValues = [];
|
||||
data.forEach((item) => {
|
||||
queryBatches.push(`(${insertKeys
|
||||
.map((ky) => {
|
||||
const value = item[ky];
|
||||
const is_embedding = Array.isArray(value) &&
|
||||
typeof value[0] == "number";
|
||||
const finalValue = typeof value == "string" ||
|
||||
typeof value == "number"
|
||||
? value
|
||||
: typeof value == "function"
|
||||
? value().value
|
||||
: is_embedding
|
||||
? JSON.stringify(value)
|
||||
: value
|
||||
? value
|
||||
: null;
|
||||
if (!finalValue && typeof value !== "number") {
|
||||
queryValues.push(null);
|
||||
return "?";
|
||||
}
|
||||
queryValues.push(finalValue);
|
||||
const placeholder = typeof value == "function"
|
||||
? value().placeholder
|
||||
: is_embedding
|
||||
? "VEC_FromText(?)"
|
||||
: "?";
|
||||
const { placeholder, value } = sqlValuePlaceholder({
|
||||
value: item[ky],
|
||||
field: fieldsMap.get(ky),
|
||||
});
|
||||
queryValues.push(value);
|
||||
return placeholder;
|
||||
})
|
||||
.filter((k) => Boolean(k))
|
||||
.join(",")})`);
|
||||
});
|
||||
const insertColumns = insertKeys.map(quoteIdentifier).join(",");
|
||||
|
||||
Reference in New Issue
Block a user