Files
srab/исх/бд/скуля/скуля.tri
2025-11-26 21:32:41 +03:00

102 lines
4.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
модуль скуля
осторожно // cognitohazard!
импорт "стд::вывод"
импорт "исх/спринтф"
импорт "исх/строка"
импорт "исх/форматы/джесон"
// c:include "sckulya.h"
фн tri_sqlite_open(файл: Строка, оплошность := Строка): Цел64 @внеш
фн tri_sqlite_close(бд: Цел64): Цел64 @внеш
фн tri_sqlite_exec(бд: Цел64, прошение: Строка, оплошность := Строка) @внеш
фн tri_sqlite_query(бд: Цел64, прошение: Строка, результат := Строка, оплошность := Строка): Цел64 @внеш
тип Картотека* = класс {
ручка: Цел64 := -1
}
фн открыть картотеку*(путь: Строка): Картотека {
пусть оплошность := ""
пусть ручка = tri_sqlite_open(путь, оплошность)
если оплошность # "" {
авария(спринтф.ф("не удалось открыть картотеку: $стр", оплошность))
}
вернуть Картотека{
ручка: ручка
}
}
фн (к: Картотека) закрыть*() {
пусть код = tri_sqlite_close(к.ручка)
если код # 0 {
авария(спринтф.ф("не удалось закрыть картотеку, код $цел", код))
}
}
фн (к: Картотека) выполнить*(прошение: Строка, оплошность := Строка) {
tri_sqlite_exec(к.ручка, прошение, оплошность)
}
фн (к: Картотека) запросить*(прошение: Строка, оплошность := Строка): джесон.ДжесонМногоЗначений {
пусть результат := ""
пусть код = tri_sqlite_query(к.ручка, прошение, результат, оплошность)
если оплошность # "" {
вернуть джесон.ДжесонМногоЗначений{}
}
пусть объект = джесон.парсить(спринтф.ф("{\"данные\": $стр}", результат), оплошность)
если оплошность # "" {
вернуть джесон.ДжесонМногоЗначений{}
}
вернуть объект.значения[0].значение(:джесон.ДжесонМногоЗначений)
}
тип Аргумент = класс {
}
фн экранировать(т аргумента: Слово64, аргумент: *): Строка {
пусть кек = аргумент(:Слово64)
если т аргумента = тег(Строка) {
пусть знач = кек(:осторожно Строка)
вернуть спринтф.ф("'$стр'", строка.заменить(знач, "'", "''"))
}
если т аргумента = тег(Цел64) {
пусть знач = кек(:осторожно Цел64)
вернуть спринтф.ф("$цел", знач)
}
авария("неподдерживаемый тип аргумента")
}
фн (к: Картотека) запросить безопасно*(прошение: Строка, оплошность := Строка, аргументы: ...*): джесон.ДжесонМногоЗначений {
пусть части прошения = строка.разобрать(прошение, "?")
если длина(части прошения) - 1 # длина(аргументы) {
авария("число аргументов не совпадает с числом подстановок")
}
пусть собранное прошение := ""
пусть ай := 0
пока ай < длина(аргументы) {
собранное прошение := строка.собрать(собранное прошение, части прошения[ай], экранировать(тег(аргументы[ай]), нечто(аргументы[ай])))
ай++
}
собранное прошение := строка.собрать(собранное прошение, части прошения[ай])
вернуть к.запросить(собранное прошение, оплошность)
}