dbschema.cmake 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. # ----------
  2. # dbschema target: Old Makefiles: make dbschema declared in src/ Makefile This
  3. # was using the makefile found in src/lib/srdb1/schema folder.
  4. #
  5. # CMakeLists.txt in src/ includes this file. All modules that have a schema
  6. # should be appended to the end of this file. See the the rest of modules.
  7. find_program(XSLTPROC_EXECUTABLE xsltproc QUIET)
  8. include(${CMAKE_SOURCE_DIR}/cmake/groups.cmake)
  9. get_property(added_modules GLOBAL PROPERTY ADDED_MODULES_LIST)
  10. # message(WARNING "Added modules: ${added_modules}")
  11. # Function to add a target for each database type prefix with dbschema ie
  12. # db_name = redis -> target = dbschema_redis
  13. function(add_db_target db_name xsl_file)
  14. if(NOT XSLTPROC_EXECUTABLE)
  15. return()
  16. endif()
  17. # Change name for the folder
  18. if(db_name STREQUAL "pi_framework_table" OR db_name STREQUAL "pi_framework_mod")
  19. set(db_name_folder xhttp_pi)
  20. else()
  21. set(db_name_folder ${db_name})
  22. endif()
  23. if(NOT (db_name_folder IN_LIST added_modules))
  24. return()
  25. endif()
  26. find_group_name(${db_name_folder})
  27. add_custom_target(
  28. dbschema_${db_name}
  29. COMMAND ${CMAKE_COMMAND} -E make_directory "${db_name_folder}"
  30. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl
  31. COMMENT "Creating schemas for ${db_name}"
  32. )
  33. # db_name for old makefiles are different.
  34. # old -> new (module names)
  35. # db_berkeley -> db_berkeley
  36. # mongodb -> db_mongodb
  37. # mysql -> db_mysql
  38. # db_oracle -> db_oracle
  39. # postgres -> db_postgres
  40. # db_redis -> db_redis
  41. # db_sqlite -> db_sqlite
  42. # dbtext -> db_text
  43. # pi_framework -> xhttp_pi (this was not provided at all in the old makefiles)
  44. # For consistency, we are now using the new names.
  45. # For compatibility with tools, we are still using the old names for install folder
  46. # install folder based on db_name
  47. if(db_name STREQUAL "db_mongodb")
  48. set(install_folder "mongodb")
  49. elseif(db_name STREQUAL "db_mysql")
  50. set(install_folder "mysql")
  51. elseif(db_name STREQUAL "db_postgres")
  52. set(install_folder "postgres")
  53. elseif(db_name STREQUAL "db_text")
  54. set(install_folder "dbtext")
  55. elseif(db_name STREQUAL "pi_framework_table" OR db_name STREQUAL "pi_framework_mod")
  56. set(install_folder "xhttp_pi")
  57. else()
  58. set(install_folder "${db_name}")
  59. endif()
  60. # Loop through each table and add a command for xsltproc
  61. foreach(table ${EXTRACTED_TABLES})
  62. # Determine the prefix/suffix
  63. if(db_name STREQUAL "db_berkeley"
  64. OR db_name STREQUAL "db_redis"
  65. OR db_name STREQUAL "db_text"
  66. OR db_name STREQUAL "db_mongodb"
  67. )
  68. set(prefix '')
  69. set(folder_suffix "${MAIN_NAME}")
  70. else()
  71. set(prefix "${table}-")
  72. set(folder_suffix '')
  73. endif()
  74. # Stringparam db is the db_* module name
  75. add_custom_command(
  76. TARGET dbschema_${db_name}
  77. PRE_BUILD
  78. COMMAND
  79. "XML_CATALOG_FILES=${CATALOG}" ${XSLTPROC_EXECUTABLE} ${XSLTPROC_FLAGS} --stringparam dir
  80. ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/${folder_suffix} --stringparam prefix
  81. ${prefix} --stringparam db ${db_name} ${xsl_file} "kamailio-${table}.xml"
  82. WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema"
  83. COMMENT "Processing ${table} for ${db_name}"
  84. )
  85. endforeach()
  86. # Create version table for db_text and db_berkeley
  87. # Use bash script
  88. set(POSTPROCESS_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/dbschema-version-postprocess.sh")
  89. if(db_name STREQUAL "db_text")
  90. add_custom_command(
  91. TARGET dbschema_${db_name}
  92. POST_BUILD
  93. COMMAND ${POSTPROCESS_SCRIPT} 1 1
  94. COMMENT "Creating version table for ${db_name}"
  95. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/${folder_suffix}
  96. )
  97. elseif(db_name STREQUAL "db_berkeley")
  98. add_custom_command(
  99. TARGET dbschema_${db_name}
  100. POST_BUILD
  101. COMMAND ${POSTPROCESS_SCRIPT} 2 10
  102. COMMENT "Creating version table for ${db_name}"
  103. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/${folder_suffix}
  104. )
  105. endif()
  106. add_custom_target(
  107. dbschema_${db_name}_clean
  108. COMMAND ${CMAKE_COMMAND} -E remove_directory
  109. "${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}"
  110. COMMENT "Cleaning ${db_name} schema files"
  111. )
  112. add_dependencies(dbschema dbschema_${db_name})
  113. add_dependencies(dbschema_clean dbschema_${db_name}_clean)
  114. # message(WARNING "group name is ${group_name}")
  115. # Before installing, ensure the target is built `dbschema_${db_name}`
  116. # install as previously done in makefile folder. see naming above
  117. # TODO: when tools adopt to new folder structure, replace the install_folder variable
  118. # with ${db_name_folder}
  119. install(
  120. DIRECTORY ${CMAKE_BINARY_DIR}/utils/kamctl/${db_name_folder}/
  121. DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}/${install_folder}
  122. OPTIONAL
  123. COMPONENT ${group_name}
  124. )
  125. endfunction()
  126. if(NOT XSLTPROC_EXECUTABLE)
  127. message(STATUS "xsltproc is not found. Skip dbschema target.")
  128. else()
  129. # Add targets for each database type
  130. if(NOT TARGET dbschema)
  131. add_custom_target(dbschema COMMENT "Generating schemas for all dbs...")
  132. endif()
  133. if(NOT TARGET dbschema_clean)
  134. add_custom_target(dbschema_clean COMMENT "Cleaning schemas for all dbs...")
  135. endif()
  136. option(XSLT_VALIDATE "Enable schema validation during XSL transformations" ON)
  137. option(XSLT_VERBOSE "Enable verbose output for XSL transformations" OFF)
  138. set(XSLTPROC_FLAGS --xinclude)
  139. if(NOT ${XSLT_VALIDATE})
  140. set(XSLTPROC_FLAGS ${XSLTPROC_FLAGS} --novalid)
  141. endif()
  142. if(${XSLT_VERBOSE})
  143. set(XSLTPROC_FLAGS ${XSLTPROC_FLAGS} --verbose)
  144. endif()
  145. # Set the root directories
  146. set(ROOTDIR ${CMAKE_SOURCE_DIR})
  147. set(STYLESHEETS ${ROOTDIR}/doc/stylesheets/dbschema_k/xsl)
  148. set(CATALOG ${ROOTDIR}/doc/stylesheets/dbschema_k/catalog.xml)
  149. # List of XML files
  150. file(GLOB TABLES "${CMAKE_SOURCE_DIR}/src/lib/srdb1/schema/kamailio-*.xml")
  151. # message(WARNING "TABLES : ${TABLES}")
  152. set(EXTRACTED_TABLES "")
  153. foreach(table ${TABLES})
  154. get_filename_component(TABLE_NAME "${table}" NAME)
  155. string(REPLACE "kamailio-" "" TABLE_NAME "${TABLE_NAME}")
  156. string(REPLACE ".xml" "" TABLE_NAME "${TABLE_NAME}")
  157. list(APPEND EXTRACTED_TABLES "${TABLE_NAME}")
  158. list(SORT EXTRACTED_TABLES)
  159. endforeach()
  160. # Output the extracted table names
  161. if(VERBOSE)
  162. message(STATUS "Extracted Tables for DB schema generation: ${EXTRACTED_TABLES}")
  163. endif()
  164. endif()
  165. #---- DB berkeley
  166. add_db_target(db_berkeley "${STYLESHEETS}/db_berkeley.xsl")
  167. #---- DB mongo
  168. add_db_target(db_mongodb "${STYLESHEETS}/db_mongodb.xsl")
  169. # Create the version-create.mongo script
  170. # After processing the JSON files, create the version-create.mongo script
  171. # Usage of generate_version_create_mongo.sh:
  172. # 1. The first argument is the path to create the version-create.mongo script
  173. # 2. The second argument is the path to the directory containing the JSON files
  174. if(TARGET dbschema_db_mongodb)
  175. add_custom_command(
  176. TARGET dbschema_db_mongodb
  177. POST_BUILD
  178. COMMAND
  179. bash generate_version_create_mongo.sh
  180. "${CMAKE_BINARY_DIR}/utils/kamctl/db_mongodb/kamailio/version-create.mongo"
  181. "${CMAKE_BINARY_DIR}/utils/kamctl/db_mongodb/kamailio"
  182. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/utils/kamctl
  183. COMMENT "Creating version-create.mongo from JSON files"
  184. )
  185. find_group_name("db_mongodb")
  186. install(
  187. FILES ${CMAKE_BINARY_DIR}/utils/kamctl/db_mongodb/kamailio/version-create.mongo
  188. DESTINATION ${CMAKE_INSTALL_DATADIR}/${MAIN_NAME}/mongodb/${MAIN_NAME}
  189. OPTIONAL
  190. COMPONENT ${group_name}
  191. )
  192. endif()
  193. #---- DB mysql
  194. add_db_target(db_mysql "${STYLESHEETS}/db_mysql.xsl")
  195. #---- DB Oracle
  196. add_db_target(db_oracle "${STYLESHEETS}/db_oracle.xsl")
  197. #---- DB postgres
  198. add_db_target(db_postgres "${STYLESHEETS}/db_postgres.xsl")
  199. #---- DB redis
  200. add_db_target(db_redis "${STYLESHEETS}/db_redis.xsl")
  201. #---- DB sqlite
  202. add_db_target(db_sqlite "${STYLESHEETS}/db_sqlite.xsl")
  203. #---- DB text
  204. add_db_target(db_text "${STYLESHEETS}/db_text.xsl")
  205. #---- DB xhttp_pi
  206. add_db_target(pi_framework_table "${STYLESHEETS}/pi_framework_table.xsl")
  207. add_db_target(pi_framework_mod "${STYLESHEETS}/pi_framework_mod.xsl")
  208. # Add alias targets that match the dbschema
  209. if(XSLTPROC_EXECUTABLE
  210. AND TARGET dbschema_pi_framework_table
  211. AND TARGET dbschema_pi_framework_mod
  212. )
  213. add_custom_target(dbschema_xhttp_pi)
  214. add_dependencies(dbschema_xhttp_pi dbschema_pi_framework_table dbschema_pi_framework_mod)
  215. add_custom_target(dbschema_xhttp_pi_clean)
  216. add_dependencies(
  217. dbschema_xhttp_pi dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean
  218. )
  219. add_dependencies(dbschema dbschema_pi_framework_table dbschema_pi_framework_mod)
  220. add_dependencies(dbschema_clean dbschema_pi_framework_table_clean dbschema_pi_framework_mod_clean)
  221. endif()