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