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

10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
9 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
10 місяці тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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 */