102 lines
4.4 KiB
Plaintext
102 lines
4.4 KiB
Plaintext
модуль скуля
|
||
осторожно // 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
|
||
пока ай < длина(аргументы) {
|
||
собранное прошение := строка.собрать(собранное прошение, части прошения[ай], экранировать(тег(аргументы[ай]), нечто(аргументы[ай])))
|
||
ай++
|
||
}
|
||
|
||
собранное прошение := строка.собрать(собранное прошение, части прошения[ай])
|
||
|
||
вернуть к.запросить(собранное прошение, оплошность)
|
||
}
|