Meta.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibSQL/Key.h>
  7. #include <LibSQL/Meta.h>
  8. #include <LibSQL/Type.h>
  9. namespace SQL {
  10. SchemaDef::SchemaDef(String name)
  11. : Relation(move(name))
  12. {
  13. }
  14. SchemaDef::SchemaDef(Key const& key)
  15. : Relation(key["schema_name"].to_string().value())
  16. {
  17. }
  18. Key SchemaDef::key() const
  19. {
  20. auto key = Key(index_def()->to_tuple_descriptor());
  21. key["schema_name"] = name();
  22. key.set_pointer(pointer());
  23. return key;
  24. }
  25. Key SchemaDef::make_key()
  26. {
  27. return Key(index_def());
  28. }
  29. NonnullRefPtr<IndexDef> SchemaDef::index_def()
  30. {
  31. NonnullRefPtr<IndexDef> s_index_def = IndexDef::construct("$schema", true, 0);
  32. if (!s_index_def->size()) {
  33. s_index_def->append_column("schema_name", SQLType::Text, Order::Ascending);
  34. }
  35. return s_index_def;
  36. }
  37. ColumnDef::ColumnDef(Relation* parent, size_t column_number, String name, SQLType sql_type)
  38. : Relation(move(name), parent)
  39. , m_index(column_number)
  40. , m_type(sql_type)
  41. {
  42. }
  43. Key ColumnDef::key() const
  44. {
  45. auto key = Key(index_def());
  46. key["table_hash"] = parent_relation()->hash();
  47. key["column_number"] = (int)column_number();
  48. key["column_name"] = name();
  49. key["column_type"] = (int)type();
  50. return key;
  51. }
  52. Key ColumnDef::make_key(TableDef const& table_def)
  53. {
  54. Key key(index_def());
  55. key["table_hash"] = table_def.key().hash();
  56. return key;
  57. }
  58. NonnullRefPtr<IndexDef> ColumnDef::index_def()
  59. {
  60. NonnullRefPtr<IndexDef> s_index_def = IndexDef::construct("$column", true, 0);
  61. if (!s_index_def->size()) {
  62. s_index_def->append_column("table_hash", SQLType::Integer, Order::Ascending);
  63. s_index_def->append_column("column_number", SQLType::Integer, Order::Ascending);
  64. s_index_def->append_column("column_name", SQLType::Text, Order::Ascending);
  65. s_index_def->append_column("column_type", SQLType::Integer, Order::Ascending);
  66. }
  67. return s_index_def;
  68. }
  69. KeyPartDef::KeyPartDef(IndexDef* index, String name, SQLType sql_type, Order sort_order)
  70. : ColumnDef(index, index->size(), move(name), sql_type)
  71. , m_sort_order(sort_order)
  72. {
  73. }
  74. IndexDef::IndexDef(TableDef* table, String name, bool unique, u32 pointer)
  75. : Relation(move(name), pointer, table)
  76. , m_key_definition()
  77. , m_unique(unique)
  78. {
  79. }
  80. IndexDef::IndexDef(String name, bool unique, u32 pointer)
  81. : IndexDef(nullptr, move(name), unique, pointer)
  82. {
  83. }
  84. void IndexDef::append_column(String name, SQLType sql_type, Order sort_order)
  85. {
  86. auto part = KeyPartDef::construct(this, move(name), sql_type, sort_order);
  87. m_key_definition.append(part);
  88. }
  89. TupleDescriptor IndexDef::to_tuple_descriptor() const
  90. {
  91. TupleDescriptor ret;
  92. for (auto& part : m_key_definition) {
  93. ret.append({ part.name(), part.type(), part.sort_order() });
  94. }
  95. return ret;
  96. }
  97. Key IndexDef::key() const
  98. {
  99. auto key = Key(index_def()->to_tuple_descriptor());
  100. key["table_hash"] = parent_relation()->key().hash();
  101. key["index_name"] = name();
  102. key["unique"] = unique() ? 1 : 0;
  103. return key;
  104. }
  105. Key IndexDef::make_key(TableDef const& table_def)
  106. {
  107. Key key(index_def());
  108. key["table_hash"] = table_def.key().hash();
  109. return key;
  110. }
  111. NonnullRefPtr<IndexDef> IndexDef::index_def()
  112. {
  113. NonnullRefPtr<IndexDef> s_index_def = IndexDef::construct("$index", true, 0);
  114. if (!s_index_def->size()) {
  115. s_index_def->append_column("table_hash", SQLType::Integer, Order::Ascending);
  116. s_index_def->append_column("index_name", SQLType::Text, Order::Ascending);
  117. s_index_def->append_column("unique", SQLType::Integer, Order::Ascending);
  118. }
  119. return s_index_def;
  120. }
  121. TableDef::TableDef(SchemaDef* schema, String name)
  122. : Relation(move(name), schema)
  123. , m_columns()
  124. , m_indexes()
  125. {
  126. }
  127. TupleDescriptor TableDef::to_tuple_descriptor() const
  128. {
  129. TupleDescriptor ret;
  130. for (auto& part : m_columns) {
  131. ret.append({ part.name(), part.type(), Order::Ascending });
  132. }
  133. return ret;
  134. }
  135. Key TableDef::key() const
  136. {
  137. auto key = Key(index_def()->to_tuple_descriptor());
  138. key["schema_hash"] = parent_relation()->key().hash();
  139. key["table_name"] = name();
  140. key.set_pointer(pointer());
  141. return key;
  142. }
  143. void TableDef::append_column(String name, SQLType sql_type)
  144. {
  145. auto column = ColumnDef::construct(this, num_columns(), move(name), sql_type);
  146. m_columns.append(column);
  147. }
  148. void TableDef::append_column(Key const& column)
  149. {
  150. append_column(
  151. (String)column["column_name"],
  152. (SQLType)((int)column["column_type"]));
  153. }
  154. Key TableDef::make_key(SchemaDef const& schema_def)
  155. {
  156. return TableDef::make_key(schema_def.key());
  157. }
  158. Key TableDef::make_key(Key const& schema_key)
  159. {
  160. Key key(index_def());
  161. key["schema_hash"] = schema_key.hash();
  162. return key;
  163. }
  164. NonnullRefPtr<IndexDef> TableDef::index_def()
  165. {
  166. NonnullRefPtr<IndexDef> s_index_def = IndexDef::construct("$table", true, 0);
  167. if (!s_index_def->size()) {
  168. s_index_def->append_column("schema_hash", SQLType::Integer, Order::Ascending);
  169. s_index_def->append_column("table_name", SQLType::Text, Order::Ascending);
  170. }
  171. return s_index_def;
  172. }
  173. }