Probiotics (in bot form) for programming.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
Это архивный репозиторий. Вы можете его клонировать или просматривать файлы, но не вносить изменения или открывать задачи/запросы на слияние.

239 строки
5.1KB

  1. /* api.c - Database API */
  2. #define stmt_prepare(stmt) \
  3. sqlite3_prepare_v2(connection, stmt ## _template, -1, &stmt, NULL)
  4. VARDECL char const * db = DBFILE;
  5. VARDECL sqlite3 * connection = NULL;
  6. DECL void DBERR(const int l)
  7. {
  8. if(l != SQLITE_OK && l != SQLITE_ROW && l != SQLITE_DONE)
  9. {
  10. fprintf(stderr,
  11. "sqlite (%d): %s\n",
  12. sqlite3_errcode(connection), sqlite3_errmsg(connection));
  13. exit(DB_ERROR);
  14. }
  15. }
  16. DECL int
  17. api_init(void)
  18. {
  19. DBERR(sqlite3_open_v2(db, &connection, SQLITE_OPEN_READWRITE, NULL));
  20. /* dont you fucking dare to remove this spacing */
  21. DBERR(stmt_prepare(remind_stmt));
  22. DBERR(stmt_prepare(set_repo_stmt));
  23. DBERR(stmt_prepare(get_nth_id_stmt));
  24. DBERR(stmt_prepare(new_assignment_stmt));
  25. DBERR(stmt_prepare(purge_assignments_stmt));
  26. DBERR(stmt_prepare(is_no_assignment_stmt));
  27. return 0;
  28. }
  29. DECL void
  30. api_rope(void)
  31. {
  32. DBERR(sqlite3_finalize(remind_stmt));
  33. DBERR(sqlite3_finalize(set_repo_stmt));
  34. DBERR(sqlite3_finalize(get_nth_id_stmt));
  35. DBERR(sqlite3_finalize(new_assignment_stmt));
  36. DBERR(sqlite3_finalize(purge_assignments_stmt));
  37. DBERR(sqlite3_finalize(is_no_assignment_stmt));
  38. sqlite3_close(connection);
  39. }
  40. #define DBERR_NOMEM(v) if (v) { r = (IRC_RED "No memory!" IRC_STOP); goto fail; }
  41. DECL char *
  42. remind(char * who)
  43. {
  44. char * r = NULL;
  45. char * title;
  46. char * desc = NULL;
  47. /* char * repo; */
  48. DBERR(sqlite3_reset(remind_stmt));
  49. DBERR(sqlite3_bind_text(remind_stmt, 1, who, -1, SQLITE_STATIC));
  50. const int i = sqlite3_step(remind_stmt);
  51. DBERR(i);
  52. if (i == SQLITE_ROW)
  53. {
  54. title = (char *) sqlite3_column_text(remind_stmt, 0);
  55. title = strdup(title);
  56. if (!title) { goto fail; }
  57. desc = (char *) sqlite3_column_text(remind_stmt, 1);
  58. if (desc && (desc = strdup(desc)) == NULL)
  59. { goto fail; }
  60. if (-1 == asprintf(&r,
  61. IRC_RED "%s " IRC_YELLOW "%s" IRC_STOP,
  62. title, desc ? desc : ""))
  63. { r = IRC_RED "No memory!" IRC_STOP; }
  64. fail:
  65. free(title);
  66. free(desc);
  67. }
  68. else
  69. { r = IRC_RED "No current assignment." IRC_STOP; }
  70. return r;
  71. }
  72. #if 0
  73. DECL void
  74. set_repo(char const * const who,
  75. char const * const link)
  76. {
  77. DBERR(sqlite3_reset(set_repo_stmt));
  78. DBERR(sqlite3_bind_text(set_repo_stmt, 1, link, -1, SQLITE_STATIC));
  79. DBERR(sqlite3_bind_text(set_repo_stmt, 2, who, -1, SQLITE_STATIC));
  80. DBERR(sqlite3_step(set_repo_stmt));
  81. }
  82. #endif /* 0 */
  83. #ifndef NO_VULN_COMMANDS
  84. /* Note that this function is may not be vuln,
  85. but is included as it's only used by vulns */
  86. DECL int
  87. rtos(void * data,
  88. int argc,
  89. char** argv,
  90. char** colname)
  91. {
  92. (void) colname;
  93. char ** r = (char**)data;
  94. size_t data_len = 0;
  95. for(int i = 0; i < argc; i++)
  96. {
  97. if(argv[i])
  98. {
  99. data_len += strlen(argv[i]);
  100. }
  101. else
  102. {
  103. /* strlen("NULL") == 4 */
  104. data_len += 4;
  105. }
  106. /* strlen("|") * 2 == 2 */
  107. data_len += 2;
  108. }
  109. ++data_len;
  110. *r = (char *)calloc(data_len, sizeof(char));
  111. for(int i = 0; i < argc; i++){
  112. strcat(*r, "|");
  113. if(argv[i]){
  114. strcat(*r, argv[i]);
  115. }
  116. else
  117. {
  118. strcat(*r, "NULL");
  119. }
  120. }
  121. strcat(*r, "|\n");
  122. return 0;
  123. }
  124. DECL char *
  125. dump()
  126. {
  127. char* errmsg;
  128. char* r = NULL;
  129. DBERR(sqlite3_exec(connection, dump_stmt, rtos, &r, &errmsg));
  130. return r;
  131. }
  132. DECL char *
  133. raw(char const * const sql)
  134. {
  135. char* errmsg;
  136. char *r = NULL;
  137. sqlite3_exec(connection, sql, rtos, &r, &errmsg);
  138. if (errmsg){
  139. free(r);
  140. r = errmsg;
  141. } else { strcat(r, "\00"); }
  142. return r;
  143. }
  144. #endif /* !NO_VULN_COMMANDS */
  145. DECL int
  146. get_project_count_callback(void* data, int argc, char** argv, char** colname)
  147. {
  148. (void)argc;
  149. (void)colname;
  150. int* count = (int*)data;
  151. *count = atoi(argv[0]);
  152. return 0;
  153. }
  154. DECL int
  155. get_project_count(void)
  156. {
  157. int r = 0;
  158. char const * sql = "SELECT COUNT(*) FROM project;";
  159. DBERR(sqlite3_exec(connection, sql, get_project_count_callback, &r, NULL));
  160. return r;
  161. }
  162. DECL int
  163. get_nth_id(const int i)
  164. {
  165. int r;
  166. DBERR(sqlite3_reset(get_nth_id_stmt));
  167. DBERR(sqlite3_bind_int(get_nth_id_stmt, 1, i));
  168. DBERR(sqlite3_step(get_nth_id_stmt));
  169. r = sqlite3_column_int(get_nth_id_stmt, 0);
  170. return r;
  171. }
  172. DECL void
  173. new_assignment(char const * const who,
  174. int const project)
  175. {
  176. DBERR(sqlite3_reset(new_assignment_stmt));
  177. DBERR(sqlite3_bind_text(new_assignment_stmt, 1, who, -1, SQLITE_STATIC));
  178. DBERR(sqlite3_bind_int(new_assignment_stmt, 2, project));
  179. DBERR(sqlite3_step(new_assignment_stmt));
  180. }
  181. DECL void
  182. random_assign(char const * const who)
  183. {
  184. int i = rand() % get_project_count();
  185. i = get_nth_id(i);
  186. new_assignment(who, i);
  187. }
  188. DECL void
  189. purge_assignments(char const * const who)
  190. {
  191. DBERR(sqlite3_reset(purge_assignments_stmt));
  192. DBERR(sqlite3_bind_text(purge_assignments_stmt, 1, who, -1, SQLITE_STATIC));
  193. DBERR(sqlite3_step(purge_assignments_stmt));
  194. }
  195. #ifdef INITIAL_ASSIGNMENT_MESSAGE
  196. DECL int
  197. is_no_assignment(char const * const who)
  198. {
  199. const int e;
  200. DBERR(sqlite3_reset(is_no_assignment_stmt));
  201. DBERR(sqlite3_bind_text(is_no_assignment_stmt, 1, who, -1, SQLITE_STATIC));
  202. e = sqlite3_step(is_no_assignment_stmt);
  203. DBERR(e);
  204. return (e == SQLITE_DONE);
  205. }
  206. #endif /* INITIAL_ASSIGNMENT_MESSAGE */