Meta.cpp 5.4 KB

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