Guest User

Untitled

a guest
Jul 17th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. class SqlTransactions{
  2.  
  3. constructor(database){
  4. this.database = database;
  5. this.stack = Array();
  6. }
  7.  
  8. query(query, bindings = Array()){
  9. if(bindings){
  10. this.stack.push( {query: query, bindings: bindings} );
  11. return;
  12. }
  13. this.stack.push( query );
  14. }
  15.  
  16. select(table, parameters = {}, bindings = Array()){
  17. const query = `SELECT ${parameters.fields ? parameters.fields : '*'} FROM ${table}${parameters.where ? ' WHERE ' + parameters.where : ''}${parameters.orderBy ? ' ORDER BY ' + parameters.orderBy : ''}`;
  18. this.query(query, bindings);
  19. }
  20.  
  21. insert(table, data = Array()){
  22. if(!data.length) return;
  23.  
  24. function divideArrays(arr){
  25. const divide = 499;
  26. const pieces = Array();
  27. const times = Math.ceil(arr.length / divide);
  28.  
  29. if(arr.length < divide){
  30. return [arr];
  31. }
  32.  
  33. for(let counter = 0; counter < times; counter++){
  34. pieces.push(arr.splice(0, divide));
  35. }
  36. return pieces;
  37. }
  38.  
  39. const keysLength = Object.keys(data[0]).length;
  40. const keys = Object.keys(data[0]).join(', ');
  41. const values = Array();
  42. const refused = Array();
  43.  
  44. data.forEach(insert => {
  45. const valuesArr = Object.values(insert);
  46. const valuesLength = valuesArr.length;
  47. const block = '(' + valuesArr.map(value => `"${value}"`).join(', ') + ')';
  48. keysLength === valuesLength ? values.push( block ) : refused.push( block );
  49. });
  50.  
  51. if(refused.length) return;
  52.  
  53. const pieces = divideArrays(values);
  54. pieces.forEach(piece => {
  55. const values = piece.join(', ');
  56. const query = `INSERT OR REPLACE INTO ${table} (${keys}) VALUES ${values}`;
  57. this.stack.push( query );
  58. });
  59. }
  60.  
  61. update(table, data = Array()){
  62. this.insert(table, data);
  63. }
  64.  
  65. delete(table, condition, bindings = Array()){
  66. if(!condition) return;
  67. const query = `DELETE FROM ${table} ${condition}`;
  68. this.query( query, bindings );
  69. }
  70.  
  71. getStack(){
  72. return this.stack;
  73. }
  74.  
  75. clearStack(){
  76. this.stack = Array();
  77. }
  78.  
  79. mountTransaction(transaction, parameters){
  80. return new Promise((resolve, reject) => {
  81. const query = typeof parameters === 'string' ? parameters : parameters.query;
  82. const bindings = typeof parameters === 'string' ? [] : parameters.bindings;
  83. // t = transaction || s = success || e = error
  84. return transaction.executeSql( query, bindings, (t, s) => resolve(s), (t, e) => {
  85. reject(e);
  86. // must return a non-false value to automatically rollback querys
  87. return true;
  88. });
  89. });
  90. }
  91.  
  92. executeStack(){
  93. return new Promise((resolve, reject) => {
  94. if(!this.stack.length){
  95. reject('EMPTY_STACK');
  96. return;
  97. }
  98.  
  99. this.database.transaction(transaction => {
  100. const promises = this.stack.map( parameters => this.mountTransaction(transaction, parameters) );
  101. Promise.all(promises).then(res => {
  102. this.clearStack();
  103. resolve(res);
  104. }, err => {
  105. this.clearStack();
  106. reject(err);
  107. });
  108. });
  109. });
  110. }
  111.  
  112. updateDatabase(oldVersion, newVersion){
  113. return new Promise((resolve, reject) => {
  114. if(!this.stack.length){
  115. reject('EMPTY_STACK');
  116. return;
  117. }
  118.  
  119. this.database.changeVersion(String(oldVersion), String(newVersion), (transaction) => {
  120. const promises = this.stack.map( parameters => this.mountTransaction(transaction, parameters) );
  121. Promise.all(promises).then(res => {
  122. this.clearStack();
  123. resolve(res);
  124. }, err => {
  125. this.clearStack();
  126. reject(err);
  127. });
  128. });
  129. });
  130. }
  131. }
Add Comment
Please, Sign In to add comment