cinchdb 0.1.6__py3-none-any.whl → 0.1.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1,16 @@
1
1
  """CLI command modules."""
2
+
3
+ from . import database, branch, tenant, table, column, view, query, codegen, remote, index
4
+
5
+ __all__ = [
6
+ "database",
7
+ "branch",
8
+ "tenant",
9
+ "table",
10
+ "column",
11
+ "view",
12
+ "query",
13
+ "codegen",
14
+ "remote",
15
+ "index",
16
+ ]
@@ -0,0 +1,186 @@
1
+ """Index management commands for CinchDB CLI."""
2
+
3
+ import typer
4
+ from typing import List, Optional
5
+ from rich import print
6
+ from rich.table import Table
7
+ from rich.console import Console
8
+
9
+ from cinchdb.config import Config
10
+ from cinchdb.managers.index import IndexManager
11
+ from cinchdb.cli.utils import handle_cli_error
12
+
13
+ app = typer.Typer(help="Manage database indexes")
14
+ console = Console()
15
+
16
+
17
+ @app.command("create")
18
+ @handle_cli_error
19
+ def create_index(
20
+ table: str = typer.Argument(..., help="Table name"),
21
+ columns: List[str] = typer.Argument(..., help="Column names to index"),
22
+ name: Optional[str] = typer.Option(None, "--name", "-n", help="Index name"),
23
+ unique: bool = typer.Option(False, "--unique", "-u", help="Create unique index"),
24
+ database: Optional[str] = typer.Option(None, "--database", "-d", help="Database name"),
25
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
26
+ ):
27
+ """Create an index on a table.
28
+
29
+ Indexes are created at the branch level and apply to all tenants.
30
+
31
+ Examples:
32
+ cinch index create users email
33
+ cinch index create orders user_id created_at --name idx_user_orders
34
+ cinch index create products sku --unique
35
+ """
36
+ config = Config()
37
+ project_config = config.load()
38
+
39
+ # Use provided values or defaults
40
+ database = database or project_config.active_database
41
+ branch = branch or project_config.active_branch
42
+
43
+ manager = IndexManager(config.base_dir, database, branch)
44
+
45
+ try:
46
+ index_name = manager.create_index(table, columns, name, unique)
47
+
48
+ unique_text = "[green]UNIQUE[/green] " if unique else ""
49
+ columns_text = ", ".join(columns)
50
+ print(f"✓ Created {unique_text}index [bold cyan]{index_name}[/bold cyan] on {table}({columns_text})")
51
+
52
+ except ValueError as e:
53
+ print(f"[red]✗ Error:[/red] {e}")
54
+ raise typer.Exit(1)
55
+
56
+
57
+ @app.command("drop")
58
+ @handle_cli_error
59
+ def drop_index(
60
+ name: str = typer.Argument(..., help="Index name"),
61
+ database: Optional[str] = typer.Option(None, "--database", "-d", help="Database name"),
62
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
63
+ ):
64
+ """Drop an index.
65
+
66
+ Indexes are managed at the branch level.
67
+
68
+ Example:
69
+ cinch index drop idx_users_email
70
+ """
71
+ config = Config()
72
+ project_config = config.load()
73
+
74
+ # Use provided values or defaults
75
+ database = database or project_config.active_database
76
+ branch = branch or project_config.active_branch
77
+
78
+ manager = IndexManager(config.base_dir, database, branch)
79
+
80
+ try:
81
+ manager.drop_index(name)
82
+ print(f"✓ Dropped index [bold cyan]{name}[/bold cyan]")
83
+ except ValueError as e:
84
+ print(f"[red]✗ Error:[/red] {e}")
85
+ raise typer.Exit(1)
86
+
87
+
88
+ @app.command("list")
89
+ @handle_cli_error
90
+ def list_indexes(
91
+ table: Optional[str] = typer.Argument(None, help="Table name to filter indexes"),
92
+ database: Optional[str] = typer.Option(None, "--database", "-d", help="Database name"),
93
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
94
+ ):
95
+ """List indexes for a table or all tables.
96
+
97
+ Indexes are managed at the branch level and apply to all tenants.
98
+
99
+ Examples:
100
+ cinch index list
101
+ cinch index list users
102
+ """
103
+ config = Config()
104
+ project_config = config.load()
105
+
106
+ # Use provided values or defaults
107
+ database = database or project_config.active_database
108
+ branch = branch or project_config.active_branch
109
+
110
+ manager = IndexManager(config.base_dir, database, branch)
111
+
112
+ indexes = manager.list_indexes(table)
113
+
114
+ if not indexes:
115
+ if table:
116
+ print(f"No indexes found for table [cyan]{table}[/cyan]")
117
+ else:
118
+ print("No indexes found")
119
+ return
120
+
121
+ # Create table for display
122
+ table_obj = Table(title=f"Indexes{f' for {table}' if table else ''}")
123
+ table_obj.add_column("Name", style="cyan")
124
+ table_obj.add_column("Table", style="yellow")
125
+ table_obj.add_column("Columns", style="green")
126
+ table_obj.add_column("Unique", style="magenta")
127
+
128
+ for idx in indexes:
129
+ columns_str = ", ".join(idx["columns"])
130
+ unique_str = "✓" if idx["unique"] else ""
131
+ table_obj.add_row(
132
+ idx["name"],
133
+ idx["table"],
134
+ columns_str,
135
+ unique_str
136
+ )
137
+
138
+ console.print(table_obj)
139
+
140
+
141
+ @app.command("info")
142
+ @handle_cli_error
143
+ def index_info(
144
+ name: str = typer.Argument(..., help="Index name"),
145
+ database: Optional[str] = typer.Option(None, "--database", "-d", help="Database name"),
146
+ branch: Optional[str] = typer.Option(None, "--branch", "-b", help="Branch name"),
147
+ ):
148
+ """Show detailed information about an index.
149
+
150
+ Example:
151
+ cinch index info idx_users_email
152
+ """
153
+ config = Config()
154
+ project_config = config.load()
155
+
156
+ # Use provided values or defaults
157
+ database = database or project_config.active_database
158
+ branch = branch or project_config.active_branch
159
+
160
+ manager = IndexManager(config.base_dir, database, branch)
161
+
162
+ try:
163
+ info = manager.get_index_info(name)
164
+
165
+ print(f"\nIndex: [bold cyan]{info['name']}[/bold cyan]")
166
+ print(f"Table: [yellow]{info['table']}[/yellow]")
167
+ print(f"Columns: [green]{', '.join(info['columns'])}[/green]")
168
+ print(f"Unique: [magenta]{'Yes' if info['unique'] else 'No'}[/magenta]")
169
+ print(f"Partial: [blue]{'Yes' if info.get('partial') else 'No'}[/blue]")
170
+
171
+ if info.get('sql'):
172
+ print(f"\nSQL Definition:")
173
+ print(f"[dim]{info['sql']}[/dim]")
174
+
175
+ if info.get('columns_info'):
176
+ print(f"\nColumn Details:")
177
+ for col in info['columns_info']:
178
+ print(f" - Position {col['position']}: {col['column_name']}")
179
+
180
+ except ValueError as e:
181
+ print(f"[red]✗ Error:[/red] {e}")
182
+ raise typer.Exit(1)
183
+
184
+
185
+ if __name__ == "__main__":
186
+ app()
cinchdb/cli/main.py CHANGED
@@ -14,6 +14,7 @@ from cinchdb.cli.commands import (
14
14
  view,
15
15
  codegen,
16
16
  remote,
17
+ index,
17
18
  )
