Meta.cpp 5.6 KB

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