db.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <?php
  2. /* db.lib
  3. Edmund Edgar, 2010-06-18
  4. Sloodle database compatibility wrappers
  5. For reasons best known to themselves, Moodle decided to suddenly rip out all their old db functions and put in a bunch of near-identical ones with slightly different syntax.
  6. To avoid the need for a different release, we'll go through a layer of sloodle_ functions which wrap the appropriate Moodle database call.
  7. We'll probably want to switch these out for the regular Moodle 2.0 calls when people have had a change to upgrade to Moodle 2.
  8. */
  9. // Fetch a list of all distributor entries
  10. function sloodle_do_use_db_object() {
  11. global $CFG;
  12. return ($CFG->version > 2010060800);
  13. }
  14. function sloodle_get_record($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8='*') {
  15. global $DB;
  16. if ( sloodle_do_use_db_object() ) {
  17. return $DB->get_record($p1, sloodle_conditions_to_array($p2,$p3,$p4,$p5,$p6,$p7) );
  18. } else {
  19. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  20. $p5 = is_null($p5) ? $p5 : sloodle_addslashes($p5);
  21. $p7 = is_null($p7) ? $p7 : sloodle_addslashes($p7);
  22. return get_record($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
  23. }
  24. }
  25. function sloodle_record_exists($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null) {
  26. global $DB;
  27. if ( sloodle_do_use_db_object() ) {
  28. return $DB->record_exists($p1, sloodle_conditions_to_array($p2,$p3,$p4,$p5,$p6,$p7) );
  29. } else {
  30. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  31. $p5 = is_null($p5) ? $p5 : sloodle_addslashes($p5);
  32. $p7 = is_null($p7) ? $p7 : sloodle_addslashes($p7);
  33. return record_exists($p1, $p2, $p3, $p4, $p5, $p6, $p7);
  34. }
  35. }
  36. function sloodle_get_records($p1=null, $p2=null, $p3=null, $p4=null, $p5='*', $p6=null, $p7=null) {
  37. if ( sloodle_do_use_db_object() ) {
  38. global $DB;
  39. return $DB->get_records($p1, sloodle_conditions_to_array( $p2, $p3), $p4, $p5, $p6, $p7 );
  40. } else {
  41. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  42. return get_records($p1, $p2, $p3, $p4, $p5, $p6, $p7);
  43. }
  44. }
  45. function sloodle_get_records_sql_params($p1=null, $p2=null) {
  46. if ( sloodle_do_use_db_object() ) {
  47. global $DB;
  48. return $DB->get_records_sql($p1, $p2);
  49. } else {
  50. $p1 = sloodle_parameterized_query($p1, $p2);
  51. return get_records_sql($p1);
  52. }
  53. }
  54. function sloodle_get_records_select_params( $p1=null, $p2=null, $params, $p3=null, $p4 = '*', $p5 = null, $p6 = null) {
  55. if ( sloodle_do_use_db_object() ) {
  56. global $DB;
  57. return $DB->get_records_select($p1, $p2, $params, $p3, $p4, $p5, $p6); // get_records_select now has an option to pass in an array of params
  58. } else {
  59. $p2 = sloodle_parameterized_query( $p2, $params );
  60. return get_records_select($p1, $p2, $p3, $p4, $p5, $p6);
  61. }
  62. }
  63. function sloodle_get_record_select_params( $p1=null, $p2=null, $params, $p3, $p4 = '*', $p5 = null, $p6 = null) {
  64. if ( sloodle_do_use_db_object() ) {
  65. global $DB;
  66. return $DB->get_record_select($p1, $p2, $params, $p3, $p4, $p5, $p6); // get_record_select now has an option to pass in an array of params
  67. } else {
  68. $p2 = sloodle_parameterized_query( $p2, $params );
  69. return get_record_select($p1, $p2, $p3, $p4, $p5, $p6);
  70. }
  71. }
  72. function sloodle_insert_record($p1=null, $p2=null, $returnid=true, $primarykey='id') {
  73. if ( sloodle_do_use_db_object() ) {
  74. global $DB;
  75. $p2 = is_null($p2) ? $p2 : sloodle_sanitize_object( $p2 );
  76. return $DB->insert_record($p1, $p2, $returnid, false); // if we need that primarykey field, I guess something will break
  77. } else {
  78. return insert_record($p1, $p2, $returnid, $primarykey );
  79. }
  80. }
  81. function sloodle_sanitize_object($obj) {
  82. $props = get_object_vars( $obj );
  83. foreach($props as $prop => $val) {
  84. // ignore values that aren't regular strings / ints etc
  85. if (is_array($val) || is_object($val)) {
  86. continue;
  87. }
  88. $obj->$prop = sloodle_addslashes($val);
  89. }
  90. return $obj;
  91. }
  92. function sloodle_update_record($p1=null, $p2=null) {
  93. if ( sloodle_do_use_db_object() ) {
  94. global $DB;
  95. return $DB->update_record($p1, $p2);
  96. } else {
  97. $p2 = is_null($p2) ? $p2 : sloodle_sanitize_object( $p2 );
  98. return update_record($p1, $p2);
  99. }
  100. }
  101. function sloodle_count_records($p1=null, $p2=null, $p3=null, $p4 = null, $p5 = null, $p6 = null, $p7 = null) {
  102. if ( sloodle_do_use_db_object() ) {
  103. global $DB;
  104. return $DB->count_records($p1, sloodle_conditions_to_array($p2, $p3, $p4, $p5, $p6, $p7) );
  105. } else {
  106. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  107. $p5 = is_null($p5) ? $p5 : sloodle_addslashes($p5);
  108. $p7 = is_null($p7) ? $p7 : sloodle_addslashes($p7);
  109. return count_records($p1, $p2, $p3, $p4, $p5, $p6, $p7);
  110. }
  111. }
  112. function sloodle_count_records_select_params($p1=null, $p2, $params) {
  113. if ( sloodle_do_use_db_object() ) {
  114. global $DB;
  115. return $DB->count_records_select($p1, $p2, $params) ;
  116. } else {
  117. $p2 = sloodle_parameterized_query($p2, $params);
  118. return count_records_select($p1, $p2);
  119. }
  120. }
  121. function sloodle_delete_records($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null) {
  122. if ( sloodle_do_use_db_object() ) {
  123. global $DB;
  124. return $DB->delete_records($p1, sloodle_conditions_to_array($p2, $p3, $p4, $p5, $p6, $p7) );
  125. } else {
  126. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  127. $p5 = is_null($p5) ? $p5 : sloodle_addslashes($p5);
  128. $p7 = is_null($p7) ? $p7 : sloodle_addslashes($p7);
  129. return delete_records($p1, $p2, $p3, $p4, $p5, $p6, $p7);
  130. }
  131. }
  132. function sloodle_delete_records_select_params($p1=null, $p2=null, $params) {
  133. if ( sloodle_do_use_db_object() ) {
  134. global $DB;
  135. return $DB->delete_records_select($p1, $p2, $params);
  136. } else {
  137. $p2 = sloodle_parameterized_query($p2, $params);
  138. return delete_records_select($p1, $p2);
  139. }
  140. }
  141. function sloodle_get_field($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8=null) {
  142. if ( sloodle_do_use_db_object() ) {
  143. global $DB;
  144. return $DB->get_field($p1, $p2, sloodle_conditions_to_array($p3, $p4, $p5, $p6, $p7, $p8) );
  145. } else {
  146. return get_field($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
  147. }
  148. }
  149. function sloodle_get_field_sql_params($p1=null, $params) {
  150. if ( sloodle_do_use_db_object() ) {
  151. global $DB;
  152. return $DB->get_field_sql($p1, $params);
  153. } else {
  154. $p1 = sloodle_parameterized_query($p1, $params);
  155. return get_field_sql($p1);
  156. }
  157. }
  158. function sloodle_set_field($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8=null, $p9=null) {
  159. if ( sloodle_do_use_db_object() ) {
  160. global $DB;
  161. return $DB->set_field($p1, $p2, $p3, sloodle_conditions_to_array( $p4, $p5, $p6, $p7, $p8, $p9) );
  162. } else {
  163. $p3 = is_null($p3) ? $p3 : sloodle_addslashes($p3);
  164. $p5 = is_null($p5) ? $p5 : sloodle_addslashes($p5);
  165. $p7 = is_null($p7) ? $p7 : sloodle_addslashes($p7);
  166. $p9 = is_null($p9) ? $p9 : sloodle_addslashes($p9);
  167. return set_field($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8, $p9);
  168. }
  169. }
  170. function sloodle_sql_ilike() {
  171. if ( sloodle_do_use_db_object() ) {
  172. global $DB;
  173. // Probably not a very good solution, but I'm having a hard time keeping up with all these API changes...
  174. if (!method_exists($DB, 'sql_ilike')) {
  175. return 'LIKE';
  176. }
  177. return $DB->sql_ilike();
  178. } else {
  179. return sql_ilike();
  180. }
  181. }
  182. function sloodle_conditions_to_array($c1 = null, $c2 = null, $c3 = null, $c4 = null, $c5 = null, $c6 = null) {
  183. $conditions = array();
  184. if ($c1) {
  185. $conditions[$c1] = $c2;
  186. }
  187. if ($c3) {
  188. $conditions[$c3] = $c4;
  189. }
  190. if ($c5) {
  191. $conditions[$c5] = $c6;
  192. }
  193. return $conditions;
  194. }
  195. function sloodle_addslashes($p) {
  196. // Nasty hack, to deal with nasty hacks in clean_param() in Moodle 1.x.
  197. // In Moodle 1.x, input passes through addslashes on the way in, but db data doesn't.
  198. // This will break if you have a legitimate use for "'/" in your text.
  199. // ...but in practice for our purposes nothing should break that wasn't already broken.
  200. return addslashes(stripslashes($p));
  201. }
  202. // Quick-and-dirty parameterized query maker.
  203. // NB This expects db integers to be integers and db varchar fields to be strings
  204. // Only designed to work for queries we use in Sloodle - too crude for general use.
  205. // Only has to keep us going until we drop 1.x, then Moodle will do this for us in the DML layer, where it belongs.
  206. function sloodle_parameterized_query($sql, $args) {
  207. if (count($args) == 0) {
  208. return $sql;
  209. }
  210. foreach($args as $arg) {
  211. if (is_string($arg)) {
  212. $arg = "'".sloodle_addslashes($arg)."'";
  213. } else {
  214. $arg = sloodle_addslashes($arg); // shouldn't be any slashes in a non-string (integer etc), but if that's right it won't do any harm either.
  215. }
  216. $sql = preg_replace('/\?/', $arg, $sql, 1);
  217. }
  218. return $sql;
  219. }
  220. ?>