18
19
 
19
20
  app = typer.Typer(
@@ -42,6 +43,7 @@ app.add_typer(tenant.app, name="tenant", help="Tenant management commands")
42
43
  app.add_typer(table.app, name="table", help="Table management commands")
43
44
  app.add_typer(column.app, name="column", help="Column management commands")
44
45
  app.add_typer(view.app, name="view", help="View management commands")
46
+ app.add_typer(index.app, name="index", help="Index management commands")
45
47
  app.add_typer(codegen.app, name="codegen", help="Code generation commands")
46
48
  app.add_typer(remote.app, name="remote", help="Remote instance management")
47
49
 
cinchdb/core/database.py CHANGED
@@ -17,6 +17,7 @@ if TYPE_CHECKING:
17
17
  from cinchdb.managers.tenant import TenantManager
18
18
  from cinchdb.managers.codegen import CodegenManager
19
19
  from cinchdb.managers.merge_manager import MergeManager
20
+ from cinchdb.managers.index import IndexManager
20
21
 
21
22
 
22
23
  class CinchDB:
@@ -108,6 +109,7 @@ class CinchDB:
108
109
  self._tenant_manager: Optional["TenantManager"] = None
109
110
  self._codegen_manager: Optional["CodegenManager"] = None
110
111
  self._merge_manager: Optional["MergeManager"] = None
112
+ self._index_manager: Optional["IndexManager"] = None
111
113
 
112
114
  @property
113
115
  def session(self):
@@ -303,6 +305,21 @@ class CinchDB:
303
305
  self._merge_manager = MergeManager(self.project_dir, self.database)
304
306
  return self._merge_manager
305
307
 
308
+ @property
309
+ def indexes(self) -> "IndexManager":
310
+ """Access index operations (local only)."""
311
+ if not self.is_local:
312
+ raise RuntimeError(
313
+ "Direct manager access not available for remote connections"
314
+ )
315
+ if self._index_manager is None:
316
+ from cinchdb.managers.index import IndexManager
317
+
318
+ self._index_manager = IndexManager(
319
+ self.project_dir, self.database, self.branch
320
+ )
321
+ return self._index_manager
322
+
306
323
  # Convenience methods for common operations
307
324
 
308
325
  def query(
@@ -460,6 +477,52 @@ class CinchDB:
460
477
  # Remote delete
461
478
  self._make_request("DELETE", f"/tables/{table}/data/{id}")
462
479
 
480
+ def create_index(
481
+ self,
482
+ table: str,
483
+ columns: List[str],
484
+ name: Optional[str] = None,
485
+ unique: bool = False,
486
+ ) -> str:
487
+ """Create an index on a table at the branch level.
488
+
489
+ Indexes are created for the current branch and apply to all tenants.
490
+
491
+ Args:
492
+ table: Table name
493
+ columns: List of column names to index
494
+ name: Optional index name (auto-generated if not provided)
495
+ unique: Whether to create a unique index
496
+
497
+ Returns:
498
+ str: Name of the created index
499
+
500
+ Examples:
501
+ # Simple index on one column
502
+ db.create_index("users", ["email"])
503
+
504
+ # Unique compound index
505
+ db.create_index("orders", ["user_id", "order_number"], unique=True)
506
+
507
+ # Named index
508
+ db.create_index("products", ["category", "price"], name="idx_category_price")
509
+ """
510
+ if self.is_local:
511
+ return self.indexes.create_index(table, columns, name, unique)
512
+ else:
513
+ # Remote index creation
514
+ result = self._make_request(
515
+ "POST",
516
+ "/indexes",
517
+ json={
518
+ "table": table,
519
+ "columns": columns,
520
+ "name": name,
521
+ "unique": unique,
522
+ },
523
+ )
524
+ return result.get("name")
525
+
463
526
  def list_changes(self) -> List["Change"]:
464
527
  """List all changes for the current branch.
465
528
 
@@ -0,0 +1,300 @@
1
+ """Index management for CinchDB."""
2
+
3
+ from pathlib import Path
4
+ from typing import List, Dict, Any, Optional
5
+ import sqlite3
6
+ import json
7
+ from datetime import datetime, timezone
8
+ import uuid
9
+
10
+ from cinchdb.core.connection import DatabaseConnection
11
+ from cinchdb.core.path_utils import get_tenant_db_path
12
+ from cinchdb.models.change import Change, ChangeType
13
+
14
+
15
+ class IndexManager:
16
+ """Manages database indexes for CinchDB tables at the branch level."""
17
+
18
+ def __init__(
19
+ self, project_dir: Path, database: str, branch: str
20
+ ):
21
+ """Initialize IndexManager.
22
+
23
+ Args:
24
+ project_dir: Path to the project directory
25
+ database: Database name
26
+ branch: Branch name
27
+ """
28
+ self.project_dir = Path(project_dir)
29
+ self.database = database
30
+ self.branch = branch
31
+
32
+ def create_index(
33
+ self,
34
+ table: str,
35
+ columns: List[str],
36
+ name: Optional[str] = None,
37
+ unique: bool = False,
38
+ if_not_exists: bool = True,
39
+ ) -> str:
40
+ """Create an index on a table.
41
+
42
+ Args:
43
+ table: Table name
44
+ columns: List of column names to index
45
+ name: Optional index name (auto-generated if not provided)
46
+ unique: Whether to create a unique index
47
+ if_not_exists: Whether to use IF NOT EXISTS clause
48
+
49
+ Returns:
50
+ str: Name of the created index
51
+
52
+ Raises:
53
+ ValueError: If table doesn't exist or columns are invalid
54
+ """
55
+ if not columns:
56
+ raise ValueError("At least one column must be specified for the index")
57
+
58
+ # Generate index name if not provided
59
+ if not name:
60
+ column_str = "_".join(columns)
61
+ unique_prefix = "uniq_" if unique else "idx_"
62
+ name = f"{unique_prefix}{table}_{column_str}"
63
+
64
+ # Get connection to main tenant database (indexes are branch-level)
65
+ db_path = get_tenant_db_path(
66
+ self.project_dir, self.database, self.branch, "main"
67
+ )
68
+
69
+ with DatabaseConnection(db_path) as conn:
70
+ # Verify table exists
71
+ result = conn.execute(
72
+ "SELECT name FROM sqlite_master WHERE type='table' AND name=?",
73
+ [table]
74
+ )
75
+ if not result.fetchone():
76
+ raise ValueError(f"Table '{table}' does not exist")
77
+
78
+ # Verify columns exist
79
+ result = conn.execute(f"PRAGMA table_info({table})")
80
+ existing_columns = {row[1] for row in result.fetchall()}
81
+
82
+ invalid_columns = set(columns) - existing_columns
83
+ if invalid_columns:
84
+ raise ValueError(
85
+ f"Columns {invalid_columns} do not exist in table '{table}'"
86
+ )
87
+
88
+ # Build and execute CREATE INDEX statement
89
+ unique_clause = "UNIQUE " if unique else ""
90
+ if_not_exists_clause = "IF NOT EXISTS " if if_not_exists else ""
91
+ column_list = ", ".join(columns)
92
+
93
+ sql = f"CREATE {unique_clause}INDEX {if_not_exists_clause}{name} ON {table} ({column_list})"
94
+
95
+ try:
96
+ result = conn.execute(sql)
97
+ conn.commit()
98
+ except sqlite3.Error as e:
99
+ if "already exists" in str(e):
100
+ if not if_not_exists:
101
+ raise ValueError(f"Index '{name}' already exists")
102
+ else:
103
+ raise
104
+
105
+ # Track the change
106
+ self._track_change(
107
+ ChangeType.CREATE_INDEX,
108
+ name,
109
+ {"table": table, "columns": columns, "unique": unique}
110
+ )
111
+
112
+ return name
113
+
114
+ def drop_index(self, name: str, if_exists: bool = True) -> None:
115
+ """Drop an index.
116
+
117
+ Args:
118
+ name: Index name
119
+ if_exists: Whether to use IF EXISTS clause
120
+
121
+ Raises:
122
+ ValueError: If index doesn't exist and if_exists is False
123
+ """
124
+ # Get connection to main tenant database (indexes are branch-level)
125
+ db_path = get_tenant_db_path(
126
+ self.project_dir, self.database, self.branch, "main"
127
+ )
128
+
129
+ with DatabaseConnection(db_path) as conn:
130
+
131
+ # Check if index exists
132
+ result = conn.execute(
133
+ "SELECT name FROM sqlite_master WHERE type='index' AND name=?",
134
+ [name]
135
+ )
136
+ exists = result.fetchone() is not None
137
+
138
+ if not exists and not if_exists:
139
+ raise ValueError(f"Index '{name}' does not exist")
140
+
141
+ if exists:
142
+ if_exists_clause = "IF EXISTS " if if_exists else ""
143
+ sql = f"DROP INDEX {if_exists_clause}{name}"
144
+
145
+ result = conn.execute(sql)
146
+ conn.commit()
147
+
148
+ # Track the change
149
+ self._track_change(ChangeType.DROP_INDEX, name, {})
150
+
151
+ def list_indexes(self, table: Optional[str] = None) -> List[Dict[str, Any]]:
152
+ """List indexes for a table or all tables.
153
+
154
+ Args:
155
+ table: Optional table name to filter indexes
156
+
157
+ Returns:
158
+ List of index information dictionaries
159
+ """
160
+ # Get connection to main tenant database (indexes are branch-level)
161
+ db_path = get_tenant_db_path(
162
+ self.project_dir, self.database, self.branch, "main"
163
+ )
164
+
165
+ indexes = []
166
+
167
+ with DatabaseConnection(db_path) as conn:
168
+
169
+ # Get all indexes (excluding SQLite internal indexes)
170
+ if table:
171
+ result = conn.execute(
172
+ """
173
+ SELECT name, tbl_name, sql
174
+ FROM sqlite_master
175
+ WHERE type='index'
176
+ AND tbl_name=?
177
+ AND sql IS NOT NULL
178
+ """,
179
+ [table]
180
+ )
181
+ else:
182
+ result = conn.execute(
183
+ """
184
+ SELECT name, tbl_name, sql
185
+ FROM sqlite_master
186
+ WHERE type='index'
187
+ AND sql IS NOT NULL
188
+ """
189
+ )
190
+
191
+ for row in result.fetchall():
192
+ index_name, table_name, sql = row
193
+
194
+ # Parse unique from SQL
195
+ is_unique = "CREATE UNIQUE INDEX" in sql.upper()
196
+
197
+ # Get indexed columns
198
+ pragma_result = conn.execute(f"PRAGMA index_info({index_name})")
199
+ columns = [info[2] for info in pragma_result.fetchall()]
200
+
201
+ indexes.append({
202
+ "name": index_name,
203
+ "table": table_name,
204
+ "columns": columns,
205
+ "unique": is_unique,
206
+ "sql": sql
207
+ })
208
+
209
+ return indexes
210
+
211
+ def get_index_info(self, name: str) -> Dict[str, Any]:
212
+ """Get detailed information about a specific index.
213
+
214
+ Args:
215
+ name: Index name
216
+
217
+ Returns:
218
+ Dictionary with index information
219
+
220
+ Raises:
221
+ ValueError: If index doesn't exist
222
+ """
223
+ # Get connection to main tenant database (indexes are branch-level)
224
+ db_path = get_tenant_db_path(
225
+ self.project_dir, self.database, self.branch, "main"
226
+ )
227
+
228
+ with DatabaseConnection(db_path) as conn:
229
+
230
+ # Get index info
231
+ result = conn.execute(
232
+ """
233
+ SELECT name, tbl_name, sql
234
+ FROM sqlite_master
235
+ WHERE type='index'
236
+ AND name=?
237
+ """,
238
+ [name]
239
+ )
240
+
241
+ row = result.fetchone()
242
+ if not row:
243
+ raise ValueError(f"Index '{name}' does not exist")
244
+
245
+ index_name, table_name, sql = row
246
+
247
+ # Parse unique from SQL
248
+ is_unique = "CREATE UNIQUE INDEX" in (sql or "").upper()
249
+
250
+ # Get indexed columns with more details
251
+ pragma_result = conn.execute(f"PRAGMA index_info({index_name})")
252
+ columns_info = []
253
+ for info in pragma_result.fetchall():
254
+ columns_info.append({
255
+ "position": info[0],
256
+ "column_id": info[1],
257
+ "column_name": info[2]
258
+ })
259
+
260
+ # Get index statistics
261
+ xinfo_result = conn.execute(f"PRAGMA index_xinfo({index_name})")
262
+ extended_info = xinfo_result.fetchall()
263
+
264
+ return {
265
+ "name": index_name,
266
+ "table": table_name,
267
+ "columns": [col["column_name"] for col in columns_info],
268
+ "columns_info": columns_info,
269
+ "unique": is_unique,
270
+ "sql": sql,
271
+ "partial": sql and "WHERE" in sql.upper() if sql else False
272
+ }
273
+
274
+ def _track_change(
275
+ self, change_type: ChangeType, entity_name: str, metadata: Dict[str, Any]
276
+ ) -> None:
277
+ """Track a change for this branch.
278
+
279
+ Args:
280
+ change_type: Type of change
281
+ entity_name: Name of the entity being changed
282
+ metadata: Additional metadata about the change
283
+ """
284
+ # Import here to avoid circular dependency
285
+ from cinchdb.managers.change_tracker import ChangeTracker
286
+
287
+ tracker = ChangeTracker(self.project_dir, self.database, self.branch)
288
+
289
+ change = Change(
290
+ id=str(uuid.uuid4()),
291
+ type=change_type,
292
+ entity_type="index",
293
+ entity_name=entity_name,
294
+ branch=self.branch,
295
+ metadata=metadata,
296
+ applied=True,
297
+ created_at=datetime.now(timezone.utc),
298
+ )
299
+
300
+ tracker.add_change(change)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cinchdb
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: A Git-like SQLite database management system with branching and multi-tenancy
5
5
  Project-URL: Homepage, https://github.com/russellromney/cinchdb
6
6
  Project-URL: Documentation, https://russellromney.github.io/cinchdb
@@ -2,13 +2,14 @@ cinchdb/__init__.py,sha256=NZdSzfhRguSBTjJ2dcESOQYy53OZEuBndlB7U08GMY0,179
2
2
  cinchdb/__main__.py,sha256=OpkDqn9zkTZhhYgvv_grswWLAHKbmxs4M-8C6Z5HfWY,85
3
3
  cinchdb/config.py,sha256=gocjMnYKLWhgvnteo6zprgwtK6Oevoxq547J_v-C9Ns,5265
4
4
  cinchdb/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- cinchdb/cli/main.py,sha256=Icr_uhe_zXPAuhM9NB7evR5b1ZP7f_N40HQcC1JFhQ0,4706
5
+ cinchdb/cli/main.py,sha256=tGX8Z78Oy4rukXth56Xp_pm52rijIDujyMdhSEhFWPw,4790
6
6
  cinchdb/cli/utils.py,sha256=NREFxN9k53FnPbDoPt4SXmdZzlzw9zUMv5ICQwTT8gk,5679
7
- cinchdb/cli/commands/__init__.py,sha256=gQ6tnU0Rvm0-ESWFUBU-KDl5dpNOpUTG509hXOQQjwY,27
7
+ cinchdb/cli/commands/__init__.py,sha256=IRUIPHgdpF4hBDbDy0SgaWn39o5GNUjH54_C42sjlQg,273
8
8
  cinchdb/cli/commands/branch.py,sha256=Nz8YQYJ7lizSXEAv0usTx85TDOC-N5Ul9KIxN8JQtKc,17973
9
9
  cinchdb/cli/commands/codegen.py,sha256=WsRWmXNTDuaLPyECW5psXM9zOQnKHpUiv8BJnBAjMII,6189
10
10
  cinchdb/cli/commands/column.py,sha256=ISHRmcoLf1fAbPqC2MaAYH7Fc6xZWtzCMSRh7_9o-lY,11757
11
11
  cinchdb/cli/commands/database.py,sha256=-UCOnn3VatdNog-fX5pguJ2GKdSSXQN99-LSVwkvinY,6857
12
+ cinchdb/cli/commands/index.py,sha256=P0sM9lu1rVliacYl49LPqtxNYdrwzKzpVKW10jC-5i4,6096
12
13
  cinchdb/cli/commands/query.py,sha256=XW_YL6M5IYHHHMpVB5p-M01kawFxwDOK5B5hGIy_BA8,5044
13
14
  cinchdb/cli/commands/remote.py,sha256=i07hfiAxgrROB9lVJVaKK_nWxT1SGiSbtFb4jvEwxEo,4445
14
15
  cinchdb/cli/commands/table.py,sha256=NxfOTCd9beaujffiAPiW0Vko0--HS1JVeCwBMp_khx4,10518
@@ -18,7 +19,7 @@ cinchdb/cli/handlers/__init__.py,sha256=f2f-Cc96rSBLbVsiIbf-b4pZCKZoHfmhNEvnZ0Ou
18
19
  cinchdb/cli/handlers/codegen_handler.py,sha256=i5we_AbiUW3zfO6pIKWxvtO8OvOqz3H__4xPmTLEuQM,6524
19
20
  cinchdb/core/__init__.py,sha256=iNlT0iO9cM0HLoYwzBavUBoXRh1Tcnz1l_vfbwVxK_Q,246
20
21
  cinchdb/core/connection.py,sha256=SlKyEfIpeaDws8M6SfEbvCEVnt26zBY1RYwHtTXj0kY,5110
21
- cinchdb/core/database.py,sha256=IyMo1wfO3mTnnth0m7eP7Dib6_cEC7bTBo1JhOt6Vlo,19792
22
+ cinchdb/core/database.py,sha256=FRbo6YAGd39q-BTf27Jp8WWpD630R1JkpsRSDIha_Mw,21880
22
23
  cinchdb/core/initializer.py,sha256=CjnJSMuR1NrHobyFfwL44tUeH8VE62q02bijEtVH3p4,6922
23
24
  cinchdb/core/maintenance.py,sha256=PAgrSL7Cj9p3rKHV0h_L7gupN6nLD0-5eQpJZNiqyEs,2097
24
25
  cinchdb/core/path_utils.py,sha256=J2UEu1X_NFOqDamcsrPrC7ZitGTg9Y-HFjmx4sHf5j8,3806
@@ -30,6 +31,7 @@ cinchdb/managers/change_tracker.py,sha256=U93BPnuGv8xSaO5qr_y5Q8ppKrVXygozdp5zUv
30
31
  cinchdb/managers/codegen.py,sha256=1CfIwjgHnNDdjrq4SzQ9VE7DFgnWfk7RtpupBFUTqxk,21804
31
32
  cinchdb/managers/column.py,sha256=YhYq-hnH0o2BqZkyihnsY5KIWEztzs-_iLJNZMdVUkk,20807
32
33
  cinchdb/managers/data.py,sha256=zS1HkMGf436m6f8VdFAqQbQFgo4sL5yKJRcRf4A6lIc,16253
34
+ cinchdb/managers/index.py,sha256=ertiAo1clumLq6K_atgR_g8JP4Qv5QX1MMuKjF6ANGc,10113
33
35
  cinchdb/managers/merge_manager.py,sha256=R8S2hLkLJg4hLDpeJTzjVkduZgqPOjXtYgOSJhTXXrE,15690
34
36
  cinchdb/managers/query.py,sha256=pBlbqoovnFsZ36pB7nv8NtzcTFwtT26hp8IlwjIx29Q,7301
35
37
  cinchdb/managers/table.py,sha256=KWSAfZCJafKZPx-dRG7KwQUGVqVQ56ARMVBllb3VBig,13114
@@ -47,8 +49,8 @@ cinchdb/models/view.py,sha256=q6j-jYzFJuhRJO87rKt6Uv8hOizHQx8xwoPKoH6XnNY,530
47
49
  cinchdb/utils/__init__.py,sha256=yQQhEjndDiB2SUJybUmp9dvEOQKiR-GySe-WiCius5E,490
48
50
  cinchdb/utils/name_validator.py,sha256=dyGX5bjlTFRA9EGrWRQKp6kR__HSV04hLV5VueJs4IQ,4027
49
51
  cinchdb/utils/sql_validator.py,sha256=aWOGlPX0gBkuR6R1EBP2stbP4PHZuI6FUBi2Ljx7JUI,5815
50
- cinchdb-0.1.6.dist-info/METADATA,sha256=1vNN2cSZJi_B_ho9yHtnLRjYt3x537gd905QAOtJyK0,6334
51
- cinchdb-0.1.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- cinchdb-0.1.6.dist-info/entry_points.txt,sha256=VBOIzvnGbkKudMCCmNORS3885QSyjZUVKJQ-Syqa62w,47
53
- cinchdb-0.1.6.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- cinchdb-0.1.6.dist-info/RECORD,,
52
+ cinchdb-0.1.7.dist-info/METADATA,sha256=YGREASqsSGqr36eTZqUalkNYuTeParXqPNQs2a5QLt0,6334
53
+ cinchdb-0.1.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
54
+ cinchdb-0.1.7.dist-info/entry_points.txt,sha256=VBOIzvnGbkKudMCCmNORS3885QSyjZUVKJQ-Syqa62w,47
55
+ cinchdb-0.1.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
56
+ cinchdb-0.1.7.dist-info/RECORD,,